@camstack/types 1.1.24 → 1.1.26

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.
@@ -51,7 +51,7 @@ export declare const decoderCapability: {
51
51
  readonly name: "decoder";
52
52
  readonly scope: "system";
53
53
  readonly mode: "singleton";
54
- readonly preferredProvider: "decoder-ffmpeg";
54
+ readonly preferredProvider: "decoder-nodeav";
55
55
  readonly methods: {
56
56
  readonly supportsCodec: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
57
57
  codec: z.ZodString;
@@ -687,6 +687,11 @@ export declare const pipelineOrchestratorCapability: {
687
687
  settings: z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
688
688
  }, z.core.$strip>>>;
689
689
  maxCameras: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
690
+ detectWeight: z.ZodOptional<z.ZodNumber>;
691
+ detect: z.ZodOptional<z.ZodBoolean>;
692
+ decode: z.ZodOptional<z.ZodBoolean>;
693
+ audio: z.ZodOptional<z.ZodBoolean>;
694
+ ingest: z.ZodOptional<z.ZodBoolean>;
690
695
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
691
696
  /** Enumerate every agent's settings (hub + remote runners). */
692
697
  readonly listAgentSettings: import("./capability-definition.js").CapabilityMethodSchema<z.ZodVoid, z.ZodReadonly<z.ZodArray<z.ZodObject<{
@@ -698,6 +703,11 @@ export declare const pipelineOrchestratorCapability: {
698
703
  settings: z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
699
704
  }, z.core.$strip>>>;
700
705
  maxCameras: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
706
+ detectWeight: z.ZodOptional<z.ZodNumber>;
707
+ detect: z.ZodOptional<z.ZodBoolean>;
708
+ decode: z.ZodOptional<z.ZodBoolean>;
709
+ audio: z.ZodOptional<z.ZodBoolean>;
710
+ ingest: z.ZodOptional<z.ZodBoolean>;
701
711
  }, z.core.$strip>;
702
712
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
703
713
  /** Bulk-replace ALL addon configs on one agent. Used by the agent-level PipelineEditor which emits the full map per edit. Merges on top of existing entries — omitted addonIds are left alone. */
@@ -745,6 +755,36 @@ export declare const pipelineOrchestratorCapability: {
745
755
  }, z.core.$strip>, z.ZodObject<{
746
756
  success: z.ZodLiteral<true>;
747
757
  }, z.core.$strip>, "mutation">;
758
+ /**
759
+ * Set a node's detection WEIGHT (relative share for the quota balancer).
760
+ * `null` clears it (back to the implicit weight 1). Unpinned cameras
761
+ * distribute proportionally to weight; `maxCameras` still clamps on top.
762
+ */
763
+ readonly setAgentDetectWeight: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
764
+ agentNodeId: z.ZodString;
765
+ detectWeight: z.ZodNullable<z.ZodNumber>;
766
+ }, z.core.$strip>, z.ZodObject<{
767
+ success: z.ZodLiteral<true>;
768
+ }, z.core.$strip>, "mutation">;
769
+ /**
770
+ * Set one node's placement CAPABILITIES — the per-node record that
771
+ * replaced the four flat orchestrator lists (`enabledNodes`,
772
+ * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
773
+ * Each flag is optional in the patch: omit a flag to leave it unchanged,
774
+ * pass `null` to reset it to the node default (`hub` → capable, every
775
+ * other node → not). Detection/decode/audio eligibility is derived from
776
+ * these flags across the cluster; changing them re-derives the enabled
777
+ * sets and reconciles dispatch immediately.
778
+ */
779
+ readonly setAgentCapabilities: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
780
+ agentNodeId: z.ZodString;
781
+ detect: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
782
+ decode: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
783
+ audio: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
784
+ ingest: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
785
+ }, z.core.$strip>, z.ZodObject<{
786
+ success: z.ZodLiteral<true>;
787
+ }, z.core.$strip>, "mutation">;
748
788
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
749
789
  readonly getCameraSettings: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
750
790
  deviceId: z.ZodNumber;
@@ -9830,6 +9830,11 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
9830
9830
  settings: Readonly<Record<string, unknown>>;
9831
9831
  }>>;
9832
9832
  maxCameras: number | null;
9833
+ detectWeight?: number | undefined;
9834
+ detect?: boolean | undefined;
9835
+ decode?: boolean | undefined;
9836
+ audio?: boolean | undefined;
9837
+ ingest?: boolean | undefined;
9833
9838
  } | null;
9834
9839
  meta: object;
9835
9840
  }>;
@@ -9846,6 +9851,11 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
9846
9851
  settings: Readonly<Record<string, unknown>>;
9847
9852
  }>>;
9848
9853
  maxCameras: number | null;
9854
+ detectWeight?: number | undefined;
9855
+ detect?: boolean | undefined;
9856
+ decode?: boolean | undefined;
9857
+ audio?: boolean | undefined;
9858
+ ingest?: boolean | undefined;
9849
9859
  };
9850
9860
  }[];
9851
9861
  meta: object;
@@ -9887,6 +9897,31 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
9887
9897
  };
9888
9898
  meta: object;
9889
9899
  }>;
9900
+ setAgentDetectWeight: import("@trpc/server").TRPCMutationProcedure<{
9901
+ input: {
9902
+ [x: string]: unknown;
9903
+ agentNodeId: string;
9904
+ detectWeight: number | null;
9905
+ };
9906
+ output: {
9907
+ success: true;
9908
+ };
9909
+ meta: object;
9910
+ }>;
9911
+ setAgentCapabilities: import("@trpc/server").TRPCMutationProcedure<{
9912
+ input: {
9913
+ [x: string]: unknown;
9914
+ agentNodeId: string;
9915
+ detect?: boolean | null | undefined;
9916
+ decode?: boolean | null | undefined;
9917
+ audio?: boolean | null | undefined;
9918
+ ingest?: boolean | null | undefined;
9919
+ };
9920
+ output: {
9921
+ success: true;
9922
+ };
9923
+ meta: object;
9924
+ }>;
9890
9925
  getCameraSettings: import("@trpc/server").TRPCQueryProcedure<{
9891
9926
  input: {
9892
9927
  [x: string]: unknown;
@@ -24168,6 +24203,11 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
24168
24203
  settings: Readonly<Record<string, unknown>>;
24169
24204
  }>>;
24170
24205
  maxCameras: number | null;
24206
+ detectWeight?: number | undefined;
24207
+ detect?: boolean | undefined;
24208
+ decode?: boolean | undefined;
24209
+ audio?: boolean | undefined;
24210
+ ingest?: boolean | undefined;
24171
24211
  } | null;
24172
24212
  meta: object;
24173
24213
  }>;
@@ -24184,6 +24224,11 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
24184
24224
  settings: Readonly<Record<string, unknown>>;
24185
24225
  }>>;
24186
24226
  maxCameras: number | null;
24227
+ detectWeight?: number | undefined;
24228
+ detect?: boolean | undefined;
24229
+ decode?: boolean | undefined;
24230
+ audio?: boolean | undefined;
24231
+ ingest?: boolean | undefined;
24187
24232
  };
24188
24233
  }[];
24189
24234
  meta: object;
@@ -24225,6 +24270,31 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
24225
24270
  };
24226
24271
  meta: object;
24227
24272
  }>;
24273
+ setAgentDetectWeight: import("@trpc/server").TRPCMutationProcedure<{
24274
+ input: {
24275
+ [x: string]: unknown;
24276
+ agentNodeId: string;
24277
+ detectWeight: number | null;
24278
+ };
24279
+ output: {
24280
+ success: true;
24281
+ };
24282
+ meta: object;
24283
+ }>;
24284
+ setAgentCapabilities: import("@trpc/server").TRPCMutationProcedure<{
24285
+ input: {
24286
+ [x: string]: unknown;
24287
+ agentNodeId: string;
24288
+ detect?: boolean | null | undefined;
24289
+ decode?: boolean | null | undefined;
24290
+ audio?: boolean | null | undefined;
24291
+ ingest?: boolean | null | undefined;
24292
+ };
24293
+ output: {
24294
+ success: true;
24295
+ };
24296
+ meta: object;
24297
+ }>;
24228
24298
  getCameraSettings: import("@trpc/server").TRPCQueryProcedure<{
24229
24299
  input: {
24230
24300
  [x: string]: unknown;
@@ -6,7 +6,7 @@
6
6
  * scope+access check inside `protectedProcedure` (see
7
7
  * `server/backend/src/api/trpc/trpc.middleware.ts`).
8
8
  *
9
- * Coverage: 733 method paths across 111 capabilities.
9
+ * Coverage: 735 method paths across 111 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -72,7 +72,7 @@ export interface SystemProxy {
72
72
  readonly nodes: Pick<InferProvider<typeof nodesCapability>, 'topology' | 'deployAddon' | 'undeployAddon' | 'restartAddon' | 'restartProcess' | 'restartNode' | 'shutdownNode' | 'renameNode' | 'clusterAddonStatus' | 'getCapUsageGraph' | 'getNodeAddons' | 'setProcessLogLevel' | 'executeQuery'>;
73
73
  readonly notificationOutput: Pick<InferProvider<typeof notificationOutputCapability>, 'listTargetKinds' | 'listTargets' | 'discoverTargets' | 'send' | 'testTarget' | 'upsertTarget' | 'deleteTarget' | 'setTargetEnabled'>;
74
74
  readonly pipelineExecutor: Pick<InferProvider<typeof pipelineExecutorCapability>, 'getAvailableEngines' | 'getSelectedEngine' | 'getDefaultSteps' | 'reprobeEngine' | 'getEngineProvisioning' | 'getVideoPipelineSteps' | 'setVideoPipelineSteps' | 'getSchema' | 'getGlobalSteps' | 'getGlobalPipelineConfig' | 'getOrchestratorConfigSchema' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate' | 'getCapabilities' | 'getAddonModels' | 'downloadModel' | 'deleteModel' | 'detect' | 'cacheFrameInPool' | 'inferCached' | 'uncacheFrame' | 'getEffectiveTuning' | 'listLoadedEngines' | 'spinEngine' | 'killEngine' | 'listReferenceImages' | 'getReferenceImage' | 'getReferenceAudioFiles' | 'getReferenceAudio' | 'getAudioCapabilities' | 'runAudioTest' | 'getDetectionConfigSchema'>;
75
- readonly pipelineOrchestrator: Pick<InferProvider<typeof pipelineOrchestratorCapability>, 'rebalance' | 'getPipelineAssignments' | 'getAgentLoad' | 'getGlobalMetrics' | 'getCapabilityBindings' | 'setCapabilityBinding' | 'getDecoderAssignments' | 'getAudioNodeLoad' | 'getAgentSettings' | 'listAgentSettings' | 'setAgentAddonDefaults' | 'removeAgentSettings' | 'setAgentMaxCameras' | 'getCameraStatuses' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate'>;
75
+ readonly pipelineOrchestrator: Pick<InferProvider<typeof pipelineOrchestratorCapability>, 'rebalance' | 'getPipelineAssignments' | 'getAgentLoad' | 'getGlobalMetrics' | 'getCapabilityBindings' | 'setCapabilityBinding' | 'getDecoderAssignments' | 'getAudioNodeLoad' | 'getAgentSettings' | 'listAgentSettings' | 'setAgentAddonDefaults' | 'removeAgentSettings' | 'setAgentMaxCameras' | 'setAgentDetectWeight' | 'setAgentCapabilities' | 'getCameraStatuses' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate'>;
76
76
  readonly pipelineRunner: Pick<InferProvider<typeof pipelineRunnerCapability>, 'attachCamera' | 'reportMotion' | 'getLocalLoad' | 'getLocalMetrics' | 'getAllCameraMetrics' | 'getLocalCameras'>;
77
77
  readonly plateGallery: Pick<InferProvider<typeof plateGalleryCapability>, 'getPlateMedia' | 'searchPlates' | 'suggestPlateClusters' | 'correctPlateText' | 'deletePlate'>;
78
78
  readonly recording: Pick<InferProvider<typeof recordingCapability>, 'getStorageUsage'>;
package/dist/index.js CHANGED
@@ -11998,6 +11998,8 @@ function createSystemProxy(api) {
11998
11998
  setAgentAddonDefaults: (input) => dispatch("pipelineOrchestrator", "setAgentAddonDefaults", "mutation", input),
11999
11999
  removeAgentSettings: (input) => dispatch("pipelineOrchestrator", "removeAgentSettings", "mutation", input),
12000
12000
  setAgentMaxCameras: (input) => dispatch("pipelineOrchestrator", "setAgentMaxCameras", "mutation", input),
12001
+ setAgentDetectWeight: (input) => dispatch("pipelineOrchestrator", "setAgentDetectWeight", "mutation", input),
12002
+ setAgentCapabilities: (input) => dispatch("pipelineOrchestrator", "setAgentCapabilities", "mutation", input),
12001
12003
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
12002
12004
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
12003
12005
  saveTemplate: (input) => dispatch("pipelineOrchestrator", "saveTemplate", "mutation", input),
@@ -14255,7 +14257,7 @@ var decoderCapability = {
14255
14257
  name: "decoder",
14256
14258
  scope: "system",
14257
14259
  mode: "singleton",
14258
- preferredProvider: "decoder-ffmpeg",
14260
+ preferredProvider: "decoder-nodeav",
14259
14261
  methods: {
14260
14262
  supportsCodec: require_sleep.method(zod.z.object({ codec: zod.z.string() }), zod.z.boolean()),
14261
14263
  getInfo: require_sleep.method(zod.z.void(), zod.z.object({
@@ -16920,7 +16922,17 @@ var AgentAddonConfigSchema = zod.z.object({
16920
16922
  });
16921
16923
  var AgentPipelineSettingsSchema = zod.z.object({
16922
16924
  addonDefaults: zod.z.record(zod.z.string(), AgentAddonConfigSchema).readonly(),
16923
- maxCameras: zod.z.number().int().nonnegative().nullable().default(null)
16925
+ maxCameras: zod.z.number().int().nonnegative().nullable().default(null),
16926
+ /** Per-node detection weight (relative share for the quota balancer). */
16927
+ detectWeight: zod.z.number().positive().optional(),
16928
+ /** Node is eligible to run the detection pipeline (decode + inference). */
16929
+ detect: zod.z.boolean().optional(),
16930
+ /** Node is eligible to host decoder sessions. */
16931
+ decode: zod.z.boolean().optional(),
16932
+ /** Node is eligible to run audio-analyzer sessions. */
16933
+ audio: zod.z.boolean().optional(),
16934
+ /** Node is eligible to be the ingest / source-owner (serve the restream). */
16935
+ ingest: zod.z.boolean().optional()
16924
16936
  });
16925
16937
  var CameraPipelineForAgentSchema = zod.z.object({
16926
16938
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
@@ -17362,6 +17374,38 @@ var pipelineOrchestratorCapability = {
17362
17374
  kind: "mutation",
17363
17375
  auth: "admin"
17364
17376
  }),
17377
+ /**
17378
+ * Set a node's detection WEIGHT (relative share for the quota balancer).
17379
+ * `null` clears it (back to the implicit weight 1). Unpinned cameras
17380
+ * distribute proportionally to weight; `maxCameras` still clamps on top.
17381
+ */
17382
+ setAgentDetectWeight: require_sleep.method(zod.z.object({
17383
+ agentNodeId: zod.z.string(),
17384
+ detectWeight: zod.z.number().positive().nullable()
17385
+ }), zod.z.object({ success: zod.z.literal(true) }), {
17386
+ kind: "mutation",
17387
+ auth: "admin"
17388
+ }),
17389
+ /**
17390
+ * Set one node's placement CAPABILITIES — the per-node record that
17391
+ * replaced the four flat orchestrator lists (`enabledNodes`,
17392
+ * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
17393
+ * Each flag is optional in the patch: omit a flag to leave it unchanged,
17394
+ * pass `null` to reset it to the node default (`hub` → capable, every
17395
+ * other node → not). Detection/decode/audio eligibility is derived from
17396
+ * these flags across the cluster; changing them re-derives the enabled
17397
+ * sets and reconciles dispatch immediately.
17398
+ */
17399
+ setAgentCapabilities: require_sleep.method(zod.z.object({
17400
+ agentNodeId: zod.z.string(),
17401
+ detect: zod.z.boolean().nullable().optional(),
17402
+ decode: zod.z.boolean().nullable().optional(),
17403
+ audio: zod.z.boolean().nullable().optional(),
17404
+ ingest: zod.z.boolean().nullable().optional()
17405
+ }), zod.z.object({ success: zod.z.literal(true) }), {
17406
+ kind: "mutation",
17407
+ auth: "admin"
17408
+ }),
17365
17409
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
17366
17410
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
17367
17411
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -25789,6 +25833,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
25789
25833
  addonId: null,
25790
25834
  access: "create"
25791
25835
  },
25836
+ "pipelineOrchestrator.setAgentCapabilities": {
25837
+ capName: "pipeline-orchestrator",
25838
+ capScope: "system",
25839
+ addonId: null,
25840
+ access: "create"
25841
+ },
25842
+ "pipelineOrchestrator.setAgentDetectWeight": {
25843
+ capName: "pipeline-orchestrator",
25844
+ capScope: "system",
25845
+ addonId: null,
25846
+ access: "create"
25847
+ },
25792
25848
  "pipelineOrchestrator.setAgentMaxCameras": {
25793
25849
  capName: "pipeline-orchestrator",
25794
25850
  capScope: "system",
package/dist/index.mjs CHANGED
@@ -11997,6 +11997,8 @@ function createSystemProxy(api) {
11997
11997
  setAgentAddonDefaults: (input) => dispatch("pipelineOrchestrator", "setAgentAddonDefaults", "mutation", input),
11998
11998
  removeAgentSettings: (input) => dispatch("pipelineOrchestrator", "removeAgentSettings", "mutation", input),
11999
11999
  setAgentMaxCameras: (input) => dispatch("pipelineOrchestrator", "setAgentMaxCameras", "mutation", input),
12000
+ setAgentDetectWeight: (input) => dispatch("pipelineOrchestrator", "setAgentDetectWeight", "mutation", input),
12001
+ setAgentCapabilities: (input) => dispatch("pipelineOrchestrator", "setAgentCapabilities", "mutation", input),
12000
12002
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
12001
12003
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
12002
12004
  saveTemplate: (input) => dispatch("pipelineOrchestrator", "saveTemplate", "mutation", input),
@@ -14254,7 +14256,7 @@ var decoderCapability = {
14254
14256
  name: "decoder",
14255
14257
  scope: "system",
14256
14258
  mode: "singleton",
14257
- preferredProvider: "decoder-ffmpeg",
14259
+ preferredProvider: "decoder-nodeav",
14258
14260
  methods: {
14259
14261
  supportsCodec: method(z.object({ codec: z.string() }), z.boolean()),
14260
14262
  getInfo: method(z.void(), z.object({
@@ -16919,7 +16921,17 @@ var AgentAddonConfigSchema = z.object({
16919
16921
  });
16920
16922
  var AgentPipelineSettingsSchema = z.object({
16921
16923
  addonDefaults: z.record(z.string(), AgentAddonConfigSchema).readonly(),
16922
- maxCameras: z.number().int().nonnegative().nullable().default(null)
16924
+ maxCameras: z.number().int().nonnegative().nullable().default(null),
16925
+ /** Per-node detection weight (relative share for the quota balancer). */
16926
+ detectWeight: z.number().positive().optional(),
16927
+ /** Node is eligible to run the detection pipeline (decode + inference). */
16928
+ detect: z.boolean().optional(),
16929
+ /** Node is eligible to host decoder sessions. */
16930
+ decode: z.boolean().optional(),
16931
+ /** Node is eligible to run audio-analyzer sessions. */
16932
+ audio: z.boolean().optional(),
16933
+ /** Node is eligible to be the ingest / source-owner (serve the restream). */
16934
+ ingest: z.boolean().optional()
16923
16935
  });
16924
16936
  var CameraPipelineForAgentSchema = z.object({
16925
16937
  steps: z.array(PipelineStepInputSchema).readonly(),
@@ -17361,6 +17373,38 @@ var pipelineOrchestratorCapability = {
17361
17373
  kind: "mutation",
17362
17374
  auth: "admin"
17363
17375
  }),
17376
+ /**
17377
+ * Set a node's detection WEIGHT (relative share for the quota balancer).
17378
+ * `null` clears it (back to the implicit weight 1). Unpinned cameras
17379
+ * distribute proportionally to weight; `maxCameras` still clamps on top.
17380
+ */
17381
+ setAgentDetectWeight: method(z.object({
17382
+ agentNodeId: z.string(),
17383
+ detectWeight: z.number().positive().nullable()
17384
+ }), z.object({ success: z.literal(true) }), {
17385
+ kind: "mutation",
17386
+ auth: "admin"
17387
+ }),
17388
+ /**
17389
+ * Set one node's placement CAPABILITIES — the per-node record that
17390
+ * replaced the four flat orchestrator lists (`enabledNodes`,
17391
+ * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
17392
+ * Each flag is optional in the patch: omit a flag to leave it unchanged,
17393
+ * pass `null` to reset it to the node default (`hub` → capable, every
17394
+ * other node → not). Detection/decode/audio eligibility is derived from
17395
+ * these flags across the cluster; changing them re-derives the enabled
17396
+ * sets and reconciles dispatch immediately.
17397
+ */
17398
+ setAgentCapabilities: method(z.object({
17399
+ agentNodeId: z.string(),
17400
+ detect: z.boolean().nullable().optional(),
17401
+ decode: z.boolean().nullable().optional(),
17402
+ audio: z.boolean().nullable().optional(),
17403
+ ingest: z.boolean().nullable().optional()
17404
+ }), z.object({ success: z.literal(true) }), {
17405
+ kind: "mutation",
17406
+ auth: "admin"
17407
+ }),
17364
17408
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
17365
17409
  getCameraSettings: method(z.object({ deviceId: z.number() }), CameraPipelineSettingsSchema.nullable()),
17366
17410
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -25788,6 +25832,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
25788
25832
  addonId: null,
25789
25833
  access: "create"
25790
25834
  },
25835
+ "pipelineOrchestrator.setAgentCapabilities": {
25836
+ capName: "pipeline-orchestrator",
25837
+ capScope: "system",
25838
+ addonId: null,
25839
+ access: "create"
25840
+ },
25841
+ "pipelineOrchestrator.setAgentDetectWeight": {
25842
+ capName: "pipeline-orchestrator",
25843
+ capScope: "system",
25844
+ addonId: null,
25845
+ access: "create"
25846
+ },
25791
25847
  "pipelineOrchestrator.setAgentMaxCameras": {
25792
25848
  capName: "pipeline-orchestrator",
25793
25849
  capScope: "system",
@@ -61,6 +61,26 @@ export interface AgentPipelineSettings {
61
61
  * without migration.
62
62
  */
63
63
  readonly maxCameras?: number | null;
64
+ /**
65
+ * Optional per-node detection WEIGHT (relative share). Unpinned cameras
66
+ * distribute proportionally to weight across detect-capable nodes (e.g.
67
+ * Mac 60 / hub 30 / N100 10). `undefined`/absent = weight 1 (equal share,
68
+ * back-compat: identical to score-only balancing). Ceiling (`maxCameras`)
69
+ * still clamps on top of the weight share.
70
+ */
71
+ readonly detectWeight?: number;
72
+ /**
73
+ * Placement capabilities (placement-model-design §6) — the per-node record
74
+ * that replaced the four flat orchestrator lists (`enabledNodes`,
75
+ * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`). Each
76
+ * flag is optional; an absent flag inherits the node default (`hub` →
77
+ * capable, every other node → not). The orchestrator derives its
78
+ * enabled-node sets from these flags across the cluster.
79
+ */
80
+ readonly detect?: boolean;
81
+ readonly decode?: boolean;
82
+ readonly audio?: boolean;
83
+ readonly ingest?: boolean;
64
84
  }
65
85
  /**
66
86
  * Per-camera pipeline settings. Sparse by design — a camera that has
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.1.24",
3
+ "version": "1.1.26",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",