iobroker.ai-usage 0.1.0 → 0.2.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.
Files changed (49) hide show
  1. package/README.md +13 -2
  2. package/admin/custom/assets/Components-Bd545388.js +1 -0
  3. package/admin/custom/assets/ConfigPanel-qivVprTj.js +1 -0
  4. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__AiUsageComponentSet__mf_owner__1-CXmnAfNY.js +1 -0
  5. package/admin/custom/assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js +1243 -0
  6. package/admin/custom/assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-qu1s07FY.js +1494 -0
  7. package/admin/custom/assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-C8-GjKo4.js +9 -0
  8. package/admin/custom/assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__prebuild___mf_0_iobroker_mf_1_gui_mf_2_components__prebuild__-CQxWwR2r.js +1 -0
  9. package/admin/custom/assets/hostInit-RHMRa462.js +1 -0
  10. package/admin/custom/assets/index-B0J1NbOp.js +1 -0
  11. package/admin/custom/assets/lib-ByF76TCN.js +3 -0
  12. package/admin/custom/assets/mf-entry-bootstrap-0-e070fa3e.js +35 -0
  13. package/admin/custom/assets/rolldown-runtime-C0FnF6B9.js +1 -0
  14. package/admin/custom/assets/virtualExposes-BZWQ_oUV.js +1 -0
  15. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-l7jtElkM.js +1 -0
  16. package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-CRK-nAdE.js +2 -0
  17. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-BZ-CVpVo.js +2 -0
  18. package/admin/custom/assets/vite-preload-helper-B7qeedMF.js +1 -0
  19. package/admin/custom/customComponents.js +1 -0
  20. package/admin/custom/i18n/de.json +23 -0
  21. package/admin/custom/i18n/en.json +23 -0
  22. package/admin/custom/i18n/es.json +23 -0
  23. package/admin/custom/i18n/fr.json +23 -0
  24. package/admin/custom/i18n/it.json +23 -0
  25. package/admin/custom/i18n/nl.json +23 -0
  26. package/admin/custom/i18n/pl.json +23 -0
  27. package/admin/custom/i18n/pt.json +23 -0
  28. package/admin/custom/i18n/ru.json +23 -0
  29. package/admin/custom/i18n/uk.json +23 -0
  30. package/admin/custom/i18n/zh-cn.json +23 -0
  31. package/admin/custom/mf-manifest.json +1 -0
  32. package/admin/i18n/de.json +9 -27
  33. package/admin/i18n/en.json +9 -27
  34. package/admin/i18n/es.json +9 -27
  35. package/admin/i18n/fr.json +9 -27
  36. package/admin/i18n/it.json +9 -27
  37. package/admin/i18n/nl.json +9 -27
  38. package/admin/i18n/pl.json +9 -27
  39. package/admin/i18n/pt.json +9 -27
  40. package/admin/i18n/ru.json +9 -27
  41. package/admin/i18n/uk.json +9 -27
  42. package/admin/i18n/zh-cn.json +9 -27
  43. package/admin/jsonConfig.json +7 -166
  44. package/build/lib/pure-helpers.js +5 -2
  45. package/build/lib/pure-helpers.js.map +2 -2
  46. package/build/main.js +105 -7
  47. package/build/main.js.map +2 -2
  48. package/io-package.json +15 -15
  49. package/package.json +5 -2
package/README.md CHANGED
@@ -27,15 +27,21 @@ dashboards, history and automations ("send a message at 90 % of the weekly limit
27
27
 
28
28
  - Node.js >= 22
29
29
  - ioBroker js-controller >= 7.2.2
30
- - **ioBroker Admin >= 8.0.0** — the adapter uses the admin's central credential storage
30
+ - **ioBroker Admin >= 8.0.1** — the adapter uses the admin's central credential storage
31
31
 
32
32
  ---
33
33
 
34
34
  ## Configuration
35
35
 
36
+ The instance settings show your stored AI credentials (admin central storage, category AI) as
37
+ simple on/off switches — switch on what you want to monitor. The Claude subscription has its own
38
+ card with a guided sign-in: open the sign-in page, log in with your Claude account, paste the code,
39
+ done. New API keys are added once under Settings → Credentials and are shared with the admin AI
40
+ assistant.
41
+
36
42
  | Option | Description | Default |
37
43
  |--------|-------------|---------|
38
- | **Accounts** | One row per AI account: name, provider, credential from the central storage, warn threshold, active flag | — |
44
+ | **Warn at %** | Per account: one notification when a limit window crosses this utilisation | 80 |
39
45
  | **Poll interval** | How often each account is queried (seconds) | 300 |
40
46
  | **Notifications** | One notification on threshold crossing or broken credentials | on |
41
47
 
@@ -77,6 +83,11 @@ and the adapter log. Authentication errors raise one notification with the reaso
77
83
  Placeholder for the next version (at the beginning of the line):
78
84
  ### **WORK IN PROGRESS**
79
85
  -->
86
+ ### 0.2.0 (2026-08-26)
87
+
88
+ - Changed: Completely new settings page — your stored AI credentials appear as simple on/off switches instead of a table, and new keys are picked up straight from the admin credential storage
89
+ - Fixed: The Claude subscription sign-in works reliably now — a guided card with live status, and the sign-in link stays valid until it is used instead of regenerating while you type
90
+
80
91
  ### 0.1.0 (2026-08-25)
81
92
 
82
93
  - New: First release — reads usage limits, credits and costs of your Claude, OpenAI, Anthropic, OpenRouter and DeepSeek accounts into datapoints, with one warning at your chosen threshold
@@ -0,0 +1 @@
1
+ import{t as e}from"./ConfigPanel-qivVprTj.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-qu1s07FY.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,ei as m,ga as h,ii as g,in as _,kr as v,li as y,ni as b,oi as x}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js";f();var S=`Claude`,C={openrouter:`OpenRouter`,deepseek:`DeepSeek`,openai:`OpenAI`,"anthropic-api":`Anthropic`};function w(e,t){let n=`${e} ${t}`.toLowerCase();return n.includes(`gemini`)?`unsupported`:n.includes(`anthropic`)?`anthropic-api`:n.includes(`chatgpt`)||n.includes(`openai`)?`openai`:n.includes(`deepseek`)?`deepseek`:n.includes(`openrouter`)||n.includes(`router`)?`openrouter`:null}var T=class extends e{constructor(e){super(e),h(this,`urlId`,``),h(this,`connId`,``),h(this,`onUrl`,(e,t)=>{this.setState({claudeUrl:typeof(t==null?void 0:t.val)==`string`?t.val:``})}),h(this,`onConn`,(e,t)=>{this.setState({claudeSignedIn:(t==null?void 0:t.val)===!0})}),this.state={...this.state,credentials:[],credentialsLoaded:!1,claudeUrl:``,claudeSignedIn:!1,code:``,busy:!1,message:null,providerChoice:{}}}async componentDidMount(){var e;(e=super.componentDidMount)==null||e.call(this);let t=this.props.oContext,n=`${t.adapterName}.${t.instance}`;this.urlId=`${n}.auth.${S}.signInUrl`,this.connId=`${n}.auth.${S}.signedIn`;try{let e=await t.socket.getObjectViewSystem(`config`,`system.credentials.`,`system.credentials.香`),n=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,guess:w(r,a)}}).sort((e,t)=>e.name.localeCompare(t.name));this.setState({credentials:n,credentialsLoaded:!0})}catch{this.setState({credentialsLoaded:!0})}try{let[e,n]=await Promise.all([t.socket.getState(this.urlId),t.socket.getState(this.connId)]);this.setState({claudeUrl:typeof(e==null?void 0:e.val)==`string`?e.val:``,claudeSignedIn:(n==null?void 0:n.val)===!0}),await t.socket.subscribeState(this.urlId,this.onUrl),await t.socket.subscribeState(this.connId,this.onConn)}catch{}}componentWillUnmount(){var e,t;let n=(e=this.props.oContext)==null?void 0:e.socket;n&&this.urlId&&(n.unsubscribeState(this.urlId,this.onUrl),n.unsubscribeState(this.connId,this.onConn)),(t=super.componentWillUnmount)==null||t.call(this)}accounts(){let t=e.getValue(this.props.data,`accounts`);return Array.isArray(t)?t:[]}commit(e){this.onChange(`accounts`,e)}claudeEnabled(){return this.accounts().some(e=>e.provider===`claude-sub`)}toggleClaude(e){let t=this.accounts().filter(e=>e.provider!==`claude-sub`);e&&t.unshift({name:S,provider:`claude-sub`,credentialId:``,warnThreshold:80,enabled:!0}),this.commit(t)}toggleCredential(e,t){let n=this.accounts().filter(t=>t.credentialId!==e.id);if(t){let t=e.guess&&e.guess!==`unsupported`?e.guess:this.state.providerChoice[e.id];if(!t)return;n.push({name:e.name,provider:t,credentialId:e.id,warnThreshold:80,enabled:!0})}this.commit(n)}setThreshold(e,t){let n=Math.min(100,Math.max(10,Math.round(Number(t))||80));this.commit(this.accounts().map(t=>(e?t.credentialId===e:t.provider===`claude-sub`)?{...t,warnThreshold:n}:t))}async redeemCode(){let e=this.props.oContext;this.setState({busy:!0,message:null});try{let t=await e.socket.sendTo(`${e.adapterName}.${e.instance}`,`claudeAuthCode`,{account:S,code:this.state.code});(t==null?void 0:t.result)===`ok`?this.setState({busy:!1,code:``,message:{ok:!0,text:_.t(`aiu_signInDone`)}}):this.setState({busy:!1,message:{ok:!1,text:(t==null?void 0:t.error)||_.t(`aiu_signInFailed`)}})}catch{this.setState({busy:!1,message:{ok:!1,text:_.t(`aiu_instanceNotRunning`)}})}}async newLink(){let e=this.props.oContext;this.setState({busy:!0,message:null});try{await e.socket.sendTo(`${e.adapterName}.${e.instance}`,`claudeAuthStart`,{account:S}),this.setState({busy:!1})}catch{this.setState({busy:!1,message:{ok:!1,text:_.t(`aiu_instanceNotRunning`)}})}}renderThreshold(e,t){return u(d,{size:`small`,type:`number`,label:_.t(`aiu_warnAt`),defaultValue:t.warnThreshold||80,onBlur:t=>this.setThreshold(e,t.target.value),slotProps:{htmlInput:{min:10,max:100,style:{width:60}},inputLabel:{shrink:!0}},sx:{ml:`auto`}},`${e}-threshold`)}renderClaudeRow(){let e=this.claudeEnabled(),n=this.accounts().find(e=>e.provider===`claude-sub`);return a(b,{children:[a(b,{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(b,{sx:{minWidth:160},children:[u(m,{children:_.t(`aiu_claudeTitle`)}),u(m,{variant:`caption`,sx:{opacity:.7},children:_.t(`aiu_claudeCaption`)})]}),e&&n?this.renderThreshold(``,n):null,u(t,{checked:e,onChange:e=>this.toggleClaude(e.target.checked),sx:{ml:e?0:`auto`}})]}),e?u(b,{sx:{pl:6,py:1.5,borderBottom:1,borderColor:`divider`},children:this.renderClaudeAuth()}):null]},`claude-sub`)}renderClaudeAuth(){return this.state.claudeSignedIn?a(b,{sx:{display:`flex`,alignItems:`center`,gap:1,flexWrap:`wrap`},children:[u(v,{color:`success`}),u(m,{sx:{color:`success.main`},children:_.t(`aiu_signedIn`)}),u(g,{size:`small`,startIcon:u(r,{}),disabled:this.state.busy,onClick:()=>void this.newLink(),children:_.t(`aiu_signInAgain`)})]}):this.state.claudeUrl?a(b,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:[u(m,{variant:`body2`,children:_.t(`aiu_step1`)}),a(b,{sx:{display:`flex`,gap:1,flexWrap:`wrap`},children:[u(g,{variant:`contained`,startIcon:u(n,{}),href:this.state.claudeUrl,target:`_blank`,rel:`noopener noreferrer`,children:_.t(`aiu_openSignIn`)}),u(g,{variant:`outlined`,startIcon:u(s,{}),onClick:()=>{var e;(e=navigator.clipboard)==null||e.writeText(this.state.claudeUrl)},children:_.t(`aiu_copyLink`)})]}),u(m,{variant:`body2`,children:_.t(`aiu_step2`)}),a(b,{sx:{display:`flex`,gap:1,alignItems:`center`,flexWrap:`wrap`},children:[u(d,{size:`small`,label:_.t(`aiu_codeLabel`),value:this.state.code,onChange:e=>this.setState({code:e.target.value}),sx:{minWidth:320}}),u(g,{variant:`contained`,disabled:!this.state.code.trim()||this.state.busy||!this.props.alive,onClick:()=>void this.redeemCode(),children:this.state.busy?u(y,{size:20}):_.t(`aiu_redeem`)})]}),this.props.alive?null:u(c,{severity:`warning`,children:_.t(`aiu_instanceNotRunning`)}),this.state.message?u(c,{severity:this.state.message.ok?`success`:`error`,children:this.state.message.text}):null]}):u(c,{severity:`info`,children:this.props.changed?_.t(`aiu_saveFirst`):_.t(`aiu_waitingForLink`)})}renderCredentialRow(e){let n=this.accounts().find(t=>t.credentialId===e.id),r=e.guess===`unsupported`,s=e.guess===null&&!n,c=(n==null?void 0:n.provider)||e.guess!==`unsupported`&&e.guess||this.state.providerChoice[e.id]||``;return a(b,{sx:{display:`flex`,alignItems:`center`,gap:1.5,py:1,borderBottom:1,borderColor:`divider`},children:[u(o,{src:e.icon,sx:{width:28,height:28,bgcolor:`transparent`},children:u(l,{fontSize:`small`})}),a(b,{sx:{minWidth:160},children:[u(m,{children:e.name}),u(m,{variant:`caption`,sx:{opacity:.7},children:r?_.t(`aiu_unsupported`):C[c]||``})]}),s?u(d,{select:!0,size:`small`,label:_.t(`aiu_provider`),value:this.state.providerChoice[e.id]||``,onChange:t=>this.setState({providerChoice:{...this.state.providerChoice,[e.id]:t.target.value}}),sx:{minWidth:160},children:Object.entries(C).map(([e,t])=>u(i,{value:e,children:t},e))}):null,n?this.renderThreshold(e.id,n):null,u(t,{checked:!!n,disabled:r||s&&!this.state.providerChoice[e.id],onChange:t=>this.toggleCredential(e,t.target.checked),sx:{ml:n?0:`auto`}})]},e.id)}renderItem(){let e=this.state.credentials.map(e=>({name:e.name,element:this.renderCredentialRow(e)}));return e.push({name:_.t(`aiu_claudeTitle`),element:this.renderClaudeRow()}),e.sort((e,t)=>e.name.localeCompare(t.name)),u(b,{"data-testid":`aiu-config`,sx:{maxWidth:720},children:u(p,{variant:`outlined`,children:a(x,{children:[u(m,{variant:`h6`,sx:{mb:.5},children:_.t(`aiu_storedTitle`)}),u(m,{variant:`body2`,sx:{opacity:.8,mb:1},children:_.t(`aiu_storedHint`)}),this.state.credentialsLoaded?e.map(e=>e.element):u(y,{size:24}),this.state.credentialsLoaded&&this.state.credentials.length===0?u(c,{severity:`info`,sx:{mt:1},children:_.t(`aiu_noCredentials`)}):null]})})})}};export{T as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={react:async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js`).then(e=>(e.yo(),e.vo)),[],import.meta.url),"react/jsx-runtime":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js`).then(e=>e.Ua),[],import.meta.url),"react-dom":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js`).then(e=>(e.Xa(),e.Ya)),[],import.meta.url),"react-dom/client":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-C8-GjKo4.js`).then(e=>e.n),[],import.meta.url),"@mui/material":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js`).then(e=>e.Wi),[],import.meta.url),"@mui/icons-material":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DwHNIjSR.js`).then(e=>e.wr),[],import.meta.url),"@iobroker/gui-components":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__prebuild___mf_0_iobroker_mf_1_gui_mf_2_components__prebuild__-CQxWwR2r.js`),[],import.meta.url),"@iobroker/json-config":async()=>await e(()=>import(`./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-qu1s07FY.js`).then(e=>e.n),[],import.meta.url)},n={react:{name:`react`,version:`19.2.8`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n.react.loaded=!0;let{react:e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"react/jsx-runtime":{name:`react/jsx-runtime`,version:`19.2.8`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n[`react/jsx-runtime`].loaded=!0;let{"react/jsx-runtime":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"react-dom":{name:`react-dom`,version:`19.2.8`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n[`react-dom`].loaded=!0;let{"react-dom":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"react-dom/client":{name:`react-dom/client`,version:`19.2.8`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n[`react-dom/client`].loaded=!0;let{"react-dom/client":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"@mui/material":{name:`@mui/material`,version:`9.3.1`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n[`@mui/material`].loaded=!0;let{"@mui/material":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"@mui/icons-material":{name:`@mui/icons-material`,version:`9.3.1`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n[`@mui/icons-material`].loaded=!0;let{"@mui/icons-material":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"@iobroker/gui-components":{name:`@iobroker/gui-components`,version:`10.1.0`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!1,async get(){n[`@iobroker/gui-components`].loaded=!0;let{"@iobroker/gui-components":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}},"@iobroker/json-config":{name:`@iobroker/json-config`,version:`9.0.22`,scope:[`default`],loaded:!1,eager:!1,from:`AiUsageComponentSet`,canLiveRebind:!0,async get(){n[`@iobroker/json-config`].loaded=!0;let{"@iobroker/json-config":e}=t,r={...await e()};return r.__esModule!==!0&&Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:`*`,strictVersion:!1,eager:!1}}},r=[];export{r as usedRemotes,n as usedShared};