@ceralive/cerastream 2026.9.9 → 2026.9.11

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/README.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @ceralive/cerastream
2
2
 
3
+ Prepared `2026.9.11` / schema `0.21.0` adds an optional capture-status report
4
+ and source-mode fields on switch targets plus a closed `retime`/`adapt` input
5
+ policy. Capture status accepts future token strings without dropping a status
6
+ event; malformed capture blocks become absent without hiding encode data.
7
+ `INTERNAL_TRANSITION_WORST_CASE_BOUND_MS` is `65_000` in both IPC and bindings.
8
+ This is not a published release or engine recovery implementation. Publish before
9
+ consumer use; capability tokens are not advertised by the engine yet.
10
+
11
+ Prepared `2026.9.10` / schema `0.20.0` carries optional
12
+ `active_encode.skip_to_live` alongside encoder health counters. It counts
13
+ age-based RAM backlog discards in the current session, not outages or lost frames.
14
+ Absence is unknown; zero is not loss-free delivery. Reconnect preserves the count,
15
+ and session replacement resets it. Publish before consumer use.
16
+
3
17
  Prepared **2026.9.9 / schema 0.19.0** adds `raw_video` and `unknown` capture
4
18
  classifications. They do not promise a selectable capture mode. `camlink` remains
5
19
  unchanged for identified Elgato hardware. Publish before consumer merge: older
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ export declare const CAPTURE_STATES: readonly ['normal', 'degraded', 'standby'];
3
+ export declare const SUSPENSION_KINDS: readonly ['composition_primary_absent', 'passthrough_source_absent', 'rate_adapted'];
4
+ export declare const TRANSITION_KINDS: readonly ['suspend', 'resume', 'adapt', 'restore', 'safe_harbor'];
5
+ export declare const FAILOVER_RATE_POLICIES: readonly ['retime', 'adapt'];
6
+ export declare const CAPTURE_CAUSES: ("composition-unsupported" | "decoder-unavailable" | "device_busy" | "interlaced-unsupported" | "negotiation_failed" | "no_signal" | "no_silicon_converter" | "secondary-unavailable" | "software-pixel-path-rejected" | "source-changed" | "unsupported-format")[];
7
+ export declare function isKnownCaptureState(value: string): value is (typeof CAPTURE_STATES)[number];
8
+ export declare function isKnownSuspensionKind(value: string): value is (typeof SUSPENSION_KINDS)[number];
9
+ export declare function isKnownTransitionKind(value: string): value is (typeof TRANSITION_KINDS)[number];
10
+ export declare function isKnownFailoverRatePolicy(value: string): value is (typeof FAILOVER_RATE_POLICIES)[number];
11
+ export declare function isKnownCaptureCause(value: string): value is (typeof CAPTURE_CAUSES)[number];
12
+ /** Inputs are owned by the sender and remain closed; status values remain open. */
13
+ export declare const failoverRatePolicyInputSchema: z.ZodEnum<{
14
+ adapt: "adapt";
15
+ retime: "retime";
16
+ }>;
17
+ export type FailoverRatePolicyInput = z.infer<typeof failoverRatePolicyInputSchema>;
18
+ /** Unknown future enum tokens must not make the parent `status` event fail validation. */
19
+ export declare const captureStatusSchema: z.ZodObject<{
20
+ state: z.ZodString;
21
+ live_inputs: z.ZodArray<z.ZodString>;
22
+ degraded_inputs: z.ZodArray<z.ZodObject<{
23
+ input_id: z.ZodString;
24
+ cause: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strip>>;
26
+ standby_since_ms: z.ZodOptional<z.ZodNumber>;
27
+ suspension: z.ZodOptional<z.ZodObject<{
28
+ kind: z.ZodString;
29
+ since_ms: z.ZodNumber;
30
+ resume_attempts: z.ZodNumber;
31
+ }, z.core.$strip>>;
32
+ transition: z.ZodOptional<z.ZodObject<{
33
+ kind: z.ZodString;
34
+ since_ms: z.ZodNumber;
35
+ }, z.core.$strip>>;
36
+ active_source: z.ZodOptional<z.ZodObject<{
37
+ input_id: z.ZodString;
38
+ width: z.ZodNumber;
39
+ height: z.ZodNumber;
40
+ framerate: z.ZodNumber;
41
+ retimed: z.ZodBoolean;
42
+ rescaled: z.ZodBoolean;
43
+ }, z.core.$strip>>;
44
+ retime: z.ZodOptional<z.ZodObject<{
45
+ in: z.ZodNumber;
46
+ out: z.ZodNumber;
47
+ drop: z.ZodNumber;
48
+ duplicate: z.ZodNumber;
49
+ }, z.core.$strip>>;
50
+ failover_rate_policy: z.ZodString;
51
+ }, z.core.$strip>;
52
+ export type CaptureStatus = z.infer<typeof captureStatusSchema>;
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ import { captureCauseSchema } from './errors.js';
3
+ export const CAPTURE_STATES = ['normal', 'degraded', 'standby'];
4
+ export const SUSPENSION_KINDS = [
5
+ 'composition_primary_absent',
6
+ 'passthrough_source_absent',
7
+ 'rate_adapted',
8
+ ];
9
+ export const TRANSITION_KINDS = ['suspend', 'resume', 'adapt', 'restore', 'safe_harbor'];
10
+ export const FAILOVER_RATE_POLICIES = ['retime', 'adapt'];
11
+ export const CAPTURE_CAUSES = captureCauseSchema.options;
12
+ export function isKnownCaptureState(value) {
13
+ return CAPTURE_STATES.some((state) => state === value);
14
+ }
15
+ export function isKnownSuspensionKind(value) {
16
+ return SUSPENSION_KINDS.some((kind) => kind === value);
17
+ }
18
+ export function isKnownTransitionKind(value) {
19
+ return TRANSITION_KINDS.some((kind) => kind === value);
20
+ }
21
+ export function isKnownFailoverRatePolicy(value) {
22
+ return FAILOVER_RATE_POLICIES.some((policy) => policy === value);
23
+ }
24
+ export function isKnownCaptureCause(value) {
25
+ return CAPTURE_CAUSES.some((cause) => cause === value);
26
+ }
27
+ /** Inputs are owned by the sender and remain closed; status values remain open. */
28
+ export const failoverRatePolicyInputSchema = z.enum(FAILOVER_RATE_POLICIES);
29
+ /** Unknown future enum tokens must not make the parent `status` event fail validation. */
30
+ export const captureStatusSchema = z.object({
31
+ state: z.string(),
32
+ live_inputs: z.array(z.string()),
33
+ degraded_inputs: z.array(z.object({ input_id: z.string(), cause: z.string().optional() })),
34
+ standby_since_ms: z.number().int().nonnegative().optional(),
35
+ suspension: z
36
+ .object({
37
+ kind: z.string(),
38
+ since_ms: z.number().int().nonnegative(),
39
+ resume_attempts: z.number().int().nonnegative(),
40
+ })
41
+ .optional(),
42
+ transition: z.object({ kind: z.string(), since_ms: z.number().int().nonnegative() }).optional(),
43
+ active_source: z
44
+ .object({
45
+ input_id: z.string(),
46
+ width: z.number().int().nonnegative(),
47
+ height: z.number().int().nonnegative(),
48
+ framerate: z.number(),
49
+ retimed: z.boolean(),
50
+ rescaled: z.boolean(),
51
+ })
52
+ .optional(),
53
+ retime: z
54
+ .object({
55
+ in: z.number().int().nonnegative(),
56
+ out: z.number().int().nonnegative(),
57
+ drop: z.number().int().nonnegative(),
58
+ duplicate: z.number().int().nonnegative(),
59
+ })
60
+ .optional(),
61
+ failover_rate_policy: z.string(),
62
+ });
@@ -8,7 +8,9 @@ export declare const PROTOCOL_VERSION: 'cerastream-ipc/1';
8
8
  * additive-only within protocol major `cerastream-ipc/1` (ADR-0002 §4); this value
9
9
  * only moves when the wire schema itself does, in lockstep across both languages.
10
10
  */
11
- export declare const SCHEMA_VERSION: '0.19.0';
11
+ export declare const SCHEMA_VERSION: '0.21.0';
12
+ /** Mirrors the Rust bound derived from 3 × teardown + 2 × (build + connect + play + gate). */
13
+ export declare const INTERNAL_TRANSITION_WORST_CASE_BOUND_MS = 65000;
12
14
  /** Runtime dir holding both control + preview sockets. systemd `RuntimeDirectory=cerastream`. */
13
15
  export declare const DEFAULT_IPC_DIR: '/run/cerastream';
14
16
  /** Env override for the IPC dir (tests/dev). Defaults to {@link DEFAULT_IPC_DIR}. */
@@ -78,7 +80,7 @@ export declare const COMPOSITION_FEATURE: 'composition';
78
80
  * array, never on membership here — a configuration-dependent token is filtered
79
81
  * out of the response the engine actually sends.
80
82
  */
81
- export declare const ENGINE_FEATURES: readonly ['video-passthrough', 'input-mode', 'audio-pcm-spec', "pipewire-capture", "composition"];
83
+ export declare const ENGINE_FEATURES: readonly ['video-passthrough', 'input-mode', 'audio-pcm-spec', "pipewire-capture", "composition", 'capture-standby', 'failover-rate-policy'];
82
84
  /** Engine binary name (systemd-owned; CeraUI never spawns it — ADR-0005). */
83
85
  export declare const CERASTREAM_BIN: 'cerastream';
84
86
  export declare const DEFAULT_MIN_BITRATE = 300;
package/dist/constants.js CHANGED
@@ -11,7 +11,9 @@ export const PROTOCOL_VERSION = 'cerastream-ipc/1';
11
11
  * additive-only within protocol major `cerastream-ipc/1` (ADR-0002 §4); this value
12
12
  * only moves when the wire schema itself does, in lockstep across both languages.
13
13
  */
14
- export const SCHEMA_VERSION = '0.19.0';
14
+ export const SCHEMA_VERSION = '0.21.0';
15
+ /** Mirrors the Rust bound derived from 3 × teardown + 2 × (build + connect + play + gate). */
16
+ export const INTERNAL_TRANSITION_WORST_CASE_BOUND_MS = 65_000;
15
17
  /** Runtime dir holding both control + preview sockets. systemd `RuntimeDirectory=cerastream`. */
16
18
  export const DEFAULT_IPC_DIR = '/run/cerastream';
17
19
  /** Env override for the IPC dir (tests/dev). Defaults to {@link DEFAULT_IPC_DIR}. */
@@ -93,6 +95,8 @@ export const ENGINE_FEATURES = [
93
95
  'audio-pcm-spec',
94
96
  PIPEWIRE_CAPTURE_FEATURE,
95
97
  COMPOSITION_FEATURE,
98
+ 'capture-standby',
99
+ 'failover-rate-policy',
96
100
  ];
97
101
  /** Engine binary name (systemd-owned; CeraUI never spawns it — ADR-0005). */
98
102
  export const CERASTREAM_BIN = 'cerastream';
package/dist/events.d.ts CHANGED
@@ -18,6 +18,9 @@ export declare const activeEncodeSchema: z.ZodObject<{
18
18
  network: "network";
19
19
  synthetic: "synthetic";
20
20
  }>;
21
+ source_width: z.ZodOptional<z.ZodNumber>;
22
+ source_height: z.ZodOptional<z.ZodNumber>;
23
+ source_framerate: z.ZodOptional<z.ZodNumber>;
21
24
  }, z.core.$strip>>>;
22
25
  decoder: z.ZodOptional<z.ZodString>;
23
26
  input_codec: z.ZodOptional<z.ZodString>;
@@ -26,6 +29,42 @@ export declare const activeEncodeSchema: z.ZodObject<{
26
29
  gop_probe_ms: z.ZodOptional<z.ZodNumber>;
27
30
  frames_emitted: z.ZodOptional<z.ZodNumber>;
28
31
  pipeline_playing: z.ZodOptional<z.ZodBoolean>;
32
+ encoder_restarts: z.ZodOptional<z.ZodNumber>;
33
+ kernel_faults: z.ZodOptional<z.ZodNumber>;
34
+ skip_to_live: z.ZodOptional<z.ZodNumber>;
35
+ capture: z.ZodCatch<z.ZodOptional<z.ZodObject<{
36
+ state: z.ZodString;
37
+ live_inputs: z.ZodArray<z.ZodString>;
38
+ degraded_inputs: z.ZodArray<z.ZodObject<{
39
+ input_id: z.ZodString;
40
+ cause: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strip>>;
42
+ standby_since_ms: z.ZodOptional<z.ZodNumber>;
43
+ suspension: z.ZodOptional<z.ZodObject<{
44
+ kind: z.ZodString;
45
+ since_ms: z.ZodNumber;
46
+ resume_attempts: z.ZodNumber;
47
+ }, z.core.$strip>>;
48
+ transition: z.ZodOptional<z.ZodObject<{
49
+ kind: z.ZodString;
50
+ since_ms: z.ZodNumber;
51
+ }, z.core.$strip>>;
52
+ active_source: z.ZodOptional<z.ZodObject<{
53
+ input_id: z.ZodString;
54
+ width: z.ZodNumber;
55
+ height: z.ZodNumber;
56
+ framerate: z.ZodNumber;
57
+ retimed: z.ZodBoolean;
58
+ rescaled: z.ZodBoolean;
59
+ }, z.core.$strip>>;
60
+ retime: z.ZodOptional<z.ZodObject<{
61
+ in: z.ZodNumber;
62
+ out: z.ZodNumber;
63
+ drop: z.ZodNumber;
64
+ duplicate: z.ZodNumber;
65
+ }, z.core.$strip>>;
66
+ failover_rate_policy: z.ZodString;
67
+ }, z.core.$strip>>>;
29
68
  }, z.core.$strip>;
30
69
  export type ActiveEncode = z.infer<typeof activeEncodeSchema>;
31
70
  /**
@@ -99,6 +138,9 @@ export declare const statusEventSchema: z.ZodObject<{
99
138
  network: "network";
100
139
  synthetic: "synthetic";
101
140
  }>;
141
+ source_width: z.ZodOptional<z.ZodNumber>;
142
+ source_height: z.ZodOptional<z.ZodNumber>;
143
+ source_framerate: z.ZodOptional<z.ZodNumber>;
102
144
  }, z.core.$strip>>>;
103
145
  decoder: z.ZodOptional<z.ZodString>;
104
146
  input_codec: z.ZodOptional<z.ZodString>;
@@ -107,6 +149,42 @@ export declare const statusEventSchema: z.ZodObject<{
107
149
  gop_probe_ms: z.ZodOptional<z.ZodNumber>;
108
150
  frames_emitted: z.ZodOptional<z.ZodNumber>;
109
151
  pipeline_playing: z.ZodOptional<z.ZodBoolean>;
152
+ encoder_restarts: z.ZodOptional<z.ZodNumber>;
153
+ kernel_faults: z.ZodOptional<z.ZodNumber>;
154
+ skip_to_live: z.ZodOptional<z.ZodNumber>;
155
+ capture: z.ZodCatch<z.ZodOptional<z.ZodObject<{
156
+ state: z.ZodString;
157
+ live_inputs: z.ZodArray<z.ZodString>;
158
+ degraded_inputs: z.ZodArray<z.ZodObject<{
159
+ input_id: z.ZodString;
160
+ cause: z.ZodOptional<z.ZodString>;
161
+ }, z.core.$strip>>;
162
+ standby_since_ms: z.ZodOptional<z.ZodNumber>;
163
+ suspension: z.ZodOptional<z.ZodObject<{
164
+ kind: z.ZodString;
165
+ since_ms: z.ZodNumber;
166
+ resume_attempts: z.ZodNumber;
167
+ }, z.core.$strip>>;
168
+ transition: z.ZodOptional<z.ZodObject<{
169
+ kind: z.ZodString;
170
+ since_ms: z.ZodNumber;
171
+ }, z.core.$strip>>;
172
+ active_source: z.ZodOptional<z.ZodObject<{
173
+ input_id: z.ZodString;
174
+ width: z.ZodNumber;
175
+ height: z.ZodNumber;
176
+ framerate: z.ZodNumber;
177
+ retimed: z.ZodBoolean;
178
+ rescaled: z.ZodBoolean;
179
+ }, z.core.$strip>>;
180
+ retime: z.ZodOptional<z.ZodObject<{
181
+ in: z.ZodNumber;
182
+ out: z.ZodNumber;
183
+ drop: z.ZodNumber;
184
+ duplicate: z.ZodNumber;
185
+ }, z.core.$strip>>;
186
+ failover_rate_policy: z.ZodString;
187
+ }, z.core.$strip>>>;
110
188
  }, z.core.$strip>>;
111
189
  preview_encoder_realized: z.ZodOptional<z.ZodObject<{
112
190
  selected_element: z.ZodOptional<z.ZodString>;
@@ -369,6 +447,9 @@ export declare const eventParamsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
369
447
  network: "network";
370
448
  synthetic: "synthetic";
371
449
  }>;
450
+ source_width: z.ZodOptional<z.ZodNumber>;
451
+ source_height: z.ZodOptional<z.ZodNumber>;
452
+ source_framerate: z.ZodOptional<z.ZodNumber>;
372
453
  }, z.core.$strip>>>;
373
454
  decoder: z.ZodOptional<z.ZodString>;
374
455
  input_codec: z.ZodOptional<z.ZodString>;
@@ -377,6 +458,42 @@ export declare const eventParamsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
377
458
  gop_probe_ms: z.ZodOptional<z.ZodNumber>;
378
459
  frames_emitted: z.ZodOptional<z.ZodNumber>;
379
460
  pipeline_playing: z.ZodOptional<z.ZodBoolean>;
461
+ encoder_restarts: z.ZodOptional<z.ZodNumber>;
462
+ kernel_faults: z.ZodOptional<z.ZodNumber>;
463
+ skip_to_live: z.ZodOptional<z.ZodNumber>;
464
+ capture: z.ZodCatch<z.ZodOptional<z.ZodObject<{
465
+ state: z.ZodString;
466
+ live_inputs: z.ZodArray<z.ZodString>;
467
+ degraded_inputs: z.ZodArray<z.ZodObject<{
468
+ input_id: z.ZodString;
469
+ cause: z.ZodOptional<z.ZodString>;
470
+ }, z.core.$strip>>;
471
+ standby_since_ms: z.ZodOptional<z.ZodNumber>;
472
+ suspension: z.ZodOptional<z.ZodObject<{
473
+ kind: z.ZodString;
474
+ since_ms: z.ZodNumber;
475
+ resume_attempts: z.ZodNumber;
476
+ }, z.core.$strip>>;
477
+ transition: z.ZodOptional<z.ZodObject<{
478
+ kind: z.ZodString;
479
+ since_ms: z.ZodNumber;
480
+ }, z.core.$strip>>;
481
+ active_source: z.ZodOptional<z.ZodObject<{
482
+ input_id: z.ZodString;
483
+ width: z.ZodNumber;
484
+ height: z.ZodNumber;
485
+ framerate: z.ZodNumber;
486
+ retimed: z.ZodBoolean;
487
+ rescaled: z.ZodBoolean;
488
+ }, z.core.$strip>>;
489
+ retime: z.ZodOptional<z.ZodObject<{
490
+ in: z.ZodNumber;
491
+ out: z.ZodNumber;
492
+ drop: z.ZodNumber;
493
+ duplicate: z.ZodNumber;
494
+ }, z.core.$strip>>;
495
+ failover_rate_policy: z.ZodString;
496
+ }, z.core.$strip>>>;
380
497
  }, z.core.$strip>>;
381
498
  preview_encoder_realized: z.ZodOptional<z.ZodObject<{
382
499
  selected_element: z.ZodOptional<z.ZodString>;
@@ -586,6 +703,9 @@ export declare const cerastreamEventSchema: z.ZodObject<{
586
703
  network: "network";
587
704
  synthetic: "synthetic";
588
705
  }>;
706
+ source_width: z.ZodOptional<z.ZodNumber>;
707
+ source_height: z.ZodOptional<z.ZodNumber>;
708
+ source_framerate: z.ZodOptional<z.ZodNumber>;
589
709
  }, z.core.$strip>>>;
590
710
  decoder: z.ZodOptional<z.ZodString>;
591
711
  input_codec: z.ZodOptional<z.ZodString>;
@@ -594,6 +714,42 @@ export declare const cerastreamEventSchema: z.ZodObject<{
594
714
  gop_probe_ms: z.ZodOptional<z.ZodNumber>;
595
715
  frames_emitted: z.ZodOptional<z.ZodNumber>;
596
716
  pipeline_playing: z.ZodOptional<z.ZodBoolean>;
717
+ encoder_restarts: z.ZodOptional<z.ZodNumber>;
718
+ kernel_faults: z.ZodOptional<z.ZodNumber>;
719
+ skip_to_live: z.ZodOptional<z.ZodNumber>;
720
+ capture: z.ZodCatch<z.ZodOptional<z.ZodObject<{
721
+ state: z.ZodString;
722
+ live_inputs: z.ZodArray<z.ZodString>;
723
+ degraded_inputs: z.ZodArray<z.ZodObject<{
724
+ input_id: z.ZodString;
725
+ cause: z.ZodOptional<z.ZodString>;
726
+ }, z.core.$strip>>;
727
+ standby_since_ms: z.ZodOptional<z.ZodNumber>;
728
+ suspension: z.ZodOptional<z.ZodObject<{
729
+ kind: z.ZodString;
730
+ since_ms: z.ZodNumber;
731
+ resume_attempts: z.ZodNumber;
732
+ }, z.core.$strip>>;
733
+ transition: z.ZodOptional<z.ZodObject<{
734
+ kind: z.ZodString;
735
+ since_ms: z.ZodNumber;
736
+ }, z.core.$strip>>;
737
+ active_source: z.ZodOptional<z.ZodObject<{
738
+ input_id: z.ZodString;
739
+ width: z.ZodNumber;
740
+ height: z.ZodNumber;
741
+ framerate: z.ZodNumber;
742
+ retimed: z.ZodBoolean;
743
+ rescaled: z.ZodBoolean;
744
+ }, z.core.$strip>>;
745
+ retime: z.ZodOptional<z.ZodObject<{
746
+ in: z.ZodNumber;
747
+ out: z.ZodNumber;
748
+ drop: z.ZodNumber;
749
+ duplicate: z.ZodNumber;
750
+ }, z.core.$strip>>;
751
+ failover_rate_policy: z.ZodString;
752
+ }, z.core.$strip>>>;
597
753
  }, z.core.$strip>>;
598
754
  preview_encoder_realized: z.ZodOptional<z.ZodObject<{
599
755
  selected_element: z.ZodOptional<z.ZodString>;
@@ -807,6 +963,9 @@ export declare const eventSchemas: {
807
963
  network: "network";
808
964
  synthetic: "synthetic";
809
965
  }>;
966
+ source_width: z.ZodOptional<z.ZodNumber>;
967
+ source_height: z.ZodOptional<z.ZodNumber>;
968
+ source_framerate: z.ZodOptional<z.ZodNumber>;
810
969
  }, z.core.$strip>>>;
811
970
  decoder: z.ZodOptional<z.ZodString>;
812
971
  input_codec: z.ZodOptional<z.ZodString>;
@@ -815,6 +974,42 @@ export declare const eventSchemas: {
815
974
  gop_probe_ms: z.ZodOptional<z.ZodNumber>;
816
975
  frames_emitted: z.ZodOptional<z.ZodNumber>;
817
976
  pipeline_playing: z.ZodOptional<z.ZodBoolean>;
977
+ encoder_restarts: z.ZodOptional<z.ZodNumber>;
978
+ kernel_faults: z.ZodOptional<z.ZodNumber>;
979
+ skip_to_live: z.ZodOptional<z.ZodNumber>;
980
+ capture: z.ZodCatch<z.ZodOptional<z.ZodObject<{
981
+ state: z.ZodString;
982
+ live_inputs: z.ZodArray<z.ZodString>;
983
+ degraded_inputs: z.ZodArray<z.ZodObject<{
984
+ input_id: z.ZodString;
985
+ cause: z.ZodOptional<z.ZodString>;
986
+ }, z.core.$strip>>;
987
+ standby_since_ms: z.ZodOptional<z.ZodNumber>;
988
+ suspension: z.ZodOptional<z.ZodObject<{
989
+ kind: z.ZodString;
990
+ since_ms: z.ZodNumber;
991
+ resume_attempts: z.ZodNumber;
992
+ }, z.core.$strip>>;
993
+ transition: z.ZodOptional<z.ZodObject<{
994
+ kind: z.ZodString;
995
+ since_ms: z.ZodNumber;
996
+ }, z.core.$strip>>;
997
+ active_source: z.ZodOptional<z.ZodObject<{
998
+ input_id: z.ZodString;
999
+ width: z.ZodNumber;
1000
+ height: z.ZodNumber;
1001
+ framerate: z.ZodNumber;
1002
+ retimed: z.ZodBoolean;
1003
+ rescaled: z.ZodBoolean;
1004
+ }, z.core.$strip>>;
1005
+ retime: z.ZodOptional<z.ZodObject<{
1006
+ in: z.ZodNumber;
1007
+ out: z.ZodNumber;
1008
+ drop: z.ZodNumber;
1009
+ duplicate: z.ZodNumber;
1010
+ }, z.core.$strip>>;
1011
+ failover_rate_policy: z.ZodString;
1012
+ }, z.core.$strip>>>;
818
1013
  }, z.core.$strip>>;
819
1014
  preview_encoder_realized: z.ZodOptional<z.ZodObject<{
820
1015
  selected_element: z.ZodOptional<z.ZodString>;
package/dist/events.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { captureStatusSchema } from './capture-status.js';
2
3
  import { captureCauseSchema, processErrorCodeSchema, processErrorSourceSchema } from './errors.js';
3
4
  import { sessionSwitchTargetSchema } from './session-switch.js';
4
5
  import { captureDeviceSchema, configChangePhaseSchema, inputModeSchema, mediaClassSchema, previewEncodeFallbackSchema, previewEncodeModeSchema, streamStateSchema, } from './types.js';
@@ -26,6 +27,10 @@ export const activeEncodeSchema = z.object({
26
27
  gop_probe_ms: z.number().int().nonnegative().optional(), // 0.5.0: GOP preflight duration in ms when a probe ran
27
28
  frames_emitted: z.number().int().nonnegative().optional(), // 0.7.0: monotonic egress-buffer counter; advances across status heartbeats while frames flow
28
29
  pipeline_playing: z.boolean().optional(), // 0.7.0: pipeline is in GStreamer PLAYING (false during an in-process reconnect)
30
+ encoder_restarts: z.number().int().nonnegative().optional(), // 0.20.0: bounded MPP context restarts this session (any cause); ABSENT = not asked, Some(0) = asked and clean
31
+ kernel_faults: z.number().int().nonnegative().optional(), // 0.20.0: the kernel-attributed subset; 0 is weak evidence — the plugin fault bridge is opt-in and ships off
32
+ skip_to_live: z.number().int().nonnegative().optional(),
33
+ capture: captureStatusSchema.optional().catch(undefined),
29
34
  });
30
35
  /**
31
36
  * What this session's PREVIEW branch is actually encoding with (additive),
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './capture-status.js';
1
2
  export * from './client.js';
2
3
  export * from './config.js';
3
4
  export * from './constants.js';
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  // Rust streaming engine. The Zod schemas + types are the frozen public contract
3
3
  // (ADR-0002 / schema.md); the client drives that contract over a Bun-native
4
4
  // NDJSON/UDS transport (Task 31).
5
+ export * from './capture-status.js';
5
6
  export * from './client.js';
6
7
  export * from './config.js';
7
8
  export * from './constants.js';
@@ -71,6 +71,10 @@ export declare const startParamsSchema: z.ZodObject<{
71
71
  }>;
72
72
  alpha: z.ZodOptional<z.ZodNumber>;
73
73
  }, z.core.$strip>>;
74
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
75
+ adapt: "adapt";
76
+ retime: "retime";
77
+ }>>;
74
78
  }, z.core.$strip>;
75
79
  export type StartParams = z.infer<typeof startParamsSchema>;
76
80
  export declare const startResultSchema: z.ZodObject<{
@@ -122,6 +126,10 @@ export declare const reloadConfigParamsSchema: z.ZodObject<{
122
126
  hardware: "hardware";
123
127
  software: "software";
124
128
  }>>;
129
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
130
+ adapt: "adapt";
131
+ retime: "retime";
132
+ }>>;
125
133
  }, z.core.$strip>;
126
134
  export type ReloadConfigParams = z.infer<typeof reloadConfigParamsSchema>;
127
135
  export declare const reloadConfigResultSchema: z.ZodObject<{
@@ -151,6 +159,10 @@ export declare const reloadConfigResultSchema: z.ZodObject<{
151
159
  hardware: "hardware";
152
160
  software: "software";
153
161
  }>>;
162
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
163
+ adapt: "adapt";
164
+ retime: "retime";
165
+ }>>;
154
166
  }, z.core.$strip>;
155
167
  bitrate_control: z.ZodOptional<z.ZodEnum<{
156
168
  encoder: "encoder";
@@ -649,6 +661,10 @@ export declare const changeConfigParamsSchema: z.ZodObject<{
649
661
  }>;
650
662
  alpha: z.ZodOptional<z.ZodNumber>;
651
663
  }, z.core.$strip>>>;
664
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
665
+ adapt: "adapt";
666
+ retime: "retime";
667
+ }>>;
652
668
  }, z.core.$strip>;
653
669
  export type ChangeConfigParams = z.infer<typeof changeConfigParamsSchema>;
654
670
  export declare const changeConfigResultSchema: z.ZodObject<{
@@ -769,6 +785,10 @@ export declare const requestSchemas: {
769
785
  }>;
770
786
  alpha: z.ZodOptional<z.ZodNumber>;
771
787
  }, z.core.$strip>>;
788
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
789
+ adapt: "adapt";
790
+ retime: "retime";
791
+ }>>;
772
792
  }, z.core.$strip>;
773
793
  readonly result: z.ZodObject<{
774
794
  session_id: z.ZodString;
@@ -820,6 +840,10 @@ export declare const requestSchemas: {
820
840
  hardware: "hardware";
821
841
  software: "software";
822
842
  }>>;
843
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
844
+ adapt: "adapt";
845
+ retime: "retime";
846
+ }>>;
823
847
  }, z.core.$strip>;
824
848
  readonly result: z.ZodObject<{
825
849
  applied: z.ZodObject<{
@@ -848,6 +872,10 @@ export declare const requestSchemas: {
848
872
  hardware: "hardware";
849
873
  software: "software";
850
874
  }>>;
875
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
876
+ adapt: "adapt";
877
+ retime: "retime";
878
+ }>>;
851
879
  }, z.core.$strip>;
852
880
  bitrate_control: z.ZodOptional<z.ZodEnum<{
853
881
  encoder: "encoder";
package/dist/messages.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { failoverRatePolicyInputSchema } from './capture-status.js';
2
3
  import { AUDIO_DELAY_MAX_MS } from './constants.js';
3
4
  import { helloParamsSchema, helloResultSchema } from './envelope.js';
4
5
  import { audioBackendSchema, balancerAlgorithmSchema, bitrateControlSchema, captureDeviceKindSchema, captureDeviceSchema, cerastreamConfigSchema, compositionConfigSchema, configChangePhaseSchema, inputModeSchema, mediaClassSchema, previewEncodeModeSchema, previewTierSchema, streamStateSchema, videoCodecSchema, } from './types.js';
@@ -52,6 +53,7 @@ export const reloadConfigParamsSchema = z.object({
52
53
  // session, and routing it through the transactional method would restart a live
53
54
  // stream to change a preview setting.
54
55
  preview_encode: previewEncodeModeSchema.optional(),
56
+ failover_rate_policy: failoverRatePolicyInputSchema.optional(),
55
57
  });
56
58
  export const reloadConfigResultSchema = z.object({
57
59
  applied: reloadConfigParamsSchema, // post-clamp values actually applied
@@ -272,6 +274,7 @@ export const changeConfigParamsSchema = z
272
274
  // rolls back honestly (reason: mode_barrier_timeout) if the barrier expires.
273
275
  input_mode: captureDeviceKindSchema.optional(),
274
276
  composition: compositionConfigSchema.nullable().optional(),
277
+ failover_rate_policy: failoverRatePolicyInputSchema.optional(),
275
278
  })
276
279
  .refine((delta) => Object.keys(delta).length > 0, {
277
280
  message: 'change-config delta must carry at least one field',
@@ -13,6 +13,9 @@ export declare const sessionSwitchTargetSchema: z.ZodObject<{
13
13
  network: "network";
14
14
  synthetic: "synthetic";
15
15
  }>;
16
+ source_width: z.ZodOptional<z.ZodNumber>;
17
+ source_height: z.ZodOptional<z.ZodNumber>;
18
+ source_framerate: z.ZodOptional<z.ZodNumber>;
16
19
  }, z.core.$strip>;
17
20
  export type SessionSwitchTarget = z.infer<typeof sessionSwitchTargetSchema>;
18
21
  export declare const listSwitchTargetsParamsSchema: z.ZodObject<{}, z.core.$strip>;
@@ -28,6 +31,9 @@ export declare const listSwitchTargetsResultSchema: z.ZodObject<{
28
31
  network: "network";
29
32
  synthetic: "synthetic";
30
33
  }>;
34
+ source_width: z.ZodOptional<z.ZodNumber>;
35
+ source_height: z.ZodOptional<z.ZodNumber>;
36
+ source_framerate: z.ZodOptional<z.ZodNumber>;
31
37
  }, z.core.$strip>>;
32
38
  }, z.core.$strip>;
33
39
  export type ListSwitchTargetsResult = z.infer<typeof listSwitchTargetsResultSchema>;
@@ -4,6 +4,9 @@ export const sessionSwitchTargetKindSchema = z.enum(['capture', 'synthetic', 'ne
4
4
  export const sessionSwitchTargetSchema = z.object({
5
5
  input_id: z.string(),
6
6
  kind: sessionSwitchTargetKindSchema,
7
+ source_width: z.number().int().nonnegative().optional(),
8
+ source_height: z.number().int().nonnegative().optional(),
9
+ source_framerate: z.number().optional(),
7
10
  });
8
11
  export const listSwitchTargetsParamsSchema = z.object({});
9
12
  /** A snapshot, not a reservation; re-query before dispatch and handle switch refusal. */
package/dist/types.d.ts CHANGED
@@ -241,6 +241,10 @@ export declare const cerastreamConfigSchema: z.ZodObject<{
241
241
  }>;
242
242
  alpha: z.ZodOptional<z.ZodNumber>;
243
243
  }, z.core.$strip>>;
244
+ failover_rate_policy: z.ZodOptional<z.ZodEnum<{
245
+ adapt: "adapt";
246
+ retime: "retime";
247
+ }>>;
244
248
  }, z.core.$strip>;
245
249
  export type CerastreamConfig = z.infer<typeof cerastreamConfigSchema>;
246
250
  export type PartialCerastreamConfig = z.input<typeof cerastreamConfigSchema>;
package/dist/types.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { failoverRatePolicyInputSchema } from './capture-status.js';
2
3
  import { DEFAULT_BALANCER, DEFAULT_MAX_BITRATE, DEFAULT_MIN_BITRATE, DEFAULT_SRT_LATENCY, } from './constants.js';
3
4
  // Shared domain enums + the unified engine config. Field names are domain-level
4
5
  // (snake_case, matching the ceracoder config convention) — never engine
@@ -156,6 +157,7 @@ export const cerastreamConfigSchema = z.object({
156
157
  video_passthrough: videoPassthroughSchema.optional(), // additive (0.5.0): auto|force|off; absent ⇒ auto
157
158
  input_mode: captureDeviceKindSchema.optional(), // additive (0.11.0): which MODE family of the selected device to capture in, naming a list-devices modes[].pipeline_kind. Absent ⇒ the engine's precedence pick (h265 → h264 → mjpeg → raw). The ONLY way to reach the non-precedence family of a dual-format camera; a family the device does not expose is a typed cerastream.params.invalid, never a silent fallback
158
159
  composition: compositionConfigSchema.optional(),
160
+ failover_rate_policy: failoverRatePolicyInputSchema.optional(),
159
161
  });
160
162
  // convenience defaults for building a config client-side
161
163
  export const DEFAULT_BITRATE_CONFIG = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ceralive/cerastream",
3
- "version": "2026.9.9",
3
+ "version": "2026.9.11",
4
4
  "description": "Type-safe TypeScript schema + IPC client for the cerastream streaming engine (JSON-RPC 2.0 / NDJSON over a Unix domain socket).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",