@camstack/addon-training 0.1.21 → 0.1.22

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 (43) hide show
  1. package/dist/MaskShapeCanvas-BokARvOj.mjs +13806 -0
  2. package/dist/MotionZonesSettings-DshSNzpp.mjs +310 -0
  3. package/dist/{PrivacyMaskSettings-Bo1S23wt.mjs → PrivacyMaskSettings-DDaIx7j5.mjs} +70 -45
  4. package/dist/{SceneMonitorEditor-DnQJ7Hx3.mjs → SceneMonitorEditor-CuJ7xjyd.mjs} +311 -311
  5. package/dist/_stub.js +7257 -16783
  6. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-DQi_LrZZ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-DJDgoXBt.mjs} +2 -2
  7. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D7T4QEtw.mjs +26 -0
  8. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-BSOdwqcC.mjs +26 -0
  9. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_trpc_mf_1_client__loadShare__.js-B3rryujf.mjs +25 -0
  10. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.js-nL4MGFRP.mjs +26 -0
  11. package/dist/{_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-DeDbF7NI.mjs → _virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-BT_wL8s3.mjs} +1 -1
  12. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DDBEvLdo.mjs +26 -0
  13. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom__loadShare__.js-CK-LlgOt.mjs +26 -0
  14. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-gTIQrhKs.mjs +25 -0
  15. package/dist/{dist-BCLkrWJc.js → dist-Dd6EAdVX.js} +38 -1
  16. package/dist/{dist-BSYBh1ZO.mjs → dist-DhCvklZW.mjs} +38 -1
  17. package/dist/{hostInit-Bx2a8M7w.mjs → hostInit-DR-St7pA.mjs} +1 -1
  18. package/dist/index.js +8 -1
  19. package/dist/index.mjs +7 -0
  20. package/dist/orchestrator/training.addon.js +1 -1
  21. package/dist/orchestrator/training.addon.mjs +1 -1
  22. package/dist/{player-overlays-BR2_H0wZ.mjs → player-overlays-DUZMtmvk.mjs} +10 -32
  23. package/dist/providers/modal/training-modal.addon.js +71 -92
  24. package/dist/providers/modal/training-modal.addon.mjs +71 -92
  25. package/dist/remoteEntry.js +1 -1
  26. package/dist/{responsive-emJo3EdF.mjs → responsive-C7QsFtTb.mjs} +38 -42
  27. package/dist/{scene-monitor-copy-CcQxbRXa.mjs → scene-monitor-copy-BtffdnnW.mjs} +4 -4
  28. package/dist/{square-CErp1WgN.mjs → square-e5Ytjod_.mjs} +4 -29
  29. package/dist/{trash-2-Drz0fMgI.mjs → trash-2-Clte6zIF.mjs} +1 -1
  30. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-C-uqIKLg.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-dy7yMOdw.mjs} +390 -399
  31. package/package.json +1 -1
  32. package/dist/MaskShapeCanvas-Kfg9dl6B.mjs +0 -686
  33. package/dist/MotionZonesSettings-DflIL9ss.mjs +0 -292
  34. package/dist/ReactKonva-DGuYUN0L.mjs +0 -5416
  35. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C7dks3FG.mjs +0 -26
  36. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-DpjirGmB.mjs +0 -89
  37. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_trpc_mf_1_client__loadShare__.js-CFCVuRAs.mjs +0 -58
  38. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.js-BkvDudqY.mjs +0 -62
  39. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs +0 -34
  40. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom__loadShare__.js-DAZkHxxU.mjs +0 -45
  41. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CHqN9NLt.mjs +0 -34
  42. package/dist/grid-2x2-D9syAI6z.mjs +0 -21
  43. package/dist/lib-CVGFTwe0.mjs +0 -7770
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../../dist-BCLkrWJc.js");
2
+ const require_dist = require("../../dist-Dd6EAdVX.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
5
5
  let node_crypto = require("node:crypto");
@@ -128,6 +128,43 @@ function deleteModalEntry(config, entryId) {
128
128
  }
129
129
  };
130
130
  }
131
+ function updateModalEntry(config, entryId, patch) {
132
+ const current = [...effectiveModalEntries(config)];
133
+ const index = current.findIndex((e) => e.id === entryId);
134
+ if (index < 0) return {
135
+ ok: false,
136
+ reason: "unknown-entry"
137
+ };
138
+ const prev = current[index];
139
+ const secret = patch.tokenSecret !== void 0 && patch.tokenSecret !== "" ? patch.tokenSecret : prev.tokenSecret;
140
+ current[index] = {
141
+ id: prev.id,
142
+ name: patch.name !== void 0 ? patch.name : prev.name,
143
+ tokenId: patch.tokenId !== void 0 ? patch.tokenId : prev.tokenId,
144
+ tokenSecret: secret,
145
+ environment: patch.environment !== void 0 ? patch.environment : prev.environment,
146
+ gpuType: patch.gpuType !== void 0 ? patch.gpuType : prev.gpuType,
147
+ region: patch.region !== void 0 ? patch.region : prev.region,
148
+ costCapUsd: patch.costCapUsd !== void 0 ? patch.costCapUsd : prev.costCapUsd,
149
+ maxRuntimeHours: patch.maxRuntimeHours !== void 0 ? patch.maxRuntimeHours : prev.maxRuntimeHours,
150
+ failedDatasetGraceHours: patch.failedDatasetGraceHours !== void 0 ? patch.failedDatasetGraceHours : prev.failedDatasetGraceHours
151
+ };
152
+ return {
153
+ ok: true,
154
+ entryId,
155
+ config: {
156
+ entries: current,
157
+ tokenId: "",
158
+ tokenSecret: "",
159
+ environment: config.environment ?? "",
160
+ gpuType: config.gpuType ?? DEFAULT_GPU,
161
+ region: config.region ?? "",
162
+ costCapUsd: config.costCapUsd ?? DEFAULT_COST,
163
+ maxRuntimeHours: config.maxRuntimeHours ?? DEFAULT_HOURS,
164
+ failedDatasetGraceHours: config.failedDatasetGraceHours ?? DEFAULT_GRACE
165
+ }
166
+ };
167
+ }
131
168
  /**
132
169
  * Mint a stable id for every persisted entry that lacks one. Operator-typed
133
170
  * empty ids (legacy settings UI) must never stay empty — createEntry always
@@ -359,6 +396,20 @@ var ModalTrainingProvider = class {
359
396
  configured: this.entryConfigured(entry)
360
397
  }));
361
398
  createEntry = async (input) => this.deps.createEntry(input);
399
+ updateEntry = async (input) => {
400
+ await this.deps.updateEntry(input.entryId, {
401
+ name: input.name,
402
+ ...input.tokenId !== void 0 ? { tokenId: input.tokenId } : {},
403
+ ...input.tokenSecret !== void 0 ? { tokenSecret: input.tokenSecret } : {},
404
+ ...input.environment !== void 0 ? { environment: input.environment } : {},
405
+ ...input.gpuType !== void 0 ? { gpuType: input.gpuType } : {},
406
+ ...input.region !== void 0 ? { region: input.region } : {},
407
+ ...input.costCapUsd !== void 0 ? { costCapUsd: input.costCapUsd } : {},
408
+ ...input.maxRuntimeSec !== void 0 ? { maxRuntimeHours: input.maxRuntimeSec / 3600 } : {},
409
+ ...input.failedDatasetGraceHours !== void 0 ? { failedDatasetGraceHours: input.failedDatasetGraceHours } : {}
410
+ });
411
+ return { ok: true };
412
+ };
362
413
  deleteEntry = async (input) => {
363
414
  await this.deps.deleteEntry(input.entryId);
364
415
  return { ok: true };
@@ -660,7 +711,10 @@ var ModalTrainingProvider = class {
660
711
  costCapUsd: entry.costCapUsd,
661
712
  maxRuntimeSec: Math.round(entry.maxRuntimeHours * 3600),
662
713
  failedDatasetGraceHours: entry.failedDatasetGraceHours
663
- }
714
+ },
715
+ tokenId: entry.tokenId,
716
+ environment: entry.environment,
717
+ hasTokenSecret: entry.tokenSecret.trim() !== ""
664
718
  };
665
719
  }
666
720
  requireGateway(entryId) {
@@ -88513,6 +88567,12 @@ async function fetchText(url) {
88513
88567
  var TrainingModalAddon = class extends require_dist.BaseAddon {
88514
88568
  ledgerState = null;
88515
88569
  gateways = /* @__PURE__ */ new Map();
88570
+ /**
88571
+ * Entry secrets live on `entries[id].tokenSecret` (and legacy flat
88572
+ * `tokenSecret`). Declared here — not via an editable-array form — so the
88573
+ * Training → Providers page is the only UI that edits entries.
88574
+ */
88575
+ secretStatePaths = ["entries[id].tokenSecret", "tokenSecret"];
88516
88576
  constructor() {
88517
88577
  super({
88518
88578
  entries: [],
@@ -88545,6 +88605,12 @@ var TrainingModalAddon = class extends require_dist.BaseAddon {
88545
88605
  await this.updateGlobalSettings(result.config);
88546
88606
  return { entryId: result.entryId };
88547
88607
  },
88608
+ updateEntry: async (entryId, patch) => {
88609
+ const result = updateModalEntry(this.config, entryId, patch);
88610
+ if (!result.ok) throw new Error(`cannot update entry: ${result.reason}`);
88611
+ await this.updateGlobalSettings(result.config);
88612
+ this.closeGateway(entryId);
88613
+ },
88548
88614
  deleteEntry: async (entryId) => {
88549
88615
  const result = deleteModalEntry(this.config, entryId);
88550
88616
  if (!result.ok) throw new Error(`cannot delete entry: ${result.reason}`);
@@ -88623,97 +88689,10 @@ var TrainingModalAddon = class extends require_dist.BaseAddon {
88623
88689
  }
88624
88690
  globalSettingsSchema() {
88625
88691
  return this.schema({ sections: [{
88626
- id: "entries",
88692
+ id: "providers",
88627
88693
  title: "Modal accounts",
88628
- description: "Each entry is one Modal workspace token. Create entries from the Training → Providers tab; edit credentials here. Secrets stay in the CamStack keychain.",
88629
- fields: [{
88630
- type: "editable-array",
88631
- key: "entries",
88632
- label: "Entries",
88633
- itemIdKey: "id",
88634
- /** Create only via trainingProvider.createEntry (auto id). */
88635
- maxRows: 0,
88636
- emptyMessage: "No Modal entries yet — add one from Training → Providers.",
88637
- rowTitleTemplate: "{name}",
88638
- defaultItem: {
88639
- id: "",
88640
- name: "Default",
88641
- tokenId: "",
88642
- tokenSecret: "",
88643
- environment: "",
88644
- gpuType: "L4",
88645
- region: "",
88646
- costCapUsd: 5,
88647
- maxRuntimeHours: 4,
88648
- failedDatasetGraceHours: 24
88649
- },
88650
- itemFields: [
88651
- {
88652
- type: "text",
88653
- key: "name",
88654
- label: "Name"
88655
- },
88656
- {
88657
- type: "text",
88658
- key: "tokenId",
88659
- label: "Token id",
88660
- placeholder: "ak-…"
88661
- },
88662
- {
88663
- type: "password",
88664
- key: "tokenSecret",
88665
- label: "Token secret",
88666
- showToggle: true
88667
- },
88668
- {
88669
- type: "text",
88670
- key: "environment",
88671
- label: "Environment",
88672
- description: "Leave empty for the workspace default."
88673
- },
88674
- {
88675
- type: "select",
88676
- key: "gpuType",
88677
- label: "GPU",
88678
- options: MODAL_GPUS.map((g) => ({
88679
- value: g.id,
88680
- label: `${g.label} — $${g.usdPerHour.toFixed(2)}/h`
88681
- }))
88682
- },
88683
- {
88684
- type: "select",
88685
- key: "region",
88686
- label: "Region",
88687
- options: MODAL_REGIONS.map((r) => ({
88688
- value: r.id,
88689
- label: r.label
88690
- }))
88691
- },
88692
- {
88693
- type: "number",
88694
- key: "costCapUsd",
88695
- label: "Cost cap per job (USD)",
88696
- min: .5,
88697
- step: .5
88698
- },
88699
- {
88700
- type: "number",
88701
- key: "maxRuntimeHours",
88702
- label: "Maximum runtime (hours)",
88703
- min: .5,
88704
- max: 24,
88705
- step: .5
88706
- },
88707
- {
88708
- type: "number",
88709
- key: "failedDatasetGraceHours",
88710
- label: "Keep a failed job’s dataset (hours)",
88711
- min: 0,
88712
- max: 168,
88713
- step: 1
88714
- }
88715
- ]
88716
- }]
88694
+ description: "Create and edit Modal workspace entries under Training → Providers. Credentials stay in the CamStack keychain.",
88695
+ fields: []
88717
88696
  }] });
88718
88697
  }
88719
88698
  };
@@ -1,4 +1,4 @@
1
- import { c as trainingProviderCapability, d as number, f as object, l as BaseAddon, m as string, p as record, u as boolean } from "../../dist-BSYBh1ZO.mjs";
1
+ import { c as trainingProviderCapability, d as number, f as object, l as BaseAddon, m as string, p as record, u as boolean } from "../../dist-DhCvklZW.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import path, { dirname, posix } from "node:path";
4
4
  import { createHash, createPrivateKey, createPublicKey, createSign, randomBytes, randomUUID } from "node:crypto";
@@ -156,6 +156,43 @@ function deleteModalEntry(config, entryId) {
156
156
  }
157
157
  };
158
158
  }
159
+ function updateModalEntry(config, entryId, patch) {
160
+ const current = [...effectiveModalEntries(config)];
161
+ const index = current.findIndex((e) => e.id === entryId);
162
+ if (index < 0) return {
163
+ ok: false,
164
+ reason: "unknown-entry"
165
+ };
166
+ const prev = current[index];
167
+ const secret = patch.tokenSecret !== void 0 && patch.tokenSecret !== "" ? patch.tokenSecret : prev.tokenSecret;
168
+ current[index] = {
169
+ id: prev.id,
170
+ name: patch.name !== void 0 ? patch.name : prev.name,
171
+ tokenId: patch.tokenId !== void 0 ? patch.tokenId : prev.tokenId,
172
+ tokenSecret: secret,
173
+ environment: patch.environment !== void 0 ? patch.environment : prev.environment,
174
+ gpuType: patch.gpuType !== void 0 ? patch.gpuType : prev.gpuType,
175
+ region: patch.region !== void 0 ? patch.region : prev.region,
176
+ costCapUsd: patch.costCapUsd !== void 0 ? patch.costCapUsd : prev.costCapUsd,
177
+ maxRuntimeHours: patch.maxRuntimeHours !== void 0 ? patch.maxRuntimeHours : prev.maxRuntimeHours,
178
+ failedDatasetGraceHours: patch.failedDatasetGraceHours !== void 0 ? patch.failedDatasetGraceHours : prev.failedDatasetGraceHours
179
+ };
180
+ return {
181
+ ok: true,
182
+ entryId,
183
+ config: {
184
+ entries: current,
185
+ tokenId: "",
186
+ tokenSecret: "",
187
+ environment: config.environment ?? "",
188
+ gpuType: config.gpuType ?? DEFAULT_GPU,
189
+ region: config.region ?? "",
190
+ costCapUsd: config.costCapUsd ?? DEFAULT_COST,
191
+ maxRuntimeHours: config.maxRuntimeHours ?? DEFAULT_HOURS,
192
+ failedDatasetGraceHours: config.failedDatasetGraceHours ?? DEFAULT_GRACE
193
+ }
194
+ };
195
+ }
159
196
  /**
160
197
  * Mint a stable id for every persisted entry that lacks one. Operator-typed
161
198
  * empty ids (legacy settings UI) must never stay empty — createEntry always
@@ -387,6 +424,20 @@ var ModalTrainingProvider = class {
387
424
  configured: this.entryConfigured(entry)
388
425
  }));
389
426
  createEntry = async (input) => this.deps.createEntry(input);
427
+ updateEntry = async (input) => {
428
+ await this.deps.updateEntry(input.entryId, {
429
+ name: input.name,
430
+ ...input.tokenId !== void 0 ? { tokenId: input.tokenId } : {},
431
+ ...input.tokenSecret !== void 0 ? { tokenSecret: input.tokenSecret } : {},
432
+ ...input.environment !== void 0 ? { environment: input.environment } : {},
433
+ ...input.gpuType !== void 0 ? { gpuType: input.gpuType } : {},
434
+ ...input.region !== void 0 ? { region: input.region } : {},
435
+ ...input.costCapUsd !== void 0 ? { costCapUsd: input.costCapUsd } : {},
436
+ ...input.maxRuntimeSec !== void 0 ? { maxRuntimeHours: input.maxRuntimeSec / 3600 } : {},
437
+ ...input.failedDatasetGraceHours !== void 0 ? { failedDatasetGraceHours: input.failedDatasetGraceHours } : {}
438
+ });
439
+ return { ok: true };
440
+ };
390
441
  deleteEntry = async (input) => {
391
442
  await this.deps.deleteEntry(input.entryId);
392
443
  return { ok: true };
@@ -688,7 +739,10 @@ var ModalTrainingProvider = class {
688
739
  costCapUsd: entry.costCapUsd,
689
740
  maxRuntimeSec: Math.round(entry.maxRuntimeHours * 3600),
690
741
  failedDatasetGraceHours: entry.failedDatasetGraceHours
691
- }
742
+ },
743
+ tokenId: entry.tokenId,
744
+ environment: entry.environment,
745
+ hasTokenSecret: entry.tokenSecret.trim() !== ""
692
746
  };
693
747
  }
694
748
  requireGateway(entryId) {
@@ -88541,6 +88595,12 @@ async function fetchText(url) {
88541
88595
  var TrainingModalAddon = class extends BaseAddon {
88542
88596
  ledgerState = null;
88543
88597
  gateways = /* @__PURE__ */ new Map();
88598
+ /**
88599
+ * Entry secrets live on `entries[id].tokenSecret` (and legacy flat
88600
+ * `tokenSecret`). Declared here — not via an editable-array form — so the
88601
+ * Training → Providers page is the only UI that edits entries.
88602
+ */
88603
+ secretStatePaths = ["entries[id].tokenSecret", "tokenSecret"];
88544
88604
  constructor() {
88545
88605
  super({
88546
88606
  entries: [],
@@ -88573,6 +88633,12 @@ var TrainingModalAddon = class extends BaseAddon {
88573
88633
  await this.updateGlobalSettings(result.config);
88574
88634
  return { entryId: result.entryId };
88575
88635
  },
88636
+ updateEntry: async (entryId, patch) => {
88637
+ const result = updateModalEntry(this.config, entryId, patch);
88638
+ if (!result.ok) throw new Error(`cannot update entry: ${result.reason}`);
88639
+ await this.updateGlobalSettings(result.config);
88640
+ this.closeGateway(entryId);
88641
+ },
88576
88642
  deleteEntry: async (entryId) => {
88577
88643
  const result = deleteModalEntry(this.config, entryId);
88578
88644
  if (!result.ok) throw new Error(`cannot delete entry: ${result.reason}`);
@@ -88651,97 +88717,10 @@ var TrainingModalAddon = class extends BaseAddon {
88651
88717
  }
88652
88718
  globalSettingsSchema() {
88653
88719
  return this.schema({ sections: [{
88654
- id: "entries",
88720
+ id: "providers",
88655
88721
  title: "Modal accounts",
88656
- description: "Each entry is one Modal workspace token. Create entries from the Training → Providers tab; edit credentials here. Secrets stay in the CamStack keychain.",
88657
- fields: [{
88658
- type: "editable-array",
88659
- key: "entries",
88660
- label: "Entries",
88661
- itemIdKey: "id",
88662
- /** Create only via trainingProvider.createEntry (auto id). */
88663
- maxRows: 0,
88664
- emptyMessage: "No Modal entries yet — add one from Training → Providers.",
88665
- rowTitleTemplate: "{name}",
88666
- defaultItem: {
88667
- id: "",
88668
- name: "Default",
88669
- tokenId: "",
88670
- tokenSecret: "",
88671
- environment: "",
88672
- gpuType: "L4",
88673
- region: "",
88674
- costCapUsd: 5,
88675
- maxRuntimeHours: 4,
88676
- failedDatasetGraceHours: 24
88677
- },
88678
- itemFields: [
88679
- {
88680
- type: "text",
88681
- key: "name",
88682
- label: "Name"
88683
- },
88684
- {
88685
- type: "text",
88686
- key: "tokenId",
88687
- label: "Token id",
88688
- placeholder: "ak-…"
88689
- },
88690
- {
88691
- type: "password",
88692
- key: "tokenSecret",
88693
- label: "Token secret",
88694
- showToggle: true
88695
- },
88696
- {
88697
- type: "text",
88698
- key: "environment",
88699
- label: "Environment",
88700
- description: "Leave empty for the workspace default."
88701
- },
88702
- {
88703
- type: "select",
88704
- key: "gpuType",
88705
- label: "GPU",
88706
- options: MODAL_GPUS.map((g) => ({
88707
- value: g.id,
88708
- label: `${g.label} — $${g.usdPerHour.toFixed(2)}/h`
88709
- }))
88710
- },
88711
- {
88712
- type: "select",
88713
- key: "region",
88714
- label: "Region",
88715
- options: MODAL_REGIONS.map((r) => ({
88716
- value: r.id,
88717
- label: r.label
88718
- }))
88719
- },
88720
- {
88721
- type: "number",
88722
- key: "costCapUsd",
88723
- label: "Cost cap per job (USD)",
88724
- min: .5,
88725
- step: .5
88726
- },
88727
- {
88728
- type: "number",
88729
- key: "maxRuntimeHours",
88730
- label: "Maximum runtime (hours)",
88731
- min: .5,
88732
- max: 24,
88733
- step: .5
88734
- },
88735
- {
88736
- type: "number",
88737
- key: "failedDatasetGraceHours",
88738
- label: "Keep a failed job’s dataset (hours)",
88739
- min: 0,
88740
- max: 168,
88741
- step: 1
88742
- }
88743
- ]
88744
- }]
88722
+ description: "Create and edit Modal workspace entries under Training → Providers. Credentials stay in the CamStack keychain.",
88723
+ fields: []
88745
88724
  }] });
88746
88725
  }
88747
88726
  };
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-C-uqIKLg.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-dy7yMOdw.mjs";
2
2
  export { t as get, e as init };
@@ -1,8 +1,8 @@
1
- import { S as e, _ as t, c as n, l as r, m as i, n as a, r as o, t as s, u as c, v as l } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-DeDbF7NI.mjs";
2
- import { h as u } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C7dks3FG.mjs";
3
- import "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs";
1
+ import { _ as e, b as t, c as n, g as r, l as i, m as a, n as o, r as s, t as c, u as l } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-BT_wL8s3.mjs";
2
+ import { i as u } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D7T4QEtw.mjs";
3
+ import "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DDBEvLdo.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
- e();
5
+ t();
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) => {
7
7
  let t = p(e);
8
8
  return t.charAt(0).toUpperCase() + t.slice(1);
@@ -19,7 +19,7 @@ var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) =
19
19
  }, g = (e) => {
20
20
  for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
21
21
  return !1;
22
- }, _ = o(({ color: e = "currentColor", size: t = 24, strokeWidth: n = 2, absoluteStrokeWidth: r, className: i = "", children: o, iconNode: s, ...c }, l) => a("svg", {
22
+ }, _ = s(({ color: e = "currentColor", size: t = 24, strokeWidth: n = 2, absoluteStrokeWidth: r, className: i = "", children: a, iconNode: s, ...c }, l) => o("svg", {
23
23
  ref: l,
24
24
  ...h,
25
25
  width: t,
@@ -27,14 +27,14 @@ var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) =
27
27
  stroke: e,
28
28
  strokeWidth: r ? Number(n) * 24 / Number(t) : n,
29
29
  className: d("lucide", i),
30
- ...!o && !g(c) && { "aria-hidden": "true" },
30
+ ...!a && !g(c) && { "aria-hidden": "true" },
31
31
  ...c
32
- }, [...s.map(([e, t]) => a(e, t)), ...Array.isArray(o) ? o : [o]]));
32
+ }, [...s.map(([e, t]) => o(e, t)), ...Array.isArray(a) ? a : [a]]));
33
33
  //#endregion
34
34
  //#region ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
35
- e();
35
+ t();
36
36
  var v = (e, t) => {
37
- let n = o(({ className: n, ...r }, i) => a(_, {
37
+ let n = s(({ className: n, ...r }, i) => o(_, {
38
38
  ref: i,
39
39
  iconNode: t,
40
40
  className: d(`lucide-${f(m(e))}`, `lucide-${e}`, n),
@@ -44,69 +44,65 @@ var v = (e, t) => {
44
44
  };
45
45
  //#endregion
46
46
  //#region ../ui-library/src/lib/shared-context.ts
47
- e();
47
+ t();
48
48
  function y(e, t) {
49
- if (typeof globalThis > "u") return s(t);
49
+ if (typeof globalThis > "u") return c(t);
50
50
  let n = globalThis.__camstackSharedContexts, r = n ?? /* @__PURE__ */ new Map();
51
51
  n || (globalThis.__camstackSharedContexts = r);
52
52
  let i = r.get(e);
53
53
  if (i) return i;
54
- let a = s(t);
54
+ let a = c(t);
55
55
  return r.set(e, a), a;
56
56
  }
57
57
  //#endregion
58
58
  //#region ../ui-library/src/contexts/system-context.tsx
59
- e();
59
+ t();
60
60
  var b = y("camstack:system", null);
61
61
  function x() {
62
- let e = r(b);
62
+ let e = i(b);
63
63
  if (!e) throw Error("useSystem(): no <SystemProvider> in tree");
64
64
  return e;
65
65
  }
66
66
  //#endregion
67
67
  //#region ../ui-library/src/hooks/use-device-proxy.ts
68
- e();
68
+ t();
69
69
  var S = "capability.binding-changed";
70
- function C(e, n) {
71
- let [r, a] = t(null);
72
- return c(() => {
73
- if (n === null) {
74
- a(null);
70
+ function C(e, t) {
71
+ let [n, i] = r(null);
72
+ return l(() => {
73
+ if (t === null) {
74
+ i(null);
75
75
  return;
76
76
  }
77
- let t = !1, r = async () => {
77
+ let n = !1, r = async () => {
78
78
  try {
79
- let r = await e.deviceManager.getBindings.query({ deviceId: n });
80
- t || a(r);
79
+ let r = await e.deviceManager.getBindings.query({ deviceId: t });
80
+ n || i(r);
81
81
  } catch {
82
- t || a((e) => e);
82
+ n || i((e) => e);
83
83
  }
84
84
  };
85
85
  r();
86
- let i = e.live?.onEvent.subscribe({ category: S }, { onData: (e) => {
87
- let t = e.data?.source;
88
- if (!t) {
86
+ let a = e.live?.onEvent.subscribe({ category: S }, { onData: (e) => {
87
+ let n = e.data?.source;
88
+ if (!n) {
89
89
  r();
90
90
  return;
91
91
  }
92
- t.type === "device" && t.id === n && r();
92
+ n.type === "device" && n.id === t && r();
93
93
  } });
94
94
  return () => {
95
- t = !0, i?.unsubscribe();
95
+ n = !0, a?.unsubscribe();
96
96
  };
97
- }, [e, n]), i(() => r ? u(e, r) : null, [e, r]);
97
+ }, [e, t]), a(() => n ? u(e, n) : null, [e, n]);
98
98
  }
99
- function w(e) {
100
- let t = n((t) => e ? e.subscribe(() => t()) : () => void 0, [e]), r = n(() => e?.value, [e]);
101
- return l(t, r, r);
102
- }
103
- function T(e, t, n) {
104
- let r = C(e, t);
105
- return w(r ? n(r.state) : void 0);
99
+ function w(t) {
100
+ let r = n((e) => t ? t.subscribe(() => e()) : () => void 0, [t]), i = n(() => t?.value, [t]);
101
+ return e(r, i, i);
106
102
  }
107
103
  //#endregion
108
104
  //#region ../ui-library/src/lib/cap-error.ts
109
- function E(e) {
105
+ function T(e) {
110
106
  if (typeof e != "object" || !e) return null;
111
107
  let t = Reflect.get(e, "data");
112
108
  if (typeof t == "object" && t) {
@@ -115,12 +111,12 @@ function E(e) {
115
111
  }
116
112
  return null;
117
113
  }
118
- function D(e) {
119
- let t = E(e);
114
+ function E(e) {
115
+ let t = T(e);
120
116
  return t === null ? (e instanceof Error ? e.message : String(e)).includes("provider not available") : t === "no-provider" || t === "node-offline";
121
117
  }
122
118
  //#endregion
123
119
  //#region ../ui-library/src/lib/responsive.ts
124
- var O = "rounded-lg border border-border bg-surface overflow-hidden", k = "border-b border-border px-3 sm:px-4 py-1.5 sm:py-2", A = "p-2 sm:p-3 lg:p-4", j = "grid grid-cols-2 sm:grid-cols-2 lg:grid-cols-4", M = "flex min-w-0 flex-col gap-0.5 py-1.5 sm:flex-row sm:items-center", N = "min-w-0 text-[11px] leading-tight text-foreground-subtle sm:w-32 sm:shrink-0 sm:pr-2", P = "flex w-full min-w-0 items-center gap-1 sm:flex-1", F = "min-w-0 break-all text-xs text-foreground sm:truncate", I = "text-[10px] sm:text-[11px] font-semibold text-foreground uppercase tracking-wider", L = "text-[10px] text-foreground-subtle", R = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium transition-colors", z = "border-primary/50 bg-primary/15 text-primary", B = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
120
+ var D = "rounded-lg border border-border bg-surface overflow-hidden", O = "border-b border-border px-3 sm:px-4 py-1.5 sm:py-2", k = "p-2 sm:p-3 lg:p-4", A = "grid grid-cols-2 sm:grid-cols-2 lg:grid-cols-4", j = "flex min-w-0 flex-col gap-0.5 py-1.5 sm:flex-row sm:items-center", M = "min-w-0 text-[11px] leading-tight text-foreground-subtle sm:w-32 sm:shrink-0 sm:pr-2", N = "flex w-full min-w-0 items-center gap-1 sm:flex-1", P = "min-w-0 break-all text-xs text-foreground sm:truncate", F = "text-[10px] sm:text-[11px] font-semibold text-foreground uppercase tracking-wider", I = "text-[10px] text-foreground-subtle", L = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium transition-colors", R = "border-primary/50 bg-primary/15 text-primary", z = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
125
121
  //#endregion
126
- export { w as _, A as a, v as b, M as c, F as d, L as f, T as g, C as h, j as i, N as l, D as m, R as n, O as o, I as p, B as r, k as s, z as t, P as u, x as v, y };
122
+ export { x as _, k as a, j as c, P as d, I as f, w as g, C as h, A as i, M as l, E as m, L as n, D as o, F as p, z as r, O as s, R as t, N as u, y as v, v as y };
@@ -1,5 +1,5 @@
1
- import { S as e, _ as t, c as n, m as r } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-DeDbF7NI.mjs";
2
- import { b as i } from "./responsive-emJo3EdF.mjs";
1
+ import { b as e, c as t, g as n, m as r } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-BT_wL8s3.mjs";
2
+ import { y as i } from "./responsive-C7QsFtTb.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"
@@ -89,7 +89,7 @@ function g(e) {
89
89
  //#region ../ui-library/src/hooks/use-device-snapshot.ts
90
90
  var _ = "/addon/snapshot/media";
91
91
  function v(e, i = {}) {
92
- let { width: a, baseUrl: o } = i, [s, c] = t(0);
92
+ let { width: a, baseUrl: o } = i, [s, c] = n(0);
93
93
  return {
94
94
  src: r(() => {
95
95
  if (e === null || e <= 0) return null;
@@ -104,7 +104,7 @@ function v(e, i = {}) {
104
104
  s
105
105
  ]),
106
106
  loading: !1,
107
- refresh: n(() => {
107
+ refresh: t(() => {
108
108
  c((e) => e + 1);
109
109
  }, [])
110
110
  };
@@ -1,4 +1,4 @@
1
- import { b as e } from "./responsive-emJo3EdF.mjs";
1
+ import { y as e } from "./responsive-C7QsFtTb.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",
@@ -16,32 +16,7 @@ var t = e("eye-off", [
16
16
  d: "m2 2 20 20",
17
17
  key: "1ooewy"
18
18
  }]
19
- ]), n = e("mic-off", [
20
- ["path", {
21
- d: "M12 19v3",
22
- key: "npa21l"
23
- }],
24
- ["path", {
25
- d: "M15 9.34V5a3 3 0 0 0-5.68-1.33",
26
- key: "1gzdoj"
27
- }],
28
- ["path", {
29
- d: "M16.95 16.95A7 7 0 0 1 5 12v-2",
30
- key: "cqa7eg"
31
- }],
32
- ["path", {
33
- d: "M18.89 13.23A7 7 0 0 0 19 12v-2",
34
- key: "16hl24"
35
- }],
36
- ["path", {
37
- d: "m2 2 20 20",
38
- key: "1ooewy"
39
- }],
40
- ["path", {
41
- d: "M9 9v3a3 3 0 0 0 5.12 2.12",
42
- key: "r2i35w"
43
- }]
44
- ]), r = e("mic", [
19
+ ]), n = e("mic", [
45
20
  ["path", {
46
21
  d: "M12 19v3",
47
22
  key: "npa21l"
@@ -58,7 +33,7 @@ var t = e("eye-off", [
58
33
  rx: "3",
59
34
  key: "s6n7sd"
60
35
  }]
61
- ]), i = e("square", [["rect", {
36
+ ]), r = e("square", [["rect", {
62
37
  width: "18",
63
38
  height: "18",
64
39
  x: "3",
@@ -67,4 +42,4 @@ var t = e("eye-off", [
67
42
  key: "afitv7"
68
43
  }]]);
69
44
  //#endregion
70
- export { t as i, r as n, n as r, i as t };
45
+ export { n, t as r, r as t };
@@ -1,4 +1,4 @@
1
- import { b as e } from "./responsive-emJo3EdF.mjs";
1
+ import { y as e } from "./responsive-C7QsFtTb.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",