@camstack/addon-pipeline-orchestrator 1.2.89 → 1.2.91

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/index.js CHANGED
@@ -21113,6 +21113,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
21113
21113
  location: StorageLocationSchema,
21114
21114
  relativePath: string()
21115
21115
  }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
21116
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21117
+ var ProfileSettingsSchemaBridge = unknown().nullable();
21118
+ var ProfileSettingsBagSchema = record(string(), unknown());
21116
21119
  /**
21117
21120
  * A live terminal session hosted by the provider addon. Output and input do
21118
21121
  * NOT flow through the capability — they use the addon data plane
@@ -21142,7 +21145,14 @@ var TerminalSessionInfoSchema = object({
21142
21145
  var TerminalProfileInfoSchema = object({
21143
21146
  profileId: string(),
21144
21147
  label: string(),
21145
- description: string().optional()
21148
+ description: string().optional(),
21149
+ /** Spawn defaults the instance form copies on create. */
21150
+ executable: string().optional(),
21151
+ args: array(string()).readonly().optional(),
21152
+ cwd: string().optional(),
21153
+ environment: array(string()).readonly().optional(),
21154
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
21155
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
21146
21156
  });
21147
21157
  /**
21148
21158
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -21155,7 +21165,12 @@ var TerminalInstanceInfoSchema = object({
21155
21165
  profileId: string(),
21156
21166
  profileLabel: string(),
21157
21167
  name: string(),
21158
- enabled: boolean()
21168
+ enabled: boolean(),
21169
+ executable: string(),
21170
+ args: array(string()).readonly(),
21171
+ cwd: string(),
21172
+ environment: array(string()).readonly(),
21173
+ profileSettings: ProfileSettingsBagSchema
21159
21174
  });
21160
21175
  var TerminalLegacyCameraSchema = object({
21161
21176
  stableId: string(),
@@ -21185,7 +21200,23 @@ var TerminalOutputBatchSchema = object({
21185
21200
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
21186
21201
  targetNodeId: string().min(1),
21187
21202
  profileId: string().min(1),
21188
- name: string().trim().min(1).max(160).optional()
21203
+ name: string().trim().min(1).max(160).optional(),
21204
+ executable: string().max(1024).optional(),
21205
+ args: array(string().max(2048)).max(64).optional(),
21206
+ cwd: string().max(1024).optional(),
21207
+ environment: array(string().max(4096)).max(64).optional(),
21208
+ profileSettings: ProfileSettingsBagSchema.optional()
21209
+ }), TerminalInstanceInfoSchema, {
21210
+ kind: "mutation",
21211
+ auth: "admin"
21212
+ }), method(object({
21213
+ instanceId: string().min(1),
21214
+ name: string().trim().min(1).max(160).optional(),
21215
+ executable: string().max(1024).optional(),
21216
+ args: array(string().max(2048)).max(64).optional(),
21217
+ cwd: string().max(1024).optional(),
21218
+ environment: array(string().max(4096)).max(64).optional(),
21219
+ profileSettings: ProfileSettingsBagSchema.optional()
21189
21220
  }), TerminalInstanceInfoSchema, {
21190
21221
  kind: "mutation",
21191
21222
  auth: "admin"
@@ -21207,7 +21238,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
21207
21238
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
21208
21239
  profileId: string(),
21209
21240
  cols: number().int().positive(),
21210
- rows: number().int().positive()
21241
+ rows: number().int().positive(),
21242
+ executable: string().max(1024).optional(),
21243
+ args: array(string().max(2048)).max(64).optional(),
21244
+ cwd: string().max(1024).optional(),
21245
+ environment: array(string().max(4096)).max(64).optional()
21211
21246
  }), TerminalSessionInfoSchema, {
21212
21247
  kind: "mutation",
21213
21248
  auth: "admin"
@@ -23989,10 +24024,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
23989
24024
  *
23990
24025
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
23991
24026
  * to receive an ordered list of candidate base URLs it should race
23992
- * on connect — LAN IPv4 first (lowest latency when on same network),
23993
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
23994
- * race them with short timeouts and stick with the winner for the
23995
- * session.
24027
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24028
+ * when on the same network), then public hostname (if a tunnel is
24029
+ * up). The SDK can race them with short timeouts and stick with the
24030
+ * winner for the session.
23996
24031
  *
23997
24032
  * Why hub-only: agents are not directly addressable by the operator's
23998
24033
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24155,6 +24190,20 @@ var AllowedAddressesSchema = object({
24155
24190
  * Network Addresses admin page and persisted by the addon.
24156
24191
  */
24157
24192
  addresses: array(string()).readonly() });
24193
+ var TlsStatusSchema = object({
24194
+ mode: _enum([
24195
+ "generated",
24196
+ "uploaded",
24197
+ "disabled"
24198
+ ]),
24199
+ leafFingerprintSha256: string().nullable(),
24200
+ caFingerprintSha256: string().nullable(),
24201
+ validTo: string().nullable(),
24202
+ sans: array(string()),
24203
+ caCertPem: string().nullable(),
24204
+ reissueError: string().nullable(),
24205
+ restartRequired: boolean()
24206
+ });
24158
24207
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24159
24208
  /**
24160
24209
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24174,7 +24223,20 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24174
24223
  * to avoid mixed-content blocks in the browser. The public
24175
24224
  * tunnel always emits `https://` regardless. */
24176
24225
  scheme: _enum(["http", "https"]).optional()
24177
- }), 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" });
24226
+ }), 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, {
24227
+ kind: "mutation",
24228
+ auth: "admin"
24229
+ }), method(object({
24230
+ certPem: string().min(1),
24231
+ keyPem: string().min(1),
24232
+ caPem: string().optional()
24233
+ }), TlsStatusSchema, {
24234
+ kind: "mutation",
24235
+ auth: "admin"
24236
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24237
+ kind: "mutation",
24238
+ auth: "admin"
24239
+ });
24178
24240
  object({
24179
24241
  /** Lifecycle state of the lock. `jammed` means the motor reported
24180
24242
  * failure to reach the target — operator intervention required. */
@@ -30021,6 +30083,12 @@ Object.freeze({
30021
30083
  addonId: null,
30022
30084
  access: "create"
30023
30085
  },
30086
+ "localNetwork.downloadCa": {
30087
+ capName: "local-network",
30088
+ capScope: "system",
30089
+ addonId: null,
30090
+ access: "view"
30091
+ },
30024
30092
  "localNetwork.getAllowedAddresses": {
30025
30093
  capName: "local-network",
30026
30094
  capScope: "system",
@@ -30045,18 +30113,36 @@ Object.freeze({
30045
30113
  addonId: null,
30046
30114
  access: "view"
30047
30115
  },
30116
+ "localNetwork.getTlsStatus": {
30117
+ capName: "local-network",
30118
+ capScope: "system",
30119
+ addonId: null,
30120
+ access: "view"
30121
+ },
30048
30122
  "localNetwork.list": {
30049
30123
  capName: "local-network",
30050
30124
  capScope: "system",
30051
30125
  addonId: null,
30052
30126
  access: "view"
30053
30127
  },
30128
+ "localNetwork.regenerateCertificate": {
30129
+ capName: "local-network",
30130
+ capScope: "system",
30131
+ addonId: null,
30132
+ access: "create"
30133
+ },
30054
30134
  "localNetwork.resetAllowlistToBestMatch": {
30055
30135
  capName: "local-network",
30056
30136
  capScope: "system",
30057
30137
  addonId: null,
30058
30138
  access: "delete"
30059
30139
  },
30140
+ "localNetwork.revertToGeneratedCertificate": {
30141
+ capName: "local-network",
30142
+ capScope: "system",
30143
+ addonId: null,
30144
+ access: "create"
30145
+ },
30060
30146
  "localNetwork.setAllowedAddresses": {
30061
30147
  capName: "local-network",
30062
30148
  capScope: "system",
@@ -30069,6 +30155,12 @@ Object.freeze({
30069
30155
  addonId: null,
30070
30156
  access: "create"
30071
30157
  },
30158
+ "localNetwork.uploadCertificate": {
30159
+ capName: "local-network",
30160
+ capScope: "system",
30161
+ addonId: null,
30162
+ access: "create"
30163
+ },
30072
30164
  "lockControl.lock": {
30073
30165
  capName: "lock-control",
30074
30166
  capScope: "device",
@@ -32949,6 +33041,12 @@ Object.freeze({
32949
33041
  addonId: null,
32950
33042
  access: "create"
32951
33043
  },
33044
+ "terminalSession.updateInstance": {
33045
+ capName: "terminal-session",
33046
+ capScope: "system",
33047
+ addonId: null,
33048
+ access: "create"
33049
+ },
32952
33050
  "terminalSession.writeInput": {
32953
33051
  capName: "terminal-session",
32954
33052
  capScope: "system",
@@ -35503,6 +35601,35 @@ function clusterModelSettingKey(stepId) {
35503
35601
  }
35504
35602
  Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
35505
35603
  string().min(1);
35604
+ var CLUSTER_STEP_SETTING_FIELDS = [{
35605
+ stepId: "face-embedding",
35606
+ key: "minLandmarkFaceSize",
35607
+ label: "Min face size for recognition (detection px)",
35608
+ 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.",
35609
+ type: "slider",
35610
+ min: 0,
35611
+ max: 64,
35612
+ step: 2,
35613
+ default: 24
35614
+ }];
35615
+ function clusterStepSettingKey(stepId, fieldKey) {
35616
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
35617
+ }
35618
+ var ClusterSettingNumberSchema = number().finite();
35619
+ function readClusterStepSettings(config) {
35620
+ const out = {};
35621
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
35622
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
35623
+ const value = parsed.success ? parsed.data : field.default;
35624
+ const existing = out[field.stepId] ?? {};
35625
+ out[field.stepId] = {
35626
+ ...existing,
35627
+ [field.key]: value
35628
+ };
35629
+ }
35630
+ return out;
35631
+ }
35632
+ readClusterStepSettings({});
35506
35633
  /**
35507
35634
  * THE detail-crop convention — the single derivation of the rectangle a
35508
35635
  * detail/enrichment step (clip-embedding, face-detection, plate-detection…)
@@ -48055,8 +48182,8 @@ function buildGlobalSettingsSections(options) {
48055
48182
  id: CLUSTER_MODEL_SECTION_ID,
48056
48183
  title: "Enrichment models",
48057
48184
  tab: "pipeline",
48058
- 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.",
48059
- fields: CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48185
+ 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.",
48186
+ fields: [...CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48060
48187
  key: clusterModelSettingKey(step.stepId),
48061
48188
  type: "select",
48062
48189
  label: step.label,
@@ -48066,7 +48193,17 @@ function buildGlobalSettingsSections(options) {
48066
48193
  label: o.label
48067
48194
  })),
48068
48195
  default: step.defaultModelId
48069
- }))
48196
+ })), ...CLUSTER_STEP_SETTING_FIELDS.map((field) => ({
48197
+ key: clusterStepSettingKey(field.stepId, field.key),
48198
+ type: "slider",
48199
+ label: field.label,
48200
+ description: field.description,
48201
+ min: field.min,
48202
+ max: field.max,
48203
+ step: field.step,
48204
+ default: field.default,
48205
+ showValue: true
48206
+ }))]
48070
48207
  },
48071
48208
  {
48072
48209
  id: DETAIL_CROP_SECTION_ID,
package/dist/index.mjs CHANGED
@@ -21085,6 +21085,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
21085
21085
  location: StorageLocationSchema,
21086
21086
  relativePath: string()
21087
21087
  }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
21088
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21089
+ var ProfileSettingsSchemaBridge = unknown().nullable();
21090
+ var ProfileSettingsBagSchema = record(string(), unknown());
21088
21091
  /**
21089
21092
  * A live terminal session hosted by the provider addon. Output and input do
21090
21093
  * NOT flow through the capability — they use the addon data plane
@@ -21114,7 +21117,14 @@ var TerminalSessionInfoSchema = object({
21114
21117
  var TerminalProfileInfoSchema = object({
21115
21118
  profileId: string(),
21116
21119
  label: string(),
21117
- description: string().optional()
21120
+ description: string().optional(),
21121
+ /** Spawn defaults the instance form copies on create. */
21122
+ executable: string().optional(),
21123
+ args: array(string()).readonly().optional(),
21124
+ cwd: string().optional(),
21125
+ environment: array(string()).readonly().optional(),
21126
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
21127
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
21118
21128
  });
21119
21129
  /**
21120
21130
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -21127,7 +21137,12 @@ var TerminalInstanceInfoSchema = object({
21127
21137
  profileId: string(),
21128
21138
  profileLabel: string(),
21129
21139
  name: string(),
21130
- enabled: boolean()
21140
+ enabled: boolean(),
21141
+ executable: string(),
21142
+ args: array(string()).readonly(),
21143
+ cwd: string(),
21144
+ environment: array(string()).readonly(),
21145
+ profileSettings: ProfileSettingsBagSchema
21131
21146
  });
21132
21147
  var TerminalLegacyCameraSchema = object({
21133
21148
  stableId: string(),
@@ -21157,7 +21172,23 @@ var TerminalOutputBatchSchema = object({
21157
21172
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
21158
21173
  targetNodeId: string().min(1),
21159
21174
  profileId: string().min(1),
21160
- name: string().trim().min(1).max(160).optional()
21175
+ name: string().trim().min(1).max(160).optional(),
21176
+ executable: string().max(1024).optional(),
21177
+ args: array(string().max(2048)).max(64).optional(),
21178
+ cwd: string().max(1024).optional(),
21179
+ environment: array(string().max(4096)).max(64).optional(),
21180
+ profileSettings: ProfileSettingsBagSchema.optional()
21181
+ }), TerminalInstanceInfoSchema, {
21182
+ kind: "mutation",
21183
+ auth: "admin"
21184
+ }), method(object({
21185
+ instanceId: string().min(1),
21186
+ name: string().trim().min(1).max(160).optional(),
21187
+ executable: string().max(1024).optional(),
21188
+ args: array(string().max(2048)).max(64).optional(),
21189
+ cwd: string().max(1024).optional(),
21190
+ environment: array(string().max(4096)).max(64).optional(),
21191
+ profileSettings: ProfileSettingsBagSchema.optional()
21161
21192
  }), TerminalInstanceInfoSchema, {
21162
21193
  kind: "mutation",
21163
21194
  auth: "admin"
@@ -21179,7 +21210,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
21179
21210
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
21180
21211
  profileId: string(),
21181
21212
  cols: number().int().positive(),
21182
- rows: number().int().positive()
21213
+ rows: number().int().positive(),
21214
+ executable: string().max(1024).optional(),
21215
+ args: array(string().max(2048)).max(64).optional(),
21216
+ cwd: string().max(1024).optional(),
21217
+ environment: array(string().max(4096)).max(64).optional()
21183
21218
  }), TerminalSessionInfoSchema, {
21184
21219
  kind: "mutation",
21185
21220
  auth: "admin"
@@ -23961,10 +23996,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
23961
23996
  *
23962
23997
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
23963
23998
  * to receive an ordered list of candidate base URLs it should race
23964
- * on connect — LAN IPv4 first (lowest latency when on same network),
23965
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
23966
- * race them with short timeouts and stick with the winner for the
23967
- * session.
23999
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24000
+ * when on the same network), then public hostname (if a tunnel is
24001
+ * up). The SDK can race them with short timeouts and stick with the
24002
+ * winner for the session.
23968
24003
  *
23969
24004
  * Why hub-only: agents are not directly addressable by the operator's
23970
24005
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24127,6 +24162,20 @@ var AllowedAddressesSchema = object({
24127
24162
  * Network Addresses admin page and persisted by the addon.
24128
24163
  */
24129
24164
  addresses: array(string()).readonly() });
24165
+ var TlsStatusSchema = object({
24166
+ mode: _enum([
24167
+ "generated",
24168
+ "uploaded",
24169
+ "disabled"
24170
+ ]),
24171
+ leafFingerprintSha256: string().nullable(),
24172
+ caFingerprintSha256: string().nullable(),
24173
+ validTo: string().nullable(),
24174
+ sans: array(string()),
24175
+ caCertPem: string().nullable(),
24176
+ reissueError: string().nullable(),
24177
+ restartRequired: boolean()
24178
+ });
24130
24179
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24131
24180
  /**
24132
24181
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24146,7 +24195,20 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24146
24195
  * to avoid mixed-content blocks in the browser. The public
24147
24196
  * tunnel always emits `https://` regardless. */
24148
24197
  scheme: _enum(["http", "https"]).optional()
24149
- }), 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" });
24198
+ }), 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, {
24199
+ kind: "mutation",
24200
+ auth: "admin"
24201
+ }), method(object({
24202
+ certPem: string().min(1),
24203
+ keyPem: string().min(1),
24204
+ caPem: string().optional()
24205
+ }), TlsStatusSchema, {
24206
+ kind: "mutation",
24207
+ auth: "admin"
24208
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24209
+ kind: "mutation",
24210
+ auth: "admin"
24211
+ });
24150
24212
  object({
24151
24213
  /** Lifecycle state of the lock. `jammed` means the motor reported
24152
24214
  * failure to reach the target — operator intervention required. */
@@ -29993,6 +30055,12 @@ Object.freeze({
29993
30055
  addonId: null,
29994
30056
  access: "create"
29995
30057
  },
30058
+ "localNetwork.downloadCa": {
30059
+ capName: "local-network",
30060
+ capScope: "system",
30061
+ addonId: null,
30062
+ access: "view"
30063
+ },
29996
30064
  "localNetwork.getAllowedAddresses": {
29997
30065
  capName: "local-network",
29998
30066
  capScope: "system",
@@ -30017,18 +30085,36 @@ Object.freeze({
30017
30085
  addonId: null,
30018
30086
  access: "view"
30019
30087
  },
30088
+ "localNetwork.getTlsStatus": {
30089
+ capName: "local-network",
30090
+ capScope: "system",
30091
+ addonId: null,
30092
+ access: "view"
30093
+ },
30020
30094
  "localNetwork.list": {
30021
30095
  capName: "local-network",
30022
30096
  capScope: "system",
30023
30097
  addonId: null,
30024
30098
  access: "view"
30025
30099
  },
30100
+ "localNetwork.regenerateCertificate": {
30101
+ capName: "local-network",
30102
+ capScope: "system",
30103
+ addonId: null,
30104
+ access: "create"
30105
+ },
30026
30106
  "localNetwork.resetAllowlistToBestMatch": {
30027
30107
  capName: "local-network",
30028
30108
  capScope: "system",
30029
30109
  addonId: null,
30030
30110
  access: "delete"
30031
30111
  },
30112
+ "localNetwork.revertToGeneratedCertificate": {
30113
+ capName: "local-network",
30114
+ capScope: "system",
30115
+ addonId: null,
30116
+ access: "create"
30117
+ },
30032
30118
  "localNetwork.setAllowedAddresses": {
30033
30119
  capName: "local-network",
30034
30120
  capScope: "system",
@@ -30041,6 +30127,12 @@ Object.freeze({
30041
30127
  addonId: null,
30042
30128
  access: "create"
30043
30129
  },
30130
+ "localNetwork.uploadCertificate": {
30131
+ capName: "local-network",
30132
+ capScope: "system",
30133
+ addonId: null,
30134
+ access: "create"
30135
+ },
30044
30136
  "lockControl.lock": {
30045
30137
  capName: "lock-control",
30046
30138
  capScope: "device",
@@ -32921,6 +33013,12 @@ Object.freeze({
32921
33013
  addonId: null,
32922
33014
  access: "create"
32923
33015
  },
33016
+ "terminalSession.updateInstance": {
33017
+ capName: "terminal-session",
33018
+ capScope: "system",
33019
+ addonId: null,
33020
+ access: "create"
33021
+ },
32924
33022
  "terminalSession.writeInput": {
32925
33023
  capName: "terminal-session",
32926
33024
  capScope: "system",
@@ -35475,6 +35573,35 @@ function clusterModelSettingKey(stepId) {
35475
35573
  }
35476
35574
  Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
35477
35575
  string().min(1);
35576
+ var CLUSTER_STEP_SETTING_FIELDS = [{
35577
+ stepId: "face-embedding",
35578
+ key: "minLandmarkFaceSize",
35579
+ label: "Min face size for recognition (detection px)",
35580
+ 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.",
35581
+ type: "slider",
35582
+ min: 0,
35583
+ max: 64,
35584
+ step: 2,
35585
+ default: 24
35586
+ }];
35587
+ function clusterStepSettingKey(stepId, fieldKey) {
35588
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
35589
+ }
35590
+ var ClusterSettingNumberSchema = number().finite();
35591
+ function readClusterStepSettings(config) {
35592
+ const out = {};
35593
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
35594
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
35595
+ const value = parsed.success ? parsed.data : field.default;
35596
+ const existing = out[field.stepId] ?? {};
35597
+ out[field.stepId] = {
35598
+ ...existing,
35599
+ [field.key]: value
35600
+ };
35601
+ }
35602
+ return out;
35603
+ }
35604
+ readClusterStepSettings({});
35478
35605
  /**
35479
35606
  * THE detail-crop convention — the single derivation of the rectangle a
35480
35607
  * detail/enrichment step (clip-embedding, face-detection, plate-detection…)
@@ -48027,8 +48154,8 @@ function buildGlobalSettingsSections(options) {
48027
48154
  id: CLUSTER_MODEL_SECTION_ID,
48028
48155
  title: "Enrichment models",
48029
48156
  tab: "pipeline",
48030
- 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.",
48031
- fields: CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48157
+ 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.",
48158
+ fields: [...CLUSTER_MODEL_SCOPED_STEPS.map((step) => ({
48032
48159
  key: clusterModelSettingKey(step.stepId),
48033
48160
  type: "select",
48034
48161
  label: step.label,
@@ -48038,7 +48165,17 @@ function buildGlobalSettingsSections(options) {
48038
48165
  label: o.label
48039
48166
  })),
48040
48167
  default: step.defaultModelId
48041
- }))
48168
+ })), ...CLUSTER_STEP_SETTING_FIELDS.map((field) => ({
48169
+ key: clusterStepSettingKey(field.stepId, field.key),
48170
+ type: "slider",
48171
+ label: field.label,
48172
+ description: field.description,
48173
+ min: field.min,
48174
+ max: field.max,
48175
+ step: field.step,
48176
+ default: field.default,
48177
+ showValue: true
48178
+ }))]
48042
48179
  },
48043
48180
  {
48044
48181
  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-CGGkgR5Q.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets--gAOotmS.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.89",
3
+ "version": "1.2.91",
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",