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.
- package/README.md +13 -2
- package/admin/custom/assets/Components-Bd545388.js +1 -0
- package/admin/custom/assets/ConfigPanel-qivVprTj.js +1 -0
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__AiUsageComponentSet__mf_owner__1-CXmnAfNY.js +1 -0
- 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
- 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
- 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
- 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
- package/admin/custom/assets/hostInit-RHMRa462.js +1 -0
- package/admin/custom/assets/index-B0J1NbOp.js +1 -0
- package/admin/custom/assets/lib-ByF76TCN.js +3 -0
- package/admin/custom/assets/mf-entry-bootstrap-0-e070fa3e.js +35 -0
- package/admin/custom/assets/rolldown-runtime-C0FnF6B9.js +1 -0
- package/admin/custom/assets/virtualExposes-BZWQ_oUV.js +1 -0
- package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-l7jtElkM.js +1 -0
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-CRK-nAdE.js +2 -0
- package/admin/custom/assets/virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-BZ-CVpVo.js +2 -0
- package/admin/custom/assets/vite-preload-helper-B7qeedMF.js +1 -0
- package/admin/custom/customComponents.js +1 -0
- package/admin/custom/i18n/de.json +23 -0
- package/admin/custom/i18n/en.json +23 -0
- package/admin/custom/i18n/es.json +23 -0
- package/admin/custom/i18n/fr.json +23 -0
- package/admin/custom/i18n/it.json +23 -0
- package/admin/custom/i18n/nl.json +23 -0
- package/admin/custom/i18n/pl.json +23 -0
- package/admin/custom/i18n/pt.json +23 -0
- package/admin/custom/i18n/ru.json +23 -0
- package/admin/custom/i18n/uk.json +23 -0
- package/admin/custom/i18n/zh-cn.json +23 -0
- package/admin/custom/mf-manifest.json +1 -0
- package/admin/i18n/de.json +9 -27
- package/admin/i18n/en.json +9 -27
- package/admin/i18n/es.json +9 -27
- package/admin/i18n/fr.json +9 -27
- package/admin/i18n/it.json +9 -27
- package/admin/i18n/nl.json +9 -27
- package/admin/i18n/pl.json +9 -27
- package/admin/i18n/pt.json +9 -27
- package/admin/i18n/ru.json +9 -27
- package/admin/i18n/uk.json +9 -27
- package/admin/i18n/zh-cn.json +9 -27
- package/admin/jsonConfig.json +7 -166
- package/build/lib/pure-helpers.js +5 -2
- package/build/lib/pure-helpers.js.map +2 -2
- package/build/main.js +105 -7
- package/build/main.js.map +2 -2
- package/io-package.json +15 -15
- package/package.json +5 -2
package/admin/i18n/nl.json
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"label_pollInterval": "Peilinterval (s)",
|
|
12
|
-
"help_pollInterval": "Hoe vaak elk account wordt bevraagd. Onder 300 s dreigt beperking door de aanbieder — Claude blokkeert het hele account ongeveer een dag.",
|
|
13
|
-
"label_notifications": "Meldingen",
|
|
14
|
-
"help_notifications": "Eén melding wanneer een account de waarschuwingsdrempel overschrijdt of de inloggegevens niet meer werken.",
|
|
15
|
-
"supportHeader": "Ontwikkeling steunen",
|
|
16
|
-
"aboutInfo": "Deze adapter is gratis en open source. Als je er iets aan hebt, steun dan de ontwikkeling.",
|
|
17
|
-
"donateKofi": "Steun via Ko-fi",
|
|
18
|
-
"donatePaypal": "Doneer via PayPal",
|
|
19
|
-
"OpenRouter": "OpenRouter",
|
|
20
|
-
"DeepSeek": "DeepSeek",
|
|
21
|
-
"claudeHeader": "Claude-abonnement aanmelden",
|
|
22
|
-
"claudeInfo": "Voor een Claude-abonnementsrij: naam invullen, de gegenereerde link openen, bij Anthropic aanmelden en toegang toestaan, daarna de getoonde code plakken en inwisselen. Daarna vernieuwt de adapter de aanmelding zelf.",
|
|
23
|
-
"label_claudeAccount": "Accountnaam (uit de tabel)",
|
|
24
|
-
"help_claudeAccount": "Precies zoals in de accounttabel",
|
|
25
|
-
"label_claudeUrl": "Aanmeldlink",
|
|
26
|
-
"label_claudeCode": "Code van de Anthropic-pagina",
|
|
27
|
-
"help_claudeCode": "Wordt getoond na het toestaan",
|
|
28
|
-
"btn_claudeRedeem": "Code inwisselen"
|
|
2
|
+
"settingsHeader": "Instellingen",
|
|
3
|
+
"label_pollInterval": "Peilinterval (s)",
|
|
4
|
+
"help_pollInterval": "Hoe vaak elk account wordt bevraagd. Onder 300 s dreigt beperking door de aanbieder — Claude blokkeert het hele account ongeveer een dag.",
|
|
5
|
+
"label_notifications": "Meldingen",
|
|
6
|
+
"help_notifications": "Eén melding wanneer een account de waarschuwingsdrempel overschrijdt of de inloggegevens niet meer werken.",
|
|
7
|
+
"supportHeader": "Ontwikkeling steunen",
|
|
8
|
+
"aboutInfo": "Deze adapter is gratis en open source. Als je er iets aan hebt, steun dan de ontwikkeling.",
|
|
9
|
+
"donateKofi": "Steun via Ko-fi",
|
|
10
|
+
"donatePaypal": "Doneer via PayPal"
|
|
29
11
|
}
|
package/admin/i18n/pl.json
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"label_pollInterval": "Interwał odpytywania (s)",
|
|
12
|
-
"help_pollInterval": "Jak często odpytywane jest każde konto. Poniżej 300 s grozi ograniczenie przez dostawcę — Claude blokuje całe konto na około jeden dzień.",
|
|
13
|
-
"label_notifications": "Powiadomienia",
|
|
14
|
-
"help_notifications": "Jedno powiadomienie, gdy konto przekroczy próg ostrzegawczy lub dane dostępowe przestaną działać.",
|
|
15
|
-
"supportHeader": "Wesprzyj rozwój",
|
|
16
|
-
"aboutInfo": "Ten adapter jest darmowy i otwartoźródłowy. Jeśli jest przydatny, rozważ wsparcie rozwoju.",
|
|
17
|
-
"donateKofi": "Wesprzyj na Ko-fi",
|
|
18
|
-
"donatePaypal": "Przekaż przez PayPal",
|
|
19
|
-
"OpenRouter": "OpenRouter",
|
|
20
|
-
"DeepSeek": "DeepSeek",
|
|
21
|
-
"claudeHeader": "Logowanie subskrypcji Claude",
|
|
22
|
-
"claudeInfo": "Dla wiersza subskrypcji Claude: wpisz nazwę, otwórz wygenerowany link, zaloguj się w Anthropic i zezwól na dostęp, następnie wklej wyświetlony kod i zrealizuj go. Potem adapter odnawia logowanie samodzielnie.",
|
|
23
|
-
"label_claudeAccount": "Nazwa konta (z tabeli)",
|
|
24
|
-
"help_claudeAccount": "Dokładnie jak w tabeli kont",
|
|
25
|
-
"label_claudeUrl": "Link logowania",
|
|
26
|
-
"label_claudeCode": "Kod ze strony Anthropic",
|
|
27
|
-
"help_claudeCode": "Wyświetlany po zezwoleniu",
|
|
28
|
-
"btn_claudeRedeem": "Zrealizuj kod"
|
|
2
|
+
"settingsHeader": "Ustawienia",
|
|
3
|
+
"label_pollInterval": "Interwał odpytywania (s)",
|
|
4
|
+
"help_pollInterval": "Jak często odpytywane jest każde konto. Poniżej 300 s grozi ograniczenie przez dostawcę — Claude blokuje całe konto na około jeden dzień.",
|
|
5
|
+
"label_notifications": "Powiadomienia",
|
|
6
|
+
"help_notifications": "Jedno powiadomienie, gdy konto przekroczy próg ostrzegawczy lub dane dostępowe przestaną działać.",
|
|
7
|
+
"supportHeader": "Wesprzyj rozwój",
|
|
8
|
+
"aboutInfo": "Ten adapter jest darmowy i otwartoźródłowy. Jeśli jest przydatny, rozważ wsparcie rozwoju.",
|
|
9
|
+
"donateKofi": "Wesprzyj na Ko-fi",
|
|
10
|
+
"donatePaypal": "Przekaż przez PayPal"
|
|
29
11
|
}
|
package/admin/i18n/pt.json
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"label_pollInterval": "Intervalo de consulta (s)",
|
|
12
|
-
"help_pollInterval": "Com que frequência cada conta é consultada. Abaixo de 300 s há risco de limitação pelo provedor — a Claude bloqueia a conta inteira por cerca de um dia.",
|
|
13
|
-
"label_notifications": "Notificações",
|
|
14
|
-
"help_notifications": "Uma notificação quando uma conta ultrapassa o limite de aviso ou as credenciais deixam de funcionar.",
|
|
15
|
-
"supportHeader": "Apoiar o desenvolvimento",
|
|
16
|
-
"aboutInfo": "Este adaptador é gratuito e de código aberto. Se for útil para você, considere apoiar o desenvolvimento.",
|
|
17
|
-
"donateKofi": "Apoiar no Ko-fi",
|
|
18
|
-
"donatePaypal": "Doar via PayPal",
|
|
19
|
-
"OpenRouter": "OpenRouter",
|
|
20
|
-
"DeepSeek": "DeepSeek",
|
|
21
|
-
"claudeHeader": "Login da assinatura Claude",
|
|
22
|
-
"claudeInfo": "Para uma linha de assinatura Claude: insira o nome, abra o link gerado, faça login na Anthropic e permita o acesso, depois cole o código exibido e resgate-o. Depois disso o adaptador renova o login sozinho.",
|
|
23
|
-
"label_claudeAccount": "Nome da conta (da tabela)",
|
|
24
|
-
"help_claudeAccount": "Exatamente como na tabela de contas",
|
|
25
|
-
"label_claudeUrl": "Link de login",
|
|
26
|
-
"label_claudeCode": "Código da página da Anthropic",
|
|
27
|
-
"help_claudeCode": "Exibido após permitir o acesso",
|
|
28
|
-
"btn_claudeRedeem": "Resgatar código"
|
|
2
|
+
"settingsHeader": "Configurações",
|
|
3
|
+
"label_pollInterval": "Intervalo de consulta (s)",
|
|
4
|
+
"help_pollInterval": "Com que frequência cada conta é consultada. Abaixo de 300 s há risco de limitação pelo provedor — a Claude bloqueia a conta inteira por cerca de um dia.",
|
|
5
|
+
"label_notifications": "Notificações",
|
|
6
|
+
"help_notifications": "Uma notificação quando uma conta ultrapassa o limite de aviso ou as credenciais deixam de funcionar.",
|
|
7
|
+
"supportHeader": "Apoiar o desenvolvimento",
|
|
8
|
+
"aboutInfo": "Este adaptador é gratuito e de código aberto. Se for útil para você, considere apoiar o desenvolvimento.",
|
|
9
|
+
"donateKofi": "Apoiar no Ko-fi",
|
|
10
|
+
"donatePaypal": "Doar via PayPal"
|
|
29
11
|
}
|
package/admin/i18n/ru.json
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"label_pollInterval": "Интервал опроса (с)",
|
|
12
|
-
"help_pollInterval": "Как часто опрашивается каждый аккаунт. Ниже 300 с возможно ограничение со стороны провайдера — Claude блокирует весь аккаунт примерно на сутки.",
|
|
13
|
-
"label_notifications": "Уведомления",
|
|
14
|
-
"help_notifications": "Одно уведомление, когда аккаунт превышает порог предупреждения или учётные данные перестают работать.",
|
|
15
|
-
"supportHeader": "Поддержать разработку",
|
|
16
|
-
"aboutInfo": "Этот адаптер бесплатный и с открытым кодом. Если он вам полезен, поддержите разработку.",
|
|
17
|
-
"donateKofi": "Поддержать на Ko-fi",
|
|
18
|
-
"donatePaypal": "Пожертвовать через PayPal",
|
|
19
|
-
"OpenRouter": "OpenRouter",
|
|
20
|
-
"DeepSeek": "DeepSeek",
|
|
21
|
-
"claudeHeader": "Вход в подписку Claude",
|
|
22
|
-
"claudeInfo": "Для строки подписки Claude: введите её имя, откройте созданную ссылку, войдите в Anthropic и разрешите доступ, затем вставьте показанный код и активируйте его. После этого адаптер обновляет вход самостоятельно.",
|
|
23
|
-
"label_claudeAccount": "Имя аккаунта (из таблицы)",
|
|
24
|
-
"help_claudeAccount": "Точно как в таблице аккаунтов",
|
|
25
|
-
"label_claudeUrl": "Ссылка для входа",
|
|
26
|
-
"label_claudeCode": "Код со страницы Anthropic",
|
|
27
|
-
"help_claudeCode": "Показывается после разрешения доступа",
|
|
28
|
-
"btn_claudeRedeem": "Активировать код"
|
|
2
|
+
"settingsHeader": "Настройки",
|
|
3
|
+
"label_pollInterval": "Интервал опроса (с)",
|
|
4
|
+
"help_pollInterval": "Как часто опрашивается каждый аккаунт. Ниже 300 с возможно ограничение со стороны провайдера — Claude блокирует весь аккаунт примерно на сутки.",
|
|
5
|
+
"label_notifications": "Уведомления",
|
|
6
|
+
"help_notifications": "Одно уведомление, когда аккаунт превышает порог предупреждения или учётные данные перестают работать.",
|
|
7
|
+
"supportHeader": "Поддержать разработку",
|
|
8
|
+
"aboutInfo": "Этот адаптер бесплатный и с открытым кодом. Если он вам полезен, поддержите разработку.",
|
|
9
|
+
"donateKofi": "Поддержать на Ko-fi",
|
|
10
|
+
"donatePaypal": "Пожертвовать через PayPal"
|
|
29
11
|
}
|
package/admin/i18n/uk.json
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"label_pollInterval": "Інтервал опитування (с)",
|
|
12
|
-
"help_pollInterval": "Як часто опитується кожен акаунт. Нижче 300 с можливе обмеження провайдером — Claude блокує весь акаунт приблизно на добу.",
|
|
13
|
-
"label_notifications": "Сповіщення",
|
|
14
|
-
"help_notifications": "Одне сповіщення, коли акаунт перевищує поріг попередження або облікові дані перестають працювати.",
|
|
15
|
-
"supportHeader": "Підтримати розробку",
|
|
16
|
-
"aboutInfo": "Цей адаптер безкоштовний і з відкритим кодом. Якщо він вам корисний, підтримайте розробку.",
|
|
17
|
-
"donateKofi": "Підтримати на Ko-fi",
|
|
18
|
-
"donatePaypal": "Пожертвувати через PayPal",
|
|
19
|
-
"OpenRouter": "OpenRouter",
|
|
20
|
-
"DeepSeek": "DeepSeek",
|
|
21
|
-
"claudeHeader": "Вхід у підписку Claude",
|
|
22
|
-
"claudeInfo": "Для рядка підписки Claude: введіть назву, відкрийте створене посилання, увійдіть в Anthropic і дозвольте доступ, потім вставте показаний код і активуйте його. Після цього адаптер оновлює вхід самостійно.",
|
|
23
|
-
"label_claudeAccount": "Назва акаунта (з таблиці)",
|
|
24
|
-
"help_claudeAccount": "Точно як у таблиці акаунтів",
|
|
25
|
-
"label_claudeUrl": "Посилання для входу",
|
|
26
|
-
"label_claudeCode": "Код зі сторінки Anthropic",
|
|
27
|
-
"help_claudeCode": "Показується після дозволу",
|
|
28
|
-
"btn_claudeRedeem": "Активувати код"
|
|
2
|
+
"settingsHeader": "Налаштування",
|
|
3
|
+
"label_pollInterval": "Інтервал опитування (с)",
|
|
4
|
+
"help_pollInterval": "Як часто опитується кожен акаунт. Нижче 300 с можливе обмеження провайдером — Claude блокує весь акаунт приблизно на добу.",
|
|
5
|
+
"label_notifications": "Сповіщення",
|
|
6
|
+
"help_notifications": "Одне сповіщення, коли акаунт перевищує поріг попередження або облікові дані перестають працювати.",
|
|
7
|
+
"supportHeader": "Підтримати розробку",
|
|
8
|
+
"aboutInfo": "Цей адаптер безкоштовний і з відкритим кодом. Якщо він вам корисний, підтримайте розробку.",
|
|
9
|
+
"donateKofi": "Підтримати на Ko-fi",
|
|
10
|
+
"donatePaypal": "Пожертвувати через PayPal"
|
|
29
11
|
}
|
package/admin/i18n/zh-cn.json
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"label_pollInterval": "轮询间隔(秒)",
|
|
12
|
-
"help_pollInterval": "查询每个账户的频率。低于 300 秒可能被提供商限流——Claude 会将整个账户锁定约一天。",
|
|
13
|
-
"label_notifications": "通知",
|
|
14
|
-
"help_notifications": "当账户超过警告阈值或凭据失效时发送一次通知。",
|
|
15
|
-
"supportHeader": "支持开发",
|
|
16
|
-
"aboutInfo": "本适配器免费且开源。如果对你有用,欢迎支持开发。",
|
|
17
|
-
"donateKofi": "在 Ko-fi 上支持",
|
|
18
|
-
"donatePaypal": "通过 PayPal 捐赠",
|
|
19
|
-
"OpenRouter": "OpenRouter",
|
|
20
|
-
"DeepSeek": "DeepSeek",
|
|
21
|
-
"claudeHeader": "Claude 订阅登录",
|
|
22
|
-
"claudeInfo": "对于 Claude 订阅行:输入其名称,打开生成的链接,在 Anthropic 登录并允许访问,然后粘贴显示的代码并兑换。之后适配器会自行续期登录。",
|
|
23
|
-
"label_claudeAccount": "账户名称(来自表格)",
|
|
24
|
-
"help_claudeAccount": "与账户表格中完全一致",
|
|
25
|
-
"label_claudeUrl": "登录链接",
|
|
26
|
-
"label_claudeCode": "Anthropic 页面上的代码",
|
|
27
|
-
"help_claudeCode": "允许访问后显示",
|
|
28
|
-
"btn_claudeRedeem": "兑换代码"
|
|
2
|
+
"settingsHeader": "设置",
|
|
3
|
+
"label_pollInterval": "轮询间隔(秒)",
|
|
4
|
+
"help_pollInterval": "查询每个账户的频率。低于 300 秒可能被提供商限流——Claude 会将整个账户锁定约一天。",
|
|
5
|
+
"label_notifications": "通知",
|
|
6
|
+
"help_notifications": "当账户超过警告阈值或凭据失效时发送一次通知。",
|
|
7
|
+
"supportHeader": "支持开发",
|
|
8
|
+
"aboutInfo": "本适配器免费且开源。如果对你有用,欢迎支持开发。",
|
|
9
|
+
"donateKofi": "在 Ko-fi 上支持",
|
|
10
|
+
"donatePaypal": "通过 PayPal 捐赠"
|
|
29
11
|
}
|
package/admin/jsonConfig.json
CHANGED
|
@@ -2,176 +2,17 @@
|
|
|
2
2
|
"type": "panel",
|
|
3
3
|
"i18n": true,
|
|
4
4
|
"items": {
|
|
5
|
-
"
|
|
6
|
-
"type": "
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"type": "staticText",
|
|
12
|
-
"text": "accountsInfo",
|
|
13
|
-
"xs": 12,
|
|
14
|
-
"sm": 12,
|
|
15
|
-
"md": 12,
|
|
16
|
-
"lg": 12,
|
|
17
|
-
"xl": 12,
|
|
18
|
-
"style": {
|
|
19
|
-
"fontSize": 14,
|
|
20
|
-
"marginBottom": 8
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"accounts": {
|
|
24
|
-
"type": "table",
|
|
25
|
-
"label": "label_accounts",
|
|
5
|
+
"_accounts": {
|
|
6
|
+
"type": "custom",
|
|
7
|
+
"i18n": true,
|
|
8
|
+
"url": "custom/customComponents.js",
|
|
9
|
+
"name": "AiUsageComponentSet/Components/ConfigPanel",
|
|
10
|
+
"guiApi": 2,
|
|
26
11
|
"xs": 12,
|
|
27
12
|
"sm": 12,
|
|
28
13
|
"md": 12,
|
|
29
14
|
"lg": 12,
|
|
30
|
-
"xl": 12
|
|
31
|
-
"uniqueColumns": [
|
|
32
|
-
"name"
|
|
33
|
-
],
|
|
34
|
-
"items": [
|
|
35
|
-
{
|
|
36
|
-
"type": "text",
|
|
37
|
-
"attr": "name",
|
|
38
|
-
"title": "col_name",
|
|
39
|
-
"width": "20%",
|
|
40
|
-
"filter": false,
|
|
41
|
-
"sort": false,
|
|
42
|
-
"default": ""
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"type": "select",
|
|
46
|
-
"attr": "provider",
|
|
47
|
-
"title": "col_provider",
|
|
48
|
-
"width": "20%",
|
|
49
|
-
"filter": false,
|
|
50
|
-
"sort": false,
|
|
51
|
-
"noTranslation": true,
|
|
52
|
-
"default": "claude-sub",
|
|
53
|
-
"options": [
|
|
54
|
-
{
|
|
55
|
-
"label": "Claude subscription",
|
|
56
|
-
"value": "claude-sub"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"label": "OpenRouter",
|
|
60
|
-
"value": "openrouter"
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"label": "DeepSeek",
|
|
64
|
-
"value": "deepseek"
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"label": "OpenAI API",
|
|
68
|
-
"value": "openai"
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"label": "Anthropic API",
|
|
72
|
-
"value": "anthropic-api"
|
|
73
|
-
}
|
|
74
|
-
]
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
"type": "credential",
|
|
78
|
-
"attr": "credentialId",
|
|
79
|
-
"title": "col_credential",
|
|
80
|
-
"width": "30%",
|
|
81
|
-
"filter": false,
|
|
82
|
-
"sort": false,
|
|
83
|
-
"default": ""
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
"type": "number",
|
|
87
|
-
"attr": "warnThreshold",
|
|
88
|
-
"title": "col_warnThreshold",
|
|
89
|
-
"width": "15%",
|
|
90
|
-
"filter": false,
|
|
91
|
-
"sort": false,
|
|
92
|
-
"min": 10,
|
|
93
|
-
"max": 100,
|
|
94
|
-
"default": 80
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"type": "checkbox",
|
|
98
|
-
"attr": "enabled",
|
|
99
|
-
"title": "col_enabled",
|
|
100
|
-
"width": "15%",
|
|
101
|
-
"filter": false,
|
|
102
|
-
"sort": false,
|
|
103
|
-
"default": true
|
|
104
|
-
}
|
|
105
|
-
]
|
|
106
|
-
},
|
|
107
|
-
"_claudeHeader": {
|
|
108
|
-
"newLine": true,
|
|
109
|
-
"type": "header",
|
|
110
|
-
"text": "claudeHeader",
|
|
111
|
-
"size": 5
|
|
112
|
-
},
|
|
113
|
-
"_claudeInfo": {
|
|
114
|
-
"type": "staticText",
|
|
115
|
-
"text": "claudeInfo",
|
|
116
|
-
"xs": 12,
|
|
117
|
-
"sm": 12,
|
|
118
|
-
"md": 12,
|
|
119
|
-
"lg": 12,
|
|
120
|
-
"xl": 12,
|
|
121
|
-
"style": {
|
|
122
|
-
"fontSize": 14,
|
|
123
|
-
"marginBottom": 8
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
"_claudeAccount": {
|
|
127
|
-
"type": "text",
|
|
128
|
-
"label": "label_claudeAccount",
|
|
129
|
-
"help": "help_claudeAccount",
|
|
130
|
-
"doNotSave": true,
|
|
131
|
-
"xs": 12,
|
|
132
|
-
"sm": 6,
|
|
133
|
-
"md": 4,
|
|
134
|
-
"lg": 4,
|
|
135
|
-
"xl": 3
|
|
136
|
-
},
|
|
137
|
-
"_claudeUrl": {
|
|
138
|
-
"type": "textSendTo",
|
|
139
|
-
"command": "claudeAuthStart",
|
|
140
|
-
"jsonData": "{\"account\": \"${data._claudeAccount}\"}",
|
|
141
|
-
"alsoDependsOn": [
|
|
142
|
-
"_claudeAccount"
|
|
143
|
-
],
|
|
144
|
-
"label": "label_claudeUrl",
|
|
145
|
-
"copyToClipboard": true,
|
|
146
|
-
"xs": 12,
|
|
147
|
-
"sm": 12,
|
|
148
|
-
"md": 8,
|
|
149
|
-
"lg": 8,
|
|
150
|
-
"xl": 8
|
|
151
|
-
},
|
|
152
|
-
"_claudeCode": {
|
|
153
|
-
"type": "text",
|
|
154
|
-
"label": "label_claudeCode",
|
|
155
|
-
"help": "help_claudeCode",
|
|
156
|
-
"doNotSave": true,
|
|
157
|
-
"xs": 12,
|
|
158
|
-
"sm": 6,
|
|
159
|
-
"md": 4,
|
|
160
|
-
"lg": 4,
|
|
161
|
-
"xl": 3
|
|
162
|
-
},
|
|
163
|
-
"_claudeRedeem": {
|
|
164
|
-
"type": "sendTo",
|
|
165
|
-
"command": "claudeAuthCode",
|
|
166
|
-
"jsonData": "{\"account\": \"${data._claudeAccount}\", \"code\": \"${data._claudeCode}\"}",
|
|
167
|
-
"label": "btn_claudeRedeem",
|
|
168
|
-
"variant": "contained",
|
|
169
|
-
"useNative": false,
|
|
170
|
-
"xs": 12,
|
|
171
|
-
"sm": 6,
|
|
172
|
-
"md": 4,
|
|
173
|
-
"lg": 4,
|
|
174
|
-
"xl": 3
|
|
15
|
+
"xl": 12
|
|
175
16
|
},
|
|
176
17
|
"_settingsHeader": {
|
|
177
18
|
"newLine": true,
|
|
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var pure_helpers_exports = {};
|
|
20
20
|
__export(pure_helpers_exports, {
|
|
21
21
|
PROVIDER_KINDS: () => PROVIDER_KINDS,
|
|
22
|
+
RESERVED_ROOT_IDS: () => RESERVED_ROOT_IDS,
|
|
22
23
|
clampPollInterval: () => clampPollInterval,
|
|
23
24
|
parseAccounts: () => parseAccounts,
|
|
24
25
|
sanitizeId: () => sanitizeId,
|
|
@@ -29,6 +30,7 @@ function sanitizeId(name) {
|
|
|
29
30
|
return name.trim().replace(/[^a-zA-Z0-9_-]/g, "_").replace(/_{2,}/g, "_").replace(/^_+|_+$/g, "");
|
|
30
31
|
}
|
|
31
32
|
const PROVIDER_KINDS = ["claude-sub", "openrouter", "deepseek", "openai", "anthropic-api"];
|
|
33
|
+
const RESERVED_ROOT_IDS = ["info", "total", "auth"];
|
|
32
34
|
function parseAccounts(raw) {
|
|
33
35
|
if (!Array.isArray(raw)) {
|
|
34
36
|
return [];
|
|
@@ -46,7 +48,7 @@ function parseAccounts(raw) {
|
|
|
46
48
|
const name = typeof row.name === "string" ? row.name.trim() : "";
|
|
47
49
|
const id = sanitizeId(name);
|
|
48
50
|
const provider = typeof row.provider === "string" ? row.provider : "";
|
|
49
|
-
if (!id || id
|
|
51
|
+
if (!id || RESERVED_ROOT_IDS.includes(id) || !PROVIDER_KINDS.includes(provider) || seen.has(id)) {
|
|
50
52
|
continue;
|
|
51
53
|
}
|
|
52
54
|
seen.add(id);
|
|
@@ -72,7 +74,7 @@ function validAccountIds(raw) {
|
|
|
72
74
|
}
|
|
73
75
|
const row = entry;
|
|
74
76
|
const id = sanitizeId(typeof row.name === "string" ? row.name : "");
|
|
75
|
-
if (id && id
|
|
77
|
+
if (id && !RESERVED_ROOT_IDS.includes(id) && !ids.includes(id)) {
|
|
76
78
|
ids.push(id);
|
|
77
79
|
}
|
|
78
80
|
}
|
|
@@ -88,6 +90,7 @@ function clampPollInterval(raw) {
|
|
|
88
90
|
// Annotate the CommonJS export names for ESM import in node:
|
|
89
91
|
0 && (module.exports = {
|
|
90
92
|
PROVIDER_KINDS,
|
|
93
|
+
RESERVED_ROOT_IDS,
|
|
91
94
|
clampPollInterval,
|
|
92
95
|
parseAccounts,
|
|
93
96
|
sanitizeId,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/pure-helpers.ts"],
|
|
4
|
-
"sourcesContent": ["/** One configured AI account, validated from the admin table (API boundary). */\nexport interface AccountConfig {\n /** Display name from the table. */\n name: string;\n /** Id-safe object id derived from the name. */\n id: string;\n /** Provider kind. */\n provider: string;\n /** Central credential id (system.credentials.*); empty for claude-sub. */\n credentialId: string;\n /** Warn threshold in percent. */\n warnThreshold: number;\n}\n\n/**\n * Make a string safe as an ioBroker object-id segment.\n *\n * @param name the raw name\n * @returns the sanitized id segment\n */\nexport function sanitizeId(name: string): string {\n return name\n .trim()\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .replace(/_{2,}/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\n/** The provider kinds the adapter knows. */\nexport const PROVIDER_KINDS = [\"claude-sub\", \"openrouter\", \"deepseek\", \"openai\", \"anthropic-api\"];\n\n/**\n * Parse and validate the admin accounts table. Rows without a usable name or with an\n * unknown provider are skipped (type-guarded \u2014 the table is external input); disabled\n * rows are skipped too. Duplicate ids keep the first row.\n *\n * @param raw the native.accounts value\n * @returns the validated, enabled accounts\n */\nexport function parseAccounts(raw: unknown): AccountConfig[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const accounts: AccountConfig[] = [];\n const seen = new Set<string>();\n for (const entry of raw) {\n if (typeof entry !== \"object\" || entry === null) {\n continue;\n }\n const row = entry as Record<string, unknown>;\n if (row.enabled === false) {\n continue;\n }\n const name = typeof row.name === \"string\" ? row.name.trim() : \"\";\n const id = sanitizeId(name);\n const provider = typeof row.provider === \"string\" ? row.provider : \"\";\n if (!id || id
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KACJ,KAAK,EACL,QAAQ,mBAAmB,GAAG,EAC9B,QAAQ,UAAU,GAAG,EACrB,QAAQ,YAAY,EAAE;AAC3B;AAGO,MAAM,iBAAiB,CAAC,cAAc,cAAc,YAAY,UAAU,eAAe;
|
|
4
|
+
"sourcesContent": ["/** One configured AI account, validated from the admin table (API boundary). */\nexport interface AccountConfig {\n /** Display name from the table. */\n name: string;\n /** Id-safe object id derived from the name. */\n id: string;\n /** Provider kind. */\n provider: string;\n /** Central credential id (system.credentials.*); empty for claude-sub. */\n credentialId: string;\n /** Warn threshold in percent. */\n warnThreshold: number;\n}\n\n/**\n * Make a string safe as an ioBroker object-id segment.\n *\n * @param name the raw name\n * @returns the sanitized id segment\n */\nexport function sanitizeId(name: string): string {\n return name\n .trim()\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .replace(/_{2,}/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\n/** The provider kinds the adapter knows. */\nexport const PROVIDER_KINDS = [\"claude-sub\", \"openrouter\", \"deepseek\", \"openai\", \"anthropic-api\"];\n\n/** Top-level object roots the adapter owns \u2014 no account may use them as id. */\nexport const RESERVED_ROOT_IDS = [\"info\", \"total\", \"auth\"];\n\n/**\n * Parse and validate the admin accounts table. Rows without a usable name or with an\n * unknown provider are skipped (type-guarded \u2014 the table is external input); disabled\n * rows are skipped too. Duplicate ids keep the first row.\n *\n * @param raw the native.accounts value\n * @returns the validated, enabled accounts\n */\nexport function parseAccounts(raw: unknown): AccountConfig[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const accounts: AccountConfig[] = [];\n const seen = new Set<string>();\n for (const entry of raw) {\n if (typeof entry !== \"object\" || entry === null) {\n continue;\n }\n const row = entry as Record<string, unknown>;\n if (row.enabled === false) {\n continue;\n }\n const name = typeof row.name === \"string\" ? row.name.trim() : \"\";\n const id = sanitizeId(name);\n const provider = typeof row.provider === \"string\" ? row.provider : \"\";\n if (!id || RESERVED_ROOT_IDS.includes(id) || !PROVIDER_KINDS.includes(provider) || seen.has(id)) {\n continue;\n }\n seen.add(id);\n const threshold = Number(row.warnThreshold);\n accounts.push({\n name,\n id,\n provider,\n credentialId: typeof row.credentialId === \"string\" ? row.credentialId : \"\",\n warnThreshold: Number.isFinite(threshold) && threshold >= 10 && threshold <= 100 ? threshold : 80,\n });\n }\n return accounts;\n}\n\n/**\n * The ids of ALL valid table rows \u2014 including disabled ones. Used by the stale-object\n * cleanup: a disabled account is paused, not deleted; only rows removed from the\n * table lose their tree.\n *\n * @param raw the native.accounts value\n * @returns the id-safe ids of every valid row\n */\nexport function validAccountIds(raw: unknown): string[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const ids: string[] = [];\n for (const entry of raw) {\n if (typeof entry !== \"object\" || entry === null) {\n continue;\n }\n const row = entry as Record<string, unknown>;\n const id = sanitizeId(typeof row.name === \"string\" ? row.name : \"\");\n if (id && !RESERVED_ROOT_IDS.includes(id) && !ids.includes(id)) {\n ids.push(id);\n }\n }\n return ids;\n}\n\n/**\n * Clamp the poll interval to the safe range: minimum 60 s (provider throttling locks\n * whole accounts), default 300 s for anything unusable.\n *\n * @param raw the configured value\n * @returns the effective interval in seconds\n */\nexport function clampPollInterval(raw: unknown): number {\n const value = Number(raw);\n if (!Number.isFinite(value) || value <= 0) {\n return 300;\n }\n return Math.min(3600, Math.max(60, Math.round(value)));\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KACJ,KAAK,EACL,QAAQ,mBAAmB,GAAG,EAC9B,QAAQ,UAAU,GAAG,EACrB,QAAQ,YAAY,EAAE;AAC3B;AAGO,MAAM,iBAAiB,CAAC,cAAc,cAAc,YAAY,UAAU,eAAe;AAGzF,MAAM,oBAAoB,CAAC,QAAQ,SAAS,MAAM;AAUlD,SAAS,cAAc,KAA+B;AAC3D,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAA4B,CAAC;AACnC,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,SAAS,KAAK;AACvB,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C;AAAA,IACF;AACA,UAAM,MAAM;AACZ,QAAI,IAAI,YAAY,OAAO;AACzB;AAAA,IACF;AACA,UAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,IAAI;AAC9D,UAAM,KAAK,WAAW,IAAI;AAC1B,UAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AACnE,QAAI,CAAC,MAAM,kBAAkB,SAAS,EAAE,KAAK,CAAC,eAAe,SAAS,QAAQ,KAAK,KAAK,IAAI,EAAE,GAAG;AAC/F;AAAA,IACF;AACA,SAAK,IAAI,EAAE;AACX,UAAM,YAAY,OAAO,IAAI,aAAa;AAC1C,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,MACxE,eAAe,OAAO,SAAS,SAAS,KAAK,aAAa,MAAM,aAAa,MAAM,YAAY;AAAA,IACjG,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAUO,SAAS,gBAAgB,KAAwB;AACtD,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,KAAK;AACvB,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C;AAAA,IACF;AACA,UAAM,MAAM;AACZ,UAAM,KAAK,WAAW,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,EAAE;AAClE,QAAI,MAAM,CAAC,kBAAkB,SAAS,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,GAAG;AAC9D,UAAI,KAAK,EAAE;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AASO,SAAS,kBAAkB,KAAsB;AACtD,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|