@camstack/addon-model-studio 1.1.196 → 1.1.197

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 (18) hide show
  1. package/dist/{MotionZonesSettings-DYN6D3Q3.mjs → MotionZonesSettings-DIAS97XV.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-D8ePv2JK.mjs → PrivacyMaskSettings-CR0wm2KE.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-DnOFRC20.mjs → SceneMonitorEditor-dndfg_N0.mjs} +3 -3
  4. package/dist/_stub.js +103 -101
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DXaNF8pe.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-pmSIvMZU.mjs} +3 -3
  6. package/dist/{_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-wNBuLHob.mjs → _virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Bcj2hbYh.mjs} +1 -1
  7. package/dist/addon-model-studio.css +1 -1
  8. package/dist/{hostInit-DF-H_MgC.mjs → hostInit-B9M5jUv-.mjs} +2 -2
  9. package/dist/model-studio.addon.js +96 -4
  10. package/dist/model-studio.addon.mjs +96 -4
  11. package/dist/{player-overlays-1iZVpnxF.mjs → player-overlays-ix8x5U90.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-Cpl8e10S.mjs → responsive-BwxseiFn.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-D5NESGG4.mjs → scene-monitor-copy-Bms7Fr1m.mjs} +1 -1
  15. package/dist/{square-Do07uow8.mjs → square-uLikrWEJ.mjs} +1 -1
  16. package/dist/{trash-2-JIHOLs10.mjs → trash-2-DTFf75_K.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Cb6JeXV8.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Ctu9_6pr.mjs} +1 -1
  18. package/package.json +1 -1
@@ -5950,7 +5950,7 @@ var ZodIssueCode = {
5950
5950
  var ZodFirstPartyTypeKind;
5951
5951
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5952
5952
  //#endregion
5953
- //#region ../types/dist/sleep-CDCONfkt.mjs
5953
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
5954
5954
  /**
5955
5955
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5956
5956
  * window to float samples (D455).
@@ -6258,6 +6258,43 @@ function hydrateField(field, values) {
6258
6258
  }
6259
6259
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
6260
6260
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
6261
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
6262
+ const from = values[field.suggestionsFrom];
6263
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
6264
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
6265
+ return {
6266
+ ...field,
6267
+ suggestions: merged,
6268
+ value
6269
+ };
6270
+ }
6271
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
6272
+ const from = values[field.optionsFrom];
6273
+ const byValue = /* @__PURE__ */ new Map();
6274
+ for (const opt of field.options) byValue.set(opt.value, opt);
6275
+ if (Array.isArray(from)) for (const entry of from) {
6276
+ if (typeof entry === "string" && entry.length > 0) {
6277
+ if (!byValue.has(entry)) byValue.set(entry, {
6278
+ value: entry,
6279
+ label: entry
6280
+ });
6281
+ continue;
6282
+ }
6283
+ if (entry === null || typeof entry !== "object") continue;
6284
+ const v = Reflect.get(entry, "value");
6285
+ const lbl = Reflect.get(entry, "label");
6286
+ if (typeof v !== "string" || v.length === 0) continue;
6287
+ if (!byValue.has(v)) byValue.set(v, {
6288
+ value: v,
6289
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
6290
+ });
6291
+ }
6292
+ return {
6293
+ ...field,
6294
+ options: [...byValue.values()],
6295
+ value
6296
+ };
6297
+ }
6261
6298
  return {
6262
6299
  ...field,
6263
6300
  value
@@ -18212,10 +18249,35 @@ var SendResultSchema = object({
18212
18249
  });
18213
18250
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
18214
18251
  var TestResultSchema = SendResultSchema;
18215
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
18252
+ /**
18253
+ * Pre-save credential probe against a partial (unsaved) target config.
18254
+ * `resolvedUrl` never includes secrets (token stripped from path).
18255
+ */
18256
+ var ProbeTargetConfigResultSchema = object({
18257
+ ok: boolean(),
18258
+ resolvedUrl: string(),
18259
+ httpStatus: number().int().optional(),
18260
+ stateInstance: string().optional(),
18261
+ error: string().optional()
18262
+ });
18263
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
18216
18264
  kind: string(),
18217
- config: record(string(), unknown()).optional()
18265
+ config: record(string(), unknown()).optional(),
18266
+ /**
18267
+ * When editing / duplicating, the blank password field never round-trips
18268
+ * the stored token. Pass the source target id so the provider can restore
18269
+ * secrets server-side before dialling (same merge as upsert).
18270
+ */
18271
+ targetId: string().optional()
18218
18272
  }), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
18273
+ kind: string(),
18274
+ config: record(string(), unknown()),
18275
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
18276
+ targetId: string().optional()
18277
+ }), ProbeTargetConfigResultSchema, {
18278
+ kind: "mutation",
18279
+ auth: "admin"
18280
+ }), method(object({
18219
18281
  targetId: string(),
18220
18282
  notification: NotificationSchema
18221
18283
  }), SendResultSchema, {
@@ -18227,7 +18289,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
18227
18289
  }), TestResultSchema, {
18228
18290
  kind: "mutation",
18229
18291
  auth: "admin"
18230
- }), method(object({ target: TargetSchema }), TargetSchema, {
18292
+ }), method(object({
18293
+ target: TargetSchema,
18294
+ /**
18295
+ * Duplicate flow: create a NEW target id while copying secrets from an
18296
+ * existing row. The UI never holds the stored token; blank / redacted
18297
+ * password fields are restored from this source (D634 still applies if
18298
+ * destinations diverge without a re-typed secret).
18299
+ */
18300
+ cloneSecretsFrom: string().optional()
18301
+ }), TargetSchema, {
18231
18302
  kind: "mutation",
18232
18303
  auth: "admin"
18233
18304
  }), method(object({ targetId: string() }), _void(), {
@@ -18864,6 +18935,15 @@ var AlarmArmModeSchema = _enum([
18864
18935
  object({
18865
18936
  /** Current lifecycle state. */
18866
18937
  state: AlarmStateSchema,
18938
+ /**
18939
+ * The arm mode the machine belongs to under transitional words
18940
+ * (`arming` / `pending` / `triggered` / `disarming`). `null` when
18941
+ * disarmed or when a provider cannot name one. Exporters MUST prefer
18942
+ * this over an in-process memo — a HomeKit accessory that missed the
18943
+ * settled `armed_*` slice used to map `pending` to DISARMED and hide
18944
+ * an entry delay.
18945
+ */
18946
+ targetMode: AlarmArmModeSchema.nullable().optional(),
18867
18947
  /** Subset of arm modes the panel accepts. UI renders one button per
18868
18948
  * mode in this list. */
18869
18949
  availableModes: array(AlarmArmModeSchema),
@@ -40262,6 +40342,12 @@ Object.freeze({
40262
40342
  addonId: null,
40263
40343
  access: "view"
40264
40344
  },
40345
+ "notificationOutput.getTarget": {
40346
+ capName: "notification-output",
40347
+ capScope: "system",
40348
+ addonId: null,
40349
+ access: "view"
40350
+ },
40265
40351
  "notificationOutput.listTargetKinds": {
40266
40352
  capName: "notification-output",
40267
40353
  capScope: "system",
@@ -40274,6 +40360,12 @@ Object.freeze({
40274
40360
  addonId: null,
40275
40361
  access: "view"
40276
40362
  },
40363
+ "notificationOutput.probeTargetConfig": {
40364
+ capName: "notification-output",
40365
+ capScope: "system",
40366
+ addonId: null,
40367
+ access: "create"
40368
+ },
40277
40369
  "notificationOutput.send": {
40278
40370
  capName: "notification-output",
40279
40371
  capScope: "system",
@@ -5929,7 +5929,7 @@ var ZodIssueCode = {
5929
5929
  var ZodFirstPartyTypeKind;
5930
5930
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5931
5931
  //#endregion
5932
- //#region ../types/dist/sleep-CDCONfkt.mjs
5932
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
5933
5933
  /**
5934
5934
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5935
5935
  * window to float samples (D455).
@@ -6237,6 +6237,43 @@ function hydrateField(field, values) {
6237
6237
  }
6238
6238
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
6239
6239
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
6240
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
6241
+ const from = values[field.suggestionsFrom];
6242
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
6243
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
6244
+ return {
6245
+ ...field,
6246
+ suggestions: merged,
6247
+ value
6248
+ };
6249
+ }
6250
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
6251
+ const from = values[field.optionsFrom];
6252
+ const byValue = /* @__PURE__ */ new Map();
6253
+ for (const opt of field.options) byValue.set(opt.value, opt);
6254
+ if (Array.isArray(from)) for (const entry of from) {
6255
+ if (typeof entry === "string" && entry.length > 0) {
6256
+ if (!byValue.has(entry)) byValue.set(entry, {
6257
+ value: entry,
6258
+ label: entry
6259
+ });
6260
+ continue;
6261
+ }
6262
+ if (entry === null || typeof entry !== "object") continue;
6263
+ const v = Reflect.get(entry, "value");
6264
+ const lbl = Reflect.get(entry, "label");
6265
+ if (typeof v !== "string" || v.length === 0) continue;
6266
+ if (!byValue.has(v)) byValue.set(v, {
6267
+ value: v,
6268
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
6269
+ });
6270
+ }
6271
+ return {
6272
+ ...field,
6273
+ options: [...byValue.values()],
6274
+ value
6275
+ };
6276
+ }
6240
6277
  return {
6241
6278
  ...field,
6242
6279
  value
@@ -18191,10 +18228,35 @@ var SendResultSchema = object({
18191
18228
  });
18192
18229
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
18193
18230
  var TestResultSchema = SendResultSchema;
18194
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
18231
+ /**
18232
+ * Pre-save credential probe against a partial (unsaved) target config.
18233
+ * `resolvedUrl` never includes secrets (token stripped from path).
18234
+ */
18235
+ var ProbeTargetConfigResultSchema = object({
18236
+ ok: boolean(),
18237
+ resolvedUrl: string(),
18238
+ httpStatus: number().int().optional(),
18239
+ stateInstance: string().optional(),
18240
+ error: string().optional()
18241
+ });
18242
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
18195
18243
  kind: string(),
18196
- config: record(string(), unknown()).optional()
18244
+ config: record(string(), unknown()).optional(),
18245
+ /**
18246
+ * When editing / duplicating, the blank password field never round-trips
18247
+ * the stored token. Pass the source target id so the provider can restore
18248
+ * secrets server-side before dialling (same merge as upsert).
18249
+ */
18250
+ targetId: string().optional()
18197
18251
  }), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
18252
+ kind: string(),
18253
+ config: record(string(), unknown()),
18254
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
18255
+ targetId: string().optional()
18256
+ }), ProbeTargetConfigResultSchema, {
18257
+ kind: "mutation",
18258
+ auth: "admin"
18259
+ }), method(object({
18198
18260
  targetId: string(),
18199
18261
  notification: NotificationSchema
18200
18262
  }), SendResultSchema, {
@@ -18206,7 +18268,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
18206
18268
  }), TestResultSchema, {
18207
18269
  kind: "mutation",
18208
18270
  auth: "admin"
18209
- }), method(object({ target: TargetSchema }), TargetSchema, {
18271
+ }), method(object({
18272
+ target: TargetSchema,
18273
+ /**
18274
+ * Duplicate flow: create a NEW target id while copying secrets from an
18275
+ * existing row. The UI never holds the stored token; blank / redacted
18276
+ * password fields are restored from this source (D634 still applies if
18277
+ * destinations diverge without a re-typed secret).
18278
+ */
18279
+ cloneSecretsFrom: string().optional()
18280
+ }), TargetSchema, {
18210
18281
  kind: "mutation",
18211
18282
  auth: "admin"
18212
18283
  }), method(object({ targetId: string() }), _void(), {
@@ -18843,6 +18914,15 @@ var AlarmArmModeSchema = _enum([
18843
18914
  object({
18844
18915
  /** Current lifecycle state. */
18845
18916
  state: AlarmStateSchema,
18917
+ /**
18918
+ * The arm mode the machine belongs to under transitional words
18919
+ * (`arming` / `pending` / `triggered` / `disarming`). `null` when
18920
+ * disarmed or when a provider cannot name one. Exporters MUST prefer
18921
+ * this over an in-process memo — a HomeKit accessory that missed the
18922
+ * settled `armed_*` slice used to map `pending` to DISARMED and hide
18923
+ * an entry delay.
18924
+ */
18925
+ targetMode: AlarmArmModeSchema.nullable().optional(),
18846
18926
  /** Subset of arm modes the panel accepts. UI renders one button per
18847
18927
  * mode in this list. */
18848
18928
  availableModes: array(AlarmArmModeSchema),
@@ -40241,6 +40321,12 @@ Object.freeze({
40241
40321
  addonId: null,
40242
40322
  access: "view"
40243
40323
  },
40324
+ "notificationOutput.getTarget": {
40325
+ capName: "notification-output",
40326
+ capScope: "system",
40327
+ addonId: null,
40328
+ access: "view"
40329
+ },
40244
40330
  "notificationOutput.listTargetKinds": {
40245
40331
  capName: "notification-output",
40246
40332
  capScope: "system",
@@ -40253,6 +40339,12 @@ Object.freeze({
40253
40339
  addonId: null,
40254
40340
  access: "view"
40255
40341
  },
40342
+ "notificationOutput.probeTargetConfig": {
40343
+ capName: "notification-output",
40344
+ capScope: "system",
40345
+ addonId: null,
40346
+ access: "create"
40347
+ },
40256
40348
  "notificationOutput.send": {
40257
40349
  capName: "notification-output",
40258
40350
  capScope: "system",
@@ -1,5 +1,5 @@
1
1
  import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
- import { o as i, s as a } from "./responsive-Cpl8e10S.mjs";
2
+ import { o as i, s as a } from "./responsive-BwxseiFn.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
4
4
  var l = a("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Cb6JeXV8.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Ctu9_6pr.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { i as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-wNBuLHob.mjs";
3
+ import { i as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Bcj2hbYh.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  l();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -1,5 +1,5 @@
1
1
  import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
- import { s as i } from "./responsive-Cpl8e10S.mjs";
2
+ import { s as i } from "./responsive-BwxseiFn.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-Cpl8e10S.mjs";
1
+ import { s as e } from "./responsive-BwxseiFn.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-Cpl8e10S.mjs";
1
+ import { s as e } from "./responsive-BwxseiFn.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DXaNF8pe.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-pmSIvMZU.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-model-studio",
3
- "version": "1.1.196",
3
+ "version": "1.1.197",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",