camstack 1.2.145 → 1.2.147
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.
|
@@ -14522,7 +14522,7 @@ function date4(params) {
|
|
|
14522
14522
|
// ../../node_modules/zod/v4/classic/external.js
|
|
14523
14523
|
config(en_default());
|
|
14524
14524
|
|
|
14525
|
-
// ../types/dist/sleep-
|
|
14525
|
+
// ../types/dist/sleep-DEuj7E3j.mjs
|
|
14526
14526
|
var AUDIO_CHUNK_FORMATS = [
|
|
14527
14527
|
"f32le",
|
|
14528
14528
|
"pcmu",
|
|
@@ -15384,7 +15384,7 @@ function sleep(ms) {
|
|
|
15384
15384
|
return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
|
|
15385
15385
|
}
|
|
15386
15386
|
|
|
15387
|
-
// ../types/dist/canonical-hash-
|
|
15387
|
+
// ../types/dist/canonical-hash-Ch5bSjFG.mjs
|
|
15388
15388
|
import { createHash } from "crypto";
|
|
15389
15389
|
var DEFAULT_MAX_UNIT_BYTES = 16 * 1024 * 1024;
|
|
15390
15390
|
|
|
@@ -15447,7 +15447,23 @@ var VideoEncodeSchema = external_exports.object({
|
|
|
15447
15447
|
"zerolatency",
|
|
15448
15448
|
"film",
|
|
15449
15449
|
"animation"
|
|
15450
|
-
]).optional()
|
|
15450
|
+
]).optional(),
|
|
15451
|
+
/**
|
|
15452
|
+
* ONE slice per access unit.
|
|
15453
|
+
*
|
|
15454
|
+
* `-tune zerolatency` turns on x264's sliced threads, and a frame then leaves
|
|
15455
|
+
* the encoder as five NAL slices that share one RTP timestamp and carry one
|
|
15456
|
+
* marker bit. A libwebrtc depacketiser sees five frame-starts and one
|
|
15457
|
+
* frame-end per frame: the first pictures render and the video then freezes
|
|
15458
|
+
* for good while the audio, on its own plane, plays on. Measured on this hub
|
|
15459
|
+
* 2026-09-13 against the Echo, and reduced to one slice by this flag alone.
|
|
15460
|
+
*
|
|
15461
|
+
* A NAMED field and not a raw flag, because {@link EgressEncodeSchema} omits
|
|
15462
|
+
* `outputArgs` on purpose: an opaque array is part of the sharing key, so two
|
|
15463
|
+
* consumers meaning the same thing spelled differently would stop sharing one
|
|
15464
|
+
* child. Absent means "whatever the encoder does" — today's behaviour.
|
|
15465
|
+
*/
|
|
15466
|
+
singleSlicePerFrame: external_exports.boolean().optional()
|
|
15451
15467
|
});
|
|
15452
15468
|
var AudioEncodeSchema = external_exports.union([external_exports.literal("passthrough"), external_exports.object({
|
|
15453
15469
|
codec: external_exports.enum([
|
|
@@ -15506,7 +15522,11 @@ var WEBRTC_EGRESS_PROFILE = {
|
|
|
15506
15522
|
};
|
|
15507
15523
|
var ALEXA_EGRESS_PROFILE = {
|
|
15508
15524
|
...BASE_LIVE_EGRESS_PROFILE,
|
|
15509
|
-
audio: { codec: "opus" }
|
|
15525
|
+
audio: { codec: "opus" },
|
|
15526
|
+
video: {
|
|
15527
|
+
...BASE_LIVE_EGRESS_PROFILE.video,
|
|
15528
|
+
singleSlicePerFrame: true
|
|
15529
|
+
}
|
|
15510
15530
|
};
|
|
15511
15531
|
var wiringProbeKindSchema = external_exports.enum([
|
|
15512
15532
|
"singleton",
|
|
@@ -18768,6 +18788,39 @@ var cameraPipelineConfigCapability = {
|
|
|
18768
18788
|
exposesDeviceSettings: true,
|
|
18769
18789
|
methods: {}
|
|
18770
18790
|
};
|
|
18791
|
+
var StreamSignalSchema = external_exports.object({
|
|
18792
|
+
/** Stable id chosen by the provider, e.g. `'motion'`, `'person'`, `'tamper'`. */
|
|
18793
|
+
code: external_exports.string().min(1),
|
|
18794
|
+
/** What an operator reads in the picker. The provider's own wording. */
|
|
18795
|
+
label: external_exports.string().min(1),
|
|
18796
|
+
/**
|
|
18797
|
+
* Whether the provider recommends this signal ON when a camera is first set
|
|
18798
|
+
* up. A provider knows which of its signals are cheap and reliable; an
|
|
18799
|
+
* operator should not have to discover that by trial. Reolink recommends
|
|
18800
|
+
* both of its own.
|
|
18801
|
+
*/
|
|
18802
|
+
recommended: external_exports.boolean()
|
|
18803
|
+
});
|
|
18804
|
+
var StreamSignalsStatusSchema = external_exports.object({
|
|
18805
|
+
signals: external_exports.array(StreamSignalSchema),
|
|
18806
|
+
lastFetchedAt: external_exports.number()
|
|
18807
|
+
});
|
|
18808
|
+
var streamSignalsCapability = {
|
|
18809
|
+
name: "stream-signals",
|
|
18810
|
+
scope: "device",
|
|
18811
|
+
deviceNative: true,
|
|
18812
|
+
mode: "singleton",
|
|
18813
|
+
deviceTypes: Object.values(DeviceType),
|
|
18814
|
+
runtimeState: StreamSignalsStatusSchema,
|
|
18815
|
+
methods: {
|
|
18816
|
+
/**
|
|
18817
|
+
* What this device can emit. Empty is a valid and common answer — most
|
|
18818
|
+
* cameras have nothing to offer here, and an empty list is what makes the
|
|
18819
|
+
* broker's picker show nothing rather than a false choice.
|
|
18820
|
+
*/
|
|
18821
|
+
listSignals: method(external_exports.void(), external_exports.array(StreamSignalSchema).readonly())
|
|
18822
|
+
}
|
|
18823
|
+
};
|
|
18771
18824
|
var StreamFormatSchema = external_exports.enum([
|
|
18772
18825
|
"webrtc",
|
|
18773
18826
|
"hls",
|
|
@@ -19120,6 +19173,46 @@ var streamBrokerCapability = {
|
|
|
19120
19173
|
mode: "singleton",
|
|
19121
19174
|
exposesDeviceSettings: true,
|
|
19122
19175
|
methods: {
|
|
19176
|
+
/**
|
|
19177
|
+
* A device reporting that one of ITS OWN signals just fired.
|
|
19178
|
+
*
|
|
19179
|
+
* The provider calls this; nothing polls. The broker then decides whether
|
|
19180
|
+
* to wake the source, and the decision has two terms that must BOTH hold:
|
|
19181
|
+
*
|
|
19182
|
+
* - the signal is ENABLED for this camera (the operator's per-camera
|
|
19183
|
+
* choice — a camera may declare a signal the operator does not want
|
|
19184
|
+
* waking anything), and
|
|
19185
|
+
* - a consumer is actually attached and waiting on the prestream. Waking
|
|
19186
|
+
* a camera nobody is watching is the one thing a battery camera must
|
|
19187
|
+
* never do, and a signal arriving with no consumer is exactly that.
|
|
19188
|
+
*
|
|
19189
|
+
* Reported, never inferred: a signal that fires while the stream is
|
|
19190
|
+
* already up refreshes the hold instead of starting a second one, which is
|
|
19191
|
+
* what makes continuous motion keep a camera awake without stacking
|
|
19192
|
+
* timers.
|
|
19193
|
+
*
|
|
19194
|
+
* `code` is the provider's own, from `streamSignals.listSignals`. An
|
|
19195
|
+
* unknown code is REFUSED rather than treated as a wildcard wake — a
|
|
19196
|
+
* provider and an operator disagreeing about a name must not become a
|
|
19197
|
+
* camera that wakes for everything.
|
|
19198
|
+
*/
|
|
19199
|
+
reportStreamSignal: method(external_exports.object({
|
|
19200
|
+
deviceId: external_exports.number().int().nonnegative(),
|
|
19201
|
+
/** The provider's signal code. */
|
|
19202
|
+
code: external_exports.string().min(1),
|
|
19203
|
+
/** Ms epoch. Absent ⇒ now. */
|
|
19204
|
+
at: external_exports.number().optional()
|
|
19205
|
+
}), external_exports.object({
|
|
19206
|
+
/** Whether the broker acted on it, and if not, why. */
|
|
19207
|
+
accepted: external_exports.boolean(),
|
|
19208
|
+
reason: external_exports.enum([
|
|
19209
|
+
"woke",
|
|
19210
|
+
"hold-extended",
|
|
19211
|
+
"not-enabled",
|
|
19212
|
+
"no-consumer",
|
|
19213
|
+
"unknown-code"
|
|
19214
|
+
])
|
|
19215
|
+
}), { kind: "mutation" }),
|
|
19123
19216
|
publishCameraStream: method(external_exports.object({
|
|
19124
19217
|
deviceId: external_exports.number().int().nonnegative(),
|
|
19125
19218
|
camStreamId: external_exports.string().min(1),
|
|
@@ -19597,6 +19690,16 @@ var PickStreamRequirementsSchema = external_exports.object({
|
|
|
19597
19690
|
acceptCodecs: external_exports.array(StreamCodecSchema).readonly().optional(),
|
|
19598
19691
|
/** Minimum vertical resolution. Streams shorter than this are dropped. */
|
|
19599
19692
|
minHeight: external_exports.number().int().positive().optional(),
|
|
19693
|
+
/**
|
|
19694
|
+
* Maximum vertical resolution. Streams TALLER than this are dropped.
|
|
19695
|
+
*
|
|
19696
|
+
* A consumer can have a ceiling as real as its floor: Alexa documents
|
|
19697
|
+
* 480p to 1080p, and a 4K stream is as unusable to an Echo as a 360p one.
|
|
19698
|
+
* Without this the ceiling had to be re-implemented by every caller — and
|
|
19699
|
+
* one caller implementing it privately is how a second scoring authority
|
|
19700
|
+
* gets born.
|
|
19701
|
+
*/
|
|
19702
|
+
maxHeight: external_exports.number().int().positive().optional(),
|
|
19600
19703
|
/** Minimum horizontal resolution. */
|
|
19601
19704
|
minWidth: external_exports.number().int().positive().optional(),
|
|
19602
19705
|
/**
|
|
@@ -19613,7 +19716,22 @@ var PickStreamRequirementsSchema = external_exports.object({
|
|
|
19613
19716
|
* transcoded" guard: if the device is already serving the consumer's
|
|
19614
19717
|
* codec end-to-end, there's nothing to optimise.
|
|
19615
19718
|
*/
|
|
19616
|
-
requireSiblingCodec: external_exports.array(StreamCodecSchema).readonly().optional()
|
|
19719
|
+
requireSiblingCodec: external_exports.array(StreamCodecSchema).readonly().optional(),
|
|
19720
|
+
/**
|
|
19721
|
+
* Whether a stream the consumer CANNOT decode may still be picked, on the
|
|
19722
|
+
* understanding that it will be transcoded.
|
|
19723
|
+
*
|
|
19724
|
+
* Default `false` — today's behaviour, and the right one for a bypass
|
|
19725
|
+
* question ("is there a stream I can forward untouched?"). Set `true` to
|
|
19726
|
+
* ask the larger question: "what is the best stream for me, transcoding if
|
|
19727
|
+
* I must?" A stream that satisfies `acceptCodecs` always outranks one that
|
|
19728
|
+
* does not, so a passthrough is never lost to a transcode; the answer says
|
|
19729
|
+
* which it is in {@link PickedCamStreamSchema.transcodes}.
|
|
19730
|
+
*
|
|
19731
|
+
* This is what lets one picker serve both the bypass and the full source
|
|
19732
|
+
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
19733
|
+
*/
|
|
19734
|
+
allowTranscode: external_exports.boolean().optional()
|
|
19617
19735
|
}).readonly();
|
|
19618
19736
|
var PickStreamPreferencesSchema = external_exports.object({
|
|
19619
19737
|
/**
|
|
@@ -19627,12 +19745,32 @@ var PickStreamPreferencesSchema = external_exports.object({
|
|
|
19627
19745
|
* picks the tallest stream; `'lowest'` picks the shortest (used by
|
|
19628
19746
|
* memory-constrained consumers / Apple Home guest sessions).
|
|
19629
19747
|
*/
|
|
19630
|
-
resolutionPreference: external_exports.enum(["highest", "lowest"]).optional()
|
|
19748
|
+
resolutionPreference: external_exports.enum(["highest", "lowest"]).optional(),
|
|
19749
|
+
/**
|
|
19750
|
+
* The height the consumer actually wants to DELIVER.
|
|
19751
|
+
*
|
|
19752
|
+
* Not a constraint — an ordering. With it set, the SMALLEST stream at or
|
|
19753
|
+
* above the target wins, and only if nothing reaches it does the tallest
|
|
19754
|
+
* take over. Pulling 1296 lines to draw 720 on a 1280x800 Echo panel costs
|
|
19755
|
+
* a decode and buys nothing, and `resolutionPreference: 'highest'` cannot
|
|
19756
|
+
* express that: it says "as big as possible", which is a different wish.
|
|
19757
|
+
*
|
|
19758
|
+
* Ignored when absent, so every existing caller keeps its ordering.
|
|
19759
|
+
*/
|
|
19760
|
+
targetHeight: external_exports.number().int().positive().optional()
|
|
19631
19761
|
}).readonly();
|
|
19632
19762
|
var PickedCamStreamSchema = external_exports.object({
|
|
19633
19763
|
camStreamId: external_exports.string(),
|
|
19634
19764
|
codec: external_exports.string().optional(),
|
|
19635
19765
|
resolution: CamStreamResolutionSchema.optional(),
|
|
19766
|
+
/**
|
|
19767
|
+
* Whether serving this stream requires a decode + re-encode.
|
|
19768
|
+
*
|
|
19769
|
+
* `false` is a stream the consumer can take as it stands. Only ever `true`
|
|
19770
|
+
* when the caller asked for it with `allowTranscode`, so a caller that did
|
|
19771
|
+
* not ask cannot be handed a cost it never agreed to pay.
|
|
19772
|
+
*/
|
|
19773
|
+
transcodes: external_exports.boolean(),
|
|
19636
19774
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
19637
19775
|
reason: external_exports.string()
|
|
19638
19776
|
});
|
|
@@ -24443,6 +24581,8 @@ var NcSystemEventKindSchema = external_exports.enum([
|
|
|
24443
24581
|
"device-enabled",
|
|
24444
24582
|
"device-battery-low",
|
|
24445
24583
|
"device-battery-normal",
|
|
24584
|
+
"device-consumable-low",
|
|
24585
|
+
"device-consumable-normal",
|
|
24446
24586
|
"stream-online",
|
|
24447
24587
|
"stream-offline",
|
|
24448
24588
|
"node-online",
|
|
@@ -24461,6 +24601,7 @@ var NcSystemEventKindSchema = external_exports.enum([
|
|
|
24461
24601
|
"addon-updated",
|
|
24462
24602
|
"server-updated",
|
|
24463
24603
|
"export-completed",
|
|
24604
|
+
"backup-completed",
|
|
24464
24605
|
"camera-online",
|
|
24465
24606
|
"camera-offline",
|
|
24466
24607
|
"camera-disabled",
|
|
@@ -27320,13 +27461,91 @@ var SummariesQueryInput = external_exports.object({
|
|
|
27320
27461
|
deviceIds: external_exports.array(external_exports.number()).min(1),
|
|
27321
27462
|
since: external_exports.number().optional(),
|
|
27322
27463
|
until: external_exports.number().optional(),
|
|
27323
|
-
limit: external_exports.number().int().min(1).max(200).default(50)
|
|
27464
|
+
limit: external_exports.number().int().min(1).max(200).default(50),
|
|
27465
|
+
/** The same member-wise filter {@link listRecentSummaries} takes — one
|
|
27466
|
+
* meaning of "dog" on every summary surface. */
|
|
27467
|
+
classes: external_exports.array(external_exports.string().min(1).max(60)).max(40).optional()
|
|
27468
|
+
});
|
|
27469
|
+
var SummaryMemberSchema = external_exports.object({
|
|
27470
|
+
trackId: external_exports.string(),
|
|
27471
|
+
/**
|
|
27472
|
+
* The track's class at the time it JOINED, or `null` when it was unresolved
|
|
27473
|
+
* and the track no longer exists to fill it.
|
|
27474
|
+
*
|
|
27475
|
+
* The join, not the latest opinion: class voting can re-decide a track's
|
|
27476
|
+
* class afterwards, and a group's composition is the history of who came
|
|
27477
|
+
* together. A consumer counts these to badge a thumbnail — "two people and a
|
|
27478
|
+
* dog" — rather than being handed a second, denormalised tally that would
|
|
27479
|
+
* drift from the members it claims to describe.
|
|
27480
|
+
*/
|
|
27481
|
+
className: external_exports.string().nullable(),
|
|
27482
|
+
/** `primary` is the one member that carries the group's identity. */
|
|
27483
|
+
role: external_exports.enum([
|
|
27484
|
+
"primary",
|
|
27485
|
+
"sibling",
|
|
27486
|
+
"child"
|
|
27487
|
+
]).nullable(),
|
|
27488
|
+
joinedAt: external_exports.number(),
|
|
27489
|
+
/** Tier 1 — the sub-class (`dog`, `van`), resolved from the member's track
|
|
27490
|
+
* at read time. Absent when nothing resolved, never an empty string. */
|
|
27491
|
+
label: external_exports.string().optional(),
|
|
27492
|
+
/** Tier 2 — the instance: a person's name, a plate. Absent when the pipeline
|
|
27493
|
+
* recognised nobody, and absent for a member whose track has been pruned —
|
|
27494
|
+
* a thumbnail that names the wrong person is worse than one naming nobody. */
|
|
27495
|
+
subLabel: external_exports.string().optional()
|
|
27324
27496
|
});
|
|
27325
|
-
var SummariesPageSchema = external_exports.object({ summaries: external_exports.array(SummarySchema).readonly() });
|
|
27326
27497
|
var SummaryDetailSchema = external_exports.object({
|
|
27327
27498
|
summary: SummarySchema,
|
|
27328
|
-
/**
|
|
27329
|
-
|
|
27499
|
+
/** Members in absorption order, oldest join first. */
|
|
27500
|
+
members: external_exports.array(SummaryMemberSchema).readonly()
|
|
27501
|
+
});
|
|
27502
|
+
var SummaryListItemSchema = external_exports.object({
|
|
27503
|
+
summary: SummarySchema,
|
|
27504
|
+
/** Class counts, most numerous first; `className: null` is a member whose
|
|
27505
|
+
* class never resolved, counted so the counts add up to `memberCount`. */
|
|
27506
|
+
classes: external_exports.array(external_exports.object({
|
|
27507
|
+
className: external_exports.string().nullable(),
|
|
27508
|
+
count: external_exports.number().int().positive()
|
|
27509
|
+
})).readonly()
|
|
27510
|
+
});
|
|
27511
|
+
var SummariesPageSchema = external_exports.object({ summaries: external_exports.array(SummaryListItemSchema).readonly() });
|
|
27512
|
+
var RecentSummariesQueryInput = external_exports.object({
|
|
27513
|
+
/** Devices to merge. An empty array yields an empty page. */
|
|
27514
|
+
deviceIds: external_exports.array(external_exports.number()),
|
|
27515
|
+
/** Window lower bound on `lastActiveAt` (inclusive). */
|
|
27516
|
+
since: external_exports.number().optional(),
|
|
27517
|
+
/** Window upper bound on `lastActiveAt` (inclusive). */
|
|
27518
|
+
until: external_exports.number().optional(),
|
|
27519
|
+
limit: external_exports.number().int().min(1).max(500).default(100),
|
|
27520
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
27521
|
+
cursor: external_exports.string().optional(),
|
|
27522
|
+
/**
|
|
27523
|
+
* Restrict to these classes — THE SAME FIELD `listRecentTracks` takes, and
|
|
27524
|
+
* deliberately the same name: the events filter tree emits one list of ticked
|
|
27525
|
+
* taxonomy nodes, and a summaries feed that called it something else would
|
|
27526
|
+
* make the operator's one filter component produce two shapes.
|
|
27527
|
+
*
|
|
27528
|
+
* A question about the MEMBERS: a group matches when ANY of them does. "Show
|
|
27529
|
+
* me the arrivals with a dog" has to return the group of four people who had
|
|
27530
|
+
* one with them; a filter on the group's own fields could only ever answer
|
|
27531
|
+
* about its primary.
|
|
27532
|
+
*
|
|
27533
|
+
* Matched against all THREE tiers of a member — the class (`animal`), the
|
|
27534
|
+
* sub-class (`dog`) and the instance (a name, a plate) — because which tier a
|
|
27535
|
+
* ticked node lives on is the taxonomy's business, not the caller's. `dog` is
|
|
27536
|
+
* an event kind in the tree and a tier-1 label on an `animal` track; a filter
|
|
27537
|
+
* that read only the class would answer "animal" and never "dog".
|
|
27538
|
+
*
|
|
27539
|
+
* ABSENT or EMPTY means no filter — absent is not a selection of none.
|
|
27540
|
+
*/
|
|
27541
|
+
classes: external_exports.array(external_exports.string().min(1).max(60)).max(40).optional()
|
|
27542
|
+
});
|
|
27543
|
+
var RecentSummariesPageSchema = external_exports.object({
|
|
27544
|
+
/** Ordered by (`lastActiveAt` DESC, id DESC). Same light item as
|
|
27545
|
+
* {@link listSummaries} — one list shape, so a card renders the same
|
|
27546
|
+
* whichever feed drew it. */
|
|
27547
|
+
summaries: external_exports.array(SummaryListItemSchema).readonly(),
|
|
27548
|
+
nextCursor: external_exports.string().nullable()
|
|
27330
27549
|
});
|
|
27331
27550
|
var RecentTracksPageSchema = external_exports.object({
|
|
27332
27551
|
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
@@ -27678,6 +27897,11 @@ var pipelineAnalyticsCapability = {
|
|
|
27678
27897
|
listRecentTracks: method(RecentTracksQueryInput, RecentTracksPageSchema),
|
|
27679
27898
|
/** Newest first by `openedAt`, for a camera set, inside an optional window. */
|
|
27680
27899
|
listSummaries: method(SummariesQueryInput, SummariesPageSchema),
|
|
27900
|
+
/**
|
|
27901
|
+
* The PAGED feed — the reel and the Events gallery. Same cursor contract as
|
|
27902
|
+
* {@link listRecentTracks}, so one screen cannot hold two ideas of newest.
|
|
27903
|
+
*/
|
|
27904
|
+
listRecentSummaries: method(RecentSummariesQueryInput, RecentSummariesPageSchema),
|
|
27681
27905
|
/** One summary with its member track ids; `null` for an id nobody wrote. */
|
|
27682
27906
|
getSummary: method(external_exports.object({ id: external_exports.string() }), SummaryDetailSchema.nullable()),
|
|
27683
27907
|
clearTracks: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), {
|
|
@@ -32142,10 +32366,28 @@ var webrtcSessionCapability = {
|
|
|
32142
32366
|
getSessionState: method(external_exports.object({
|
|
32143
32367
|
deviceId: external_exports.number().int().nonnegative(),
|
|
32144
32368
|
sessionId: external_exports.string()
|
|
32145
|
-
}), external_exports.object({
|
|
32146
|
-
|
|
32147
|
-
|
|
32148
|
-
|
|
32369
|
+
}), external_exports.object({
|
|
32370
|
+
pendingRenegotiation: external_exports.object({
|
|
32371
|
+
target: WebrtcStreamTargetSchema,
|
|
32372
|
+
epoch: external_exports.number()
|
|
32373
|
+
}).nullable(),
|
|
32374
|
+
/**
|
|
32375
|
+
* Whether the session still EXISTS.
|
|
32376
|
+
*
|
|
32377
|
+
* A consumer that holds a resource for the life of a session needs to
|
|
32378
|
+
* be able to ask, because a session does not always end the way it
|
|
32379
|
+
* began. Measured on this hub 2026-09-13: an Echo that got stuck never
|
|
32380
|
+
* sent `SessionDisconnected`, so the Alexa exporter's
|
|
32381
|
+
* `releaseEgressTranscode` never ran, and a 2304x1296 HEVC to 720p
|
|
32382
|
+
* H.264 transcode kept running for NOBODY for more than twenty
|
|
32383
|
+
* minutes. The WebRTC session had logged `WebRTC session closed`
|
|
32384
|
+
* minutes earlier — the broker knew; the holder had no way to ask.
|
|
32385
|
+
*
|
|
32386
|
+
* `false` for a session id the provider has never heard of, which is
|
|
32387
|
+
* the same answer as "it ended": either way nothing is holding it up.
|
|
32388
|
+
*/
|
|
32389
|
+
alive: external_exports.boolean()
|
|
32390
|
+
}))
|
|
32149
32391
|
},
|
|
32150
32392
|
/** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
|
|
32151
32393
|
mount: { kind: "server-provided" }
|
|
@@ -39867,7 +40109,29 @@ var LoggingSettingsPatchSchema = external_exports.object({
|
|
|
39867
40109
|
* disarmed the channels it did not mention would make the Levels page and
|
|
39868
40110
|
* the Diagnostics page fight over the same value.
|
|
39869
40111
|
*/
|
|
39870
|
-
channels: external_exports.array(LogChannelWindowPatchSchema).readonly().optional()
|
|
40112
|
+
channels: external_exports.array(LogChannelWindowPatchSchema).readonly().optional(),
|
|
40113
|
+
/**
|
|
40114
|
+
* How many days the analytics OPS LOG is kept — the audit trail of what
|
|
40115
|
+
* retention actually deleted.
|
|
40116
|
+
*
|
|
40117
|
+
* It lives HERE, on the logging document, and not on the analytics addon's
|
|
40118
|
+
* settings form, on the operator's instruction: every other log-ish window in
|
|
40119
|
+
* this system is configured through this one document, and a retention audit
|
|
40120
|
+
* configured somewhere else is a second place to look when the question is
|
|
40121
|
+
* "what happened to my data".
|
|
40122
|
+
*
|
|
40123
|
+
* That placement has a cost worth stating: this document ships in the
|
|
40124
|
+
* framework closure, so this knob needs a published `@camstack/server` while
|
|
40125
|
+
* the four windows beside it (D485) reach a node on `camstack deploy`.
|
|
40126
|
+
*
|
|
40127
|
+
* `retention-model.ts` argued this one must NOT follow a device window,
|
|
40128
|
+
* because the audit trail is the history of the SWEEP and not of the camera.
|
|
40129
|
+
* That argument stands and is untouched — what changes is that 30 days stops
|
|
40130
|
+
* being a constant nobody can reach. `0` keeps it forever. The floor is 1 day
|
|
40131
|
+
* rather than 0-as-delete: an audit log truncated to nothing is precisely the
|
|
40132
|
+
* state in which the next 9.5 GiB leak cannot be explained.
|
|
40133
|
+
*/
|
|
40134
|
+
opsLogRetentionDays: external_exports.number().int().min(0).max(3650).optional()
|
|
39871
40135
|
});
|
|
39872
40136
|
var ReportedLoadContributionSchema = LoadContributionSchema.extend({ addonId: external_exports.string() });
|
|
39873
40137
|
var ReportedFailureContributionSchema = FailureContributionSchema.extend({ addonId: external_exports.string() });
|
|
@@ -39906,6 +40170,14 @@ var LoggingSettingsStateSchema = external_exports.object({
|
|
|
39906
40170
|
channels: external_exports.array(LogChannelDescriptorSchema).readonly(),
|
|
39907
40171
|
/** The channels ARMED right now, each with its deadline. */
|
|
39908
40172
|
activeChannels: external_exports.array(LogChannelWindowStateSchema).readonly(),
|
|
40173
|
+
/**
|
|
40174
|
+
* The ops-log window in days, as it is in force. `0` = kept forever.
|
|
40175
|
+
*
|
|
40176
|
+
* Reported rather than left to the caller's memory of what it wrote: this is
|
|
40177
|
+
* the value the analytics sweep will actually use, and an operator asking how
|
|
40178
|
+
* long their audit trail lives should not have to infer it from a default.
|
|
40179
|
+
*/
|
|
40180
|
+
opsLogRetentionDays: external_exports.number().int().min(0),
|
|
39909
40181
|
persisted: external_exports.boolean()
|
|
39910
40182
|
});
|
|
39911
40183
|
var systemCapability = {
|
|
@@ -44435,6 +44707,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
44435
44707
|
addonId: null,
|
|
44436
44708
|
access: "view"
|
|
44437
44709
|
},
|
|
44710
|
+
"pipelineAnalytics.listRecentSummaries": {
|
|
44711
|
+
capName: "pipeline-analytics",
|
|
44712
|
+
capScope: "device",
|
|
44713
|
+
addonId: null,
|
|
44714
|
+
access: "view"
|
|
44715
|
+
},
|
|
44438
44716
|
"pipelineAnalytics.listRecentTracks": {
|
|
44439
44717
|
capName: "pipeline-analytics",
|
|
44440
44718
|
capScope: "device",
|
|
@@ -46397,6 +46675,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
46397
46675
|
addonId: null,
|
|
46398
46676
|
access: "create"
|
|
46399
46677
|
},
|
|
46678
|
+
"streamBroker.reportStreamSignal": {
|
|
46679
|
+
capName: "stream-broker",
|
|
46680
|
+
capScope: "system",
|
|
46681
|
+
addonId: null,
|
|
46682
|
+
access: "create"
|
|
46683
|
+
},
|
|
46400
46684
|
"streamBroker.restartProfile": {
|
|
46401
46685
|
capName: "stream-broker",
|
|
46402
46686
|
capScope: "system",
|
|
@@ -46481,6 +46765,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
46481
46765
|
addonId: null,
|
|
46482
46766
|
access: "create"
|
|
46483
46767
|
},
|
|
46768
|
+
"streamSignals.listSignals": {
|
|
46769
|
+
capName: "stream-signals",
|
|
46770
|
+
capScope: "device",
|
|
46771
|
+
addonId: null,
|
|
46772
|
+
access: "view"
|
|
46773
|
+
},
|
|
46484
46774
|
"switch.setState": {
|
|
46485
46775
|
capName: "switch",
|
|
46486
46776
|
capScope: "device",
|
|
@@ -48262,6 +48552,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
|
|
|
48262
48552
|
form: "single",
|
|
48263
48553
|
optional: true
|
|
48264
48554
|
}],
|
|
48555
|
+
"pipelineAnalytics.listRecentSummaries": [{
|
|
48556
|
+
name: "deviceIds",
|
|
48557
|
+
form: "array",
|
|
48558
|
+
optional: false
|
|
48559
|
+
}],
|
|
48265
48560
|
"pipelineAnalytics.listRecentTracks": [{
|
|
48266
48561
|
name: "deviceIds",
|
|
48267
48562
|
form: "array",
|
|
@@ -48848,6 +49143,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
|
|
|
48848
49143
|
form: "single",
|
|
48849
49144
|
optional: false
|
|
48850
49145
|
}],
|
|
49146
|
+
"streamBroker.reportStreamSignal": [{
|
|
49147
|
+
name: "deviceId",
|
|
49148
|
+
form: "single",
|
|
49149
|
+
optional: false
|
|
49150
|
+
}],
|
|
48851
49151
|
"streamBroker.restartProfile": [{
|
|
48852
49152
|
name: "deviceId",
|
|
48853
49153
|
form: "single",
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runDiscover
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IGFZA22D.js";
|
|
5
5
|
import "./chunk-LMMQX4CK.js";
|
|
6
6
|
|
|
7
7
|
// src/cli.ts
|
|
@@ -38,7 +38,7 @@ async function runServe(args) {
|
|
|
38
38
|
...typeof values.data === "string" ? { data: values.data } : {}
|
|
39
39
|
};
|
|
40
40
|
Object.assign(process.env, buildServeEnv(opts));
|
|
41
|
-
await import("./launcher-
|
|
41
|
+
await import("./launcher-26BZ4JHD.js");
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// src/commands/agent.ts
|
|
@@ -83,7 +83,7 @@ async function runAgent(args) {
|
|
|
83
83
|
...typeof values.port === "string" ? { port: values.port } : {}
|
|
84
84
|
};
|
|
85
85
|
Object.assign(process.env, buildAgentEnv(opts));
|
|
86
|
-
await import("./launcher-
|
|
86
|
+
await import("./launcher-26BZ4JHD.js");
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
// src/commands/setup.ts
|
|
@@ -1140,7 +1140,7 @@ function isUnknown(_value) {
|
|
|
1140
1140
|
return true;
|
|
1141
1141
|
}
|
|
1142
1142
|
async function resolveServerInteractive(presetNamespace) {
|
|
1143
|
-
const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-
|
|
1143
|
+
const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-ZCOCQKSU.js");
|
|
1144
1144
|
if (presetNamespace) {
|
|
1145
1145
|
const spinner4 = clack.spinner();
|
|
1146
1146
|
spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
|