@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.
- package/dist/MaskShapeCanvas-BokARvOj.mjs +13806 -0
- package/dist/MotionZonesSettings-DshSNzpp.mjs +310 -0
- package/dist/{PrivacyMaskSettings-Bo1S23wt.mjs → PrivacyMaskSettings-DDaIx7j5.mjs} +70 -45
- package/dist/{SceneMonitorEditor-DnQJ7Hx3.mjs → SceneMonitorEditor-CuJ7xjyd.mjs} +311 -311
- package/dist/_stub.js +7257 -16783
- 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
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D7T4QEtw.mjs +26 -0
- 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
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_trpc_mf_1_client__loadShare__.js-B3rryujf.mjs +25 -0
- 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
- 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
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DDBEvLdo.mjs +26 -0
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom__loadShare__.js-CK-LlgOt.mjs +26 -0
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-gTIQrhKs.mjs +25 -0
- package/dist/{dist-BCLkrWJc.js → dist-Dd6EAdVX.js} +38 -1
- package/dist/{dist-BSYBh1ZO.mjs → dist-DhCvklZW.mjs} +38 -1
- package/dist/{hostInit-Bx2a8M7w.mjs → hostInit-DR-St7pA.mjs} +1 -1
- package/dist/index.js +8 -1
- package/dist/index.mjs +7 -0
- package/dist/orchestrator/training.addon.js +1 -1
- package/dist/orchestrator/training.addon.mjs +1 -1
- package/dist/{player-overlays-BR2_H0wZ.mjs → player-overlays-DUZMtmvk.mjs} +10 -32
- package/dist/providers/modal/training-modal.addon.js +71 -92
- package/dist/providers/modal/training-modal.addon.mjs +71 -92
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-emJo3EdF.mjs → responsive-C7QsFtTb.mjs} +38 -42
- package/dist/{scene-monitor-copy-CcQxbRXa.mjs → scene-monitor-copy-BtffdnnW.mjs} +4 -4
- package/dist/{square-CErp1WgN.mjs → square-e5Ytjod_.mjs} +4 -29
- package/dist/{trash-2-Drz0fMgI.mjs → trash-2-Clte6zIF.mjs} +1 -1
- 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
- package/package.json +1 -1
- package/dist/MaskShapeCanvas-Kfg9dl6B.mjs +0 -686
- package/dist/MotionZonesSettings-DflIL9ss.mjs +0 -292
- package/dist/ReactKonva-DGuYUN0L.mjs +0 -5416
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C7dks3FG.mjs +0 -26
- 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
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_trpc_mf_1_client__loadShare__.js-CFCVuRAs.mjs +0 -58
- 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
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs +0 -34
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom__loadShare__.js-DAZkHxxU.mjs +0 -45
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CHqN9NLt.mjs +0 -34
- package/dist/grid-2x2-D9syAI6z.mjs +0 -21
- 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-
|
|
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: "
|
|
88692
|
+
id: "providers",
|
|
88627
88693
|
title: "Modal accounts",
|
|
88628
|
-
description: "
|
|
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-
|
|
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: "
|
|
88720
|
+
id: "providers",
|
|
88655
88721
|
title: "Modal accounts",
|
|
88656
|
-
description: "
|
|
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
|
};
|
package/dist/remoteEntry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-
|
|
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
|
-
|
|
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
|
-
}, _ =
|
|
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
|
-
...!
|
|
30
|
+
...!a && !g(c) && { "aria-hidden": "true" },
|
|
31
31
|
...c
|
|
32
|
-
}, [...s.map(([e, t]) =>
|
|
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
|
-
|
|
35
|
+
t();
|
|
36
36
|
var v = (e, t) => {
|
|
37
|
-
let n =
|
|
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
|
-
|
|
47
|
+
t();
|
|
48
48
|
function y(e, t) {
|
|
49
|
-
if (typeof globalThis > "u") return
|
|
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 =
|
|
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
|
-
|
|
59
|
+
t();
|
|
60
60
|
var b = y("camstack:system", null);
|
|
61
61
|
function x() {
|
|
62
|
-
let e =
|
|
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
|
-
|
|
68
|
+
t();
|
|
69
69
|
var S = "capability.binding-changed";
|
|
70
|
-
function C(e,
|
|
71
|
-
let [
|
|
72
|
-
return
|
|
73
|
-
if (
|
|
74
|
-
|
|
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
|
|
77
|
+
let n = !1, r = async () => {
|
|
78
78
|
try {
|
|
79
|
-
let r = await e.deviceManager.getBindings.query({ deviceId:
|
|
80
|
-
|
|
79
|
+
let r = await e.deviceManager.getBindings.query({ deviceId: t });
|
|
80
|
+
n || i(r);
|
|
81
81
|
} catch {
|
|
82
|
-
|
|
82
|
+
n || i((e) => e);
|
|
83
83
|
}
|
|
84
84
|
};
|
|
85
85
|
r();
|
|
86
|
-
let
|
|
87
|
-
let
|
|
88
|
-
if (!
|
|
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
|
-
|
|
92
|
+
n.type === "device" && n.id === t && r();
|
|
93
93
|
} });
|
|
94
94
|
return () => {
|
|
95
|
-
|
|
95
|
+
n = !0, a?.unsubscribe();
|
|
96
96
|
};
|
|
97
|
-
}, [e,
|
|
97
|
+
}, [e, t]), a(() => n ? u(e, n) : null, [e, n]);
|
|
98
98
|
}
|
|
99
|
-
function w(
|
|
100
|
-
let
|
|
101
|
-
return
|
|
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
|
|
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
|
|
119
|
-
let t =
|
|
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
|
|
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 {
|
|
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 {
|
|
2
|
-
import {
|
|
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] =
|
|
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:
|
|
107
|
+
refresh: t(() => {
|
|
108
108
|
c((e) => e + 1);
|
|
109
109
|
}, [])
|
|
110
110
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
-
]),
|
|
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 {
|
|
45
|
+
export { n, t as r, r as t };
|