iobroker.ai-usage 0.10.0 → 0.11.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 +47 -24
- package/admin/custom/assets/Components-B5wYN3xM.js +1 -0
- package/admin/custom/assets/ConfigPanel-BHcTwbRF.js +1 -0
- package/admin/custom/assets/index-ZAye02dj.js +1 -0
- package/admin/custom/assets/{mf-entry-bootstrap-0-d8335d6f.js → mf-entry-bootstrap-0-9a637550.js} +1 -1
- package/admin/custom/assets/virtualExposes-BGw1tATD.js +1 -0
- package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-haafVBNm.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BImypPv4.js} +1 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-CMt18wYA.js +2 -0
- package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-DAX-5uLT.js → virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Bc45Ij-7.js} +2 -2
- package/admin/custom/customComponents.js +1 -1
- package/admin/custom/i18n/de.json +33 -33
- package/admin/custom/i18n/en.json +33 -33
- package/admin/custom/i18n/es.json +33 -33
- package/admin/custom/i18n/fr.json +33 -33
- package/admin/custom/i18n/it.json +33 -33
- package/admin/custom/i18n/nl.json +33 -33
- package/admin/custom/i18n/pl.json +33 -33
- package/admin/custom/i18n/pt.json +33 -33
- package/admin/custom/i18n/ru.json +33 -33
- package/admin/custom/i18n/uk.json +33 -33
- package/admin/custom/i18n/zh-cn.json +33 -33
- package/admin/custom/mf-manifest.json +1 -1
- package/admin/i18n/de.json +58 -9
- package/admin/i18n/en.json +58 -9
- package/admin/i18n/es.json +58 -9
- package/admin/i18n/fr.json +58 -9
- package/admin/i18n/it.json +58 -9
- package/admin/i18n/nl.json +58 -9
- package/admin/i18n/pl.json +58 -9
- package/admin/i18n/pt.json +58 -9
- package/admin/i18n/ru.json +58 -9
- package/admin/i18n/uk.json +58 -9
- package/admin/i18n/zh-cn.json +58 -9
- package/build/lib/i18n.js +81 -0
- package/build/lib/i18n.js.map +7 -0
- package/build/lib/poll-engine.js +33 -17
- package/build/lib/poll-engine.js.map +2 -2
- package/build/lib/provider.js.map +2 -2
- package/build/lib/providers/anthropic-api.js +13 -4
- package/build/lib/providers/anthropic-api.js.map +2 -2
- package/build/lib/providers/chatgpt-auth.js +6 -0
- package/build/lib/providers/chatgpt-auth.js.map +2 -2
- package/build/lib/providers/chatgpt-sub.js +17 -9
- package/build/lib/providers/chatgpt-sub.js.map +2 -2
- package/build/lib/providers/claude-sub.js +21 -8
- package/build/lib/providers/claude-sub.js.map +2 -2
- package/build/lib/providers/gemini-sub.js +4 -0
- package/build/lib/providers/gemini-sub.js.map +2 -2
- package/build/lib/providers/openai.js +12 -3
- package/build/lib/providers/openai.js.map +2 -2
- package/build/lib/providers/report-utils.js +5 -3
- package/build/lib/providers/report-utils.js.map +2 -2
- package/build/lib/pure-helpers.js.map +2 -2
- package/build/lib/snapshot-tree.js +45 -31
- package/build/lib/snapshot-tree.js.map +2 -2
- package/build/lib/totals.js.map +2 -2
- package/build/main.js +124 -10
- package/build/main.js.map +2 -2
- package/io-package.json +60 -21
- package/package.json +14 -8
- package/admin/custom/assets/Components-SGigWPbz.js +0 -1
- package/admin/custom/assets/ConfigPanel-7wtMdF7R.js +0 -1
- package/admin/custom/assets/index-BOIC_Bq7.js +0 -1
- package/admin/custom/assets/virtualExposes--n4JvPAZ.js +0 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-CGHI3HBU.js +0 -2
package/README.md
CHANGED
|
@@ -20,6 +20,7 @@ subscriptions plus OpenRouter, DeepSeek, OpenAI and Anthropic API accounts. Need
|
|
|
20
20
|
- **Central credentials** — API keys come from the admin's credential storage, shared with the admin AI assistant
|
|
21
21
|
- **Online status** — the connection icon you know from every device, plus the reason in plain text
|
|
22
22
|
- **Read-only** — the adapter only reads; it never calls or configures an AI service
|
|
23
|
+
- **Object names in eleven languages** — the tree reads in your ioBroker language, not just English
|
|
23
24
|
- **Throttle-safe** — a minimum interval and automatic backoff keep the provider from locking your account
|
|
24
25
|
|
|
25
26
|
---
|
|
@@ -36,7 +37,7 @@ For details and how to disable it, see the [Sentry plugin documentation](https:/
|
|
|
36
37
|
|
|
37
38
|
- Node.js >= 22
|
|
38
39
|
- ioBroker js-controller >= 7.2.2
|
|
39
|
-
- **ioBroker Admin >= 8.0.
|
|
40
|
+
- **ioBroker Admin >= 8.0.11** — the adapter uses the admin's central credential storage
|
|
40
41
|
|
|
41
42
|
---
|
|
42
43
|
|
|
@@ -44,23 +45,23 @@ For details and how to disable it, see the [Sentry plugin documentation](https:/
|
|
|
44
45
|
|
|
45
46
|
The instance settings show one list of AI accounts. Switch on what you want to monitor.
|
|
46
47
|
|
|
47
|
-
| Account
|
|
48
|
-
|
|
49
|
-
| **[Claude](https://claude.ai) subscription**
|
|
50
|
-
| **[ChatGPT](https://chatgpt.com) subscription**
|
|
51
|
-
| **[Google Gemini](https://gemini.google.com) subscription**
|
|
52
|
-
| **[OpenRouter](https://openrouter.ai), [DeepSeek](https://www.deepseek.com)** | Pick the stored key from the admin's credential storage
|
|
53
|
-
| **[OpenAI](https://openai.com), [Anthropic](https://www.anthropic.com)**
|
|
48
|
+
| Account | How it is connected |
|
|
49
|
+
| ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
50
|
+
| **[Claude](https://claude.ai) subscription** | Open the sign-in page, log in, copy the code shown there and paste it back |
|
|
51
|
+
| **[ChatGPT](https://chatgpt.com) subscription** | The adapter shows a short code; type it on the OpenAI page it links to. The settings page notices by itself. Your Codex CLI session is not touched |
|
|
52
|
+
| **[Google Gemini](https://gemini.google.com) subscription** | Open the sign-in page and log in. Google sends the result to `localhost`, so **your browser shows an error page — that is expected**. Copy the **whole address** from the address bar and paste it back |
|
|
53
|
+
| **[OpenRouter](https://openrouter.ai), [DeepSeek](https://www.deepseek.com)** | Pick the stored key from the admin's credential storage |
|
|
54
|
+
| **[OpenAI](https://openai.com), [Anthropic](https://www.anthropic.com)** | Needs an **admin key** of your organisation, not the key the admin assistant uses. A personal account without an organisation cannot deliver these reports at all — use the Claude subscription instead |
|
|
54
55
|
|
|
55
56
|
The three subscription endpoints are **not officially documented**; they are the ones those
|
|
56
57
|
providers' own tools use and can change without notice. Claude was tested against a live
|
|
57
58
|
subscription, ChatGPT and Google could not be — please open an issue if something looks wrong.
|
|
58
59
|
|
|
59
|
-
| Option
|
|
60
|
-
|
|
61
|
-
| **Warn at %**
|
|
62
|
-
| **Poll interval** | How often each account is queried, 60–3600 seconds. The floor keeps the provider from throttling you | 300
|
|
63
|
-
| **Notifications** | One notification on threshold crossing or broken credentials
|
|
60
|
+
| Option | Description | Default |
|
|
61
|
+
| ----------------- | ---------------------------------------------------------------------------------------------------- | ------- |
|
|
62
|
+
| **Warn at %** | Per account: one notification when a plan-wide limit window crosses this utilisation | 80 |
|
|
63
|
+
| **Poll interval** | How often each account is queried, 60–3600 seconds. The floor keeps the provider from throttling you | 300 |
|
|
64
|
+
| **Notifications** | One notification on threshold crossing or broken credentials | on |
|
|
64
65
|
|
|
65
66
|
---
|
|
66
67
|
|
|
@@ -71,14 +72,14 @@ ai-usage.0.
|
|
|
71
72
|
├── info.connection — at least one account is delivering data (bool)
|
|
72
73
|
├── total. — totals across all accounts
|
|
73
74
|
│ ├── costs.today/month/… — summed real money (same currency only)
|
|
74
|
-
│ ├── maxLimitPercent — highest
|
|
75
|
+
│ ├── maxLimitPercent — highest utilisation of any account (limit window or budget)
|
|
75
76
|
│ ├── warningsActive — accounts above their threshold
|
|
76
|
-
│ ├── limitReached —
|
|
77
|
+
│ ├── limitReached — an account is at 100 % (automation trigger)
|
|
77
78
|
│ ├── accountsReachable — accounts currently delivering data
|
|
78
79
|
│ └── accounts — configured accounts
|
|
79
80
|
├── claude / chatgpt / gemini — one node per subscription
|
|
80
81
|
│ ├── warning — this account is above its warn threshold (bool)
|
|
81
|
-
│ ├── limitReached —
|
|
82
|
+
│ ├── limitReached — this account is at 100 % (bool)
|
|
82
83
|
│ ├── info.unreach — account is not delivering (bool) — drives the connection icon
|
|
83
84
|
│ ├── info.error — why there is no data; empty while all is well, "Unknown" while the adapter itself has nothing to report
|
|
84
85
|
│ ├── info.lastUpdate — time of the last successful read
|
|
@@ -88,10 +89,13 @@ ai-usage.0.
|
|
|
88
89
|
├── warning / limitReached — same triggers as above
|
|
89
90
|
├── info.* — same three status states as above
|
|
90
91
|
├── credits.* / costs.* — granted budget and real money
|
|
91
|
-
|
|
92
|
+
├── tokens.* — token counters
|
|
93
|
+
└── models.<model>.* — tokens and costs per model, where the report carries them
|
|
92
94
|
```
|
|
93
95
|
|
|
94
|
-
Only what an account's source actually delivers is created
|
|
96
|
+
Only what an account's source actually delivers is created — and once created, a datapoint stays:
|
|
97
|
+
the reset time simply empties while no window is running, and a window or model disappears from the
|
|
98
|
+
tree only when the provider stops reporting it entirely.
|
|
95
99
|
|
|
96
100
|
**The connection icon** sits next to each account, green while it delivers. A throttle keeps it
|
|
97
101
|
green — the last values stay valid while the adapter waits. A rejected sign-in or a broken service
|
|
@@ -105,11 +109,16 @@ than none. Google reports no plan-wide window at all, so there the fullest model
|
|
|
105
109
|
the account and the warning names that model. To watch one model anyway, build the automation on
|
|
106
110
|
its own `limits.<window>.percent`.
|
|
107
111
|
|
|
112
|
+
**A nearly spent budget counts the same way.** Where a provider reports a granted budget, it
|
|
113
|
+
competes with the time windows and the higher of the two speaks for the account — money that is
|
|
114
|
+
gone blocks it just as hard as a full window. The warning says which of the two it is.
|
|
115
|
+
|
|
108
116
|
---
|
|
109
117
|
|
|
110
118
|
## Troubleshooting
|
|
111
119
|
|
|
112
120
|
### An account delivers no data
|
|
121
|
+
|
|
113
122
|
Read `info.error` — it names the cause. A rejected sign-in means signing in again in the settings,
|
|
114
123
|
or that the key is not an organisation admin key. A service fault or a missing connection is
|
|
115
124
|
outside your instance and clears up by itself. The log states the same reason once.
|
|
@@ -118,9 +127,15 @@ outside your instance and clears up by itself. The log states the same reason on
|
|
|
118
127
|
started and has not asked yet.
|
|
119
128
|
|
|
120
129
|
### A subscription says "not signed in" although you just signed in
|
|
130
|
+
|
|
121
131
|
Save the settings first, then sign in — the row needs a saved account to attach the sign-in to.
|
|
122
132
|
After a successful sign-in the account is queried immediately, so values appear within seconds.
|
|
123
133
|
|
|
134
|
+
### A subscription asks you to sign in again although it worked yesterday
|
|
135
|
+
|
|
136
|
+
The provider rejected the stored sign-in — a refresh token that was revoked or expired. The row says
|
|
137
|
+
so instead of pretending to be connected; signing in again is all it takes.
|
|
138
|
+
|
|
124
139
|
---
|
|
125
140
|
|
|
126
141
|
## Changelog
|
|
@@ -129,6 +144,19 @@ After a successful sign-in the account is queried immediately, so values appear
|
|
|
129
144
|
Placeholder for the next version (at the beginning of the line):
|
|
130
145
|
### **WORK IN PROGRESS**
|
|
131
146
|
-->
|
|
147
|
+
|
|
148
|
+
### 0.11.0 (2026-09-05)
|
|
149
|
+
|
|
150
|
+
- Fixed: Signing in from the instance settings works again — a leftover setting from an earlier version had silently closed the adapter's message channel, so none of the three flows reached it
|
|
151
|
+
- Fixed: A subscription whose stored sign-in was rejected no longer claims to be signed in — the row now offers the sign-in again instead of showing a green check next to an error
|
|
152
|
+
- Fixed: The status badge of an account no longer blanks out for a moment when a single status read is missed — a hiccup in the settings page is not an account without a status
|
|
153
|
+
- Fixed: A stored credential whose name sorts high in the alphabet is no longer missing from the account list in the instance settings
|
|
154
|
+
- Fixed: The settings page falls back to English for a browser language the adapter does not ship, instead of passing that language on unchecked
|
|
155
|
+
- Improved: All object names are now available in eleven languages instead of English only, and a renamed object reaches installations that already exist
|
|
156
|
+
- Improved: ChatGPT usage is read with the identity that endpoint expects, the way the Claude query already did — fewer rejected requests on that account
|
|
157
|
+
- 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
|
|
158
|
+
- Changed: "Highest account utilisation" says what it always measured — the fullest limit window **or** the account's remaining budget
|
|
159
|
+
|
|
132
160
|
### 0.10.0 (2026-09-01)
|
|
133
161
|
|
|
134
162
|
- Fixed: The reset-time datapoint of a limit window no longer disappears and reappears — it stays and simply empties while no window is running
|
|
@@ -150,11 +178,6 @@ After a successful sign-in the account is queried immediately, so values appear
|
|
|
150
178
|
|
|
151
179
|
- Changed: While an account has nothing to report — the adapter switched off, or started and not asked yet — the reason now reads "Unknown" instead of a sentence about the adapter
|
|
152
180
|
|
|
153
|
-
### 0.9.0 (2026-08-27)
|
|
154
|
-
|
|
155
|
-
- Fixed: Switching the instance off now shows every account as offline in the object tree and the settings, instead of leaving them green for as long as the adapter is not running
|
|
156
|
-
- Fixed: After a crash or a hard kill an account no longer keeps claiming to deliver data; every account starts as "not delivering" until its first answer arrives
|
|
157
|
-
|
|
158
181
|
[Older changelogs can be found there](CHANGELOG_OLD.md)
|
|
159
182
|
|
|
160
183
|
## Support
|
|
@@ -197,4 +220,4 @@ SOFTWARE.
|
|
|
197
220
|
|
|
198
221
|
---
|
|
199
222
|
|
|
200
|
-
|
|
223
|
+
_Developed with assistance from Claude.ai_
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ConfigPanel-BHcTwbRF.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=class extends e{constructor(e){super(e),g(this,`timer`,null),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.refresh()]),this.timer=setInterval(()=>void this.refresh(),4e3)}componentWillUnmount(){var e;this.timer&&=(clearInterval(this.timer),null),(e=super.componentWillUnmount)==null||e.call(this)}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})}}async refresh(){await this.refreshSignIn(),await this.refreshServiceState()}async refreshServiceState(){let e=this.props.oContext,t={},n=new Set;await Promise.all(this.accounts().map(async r=>{let i=E(r.provider,r.credentialId);if(i)try{let[n,r]=await Promise.all([e.socket.getState(`${e.adapterName}.${e.instance}.${i}.info.unreach`),e.socket.getState(`${e.adapterName}.${e.instance}.${i}.info.error`)]);n&&n.val!==null&&n.val!==void 0&&(t[`${i}.unreach`]=n.val,t[`${i}.error`]=(r==null?void 0:r.val)??``)}catch{n.add(i)}})),this.setState(e=>{let r={...t};for(let t of n)for(let n of[`${t}.unreach`,`${t}.error`])e.serviceState[n]!==void 0&&(r[n]=e.serviceState[n]);return{serviceState:r}})}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]:``}}))}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,I as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Bc45Ij-7.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BImypPv4.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-BHcTwbRF.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-Bc45Ij-7.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--n4JvPAZ.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-BGw1tATD.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-B5wYN3xM.js","./ConfigPanel-BHcTwbRF.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-B5wYN3xM.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-B5wYN3xM.js","./ConfigPanel-BHcTwbRF.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-B5wYN3xM.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-BImypPv4.js";export{t as get,e as init};
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
2
|
+
"aiu_storedTitle": "KI-Konten",
|
|
3
|
+
"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).",
|
|
4
|
+
"aiu_capClaude": "Abo — einmalig mit Ihrem Claude-Konto anmelden",
|
|
5
|
+
"aiu_capChatgpt": "Abo — einmalig mit Ihrem ChatGPT-Konto anmelden",
|
|
6
|
+
"aiu_capGemini": "Abo — einmalig mit Ihrem Google-Konto anmelden",
|
|
7
|
+
"aiu_storedKey": "Gespeicherter Schlüssel",
|
|
8
|
+
"aiu_provider": "Anbieter",
|
|
9
|
+
"aiu_warnAt": "Warnen ab %",
|
|
10
|
+
"aiu_signedIn": "Angemeldet",
|
|
11
|
+
"aiu_signOut": "Abmelden",
|
|
12
|
+
"aiu_startSignIn": "Anmelden",
|
|
13
|
+
"aiu_claudeStep1": "1. Anmeldeseite öffnen und mit Ihrem Claude-Konto anmelden.",
|
|
14
|
+
"aiu_claudeStep2": "2. Den dort angezeigten Code kopieren und hier einlösen.",
|
|
15
|
+
"aiu_codeLabel": "Code",
|
|
16
|
+
"aiu_googleStep1": "1. Anmeldeseite öffnen und mit Ihrem Google-Konto anmelden.",
|
|
17
|
+
"aiu_googleStep2": "2. Die KOMPLETTE Adresse aus der Adresszeile des Browsers kopieren und hier einfügen.",
|
|
18
|
+
"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.",
|
|
19
|
+
"aiu_addressLabel": "Adresse aus dem Browser",
|
|
20
|
+
"aiu_deviceStep1": "1. Die OpenAI-Seite öffnen und diesen Code eintippen:",
|
|
21
|
+
"aiu_copyCode": "Code kopieren",
|
|
22
|
+
"aiu_openPage": "Seite öffnen",
|
|
23
|
+
"aiu_deviceWaiting": "Warte auf Ihre Bestätigung — diese Karte aktualisiert sich von selbst, sobald Sie fertig sind.",
|
|
24
|
+
"aiu_openSignIn": "Anmeldeseite öffnen",
|
|
25
|
+
"aiu_copyLink": "Link kopieren",
|
|
26
|
+
"aiu_redeem": "Einlösen",
|
|
27
|
+
"aiu_saveFirst": "Zuerst die Einstellungen speichern — danach kann die Anmeldung starten.",
|
|
28
|
+
"aiu_instanceNotRunning": "Die Instanz läuft nicht — zum Anmelden bitte starten.",
|
|
29
|
+
"aiu_noAnswer": "die Instanz hat nicht geantwortet",
|
|
30
|
+
"aiu_noCredentials": "Noch keine KI-Zugangsdaten gespeichert — im Admin unter Einstellungen → Zugangsdaten anlegen.",
|
|
31
|
+
"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.",
|
|
32
|
+
"aiu_stOnline": "Online",
|
|
33
|
+
"aiu_stLimited": "Eingeschränkt",
|
|
34
|
+
"aiu_stOffline": "Offline"
|
|
35
35
|
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
2
|
+
"aiu_storedTitle": "AI accounts",
|
|
3
|
+
"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).",
|
|
4
|
+
"aiu_capClaude": "Subscription — sign in once with your Claude account",
|
|
5
|
+
"aiu_capChatgpt": "Subscription — sign in once with your ChatGPT account",
|
|
6
|
+
"aiu_capGemini": "Subscription — sign in once with your Google account",
|
|
7
|
+
"aiu_storedKey": "Stored key",
|
|
8
|
+
"aiu_provider": "Provider",
|
|
9
|
+
"aiu_warnAt": "Warn at %",
|
|
10
|
+
"aiu_signedIn": "Signed in",
|
|
11
|
+
"aiu_signOut": "Sign out",
|
|
12
|
+
"aiu_startSignIn": "Sign in",
|
|
13
|
+
"aiu_claudeStep1": "1. Open the sign-in page and log in with your Claude account.",
|
|
14
|
+
"aiu_claudeStep2": "2. Copy the code shown there and redeem it here.",
|
|
15
|
+
"aiu_codeLabel": "Code",
|
|
16
|
+
"aiu_googleStep1": "1. Open the sign-in page and log in with your Google account.",
|
|
17
|
+
"aiu_googleStep2": "2. Copy the ENTIRE address from your browser's address bar and paste it here.",
|
|
18
|
+
"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.",
|
|
19
|
+
"aiu_addressLabel": "Address from the browser",
|
|
20
|
+
"aiu_deviceStep1": "1. Open the OpenAI page and type in this code:",
|
|
21
|
+
"aiu_copyCode": "Copy code",
|
|
22
|
+
"aiu_openPage": "Open page",
|
|
23
|
+
"aiu_deviceWaiting": "Waiting for your confirmation — this card updates by itself once you are done.",
|
|
24
|
+
"aiu_openSignIn": "Open sign-in page",
|
|
25
|
+
"aiu_copyLink": "Copy link",
|
|
26
|
+
"aiu_redeem": "Redeem",
|
|
27
|
+
"aiu_saveFirst": "Save the settings first — then the sign-in can start.",
|
|
28
|
+
"aiu_instanceNotRunning": "The instance is not running — start it to sign in.",
|
|
29
|
+
"aiu_noAnswer": "the instance did not answer",
|
|
30
|
+
"aiu_noCredentials": "No AI credentials stored yet — add them in the admin under Settings → Credentials.",
|
|
31
|
+
"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.",
|
|
32
|
+
"aiu_stOnline": "Online",
|
|
33
|
+
"aiu_stLimited": "Limited",
|
|
34
|
+
"aiu_stOffline": "Offline"
|
|
35
35
|
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
2
|
+
"aiu_storedTitle": "Cuentas de IA",
|
|
3
|
+
"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).",
|
|
4
|
+
"aiu_capClaude": "Suscripción — inicie sesión una vez con su cuenta Claude",
|
|
5
|
+
"aiu_capChatgpt": "Suscripción — inicie sesión una vez con su cuenta ChatGPT",
|
|
6
|
+
"aiu_capGemini": "Suscripción — inicie sesión una vez con su cuenta Google",
|
|
7
|
+
"aiu_storedKey": "Clave guardada",
|
|
8
|
+
"aiu_provider": "Proveedor",
|
|
9
|
+
"aiu_warnAt": "Avisar desde %",
|
|
10
|
+
"aiu_signedIn": "Sesión iniciada",
|
|
11
|
+
"aiu_signOut": "Cerrar sesión",
|
|
12
|
+
"aiu_startSignIn": "Iniciar sesión",
|
|
13
|
+
"aiu_claudeStep1": "1. Abra la página de inicio de sesión y entre con su cuenta Claude.",
|
|
14
|
+
"aiu_claudeStep2": "2. Copie el código mostrado y canjéelo aquí.",
|
|
15
|
+
"aiu_codeLabel": "Código",
|
|
16
|
+
"aiu_googleStep1": "1. Abra la página de inicio de sesión y entre con su cuenta Google.",
|
|
17
|
+
"aiu_googleStep2": "2. Copie la dirección COMPLETA de la barra de direcciones y péguela aquí.",
|
|
18
|
+
"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í.",
|
|
19
|
+
"aiu_addressLabel": "Dirección del navegador",
|
|
20
|
+
"aiu_deviceStep1": "1. Abra la página de OpenAI y escriba este código:",
|
|
21
|
+
"aiu_copyCode": "Copiar código",
|
|
22
|
+
"aiu_openPage": "Abrir página",
|
|
23
|
+
"aiu_deviceWaiting": "Esperando su confirmación — esta tarjeta se actualiza sola.",
|
|
24
|
+
"aiu_openSignIn": "Abrir página de inicio de sesión",
|
|
25
|
+
"aiu_copyLink": "Copiar enlace",
|
|
26
|
+
"aiu_redeem": "Canjear",
|
|
27
|
+
"aiu_saveFirst": "Guarde primero la configuración — después puede comenzar el inicio de sesión.",
|
|
28
|
+
"aiu_instanceNotRunning": "La instancia no está en marcha — iníciela para entrar.",
|
|
29
|
+
"aiu_noAnswer": "la instancia no respondió",
|
|
30
|
+
"aiu_noCredentials": "Aún no hay credenciales de IA guardadas — añádalas en Ajustes → Credenciales.",
|
|
31
|
+
"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.",
|
|
32
|
+
"aiu_stOnline": "En línea",
|
|
33
|
+
"aiu_stLimited": "Limitado",
|
|
34
|
+
"aiu_stOffline": "Sin conexión"
|
|
35
35
|
}
|