@camstack/addon-provider-bosch 0.1.29 → 0.1.31

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.
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-CyLs51d2.js");
3
- const require_account_integration_offline = require("../account-integration-offline-DMtMWixt.js");
2
+ const require_dist = require("../dist-NdDwxHvT.js");
3
+ const require_account_integration_offline = require("../account-integration-offline-IvvrXQDg.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  //#region src/homecom/config.ts
6
6
  var HOMECOM_BRANDS = ["bosch", "buderus"];
@@ -51,19 +51,13 @@ var HIDDEN_UNTIL_ADVANCED = {
51
51
  field: "__hidden__",
52
52
  equals: "yes"
53
53
  };
54
- var HOMECOM_CODE_HELP = [
55
- "Before you sign in, open the browser's developer tools, choose the Network tab, and turn on Preserve log.",
56
- "Sign in with SingleKey. The page will say it has network problems. Ignore that: the browser tried to open the Bosch app and could not.",
57
- "In the Network list, filter by code= and open the request whose address starts with com.bosch.tt.dashtt.pointt://app/login?code=",
58
- "Copy that whole address, or only the code, and paste it in the box under the sign-in button.",
59
- "On a phone the same redirect fails unless the Bosch app is installed. Use a desktop browser to copy the code."
60
- ].join("\n\n");
54
+ var HOMECOM_CODE_HELP = "If the page does not finish, copy the address it stops on (it starts with com.bosch.tt.dashtt.pointt://app/login?code=) or only the code, and paste it in the box under the sign-in button.";
61
55
  function buildHomeComFormSchema() {
62
56
  return { sections: [{
63
57
  id: "account",
64
58
  title: "HomeCom account",
65
59
  titleKey: "provider-bosch:homecom.s_account.title",
66
- description: "Sign in with your SingleKey ID. Copy the code as described below, then paste it here.",
60
+ description: "Sign in with your SingleKey ID. A new tab opens the sign-in page through this hub and finishes on its own.",
67
61
  descriptionKey: "provider-bosch:homecom.s_account.description",
68
62
  columns: 1,
69
63
  fields: [
@@ -83,6 +77,7 @@ function buildHomeComFormSchema() {
83
77
  providerLabel: "SingleKey ID",
84
78
  beginAction: "beginSignIn",
85
79
  completeAction: "finishSignIn",
80
+ claimAction: "claimSignIn",
86
81
  signOutAction: "signOut",
87
82
  accountKey: "accountLabel",
88
83
  countKey: "gatewayCount",
@@ -225,6 +220,27 @@ var homeComActions = require_dist.defineCustomActions({
225
220
  kind: "mutation",
226
221
  auth: "admin"
227
222
  }),
223
+ /**
224
+ * The form asks while the proxied login page is open: `pending` until the hub captured the
225
+ * app-scheme redirect and finished the exchange, then the same fields `finishSignIn` returns.
226
+ * Claimed once. A failed exchange answers with its operator-facing message as an error.
227
+ */
228
+ claimSignIn: require_dist.customAction(require_dist.object({ attemptId: require_dist.string().min(1) }), require_dist.object({
229
+ pending: require_dist.boolean(),
230
+ token: require_dist.string().optional().meta({ secret: true }),
231
+ refresh: require_dist.string().optional().meta({ secret: true }),
232
+ username: require_dist.string().optional().meta({ secret: true }),
233
+ accountLabel: require_dist.string().optional(),
234
+ gatewayCount: require_dist.number().optional(),
235
+ summary: require_dist.string().optional(),
236
+ gatewayId: require_dist.string().optional(),
237
+ brand: HomeComBrandSchema.optional(),
238
+ region: HomeComRegionSchema.optional(),
239
+ choices: require_dist.array(gatewayChoice).optional()
240
+ }), {
241
+ kind: "mutation",
242
+ auth: "admin"
243
+ }),
228
244
  signOut: require_dist.customAction(require_dist.object({}), require_dist.object({
229
245
  signedOut: require_dist.literal(true),
230
246
  summary: require_dist.string()
@@ -1215,6 +1231,37 @@ function finishedFromGateways(tokens, resolved, listFailure) {
1215
1231
  }
1216
1232
  var homeComSignInAttempts = require_account_integration_offline.createSignInAttemptStore();
1217
1233
  //#endregion
1234
+ //#region src/homecom/homecom-sign-in-proxy.ts
1235
+ /** SingleKey ID serves the whole HomeCom login. (Not verified against the live pages: no vendor credentials.) */
1236
+ var HOMECOM_LOGIN_HOSTS = ["singlekey-id.com"];
1237
+ var HOMECOM_APP_SCHEME = HOMECOM_REDIRECT_URI.slice(0, HOMECOM_REDIRECT_URI.indexOf("://") + 3);
1238
+ var homeComSignInClaims = require_account_integration_offline.createSignInClaims();
1239
+ /** Start an attempt whose `authorizeUrl` is the hub-relative proxied login page. */
1240
+ function beginHomeComProxiedSignIn(deps) {
1241
+ const nowMs = deps.nowMs ?? (() => Date.now());
1242
+ const published = publishHomeComSignIn(homeComSignInAttempts, nowMs());
1243
+ if (deps.proxy === null) return published;
1244
+ const entry = require_account_integration_offline.openSignInProxy({
1245
+ proxy: deps.proxy,
1246
+ claims: homeComSignInClaims,
1247
+ addonId: deps.addonId,
1248
+ attemptId: published.attemptId,
1249
+ authorizeUrl: published.authorizeUrl,
1250
+ hosts: HOMECOM_LOGIN_HOSTS,
1251
+ appScheme: HOMECOM_APP_SCHEME,
1252
+ finish: (callback) => finishHomeComSignIn({
1253
+ attemptId: published.attemptId,
1254
+ callback,
1255
+ nowMs: nowMs()
1256
+ }, homeComSignInAttempts, deps.fetchFn !== void 0 ? { fetchFn: deps.fetchFn } : {}),
1257
+ nowMs
1258
+ });
1259
+ return {
1260
+ attemptId: published.attemptId,
1261
+ authorizeUrl: entry
1262
+ };
1263
+ }
1264
+ //#endregion
1218
1265
  //#region src/homecom/homecom-token-persist.ts
1219
1266
  function unreadable(value) {
1220
1267
  return require_dist.isSecretMarker(value) || require_dist.isSecretMarkerLike(value);
@@ -2024,11 +2071,14 @@ var BoschHomeComProviderAddon = class extends require_dist.BaseDeviceProvider {
2024
2071
  [require_dist.DeviceType.WaterHeater]: HomeComWaterHeaterDevice
2025
2072
  };
2026
2073
  clients = null;
2074
+ loginProxy = null;
2075
+ loginPlane = null;
2027
2076
  constructor() {
2028
2077
  super({});
2029
2078
  }
2030
2079
  async onInitialize() {
2031
2080
  const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
2081
+ await this.serveLoginProxy();
2032
2082
  const persistDeps = {
2033
2083
  getSettings: (id) => this.ctx.api.integrations.getSettings.query({ id }),
2034
2084
  setSettings: (input) => this.ctx.api.integrations.setSettings.mutate(input),
@@ -2063,9 +2113,19 @@ var BoschHomeComProviderAddon = class extends require_dist.BaseDeviceProvider {
2063
2113
  customActions: homeComActions,
2064
2114
  actionHandlers: {
2065
2115
  beginSignIn: async () => ({
2066
- ...publishHomeComSignIn(homeComSignInAttempts, Date.now()),
2067
- summary: "Open the link in a browser and sign in."
2116
+ ...beginHomeComProxiedSignIn({
2117
+ proxy: this.loginProxy,
2118
+ addonId: this.ctx.id
2119
+ }),
2120
+ summary: "Open the sign-in page and sign in."
2068
2121
  }),
2122
+ claimSignIn: async (input) => {
2123
+ const claim = homeComSignInClaims.claim(input.attemptId, Date.now());
2124
+ return claim.state === "pending" ? { pending: true } : {
2125
+ pending: false,
2126
+ ...claim.result
2127
+ };
2128
+ },
2069
2129
  finishSignIn: async (input) => finishHomeComSignIn({
2070
2130
  attemptId: input.attemptId,
2071
2131
  callback: input.callback,
@@ -2078,7 +2138,27 @@ var BoschHomeComProviderAddon = class extends require_dist.BaseDeviceProvider {
2078
2138
  }
2079
2139
  };
2080
2140
  }
2141
+ /** The hub's HTTPS face for the vendor's login pages (D955): admin session only. */
2142
+ async serveLoginProxy() {
2143
+ const proxy = new require_dist.VendorLoginProxy({
2144
+ addonId: this.ctx.id,
2145
+ logger: this.ctx.logger
2146
+ });
2147
+ try {
2148
+ this.loginPlane = await this.ctx.dataPlane?.serve({
2149
+ prefix: "vendor-login",
2150
+ access: "admin",
2151
+ handler: proxy.handler
2152
+ }) ?? null;
2153
+ if (this.loginPlane !== null) this.loginProxy = proxy;
2154
+ } catch (err) {
2155
+ this.ctx.logger.warn("HomeCom login proxy failed to serve — sign-in falls back to paste", { meta: { error: require_dist.errMsg(err) } });
2156
+ }
2157
+ }
2081
2158
  async onShutdown() {
2159
+ await this.loginPlane?.dispose().catch(() => void 0);
2160
+ this.loginPlane = null;
2161
+ this.loginProxy = null;
2082
2162
  try {
2083
2163
  await this.clients?.shutdown();
2084
2164
  } catch (err) {
@@ -1,5 +1,5 @@
1
- import { A as isSecretMarker, C as waterHeaterCapability, E as errMsg, F as number, I as object, M as _enum, N as array, O as customAction, P as literal, R as string, T as DeviceType, V as EventCategory, c as connectionTestCapability, j as isSecretMarkerLike, k as defineCustomActions, n as BaseDeviceProvider, s as climateControlCapability, t as BaseDevice, u as deviceAdoptionCapability } from "../dist-DzSesBKb.mjs";
2
- import { a as parseOAuthCallback, i as loginFailureForAttempt, n as cascadeRemoveDevicesForIntegration, r as createSignInAttemptStore, t as setIntegrationDevicesOnline } from "../account-integration-offline-C-XbrgLs.mjs";
1
+ import { A as customAction, D as DeviceType, F as array, I as boolean, L as literal, M as isSecretMarker, N as isSecretMarkerLike, O as errMsg, P as _enum, R as number, T as waterHeaterCapability, V as string, W as EventCategory, f as deviceAdoptionCapability, j as defineCustomActions, l as climateControlCapability, n as BaseDeviceProvider, o as VendorLoginProxy, t as BaseDevice, u as connectionTestCapability, z as object } from "../dist-DxO4cucS.mjs";
2
+ import { a as createSignInAttemptStore, i as openSignInProxy, n as cascadeRemoveDevicesForIntegration, o as loginFailureForAttempt, r as createSignInClaims, s as parseOAuthCallback, t as setIntegrationDevicesOnline } from "../account-integration-offline-Cfcp8s5x.mjs";
3
3
  import { createHash, randomBytes } from "node:crypto";
4
4
  //#region src/homecom/config.ts
5
5
  var HOMECOM_BRANDS = ["bosch", "buderus"];
@@ -50,19 +50,13 @@ var HIDDEN_UNTIL_ADVANCED = {
50
50
  field: "__hidden__",
51
51
  equals: "yes"
52
52
  };
53
- var HOMECOM_CODE_HELP = [
54
- "Before you sign in, open the browser's developer tools, choose the Network tab, and turn on Preserve log.",
55
- "Sign in with SingleKey. The page will say it has network problems. Ignore that: the browser tried to open the Bosch app and could not.",
56
- "In the Network list, filter by code= and open the request whose address starts with com.bosch.tt.dashtt.pointt://app/login?code=",
57
- "Copy that whole address, or only the code, and paste it in the box under the sign-in button.",
58
- "On a phone the same redirect fails unless the Bosch app is installed. Use a desktop browser to copy the code."
59
- ].join("\n\n");
53
+ var HOMECOM_CODE_HELP = "If the page does not finish, copy the address it stops on (it starts with com.bosch.tt.dashtt.pointt://app/login?code=) or only the code, and paste it in the box under the sign-in button.";
60
54
  function buildHomeComFormSchema() {
61
55
  return { sections: [{
62
56
  id: "account",
63
57
  title: "HomeCom account",
64
58
  titleKey: "provider-bosch:homecom.s_account.title",
65
- description: "Sign in with your SingleKey ID. Copy the code as described below, then paste it here.",
59
+ description: "Sign in with your SingleKey ID. A new tab opens the sign-in page through this hub and finishes on its own.",
66
60
  descriptionKey: "provider-bosch:homecom.s_account.description",
67
61
  columns: 1,
68
62
  fields: [
@@ -82,6 +76,7 @@ function buildHomeComFormSchema() {
82
76
  providerLabel: "SingleKey ID",
83
77
  beginAction: "beginSignIn",
84
78
  completeAction: "finishSignIn",
79
+ claimAction: "claimSignIn",
85
80
  signOutAction: "signOut",
86
81
  accountKey: "accountLabel",
87
82
  countKey: "gatewayCount",
@@ -224,6 +219,27 @@ var homeComActions = defineCustomActions({
224
219
  kind: "mutation",
225
220
  auth: "admin"
226
221
  }),
222
+ /**
223
+ * The form asks while the proxied login page is open: `pending` until the hub captured the
224
+ * app-scheme redirect and finished the exchange, then the same fields `finishSignIn` returns.
225
+ * Claimed once. A failed exchange answers with its operator-facing message as an error.
226
+ */
227
+ claimSignIn: customAction(object({ attemptId: string().min(1) }), object({
228
+ pending: boolean(),
229
+ token: string().optional().meta({ secret: true }),
230
+ refresh: string().optional().meta({ secret: true }),
231
+ username: string().optional().meta({ secret: true }),
232
+ accountLabel: string().optional(),
233
+ gatewayCount: number().optional(),
234
+ summary: string().optional(),
235
+ gatewayId: string().optional(),
236
+ brand: HomeComBrandSchema.optional(),
237
+ region: HomeComRegionSchema.optional(),
238
+ choices: array(gatewayChoice).optional()
239
+ }), {
240
+ kind: "mutation",
241
+ auth: "admin"
242
+ }),
227
243
  signOut: customAction(object({}), object({
228
244
  signedOut: literal(true),
229
245
  summary: string()
@@ -1214,6 +1230,37 @@ function finishedFromGateways(tokens, resolved, listFailure) {
1214
1230
  }
1215
1231
  var homeComSignInAttempts = createSignInAttemptStore();
1216
1232
  //#endregion
1233
+ //#region src/homecom/homecom-sign-in-proxy.ts
1234
+ /** SingleKey ID serves the whole HomeCom login. (Not verified against the live pages: no vendor credentials.) */
1235
+ var HOMECOM_LOGIN_HOSTS = ["singlekey-id.com"];
1236
+ var HOMECOM_APP_SCHEME = HOMECOM_REDIRECT_URI.slice(0, HOMECOM_REDIRECT_URI.indexOf("://") + 3);
1237
+ var homeComSignInClaims = createSignInClaims();
1238
+ /** Start an attempt whose `authorizeUrl` is the hub-relative proxied login page. */
1239
+ function beginHomeComProxiedSignIn(deps) {
1240
+ const nowMs = deps.nowMs ?? (() => Date.now());
1241
+ const published = publishHomeComSignIn(homeComSignInAttempts, nowMs());
1242
+ if (deps.proxy === null) return published;
1243
+ const entry = openSignInProxy({
1244
+ proxy: deps.proxy,
1245
+ claims: homeComSignInClaims,
1246
+ addonId: deps.addonId,
1247
+ attemptId: published.attemptId,
1248
+ authorizeUrl: published.authorizeUrl,
1249
+ hosts: HOMECOM_LOGIN_HOSTS,
1250
+ appScheme: HOMECOM_APP_SCHEME,
1251
+ finish: (callback) => finishHomeComSignIn({
1252
+ attemptId: published.attemptId,
1253
+ callback,
1254
+ nowMs: nowMs()
1255
+ }, homeComSignInAttempts, deps.fetchFn !== void 0 ? { fetchFn: deps.fetchFn } : {}),
1256
+ nowMs
1257
+ });
1258
+ return {
1259
+ attemptId: published.attemptId,
1260
+ authorizeUrl: entry
1261
+ };
1262
+ }
1263
+ //#endregion
1217
1264
  //#region src/homecom/homecom-token-persist.ts
1218
1265
  function unreadable(value) {
1219
1266
  return isSecretMarker(value) || isSecretMarkerLike(value);
@@ -2023,11 +2070,14 @@ var BoschHomeComProviderAddon = class extends BaseDeviceProvider {
2023
2070
  [DeviceType.WaterHeater]: HomeComWaterHeaterDevice
2024
2071
  };
2025
2072
  clients = null;
2073
+ loginProxy = null;
2074
+ loginPlane = null;
2026
2075
  constructor() {
2027
2076
  super({});
2028
2077
  }
2029
2078
  async onInitialize() {
2030
2079
  const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
2080
+ await this.serveLoginProxy();
2031
2081
  const persistDeps = {
2032
2082
  getSettings: (id) => this.ctx.api.integrations.getSettings.query({ id }),
2033
2083
  setSettings: (input) => this.ctx.api.integrations.setSettings.mutate(input),
@@ -2062,9 +2112,19 @@ var BoschHomeComProviderAddon = class extends BaseDeviceProvider {
2062
2112
  customActions: homeComActions,
2063
2113
  actionHandlers: {
2064
2114
  beginSignIn: async () => ({
2065
- ...publishHomeComSignIn(homeComSignInAttempts, Date.now()),
2066
- summary: "Open the link in a browser and sign in."
2115
+ ...beginHomeComProxiedSignIn({
2116
+ proxy: this.loginProxy,
2117
+ addonId: this.ctx.id
2118
+ }),
2119
+ summary: "Open the sign-in page and sign in."
2067
2120
  }),
2121
+ claimSignIn: async (input) => {
2122
+ const claim = homeComSignInClaims.claim(input.attemptId, Date.now());
2123
+ return claim.state === "pending" ? { pending: true } : {
2124
+ pending: false,
2125
+ ...claim.result
2126
+ };
2127
+ },
2068
2128
  finishSignIn: async (input) => finishHomeComSignIn({
2069
2129
  attemptId: input.attemptId,
2070
2130
  callback: input.callback,
@@ -2077,7 +2137,27 @@ var BoschHomeComProviderAddon = class extends BaseDeviceProvider {
2077
2137
  }
2078
2138
  };
2079
2139
  }
2140
+ /** The hub's HTTPS face for the vendor's login pages (D955): admin session only. */
2141
+ async serveLoginProxy() {
2142
+ const proxy = new VendorLoginProxy({
2143
+ addonId: this.ctx.id,
2144
+ logger: this.ctx.logger
2145
+ });
2146
+ try {
2147
+ this.loginPlane = await this.ctx.dataPlane?.serve({
2148
+ prefix: "vendor-login",
2149
+ access: "admin",
2150
+ handler: proxy.handler
2151
+ }) ?? null;
2152
+ if (this.loginPlane !== null) this.loginProxy = proxy;
2153
+ } catch (err) {
2154
+ this.ctx.logger.warn("HomeCom login proxy failed to serve — sign-in falls back to paste", { meta: { error: errMsg(err) } });
2155
+ }
2156
+ }
2080
2157
  async onShutdown() {
2158
+ await this.loginPlane?.dispose().catch(() => void 0);
2159
+ this.loginPlane = null;
2160
+ this.loginProxy = null;
2081
2161
  try {
2082
2162
  await this.clients?.shutdown();
2083
2163
  } catch (err) {
package/dist/shc/addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region \0rolldown/runtime.js
3
3
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
4
4
  //#endregion
5
- const require_dist = require("../dist-CyLs51d2.js");
5
+ const require_dist = require("../dist-NdDwxHvT.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_https = require("node:https");
8
8
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { E as errMsg, F as number, I as object, M as _enum, N as array, O as customAction, P as literal, R as string, S as temperatureSensorCapability, T as DeviceType, V as EventCategory, a as batteryCapability, c as connectionTestCapability, k as defineCustomActions, m as heatingValveCapability, n as BaseDeviceProvider, s as climateControlCapability, t as BaseDevice, u as deviceAdoptionCapability, x as switchCapability } from "../dist-DzSesBKb.mjs";
1
+ import { A as customAction, C as switchCapability, D as DeviceType, F as array, L as literal, O as errMsg, P as _enum, R as number, V as string, W as EventCategory, f as deviceAdoptionCapability, g as heatingValveCapability, j as defineCustomActions, l as climateControlCapability, n as BaseDeviceProvider, s as batteryCapability, t as BaseDevice, u as connectionTestCapability, w as temperatureSensorCapability, z as object } from "../dist-DxO4cucS.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { request } from "node:https";
package/i18n/en.json CHANGED
@@ -33,5 +33,18 @@
33
33
  "shc.s_connection.sslCertificate.label": "Client certificate (PEM)",
34
34
  "shc.s_connection.sslKey.label": "Client private key (PEM)",
35
35
  "homecom.s_account.__homecom-code-help.label": "Before you sign in, open the browser's developer tools, choose the Network tab, and turn on Preserve log.\n\nSign in with SingleKey. The page will say it has network problems. Ignore that: the browser tried to open the Bosch app and could not.\n\nIn the Network list, filter by code= and open the request whose address starts with com.bosch.tt.dashtt.pointt://app/login?code=\n\nCopy that whole address, or only the code, and paste it in the box under the sign-in button.\n\nOn a phone the same redirect fails unless the Bosch app is installed. Use a desktop browser to copy the code.",
36
- "homecom.s_account.gatewayId.description": "Filled from the account. Type one only when you need to override the choice."
36
+ "homecom.s_account.gatewayId.description": "Filled from the account. Type one only when you need to override the choice.",
37
+ "homecom": {
38
+ "s_account": {
39
+ "description": "Sign in with your SingleKey ID. A new tab opens the sign-in page through this hub and finishes on its own.",
40
+ "__homecom-code-help": {
41
+ "label": "If the page does not finish, copy the address it stops on (it starts with com.bosch.tt.dashtt.pointt://app/login?code=) or only the code, and paste it in the box under the sign-in button."
42
+ }
43
+ }
44
+ },
45
+ "home-connect": {
46
+ "s_gateway": {
47
+ "description": "Sign in with your Home Connect account. A new tab opens the sign-in page through this hub and finishes on its own."
48
+ }
49
+ }
37
50
  }
package/i18n/it.json CHANGED
@@ -33,5 +33,18 @@
33
33
  "shc.s_connection.sslCertificate.label": "Certificato client (PEM)",
34
34
  "shc.s_connection.sslKey.label": "Chiave privata client (PEM)",
35
35
  "homecom.s_account.__homecom-code-help.label": "Prima di accedere, apri gli strumenti per sviluppatori del browser, scegli la scheda Rete (Network) e attiva \"Conserva registro\" (Preserve log).\n\nAccedi con SingleKey. La pagina dirà che ci sono problemi di rete. Ignoralo: il browser ha provato ad aprire l'app Bosch e non c'è riuscito.\n\nNell'elenco Rete filtra per code= e apri la richiesta il cui indirizzo inizia con com.bosch.tt.dashtt.pointt://app/login?code=\n\nCopia l'indirizzo intero, oppure solo il codice, e incollalo nella casella sotto il pulsante di accesso.\n\nSu un telefono lo stesso reindirizzamento fallisce se l'app Bosch non è installata. Per copiare il codice usa un browser da computer.",
36
- "homecom.s_account.gatewayId.description": "Compilato dall'account. Scrivilo solo se devi sostituire la scelta."
36
+ "homecom.s_account.gatewayId.description": "Compilato dall'account. Scrivilo solo se devi sostituire la scelta.",
37
+ "homecom": {
38
+ "s_account": {
39
+ "description": "Accedi con il tuo SingleKey ID. Si apre una nuova scheda con la pagina di accesso tramite questo hub e si conclude da sola.",
40
+ "__homecom-code-help": {
41
+ "label": "Se la pagina non si conclude, copia l indirizzo su cui si ferma (inizia con com.bosch.tt.dashtt.pointt://app/login?code=) oppure solo il codice, e incollalo nel riquadro sotto il pulsante di accesso."
42
+ }
43
+ }
44
+ },
45
+ "home-connect": {
46
+ "s_gateway": {
47
+ "description": "Accedi con il tuo account Home Connect. Si apre una nuova scheda con la pagina di accesso tramite questo hub e si conclude da sola."
48
+ }
49
+ }
37
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-bosch",
3
- "version": "0.1.29",
3
+ "version": "0.1.31",
4
4
  "description": "Bosch smart-home device-provider addons for CamStack — SHC, Home Connect, and HomeCom cloud integrations (scaffold)",
5
5
  "keywords": [
6
6
  "camstack",