@camstack/addon-pipeline-orchestrator 1.2.88 → 1.2.90

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/assets/viewer/.viewer-current-files.json +1 -1
  2. package/assets/viewer/.viewer-version +1 -1
  3. package/assets/viewer/_expo/static/js/web/{index-549c33f7607e53bba78ee62be3fe7bd3.js → index-bdb01da2325ee3ceecde733506d5aba4.js} +664 -663
  4. package/assets/viewer/index.html +1 -1
  5. package/dist/_stub.js +24 -24
  6. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-C3daqr_1.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-DdSF7Z5h.mjs} +3 -3
  7. package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BwZqYGZP.mjs +26 -0
  8. package/dist/{_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-7WxrFeM1.mjs → _virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BiicNLbC.mjs} +2 -2
  9. package/dist/{hostInit-CQOhaRRM.mjs → hostInit-Dnyhh979.mjs} +3 -3
  10. package/dist/index.js +147 -9
  11. package/dist/index.mjs +147 -9
  12. package/dist/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/assets/viewer/_expo/static/js/web/Clipboard-f613900d51c7724e5591adb72d81419c.js +0 -8
  15. package/assets/viewer/_expo/static/js/web/Haptics-5dc04e8b21923be55abeb3f7cfd852ee.js +0 -3
  16. package/assets/viewer/_expo/static/js/web/node-fs-2202273b14547c9d9aef51b6bf6a1cd9.js +0 -1
  17. package/assets/viewer/_expo/static/js/web/node-path-9ac1e4e4152bfbea31fc86e744b9e12c.js +0 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BtVo8S7A.mjs +0 -26
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ node_fs = __toESM(node_fs);
30
30
  let node_path = require("node:path");
31
31
  node_path = __toESM(node_path);
32
32
  let node_url = require("node:url");
33
- //#region ../types/dist/event-category-XfKNtfCc.mjs
33
+ //#region ../types/dist/event-category-CIa_iT6b.mjs
34
34
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
35
35
  EventCategory["SystemBoot"] = "system.boot";
36
36
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -46,6 +46,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
46
46
  */
47
47
  EventCategory["SystemRestartCompleted"] = "system.restart-completed";
48
48
  /**
49
+ * The hub reissued its own TLS certificate at boot (`ensureTlsCert`).
50
+ * Emitted only when the material on disk actually changed, so an
51
+ * operator who trusted the old certificate by hand is told rather than
52
+ * discovering it as a browser error. Payload `TlsCertChangedPayload`.
53
+ *
54
+ * Rule: docs/decisions/adr-0227-*.md
55
+ */
56
+ EventCategory["SystemTlsCertChanged"] = "system.tls-cert-changed";
57
+ /**
49
58
  * A newer addon or server-root package version was found by the
50
59
  * authoritative registry check. Emitted once when any observed
51
60
  * `latestVersion` changes (or a package/node first appears behind);
@@ -21133,7 +21142,12 @@ var TerminalSessionInfoSchema = object({
21133
21142
  var TerminalProfileInfoSchema = object({
21134
21143
  profileId: string(),
21135
21144
  label: string(),
21136
- description: string().optional()
21145
+ description: string().optional(),
21146
+ /** Spawn defaults the instance form copies on create. */
21147
+ executable: string().optional(),
21148
+ args: array(string()).readonly().optional(),
21149
+ cwd: string().optional(),
21150
+ environment: array(string()).readonly().optional()
21137
21151
  });
21138
21152
  /**
21139
21153
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -21146,7 +21160,11 @@ var TerminalInstanceInfoSchema = object({
21146
21160
  profileId: string(),
21147
21161
  profileLabel: string(),
21148
21162
  name: string(),
21149
- enabled: boolean()
21163
+ enabled: boolean(),
21164
+ executable: string(),
21165
+ args: array(string()).readonly(),
21166
+ cwd: string(),
21167
+ environment: array(string()).readonly()
21150
21168
  });
21151
21169
  var TerminalLegacyCameraSchema = object({
21152
21170
  stableId: string(),
@@ -21176,7 +21194,21 @@ var TerminalOutputBatchSchema = object({
21176
21194
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
21177
21195
  targetNodeId: string().min(1),
21178
21196
  profileId: string().min(1),
21179
- name: string().trim().min(1).max(160).optional()
21197
+ name: string().trim().min(1).max(160).optional(),
21198
+ executable: string().max(1024).optional(),
21199
+ args: array(string().max(2048)).max(64).optional(),
21200
+ cwd: string().max(1024).optional(),
21201
+ environment: array(string().max(4096)).max(64).optional()
21202
+ }), TerminalInstanceInfoSchema, {
21203
+ kind: "mutation",
21204
+ auth: "admin"
21205
+ }), method(object({
21206
+ instanceId: string().min(1),
21207
+ name: string().trim().min(1).max(160).optional(),
21208
+ executable: string().max(1024).optional(),
21209
+ args: array(string().max(2048)).max(64).optional(),
21210
+ cwd: string().max(1024).optional(),
21211
+ environment: array(string().max(4096)).max(64).optional()
21180
21212
  }), TerminalInstanceInfoSchema, {
21181
21213
  kind: "mutation",
21182
21214
  auth: "admin"
@@ -21198,7 +21230,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
21198
21230
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
21199
21231
  profileId: string(),
21200
21232
  cols: number().int().positive(),
21201
- rows: number().int().positive()
21233
+ rows: number().int().positive(),
21234
+ executable: string().max(1024).optional(),
21235
+ args: array(string().max(2048)).max(64).optional(),
21236
+ cwd: string().max(1024).optional(),
21237
+ environment: array(string().max(4096)).max(64).optional()
21202
21238
  }), TerminalSessionInfoSchema, {
21203
21239
  kind: "mutation",
21204
21240
  auth: "admin"
@@ -24146,6 +24182,20 @@ var AllowedAddressesSchema = object({
24146
24182
  * Network Addresses admin page and persisted by the addon.
24147
24183
  */
24148
24184
  addresses: array(string()).readonly() });
24185
+ var TlsStatusSchema = object({
24186
+ mode: _enum([
24187
+ "generated",
24188
+ "uploaded",
24189
+ "disabled"
24190
+ ]),
24191
+ leafFingerprintSha256: string().nullable(),
24192
+ caFingerprintSha256: string().nullable(),
24193
+ validTo: string().nullable(),
24194
+ sans: array(string()),
24195
+ caCertPem: string().nullable(),
24196
+ reissueError: string().nullable(),
24197
+ restartRequired: boolean()
24198
+ });
24149
24199
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24150
24200
  /**
24151
24201
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24165,7 +24215,20 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24165
24215
  * to avoid mixed-content blocks in the browser. The public
24166
24216
  * tunnel always emits `https://` regardless. */
24167
24217
  scheme: _enum(["http", "https"]).optional()
24168
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
24218
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
24219
+ kind: "mutation",
24220
+ auth: "admin"
24221
+ }), method(object({
24222
+ certPem: string().min(1),
24223
+ keyPem: string().min(1),
24224
+ caPem: string().optional()
24225
+ }), TlsStatusSchema, {
24226
+ kind: "mutation",
24227
+ auth: "admin"
24228
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24229
+ kind: "mutation",
24230
+ auth: "admin"
24231
+ });
24169
24232
  object({
24170
24233
  /** Lifecycle state of the lock. `jammed` means the motor reported
24171
24234
  * failure to reach the target — operator intervention required. */
@@ -30012,6 +30075,12 @@ Object.freeze({
30012
30075
  addonId: null,
30013
30076
  access: "create"
30014
30077
  },
30078
+ "localNetwork.downloadCa": {
30079
+ capName: "local-network",
30080
+ capScope: "system",
30081
+ addonId: null,
30082
+ access: "view"
30083
+ },
30015
30084
  "localNetwork.getAllowedAddresses": {
30016
30085
  capName: "local-network",
30017
30086
  capScope: "system",
@@ -30036,18 +30105,36 @@ Object.freeze({
30036
30105
  addonId: null,
30037
30106
  access: "view"
30038
30107
  },
30108
+ "localNetwork.getTlsStatus": {
30109
+ capName: "local-network",
30110
+ capScope: "system",
30111
+ addonId: null,
30112
+ access: "view"
30113
+ },
30039
30114
  "localNetwork.list": {
30040
30115
  capName: "local-network",
30041
30116
  capScope: "system",
30042
30117
  addonId: null,
30043
30118
  access: "view"
30044
30119
  },
30120
+ "localNetwork.regenerateCertificate": {
30121
+ capName: "local-network",
30122
+ capScope: "system",
30123
+ addonId: null,
30124
+ access: "create"
30125
+ },
30045
30126
  "localNetwork.resetAllowlistToBestMatch": {
30046
30127
  capName: "local-network",
30047
30128
  capScope: "system",
30048
30129
  addonId: null,
30049
30130
  access: "delete"
30050
30131
  },
30132
+ "localNetwork.revertToGeneratedCertificate": {
30133
+ capName: "local-network",
30134
+ capScope: "system",
30135
+ addonId: null,
30136
+ access: "create"
30137
+ },
30051
30138
  "localNetwork.setAllowedAddresses": {
30052
30139
  capName: "local-network",
30053
30140
  capScope: "system",
@@ -30060,6 +30147,12 @@ Object.freeze({
30060
30147
  addonId: null,
30061
30148
  access: "create"
30062
30149
  },
30150
+ "localNetwork.uploadCertificate": {
30151
+ capName: "local-network",
30152
+ capScope: "system",
30153
+ addonId: null,
30154
+ access: "create"
30155
+ },
30063
30156
  "lockControl.lock": {
30064
30157
  capName: "lock-control",
30065
30158
  capScope: "device",
@@ -32940,6 +33033,12 @@ Object.freeze({
32940
33033
  addonId: null,
32941
33034
  access: "create"
32942
33035
  },
33036
+ "terminalSession.updateInstance": {
33037
+ capName: "terminal-session",
33038
+ capScope: "system",
33039
+ addonId: null,
33040
+ access: "create"
33041
+ },
32943
33042
  "terminalSession.writeInput": {
32944
33043
  capName: "terminal-session",
32945
33044
  capScope: "system",
@@ -35494,6 +35593,35 @@ function clusterModelSettingKey(stepId) {
35494
35593
  }
35495
35594
  Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
35496
35595
  string().min(1);
35596
+ var CLUSTER_STEP_SETTING_FIELDS = [{
35597
+ stepId: "face-embedding",
35598
+ key: "minLandmarkFaceSize",
35599
+ label: "Min face size for recognition (detection px)",
35600
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
35601
+ type: "slider",
35602
+ min: 0,
35603
+ max: 64,
35604
+ step: 2,
35605
+ default: 24
35606
+ }];
35607
+ function clusterStepSettingKey(stepId, fieldKey) {
35608
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
35609
+ }
35610
+ var ClusterSettingNumberSchema = number().finite();
35611
+ function readClusterStepSettings(config) {
35612
+ const out = {};
35613
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
35614
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
35615
+ const value = parsed.success ? parsed.data : field.default;
35616
+ const existing = out[field.stepId] ?? {};
35617
+ out[field.stepId] = {
35618
+ ...existing,
35619
+ [field.key]: value
35620
+ };
35621
+ }
35622
+ return out;
35623
+ }
35624
+ readClusterStepSettings({});
35497
35625
  /**
35498
35626
  * THE detail-crop convention — the single derivation of the rectangle a
35499
35627
  * detail/enrichment step (clip-embedding, face-detection, plate-detection…)
@@ -48046,8 +48174,8 @@ function buildGlobalSettingsSections(options) {
48046
48174
  id: CLUSTER_MODEL_SECTION_ID,
48047
48175
  title: "Enrichment models",
48048
48176
  tab: "pipeline",
48049
- description: "The encoders that turn a crop into a VECTOR. One value each for the whole cluster, because each writes into a single shared index and cosine similarity between two different encoders is not a weaker score — it is a meaningless one, with nothing in the stored vector to reveal it happened. Changing one here does not corrupt what is already stored (every vector carries the model that produced it, and only matches its own), but it does STRAND it: until a re-embed pass has run, the old vectors are dead weight in that index. Each change should be followed by the matching rebuild.",
48050
- fields: CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48177
+ description: "The encoders that turn a crop into a VECTOR, and the admission knobs those encoders share. One value each for the whole cluster, because each writes into a single shared index. Changing a model does not corrupt what is already stored (every vector carries the model that produced it) but it does STRAND it until a re-embed pass has run. Step knobs such as the face-size floor apply to every node for the same reason.",
48178
+ fields: [...CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48051
48179
  key: clusterModelSettingKey(step.stepId),
48052
48180
  type: "select",
48053
48181
  label: step.label,
@@ -48057,7 +48185,17 @@ function buildGlobalSettingsSections(options) {
48057
48185
  label: o.label
48058
48186
  })),
48059
48187
  default: step.defaultModelId
48060
- }))
48188
+ })), ...CLUSTER_STEP_SETTING_FIELDS.map((field) => ({
48189
+ key: clusterStepSettingKey(field.stepId, field.key),
48190
+ type: "slider",
48191
+ label: field.label,
48192
+ description: field.description,
48193
+ min: field.min,
48194
+ max: field.max,
48195
+ step: field.step,
48196
+ default: field.default,
48197
+ showValue: true
48198
+ }))]
48061
48199
  },
48062
48200
  {
48063
48201
  id: DETAIL_CROP_SECTION_ID,
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
- //#region ../types/dist/event-category-XfKNtfCc.mjs
5
+ //#region ../types/dist/event-category-CIa_iT6b.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -18,6 +18,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
18
18
  */
19
19
  EventCategory["SystemRestartCompleted"] = "system.restart-completed";
20
20
  /**
21
+ * The hub reissued its own TLS certificate at boot (`ensureTlsCert`).
22
+ * Emitted only when the material on disk actually changed, so an
23
+ * operator who trusted the old certificate by hand is told rather than
24
+ * discovering it as a browser error. Payload `TlsCertChangedPayload`.
25
+ *
26
+ * Rule: docs/decisions/adr-0227-*.md
27
+ */
28
+ EventCategory["SystemTlsCertChanged"] = "system.tls-cert-changed";
29
+ /**
21
30
  * A newer addon or server-root package version was found by the
22
31
  * authoritative registry check. Emitted once when any observed
23
32
  * `latestVersion` changes (or a package/node first appears behind);
@@ -21105,7 +21114,12 @@ var TerminalSessionInfoSchema = object({
21105
21114
  var TerminalProfileInfoSchema = object({
21106
21115
  profileId: string(),
21107
21116
  label: string(),
21108
- description: string().optional()
21117
+ description: string().optional(),
21118
+ /** Spawn defaults the instance form copies on create. */
21119
+ executable: string().optional(),
21120
+ args: array(string()).readonly().optional(),
21121
+ cwd: string().optional(),
21122
+ environment: array(string()).readonly().optional()
21109
21123
  });
21110
21124
  /**
21111
21125
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -21118,7 +21132,11 @@ var TerminalInstanceInfoSchema = object({
21118
21132
  profileId: string(),
21119
21133
  profileLabel: string(),
21120
21134
  name: string(),
21121
- enabled: boolean()
21135
+ enabled: boolean(),
21136
+ executable: string(),
21137
+ args: array(string()).readonly(),
21138
+ cwd: string(),
21139
+ environment: array(string()).readonly()
21122
21140
  });
21123
21141
  var TerminalLegacyCameraSchema = object({
21124
21142
  stableId: string(),
@@ -21148,7 +21166,21 @@ var TerminalOutputBatchSchema = object({
21148
21166
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
21149
21167
  targetNodeId: string().min(1),
21150
21168
  profileId: string().min(1),
21151
- name: string().trim().min(1).max(160).optional()
21169
+ name: string().trim().min(1).max(160).optional(),
21170
+ executable: string().max(1024).optional(),
21171
+ args: array(string().max(2048)).max(64).optional(),
21172
+ cwd: string().max(1024).optional(),
21173
+ environment: array(string().max(4096)).max(64).optional()
21174
+ }), TerminalInstanceInfoSchema, {
21175
+ kind: "mutation",
21176
+ auth: "admin"
21177
+ }), method(object({
21178
+ instanceId: string().min(1),
21179
+ name: string().trim().min(1).max(160).optional(),
21180
+ executable: string().max(1024).optional(),
21181
+ args: array(string().max(2048)).max(64).optional(),
21182
+ cwd: string().max(1024).optional(),
21183
+ environment: array(string().max(4096)).max(64).optional()
21152
21184
  }), TerminalInstanceInfoSchema, {
21153
21185
  kind: "mutation",
21154
21186
  auth: "admin"
@@ -21170,7 +21202,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
21170
21202
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
21171
21203
  profileId: string(),
21172
21204
  cols: number().int().positive(),
21173
- rows: number().int().positive()
21205
+ rows: number().int().positive(),
21206
+ executable: string().max(1024).optional(),
21207
+ args: array(string().max(2048)).max(64).optional(),
21208
+ cwd: string().max(1024).optional(),
21209
+ environment: array(string().max(4096)).max(64).optional()
21174
21210
  }), TerminalSessionInfoSchema, {
21175
21211
  kind: "mutation",
21176
21212
  auth: "admin"
@@ -24118,6 +24154,20 @@ var AllowedAddressesSchema = object({
24118
24154
  * Network Addresses admin page and persisted by the addon.
24119
24155
  */
24120
24156
  addresses: array(string()).readonly() });
24157
+ var TlsStatusSchema = object({
24158
+ mode: _enum([
24159
+ "generated",
24160
+ "uploaded",
24161
+ "disabled"
24162
+ ]),
24163
+ leafFingerprintSha256: string().nullable(),
24164
+ caFingerprintSha256: string().nullable(),
24165
+ validTo: string().nullable(),
24166
+ sans: array(string()),
24167
+ caCertPem: string().nullable(),
24168
+ reissueError: string().nullable(),
24169
+ restartRequired: boolean()
24170
+ });
24121
24171
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24122
24172
  /**
24123
24173
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24137,7 +24187,20 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24137
24187
  * to avoid mixed-content blocks in the browser. The public
24138
24188
  * tunnel always emits `https://` regardless. */
24139
24189
  scheme: _enum(["http", "https"]).optional()
24140
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
24190
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
24191
+ kind: "mutation",
24192
+ auth: "admin"
24193
+ }), method(object({
24194
+ certPem: string().min(1),
24195
+ keyPem: string().min(1),
24196
+ caPem: string().optional()
24197
+ }), TlsStatusSchema, {
24198
+ kind: "mutation",
24199
+ auth: "admin"
24200
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24201
+ kind: "mutation",
24202
+ auth: "admin"
24203
+ });
24141
24204
  object({
24142
24205
  /** Lifecycle state of the lock. `jammed` means the motor reported
24143
24206
  * failure to reach the target — operator intervention required. */
@@ -29984,6 +30047,12 @@ Object.freeze({
29984
30047
  addonId: null,
29985
30048
  access: "create"
29986
30049
  },
30050
+ "localNetwork.downloadCa": {
30051
+ capName: "local-network",
30052
+ capScope: "system",
30053
+ addonId: null,
30054
+ access: "view"
30055
+ },
29987
30056
  "localNetwork.getAllowedAddresses": {
29988
30057
  capName: "local-network",
29989
30058
  capScope: "system",
@@ -30008,18 +30077,36 @@ Object.freeze({
30008
30077
  addonId: null,
30009
30078
  access: "view"
30010
30079
  },
30080
+ "localNetwork.getTlsStatus": {
30081
+ capName: "local-network",
30082
+ capScope: "system",
30083
+ addonId: null,
30084
+ access: "view"
30085
+ },
30011
30086
  "localNetwork.list": {
30012
30087
  capName: "local-network",
30013
30088
  capScope: "system",
30014
30089
  addonId: null,
30015
30090
  access: "view"
30016
30091
  },
30092
+ "localNetwork.regenerateCertificate": {
30093
+ capName: "local-network",
30094
+ capScope: "system",
30095
+ addonId: null,
30096
+ access: "create"
30097
+ },
30017
30098
  "localNetwork.resetAllowlistToBestMatch": {
30018
30099
  capName: "local-network",
30019
30100
  capScope: "system",
30020
30101
  addonId: null,
30021
30102
  access: "delete"
30022
30103
  },
30104
+ "localNetwork.revertToGeneratedCertificate": {
30105
+ capName: "local-network",
30106
+ capScope: "system",
30107
+ addonId: null,
30108
+ access: "create"
30109
+ },
30023
30110
  "localNetwork.setAllowedAddresses": {
30024
30111
  capName: "local-network",
30025
30112
  capScope: "system",
@@ -30032,6 +30119,12 @@ Object.freeze({
30032
30119
  addonId: null,
30033
30120
  access: "create"
30034
30121
  },
30122
+ "localNetwork.uploadCertificate": {
30123
+ capName: "local-network",
30124
+ capScope: "system",
30125
+ addonId: null,
30126
+ access: "create"
30127
+ },
30035
30128
  "lockControl.lock": {
30036
30129
  capName: "lock-control",
30037
30130
  capScope: "device",
@@ -32912,6 +33005,12 @@ Object.freeze({
32912
33005
  addonId: null,
32913
33006
  access: "create"
32914
33007
  },
33008
+ "terminalSession.updateInstance": {
33009
+ capName: "terminal-session",
33010
+ capScope: "system",
33011
+ addonId: null,
33012
+ access: "create"
33013
+ },
32915
33014
  "terminalSession.writeInput": {
32916
33015
  capName: "terminal-session",
32917
33016
  capScope: "system",
@@ -35466,6 +35565,35 @@ function clusterModelSettingKey(stepId) {
35466
35565
  }
35467
35566
  Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
35468
35567
  string().min(1);
35568
+ var CLUSTER_STEP_SETTING_FIELDS = [{
35569
+ stepId: "face-embedding",
35570
+ key: "minLandmarkFaceSize",
35571
+ label: "Min face size for recognition (detection px)",
35572
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
35573
+ type: "slider",
35574
+ min: 0,
35575
+ max: 64,
35576
+ step: 2,
35577
+ default: 24
35578
+ }];
35579
+ function clusterStepSettingKey(stepId, fieldKey) {
35580
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
35581
+ }
35582
+ var ClusterSettingNumberSchema = number().finite();
35583
+ function readClusterStepSettings(config) {
35584
+ const out = {};
35585
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
35586
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
35587
+ const value = parsed.success ? parsed.data : field.default;
35588
+ const existing = out[field.stepId] ?? {};
35589
+ out[field.stepId] = {
35590
+ ...existing,
35591
+ [field.key]: value
35592
+ };
35593
+ }
35594
+ return out;
35595
+ }
35596
+ readClusterStepSettings({});
35469
35597
  /**
35470
35598
  * THE detail-crop convention — the single derivation of the rectangle a
35471
35599
  * detail/enrichment step (clip-embedding, face-detection, plate-detection…)
@@ -48018,8 +48146,8 @@ function buildGlobalSettingsSections(options) {
48018
48146
  id: CLUSTER_MODEL_SECTION_ID,
48019
48147
  title: "Enrichment models",
48020
48148
  tab: "pipeline",
48021
- description: "The encoders that turn a crop into a VECTOR. One value each for the whole cluster, because each writes into a single shared index and cosine similarity between two different encoders is not a weaker score — it is a meaningless one, with nothing in the stored vector to reveal it happened. Changing one here does not corrupt what is already stored (every vector carries the model that produced it, and only matches its own), but it does STRAND it: until a re-embed pass has run, the old vectors are dead weight in that index. Each change should be followed by the matching rebuild.",
48022
- fields: CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48149
+ description: "The encoders that turn a crop into a VECTOR, and the admission knobs those encoders share. One value each for the whole cluster, because each writes into a single shared index. Changing a model does not corrupt what is already stored (every vector carries the model that produced it) but it does STRAND it until a re-embed pass has run. Step knobs such as the face-size floor apply to every node for the same reason.",
48150
+ fields: [...CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48023
48151
  key: clusterModelSettingKey(step.stepId),
48024
48152
  type: "select",
48025
48153
  label: step.label,
@@ -48029,7 +48157,17 @@ function buildGlobalSettingsSections(options) {
48029
48157
  label: o.label
48030
48158
  })),
48031
48159
  default: step.defaultModelId
48032
- }))
48160
+ })), ...CLUSTER_STEP_SETTING_FIELDS.map((field) => ({
48161
+ key: clusterStepSettingKey(field.stepId, field.key),
48162
+ type: "slider",
48163
+ label: field.label,
48164
+ description: field.description,
48165
+ min: field.min,
48166
+ max: field.max,
48167
+ step: field.step,
48168
+ default: field.default,
48169
+ showValue: true
48170
+ }))]
48033
48171
  },
48034
48172
  {
48035
48173
  id: DETAIL_CROP_SECTION_ID,
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-C3daqr_1.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-DdSF7Z5h.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-pipeline-orchestrator",
3
- "version": "1.2.88",
3
+ "version": "1.2.90",
4
4
  "description": "Hub-side camera-to-agent load balancer — tracks runner capacity and dispatches attachCamera calls to the optimal pipeline-runner instance",
5
5
  "keywords": [
6
6
  "camstack",
@@ -1,8 +0,0 @@
1
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"ClipboardPasteButton",{enumerable:!0,get:function(){return c.ClipboardPasteButton}}),_e.getStringAsync=async function(t={}){if(!s.default.getStringAsync)throw new n.UnavailabilityError('Clipboard','getStringAsync');return await s.default.getStringAsync(t)},_e.setStringAsync=async function(t,e={}){if(!s.default.setStringAsync)throw new n.UnavailabilityError('Clipboard','setStringAsync');return s.default.setStringAsync(t,e)},_e.hasStringAsync=function(){if(!s.default.hasStringAsync)throw new n.UnavailabilityError('Clipboard','hasStringAsync');return s.default.hasStringAsync()},_e.getUrlAsync=async function(){if(!s.default.getUrlAsync)throw new n.UnavailabilityError('Clipboard','getUrlAsync');return await s.default.getUrlAsync()},_e.setUrlAsync=async function(t){if(!s.default.setUrlAsync)throw new n.UnavailabilityError('Clipboard','setUrlAsync');return s.default.setUrlAsync(t)},_e.hasUrlAsync=async function(){if(!s.default.hasUrlAsync)throw new n.UnavailabilityError('Clipboard','hasUrlAsync');return await s.default.hasUrlAsync()},_e.getImageAsync=async function(t){if(!s.default.getImageAsync)throw new n.UnavailabilityError('Clipboard','getImageAsync');return await s.default.getImageAsync(t)},_e.setImageAsync=async function(t){if(!s.default.setImageAsync)throw new n.UnavailabilityError('Clipboard','setImageAsync');return s.default.setImageAsync(t)},_e.hasImageAsync=async function(){if(!s.default.hasImageAsync)throw new n.UnavailabilityError('Clipboard','hasImageAsync');return s.default.hasImageAsync()},_e.addClipboardListener=function(t){return s.default.addListener(e.clipboardEventName,t)},_e.removeClipboardListener=function(t){t.remove()},Object.defineProperty(_e,"isPasteButtonAvailable",{enumerable:!0,get:function(){return o}});var t,n=r(d[0]),e=r(d[1]),s=(t=e)&&t.__esModule?t:{default:t},l=r(d[2]);Object.keys(l).forEach(function(t){'default'===t||Object.prototype.hasOwnProperty.call(_e,t)||Object.defineProperty(_e,t,{enumerable:!0,get:function(){return l[t]}})});var c=r(d[3]);const o=!1},2229,[289,2232,2236,2237]);
2
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(_e,"clipboardEventName",{enumerable:!0,get:function(){return u}});var e,t=r(d[0]),n=(e=t)&&e.__esModule?e:{default:e};const u='onClipboardChanged'},2232,[2233]);
3
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return c}});var t=r(d[0]),n=r(d[1]),o=r(d[2]),c={async getStringAsync(c){if(!navigator.clipboard)throw new t.ClipboardUnavailableException;try{if(c.preferredFormat===o.StringFormat.HTML){const t=await navigator.clipboard.read(),o=await(0,n.findHtmlInClipboardAsync)(t);return o?await new Response(o).text():await navigator.clipboard.readText()}{let t=await navigator.clipboard.readText();if(!t||''===t){const o=await navigator.clipboard.read(),c=await(0,n.findHtmlInClipboardAsync)(o),l=await(c?.text());t=(0,n.htmlToPlainText)(l??'')}return t}}catch(o){if('object'==typeof o&&'NotAllowedError'===o?.name||await(0,n.isClipboardPermissionDeniedAsync)())throw new t.NoPermissionException;try{return window.clipboardData.getData('Text')}catch{return Promise.reject(new Error('Unable to retrieve item from clipboard'))}}},async setStringAsync(c,l){if(l.inputFormat===o.StringFormat.HTML){if(!navigator.clipboard)throw new t.ClipboardUnavailableException;try{const t=(p=c,new ClipboardItem({'text/html':new Blob([p],{type:'text/html'}),'text/plain':new Blob([(0,n.htmlToPlainText)(p)],{type:'text/plain'})}));return await navigator.clipboard.write([t]),!0}catch(o){if('object'==typeof o&&'NotAllowedError'===o?.name||await(0,n.isClipboardPermissionDeniedAsync)())throw new t.NoPermissionException;throw new t.CopyFailureException(o.message)}}try{if(!navigator.clipboard)throw new Error;return await navigator.clipboard.writeText(c),!0}catch{return s(c)}var p},hasStringAsync:async()=>await l(['text/plain','text/html']),async getImageAsync(o){if(!navigator.clipboard)throw new t.ClipboardUnavailableException;try{const t=await navigator.clipboard.read(),o=await(0,n.findImageInClipboardAsync)(t);if(!o)return null;const[c,l]=await Promise.all([(0,n.blobToBase64Async)(o),(0,n.getImageSizeFromBlobAsync)(o)]);return{data:c,size:l}}catch(o){if('object'==typeof o&&'NotAllowedError'===o?.name||await(0,n.isClipboardPermissionDeniedAsync)())throw new t.NoPermissionException;throw new t.PasteFailureException(o.message)}},async setImageAsync(o){if(!navigator.clipboard)throw new t.ClipboardUnavailableException;try{const t=(0,n.base64toBlob)(o,'image/png');await navigator.clipboard.write([new ClipboardItem({[t.type]:t})])}catch(n){throw new t.CopyFailureException(n.message)}},hasImageAsync:async()=>await l(['image/png','image/jpeg']),addClipboardListener(){},removeClipboardListener(){}};async function l(o){if(!navigator.clipboard)throw new t.ClipboardUnavailableException;try{return(await navigator.clipboard.read()).flatMap(t=>t.types).some(t=>o.includes(t))}catch(o){if('object'==typeof o&&'NotAllowedError'===o?.name||await(0,n.isClipboardPermissionDeniedAsync)())throw new t.NoPermissionException;throw o}}function s(t){const n=document.createElement('textarea');n.textContent=t,document.body.appendChild(n),n.select();try{return document.execCommand('copy'),!0}catch{return!1}finally{document.body.removeChild(n)}}},2233,[2234,2235,2236]);
4
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"ClipboardUnavailableException",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"CopyFailureException",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"PasteFailureException",{enumerable:!0,get:function(){return s}}),Object.defineProperty(e,"NoPermissionException",{enumerable:!0,get:function(){return c}});var o=r(d[0]);class t extends o.CodedError{constructor(){super('ERR_CLIPBOARD_UNAVAILABLE',"The 'AsyncClipboard' API is not available on this browser")}}class n extends o.CodedError{constructor(o){super('ERR_COPY_FAILURE',`Failed to copy to clipboard: ${o}`)}}class s extends o.CodedError{constructor(o){super('ERR_COPY_FAILURE',`Failed to paste from clipboard: ${o}`)}}class c extends o.CodedError{constructor(){super('ERR_NO_PERMISSION','User denied permission to access clipboard')}}},2234,[289]);
5
- __d(function(g,r,_i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.base64toBlob=function(n,t){t=t||'';const o=1024,i=atob(n),s=i.length,c=Math.ceil(s/o),l=new Array(c);for(let n=0;n<c;++n){const t=n*o,c=Math.min(t+o,s),u=new Array(c-t);for(let n=t,o=0;n<c;++o,++n){const t=i[n];null!=t&&(u[o]=t.charCodeAt(0))}l[n]=new Uint8Array(u)}return new Blob(l,{type:t})},e.blobToBase64Async=function(n){return new Promise((t,o)=>{const i=new FileReader;i.onloadend=()=>t(i.result),i.readAsDataURL(n)})},e.htmlToPlainText=function(n){const t=document.createElement('div');return t.innerHTML=n,t.textContent||t.innerText||''},e.getImageSizeFromBlobAsync=function(n){return new Promise((t,o)=>{const i=URL.createObjectURL(n),s=document.createElement('img');s.src=i,s.onload=function(){t({width:s.width,height:s.height})}})},e.findImageInClipboardAsync=async function(n){for(const t of n){if(t.types.some(n=>'image/png'===n))return await t.getType('image/png');if(t.types.some(n=>'image/jpeg'===n))return await t.getType('image/jpeg')}return null},e.findHtmlInClipboardAsync=async function(n){for(const t of n)if(t.types.some(n=>'text/html'===n))return await t.getType('text/html');return null},e.isClipboardPermissionDeniedAsync=async function(){return'denied'===(await navigator.permissions.query({name:'clipboard-read'})).state}},2235,[]);
6
- __d(function(g,r,i,a,m,e,d){"use strict";var t,n;Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"ContentType",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"StringFormat",{enumerable:!0,get:function(){return n}}),(function(t){t.PLAIN_TEXT="plain-text",t.HTML="html",t.IMAGE="image",t.URL="url"})(t||(t={})),(function(t){t.PLAIN_TEXT="plainText",t.HTML="html"})(n||(n={}))},2236,[]);
7
- __d(function(g,r,i,a,m,_e,d){"use strict";const e=["onPress"];function t(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.ClipboardPasteButton=function(t){let{onPress:o}=t,l=(0,n.default)(t,e);if(!u.default)return null;return(0,s.jsx)(u.default,Object.assign({onPastePressed:({nativeEvent:e})=>{o(e)}},l))};var n=t(r(d[0])),s=r(d[1]),u=t(r(d[2]))},2237,[120,10,2238]);
8
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t}}),r(d[0]),r(d[1]);var t=void 0},2238,[289,136]);
@@ -1,3 +0,0 @@
1
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.notificationAsync=async function(e=o.NotificationFeedbackType.Success){if(!c.default?.notificationAsync)throw new t.UnavailabilityError('Haptics','notificationAsync');await c.default.notificationAsync(e)},_e.impactAsync=async function(e=o.ImpactFeedbackStyle.Medium){if(!c.default?.impactAsync)throw new t.UnavailabilityError('Haptic','impactAsync');await c.default.impactAsync(e)},_e.selectionAsync=async function(){if(!c.default?.selectionAsync)throw new t.UnavailabilityError('Haptic','selectionAsync');await c.default.selectionAsync()},_e.performAndroidHapticsAsync=async function(e){return},Object.defineProperty(_e,"NotificationFeedbackType",{enumerable:!0,get:function(){return o.NotificationFeedbackType}}),Object.defineProperty(_e,"ImpactFeedbackStyle",{enumerable:!0,get:function(){return o.ImpactFeedbackStyle}}),Object.defineProperty(_e,"AndroidHaptics",{enumerable:!0,get:function(){return o.AndroidHaptics}});var e,t=r(d[0]),n=r(d[1]),c=(e=n)&&e.__esModule?e:{default:e},o=r(d[2])},2226,[289,2230,2231]);
2
- __d(function(g,r,_i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return u}});var t=r(d[0]);const n={[t.NotificationFeedbackType.Success]:[40,100,40],[t.NotificationFeedbackType.Warning]:[50,100,50],[t.NotificationFeedbackType.Error]:[60,100,60,100,60],[t.ImpactFeedbackStyle.Light]:[40],[t.ImpactFeedbackStyle.Medium]:[50],[t.ImpactFeedbackStyle.Heavy]:[60],[t.ImpactFeedbackStyle.Soft]:[35],[t.ImpactFeedbackStyle.Rigid]:[45],selection:[50]};function i(){return'undefined'!=typeof window&&'navigator'in window&&'vibrate'in navigator}function c(){try{const t=document.createElement('label');t.ariaHidden='true',t.style.display='none';const n=document.createElement('input');n.type='checkbox',n.setAttribute('switch',''),t.appendChild(n),document.head.appendChild(t),t.click(),document.head.removeChild(t)}catch{}}const o='undefined'!=typeof window&&window.matchMedia('(pointer: coarse)').matches;function s(t){i()?navigator.vibrate(t):o&&c()}var u={async notificationAsync(s){if(i())return void navigator.vibrate(n[s]);if(!o)return;const u=s===t.NotificationFeedbackType.Error?3:2;for(let t=0;t<u;t++)t>0&&await new Promise(t=>setTimeout(t,120)),c()},async impactAsync(t){s(n[t])},async selectionAsync(){s(n.selection)}}},2230,[2231]);
3
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"NotificationFeedbackType",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"ImpactFeedbackStyle",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"AndroidHaptics",{enumerable:!0,get:function(){return o}});let t=(function(t){return t.Success="success",t.Warning="warning",t.Error="error",t})({}),n=(function(t){return t.Light="light",t.Medium="medium",t.Heavy="heavy",t.Soft="soft",t.Rigid="rigid",t})({}),o=(function(t){return t.Confirm="confirm",t.Reject="reject",t.Gesture_Start="gesture-start",t.Gesture_End="gesture-end",t.Toggle_On="toggle-on",t.Toggle_Off="toggle-off",t.Clock_Tick="clock-tick",t.Context_Click="context-click",t.Drag_Start="drag-start",t.Keyboard_Tap="keyboard-tap",t.Keyboard_Press="keyboard-press",t.Keyboard_Release="keyboard-release",t.Long_Press="long-press",t.Virtual_Key="virtual-key",t.Virtual_Key_Release="virtual-key-release",t.No_Haptics="no-haptics",t.Segment_Tick="segment-tick",t.Segment_Frequent_Tick="segment-frequent-tick",t.Text_Handle_Move="text-handle-move",t})({})},2231,[]);
@@ -1 +0,0 @@
1
- __d(function(g,r,i,a,m,e,d){function n(){throw new Error("node:fs is unavailable in the Viewer runtime")}m.exports={chmodSync:n,createWriteStream:n,existsSync:n,mkdirSync:n,promises:new Proxy({},{get:()=>n}),readFileSync:n,readdirSync:n,renameSync:n,rmSync:n,unlinkSync:n,writeFileSync:n}},2228,[]);
@@ -1 +0,0 @@
1
- __d(function(g,r,i,a,m,e,d){function n(){throw new Error("node:path is unavailable in the Viewer runtime")}m.exports={basename:n,join:n}},2227,[]);