iobroker.ai-usage 0.12.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -18
- package/admin/custom/assets/Components-DrPN-Mtb.js +1 -0
- package/admin/custom/assets/ConfigPanel-uVXFjx9g.js +1 -0
- package/admin/custom/assets/{index-CioiSDp-.js → index-Ex4rgN0E.js} +1 -1
- package/admin/custom/assets/{mf-entry-bootstrap-0-4db93d0e.js → mf-entry-bootstrap-0-5b409a88.js} +1 -1
- package/admin/custom/assets/virtualExposes-DP5VuPcn.js +1 -0
- package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-r7YiP9Gq.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-x_0QZXBR.js} +1 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-CeNvuNfG.js +2 -0
- package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B7Oxn2nH.js → virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-qa4g3G_V.js} +2 -2
- package/admin/custom/customComponents.js +1 -1
- package/admin/custom/mf-manifest.json +1 -1
- package/admin/i18n/de.json +0 -1
- package/admin/i18n/en.json +0 -1
- package/admin/i18n/es.json +0 -1
- package/admin/i18n/fr.json +0 -1
- package/admin/i18n/it.json +0 -1
- package/admin/i18n/nl.json +0 -1
- package/admin/i18n/pl.json +0 -1
- package/admin/i18n/pt.json +0 -1
- package/admin/i18n/ru.json +0 -1
- package/admin/i18n/uk.json +0 -1
- package/admin/i18n/zh-cn.json +0 -1
- package/build/lib/http.js +31 -7
- package/build/lib/http.js.map +2 -2
- package/build/lib/poll-engine.js +131 -15
- package/build/lib/poll-engine.js.map +2 -2
- package/build/lib/provider.js.map +1 -1
- package/build/lib/providers/anthropic-api.js +11 -10
- package/build/lib/providers/anthropic-api.js.map +2 -2
- package/build/lib/providers/auth-retry.js +41 -0
- package/build/lib/providers/auth-retry.js.map +7 -0
- package/build/lib/providers/chatgpt-sub.js +44 -16
- package/build/lib/providers/chatgpt-sub.js.map +2 -2
- package/build/lib/providers/claude-sub.js +41 -27
- package/build/lib/providers/claude-sub.js.map +3 -3
- package/build/lib/providers/gemini-sub.js +11 -3
- package/build/lib/providers/gemini-sub.js.map +2 -2
- package/build/lib/providers/openai.js +20 -16
- package/build/lib/providers/openai.js.map +2 -2
- package/build/lib/providers/openrouter.js +5 -9
- package/build/lib/providers/openrouter.js.map +2 -2
- package/build/lib/pure-helpers.js +19 -3
- package/build/lib/pure-helpers.js.map +2 -2
- package/build/lib/sign-in-manager.js +0 -9
- package/build/lib/sign-in-manager.js.map +2 -2
- package/build/lib/snapshot-tree.js +16 -4
- package/build/lib/snapshot-tree.js.map +2 -2
- package/build/lib/totals.js +3 -0
- package/build/lib/totals.js.map +2 -2
- package/build/main.js +67 -20
- package/build/main.js.map +2 -2
- package/io-package.json +27 -27
- package/package.json +5 -5
- package/admin/custom/assets/Components-r_4Gj_p1.js +0 -1
- package/admin/custom/assets/ConfigPanel-Frav13lS.js +0 -1
- package/admin/custom/assets/virtualExposes-qBZHQidU.js +0 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-2dCGDNAq.js +0 -2
package/README.md
CHANGED
|
@@ -84,7 +84,7 @@ ai-usage.0.
|
|
|
84
84
|
│ ├── limitReached — this account is at 100 % (bool)
|
|
85
85
|
│ ├── info.unreach — account is not delivering (bool) — drives the connection icon
|
|
86
86
|
│ ├── info.error — why there is no data; empty while all is well, "Unknown" while the adapter itself has nothing to report
|
|
87
|
-
│ ├── info.lastUpdate —
|
|
87
|
+
│ ├── info.lastUpdate — when the current values were fetched
|
|
88
88
|
│ ├── limits.<window>.* — percent, reset time and whether this window is the limit in force
|
|
89
89
|
│ └── credits.* — where the provider reports a balance
|
|
90
90
|
└── <name>-api — one node per key-based account
|
|
@@ -100,9 +100,14 @@ the reset time simply empties while no window is running, and a window or model
|
|
|
100
100
|
tree only when the provider stops reporting it entirely.
|
|
101
101
|
|
|
102
102
|
**The connection icon** sits next to each account, green while it delivers. A throttle keeps it
|
|
103
|
-
green — the last values stay valid while the adapter waits. A rejected sign-in
|
|
104
|
-
switch it off at once, an unreachable service after three
|
|
105
|
-
flap. `info.error` names the cause whenever the provider gave
|
|
103
|
+
green — the last values stay valid while the adapter waits. A rejected sign-in, a broken service or
|
|
104
|
+
an answer that cannot be processed switch it off at once, an unreachable service after three
|
|
105
|
+
attempts, so a hiccup does not make it flap. `info.error` names the cause whenever the provider gave
|
|
106
|
+
one, in the provider's own words where it sent any.
|
|
107
|
+
|
|
108
|
+
**Signing out clears that account's alarms.** Its measured values stay in the tree, but `warning`,
|
|
109
|
+
`limitReached` and every total that counts them drop it — an account nobody watches must not keep an
|
|
110
|
+
automation waiting.
|
|
106
111
|
|
|
107
112
|
**Which window is in force** is shown per window: with Claude the provider says so itself, elsewhere it
|
|
108
113
|
is the window that speaks for the account. It tells you what you will run into next — a model window
|
|
@@ -148,9 +153,43 @@ so instead of pretending to be connected; signing in again is all it takes.
|
|
|
148
153
|
|
|
149
154
|
<!--
|
|
150
155
|
Placeholder for the next version (at the beginning of the line):
|
|
151
|
-
### **WORK IN PROGRESS**
|
|
152
156
|
-->
|
|
153
157
|
|
|
158
|
+
### 0.14.0 (2026-09-15)
|
|
159
|
+
|
|
160
|
+
- Fixed: A failed write of the token file after a refresh lost the sign-in for good — the provider had already rotated them, so the next poll reported a rejected sign-in
|
|
161
|
+
- Fixed: Signing out no longer comes undone by itself — a sign-out that landed during a background token renewal could leave the account signed in
|
|
162
|
+
- Fixed: The last-update stamp moved forward on a tolerated connection failure, dating values the round had never fetched
|
|
163
|
+
- Fixed: An answer the adapter cannot process is reported as a service fault at once, instead of claiming for three rounds that the service is unreachable
|
|
164
|
+
- Fixed: A failed cleanup of vanished windows or models no longer discards the round — the values were in the tree, but the account called them unstored and the totals froze
|
|
165
|
+
- Fixed: A connection failure counter that a throttle or a rejected sign-in had interrupted no longer adds up to "not reachable"
|
|
166
|
+
- Fixed: An account you signed out of drops its warning and limit alarms and leaves the adapter-wide totals — its measured values stay in the tree
|
|
167
|
+
- Fixed: The reset time of the Claude session and week windows is filled from the plan-wide block when the window entry itself carries none
|
|
168
|
+
- Improved: Window reset times, the next voucher expiry and the credit ceiling are written only when they change — announced facts, not measurements, so their timestamp stops moving every poll
|
|
169
|
+
- Improved: Where a provider sends a reason of its own, `info.error` now says it ("invalid API key") instead of a bare status number
|
|
170
|
+
- Improved: An access token the provider invalidated early is refreshed once and the request repeated, instead of reporting a rejected sign-in until it would have expired
|
|
171
|
+
|
|
172
|
+
Only the Claude subscription runs against a real account here. The token-file fix, the early-refresh
|
|
173
|
+
retry and the sign-out behaviour are covered by tests but were not seen on a real ChatGPT, Google,
|
|
174
|
+
OpenRouter, DeepSeek, OpenAI or Anthropic account.
|
|
175
|
+
|
|
176
|
+
### 0.13.0 (2026-09-12)
|
|
177
|
+
|
|
178
|
+
- Fixed: The costs of an Anthropic organisation account were a hundred times too high — the provider counts them in cents, the adapter read them as dollars
|
|
179
|
+
- Fixed: The same error was in the adapter-wide cost totals
|
|
180
|
+
- Fixed: An account whose values could not be written to the object database kept reporting itself as delivering, with a last-update stamp that went on moving
|
|
181
|
+
- Fixed: An answer still waiting on the object database during shutdown could mark accounts online again afterwards, or delete objects
|
|
182
|
+
- Fixed: An answer in a shape the adapter does not recognise now counts as a service fault, instead of reading as "this account has nothing"
|
|
183
|
+
- Fixed: Limit windows and model channels are no longer deleted when a single answer says nothing about them
|
|
184
|
+
- Fixed: Token counters of an organisation account show 0 after UTC midnight instead of keeping yesterday's numbers
|
|
185
|
+
- Fixed: Restarting the instance above the warn threshold no longer raises the warning and the notification again
|
|
186
|
+
- Fixed: The "limit reached" total now counts a window the provider has closed, the way each account already did
|
|
187
|
+
- Fixed: A configured account row the adapter cannot use now says so in the log instead of disappearing
|
|
188
|
+
- Improved: The "active window" and DeepSeek "available" flags are written only when they actually change, so their timestamp stops moving on every poll
|
|
189
|
+
- Improved: The ChatGPT voucher inventory is fetched about once an hour instead of every poll, halving that account's requests
|
|
190
|
+
- Improved: The settings page shows a finished device-code sign-in right away instead of up to half a minute later
|
|
191
|
+
- Improved: The provider table now says that Anthropic's cost report leaves out Priority Tier spend, so an organisation on that tier really spends more than the figures show
|
|
192
|
+
|
|
154
193
|
### 0.12.1 (2026-09-07)
|
|
155
194
|
|
|
156
195
|
- Fixed: The last-update stamp of an account no longer moves forward while the provider is only throttling — it dates the values standing next to it, so you can see how old they really are
|
|
@@ -187,19 +226,6 @@ so instead of pretending to be connected; signing in again is all it takes.
|
|
|
187
226
|
- Improved: Monthly cost reports can no longer be cut short in silence — a report that does not fit is reported in the log instead of producing a figure that is too low
|
|
188
227
|
- Changed: "Highest account utilisation" says what it always measured — the fullest limit window **or** the account's remaining budget
|
|
189
228
|
|
|
190
|
-
### 0.10.0 (2026-09-01)
|
|
191
|
-
|
|
192
|
-
- Fixed: The reset-time datapoint of a limit window no longer disappears and reappears — it stays and simply empties while no window is running
|
|
193
|
-
- Fixed: The settings page no longer shows the sign-in screen to a signed-in account, and its rows load without waiting for the credential storage scan
|
|
194
|
-
- Improved: Claude usage is read with far fewer rejections — the query now identifies itself the way the endpoint expects
|
|
195
|
-
- Changed: New Claude sign-ins request only the profile permission — the stored access can no longer create API keys or run models
|
|
196
|
-
- New: ChatGPT accounts show their purchasable limit-reset credits — how many are available and when the next one expires
|
|
197
|
-
- Improved: An unreadable provider answer is now reported as a service fault instead of a missing connection
|
|
198
|
-
|
|
199
|
-
### 0.9.3 (2026-08-27)
|
|
200
|
-
|
|
201
|
-
- Fixed: The first start after updating no longer leaves a warning in the log
|
|
202
|
-
|
|
203
229
|
[Older changelogs can be found there](CHANGELOG_OLD.md)
|
|
204
230
|
|
|
205
231
|
## Support
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ConfigPanel-uVXFjx9g.js";var t={ConfigPanel:e};export{t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js";import{Br as t,Dr as n,Er as r,Fi as i,Ha as a,Hi as o,Or as s,Ti as c,Tr as l,Va as u,Xr as d,_o as f,ai as p,ci as m,ei as h,ga as g,ii as _,in as v,kr as y,li as b,ni as x,oi as S}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js";f();var C=[`en`,`de`,`ru`,`pt`,`nl`,`fr`,`it`,`es`,`pl`,`uk`,`zh-cn`];function w(e){let t=(e||`en`).toLowerCase(),n=t.startsWith(`zh`)?`zh-cn`:t.substring(0,2);return C.includes(n)?n:`en`}var T={"claude-sub":`claude`,"chatgpt-sub":`chatgpt`,"gemini-sub":`gemini`};function E(e,t){let n=T[e];if(n)return n;let r=t.replace(/^system\.credentials\./,``).trim().replace(/[^a-zA-Z0-9_-]/g,`_`).replace(/_{2,}/g,`_`).replace(/^_+|_+$/g,``);return r?`${r}-api`:``}function D(e,t){if(e==null)return null;let n=typeof t==`string`?t:``;return e===!0?{key:`aiu_stOffline`,color:`error`,title:n}:n?{key:`aiu_stLimited`,color:`warning`,title:n}:{key:`aiu_stOnline`,color:`success`,title:``}}var O=[{provider:`claude-sub`,label:`Claude`,captionKey:`aiu_capClaude`},{provider:`chatgpt-sub`,label:`ChatGPT`,captionKey:`aiu_capChatgpt`},{provider:`gemini-sub`,label:`Gemini`,captionKey:`aiu_capGemini`}];function k(e,t){let n=`${e} ${t}`.toLowerCase();return n.includes(`gemini`)?null:n.includes(`anthropic`)||n.includes(`claude`)?{provider:`anthropic-api`,label:`Anthropic`,needsAdminKey:!0}:n.includes(`chatgpt`)||n.includes(`openai`)?{provider:`openai`,label:`OpenAI`,needsAdminKey:!0}:n.includes(`deepseek`)?{provider:`deepseek`,label:`DeepSeek`,needsAdminKey:!1}:n.includes(`openrouter`)||n.includes(`router`)?{provider:`openrouter`,label:`OpenRouter`,needsAdminKey:!1}:null}var A=[{provider:`openrouter`,label:`OpenRouter`,needsAdminKey:!1},{provider:`deepseek`,label:`DeepSeek`,needsAdminKey:!1},{provider:`openai`,label:`OpenAI`,needsAdminKey:!0},{provider:`anthropic-api`,label:`Anthropic`,needsAdminKey:!0}];function j(e,t){return e.find(e=>e.provider===t)}function M(e,t,n,r){let i=e.filter(e=>e.provider!==t);return n?[...i,{name:r,provider:t,credentialId:``,warnThreshold:80}]:i}function N(e,t,n,r){let i=e.filter(e=>e.credentialId!==t.id);return!r||!n?i:[...i,{name:t.name,provider:n,credentialId:t.id,warnThreshold:80}]}function P(e,t,n){let r=Math.min(100,Math.max(10,Math.round(Number(n))||80));return e.map(e=>(t.credentialId?e.credentialId===t.credentialId:e.provider===t.provider)?{...e,warnThreshold:r}:e)}var F=``,I=4e3,L=3e4,R=class extends e{constructor(e){super(e),g(this,`timer`,null),g(this,`subscribed`,[]),g(this,`unmounted`,!1),g(this,`onStateChange`,(e,t)=>{if(this.unmounted||!t||t.val===null||t.val===void 0)return;let n=e.split(`.`),r=`${n[2]}.${n[n.length-1]}`;this.setState(e=>({serviceState:{...e.serviceState,[r]:t.val}}))}),this.state={...this.state,credentials:[],credentialsLoaded:!1,signIn:{},drafts:{},providerChoice:{},serviceState:{},busy:``}}async componentDidMount(){var e;(e=super.componentDidMount)==null||e.call(this),await Promise.all([this.loadCredentials(),this.refreshSignIn(),this.syncSubscriptions()]),this.scheduleSignInPoll()}componentDidUpdate(){this.syncSubscriptions()}componentWillUnmount(){var e;this.unmounted=!0,this.timer&&=(clearTimeout(this.timer),null),this.unsubscribeAll(),(e=super.componentWillUnmount)==null||e.call(this)}scheduleSignInPoll(){if(this.unmounted)return;this.timer&&clearTimeout(this.timer);let e=Object.values(this.state.signIn).some(e=>(e==null?void 0:e.status)===`awaiting-device`);this.timer=setTimeout(()=>{this.refreshSignIn().finally(()=>this.scheduleSignInPoll())},e?I:L)}async syncSubscriptions(){let e=this.props.oContext,t=[];for(let n of this.accounts()){let r=E(n.provider,n.credentialId);r&&(t.push(`${e.adapterName}.${e.instance}.${r}.info.unreach`),t.push(`${e.adapterName}.${e.instance}.${r}.info.error`))}if(!(t.length===this.subscribed.length&&t.every(e=>this.subscribed.includes(e)))&&(this.unsubscribeAll(),this.subscribed=t,t.length!==0))try{await e.socket.subscribeState(t,this.onStateChange)}catch{}}unsubscribeAll(){this.subscribed.length>0&&(this.props.oContext.socket.unsubscribeState(this.subscribed,this.onStateChange),this.subscribed=[])}async loadCredentials(){try{let e=await this.props.oContext.socket.getObjectViewSystem(`config`,`system.credentials.`,`system.credentials.${F}`),t=Object.values(e||{}).filter(e=>{var t;return!!e&&((t=e.native)==null?void 0:t.type)===`ai`}).map(e=>{var t,n;let r=e._id.substring(19),i=(t=e.common)==null?void 0:t.name,a=typeof i==`string`?i:(i==null?void 0:i.en)||Object.values(i||{})[0]||r;return{id:e._id,suffix:r,name:a,icon:typeof((n=e.common)==null?void 0:n.icon)==`string`?e.common.icon:void 0}}).sort((e,t)=>e.name.localeCompare(t.name));this.setState({credentials:t,credentialsLoaded:!0})}catch{this.setState({credentialsLoaded:!0})}}renderServiceBadge(e,t){let n=E(e,t),r=D(this.state.serviceState[`${n}.unreach`],this.state.serviceState[`${n}.error`]);return r?u(m,{size:`small`,color:r.color,variant:`outlined`,label:v.t(r.key),title:r.title}):null}async refreshSignIn(){if(!this.props.alive)return;let e=await Promise.all(O.filter(e=>j(this.accounts(),e.provider)).map(async e=>({provider:e.provider,answer:await this.ask(`signInStatus`,e.provider)})));this.setState(t=>{let n={...t.signIn};for(let{provider:t,answer:r}of e)r&&(n[t]=r);return{signIn:n}})}async ask(e,t,n){let r=this.props.oContext;try{let i=await r.socket.sendTo(`${r.adapterName}.${r.instance}`,e,{provider:t,value:n});return i?i.error?{status:`failed`,reason:i.error}:i:null}catch{return null}}async run(e,t,n){this.setState({busy:t});let r=await this.ask(e,t,n)??{status:`failed`,reason:v.t(`aiu_noAnswer`)};this.setState(e=>({busy:``,signIn:{...e.signIn,[t]:r},drafts:{...e.drafts,[t]:``}}),()=>this.scheduleSignInPoll())}accounts(){let t=e.getValue(this.props.data,`accounts`);return Array.isArray(t)?t:[]}commit(e){this.onChange(`accounts`,e)}renderThreshold(e,t,n){return u(d,{size:`small`,type:`number`,label:v.t(`aiu_warnAt`),defaultValue:t.warnThreshold||80,onBlur:e=>this.commit(P(this.accounts(),n,e.target.value)),slotProps:{htmlInput:{min:10,max:100,style:{width:60}},inputLabel:{shrink:!0}},sx:{ml:`auto`}},e)}renderSignIn(e){let t=this.state.signIn[e],i=this.state.busy===e;if(!this.props.alive)return u(c,{severity:`warning`,children:v.t(`aiu_instanceNotRunning`)});if(this.props.changed)return u(c,{severity:`info`,children:v.t(`aiu_saveFirst`)});if(!t)return u(b,{size:20});if(t.status===`signed-in`)return a(x,{sx:{display:`flex`,alignItems:`center`,gap:1,flexWrap:`wrap`},children:[u(y,{color:`success`}),u(h,{sx:{color:`success.main`},children:v.t(`aiu_signedIn`)}),u(_,{size:`small`,startIcon:u(r,{}),disabled:i,onClick:()=>void this.run(`signOut`,e),children:v.t(`aiu_signOut`)})]});if(t.status===`awaiting-device`)return a(x,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:[u(h,{variant:`body2`,children:v.t(`aiu_deviceStep1`)}),a(x,{sx:{display:`flex`,gap:1,alignItems:`center`,flexWrap:`wrap`},children:[u(m,{label:t.userCode,sx:{fontSize:20,fontFamily:`monospace`,py:2.5,px:1}}),u(_,{size:`small`,startIcon:u(s,{}),onClick:()=>{var e;(e=navigator.clipboard)==null||e.writeText(t.userCode)},children:v.t(`aiu_copyCode`)}),u(_,{variant:`contained`,startIcon:u(n,{}),href:t.verificationUrl,target:`_blank`,rel:`noopener noreferrer`,children:v.t(`aiu_openPage`)})]}),u(c,{severity:`info`,children:v.t(`aiu_deviceWaiting`)})]});if(t.status===`awaiting-paste`){let r=t.flow===`paste-url`;return a(x,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:[u(h,{variant:`body2`,children:v.t(r?`aiu_googleStep1`:`aiu_claudeStep1`)}),a(x,{sx:{display:`flex`,gap:1,flexWrap:`wrap`},children:[u(_,{variant:`contained`,startIcon:u(n,{}),href:t.url,target:`_blank`,rel:`noopener noreferrer`,children:v.t(`aiu_openSignIn`)}),u(_,{variant:`outlined`,startIcon:u(s,{}),onClick:()=>{var e;(e=navigator.clipboard)==null||e.writeText(t.url)},children:v.t(`aiu_copyLink`)})]}),r?u(c,{severity:`warning`,children:v.t(`aiu_googleErrorPageHint`)}):null,u(h,{variant:`body2`,children:v.t(r?`aiu_googleStep2`:`aiu_claudeStep2`)}),a(x,{sx:{display:`flex`,gap:1,alignItems:`center`,flexWrap:`wrap`},children:[u(d,{size:`small`,label:v.t(r?`aiu_addressLabel`:`aiu_codeLabel`),value:this.state.drafts[e]??``,onChange:t=>this.setState(n=>({drafts:{...n.drafts,[e]:t.target.value}})),sx:{minWidth:340,flexGrow:1}}),u(_,{variant:`contained`,disabled:i||!(this.state.drafts[e]??``).trim(),onClick:()=>void this.run(`signInSubmit`,e,this.state.drafts[e]),children:i?u(b,{size:20}):v.t(`aiu_redeem`)})]})]})}return a(x,{sx:{display:`flex`,flexDirection:`column`,gap:1},children:[t.status===`failed`?u(c,{severity:`error`,children:t.reason}):null,u(x,{children:u(_,{variant:`contained`,startIcon:u(n,{}),disabled:i,onClick:()=>void this.run(`signInStart`,e),children:i?u(b,{size:20}):v.t(`aiu_startSignIn`)})})]})}renderSubscriptionRow(e){let n=j(this.accounts(),e.provider);return a(x,{children:[a(x,{sx:{display:`flex`,alignItems:`center`,gap:1.5,py:1,borderBottom:1,borderColor:`divider`},children:[u(o,{sx:{width:28,height:28,bgcolor:`transparent`},children:u(l,{fontSize:`small`,color:`primary`})}),a(x,{sx:{minWidth:180},children:[u(h,{children:e.label}),u(h,{variant:`caption`,sx:{opacity:.7},children:v.t(e.captionKey)})]}),n?this.renderServiceBadge(e.provider,``):null,n?this.renderThreshold(`${e.provider}-t`,n,{provider:e.provider}):null,u(t,{checked:!!n,onChange:t=>this.commit(M(this.accounts(),e.provider,t.target.checked,e.label)),sx:{ml:n?0:`auto`}})]}),n?u(x,{sx:{pl:6,py:1.5,borderBottom:1,borderColor:`divider`},children:this.renderSignIn(e.provider)}):null]},e.provider)}renderCredentialRow(e){var n;let r=this.accounts(),s=r.find(t=>t.credentialId===e.id),f=k(e.suffix,e.name),p=(s==null?void 0:s.provider)||(f==null?void 0:f.provider)||this.state.providerChoice[e.id]||``,m=((n=A.find(e=>e.provider===p))==null?void 0:n.needsAdminKey)??(f==null?void 0:f.needsAdminKey)??!1,g=!f&&!this.state.providerChoice[e.id]&&!s;return a(x,{sx:{borderBottom:1,borderColor:`divider`},children:[a(x,{sx:{display:`flex`,alignItems:`center`,gap:1.5,py:1},children:[u(o,{src:e.icon,sx:{width:28,height:28,bgcolor:`transparent`},children:u(l,{fontSize:`small`})}),a(x,{sx:{minWidth:180},children:[u(h,{children:e.name}),u(h,{variant:`caption`,sx:{opacity:.7},children:v.t(`aiu_storedKey`)})]}),g?u(d,{select:!0,size:`small`,label:v.t(`aiu_provider`),value:this.state.providerChoice[e.id]||``,onChange:t=>this.setState(n=>({providerChoice:{...n.providerChoice,[e.id]:t.target.value}})),sx:{minWidth:170},children:A.map(e=>u(i,{value:e.provider,children:e.label},e.provider))}):null,s?this.renderServiceBadge(s.provider,e.id):null,s?this.renderThreshold(`${e.id}-t`,s,{credentialId:e.id}):null,u(t,{checked:!!s,disabled:!p,onChange:t=>this.commit(N(r,e,p,t.target.checked)),sx:{ml:s?0:`auto`}})]}),s&&m?u(c,{severity:`info`,sx:{mb:1},children:v.t(`aiu_adminKeyHint`)}):null]},e.id)}renderItem(){return u(x,{"data-testid":`aiu-config`,sx:{maxWidth:760},children:u(p,{variant:`outlined`,children:a(S,{children:[u(h,{variant:`h6`,sx:{mb:.5},children:v.t(`aiu_storedTitle`)}),u(h,{variant:`body2`,sx:{opacity:.8,mb:1},children:v.t(`aiu_storedHint`)}),O.map(e=>this.renderSubscriptionRow(e)),this.state.credentialsLoaded?this.state.credentials.map(e=>this.renderCredentialRow(e)):u(b,{size:24,sx:{mt:1}}),this.state.credentialsLoaded&&this.state.credentials.length===0?u(c,{severity:`info`,sx:{mt:1},children:v.t(`aiu_noCredentials`)}):null]})})})}};export{w as n,R as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B7Oxn2nH.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-r7YiP9Gq.js";import{Ba as e,Qt as t,Sa as n,Va as r,Za as i,_o as a,in as o,ni as s,sn as c}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js";import{t as l}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js";import{n as u,t as d}from"./ConfigPanel-Frav13lS.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),a();var f={aiu_storedTitle:`AI accounts`,aiu_storedHint:`Switch on what you want to monitor. Subscriptions sign in with your own account; the entries below come from the admin's central credential storage (Settings → Credentials).`,aiu_capClaude:`Subscription — sign in once with your Claude account`,aiu_capChatgpt:`Subscription — sign in once with your ChatGPT account`,aiu_capGemini:`Subscription — sign in once with your Google account`,aiu_storedKey:`Stored key`,aiu_provider:`Provider`,aiu_warnAt:`Warn at %`,aiu_signedIn:`Signed in`,aiu_signOut:`Sign out`,aiu_startSignIn:`Sign in`,aiu_claudeStep1:`1. Open the sign-in page and log in with your Claude account.`,aiu_claudeStep2:`2. Copy the code shown there and redeem it here.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open the sign-in page and log in with your Google account.`,aiu_googleStep2:`2. Copy the ENTIRE address from your browser's address bar and paste it here.`,aiu_googleErrorPageHint:`Your browser will then show an error page ("site cannot be reached") — that is expected. Google sends the result to your own computer, where nothing is listening. The address bar still contains the sign-in result, and that is what is needed here.`,aiu_addressLabel:`Address from the browser`,aiu_deviceStep1:`1. Open the OpenAI page and type in this code:`,aiu_copyCode:`Copy code`,aiu_openPage:`Open page`,aiu_deviceWaiting:`Waiting for your confirmation — this card updates by itself once you are done.`,aiu_openSignIn:`Open sign-in page`,aiu_copyLink:`Copy link`,aiu_redeem:`Redeem`,aiu_saveFirst:`Save the settings first — then the sign-in can start.`,aiu_instanceNotRunning:`The instance is not running — start it to sign in.`,aiu_noAnswer:`the instance did not answer`,aiu_noCredentials:`No AI credentials stored yet — add them in the admin under Settings → Credentials.`,aiu_adminKeyHint:`This account needs an ADMIN key of your organisation, not the key the admin AI assistant uses. Personal accounts without an organisation cannot deliver usage reports.`,aiu_stOnline:`Online`,aiu_stLimited:`Limited`,aiu_stOffline:`Offline`},p={aiu_storedTitle:`KI-Konten`,aiu_storedHint:`Einschalten, was überwacht werden soll. Abos melden sich mit Ihrem eigenen Konto an; die Einträge darunter stammen aus dem zentralen Zugangsdaten-Speicher des Admin (Einstellungen → Zugangsdaten).`,aiu_capClaude:`Abo — einmalig mit Ihrem Claude-Konto anmelden`,aiu_capChatgpt:`Abo — einmalig mit Ihrem ChatGPT-Konto anmelden`,aiu_capGemini:`Abo — einmalig mit Ihrem Google-Konto anmelden`,aiu_storedKey:`Gespeicherter Schlüssel`,aiu_provider:`Anbieter`,aiu_warnAt:`Warnen ab %`,aiu_signedIn:`Angemeldet`,aiu_signOut:`Abmelden`,aiu_startSignIn:`Anmelden`,aiu_claudeStep1:`1. Anmeldeseite öffnen und mit Ihrem Claude-Konto anmelden.`,aiu_claudeStep2:`2. Den dort angezeigten Code kopieren und hier einlösen.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Anmeldeseite öffnen und mit Ihrem Google-Konto anmelden.`,aiu_googleStep2:`2. Die KOMPLETTE Adresse aus der Adresszeile des Browsers kopieren und hier einfügen.`,aiu_googleErrorPageHint:`Ihr Browser zeigt danach eine Fehlerseite („Seite nicht erreichbar") — das ist richtig so. Google schickt das Ergebnis an Ihren eigenen Rechner, wo nichts darauf wartet. In der Adresszeile steht das Anmelde-Ergebnis trotzdem — und genau das wird hier gebraucht.`,aiu_addressLabel:`Adresse aus dem Browser`,aiu_deviceStep1:`1. Die OpenAI-Seite öffnen und diesen Code eintippen:`,aiu_copyCode:`Code kopieren`,aiu_openPage:`Seite öffnen`,aiu_deviceWaiting:`Warte auf Ihre Bestätigung — diese Karte aktualisiert sich von selbst, sobald Sie fertig sind.`,aiu_openSignIn:`Anmeldeseite öffnen`,aiu_copyLink:`Link kopieren`,aiu_redeem:`Einlösen`,aiu_saveFirst:`Zuerst die Einstellungen speichern — danach kann die Anmeldung starten.`,aiu_instanceNotRunning:`Die Instanz läuft nicht — zum Anmelden bitte starten.`,aiu_noAnswer:`die Instanz hat nicht geantwortet`,aiu_noCredentials:`Noch keine KI-Zugangsdaten gespeichert — im Admin unter Einstellungen → Zugangsdaten anlegen.`,aiu_adminKeyHint:`Dieses Konto braucht einen VERWALTUNGS-Schlüssel Ihrer Organisation, nicht den Schlüssel des Admin-KI-Assistenten. Einzelkonten ohne Organisation können keine Verbrauchs-Berichte liefern.`,aiu_stOnline:`Online`,aiu_stLimited:`Eingeschränkt`,aiu_stOffline:`Offline`},m={aiu_storedTitle:`Аккаунты ИИ`,aiu_storedHint:`Включите то, что нужно отслеживать. Подписки входят под вашим аккаунтом; записи ниже — из центрального хранилища учётных данных (Настройки → Учётные данные).`,aiu_capClaude:`Подписка — один раз войдите со своим аккаунтом Claude`,aiu_capChatgpt:`Подписка — один раз войдите со своим аккаунтом ChatGPT`,aiu_capGemini:`Подписка — один раз войдите со своим аккаунтом Google`,aiu_storedKey:`Сохранённый ключ`,aiu_provider:`Провайдер`,aiu_warnAt:`Предупреждать с %`,aiu_signedIn:`Вход выполнен`,aiu_signOut:`Выйти`,aiu_startSignIn:`Войти`,aiu_claudeStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Claude.`,aiu_claudeStep2:`2. Скопируйте показанный код и активируйте его здесь.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Google.`,aiu_googleStep2:`2. Скопируйте ВЕСЬ адрес из адресной строки браузера и вставьте сюда.`,aiu_googleErrorPageHint:`Затем браузер покажет страницу ошибки («не удаётся открыть сайт») — так и должно быть. Google отправляет результат на ваш компьютер, где его никто не ждёт. Но в адресной строке результат входа есть — именно он здесь и нужен.`,aiu_addressLabel:`Адрес из браузера`,aiu_deviceStep1:`1. Откройте страницу OpenAI и введите этот код:`,aiu_copyCode:`Копировать код`,aiu_openPage:`Открыть страницу`,aiu_deviceWaiting:`Ожидание подтверждения — карточка обновится сама.`,aiu_openSignIn:`Открыть страницу входа`,aiu_copyLink:`Копировать ссылку`,aiu_redeem:`Активировать`,aiu_saveFirst:`Сначала сохраните настройки — затем можно начать вход.`,aiu_instanceNotRunning:`Экземпляр не запущен — запустите его для входа.`,aiu_noAnswer:`экземпляр не ответил`,aiu_noCredentials:`Данные доступа ИИ ещё не сохранены — добавьте их: Настройки → Учётные данные.`,aiu_adminKeyHint:`Этому аккаунту нужен АДМИНИСТРАТИВНЫЙ ключ организации, а не ключ ИИ-ассистента. Личные аккаунты без организации не выдают отчёты о расходе.`,aiu_stOnline:`В сети`,aiu_stLimited:`Ограничено`,aiu_stOffline:`Не в сети`},h={aiu_storedTitle:`Contas de IA`,aiu_storedHint:`Ative o que deseja monitorizar. As assinaturas iniciam sessão com a sua conta; as entradas abaixo vêm do armazenamento central de credenciais (Definições → Credenciais).`,aiu_capClaude:`Assinatura — inicie sessão uma vez com a sua conta Claude`,aiu_capChatgpt:`Assinatura — inicie sessão uma vez com a sua conta ChatGPT`,aiu_capGemini:`Assinatura — inicie sessão uma vez com a sua conta Google`,aiu_storedKey:`Chave guardada`,aiu_provider:`Fornecedor`,aiu_warnAt:`Avisar a partir de %`,aiu_signedIn:`Sessão iniciada`,aiu_signOut:`Terminar sessão`,aiu_startSignIn:`Iniciar sessão`,aiu_claudeStep1:`1. Abra a página de início de sessão e entre com a sua conta Claude.`,aiu_claudeStep2:`2. Copie o código mostrado e resgate-o aqui.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra a página de início de sessão e entre com a sua conta Google.`,aiu_googleStep2:`2. Copie o endereço COMPLETO da barra de endereços e cole-o aqui.`,aiu_googleErrorPageHint:`O navegador mostrará depois uma página de erro («não é possível aceder») — isso é esperado. A Google envia o resultado para o seu computador, onde nada está à escuta. O endereço contém na mesma o resultado — e é isso que é preciso aqui.`,aiu_addressLabel:`Endereço do navegador`,aiu_deviceStep1:`1. Abra a página da OpenAI e introduza este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`À espera da sua confirmação — este cartão atualiza-se sozinho.`,aiu_openSignIn:`Abrir página de início de sessão`,aiu_copyLink:`Copiar link`,aiu_redeem:`Resgatar`,aiu_saveFirst:`Guarde primeiro as definições — depois o início de sessão pode começar.`,aiu_instanceNotRunning:`A instância não está em execução — inicie-a para entrar.`,aiu_noAnswer:`a instância não respondeu`,aiu_noCredentials:`Ainda não há credenciais de IA guardadas — adicione-as em Definições → Credenciais.`,aiu_adminKeyHint:`Esta conta precisa de uma chave de ADMINISTRAÇÃO da organização, não da chave do assistente de IA. Contas pessoais sem organização não fornecem relatórios de uso.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitado`,aiu_stOffline:`Offline`},g={aiu_storedTitle:`AI-accounts`,aiu_storedHint:`Schakel in wat u wilt bewaken. Abonnementen melden zich aan met uw eigen account; de vermeldingen daaronder komen uit de centrale opslag van toegangsgegevens (Instellingen → Toegangsgegevens).`,aiu_capClaude:`Abonnement — meld u eenmalig aan met uw Claude-account`,aiu_capChatgpt:`Abonnement — meld u eenmalig aan met uw ChatGPT-account`,aiu_capGemini:`Abonnement — meld u eenmalig aan met uw Google-account`,aiu_storedKey:`Opgeslagen sleutel`,aiu_provider:`Aanbieder`,aiu_warnAt:`Waarschuwen vanaf %`,aiu_signedIn:`Aangemeld`,aiu_signOut:`Afmelden`,aiu_startSignIn:`Aanmelden`,aiu_claudeStep1:`1. Open de aanmeldpagina en log in met uw Claude-account.`,aiu_claudeStep2:`2. Kopieer de getoonde code en wissel die hier in.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open de aanmeldpagina en log in met uw Google-account.`,aiu_googleStep2:`2. Kopieer het VOLLEDIGE adres uit de adresbalk en plak het hier.`,aiu_googleErrorPageHint:`Uw browser toont daarna een foutpagina («site kan niet worden bereikt») — dat hoort zo. Google stuurt het resultaat naar uw eigen computer, waar niets luistert. In de adresbalk staat het resultaat wél — en dat is wat hier nodig is.`,aiu_addressLabel:`Adres uit de browser`,aiu_deviceStep1:`1. Open de OpenAI-pagina en typ deze code in:`,aiu_copyCode:`Code kopiëren`,aiu_openPage:`Pagina openen`,aiu_deviceWaiting:`Wachten op uw bevestiging — deze kaart werkt zichzelf bij.`,aiu_openSignIn:`Aanmeldpagina openen`,aiu_copyLink:`Link kopiëren`,aiu_redeem:`Inwisselen`,aiu_saveFirst:`Sla eerst de instellingen op — daarna kan het aanmelden starten.`,aiu_instanceNotRunning:`De instantie draait niet — start deze om aan te melden.`,aiu_noAnswer:`de instantie antwoordde niet`,aiu_noCredentials:`Nog geen AI-toegangsgegevens opgeslagen — voeg ze toe via Instellingen → Toegangsgegevens.`,aiu_adminKeyHint:`Dit account heeft een BEHEER-sleutel van uw organisatie nodig, niet die van de AI-assistent. Persoonlijke accounts zonder organisatie leveren geen verbruiksrapporten.`,aiu_stOnline:`Online`,aiu_stLimited:`Beperkt`,aiu_stOffline:`Offline`},_={aiu_storedTitle:`Comptes IA`,aiu_storedHint:`Activez ce que vous voulez surveiller. Les abonnements se connectent avec votre propre compte ; les entrées ci-dessous viennent du stockage central des identifiants (Réglages → Identifiants).`,aiu_capClaude:`Abonnement — connectez-vous une fois avec votre compte Claude`,aiu_capChatgpt:`Abonnement — connectez-vous une fois avec votre compte ChatGPT`,aiu_capGemini:`Abonnement — connectez-vous une fois avec votre compte Google`,aiu_storedKey:`Clé enregistrée`,aiu_provider:`Fournisseur`,aiu_warnAt:`Avertir à partir de %`,aiu_signedIn:`Connecté`,aiu_signOut:`Se déconnecter`,aiu_startSignIn:`Se connecter`,aiu_claudeStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Claude.`,aiu_claudeStep2:`2. Copiez le code affiché et validez-le ici.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Google.`,aiu_googleStep2:`2. Copiez l'adresse COMPLÈTE depuis la barre d'adresse et collez-la ici.`,aiu_googleErrorPageHint:`Votre navigateur affichera ensuite une page d'erreur (« site inaccessible ») — c'est normal. Google envoie le résultat vers votre propre ordinateur, où rien n'écoute. L'adresse contient malgré tout le résultat — et c'est précisément ce qu'il faut ici.`,aiu_addressLabel:`Adresse du navigateur`,aiu_deviceStep1:`1. Ouvrez la page OpenAI et saisissez ce code :`,aiu_copyCode:`Copier le code`,aiu_openPage:`Ouvrir la page`,aiu_deviceWaiting:`En attente de votre confirmation — cette carte se met à jour toute seule.`,aiu_openSignIn:`Ouvrir la page de connexion`,aiu_copyLink:`Copier le lien`,aiu_redeem:`Valider`,aiu_saveFirst:`Enregistrez d'abord les réglages — la connexion pourra ensuite démarrer.`,aiu_instanceNotRunning:`L'instance ne tourne pas — démarrez-la pour vous connecter.`,aiu_noAnswer:`l'instance n'a pas répondu`,aiu_noCredentials:`Aucun identifiant IA enregistré — ajoutez-les via Réglages → Identifiants.`,aiu_adminKeyHint:`Ce compte nécessite une clé d'ADMINISTRATION de votre organisation, pas celle de l'assistant IA. Les comptes personnels sans organisation ne fournissent pas de rapports d'utilisation.`,aiu_stOnline:`En ligne`,aiu_stLimited:`Limité`,aiu_stOffline:`Hors ligne`},v={aiu_storedTitle:`Account IA`,aiu_storedHint:`Attiva ciò che vuoi monitorare. Gli abbonamenti accedono con il tuo account; le voci sotto provengono dall'archivio centrale delle credenziali (Impostazioni → Credenziali).`,aiu_capClaude:`Abbonamento — accedi una volta con il tuo account Claude`,aiu_capChatgpt:`Abbonamento — accedi una volta con il tuo account ChatGPT`,aiu_capGemini:`Abbonamento — accedi una volta con il tuo account Google`,aiu_storedKey:`Chiave salvata`,aiu_provider:`Fornitore`,aiu_warnAt:`Avvisa da %`,aiu_signedIn:`Accesso effettuato`,aiu_signOut:`Disconnetti`,aiu_startSignIn:`Accedi`,aiu_claudeStep1:`1. Apri la pagina di accesso ed entra con il tuo account Claude.`,aiu_claudeStep2:`2. Copia il codice mostrato e riscattalo qui.`,aiu_codeLabel:`Codice`,aiu_googleStep1:`1. Apri la pagina di accesso ed entra con il tuo account Google.`,aiu_googleStep2:`2. Copia l'INTERO indirizzo dalla barra degli indirizzi e incollalo qui.`,aiu_googleErrorPageHint:`Il browser mostrerà poi una pagina di errore («sito non raggiungibile») — è corretto così. Google invia il risultato al tuo computer, dove nessuno è in ascolto. Nell'indirizzo il risultato c'è comunque — ed è proprio quello che serve qui.`,aiu_addressLabel:`Indirizzo dal browser`,aiu_deviceStep1:`1. Apri la pagina OpenAI e digita questo codice:`,aiu_copyCode:`Copia codice`,aiu_openPage:`Apri pagina`,aiu_deviceWaiting:`In attesa della tua conferma — questa scheda si aggiorna da sola.`,aiu_openSignIn:`Apri pagina di accesso`,aiu_copyLink:`Copia link`,aiu_redeem:`Riscatta`,aiu_saveFirst:`Salva prima le impostazioni — poi l'accesso può iniziare.`,aiu_instanceNotRunning:`L'istanza non è in esecuzione — avviala per accedere.`,aiu_noAnswer:`l'istanza non ha risposto`,aiu_noCredentials:`Nessuna credenziale IA salvata — aggiungila in Impostazioni → Credenziali.`,aiu_adminKeyHint:`Questo account richiede una chiave di AMMINISTRAZIONE della tua organizzazione, non quella dell'assistente IA. Gli account personali senza organizzazione non forniscono rapporti di utilizzo.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitato`,aiu_stOffline:`Offline`},y={aiu_storedTitle:`Cuentas de IA`,aiu_storedHint:`Active lo que quiera supervisar. Las suscripciones inician sesión con su propia cuenta; las entradas de abajo provienen del almacén central de credenciales (Ajustes → Credenciales).`,aiu_capClaude:`Suscripción — inicie sesión una vez con su cuenta Claude`,aiu_capChatgpt:`Suscripción — inicie sesión una vez con su cuenta ChatGPT`,aiu_capGemini:`Suscripción — inicie sesión una vez con su cuenta Google`,aiu_storedKey:`Clave guardada`,aiu_provider:`Proveedor`,aiu_warnAt:`Avisar desde %`,aiu_signedIn:`Sesión iniciada`,aiu_signOut:`Cerrar sesión`,aiu_startSignIn:`Iniciar sesión`,aiu_claudeStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Claude.`,aiu_claudeStep2:`2. Copie el código mostrado y canjéelo aquí.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Google.`,aiu_googleStep2:`2. Copie la dirección COMPLETA de la barra de direcciones y péguela aquí.`,aiu_googleErrorPageHint:`Su navegador mostrará después una página de error («no se puede acceder al sitio») — es lo esperado. Google envía el resultado a su propio ordenador, donde nada está escuchando. La dirección contiene el resultado igualmente — y eso es lo que hace falta aquí.`,aiu_addressLabel:`Dirección del navegador`,aiu_deviceStep1:`1. Abra la página de OpenAI y escriba este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`Esperando su confirmación — esta tarjeta se actualiza sola.`,aiu_openSignIn:`Abrir página de inicio de sesión`,aiu_copyLink:`Copiar enlace`,aiu_redeem:`Canjear`,aiu_saveFirst:`Guarde primero la configuración — después puede comenzar el inicio de sesión.`,aiu_instanceNotRunning:`La instancia no está en marcha — iníciela para entrar.`,aiu_noAnswer:`la instancia no respondió`,aiu_noCredentials:`Aún no hay credenciales de IA guardadas — añádalas en Ajustes → Credenciales.`,aiu_adminKeyHint:`Esta cuenta necesita una clave de ADMINISTRACIÓN de su organización, no la del asistente de IA. Las cuentas personales sin organización no ofrecen informes de uso.`,aiu_stOnline:`En línea`,aiu_stLimited:`Limitado`,aiu_stOffline:`Sin conexión`},b={aiu_storedTitle:`Konta AI`,aiu_storedHint:`Włącz to, co ma być monitorowane. Subskrypcje logują się Twoim kontem; pozycje poniżej pochodzą z centralnego magazynu danych dostępu (Ustawienia → Dane dostępu).`,aiu_capClaude:`Subskrypcja — zaloguj się raz kontem Claude`,aiu_capChatgpt:`Subskrypcja — zaloguj się raz kontem ChatGPT`,aiu_capGemini:`Subskrypcja — zaloguj się raz kontem Google`,aiu_storedKey:`Zapisany klucz`,aiu_provider:`Dostawca`,aiu_warnAt:`Ostrzegaj od %`,aiu_signedIn:`Zalogowano`,aiu_signOut:`Wyloguj`,aiu_startSignIn:`Zaloguj`,aiu_claudeStep1:`1. Otwórz stronę logowania i zaloguj się kontem Claude.`,aiu_claudeStep2:`2. Skopiuj pokazany kod i zrealizuj go tutaj.`,aiu_codeLabel:`Kod`,aiu_googleStep1:`1. Otwórz stronę logowania i zaloguj się kontem Google.`,aiu_googleStep2:`2. Skopiuj CAŁY adres z paska adresu i wklej go tutaj.`,aiu_googleErrorPageHint:`Przeglądarka pokaże potem stronę błędu («nie można otworzyć strony») — tak ma być. Google wysyła wynik na Twój komputer, gdzie nic nie nasłuchuje. W pasku adresu wynik jednak jest — i właśnie on jest tu potrzebny.`,aiu_addressLabel:`Adres z przeglądarki`,aiu_deviceStep1:`1. Otwórz stronę OpenAI i wpisz ten kod:`,aiu_copyCode:`Kopiuj kod`,aiu_openPage:`Otwórz stronę`,aiu_deviceWaiting:`Czekam na potwierdzenie — ta karta odświeży się sama.`,aiu_openSignIn:`Otwórz stronę logowania`,aiu_copyLink:`Kopiuj link`,aiu_redeem:`Zrealizuj`,aiu_saveFirst:`Najpierw zapisz ustawienia — potem można rozpocząć logowanie.`,aiu_instanceNotRunning:`Instancja nie działa — uruchom ją, aby się zalogować.`,aiu_noAnswer:`instancja nie odpowiedziała`,aiu_noCredentials:`Brak zapisanych danych dostępu AI — dodaj je w Ustawienia → Dane dostępu.`,aiu_adminKeyHint:`To konto wymaga klucza ADMINISTRACYJNEGO organizacji, a nie klucza asystenta AI. Konta osobiste bez organizacji nie dostarczają raportów zużycia.`,aiu_stOnline:`Online`,aiu_stLimited:`Ograniczone`,aiu_stOffline:`Offline`},x={aiu_storedTitle:`Акаунти ШІ`,aiu_storedHint:`Увімкніть те, що треба відстежувати. Підписки входять під вашим акаунтом; записи нижче — з центрального сховища даних доступу (Налаштування → Дані доступу).`,aiu_capClaude:`Підписка — увійдіть один раз акаунтом Claude`,aiu_capChatgpt:`Підписка — увійдіть один раз акаунтом ChatGPT`,aiu_capGemini:`Підписка — увійдіть один раз акаунтом Google`,aiu_storedKey:`Збережений ключ`,aiu_provider:`Постачальник`,aiu_warnAt:`Попереджати від %`,aiu_signedIn:`Вхід виконано`,aiu_signOut:`Вийти`,aiu_startSignIn:`Увійти`,aiu_claudeStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Claude.`,aiu_claudeStep2:`2. Скопіюйте показаний код і активуйте його тут.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Google.`,aiu_googleStep2:`2. Скопіюйте ВЕСЬ адрес з адресного рядка та вставте сюди.`,aiu_googleErrorPageHint:`Далі браузер покаже сторінку помилки («сайт недоступний») — так і має бути. Google надсилає результат на ваш комп'ютер, де ніхто не слухає. В адресному рядку результат усе одно є — саме він тут і потрібен.`,aiu_addressLabel:`Адреса з браузера`,aiu_deviceStep1:`1. Відкрийте сторінку OpenAI та введіть цей код:`,aiu_copyCode:`Копіювати код`,aiu_openPage:`Відкрити сторінку`,aiu_deviceWaiting:`Очікую підтвердження — картка оновиться сама.`,aiu_openSignIn:`Відкрити сторінку входу`,aiu_copyLink:`Копіювати посилання`,aiu_redeem:`Активувати`,aiu_saveFirst:`Спочатку збережіть налаштування — потім можна починати вхід.`,aiu_instanceNotRunning:`Екземпляр не запущено — запустіть його для входу.`,aiu_noAnswer:`екземпляр не відповів`,aiu_noCredentials:`Ще немає збережених даних доступу ШІ — додайте їх у Налаштування → Дані доступу.`,aiu_adminKeyHint:`Цей акаунт потребує АДМІНІСТРАТИВНОГО ключа організації, а не ключа ШІ-асистента. Особисті акаунти без організації не дають звітів про використання.`,aiu_stOnline:`У мережі`,aiu_stLimited:`Обмежено`,aiu_stOffline:`Не в мережі`},S={aiu_storedTitle:`AI 账户`,aiu_storedHint:`开启需要监控的项目。订阅使用您自己的账户登录;下方条目来自管理界面的中央凭据存储(设置 → 凭据)。`,aiu_capClaude:`订阅——使用您的 Claude 账户登录一次`,aiu_capChatgpt:`订阅——使用您的 ChatGPT 账户登录一次`,aiu_capGemini:`订阅——使用您的 Google 账户登录一次`,aiu_storedKey:`已保存的密钥`,aiu_provider:`提供商`,aiu_warnAt:`警告阈值 %`,aiu_signedIn:`已登录`,aiu_signOut:`退出登录`,aiu_startSignIn:`登录`,aiu_claudeStep1:`1. 打开登录页面并使用您的 Claude 账户登录。`,aiu_claudeStep2:`2. 复制页面显示的代码并在此兑换。`,aiu_codeLabel:`代码`,aiu_googleStep1:`1. 打开登录页面并使用您的 Google 账户登录。`,aiu_googleStep2:`2. 复制浏览器地址栏中的完整地址并粘贴到这里。`,aiu_googleErrorPageHint:`随后浏览器会显示错误页面(无法访问此网站)——这是正常的。Google 把结果发送到您自己的电脑,而那里没有程序在接收。地址栏中仍然包含登录结果——这正是此处需要的。`,aiu_addressLabel:`来自浏览器的地址`,aiu_deviceStep1:`1. 打开 OpenAI 页面并输入此代码:`,aiu_copyCode:`复制代码`,aiu_openPage:`打开页面`,aiu_deviceWaiting:`正在等待您的确认——完成后此卡片会自动更新。`,aiu_openSignIn:`打开登录页面`,aiu_copyLink:`复制链接`,aiu_redeem:`兑换`,aiu_saveFirst:`请先保存设置——之后即可开始登录。`,aiu_instanceNotRunning:`实例未运行——请启动后再登录。`,aiu_noAnswer:`实例没有响应`,aiu_noCredentials:`尚未保存任何 AI 凭据——请在 设置 → 凭据 中添加。`,aiu_adminKeyHint:`此账户需要您所在组织的管理密钥,而不是管理界面 AI 助手使用的密钥。没有组织的个人账户无法提供用量报告。`,aiu_stOnline:`在线`,aiu_stLimited:`受限`,aiu_stOffline:`离线`},C=class extends t{constructor(e){super(e,{...e}),this.state={...this.state,data:{accounts:[]},originalData:{accounts:[]},theme:this.createTheme()};let t={en:f,de:p,ru:m,pt:h,nl:g,fr:_,it:v,es:y,pl:b,uk:x,"zh-cn":S};for(let[e,n]of Object.entries(t))o.extendTranslations(n,e);o.setLanguage(u(navigator.language))}render(){return this.state.loaded?r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(s,{sx:{height:`100%`,bgcolor:`background.default`,color:`text.primary`},children:r(`div`,{style:{padding:50,width:760},children:r(d,{oContext:{adapterName:`ai-usage`,socket:this.socket,instance:0,themeType:this.state.theme.palette.mode,isFloatComma:!0,dateFormat:``,forceUpdate:()=>{},systemConfig:{},theme:this.state.theme,_themeName:this.state.themeName,onCommandRunning:()=>{}},alive:!0,changed:!1,themeName:this.state.theme.palette.mode,common:{},attr:`_accounts`,data:this.state.data,originalData:this.state.originalData,onError:()=>{},schema:{url:`custom/customComponents.js`,i18n:!0,name:`AiUsageComponentSet/Components/ConfigPanel`,type:`custom`},onChange:e=>this.setState({data:e})})})})})}):r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(c,{themeType:this.state.themeType})})})}};a(),window.adapterName=`ai-usage`;var w=document.getElementById(`root`);w&&l(w).render(r(i.StrictMode,{children:r(C,{socket:{port:8081}})}));
|
|
1
|
+
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-qa4g3G_V.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-x_0QZXBR.js";import{Ba as e,Qt as t,Sa as n,Va as r,Za as i,_o as a,in as o,ni as s,sn as c}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js";import{t as l}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js";import{n as u,t as d}from"./ConfigPanel-uVXFjx9g.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),a();var f={aiu_storedTitle:`AI accounts`,aiu_storedHint:`Switch on what you want to monitor. Subscriptions sign in with your own account; the entries below come from the admin's central credential storage (Settings → Credentials).`,aiu_capClaude:`Subscription — sign in once with your Claude account`,aiu_capChatgpt:`Subscription — sign in once with your ChatGPT account`,aiu_capGemini:`Subscription — sign in once with your Google account`,aiu_storedKey:`Stored key`,aiu_provider:`Provider`,aiu_warnAt:`Warn at %`,aiu_signedIn:`Signed in`,aiu_signOut:`Sign out`,aiu_startSignIn:`Sign in`,aiu_claudeStep1:`1. Open the sign-in page and log in with your Claude account.`,aiu_claudeStep2:`2. Copy the code shown there and redeem it here.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open the sign-in page and log in with your Google account.`,aiu_googleStep2:`2. Copy the ENTIRE address from your browser's address bar and paste it here.`,aiu_googleErrorPageHint:`Your browser will then show an error page ("site cannot be reached") — that is expected. Google sends the result to your own computer, where nothing is listening. The address bar still contains the sign-in result, and that is what is needed here.`,aiu_addressLabel:`Address from the browser`,aiu_deviceStep1:`1. Open the OpenAI page and type in this code:`,aiu_copyCode:`Copy code`,aiu_openPage:`Open page`,aiu_deviceWaiting:`Waiting for your confirmation — this card updates by itself once you are done.`,aiu_openSignIn:`Open sign-in page`,aiu_copyLink:`Copy link`,aiu_redeem:`Redeem`,aiu_saveFirst:`Save the settings first — then the sign-in can start.`,aiu_instanceNotRunning:`The instance is not running — start it to sign in.`,aiu_noAnswer:`the instance did not answer`,aiu_noCredentials:`No AI credentials stored yet — add them in the admin under Settings → Credentials.`,aiu_adminKeyHint:`This account needs an ADMIN key of your organisation, not the key the admin AI assistant uses. Personal accounts without an organisation cannot deliver usage reports.`,aiu_stOnline:`Online`,aiu_stLimited:`Limited`,aiu_stOffline:`Offline`},p={aiu_storedTitle:`KI-Konten`,aiu_storedHint:`Einschalten, was überwacht werden soll. Abos melden sich mit Ihrem eigenen Konto an; die Einträge darunter stammen aus dem zentralen Zugangsdaten-Speicher des Admin (Einstellungen → Zugangsdaten).`,aiu_capClaude:`Abo — einmalig mit Ihrem Claude-Konto anmelden`,aiu_capChatgpt:`Abo — einmalig mit Ihrem ChatGPT-Konto anmelden`,aiu_capGemini:`Abo — einmalig mit Ihrem Google-Konto anmelden`,aiu_storedKey:`Gespeicherter Schlüssel`,aiu_provider:`Anbieter`,aiu_warnAt:`Warnen ab %`,aiu_signedIn:`Angemeldet`,aiu_signOut:`Abmelden`,aiu_startSignIn:`Anmelden`,aiu_claudeStep1:`1. Anmeldeseite öffnen und mit Ihrem Claude-Konto anmelden.`,aiu_claudeStep2:`2. Den dort angezeigten Code kopieren und hier einlösen.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Anmeldeseite öffnen und mit Ihrem Google-Konto anmelden.`,aiu_googleStep2:`2. Die KOMPLETTE Adresse aus der Adresszeile des Browsers kopieren und hier einfügen.`,aiu_googleErrorPageHint:`Ihr Browser zeigt danach eine Fehlerseite („Seite nicht erreichbar") — das ist richtig so. Google schickt das Ergebnis an Ihren eigenen Rechner, wo nichts darauf wartet. In der Adresszeile steht das Anmelde-Ergebnis trotzdem — und genau das wird hier gebraucht.`,aiu_addressLabel:`Adresse aus dem Browser`,aiu_deviceStep1:`1. Die OpenAI-Seite öffnen und diesen Code eintippen:`,aiu_copyCode:`Code kopieren`,aiu_openPage:`Seite öffnen`,aiu_deviceWaiting:`Warte auf Ihre Bestätigung — diese Karte aktualisiert sich von selbst, sobald Sie fertig sind.`,aiu_openSignIn:`Anmeldeseite öffnen`,aiu_copyLink:`Link kopieren`,aiu_redeem:`Einlösen`,aiu_saveFirst:`Zuerst die Einstellungen speichern — danach kann die Anmeldung starten.`,aiu_instanceNotRunning:`Die Instanz läuft nicht — zum Anmelden bitte starten.`,aiu_noAnswer:`die Instanz hat nicht geantwortet`,aiu_noCredentials:`Noch keine KI-Zugangsdaten gespeichert — im Admin unter Einstellungen → Zugangsdaten anlegen.`,aiu_adminKeyHint:`Dieses Konto braucht einen VERWALTUNGS-Schlüssel Ihrer Organisation, nicht den Schlüssel des Admin-KI-Assistenten. Einzelkonten ohne Organisation können keine Verbrauchs-Berichte liefern.`,aiu_stOnline:`Online`,aiu_stLimited:`Eingeschränkt`,aiu_stOffline:`Offline`},m={aiu_storedTitle:`Аккаунты ИИ`,aiu_storedHint:`Включите то, что нужно отслеживать. Подписки входят под вашим аккаунтом; записи ниже — из центрального хранилища учётных данных (Настройки → Учётные данные).`,aiu_capClaude:`Подписка — один раз войдите со своим аккаунтом Claude`,aiu_capChatgpt:`Подписка — один раз войдите со своим аккаунтом ChatGPT`,aiu_capGemini:`Подписка — один раз войдите со своим аккаунтом Google`,aiu_storedKey:`Сохранённый ключ`,aiu_provider:`Провайдер`,aiu_warnAt:`Предупреждать с %`,aiu_signedIn:`Вход выполнен`,aiu_signOut:`Выйти`,aiu_startSignIn:`Войти`,aiu_claudeStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Claude.`,aiu_claudeStep2:`2. Скопируйте показанный код и активируйте его здесь.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Google.`,aiu_googleStep2:`2. Скопируйте ВЕСЬ адрес из адресной строки браузера и вставьте сюда.`,aiu_googleErrorPageHint:`Затем браузер покажет страницу ошибки («не удаётся открыть сайт») — так и должно быть. Google отправляет результат на ваш компьютер, где его никто не ждёт. Но в адресной строке результат входа есть — именно он здесь и нужен.`,aiu_addressLabel:`Адрес из браузера`,aiu_deviceStep1:`1. Откройте страницу OpenAI и введите этот код:`,aiu_copyCode:`Копировать код`,aiu_openPage:`Открыть страницу`,aiu_deviceWaiting:`Ожидание подтверждения — карточка обновится сама.`,aiu_openSignIn:`Открыть страницу входа`,aiu_copyLink:`Копировать ссылку`,aiu_redeem:`Активировать`,aiu_saveFirst:`Сначала сохраните настройки — затем можно начать вход.`,aiu_instanceNotRunning:`Экземпляр не запущен — запустите его для входа.`,aiu_noAnswer:`экземпляр не ответил`,aiu_noCredentials:`Данные доступа ИИ ещё не сохранены — добавьте их: Настройки → Учётные данные.`,aiu_adminKeyHint:`Этому аккаунту нужен АДМИНИСТРАТИВНЫЙ ключ организации, а не ключ ИИ-ассистента. Личные аккаунты без организации не выдают отчёты о расходе.`,aiu_stOnline:`В сети`,aiu_stLimited:`Ограничено`,aiu_stOffline:`Не в сети`},h={aiu_storedTitle:`Contas de IA`,aiu_storedHint:`Ative o que deseja monitorizar. As assinaturas iniciam sessão com a sua conta; as entradas abaixo vêm do armazenamento central de credenciais (Definições → Credenciais).`,aiu_capClaude:`Assinatura — inicie sessão uma vez com a sua conta Claude`,aiu_capChatgpt:`Assinatura — inicie sessão uma vez com a sua conta ChatGPT`,aiu_capGemini:`Assinatura — inicie sessão uma vez com a sua conta Google`,aiu_storedKey:`Chave guardada`,aiu_provider:`Fornecedor`,aiu_warnAt:`Avisar a partir de %`,aiu_signedIn:`Sessão iniciada`,aiu_signOut:`Terminar sessão`,aiu_startSignIn:`Iniciar sessão`,aiu_claudeStep1:`1. Abra a página de início de sessão e entre com a sua conta Claude.`,aiu_claudeStep2:`2. Copie o código mostrado e resgate-o aqui.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra a página de início de sessão e entre com a sua conta Google.`,aiu_googleStep2:`2. Copie o endereço COMPLETO da barra de endereços e cole-o aqui.`,aiu_googleErrorPageHint:`O navegador mostrará depois uma página de erro («não é possível aceder») — isso é esperado. A Google envia o resultado para o seu computador, onde nada está à escuta. O endereço contém na mesma o resultado — e é isso que é preciso aqui.`,aiu_addressLabel:`Endereço do navegador`,aiu_deviceStep1:`1. Abra a página da OpenAI e introduza este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`À espera da sua confirmação — este cartão atualiza-se sozinho.`,aiu_openSignIn:`Abrir página de início de sessão`,aiu_copyLink:`Copiar link`,aiu_redeem:`Resgatar`,aiu_saveFirst:`Guarde primeiro as definições — depois o início de sessão pode começar.`,aiu_instanceNotRunning:`A instância não está em execução — inicie-a para entrar.`,aiu_noAnswer:`a instância não respondeu`,aiu_noCredentials:`Ainda não há credenciais de IA guardadas — adicione-as em Definições → Credenciais.`,aiu_adminKeyHint:`Esta conta precisa de uma chave de ADMINISTRAÇÃO da organização, não da chave do assistente de IA. Contas pessoais sem organização não fornecem relatórios de uso.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitado`,aiu_stOffline:`Offline`},g={aiu_storedTitle:`AI-accounts`,aiu_storedHint:`Schakel in wat u wilt bewaken. Abonnementen melden zich aan met uw eigen account; de vermeldingen daaronder komen uit de centrale opslag van toegangsgegevens (Instellingen → Toegangsgegevens).`,aiu_capClaude:`Abonnement — meld u eenmalig aan met uw Claude-account`,aiu_capChatgpt:`Abonnement — meld u eenmalig aan met uw ChatGPT-account`,aiu_capGemini:`Abonnement — meld u eenmalig aan met uw Google-account`,aiu_storedKey:`Opgeslagen sleutel`,aiu_provider:`Aanbieder`,aiu_warnAt:`Waarschuwen vanaf %`,aiu_signedIn:`Aangemeld`,aiu_signOut:`Afmelden`,aiu_startSignIn:`Aanmelden`,aiu_claudeStep1:`1. Open de aanmeldpagina en log in met uw Claude-account.`,aiu_claudeStep2:`2. Kopieer de getoonde code en wissel die hier in.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open de aanmeldpagina en log in met uw Google-account.`,aiu_googleStep2:`2. Kopieer het VOLLEDIGE adres uit de adresbalk en plak het hier.`,aiu_googleErrorPageHint:`Uw browser toont daarna een foutpagina («site kan niet worden bereikt») — dat hoort zo. Google stuurt het resultaat naar uw eigen computer, waar niets luistert. In de adresbalk staat het resultaat wél — en dat is wat hier nodig is.`,aiu_addressLabel:`Adres uit de browser`,aiu_deviceStep1:`1. Open de OpenAI-pagina en typ deze code in:`,aiu_copyCode:`Code kopiëren`,aiu_openPage:`Pagina openen`,aiu_deviceWaiting:`Wachten op uw bevestiging — deze kaart werkt zichzelf bij.`,aiu_openSignIn:`Aanmeldpagina openen`,aiu_copyLink:`Link kopiëren`,aiu_redeem:`Inwisselen`,aiu_saveFirst:`Sla eerst de instellingen op — daarna kan het aanmelden starten.`,aiu_instanceNotRunning:`De instantie draait niet — start deze om aan te melden.`,aiu_noAnswer:`de instantie antwoordde niet`,aiu_noCredentials:`Nog geen AI-toegangsgegevens opgeslagen — voeg ze toe via Instellingen → Toegangsgegevens.`,aiu_adminKeyHint:`Dit account heeft een BEHEER-sleutel van uw organisatie nodig, niet die van de AI-assistent. Persoonlijke accounts zonder organisatie leveren geen verbruiksrapporten.`,aiu_stOnline:`Online`,aiu_stLimited:`Beperkt`,aiu_stOffline:`Offline`},_={aiu_storedTitle:`Comptes IA`,aiu_storedHint:`Activez ce que vous voulez surveiller. Les abonnements se connectent avec votre propre compte ; les entrées ci-dessous viennent du stockage central des identifiants (Réglages → Identifiants).`,aiu_capClaude:`Abonnement — connectez-vous une fois avec votre compte Claude`,aiu_capChatgpt:`Abonnement — connectez-vous une fois avec votre compte ChatGPT`,aiu_capGemini:`Abonnement — connectez-vous une fois avec votre compte Google`,aiu_storedKey:`Clé enregistrée`,aiu_provider:`Fournisseur`,aiu_warnAt:`Avertir à partir de %`,aiu_signedIn:`Connecté`,aiu_signOut:`Se déconnecter`,aiu_startSignIn:`Se connecter`,aiu_claudeStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Claude.`,aiu_claudeStep2:`2. Copiez le code affiché et validez-le ici.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Google.`,aiu_googleStep2:`2. Copiez l'adresse COMPLÈTE depuis la barre d'adresse et collez-la ici.`,aiu_googleErrorPageHint:`Votre navigateur affichera ensuite une page d'erreur (« site inaccessible ») — c'est normal. Google envoie le résultat vers votre propre ordinateur, où rien n'écoute. L'adresse contient malgré tout le résultat — et c'est précisément ce qu'il faut ici.`,aiu_addressLabel:`Adresse du navigateur`,aiu_deviceStep1:`1. Ouvrez la page OpenAI et saisissez ce code :`,aiu_copyCode:`Copier le code`,aiu_openPage:`Ouvrir la page`,aiu_deviceWaiting:`En attente de votre confirmation — cette carte se met à jour toute seule.`,aiu_openSignIn:`Ouvrir la page de connexion`,aiu_copyLink:`Copier le lien`,aiu_redeem:`Valider`,aiu_saveFirst:`Enregistrez d'abord les réglages — la connexion pourra ensuite démarrer.`,aiu_instanceNotRunning:`L'instance ne tourne pas — démarrez-la pour vous connecter.`,aiu_noAnswer:`l'instance n'a pas répondu`,aiu_noCredentials:`Aucun identifiant IA enregistré — ajoutez-les via Réglages → Identifiants.`,aiu_adminKeyHint:`Ce compte nécessite une clé d'ADMINISTRATION de votre organisation, pas celle de l'assistant IA. Les comptes personnels sans organisation ne fournissent pas de rapports d'utilisation.`,aiu_stOnline:`En ligne`,aiu_stLimited:`Limité`,aiu_stOffline:`Hors ligne`},v={aiu_storedTitle:`Account IA`,aiu_storedHint:`Attiva ciò che vuoi monitorare. Gli abbonamenti accedono con il tuo account; le voci sotto provengono dall'archivio centrale delle credenziali (Impostazioni → Credenziali).`,aiu_capClaude:`Abbonamento — accedi una volta con il tuo account Claude`,aiu_capChatgpt:`Abbonamento — accedi una volta con il tuo account ChatGPT`,aiu_capGemini:`Abbonamento — accedi una volta con il tuo account Google`,aiu_storedKey:`Chiave salvata`,aiu_provider:`Fornitore`,aiu_warnAt:`Avvisa da %`,aiu_signedIn:`Accesso effettuato`,aiu_signOut:`Disconnetti`,aiu_startSignIn:`Accedi`,aiu_claudeStep1:`1. Apri la pagina di accesso ed entra con il tuo account Claude.`,aiu_claudeStep2:`2. Copia il codice mostrato e riscattalo qui.`,aiu_codeLabel:`Codice`,aiu_googleStep1:`1. Apri la pagina di accesso ed entra con il tuo account Google.`,aiu_googleStep2:`2. Copia l'INTERO indirizzo dalla barra degli indirizzi e incollalo qui.`,aiu_googleErrorPageHint:`Il browser mostrerà poi una pagina di errore («sito non raggiungibile») — è corretto così. Google invia il risultato al tuo computer, dove nessuno è in ascolto. Nell'indirizzo il risultato c'è comunque — ed è proprio quello che serve qui.`,aiu_addressLabel:`Indirizzo dal browser`,aiu_deviceStep1:`1. Apri la pagina OpenAI e digita questo codice:`,aiu_copyCode:`Copia codice`,aiu_openPage:`Apri pagina`,aiu_deviceWaiting:`In attesa della tua conferma — questa scheda si aggiorna da sola.`,aiu_openSignIn:`Apri pagina di accesso`,aiu_copyLink:`Copia link`,aiu_redeem:`Riscatta`,aiu_saveFirst:`Salva prima le impostazioni — poi l'accesso può iniziare.`,aiu_instanceNotRunning:`L'istanza non è in esecuzione — avviala per accedere.`,aiu_noAnswer:`l'istanza non ha risposto`,aiu_noCredentials:`Nessuna credenziale IA salvata — aggiungila in Impostazioni → Credenziali.`,aiu_adminKeyHint:`Questo account richiede una chiave di AMMINISTRAZIONE della tua organizzazione, non quella dell'assistente IA. Gli account personali senza organizzazione non forniscono rapporti di utilizzo.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitato`,aiu_stOffline:`Offline`},y={aiu_storedTitle:`Cuentas de IA`,aiu_storedHint:`Active lo que quiera supervisar. Las suscripciones inician sesión con su propia cuenta; las entradas de abajo provienen del almacén central de credenciales (Ajustes → Credenciales).`,aiu_capClaude:`Suscripción — inicie sesión una vez con su cuenta Claude`,aiu_capChatgpt:`Suscripción — inicie sesión una vez con su cuenta ChatGPT`,aiu_capGemini:`Suscripción — inicie sesión una vez con su cuenta Google`,aiu_storedKey:`Clave guardada`,aiu_provider:`Proveedor`,aiu_warnAt:`Avisar desde %`,aiu_signedIn:`Sesión iniciada`,aiu_signOut:`Cerrar sesión`,aiu_startSignIn:`Iniciar sesión`,aiu_claudeStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Claude.`,aiu_claudeStep2:`2. Copie el código mostrado y canjéelo aquí.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Google.`,aiu_googleStep2:`2. Copie la dirección COMPLETA de la barra de direcciones y péguela aquí.`,aiu_googleErrorPageHint:`Su navegador mostrará después una página de error («no se puede acceder al sitio») — es lo esperado. Google envía el resultado a su propio ordenador, donde nada está escuchando. La dirección contiene el resultado igualmente — y eso es lo que hace falta aquí.`,aiu_addressLabel:`Dirección del navegador`,aiu_deviceStep1:`1. Abra la página de OpenAI y escriba este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`Esperando su confirmación — esta tarjeta se actualiza sola.`,aiu_openSignIn:`Abrir página de inicio de sesión`,aiu_copyLink:`Copiar enlace`,aiu_redeem:`Canjear`,aiu_saveFirst:`Guarde primero la configuración — después puede comenzar el inicio de sesión.`,aiu_instanceNotRunning:`La instancia no está en marcha — iníciela para entrar.`,aiu_noAnswer:`la instancia no respondió`,aiu_noCredentials:`Aún no hay credenciales de IA guardadas — añádalas en Ajustes → Credenciales.`,aiu_adminKeyHint:`Esta cuenta necesita una clave de ADMINISTRACIÓN de su organización, no la del asistente de IA. Las cuentas personales sin organización no ofrecen informes de uso.`,aiu_stOnline:`En línea`,aiu_stLimited:`Limitado`,aiu_stOffline:`Sin conexión`},b={aiu_storedTitle:`Konta AI`,aiu_storedHint:`Włącz to, co ma być monitorowane. Subskrypcje logują się Twoim kontem; pozycje poniżej pochodzą z centralnego magazynu danych dostępu (Ustawienia → Dane dostępu).`,aiu_capClaude:`Subskrypcja — zaloguj się raz kontem Claude`,aiu_capChatgpt:`Subskrypcja — zaloguj się raz kontem ChatGPT`,aiu_capGemini:`Subskrypcja — zaloguj się raz kontem Google`,aiu_storedKey:`Zapisany klucz`,aiu_provider:`Dostawca`,aiu_warnAt:`Ostrzegaj od %`,aiu_signedIn:`Zalogowano`,aiu_signOut:`Wyloguj`,aiu_startSignIn:`Zaloguj`,aiu_claudeStep1:`1. Otwórz stronę logowania i zaloguj się kontem Claude.`,aiu_claudeStep2:`2. Skopiuj pokazany kod i zrealizuj go tutaj.`,aiu_codeLabel:`Kod`,aiu_googleStep1:`1. Otwórz stronę logowania i zaloguj się kontem Google.`,aiu_googleStep2:`2. Skopiuj CAŁY adres z paska adresu i wklej go tutaj.`,aiu_googleErrorPageHint:`Przeglądarka pokaże potem stronę błędu («nie można otworzyć strony») — tak ma być. Google wysyła wynik na Twój komputer, gdzie nic nie nasłuchuje. W pasku adresu wynik jednak jest — i właśnie on jest tu potrzebny.`,aiu_addressLabel:`Adres z przeglądarki`,aiu_deviceStep1:`1. Otwórz stronę OpenAI i wpisz ten kod:`,aiu_copyCode:`Kopiuj kod`,aiu_openPage:`Otwórz stronę`,aiu_deviceWaiting:`Czekam na potwierdzenie — ta karta odświeży się sama.`,aiu_openSignIn:`Otwórz stronę logowania`,aiu_copyLink:`Kopiuj link`,aiu_redeem:`Zrealizuj`,aiu_saveFirst:`Najpierw zapisz ustawienia — potem można rozpocząć logowanie.`,aiu_instanceNotRunning:`Instancja nie działa — uruchom ją, aby się zalogować.`,aiu_noAnswer:`instancja nie odpowiedziała`,aiu_noCredentials:`Brak zapisanych danych dostępu AI — dodaj je w Ustawienia → Dane dostępu.`,aiu_adminKeyHint:`To konto wymaga klucza ADMINISTRACYJNEGO organizacji, a nie klucza asystenta AI. Konta osobiste bez organizacji nie dostarczają raportów zużycia.`,aiu_stOnline:`Online`,aiu_stLimited:`Ograniczone`,aiu_stOffline:`Offline`},x={aiu_storedTitle:`Акаунти ШІ`,aiu_storedHint:`Увімкніть те, що треба відстежувати. Підписки входять під вашим акаунтом; записи нижче — з центрального сховища даних доступу (Налаштування → Дані доступу).`,aiu_capClaude:`Підписка — увійдіть один раз акаунтом Claude`,aiu_capChatgpt:`Підписка — увійдіть один раз акаунтом ChatGPT`,aiu_capGemini:`Підписка — увійдіть один раз акаунтом Google`,aiu_storedKey:`Збережений ключ`,aiu_provider:`Постачальник`,aiu_warnAt:`Попереджати від %`,aiu_signedIn:`Вхід виконано`,aiu_signOut:`Вийти`,aiu_startSignIn:`Увійти`,aiu_claudeStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Claude.`,aiu_claudeStep2:`2. Скопіюйте показаний код і активуйте його тут.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Google.`,aiu_googleStep2:`2. Скопіюйте ВЕСЬ адрес з адресного рядка та вставте сюди.`,aiu_googleErrorPageHint:`Далі браузер покаже сторінку помилки («сайт недоступний») — так і має бути. Google надсилає результат на ваш комп'ютер, де ніхто не слухає. В адресному рядку результат усе одно є — саме він тут і потрібен.`,aiu_addressLabel:`Адреса з браузера`,aiu_deviceStep1:`1. Відкрийте сторінку OpenAI та введіть цей код:`,aiu_copyCode:`Копіювати код`,aiu_openPage:`Відкрити сторінку`,aiu_deviceWaiting:`Очікую підтвердження — картка оновиться сама.`,aiu_openSignIn:`Відкрити сторінку входу`,aiu_copyLink:`Копіювати посилання`,aiu_redeem:`Активувати`,aiu_saveFirst:`Спочатку збережіть налаштування — потім можна починати вхід.`,aiu_instanceNotRunning:`Екземпляр не запущено — запустіть його для входу.`,aiu_noAnswer:`екземпляр не відповів`,aiu_noCredentials:`Ще немає збережених даних доступу ШІ — додайте їх у Налаштування → Дані доступу.`,aiu_adminKeyHint:`Цей акаунт потребує АДМІНІСТРАТИВНОГО ключа організації, а не ключа ШІ-асистента. Особисті акаунти без організації не дають звітів про використання.`,aiu_stOnline:`У мережі`,aiu_stLimited:`Обмежено`,aiu_stOffline:`Не в мережі`},S={aiu_storedTitle:`AI 账户`,aiu_storedHint:`开启需要监控的项目。订阅使用您自己的账户登录;下方条目来自管理界面的中央凭据存储(设置 → 凭据)。`,aiu_capClaude:`订阅——使用您的 Claude 账户登录一次`,aiu_capChatgpt:`订阅——使用您的 ChatGPT 账户登录一次`,aiu_capGemini:`订阅——使用您的 Google 账户登录一次`,aiu_storedKey:`已保存的密钥`,aiu_provider:`提供商`,aiu_warnAt:`警告阈值 %`,aiu_signedIn:`已登录`,aiu_signOut:`退出登录`,aiu_startSignIn:`登录`,aiu_claudeStep1:`1. 打开登录页面并使用您的 Claude 账户登录。`,aiu_claudeStep2:`2. 复制页面显示的代码并在此兑换。`,aiu_codeLabel:`代码`,aiu_googleStep1:`1. 打开登录页面并使用您的 Google 账户登录。`,aiu_googleStep2:`2. 复制浏览器地址栏中的完整地址并粘贴到这里。`,aiu_googleErrorPageHint:`随后浏览器会显示错误页面(无法访问此网站)——这是正常的。Google 把结果发送到您自己的电脑,而那里没有程序在接收。地址栏中仍然包含登录结果——这正是此处需要的。`,aiu_addressLabel:`来自浏览器的地址`,aiu_deviceStep1:`1. 打开 OpenAI 页面并输入此代码:`,aiu_copyCode:`复制代码`,aiu_openPage:`打开页面`,aiu_deviceWaiting:`正在等待您的确认——完成后此卡片会自动更新。`,aiu_openSignIn:`打开登录页面`,aiu_copyLink:`复制链接`,aiu_redeem:`兑换`,aiu_saveFirst:`请先保存设置——之后即可开始登录。`,aiu_instanceNotRunning:`实例未运行——请启动后再登录。`,aiu_noAnswer:`实例没有响应`,aiu_noCredentials:`尚未保存任何 AI 凭据——请在 设置 → 凭据 中添加。`,aiu_adminKeyHint:`此账户需要您所在组织的管理密钥,而不是管理界面 AI 助手使用的密钥。没有组织的个人账户无法提供用量报告。`,aiu_stOnline:`在线`,aiu_stLimited:`受限`,aiu_stOffline:`离线`},C=class extends t{constructor(e){super(e,{...e}),this.state={...this.state,data:{accounts:[]},originalData:{accounts:[]},theme:this.createTheme()};let t={en:f,de:p,ru:m,pt:h,nl:g,fr:_,it:v,es:y,pl:b,uk:x,"zh-cn":S};for(let[e,n]of Object.entries(t))o.extendTranslations(n,e);o.setLanguage(u(navigator.language))}render(){return this.state.loaded?r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(s,{sx:{height:`100%`,bgcolor:`background.default`,color:`text.primary`},children:r(`div`,{style:{padding:50,width:760},children:r(d,{oContext:{adapterName:`ai-usage`,socket:this.socket,instance:0,themeType:this.state.theme.palette.mode,isFloatComma:!0,dateFormat:``,forceUpdate:()=>{},systemConfig:{},theme:this.state.theme,_themeName:this.state.themeName,onCommandRunning:()=>{}},alive:!0,changed:!1,themeName:this.state.theme.palette.mode,common:{},attr:`_accounts`,data:this.state.data,originalData:this.state.originalData,onError:()=>{},schema:{url:`custom/customComponents.js`,i18n:!0,name:`AiUsageComponentSet/Components/ConfigPanel`,type:`custom`},onChange:e=>this.setState({data:e})})})})})}):r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(c,{themeType:this.state.themeType})})})}};a(),window.adapterName=`ai-usage`;var w=document.getElementById(`root`);w&&l(w).render(r(i.StrictMode,{children:r(C,{socket:{port:8081}})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-qa4g3G_V.js";export{e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./vite-preload-helper-B7qeedMF.js";import{a as t,r as n}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js";({...t.global});var r=t.share;t.utils,typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var i=`__mf_init__virtual:mf:__mfe_internal__AiUsageComponentSet__mf_owner__1__mf_v__runtimeInit__mf_v__.js__`,a=globalThis[i];if(!a){let e,t,n=new Promise((n,r)=>{e=n,t=r});a=globalThis[i]={initPromise:n,initResolve:e,initReject:t}}var o=a.initResolve,s=`__mf_module_cache__`;globalThis[s]||={share:{},remote:{}},globalThis[s].share||={},globalThis[s].remote||={};var c=globalThis[s];for(let e of Object.keys(c.share))if(e.startsWith(`default:`)){let t=e.slice(8);c.share[t]===void 0&&(c.share[t]=c.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;c.share[t]===void 0&&(c.share[t]=c.share[e])}var l={},u=Array.isArray(`default`)?`default`:[`default`],d=`default`,f=`AiUsageComponentSet`,p,m;async function h(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var g=Symbol(`mf.originalSharedProvider`),_={emit:e=>e},v=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[g]:r});return n},y=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&(e==null?void 0:e.from)===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},b=(e,t,n,i)=>{var a;if(!e||!n)return;let o=Array.isArray(n.scope)?n.scope:[n.scope||`default`],s=v(e,i),c={};for(let e of o)c[e||`default`]={[t]:s};let l=(a=r.getRegisteredShare(c,t,{...n,scope:o,strategy:i},_))==null?void 0:a.shared;return(l==null?void 0:l[g])||l},x=(e,t,n,r)=>{var i;let a=e=>S(e,n),o=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>!a(e)));n!=null&&n.version&&((i=n.shareConfig)==null?void 0:i.import)!==!1&&(o[n.version]||(o[n.version]=n));let s=b(o,t,n,r);return a(s)?void 0:s},S=(e,t)=>e===t||!!(t!=null&&t.from&&(e==null?void 0:e.from)===t.from),C=(e,t,n,r,i,a,o,s,c)=>{var l,u;if(c!==`version-first`||!s)return;let d=t==null||(l=t.options)==null||(l=l.shared)==null?void 0:l[i],f=Array.isArray(d)?d.find(e=>(e==null?void 0:e.version)===a):void 0,p=((s==null?void 0:s.from)===(t==null||(u=t.options)==null?void 0:u.name)?s:void 0)||(S(f,s)?f:t?void 0:s);if(p)return e.some(e=>{var i,a;return e!==t&&(e==null||(i=e.options)==null?void 0:i.name)===(o==null?void 0:o.from)&&(e==null||(a=e.shareScopeMap)==null?void 0:a[r])===n})?p:void 0},w=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?C(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&!(a.registered&&!S(u,s)))return{provider:u,scopeRootProvider:l}};async function T(){return p||=h(()=>e(()=>import(`./_virtual_mf-localSharedImportMap___mfe_internal__AiUsageComponentSet__mf_owner__1-DKcsNxEw.js`),[],import.meta.url)).catch(e=>{throw p=void 0,e}),p}async function E(){return m||=h(()=>e(()=>import(`./virtualExposes-qBZHQidU.js`),[],import.meta.url)).then(e=>e.default??e).catch(e=>{throw m=void 0,e}),m}async function D(e={},t=[]){var r,i;let a=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},s=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},p=Symbol.for(`module-federation.shared-cache-listeners`),m=Symbol.for(`module-federation.shared-cache-owners`),g=e=>{let t=e[m];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,m,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},_=(e,t)=>{var n;return(n=e[m])==null?void 0:n[t.canonical]},v=(e,t,n,r)=>{var i;e[t.canonical]=n;let a=t.aliases||[];for(let t of a)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let o=e[m];r===void 0?o&&delete o[t.canonical]:g(e)[t.canonical]=r;let s=(i=e[p])==null?void 0:i[t.canonical];if(s)for(let e of s)e(n);return n},C=Symbol.for(`module-federation.tree-shaking-shared-cache`),E=e=>{let t=e[C];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,C,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},D=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=E(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},O=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),k=e=>{let t=e[O];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,O,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},A=(e,t,n)=>{var r;let i=s(e,t);return i===void 0?(r=e[O])==null||(r=r[t.canonical])==null?void 0:r[n]:i},j=(e,t,n,r)=>{let i=k(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},M=((r=globalThis.__FEDERATION__)==null?void 0:r.__INSTANCES__)||[],N=(i=t.find(e=>e==null?void 0:e.from))==null?void 0:i.from,ee=M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)===N&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e})||M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)!==f&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e}),P=Object.create(null);for(let[t,n]of Object.entries(e)){let e=P[t]=Object.create(null);for(let[t,r]of Object.entries(n))e[t]=Object.assign({},r)}let{usedShared:F,usedRemotes:I}=await T();var L=l[d];if(L||=l[d]={from:f},t.indexOf(L)>=0)return;t.push(L);let R=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},z=[],B=globalThis.window===void 0?await Promise.all([]):[],V=`__mf_vite_runtime_share_load_id__`,te=0,H=new Map,U=new Map,W=n({name:f,remotes:I,shared:F,plugins:[ne(),...z,...B],shareStrategy:`version-first`});W.initShareScopeMap(`default`,e);function ne(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=n===void 0?void 0:U.get(n);if(!r)return e;let i=e.resolver;return e.resolver=(...e)=>(r.pinned.reapply(),i(...e)),r.pinned.reveal(),e}}}let re=W.sharedHandler.hooks.lifecycle.resolveShare,G=new WeakMap;re.on(e=>{var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=e.resolver;return typeof r==`function`&&(e.resolver=(...e)=>{let t=r(...e),i=t==null?void 0:t.shared;return i&&(typeof i==`object`||typeof i==`function`)&&!G.has(i)&&G.set(i,{from:i.from}),n!==void 0&&i&&H.set(n,i),t}),e});let ie=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??(n==null?void 0:n.scope)??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},ae=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),oe=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},se=async(e,t,n)=>{let r=++te;U.set(r,{pinned:n});try{let n=await W.loadShare(e,{customShareInfo:{shareConfig:t,[V]:r}});return{factory:n===!1?void 0:n,selectedProvider:H.get(r)}}finally{H.delete(r),U.delete(r)}},K=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=ie(n,r,i,a);if(!c)return;let l;try{l=await se(e,t,c)}catch(e){throw c.release(!1),e}let u=l==null?void 0:l.factory;if(u===void 0){c.release(!1);return}let d=ae(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=G.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:(n==null?void 0:n[t])===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??oe(d,u);if(!c.release(!0,(h==null?void 0:h.provider)===c.provider)||!h)return;let g=G.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&(n==null?void 0:n[h.version])!==h.provider))return{provider:h.provider,selection:h,resolved:v}},q=new Set,J=new Map,ce=async(t,n,r)=>{var i;let o=!!((i=n.shareConfig)!=null&&i.singleton);if(!o&&n.canLiveRebind!==!1)try{let i=x(r,t,n,`version-first`),l=y(r,i);if(!l)return;let{version:u}=l;if(!o&&u!==n.version||!i.lib&&!i.loading&&!(i.loaded&&typeof i.get==`function`))return;let d=a(t,o,n.version,n.scope);if(s(c.share,d)!==void 0)return;let f=e[t],p=f==null?void 0:f[u];if(l.registered&&!S(p,i))return;let m,h=i.lib;if(!h&&i.loading&&(h=await i.loading),!h&&i.loaded&&typeof i.get==`function`&&(h=await i.get()),!h)return;let g=typeof h==`function`?h():h,_=await Promise.resolve(g),b=l.registered?p:i;m={provider:b,selection:{provider:b,version:u,from:i.from,registered:l.registered},resolved:_};let C=m==null?void 0:m.provider,w=m==null?void 0:m.selection;if(!w)return;let T=m==null?void 0:m.resolved;if(T===void 0||s(c.share,d)!==void 0||w.registered&&(f==null?void 0:f[w.version])!==C)return;v(c.share,d,R(T),w.from),q.add(C)}catch(e){console.error(`[Module Federation] Failed to bridge materialized shared module "`+t+`"`,e)}},Y=async(t,n,r,i,o)=>{try{var l,u;let d=a(t,(l=n.shareConfig)==null?void 0:l.singleton,n.version,n.scope),p=s(c.share,d),m=_(c.share,d),h=x(r,t,n,`version-first`),g=h||b(r,t,n,`version-first`)||n,C=y(r,g);if(!C)return;let T=S(g,n),{version:E}=C,D=i==null?void 0:i[E],O=w(M,ee,e,`default`,t,C,h,D,`version-first`);if(!O&&!T)return;let{provider:k,scopeRootProvider:A}=O||{provider:g,scopeRootProvider:void 0};if(!((u=n.shareConfig)!=null&&u.singleton)||n.canLiveRebind===!1||p!==void 0&&m!==f)return;let j=e[t],N=j==null?void 0:j[E];if(C.registered&&!A&&!S(N,k))return;let P=await K(t,n.shareConfig,j,E,N,k,C.registered&&!T),F=P==null?void 0:P.provider,I=P==null?void 0:P.selection;if(!I||S(F,n)||o&&(o.version!==I.version||!S({from:I.from},o.provider))||q.has(F))return;let L=P==null?void 0:P.resolved;if(L===void 0)return;let z=s(c.share,d),B=_(c.share,d);if(z!==void 0&&B!==f||I.registered&&(j==null?void 0:j[I.version])!==F)return;o||J.set(t,{version:I.version,provider:{from:I.from}}),q.add(F);let V=R(L);v(c.share,d,V,I.from)}catch(e){console.error(`[Module Federation] Failed to bridge external shared module "`+t+`"`,e)}};for(let[e,t]of Object.entries(F))t.treeShaking||await ce(e,t,P[e]);for(let[e,t]of Object.entries(F)){var X;if(t.treeShaking)continue;let n=a(e,(X=t.shareConfig)==null?void 0:X.singleton,t.version,t.scope);if(s(c.share,n)!==void 0)continue;let r=a(e,!0,t.version,t.scope),i=s(c.share,r);i!==void 0&&v(c.share,n,i,_(c.share,r))}let Z=[`react`,`react/jsx-runtime`,`react-dom`,`react-dom/client`,`@mui/material`,`@mui/icons-material`,`@iobroker/gui-components`,`@iobroker/json-config`].filter(e=>F[e]!==void 0),Q=e=>e.startsWith(`@`)?e.split(`/`).slice(0,2).join(`/`):e.split(`/`)[0];for(let e of Object.keys(F)){if(Z.includes(e))continue;let t=Q(e),n=Z.indexOf(t);if(n===-1){Z.push(e);continue}let r=n;for(;r>0&&Q(Z[r-1])===t&&Z[r-1]!==t;)r--;Z.splice(r,0,e)}var le=async e=>{for(let r of e){var t,n;let e=F[r],i=a(r,(t=e.shareConfig)==null?void 0:t.singleton,e.version,e.scope);if(((n=e.shareConfig)==null?void 0:n.import)===!1||e.treeShaking||s(c.share,i)!==void 0)continue;let o=a(r,!0,e.version,e.scope),l=s(c.share,o);if(l!==void 0){v(c.share,i,l,_(c.share,o));continue}let u=await e.get(),d=typeof u==`function`?u():u,p=await Promise.resolve(d),m=(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t})(p),h=m===p?{...p}:m;h.__esModule!==!0&&Object.defineProperty(h,"__esModule",{value:!0,enumerable:!1}),v(c.share,i,h,f)}};let ue=e=>{var t,n;let r=F[e];if(!r.treeShaking&&((t=r.shareConfig)==null?void 0:t.import)!==!1)return!1;let i=a(e,(n=r.shareConfig)==null?void 0:n.singleton,r.version,r.scope);return r.treeShaking?A(c.share,i,f)===void 0&&s(c.share,i)===void 0:s(c.share,i)===void 0},$=Z.findIndex(e=>{var t,n,r;let i=F[e],o=a(e,(t=i.shareConfig)==null?void 0:t.singleton,i.version,i.scope);return(i.treeShaking?A(c.share,o,f)??s(c.share,o):s(c.share,o))===void 0?i.treeShaking||((n=i.shareConfig)==null?void 0:n.import)===!1?!0:!((r=i.shareConfig)!=null&&r.singleton)||typeof x!=`function`?!1:!!x(P[e],e,i,`version-first`):!1}),de=$===-1?Z:Z.slice(0,$);var fe=$===-1?[]:Z.slice($);await le(de);try{await h(async()=>{await Promise.all(await W.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:t}))})}catch(e){console.error(`[Module Federation]`,e)}for(let[t,n]of Object.entries(F))n.treeShaking||await Y(t,n,e[t],P[t],void 0);try{var pe;let e=(pe=globalThis.__FEDERATION__)==null?void 0:pe.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of u){let r=n==null?void 0:n[e];if(r)for(let[e,n]of Object.entries(r)){let r=F==null?void 0:F[e],i=P[e],a=J.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!S(t,a.provider))continue;let n=i[e];(t===n||n!=null&&n.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let[e,n]of Object.entries(t))await Y(e,F[e],n,P[e],J.get(e))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let me=async()=>{},he=async(t,n)=>{var r,i;let o=a(t,(r=n.shareConfig)==null?void 0:r.singleton,n.version,n.scope),l=n.treeShaking?A(c.share,o,f):s(c.share,o);if(((i=n.shareConfig)==null?void 0:i.import)!==!1||l!==void 0)return;let u=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},d=e==null?void 0:e[t],p=b(d,t,n,`version-first`)||n,m=y(d,p);if(!m)return;let{version:h}=m,g=d==null?void 0:d[h],_=await K(t,n.shareConfig,d,h,g,p,m.registered&&!S(p,n)),x=_==null?void 0:_.selection,C=_==null?void 0:_.provider,w=_==null?void 0:_.resolved;if(!x||S(C,n)||w===void 0||(n.treeShaking?A(c.share,o,f):s(c.share,o))!==void 0||x.registered&&(d==null?void 0:d[x.version])!==C)return;let T=u(w);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];D(c.share,o,e,T),j(c.share,o,f,T)}else v(c.share,o,T,x.from)};for(let e of fe){let t=F[e];if(ue(e)){var ge;t.treeShaking?await me(e,t):((ge=t.shareConfig)==null?void 0:ge.import)===!1&&await he(e,t)}if(ue(e))break;await le([e])}return o(W),W}async function O(e){let t=await E();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return c.pendingShareLoads&&await Promise.all(c.pendingShareLoads),t[e]().then(e=>()=>e)}export{D as n,O as t};
|
|
1
|
+
import{t as e}from"./vite-preload-helper-B7qeedMF.js";import{a as t,r as n}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js";({...t.global});var r=t.share;t.utils,typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var i=`__mf_init__virtual:mf:__mfe_internal__AiUsageComponentSet__mf_owner__1__mf_v__runtimeInit__mf_v__.js__`,a=globalThis[i];if(!a){let e,t,n=new Promise((n,r)=>{e=n,t=r});a=globalThis[i]={initPromise:n,initResolve:e,initReject:t}}var o=a.initResolve,s=`__mf_module_cache__`;globalThis[s]||={share:{},remote:{}},globalThis[s].share||={},globalThis[s].remote||={};var c=globalThis[s];for(let e of Object.keys(c.share))if(e.startsWith(`default:`)){let t=e.slice(8);c.share[t]===void 0&&(c.share[t]=c.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;c.share[t]===void 0&&(c.share[t]=c.share[e])}var l={},u=Array.isArray(`default`)?`default`:[`default`],d=`default`,f=`AiUsageComponentSet`,p,m;async function h(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var g=Symbol(`mf.originalSharedProvider`),_={emit:e=>e},v=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[g]:r});return n},y=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&(e==null?void 0:e.from)===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},b=(e,t,n,i)=>{var a;if(!e||!n)return;let o=Array.isArray(n.scope)?n.scope:[n.scope||`default`],s=v(e,i),c={};for(let e of o)c[e||`default`]={[t]:s};let l=(a=r.getRegisteredShare(c,t,{...n,scope:o,strategy:i},_))==null?void 0:a.shared;return(l==null?void 0:l[g])||l},x=(e,t,n,r)=>{var i;let a=e=>S(e,n),o=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>!a(e)));n!=null&&n.version&&((i=n.shareConfig)==null?void 0:i.import)!==!1&&(o[n.version]||(o[n.version]=n));let s=b(o,t,n,r);return a(s)?void 0:s},S=(e,t)=>e===t||!!(t!=null&&t.from&&(e==null?void 0:e.from)===t.from),C=(e,t,n,r,i,a,o,s,c)=>{var l,u;if(c!==`version-first`||!s)return;let d=t==null||(l=t.options)==null||(l=l.shared)==null?void 0:l[i],f=Array.isArray(d)?d.find(e=>(e==null?void 0:e.version)===a):void 0,p=((s==null?void 0:s.from)===(t==null||(u=t.options)==null?void 0:u.name)?s:void 0)||(S(f,s)?f:t?void 0:s);if(p)return e.some(e=>{var i,a;return e!==t&&(e==null||(i=e.options)==null?void 0:i.name)===(o==null?void 0:o.from)&&(e==null||(a=e.shareScopeMap)==null?void 0:a[r])===n})?p:void 0},w=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?C(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&!(a.registered&&!S(u,s)))return{provider:u,scopeRootProvider:l}};async function T(){return p||=h(()=>e(()=>import(`./_virtual_mf-localSharedImportMap___mfe_internal__AiUsageComponentSet__mf_owner__1-DKcsNxEw.js`),[],import.meta.url)).catch(e=>{throw p=void 0,e}),p}async function E(){return m||=h(()=>e(()=>import(`./virtualExposes-DP5VuPcn.js`),[],import.meta.url)).then(e=>e.default??e).catch(e=>{throw m=void 0,e}),m}async function D(e={},t=[]){var r,i;let a=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},s=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},p=Symbol.for(`module-federation.shared-cache-listeners`),m=Symbol.for(`module-federation.shared-cache-owners`),g=e=>{let t=e[m];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,m,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},_=(e,t)=>{var n;return(n=e[m])==null?void 0:n[t.canonical]},v=(e,t,n,r)=>{var i;e[t.canonical]=n;let a=t.aliases||[];for(let t of a)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let o=e[m];r===void 0?o&&delete o[t.canonical]:g(e)[t.canonical]=r;let s=(i=e[p])==null?void 0:i[t.canonical];if(s)for(let e of s)e(n);return n},C=Symbol.for(`module-federation.tree-shaking-shared-cache`),E=e=>{let t=e[C];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,C,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},D=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=E(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},O=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),k=e=>{let t=e[O];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,O,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},A=(e,t,n)=>{var r;let i=s(e,t);return i===void 0?(r=e[O])==null||(r=r[t.canonical])==null?void 0:r[n]:i},j=(e,t,n,r)=>{let i=k(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},M=((r=globalThis.__FEDERATION__)==null?void 0:r.__INSTANCES__)||[],N=(i=t.find(e=>e==null?void 0:e.from))==null?void 0:i.from,ee=M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)===N&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e})||M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)!==f&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e}),P=Object.create(null);for(let[t,n]of Object.entries(e)){let e=P[t]=Object.create(null);for(let[t,r]of Object.entries(n))e[t]=Object.assign({},r)}let{usedShared:F,usedRemotes:I}=await T();var L=l[d];if(L||=l[d]={from:f},t.indexOf(L)>=0)return;t.push(L);let R=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},z=[],B=globalThis.window===void 0?await Promise.all([]):[],V=`__mf_vite_runtime_share_load_id__`,te=0,H=new Map,U=new Map,W=n({name:f,remotes:I,shared:F,plugins:[ne(),...z,...B],shareStrategy:`version-first`});W.initShareScopeMap(`default`,e);function ne(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=n===void 0?void 0:U.get(n);if(!r)return e;let i=e.resolver;return e.resolver=(...e)=>(r.pinned.reapply(),i(...e)),r.pinned.reveal(),e}}}let re=W.sharedHandler.hooks.lifecycle.resolveShare,G=new WeakMap;re.on(e=>{var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=e.resolver;return typeof r==`function`&&(e.resolver=(...e)=>{let t=r(...e),i=t==null?void 0:t.shared;return i&&(typeof i==`object`||typeof i==`function`)&&!G.has(i)&&G.set(i,{from:i.from}),n!==void 0&&i&&H.set(n,i),t}),e});let ie=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??(n==null?void 0:n.scope)??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},ae=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),oe=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},se=async(e,t,n)=>{let r=++te;U.set(r,{pinned:n});try{let n=await W.loadShare(e,{customShareInfo:{shareConfig:t,[V]:r}});return{factory:n===!1?void 0:n,selectedProvider:H.get(r)}}finally{H.delete(r),U.delete(r)}},K=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=ie(n,r,i,a);if(!c)return;let l;try{l=await se(e,t,c)}catch(e){throw c.release(!1),e}let u=l==null?void 0:l.factory;if(u===void 0){c.release(!1);return}let d=ae(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=G.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:(n==null?void 0:n[t])===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??oe(d,u);if(!c.release(!0,(h==null?void 0:h.provider)===c.provider)||!h)return;let g=G.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&(n==null?void 0:n[h.version])!==h.provider))return{provider:h.provider,selection:h,resolved:v}},q=new Set,J=new Map,ce=async(t,n,r)=>{var i;let o=!!((i=n.shareConfig)!=null&&i.singleton);if(!o&&n.canLiveRebind!==!1)try{let i=x(r,t,n,`version-first`),l=y(r,i);if(!l)return;let{version:u}=l;if(!o&&u!==n.version||!i.lib&&!i.loading&&!(i.loaded&&typeof i.get==`function`))return;let d=a(t,o,n.version,n.scope);if(s(c.share,d)!==void 0)return;let f=e[t],p=f==null?void 0:f[u];if(l.registered&&!S(p,i))return;let m,h=i.lib;if(!h&&i.loading&&(h=await i.loading),!h&&i.loaded&&typeof i.get==`function`&&(h=await i.get()),!h)return;let g=typeof h==`function`?h():h,_=await Promise.resolve(g),b=l.registered?p:i;m={provider:b,selection:{provider:b,version:u,from:i.from,registered:l.registered},resolved:_};let C=m==null?void 0:m.provider,w=m==null?void 0:m.selection;if(!w)return;let T=m==null?void 0:m.resolved;if(T===void 0||s(c.share,d)!==void 0||w.registered&&(f==null?void 0:f[w.version])!==C)return;v(c.share,d,R(T),w.from),q.add(C)}catch(e){console.error(`[Module Federation] Failed to bridge materialized shared module "`+t+`"`,e)}},Y=async(t,n,r,i,o)=>{try{var l,u;let d=a(t,(l=n.shareConfig)==null?void 0:l.singleton,n.version,n.scope),p=s(c.share,d),m=_(c.share,d),h=x(r,t,n,`version-first`),g=h||b(r,t,n,`version-first`)||n,C=y(r,g);if(!C)return;let T=S(g,n),{version:E}=C,D=i==null?void 0:i[E],O=w(M,ee,e,`default`,t,C,h,D,`version-first`);if(!O&&!T)return;let{provider:k,scopeRootProvider:A}=O||{provider:g,scopeRootProvider:void 0};if(!((u=n.shareConfig)!=null&&u.singleton)||n.canLiveRebind===!1||p!==void 0&&m!==f)return;let j=e[t],N=j==null?void 0:j[E];if(C.registered&&!A&&!S(N,k))return;let P=await K(t,n.shareConfig,j,E,N,k,C.registered&&!T),F=P==null?void 0:P.provider,I=P==null?void 0:P.selection;if(!I||S(F,n)||o&&(o.version!==I.version||!S({from:I.from},o.provider))||q.has(F))return;let L=P==null?void 0:P.resolved;if(L===void 0)return;let z=s(c.share,d),B=_(c.share,d);if(z!==void 0&&B!==f||I.registered&&(j==null?void 0:j[I.version])!==F)return;o||J.set(t,{version:I.version,provider:{from:I.from}}),q.add(F);let V=R(L);v(c.share,d,V,I.from)}catch(e){console.error(`[Module Federation] Failed to bridge external shared module "`+t+`"`,e)}};for(let[e,t]of Object.entries(F))t.treeShaking||await ce(e,t,P[e]);for(let[e,t]of Object.entries(F)){var X;if(t.treeShaking)continue;let n=a(e,(X=t.shareConfig)==null?void 0:X.singleton,t.version,t.scope);if(s(c.share,n)!==void 0)continue;let r=a(e,!0,t.version,t.scope),i=s(c.share,r);i!==void 0&&v(c.share,n,i,_(c.share,r))}let Z=[`react`,`react/jsx-runtime`,`react-dom`,`react-dom/client`,`@mui/material`,`@mui/icons-material`,`@iobroker/gui-components`,`@iobroker/json-config`].filter(e=>F[e]!==void 0),Q=e=>e.startsWith(`@`)?e.split(`/`).slice(0,2).join(`/`):e.split(`/`)[0];for(let e of Object.keys(F)){if(Z.includes(e))continue;let t=Q(e),n=Z.indexOf(t);if(n===-1){Z.push(e);continue}let r=n;for(;r>0&&Q(Z[r-1])===t&&Z[r-1]!==t;)r--;Z.splice(r,0,e)}var le=async e=>{for(let r of e){var t,n;let e=F[r],i=a(r,(t=e.shareConfig)==null?void 0:t.singleton,e.version,e.scope);if(((n=e.shareConfig)==null?void 0:n.import)===!1||e.treeShaking||s(c.share,i)!==void 0)continue;let o=a(r,!0,e.version,e.scope),l=s(c.share,o);if(l!==void 0){v(c.share,i,l,_(c.share,o));continue}let u=await e.get(),d=typeof u==`function`?u():u,p=await Promise.resolve(d),m=(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t})(p),h=m===p?{...p}:m;h.__esModule!==!0&&Object.defineProperty(h,"__esModule",{value:!0,enumerable:!1}),v(c.share,i,h,f)}};let ue=e=>{var t,n;let r=F[e];if(!r.treeShaking&&((t=r.shareConfig)==null?void 0:t.import)!==!1)return!1;let i=a(e,(n=r.shareConfig)==null?void 0:n.singleton,r.version,r.scope);return r.treeShaking?A(c.share,i,f)===void 0&&s(c.share,i)===void 0:s(c.share,i)===void 0},$=Z.findIndex(e=>{var t,n,r;let i=F[e],o=a(e,(t=i.shareConfig)==null?void 0:t.singleton,i.version,i.scope);return(i.treeShaking?A(c.share,o,f)??s(c.share,o):s(c.share,o))===void 0?i.treeShaking||((n=i.shareConfig)==null?void 0:n.import)===!1?!0:!((r=i.shareConfig)!=null&&r.singleton)||typeof x!=`function`?!1:!!x(P[e],e,i,`version-first`):!1}),de=$===-1?Z:Z.slice(0,$);var fe=$===-1?[]:Z.slice($);await le(de);try{await h(async()=>{await Promise.all(await W.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:t}))})}catch(e){console.error(`[Module Federation]`,e)}for(let[t,n]of Object.entries(F))n.treeShaking||await Y(t,n,e[t],P[t],void 0);try{var pe;let e=(pe=globalThis.__FEDERATION__)==null?void 0:pe.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of u){let r=n==null?void 0:n[e];if(r)for(let[e,n]of Object.entries(r)){let r=F==null?void 0:F[e],i=P[e],a=J.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!S(t,a.provider))continue;let n=i[e];(t===n||n!=null&&n.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let[e,n]of Object.entries(t))await Y(e,F[e],n,P[e],J.get(e))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let me=async()=>{},he=async(t,n)=>{var r,i;let o=a(t,(r=n.shareConfig)==null?void 0:r.singleton,n.version,n.scope),l=n.treeShaking?A(c.share,o,f):s(c.share,o);if(((i=n.shareConfig)==null?void 0:i.import)!==!1||l!==void 0)return;let u=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},d=e==null?void 0:e[t],p=b(d,t,n,`version-first`)||n,m=y(d,p);if(!m)return;let{version:h}=m,g=d==null?void 0:d[h],_=await K(t,n.shareConfig,d,h,g,p,m.registered&&!S(p,n)),x=_==null?void 0:_.selection,C=_==null?void 0:_.provider,w=_==null?void 0:_.resolved;if(!x||S(C,n)||w===void 0||(n.treeShaking?A(c.share,o,f):s(c.share,o))!==void 0||x.registered&&(d==null?void 0:d[x.version])!==C)return;let T=u(w);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];D(c.share,o,e,T),j(c.share,o,f,T)}else v(c.share,o,T,x.from)};for(let e of fe){let t=F[e];if(ue(e)){var ge;t.treeShaking?await me(e,t):((ge=t.shareConfig)==null?void 0:ge.import)===!1&&await he(e,t)}if(ue(e))break;await le([e])}return o(W),W}async function O(e){let t=await E();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return c.pendingShareLoads&&await Promise.all(c.pendingShareLoads),t[e]().then(e=>()=>e)}export{D as n,O as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Components-DrPN-Mtb.js","./ConfigPanel-uVXFjx9g.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={"./Components":async()=>{let t=await e(()=>import(`./Components-DrPN-Mtb.js`),__vite__mapDeps([0,1]),import.meta.url),n={};return Object.assign(n,t),Object.defineProperty(n,"__esModule",{value:!0,enumerable:!1}),n}};export{t as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Components-
|
|
2
|
-
import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={},n=new Set,r=Promise.resolve();async function i(e){let t=r.then(e,e);return r=t.then(()=>void 0,()=>void 0),t}async function a(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var o={"./Components":async()=>{await a(`./Components`),await Promise.all([]);let t=await i(()=>e(()=>import(`./Components-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Components-DrPN-Mtb.js","./ConfigPanel-uVXFjx9g.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={},n=new Set,r=Promise.resolve();async function i(e){let t=r.then(e,e);return r=t.then(()=>void 0,()=>void 0),t}async function a(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var o={"./Components":async()=>{await a(`./Components`),await Promise.all([]);let t=await i(()=>e(()=>import(`./Components-DrPN-Mtb.js`),__vite__mapDeps([0,1]),import.meta.url)),n=t&&t.__mf_remote_dependency_pending;n&&typeof n.then==`function`&&await n;let r={};return Object.assign(r,t),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r}};export{o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e,t}from"./assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-
|
|
1
|
+
import{n as e,t}from"./assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-x_0QZXBR.js";export{t as get,e as init};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"AiUsageComponentSet","name":"AiUsageComponentSet","metaData":{"name":"AiUsageComponentSet","type":"app","buildInfo":{"buildVersion":"1.0.0","buildName":"AiUsageComponentSet"},"remoteEntry":{"name":"customComponents.js","path":"","type":"module"},"ssrRemoteEntry":{"name":"customComponents.ssr.js","path":"","type":"module"},"types":{"path":"","name":"","zip":"@mf-types.zip","api":"@mf-types.d.ts"},"globalName":"AiUsageComponentSet","pluginVersion":"0.2.5","publicPath":"auto"},"shared":[{"id":"AiUsageComponentSet:@iobroker/gui-components","name":"@iobroker/gui-components","version":"10.1.0","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__prebuild___mf_0_iobroker_mf_1_gui_mf_2_components__prebuild__-DeLUTSLT.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@iobroker/json-config","name":"@iobroker/json-config","version":"9.0.22","singleton":true,"requiredVersion":"*","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/icons-material","name":"@mui/icons-material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/material","name":"@mui/material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react","name":"react","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom","name":"react-dom","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react/jsx-runtime","name":"react/jsx-runtime","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom/client","name":"react-dom/client","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js"]},"css":{"async":[],"sync":[]}}}],"remotes":[],"exposes":[{"id":"AiUsageComponentSet:Components","name":"Components","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/Components-
|
|
1
|
+
{"id":"AiUsageComponentSet","name":"AiUsageComponentSet","metaData":{"name":"AiUsageComponentSet","type":"app","buildInfo":{"buildVersion":"1.0.0","buildName":"AiUsageComponentSet"},"remoteEntry":{"name":"customComponents.js","path":"","type":"module"},"ssrRemoteEntry":{"name":"customComponents.ssr.js","path":"","type":"module"},"types":{"path":"","name":"","zip":"@mf-types.zip","api":"@mf-types.d.ts"},"globalName":"AiUsageComponentSet","pluginVersion":"0.2.5","publicPath":"auto"},"shared":[{"id":"AiUsageComponentSet:@iobroker/gui-components","name":"@iobroker/gui-components","version":"10.1.0","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__prebuild___mf_0_iobroker_mf_1_gui_mf_2_components__prebuild__-DeLUTSLT.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@iobroker/json-config","name":"@iobroker/json-config","version":"9.0.22","singleton":true,"requiredVersion":"*","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/icons-material","name":"@mui/icons-material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/material","name":"@mui/material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react","name":"react","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom","name":"react-dom","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react/jsx-runtime","name":"react/jsx-runtime","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom/client","name":"react-dom/client","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js"]},"css":{"async":[],"sync":[]}}}],"remotes":[],"exposes":[{"id":"AiUsageComponentSet:Components","name":"Components","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/Components-DrPN-Mtb.js"]},"css":{"async":[],"sync":[]}},"path":"./Components"}]}
|
package/admin/i18n/de.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Verbrauch je Modell",
|
|
52
52
|
"nameModel": "Modell %s",
|
|
53
53
|
"nameModelTokens": "%s Token heute",
|
|
54
|
-
"nameModelCosts": "%s Kosten heute",
|
|
55
54
|
"nameAvailable": "Guthaben reicht für Anfragen",
|
|
56
55
|
"nameWindowSession": "Sitzung (5 Std.)",
|
|
57
56
|
"nameWindowWeek": "Woche (alle Modelle)",
|
package/admin/i18n/en.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Per-model usage",
|
|
52
52
|
"nameModel": "Model %s",
|
|
53
53
|
"nameModelTokens": "%s tokens today",
|
|
54
|
-
"nameModelCosts": "%s costs today",
|
|
55
54
|
"nameAvailable": "Balance sufficient for calls",
|
|
56
55
|
"nameWindowSession": "Session (5 h)",
|
|
57
56
|
"nameWindowWeek": "Week (all models)",
|
package/admin/i18n/es.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Uso por modelo",
|
|
52
52
|
"nameModel": "Modelo %s",
|
|
53
53
|
"nameModelTokens": "%s tokens de hoy",
|
|
54
|
-
"nameModelCosts": "%s costes de hoy",
|
|
55
54
|
"nameAvailable": "Saldo suficiente para las llamadas",
|
|
56
55
|
"nameWindowSession": "Sesión (5 h)",
|
|
57
56
|
"nameWindowWeek": "Semana (todos los modelos)",
|
package/admin/i18n/fr.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Utilisation par modèle",
|
|
52
52
|
"nameModel": "Modèle %s",
|
|
53
53
|
"nameModelTokens": "%s jetons aujourd'hui",
|
|
54
|
-
"nameModelCosts": "%s coûts aujourd'hui",
|
|
55
54
|
"nameAvailable": "Solde suffisant pour les appels",
|
|
56
55
|
"nameWindowSession": "Session (5 h)",
|
|
57
56
|
"nameWindowWeek": "Semaine (tous les modèles)",
|
package/admin/i18n/it.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Utilizzo per modello",
|
|
52
52
|
"nameModel": "Modello %s",
|
|
53
53
|
"nameModelTokens": "%s token di oggi",
|
|
54
|
-
"nameModelCosts": "%s costi di oggi",
|
|
55
54
|
"nameAvailable": "Saldo sufficiente per le chiamate",
|
|
56
55
|
"nameWindowSession": "Sessione (5 h)",
|
|
57
56
|
"nameWindowWeek": "Settimana (tutti i modelli)",
|
package/admin/i18n/nl.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Verbruik per model",
|
|
52
52
|
"nameModel": "Model %s",
|
|
53
53
|
"nameModelTokens": "%s tokens vandaag",
|
|
54
|
-
"nameModelCosts": "%s kosten vandaag",
|
|
55
54
|
"nameAvailable": "Tegoed voldoende voor aanvragen",
|
|
56
55
|
"nameWindowSession": "Sessie (5 u)",
|
|
57
56
|
"nameWindowWeek": "Week (alle modellen)",
|
package/admin/i18n/pl.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Zużycie na model",
|
|
52
52
|
"nameModel": "Model %s",
|
|
53
53
|
"nameModelTokens": "%s tokenów dzisiaj",
|
|
54
|
-
"nameModelCosts": "%s koszty dzisiaj",
|
|
55
54
|
"nameAvailable": "Środki wystarczają na zapytania",
|
|
56
55
|
"nameWindowSession": "Sesja (5 godz.)",
|
|
57
56
|
"nameWindowWeek": "Tydzień (wszystkie modele)",
|
package/admin/i18n/pt.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Utilização por modelo",
|
|
52
52
|
"nameModel": "Modelo %s",
|
|
53
53
|
"nameModelTokens": "%s tokens hoje",
|
|
54
|
-
"nameModelCosts": "%s custos hoje",
|
|
55
54
|
"nameAvailable": "Saldo suficiente para chamadas",
|
|
56
55
|
"nameWindowSession": "Sessão (5 h)",
|
|
57
56
|
"nameWindowWeek": "Semana (todos os modelos)",
|
package/admin/i18n/ru.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Использование по моделям",
|
|
52
52
|
"nameModel": "Модель %s",
|
|
53
53
|
"nameModelTokens": "%s токенов сегодня",
|
|
54
|
-
"nameModelCosts": "%s расходы сегодня",
|
|
55
54
|
"nameAvailable": "Баланса хватает для запросов",
|
|
56
55
|
"nameWindowSession": "Сессия (5 ч)",
|
|
57
56
|
"nameWindowWeek": "Неделя (все модели)",
|
package/admin/i18n/uk.json
CHANGED
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"nameModels": "Використання за моделями",
|
|
52
52
|
"nameModel": "Модель %s",
|
|
53
53
|
"nameModelTokens": "%s токенів сьогодні",
|
|
54
|
-
"nameModelCosts": "%s витрати сьогодні",
|
|
55
54
|
"nameAvailable": "Балансу достатньо для запитів",
|
|
56
55
|
"nameWindowSession": "Сесія (5 год)",
|
|
57
56
|
"nameWindowWeek": "Тиждень (усі моделі)",
|
package/admin/i18n/zh-cn.json
CHANGED
package/build/lib/http.js
CHANGED
|
@@ -32,14 +32,15 @@ async function request(url, init, authOn400 = false) {
|
|
|
32
32
|
} catch (e) {
|
|
33
33
|
throw new import_provider.FetchError("network", e instanceof Error ? e.message : String(e));
|
|
34
34
|
}
|
|
35
|
-
if (response.status === 401 || response.status === 403 || authOn400 && response.status === 400) {
|
|
36
|
-
throw new import_provider.FetchError("auth", `HTTP ${response.status}`);
|
|
37
|
-
}
|
|
38
|
-
if (response.status === 429) {
|
|
39
|
-
throw new import_provider.FetchError("rate-limit", "HTTP 429");
|
|
40
|
-
}
|
|
41
35
|
if (!response.ok) {
|
|
42
|
-
|
|
36
|
+
const detail = await errorDetail(response);
|
|
37
|
+
if (response.status === 401 || response.status === 403 || authOn400 && response.status === 400) {
|
|
38
|
+
throw new import_provider.FetchError("auth", `HTTP ${response.status}${detail}`);
|
|
39
|
+
}
|
|
40
|
+
if (response.status === 429) {
|
|
41
|
+
throw new import_provider.FetchError("rate-limit", `HTTP 429${detail}`);
|
|
42
|
+
}
|
|
43
|
+
throw new import_provider.FetchError("service", `HTTP ${response.status}${detail}`);
|
|
43
44
|
}
|
|
44
45
|
try {
|
|
45
46
|
return await response.json();
|
|
@@ -47,6 +48,29 @@ async function request(url, init, authOn400 = false) {
|
|
|
47
48
|
throw new import_provider.FetchError("service", `invalid JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
51
|
+
const MAX_DETAIL_CHARS = 200;
|
|
52
|
+
async function errorDetail(response) {
|
|
53
|
+
var _a, _b;
|
|
54
|
+
let text;
|
|
55
|
+
try {
|
|
56
|
+
text = await response.text();
|
|
57
|
+
} catch {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
let message;
|
|
61
|
+
try {
|
|
62
|
+
const body = JSON.parse(text);
|
|
63
|
+
const error = body.error;
|
|
64
|
+
message = typeof error === "string" ? error : (_b = (_a = error == null ? void 0 : error.message) != null ? _a : body.message) != null ? _b : void 0;
|
|
65
|
+
} catch {
|
|
66
|
+
message = text.trim().length > 0 && text.trim().length <= MAX_DETAIL_CHARS ? text.trim() : void 0;
|
|
67
|
+
}
|
|
68
|
+
if (typeof message !== "string" || message.trim().length === 0) {
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
const trimmed = message.trim();
|
|
72
|
+
return ` \u2014 ${trimmed.length > MAX_DETAIL_CHARS ? `${trimmed.slice(0, MAX_DETAIL_CHARS)}\u2026` : trimmed}`;
|
|
73
|
+
}
|
|
50
74
|
async function getJson(url, headers) {
|
|
51
75
|
return request(url, { headers });
|
|
52
76
|
}
|
package/build/lib/http.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/http.ts"],
|
|
4
|
-
"sourcesContent": ["import { FetchError } from \"./provider\";\n\n/** Per-request timeout (ms). */\nconst REQUEST_TIMEOUT_MS = 15000;\n\n/** The JSON-GET seam the provider modules use \u2014 injectable for tests. */\nexport type JsonFetch = (url: string, headers: Record<string, string>) => Promise<unknown>;\n\n/**\n * Per-call options of the two POST seams.\n *\n * `authOn400` used to be baked into `postJson`/`postForm`, which made EVERY post\n * read a 400 as a rejected sign-in. That is right for the OAuth token endpoints\n * and wrong everywhere else: the ChatGPT device-code poll takes an auth failure\n * as \"the user has not confirmed yet\" and would have waited out the whole\n * fifteen minutes on a 400, and Google's Code-Assist call skipped its second\n * host because it thought the sign-in was gone. The flag belongs at the call.\n */\nexport interface PostOptions {\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** True only for OAuth token endpoints, which answer a dead code or refresh token with 400. */\n authOn400?: boolean;\n}\n\n/** The JSON-POST seam \u2014 one definition for every provider module. */\nexport type JsonPost = (url: string, body: Record<string, unknown>, options?: PostOptions) => Promise<unknown>;\n\n/** The form-POST seam (OAuth code redemption). */\nexport type FormPost = (url: string, form: Record<string, string>, options?: PostOptions) => Promise<unknown>;\n\n/**\n * Run one request and turn its outcome into the shared failure classification:\n * 401/403 (and 400 where the provider answers a rejected grant that way) become an\n * auth error, 429 a rate-limit error, any other bad status or unparsable body a\n * SERVICE error (the service answered and is broken), and only a throw \u2014 refused\n * connection, DNS failure, timeout \u2014 a network error. The poll engine turns that\n * split into \"the AI service is down\" versus \"this host has no connection\".\n *\n * @param url the request URL\n * @param init the request options (method, headers, body)\n * @param authOn400 true when a 400 means a rejected grant rather than a service fault\n * @returns the parsed JSON body\n */\nasync function request(url: string, init: RequestInit, authOn400 = false): Promise<unknown> {\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });\n } catch (e) {\n throw new FetchError(\"network\", e instanceof Error ? e.message : String(e));\n }\n if (response.status === 401 || response.status === 403 || (authOn400 && response.status === 400)) {\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAG3B,MAAM,qBAAqB;AAyC3B,eAAe,QAAQ,KAAa,MAAmB,YAAY,OAAyB;AAC1F,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,YAAY,QAAQ,kBAAkB,EAAE,CAAC;AAAA,EAC1F,SAAS,GAAG;AACV,UAAM,IAAI,2BAAW,WAAW,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EAC5E;AACA,MAAI,SAAS,WAAW,OAAO,SAAS,WAAW,OAAQ,aAAa,SAAS,WAAW,KAAM;AAChG,
|
|
4
|
+
"sourcesContent": ["import { FetchError } from \"./provider\";\n\n/** Per-request timeout (ms). */\nconst REQUEST_TIMEOUT_MS = 15000;\n\n/** The JSON-GET seam the provider modules use \u2014 injectable for tests. */\nexport type JsonFetch = (url: string, headers: Record<string, string>) => Promise<unknown>;\n\n/**\n * Per-call options of the two POST seams.\n *\n * `authOn400` used to be baked into `postJson`/`postForm`, which made EVERY post\n * read a 400 as a rejected sign-in. That is right for the OAuth token endpoints\n * and wrong everywhere else: the ChatGPT device-code poll takes an auth failure\n * as \"the user has not confirmed yet\" and would have waited out the whole\n * fifteen minutes on a 400, and Google's Code-Assist call skipped its second\n * host because it thought the sign-in was gone. The flag belongs at the call.\n */\nexport interface PostOptions {\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** True only for OAuth token endpoints, which answer a dead code or refresh token with 400. */\n authOn400?: boolean;\n}\n\n/** The JSON-POST seam \u2014 one definition for every provider module. */\nexport type JsonPost = (url: string, body: Record<string, unknown>, options?: PostOptions) => Promise<unknown>;\n\n/** The form-POST seam (OAuth code redemption). */\nexport type FormPost = (url: string, form: Record<string, string>, options?: PostOptions) => Promise<unknown>;\n\n/**\n * Run one request and turn its outcome into the shared failure classification:\n * 401/403 (and 400 where the provider answers a rejected grant that way) become an\n * auth error, 429 a rate-limit error, any other bad status or unparsable body a\n * SERVICE error (the service answered and is broken), and only a throw \u2014 refused\n * connection, DNS failure, timeout \u2014 a network error. The poll engine turns that\n * split into \"the AI service is down\" versus \"this host has no connection\".\n *\n * @param url the request URL\n * @param init the request options (method, headers, body)\n * @param authOn400 true when a 400 means a rejected grant rather than a service fault\n * @returns the parsed JSON body\n */\nasync function request(url: string, init: RequestInit, authOn400 = false): Promise<unknown> {\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });\n } catch (e) {\n throw new FetchError(\"network\", e instanceof Error ? e.message : String(e));\n }\n if (!response.ok) {\n // The status alone reaches the user as `info.error`, and \"HTTP 401\" tells them\n // nothing they can act on. OpenRouter, OpenAI and Anthropic all answer with\n // `{ error: { message } }` \u2014 reading it turns the datapoint into \"invalid API\n // key\". Best effort in the strictest sense: the status decides the class, the\n // body only decorates the text, and a body that cannot be read changes nothing.\n const detail = await errorDetail(response);\n if (response.status === 401 || response.status === 403 || (authOn400 && response.status === 400)) {\n throw new FetchError(\"auth\", `HTTP ${response.status}${detail}`);\n }\n if (response.status === 429) {\n throw new FetchError(\"rate-limit\", `HTTP 429${detail}`);\n }\n // 5xx = the service answered and is broken; anything else unexpected is treated\n // the same way, because the service DID answer \u2014 only a throw above means we\n // never reached it.\n throw new FetchError(\"service\", `HTTP ${response.status}${detail}`);\n }\n try {\n return await response.json();\n } catch (e) {\n throw new FetchError(\"service\", `invalid JSON: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Longest provider message taken over into the error text. */\nconst MAX_DETAIL_CHARS = 200;\n\n/**\n * The provider's own words for a failed request, ready to append.\n *\n * Never throws and never rejects: a body that is missing, unreadable, not JSON or\n * shaped differently simply yields \"\" and the caller keeps the bare status. The\n * body of a failed response is consumed here either way, so nothing is left\n * dangling (measured 2026-09-12: the \"socket leak\" this used to be blamed on does\n * not exist).\n *\n * @param response the failed response\n * @returns \" \u2014 <message>\" or an empty string\n */\nasync function errorDetail(response: Response): Promise<string> {\n let text: string;\n try {\n text = await response.text();\n } catch {\n return \"\";\n }\n let message: unknown;\n try {\n const body = JSON.parse(text) as { error?: unknown; message?: unknown };\n const error = body.error;\n message =\n typeof error === \"string\" ? error : ((error as { message?: unknown })?.message ?? body.message ?? undefined);\n } catch {\n // Not JSON: a short plain-text body is still better than nothing, a long one\n // (an HTML error page from a proxy) is noise.\n message = text.trim().length > 0 && text.trim().length <= MAX_DETAIL_CHARS ? text.trim() : undefined;\n }\n if (typeof message !== \"string\" || message.trim().length === 0) {\n return \"\";\n }\n const trimmed = message.trim();\n return ` \u2014 ${trimmed.length > MAX_DETAIL_CHARS ? `${trimmed.slice(0, MAX_DETAIL_CHARS)}\u2026` : trimmed}`;\n}\n\n/**\n * GET a JSON document.\n *\n * @param url the request URL\n * @param headers request headers (Authorization etc.)\n * @returns the parsed JSON body\n */\nexport async function getJson(url: string, headers: Record<string, string>): Promise<unknown> {\n return request(url, { headers });\n}\n\n/**\n * POST a JSON document.\n *\n * @param url the request URL\n * @param body the JSON body\n * @param options extra headers, and whether a 400 means a rejected grant\n * @returns the parsed JSON response\n */\nexport async function postJson(\n url: string,\n body: Record<string, unknown>,\n options: PostOptions = {},\n): Promise<unknown> {\n return request(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...options.headers },\n body: JSON.stringify(body),\n },\n options.authOn400 === true,\n );\n}\n\n/**\n * POST a form-encoded body and return the parsed JSON answer.\n *\n * OAuth code redemption uses form encoding while token refresh often uses JSON \u2014\n * ChatGPT/Codex needs BOTH, so the two shapes are separate helpers rather than one\n * guessing wrapper.\n *\n * @param url the request URL\n * @param form the form fields\n * @param options extra headers, and whether a 400 means a rejected grant\n * @returns the parsed JSON body\n */\nexport async function postForm(url: string, form: Record<string, string>, options: PostOptions = {}): Promise<unknown> {\n return request(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\", ...options.headers },\n body: new URLSearchParams(form).toString(),\n },\n options.authOn400 === true,\n );\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAG3B,MAAM,qBAAqB;AAyC3B,eAAe,QAAQ,KAAa,MAAmB,YAAY,OAAyB;AAC1F,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,YAAY,QAAQ,kBAAkB,EAAE,CAAC;AAAA,EAC1F,SAAS,GAAG;AACV,UAAM,IAAI,2BAAW,WAAW,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EAC5E;AACA,MAAI,CAAC,SAAS,IAAI;AAMhB,UAAM,SAAS,MAAM,YAAY,QAAQ;AACzC,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,OAAQ,aAAa,SAAS,WAAW,KAAM;AAChG,YAAM,IAAI,2BAAW,QAAQ,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE;AAAA,IACjE;AACA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,2BAAW,cAAc,WAAW,MAAM,EAAE;AAAA,IACxD;AAIA,UAAM,IAAI,2BAAW,WAAW,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE;AAAA,EACpE;AACA,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,GAAG;AACV,UAAM,IAAI,2BAAW,WAAW,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,EAC/F;AACF;AAGA,MAAM,mBAAmB;AAczB,eAAe,YAAY,UAAqC;AA3FhE;AA4FE,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,UAAM,QAAQ,KAAK;AACnB,cACE,OAAO,UAAU,WAAW,SAAU,0CAAiC,YAAjC,YAA4C,KAAK,YAAjD,YAA4D;AAAA,EACtG,QAAQ;AAGN,cAAU,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,KAAK,EAAE,UAAU,mBAAmB,KAAK,KAAK,IAAI;AAAA,EAC7F;AACA,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC9D,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,KAAK;AAC7B,SAAO,WAAM,QAAQ,SAAS,mBAAmB,GAAG,QAAQ,MAAM,GAAG,gBAAgB,CAAC,WAAM,OAAO;AACrG;AASA,eAAsB,QAAQ,KAAa,SAAmD;AAC5F,SAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC;AACjC;AAUA,eAAsB,SACpB,KACA,MACA,UAAuB,CAAC,GACN;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAQ,QAAQ;AAAA,MAClE,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,IACA,QAAQ,cAAc;AAAA,EACxB;AACF;AAcA,eAAsB,SAAS,KAAa,MAA8B,UAAuB,CAAC,GAAqB;AACrH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,qCAAqC,GAAG,QAAQ,QAAQ;AAAA,MACnF,MAAM,IAAI,gBAAgB,IAAI,EAAE,SAAS;AAAA,IAC3C;AAAA,IACA,QAAQ,cAAc;AAAA,EACxB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|