@camstack/addon-export-alexa 1.2.41 → 1.2.42

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.
@@ -26,7 +26,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  //#endregion
27
27
  let node_crypto = require("node:crypto");
28
28
  node_crypto = __toESM(node_crypto);
29
- //#region ../types/dist/event-category-CIa_iT6b.mjs
29
+ //#region ../types/dist/event-category-BZL-fdNj.mjs
30
30
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
31
31
  EventCategory["SystemBoot"] = "system.boot";
32
32
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -463,7 +463,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
463
463
  EventCategory["MetricsNodeResourcesSnapshot"] = "metrics.node-resources-snapshot";
464
464
  /**
465
465
  * Periodic per-node process-tree snapshot (camstack-related pids
466
- * with ghost / managed / root classification). Emitted ~0.2 Hz by
466
+ * with root / managed / system classification). Emitted ~0.2 Hz by
467
467
  * the metrics-provider addon. Drives the Cluster → Processes tab
468
468
  * without polling `metricsProvider.listNodeProcesses`.
469
469
  */
@@ -11396,6 +11396,19 @@ var SettingsRecordSchema = object({
11396
11396
  data: record(string(), unknown())
11397
11397
  });
11398
11398
  /**
11399
+ * One record of a BULK insert — {@link SettingsRecordSchema} with the id made
11400
+ * optional.
11401
+ *
11402
+ * A separate schema rather than loosening the shared one: every other method
11403
+ * on this cap addresses a row BY its id, and making that field optional
11404
+ * everywhere would turn a forgotten key into a silently generated one on
11405
+ * `update` and `delete` as well.
11406
+ */
11407
+ var BulkRecordSchema = object({
11408
+ id: string().optional(),
11409
+ data: record(string(), unknown())
11410
+ });
11411
+ /**
11399
11412
  * Column declaration for a structured (SQL-backed) collection.
11400
11413
  *
11401
11414
  * Logical types — the backend translates each to the matching SQLite
@@ -11452,6 +11465,10 @@ method(object({
11452
11465
  collection: string(),
11453
11466
  record: SettingsRecordSchema
11454
11467
  }), _void(), { kind: "mutation" }), method(object({
11468
+ namespace: string().optional(),
11469
+ collection: string(),
11470
+ records: array(BulkRecordSchema).readonly()
11471
+ }), object({ inserted: number().int() }), { kind: "mutation" }), method(object({
11455
11472
  namespace: string().optional(),
11456
11473
  collection: string(),
11457
11474
  id: string(),
@@ -11560,6 +11577,13 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11560
11577
  }), _void(), {
11561
11578
  kind: "mutation",
11562
11579
  auth: "admin"
11580
+ }), method(object({
11581
+ namespace: string().optional(),
11582
+ collection: string(),
11583
+ records: array(BulkRecordSchema).readonly()
11584
+ }), object({ inserted: number().int() }), {
11585
+ kind: "mutation",
11586
+ auth: "admin"
11563
11587
  }), method(object({
11564
11588
  namespace: string().optional(),
11565
11589
  collection: string(),
@@ -13353,6 +13377,68 @@ method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
13353
13377
  limit: number().optional(),
13354
13378
  tags: record(string(), string()).optional()
13355
13379
  }), array(LogEntrySchema).readonly());
13380
+ var LoadContributionSchema = object({
13381
+ role: _enum([
13382
+ "decode",
13383
+ "transcode",
13384
+ "recording",
13385
+ "streaming",
13386
+ "detection"
13387
+ ]),
13388
+ /**
13389
+ * The NUMERIC device id — the same value every log line carries as
13390
+ * `tags.deviceId`. `null` means this cost genuinely belongs to no single
13391
+ * camera (a shared pool), NOT that the contributor forgot to look it up: a
13392
+ * contributor that cannot name its camera must not emit the entry at all,
13393
+ * because an unnamed per-camera entry is indistinguishable from a shared one
13394
+ * and would quietly turn one camera's cost into everybody's.
13395
+ */
13396
+ deviceId: number().int().positive().nullable(),
13397
+ attribution: _enum([
13398
+ "measured",
13399
+ "accounted",
13400
+ "unattributable"
13401
+ ]),
13402
+ /**
13403
+ * What ONE entry is, in the contributor's own words — `615/high`,
13404
+ * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
13405
+ * family and inventing a common one would lose the only information that
13406
+ * makes two entries for the same camera distinguishable.
13407
+ */
13408
+ unit: string(),
13409
+ /**
13410
+ * The OS process this cost lives in, when there is one. Present so a
13411
+ * consumer can (a) tell two generations of the same unit apart across a
13412
+ * restart, and (b) subtract claimed processes from the node's process
13413
+ * snapshot to see what NOBODY claimed. Absent for an entry that owns no
13414
+ * process of its own.
13415
+ */
13416
+ pid: number().int().positive().optional(),
13417
+ /**
13418
+ * When this generation started. The pid's incarnation marker: a consumer
13419
+ * differencing {@link LoadContributionSchema.shape.cpuSeconds} must drop the
13420
+ * window when this changes, because the counter restarted from zero in a new
13421
+ * process.
13422
+ */
13423
+ startedAtMs: number().optional(),
13424
+ /**
13425
+ * CUMULATIVE CPU seconds this unit has consumed since it started — user +
13426
+ * system, read from the child's own `/proc/<pid>/stat` at the moment the
13427
+ * contribution is asked for.
13428
+ *
13429
+ * Cumulative and not a rate on purpose: a rate needs a window, a window
13430
+ * needs a sampler, and a new per-node sampler is the defect half of
13431
+ * `docs/architecture/load-ledger.md` documents. A counter can be differenced
13432
+ * by whoever already keeps a history; a rate cannot be un-averaged.
13433
+ *
13434
+ * Absent — never zero — on a node with no `/proc`, on a read failure, and on
13435
+ * an entry with no process.
13436
+ */
13437
+ cpuSeconds: number().optional(),
13438
+ /** Resident bytes of this unit's process, same source and same rules. */
13439
+ rssBytes: number().optional()
13440
+ });
13441
+ method(_void(), array(LoadContributionSchema).readonly());
13356
13442
  /**
13357
13443
  * `login-method` — collection cap through which auth addons contribute
13358
13444
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -13556,8 +13642,7 @@ var NodeProcessSchema = object({
13556
13642
  classification: _enum([
13557
13643
  "root",
13558
13644
  "managed",
13559
- "system",
13560
- "ghost"
13645
+ "system"
13561
13646
  ]),
13562
13647
  /** `$process` addon binding when `managed`, else null. */
13563
13648
  addonId: string().nullable(),
@@ -13565,22 +13650,39 @@ var NodeProcessSchema = object({
13565
13650
  nodeId: string().nullable(),
13566
13651
  /** Truncated command line. */
13567
13652
  command: string(),
13653
+ /**
13654
+ * `ps pcpu` — CPU averaged over the process's WHOLE LIFETIME, not a rate.
13655
+ * On a runner up for days it barely moves. Fine as a column, useless as a
13656
+ * series: use `cpuMainPercent + cpuGcPercent` for anything time-varying.
13657
+ */
13568
13658
  cpuPercent: number(),
13569
13659
  memoryRssBytes: number(),
13660
+ /**
13661
+ * Instantaneous CPU% of the process's own threads over the last
13662
+ * process-snapshot window, from a `/proc/<pid>/task/*` tick delta.
13663
+ *
13664
+ * `null` = UNKNOWN, never zero: no previous sample yet (first tick after
13665
+ * boot), the pid was recycled, or this node is not Linux.
13666
+ */
13667
+ cpuMainPercent: number().nullable(),
13668
+ /**
13669
+ * Instantaneous CPU% of V8's `V8Worker` platform pool over the same window.
13670
+ *
13671
+ * This is the number that rewrote the 2026-08-27 diagnosis — hub-main 73%,
13672
+ * `stream-broker` 61% (`docs/architecture/load-ledger.md`). A CPU chart that
13673
+ * does not separate it from `cpuMainPercent` shows "busy" where the truth is
13674
+ * "allocating too much".
13675
+ *
13676
+ * Concurrent GC is the dominant tenant of that pool but not the only one
13677
+ * (background compilation runs there too), so it is reported as
13678
+ * "GC / V8 helpers" rather than as pure collection time. `null` has the same
13679
+ * meaning as on `cpuMainPercent`.
13680
+ */
13681
+ cpuGcPercent: number().nullable(),
13682
+ /** Threads seen in the tick scan. `null` under the same conditions. */
13683
+ threadCount: number().nullable(),
13570
13684
  /** Wall-clock uptime (seconds). Parsed from `ps etime`. */
13571
- uptimeSec: number(),
13572
- /** True when ancestor walk reaches `ppid=1` (reparented to init/launchd). */
13573
- orphaned: boolean()
13574
- });
13575
- var KillProcessInputSchema = object({
13576
- pid: number(),
13577
- /** Force = SIGKILL. Default is SIGTERM. */
13578
- force: boolean().optional()
13579
- });
13580
- var KillProcessResultSchema = object({
13581
- success: boolean(),
13582
- reason: string().optional(),
13583
- signal: _enum(["SIGTERM", "SIGKILL"]).optional()
13685
+ uptimeSec: number()
13584
13686
  });
13585
13687
  var DumpHeapSnapshotInputSchema = object({
13586
13688
  /** The addon whose runner should dump a heap snapshot. */
@@ -13593,6 +13695,104 @@ var DumpHeapSnapshotResultSchema = object({
13593
13695
  pid: number().optional(),
13594
13696
  reason: string().optional()
13595
13697
  });
13698
+ /**
13699
+ * One point of one function's series.
13700
+ *
13701
+ * The unsuffixed fields are the bucket's **MAXIMUM**, and that choice is the
13702
+ * point of the whole surface. The two obvious reductions both lie: a mean per
13703
+ * bucket smears a spike away, and taking every Nth sample skips it outright.
13704
+ * Either would give us a tool built to find peaks that does not show peaks.
13705
+ * `...Min` carries the other end, `samples` says how many raw snapshots folded
13706
+ * into the bucket, and a mean stays derivable where it is wanted.
13707
+ *
13708
+ * An UNREDUCED point is a one-sample bucket: `samples === 1` and each `...Min`
13709
+ * equals its unsuffixed twin. Reduced and unreduced are the same shape, so a
13710
+ * caller cannot tell which it received — which is what "one reader" means.
13711
+ */
13712
+ var LoadPointSchema = object({
13713
+ /** Bucket START, or the snapshot's own timestamp when unreduced. */
13714
+ atMs: number(),
13715
+ /** Raw snapshots in this bucket. Never 0 — AN EMPTY BUCKET IS ABSENT. */
13716
+ samples: number().int(),
13717
+ /**
13718
+ * `null` = UNKNOWN and it PROPAGATES: a bucket is null unless every process
13719
+ * of every snapshot in it reported a thread split. A partial sum is a
13720
+ * smaller number that looks exactly as real as a complete one.
13721
+ */
13722
+ cpuMainPercent: number().nullable(),
13723
+ cpuMainPercentMin: number().nullable(),
13724
+ cpuGcPercent: number().nullable(),
13725
+ cpuGcPercentMin: number().nullable(),
13726
+ /** Lifetime-average CPU%, summed. Always known — and never a rate. */
13727
+ cpuLifetimePercent: number(),
13728
+ cpuLifetimePercentMin: number(),
13729
+ memoryRssBytes: number(),
13730
+ memoryRssBytesMin: number(),
13731
+ processCount: number().int(),
13732
+ processCountMin: number().int()
13733
+ });
13734
+ /** One function's series. `key` is an addonId, `__root__` or `__unattributed__`. */
13735
+ var LoadFunctionSeriesSchema = object({
13736
+ key: string(),
13737
+ kind: _enum([
13738
+ "addon",
13739
+ "root",
13740
+ "unattributed"
13741
+ ]),
13742
+ /** Oldest-first. A missing interval is MISSING — never zero-filled. */
13743
+ points: array(LoadPointSchema).readonly()
13744
+ });
13745
+ var NodeLoadSeriesSchema = object({
13746
+ nodeId: string(),
13747
+ /** One entry per function seen in the window, heaviest-first. */
13748
+ series: array(LoadFunctionSeriesSchema).readonly(),
13749
+ /**
13750
+ * Width of one returned bucket, in ms. Equals the sampling cadence when no
13751
+ * reduction was needed — so a caller can always say what one point covers
13752
+ * without having to know whether it was reduced.
13753
+ */
13754
+ bucketMs: number(),
13755
+ /** Raw snapshots that went into this answer, across both tiers. */
13756
+ retainedSamples: number(),
13757
+ /** Oldest snapshot represented, or `null` when nothing is retained. */
13758
+ oldestAtMs: number().nullable(),
13759
+ /** The fixed sampling cadence in force on the cluster, in ms. */
13760
+ cadenceMs: number(),
13761
+ /**
13762
+ * Did the DURABLE tier contribute? `false` means the answer is the hot ring
13763
+ * alone — an agent (which holds no table), or a store that refused.
13764
+ * Reported because "the last hour" and "the last six hours" are different
13765
+ * questions and an operator must not have to guess which was answered.
13766
+ */
13767
+ durable: boolean()
13768
+ });
13769
+ var GetLoadSeriesInputSchema = object({
13770
+ /**
13771
+ * The node whose series is wanted.
13772
+ *
13773
+ * NOT named `nodeId`: the generated cap router strips a top-level
13774
+ * `nodeId` from every method input and uses it to ROUTE the call to
13775
+ * that node's provider (`generated-cap-routers.ts`). A series target
13776
+ * called `nodeId` would silently become a routing pin and never reach
13777
+ * the provider. The hub holds every node it hears from, so the
13778
+ * ordinary call is unpinned — answered by the hub, for any node.
13779
+ */
13780
+ forNodeId: string(),
13781
+ /**
13782
+ * EXCLUSIVE lower bound. A caller passes the newest `atMs` it already
13783
+ * holds and receives only what it is missing, so seeding a live chart
13784
+ * from this method cannot double a point already drawn.
13785
+ */
13786
+ sinceMs: number().optional(),
13787
+ /**
13788
+ * Most points the caller wants PER FUNCTION. The window is reduced to fit,
13789
+ * preserving min and max per bucket.
13790
+ *
13791
+ * Absent means NO reduction — legitimate for a short window and a trap for a
13792
+ * long one, which is why a chart passes its own pixel width.
13793
+ */
13794
+ maxPoints: number().int().positive().optional()
13795
+ });
13596
13796
  var SystemMetricsSchema = object({
13597
13797
  cpuPercent: number(),
13598
13798
  memoryPercent: number(),
@@ -13603,10 +13803,7 @@ var SystemMetricsSchema = object({
13603
13803
  gpuPercent: number().optional(),
13604
13804
  gpuMemoryPercent: number().optional()
13605
13805
  });
13606
- method(_void(), SystemResourceSnapshotSchema), method(_void(), SystemResourceSnapshotSchema.nullable()), method(_void(), SystemMetricsSchema), method(object({ dirPath: string() }), DiskSpaceInfoSchema), method(_void(), MetricsGpuInfoSchema.nullable()), method(_void(), number().nullable()), method(object({ pids: array(number()) }), array(PidResourceStatsSchema)), method(_void(), array(AddonInstanceSchema).readonly()), method(object({ addonId: string() }), PidResourceStatsSchema.nullable()), method(_void(), array(NodeProcessSchema).readonly()), method(KillProcessInputSchema, KillProcessResultSchema, {
13607
- kind: "mutation",
13608
- auth: "admin"
13609
- }), method(DumpHeapSnapshotInputSchema, DumpHeapSnapshotResultSchema, {
13806
+ method(_void(), SystemResourceSnapshotSchema), method(_void(), SystemResourceSnapshotSchema.nullable()), method(_void(), SystemMetricsSchema), method(object({ dirPath: string() }), DiskSpaceInfoSchema), method(_void(), MetricsGpuInfoSchema.nullable()), method(_void(), number().nullable()), method(object({ pids: array(number()) }), array(PidResourceStatsSchema)), method(_void(), array(AddonInstanceSchema).readonly()), method(object({ addonId: string() }), PidResourceStatsSchema.nullable()), method(_void(), array(NodeProcessSchema).readonly()), method(GetLoadSeriesInputSchema, NodeLoadSeriesSchema), method(DumpHeapSnapshotInputSchema, DumpHeapSnapshotResultSchema, {
13610
13807
  kind: "mutation",
13611
13808
  auth: "admin"
13612
13809
  });
@@ -26925,6 +27122,15 @@ var LoggingSettingsPatchSchema = object({
26925
27122
  * authority over the whole hierarchy and answers for every layer, so the
26926
27123
  * layer selector needs a name the transport does not already own.
26927
27124
  */
27125
+ /**
27126
+ * One contribution, plus WHO reported it.
27127
+ *
27128
+ * The addon and node are added by the hub as it enumerates providers, never by
27129
+ * the contributor: an addon reporting its own identity could report somebody
27130
+ * else's, and the whole point of this surface is that no claim is made by
27131
+ * anyone but its owner.
27132
+ */
27133
+ var ReportedLoadContributionSchema = LoadContributionSchema.extend({ addonId: string() });
26928
27134
  var GetLoggingSettingsInputSchema = object({
26929
27135
  scopeNodeId: string().optional(),
26930
27136
  /**
@@ -26983,7 +27189,7 @@ method(_void(), FeatureManifestSchema), method(_void(), HealthStatusSchema), met
26983
27189
  }), method(_void(), SiteLocationStatusSchema, {
26984
27190
  kind: "mutation",
26985
27191
  auth: "admin"
26986
- }), method(_void(), RequestCensusStatusSchema, { auth: "admin" }), method(GetLoggingSettingsInputSchema, LoggingSettingsStateSchema, { auth: "admin" }), method(SetLoggingSettingsInputSchema, LoggingSettingsStateSchema, {
27192
+ }), method(_void(), RequestCensusStatusSchema, { auth: "admin" }), method(_void(), array(ReportedLoadContributionSchema).readonly(), { auth: "admin" }), method(GetLoggingSettingsInputSchema, LoggingSettingsStateSchema, { auth: "admin" }), method(SetLoggingSettingsInputSchema, LoggingSettingsStateSchema, {
26987
27193
  kind: "mutation",
26988
27194
  auth: "admin"
26989
27195
  });
@@ -28599,6 +28805,12 @@ Object.freeze({
28599
28805
  addonId: null,
28600
28806
  access: "create"
28601
28807
  },
28808
+ "dataStoreProvider.insertMany": {
28809
+ capName: "data-store-provider",
28810
+ capScope: "system",
28811
+ addonId: null,
28812
+ access: "create"
28813
+ },
28602
28814
  "dataStoreProvider.isEmpty": {
28603
28815
  capName: "data-store-provider",
28604
28816
  capScope: "system",
@@ -29913,6 +30125,12 @@ Object.freeze({
29913
30125
  addonId: null,
29914
30126
  access: "create"
29915
30127
  },
30128
+ "loadContribution.list": {
30129
+ capName: "load-contribution",
30130
+ capScope: "system",
30131
+ addonId: null,
30132
+ access: "view"
30133
+ },
29916
30134
  "localNetwork.downloadCa": {
29917
30135
  capName: "local-network",
29918
30136
  capScope: "system",
@@ -30213,17 +30431,17 @@ Object.freeze({
30213
30431
  addonId: null,
30214
30432
  access: "view"
30215
30433
  },
30216
- "metricsProvider.getProcessStats": {
30434
+ "metricsProvider.getLoadSeries": {
30217
30435
  capName: "metrics-provider",
30218
30436
  capScope: "system",
30219
30437
  addonId: null,
30220
30438
  access: "view"
30221
30439
  },
30222
- "metricsProvider.killProcess": {
30440
+ "metricsProvider.getProcessStats": {
30223
30441
  capName: "metrics-provider",
30224
30442
  capScope: "system",
30225
30443
  addonId: null,
30226
- access: "create"
30444
+ access: "view"
30227
30445
  },
30228
30446
  "metricsProvider.listAddonInstances": {
30229
30447
  capName: "metrics-provider",
@@ -32235,6 +32453,12 @@ Object.freeze({
32235
32453
  addonId: null,
32236
32454
  access: "create"
32237
32455
  },
32456
+ "settingsStore.insertMany": {
32457
+ capName: "settings-store",
32458
+ capScope: "system",
32459
+ addonId: null,
32460
+ access: "create"
32461
+ },
32238
32462
  "settingsStore.isEmpty": {
32239
32463
  capName: "settings-store",
32240
32464
  capScope: "system",
@@ -32847,6 +33071,12 @@ Object.freeze({
32847
33071
  addonId: null,
32848
33072
  access: "create"
32849
33073
  },
33074
+ "system.getLoadContributions": {
33075
+ capName: "system",
33076
+ capScope: "system",
33077
+ addonId: null,
33078
+ access: "view"
33079
+ },
32850
33080
  "system.getLoggingSettings": {
32851
33081
  capName: "system",
32852
33082
  capScope: "system",
@@ -1,5 +1,5 @@
1
1
  import * as crypto$1 from "node:crypto";
2
- //#region ../types/dist/event-category-CIa_iT6b.mjs
2
+ //#region ../types/dist/event-category-BZL-fdNj.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -436,7 +436,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
436
436
  EventCategory["MetricsNodeResourcesSnapshot"] = "metrics.node-resources-snapshot";
437
437
  /**
438
438
  * Periodic per-node process-tree snapshot (camstack-related pids
439
- * with ghost / managed / root classification). Emitted ~0.2 Hz by
439
+ * with root / managed / system classification). Emitted ~0.2 Hz by
440
440
  * the metrics-provider addon. Drives the Cluster → Processes tab
441
441
  * without polling `metricsProvider.listNodeProcesses`.
442
442
  */
@@ -11369,6 +11369,19 @@ var SettingsRecordSchema = object({
11369
11369
  data: record(string(), unknown())
11370
11370
  });
11371
11371
  /**
11372
+ * One record of a BULK insert — {@link SettingsRecordSchema} with the id made
11373
+ * optional.
11374
+ *
11375
+ * A separate schema rather than loosening the shared one: every other method
11376
+ * on this cap addresses a row BY its id, and making that field optional
11377
+ * everywhere would turn a forgotten key into a silently generated one on
11378
+ * `update` and `delete` as well.
11379
+ */
11380
+ var BulkRecordSchema = object({
11381
+ id: string().optional(),
11382
+ data: record(string(), unknown())
11383
+ });
11384
+ /**
11372
11385
  * Column declaration for a structured (SQL-backed) collection.
11373
11386
  *
11374
11387
  * Logical types — the backend translates each to the matching SQLite
@@ -11425,6 +11438,10 @@ method(object({
11425
11438
  collection: string(),
11426
11439
  record: SettingsRecordSchema
11427
11440
  }), _void(), { kind: "mutation" }), method(object({
11441
+ namespace: string().optional(),
11442
+ collection: string(),
11443
+ records: array(BulkRecordSchema).readonly()
11444
+ }), object({ inserted: number().int() }), { kind: "mutation" }), method(object({
11428
11445
  namespace: string().optional(),
11429
11446
  collection: string(),
11430
11447
  id: string(),
@@ -11533,6 +11550,13 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11533
11550
  }), _void(), {
11534
11551
  kind: "mutation",
11535
11552
  auth: "admin"
11553
+ }), method(object({
11554
+ namespace: string().optional(),
11555
+ collection: string(),
11556
+ records: array(BulkRecordSchema).readonly()
11557
+ }), object({ inserted: number().int() }), {
11558
+ kind: "mutation",
11559
+ auth: "admin"
11536
11560
  }), method(object({
11537
11561
  namespace: string().optional(),
11538
11562
  collection: string(),
@@ -13326,6 +13350,68 @@ method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
13326
13350
  limit: number().optional(),
13327
13351
  tags: record(string(), string()).optional()
13328
13352
  }), array(LogEntrySchema).readonly());
13353
+ var LoadContributionSchema = object({
13354
+ role: _enum([
13355
+ "decode",
13356
+ "transcode",
13357
+ "recording",
13358
+ "streaming",
13359
+ "detection"
13360
+ ]),
13361
+ /**
13362
+ * The NUMERIC device id — the same value every log line carries as
13363
+ * `tags.deviceId`. `null` means this cost genuinely belongs to no single
13364
+ * camera (a shared pool), NOT that the contributor forgot to look it up: a
13365
+ * contributor that cannot name its camera must not emit the entry at all,
13366
+ * because an unnamed per-camera entry is indistinguishable from a shared one
13367
+ * and would quietly turn one camera's cost into everybody's.
13368
+ */
13369
+ deviceId: number().int().positive().nullable(),
13370
+ attribution: _enum([
13371
+ "measured",
13372
+ "accounted",
13373
+ "unattributable"
13374
+ ]),
13375
+ /**
13376
+ * What ONE entry is, in the contributor's own words — `615/high`,
13377
+ * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
13378
+ * family and inventing a common one would lose the only information that
13379
+ * makes two entries for the same camera distinguishable.
13380
+ */
13381
+ unit: string(),
13382
+ /**
13383
+ * The OS process this cost lives in, when there is one. Present so a
13384
+ * consumer can (a) tell two generations of the same unit apart across a
13385
+ * restart, and (b) subtract claimed processes from the node's process
13386
+ * snapshot to see what NOBODY claimed. Absent for an entry that owns no
13387
+ * process of its own.
13388
+ */
13389
+ pid: number().int().positive().optional(),
13390
+ /**
13391
+ * When this generation started. The pid's incarnation marker: a consumer
13392
+ * differencing {@link LoadContributionSchema.shape.cpuSeconds} must drop the
13393
+ * window when this changes, because the counter restarted from zero in a new
13394
+ * process.
13395
+ */
13396
+ startedAtMs: number().optional(),
13397
+ /**
13398
+ * CUMULATIVE CPU seconds this unit has consumed since it started — user +
13399
+ * system, read from the child's own `/proc/<pid>/stat` at the moment the
13400
+ * contribution is asked for.
13401
+ *
13402
+ * Cumulative and not a rate on purpose: a rate needs a window, a window
13403
+ * needs a sampler, and a new per-node sampler is the defect half of
13404
+ * `docs/architecture/load-ledger.md` documents. A counter can be differenced
13405
+ * by whoever already keeps a history; a rate cannot be un-averaged.
13406
+ *
13407
+ * Absent — never zero — on a node with no `/proc`, on a read failure, and on
13408
+ * an entry with no process.
13409
+ */
13410
+ cpuSeconds: number().optional(),
13411
+ /** Resident bytes of this unit's process, same source and same rules. */
13412
+ rssBytes: number().optional()
13413
+ });
13414
+ method(_void(), array(LoadContributionSchema).readonly());
13329
13415
  /**
13330
13416
  * `login-method` — collection cap through which auth addons contribute
13331
13417
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -13529,8 +13615,7 @@ var NodeProcessSchema = object({
13529
13615
  classification: _enum([
13530
13616
  "root",
13531
13617
  "managed",
13532
- "system",
13533
- "ghost"
13618
+ "system"
13534
13619
  ]),
13535
13620
  /** `$process` addon binding when `managed`, else null. */
13536
13621
  addonId: string().nullable(),
@@ -13538,22 +13623,39 @@ var NodeProcessSchema = object({
13538
13623
  nodeId: string().nullable(),
13539
13624
  /** Truncated command line. */
13540
13625
  command: string(),
13626
+ /**
13627
+ * `ps pcpu` — CPU averaged over the process's WHOLE LIFETIME, not a rate.
13628
+ * On a runner up for days it barely moves. Fine as a column, useless as a
13629
+ * series: use `cpuMainPercent + cpuGcPercent` for anything time-varying.
13630
+ */
13541
13631
  cpuPercent: number(),
13542
13632
  memoryRssBytes: number(),
13633
+ /**
13634
+ * Instantaneous CPU% of the process's own threads over the last
13635
+ * process-snapshot window, from a `/proc/<pid>/task/*` tick delta.
13636
+ *
13637
+ * `null` = UNKNOWN, never zero: no previous sample yet (first tick after
13638
+ * boot), the pid was recycled, or this node is not Linux.
13639
+ */
13640
+ cpuMainPercent: number().nullable(),
13641
+ /**
13642
+ * Instantaneous CPU% of V8's `V8Worker` platform pool over the same window.
13643
+ *
13644
+ * This is the number that rewrote the 2026-08-27 diagnosis — hub-main 73%,
13645
+ * `stream-broker` 61% (`docs/architecture/load-ledger.md`). A CPU chart that
13646
+ * does not separate it from `cpuMainPercent` shows "busy" where the truth is
13647
+ * "allocating too much".
13648
+ *
13649
+ * Concurrent GC is the dominant tenant of that pool but not the only one
13650
+ * (background compilation runs there too), so it is reported as
13651
+ * "GC / V8 helpers" rather than as pure collection time. `null` has the same
13652
+ * meaning as on `cpuMainPercent`.
13653
+ */
13654
+ cpuGcPercent: number().nullable(),
13655
+ /** Threads seen in the tick scan. `null` under the same conditions. */
13656
+ threadCount: number().nullable(),
13543
13657
  /** Wall-clock uptime (seconds). Parsed from `ps etime`. */
13544
- uptimeSec: number(),
13545
- /** True when ancestor walk reaches `ppid=1` (reparented to init/launchd). */
13546
- orphaned: boolean()
13547
- });
13548
- var KillProcessInputSchema = object({
13549
- pid: number(),
13550
- /** Force = SIGKILL. Default is SIGTERM. */
13551
- force: boolean().optional()
13552
- });
13553
- var KillProcessResultSchema = object({
13554
- success: boolean(),
13555
- reason: string().optional(),
13556
- signal: _enum(["SIGTERM", "SIGKILL"]).optional()
13658
+ uptimeSec: number()
13557
13659
  });
13558
13660
  var DumpHeapSnapshotInputSchema = object({
13559
13661
  /** The addon whose runner should dump a heap snapshot. */
@@ -13566,6 +13668,104 @@ var DumpHeapSnapshotResultSchema = object({
13566
13668
  pid: number().optional(),
13567
13669
  reason: string().optional()
13568
13670
  });
13671
+ /**
13672
+ * One point of one function's series.
13673
+ *
13674
+ * The unsuffixed fields are the bucket's **MAXIMUM**, and that choice is the
13675
+ * point of the whole surface. The two obvious reductions both lie: a mean per
13676
+ * bucket smears a spike away, and taking every Nth sample skips it outright.
13677
+ * Either would give us a tool built to find peaks that does not show peaks.
13678
+ * `...Min` carries the other end, `samples` says how many raw snapshots folded
13679
+ * into the bucket, and a mean stays derivable where it is wanted.
13680
+ *
13681
+ * An UNREDUCED point is a one-sample bucket: `samples === 1` and each `...Min`
13682
+ * equals its unsuffixed twin. Reduced and unreduced are the same shape, so a
13683
+ * caller cannot tell which it received — which is what "one reader" means.
13684
+ */
13685
+ var LoadPointSchema = object({
13686
+ /** Bucket START, or the snapshot's own timestamp when unreduced. */
13687
+ atMs: number(),
13688
+ /** Raw snapshots in this bucket. Never 0 — AN EMPTY BUCKET IS ABSENT. */
13689
+ samples: number().int(),
13690
+ /**
13691
+ * `null` = UNKNOWN and it PROPAGATES: a bucket is null unless every process
13692
+ * of every snapshot in it reported a thread split. A partial sum is a
13693
+ * smaller number that looks exactly as real as a complete one.
13694
+ */
13695
+ cpuMainPercent: number().nullable(),
13696
+ cpuMainPercentMin: number().nullable(),
13697
+ cpuGcPercent: number().nullable(),
13698
+ cpuGcPercentMin: number().nullable(),
13699
+ /** Lifetime-average CPU%, summed. Always known — and never a rate. */
13700
+ cpuLifetimePercent: number(),
13701
+ cpuLifetimePercentMin: number(),
13702
+ memoryRssBytes: number(),
13703
+ memoryRssBytesMin: number(),
13704
+ processCount: number().int(),
13705
+ processCountMin: number().int()
13706
+ });
13707
+ /** One function's series. `key` is an addonId, `__root__` or `__unattributed__`. */
13708
+ var LoadFunctionSeriesSchema = object({
13709
+ key: string(),
13710
+ kind: _enum([
13711
+ "addon",
13712
+ "root",
13713
+ "unattributed"
13714
+ ]),
13715
+ /** Oldest-first. A missing interval is MISSING — never zero-filled. */
13716
+ points: array(LoadPointSchema).readonly()
13717
+ });
13718
+ var NodeLoadSeriesSchema = object({
13719
+ nodeId: string(),
13720
+ /** One entry per function seen in the window, heaviest-first. */
13721
+ series: array(LoadFunctionSeriesSchema).readonly(),
13722
+ /**
13723
+ * Width of one returned bucket, in ms. Equals the sampling cadence when no
13724
+ * reduction was needed — so a caller can always say what one point covers
13725
+ * without having to know whether it was reduced.
13726
+ */
13727
+ bucketMs: number(),
13728
+ /** Raw snapshots that went into this answer, across both tiers. */
13729
+ retainedSamples: number(),
13730
+ /** Oldest snapshot represented, or `null` when nothing is retained. */
13731
+ oldestAtMs: number().nullable(),
13732
+ /** The fixed sampling cadence in force on the cluster, in ms. */
13733
+ cadenceMs: number(),
13734
+ /**
13735
+ * Did the DURABLE tier contribute? `false` means the answer is the hot ring
13736
+ * alone — an agent (which holds no table), or a store that refused.
13737
+ * Reported because "the last hour" and "the last six hours" are different
13738
+ * questions and an operator must not have to guess which was answered.
13739
+ */
13740
+ durable: boolean()
13741
+ });
13742
+ var GetLoadSeriesInputSchema = object({
13743
+ /**
13744
+ * The node whose series is wanted.
13745
+ *
13746
+ * NOT named `nodeId`: the generated cap router strips a top-level
13747
+ * `nodeId` from every method input and uses it to ROUTE the call to
13748
+ * that node's provider (`generated-cap-routers.ts`). A series target
13749
+ * called `nodeId` would silently become a routing pin and never reach
13750
+ * the provider. The hub holds every node it hears from, so the
13751
+ * ordinary call is unpinned — answered by the hub, for any node.
13752
+ */
13753
+ forNodeId: string(),
13754
+ /**
13755
+ * EXCLUSIVE lower bound. A caller passes the newest `atMs` it already
13756
+ * holds and receives only what it is missing, so seeding a live chart
13757
+ * from this method cannot double a point already drawn.
13758
+ */
13759
+ sinceMs: number().optional(),
13760
+ /**
13761
+ * Most points the caller wants PER FUNCTION. The window is reduced to fit,
13762
+ * preserving min and max per bucket.
13763
+ *
13764
+ * Absent means NO reduction — legitimate for a short window and a trap for a
13765
+ * long one, which is why a chart passes its own pixel width.
13766
+ */
13767
+ maxPoints: number().int().positive().optional()
13768
+ });
13569
13769
  var SystemMetricsSchema = object({
13570
13770
  cpuPercent: number(),
13571
13771
  memoryPercent: number(),
@@ -13576,10 +13776,7 @@ var SystemMetricsSchema = object({
13576
13776
  gpuPercent: number().optional(),
13577
13777
  gpuMemoryPercent: number().optional()
13578
13778
  });
13579
- method(_void(), SystemResourceSnapshotSchema), method(_void(), SystemResourceSnapshotSchema.nullable()), method(_void(), SystemMetricsSchema), method(object({ dirPath: string() }), DiskSpaceInfoSchema), method(_void(), MetricsGpuInfoSchema.nullable()), method(_void(), number().nullable()), method(object({ pids: array(number()) }), array(PidResourceStatsSchema)), method(_void(), array(AddonInstanceSchema).readonly()), method(object({ addonId: string() }), PidResourceStatsSchema.nullable()), method(_void(), array(NodeProcessSchema).readonly()), method(KillProcessInputSchema, KillProcessResultSchema, {
13580
- kind: "mutation",
13581
- auth: "admin"
13582
- }), method(DumpHeapSnapshotInputSchema, DumpHeapSnapshotResultSchema, {
13779
+ method(_void(), SystemResourceSnapshotSchema), method(_void(), SystemResourceSnapshotSchema.nullable()), method(_void(), SystemMetricsSchema), method(object({ dirPath: string() }), DiskSpaceInfoSchema), method(_void(), MetricsGpuInfoSchema.nullable()), method(_void(), number().nullable()), method(object({ pids: array(number()) }), array(PidResourceStatsSchema)), method(_void(), array(AddonInstanceSchema).readonly()), method(object({ addonId: string() }), PidResourceStatsSchema.nullable()), method(_void(), array(NodeProcessSchema).readonly()), method(GetLoadSeriesInputSchema, NodeLoadSeriesSchema), method(DumpHeapSnapshotInputSchema, DumpHeapSnapshotResultSchema, {
13583
13780
  kind: "mutation",
13584
13781
  auth: "admin"
13585
13782
  });
@@ -26898,6 +27095,15 @@ var LoggingSettingsPatchSchema = object({
26898
27095
  * authority over the whole hierarchy and answers for every layer, so the
26899
27096
  * layer selector needs a name the transport does not already own.
26900
27097
  */
27098
+ /**
27099
+ * One contribution, plus WHO reported it.
27100
+ *
27101
+ * The addon and node are added by the hub as it enumerates providers, never by
27102
+ * the contributor: an addon reporting its own identity could report somebody
27103
+ * else's, and the whole point of this surface is that no claim is made by
27104
+ * anyone but its owner.
27105
+ */
27106
+ var ReportedLoadContributionSchema = LoadContributionSchema.extend({ addonId: string() });
26901
27107
  var GetLoggingSettingsInputSchema = object({
26902
27108
  scopeNodeId: string().optional(),
26903
27109
  /**
@@ -26956,7 +27162,7 @@ method(_void(), FeatureManifestSchema), method(_void(), HealthStatusSchema), met
26956
27162
  }), method(_void(), SiteLocationStatusSchema, {
26957
27163
  kind: "mutation",
26958
27164
  auth: "admin"
26959
- }), method(_void(), RequestCensusStatusSchema, { auth: "admin" }), method(GetLoggingSettingsInputSchema, LoggingSettingsStateSchema, { auth: "admin" }), method(SetLoggingSettingsInputSchema, LoggingSettingsStateSchema, {
27165
+ }), method(_void(), RequestCensusStatusSchema, { auth: "admin" }), method(_void(), array(ReportedLoadContributionSchema).readonly(), { auth: "admin" }), method(GetLoggingSettingsInputSchema, LoggingSettingsStateSchema, { auth: "admin" }), method(SetLoggingSettingsInputSchema, LoggingSettingsStateSchema, {
26960
27166
  kind: "mutation",
26961
27167
  auth: "admin"
26962
27168
  });
@@ -28572,6 +28778,12 @@ Object.freeze({
28572
28778
  addonId: null,
28573
28779
  access: "create"
28574
28780
  },
28781
+ "dataStoreProvider.insertMany": {
28782
+ capName: "data-store-provider",
28783
+ capScope: "system",
28784
+ addonId: null,
28785
+ access: "create"
28786
+ },
28575
28787
  "dataStoreProvider.isEmpty": {
28576
28788
  capName: "data-store-provider",
28577
28789
  capScope: "system",
@@ -29886,6 +30098,12 @@ Object.freeze({
29886
30098
  addonId: null,
29887
30099
  access: "create"
29888
30100
  },
30101
+ "loadContribution.list": {
30102
+ capName: "load-contribution",
30103
+ capScope: "system",
30104
+ addonId: null,
30105
+ access: "view"
30106
+ },
29889
30107
  "localNetwork.downloadCa": {
29890
30108
  capName: "local-network",
29891
30109
  capScope: "system",
@@ -30186,17 +30404,17 @@ Object.freeze({
30186
30404
  addonId: null,
30187
30405
  access: "view"
30188
30406
  },
30189
- "metricsProvider.getProcessStats": {
30407
+ "metricsProvider.getLoadSeries": {
30190
30408
  capName: "metrics-provider",
30191
30409
  capScope: "system",
30192
30410
  addonId: null,
30193
30411
  access: "view"
30194
30412
  },
30195
- "metricsProvider.killProcess": {
30413
+ "metricsProvider.getProcessStats": {
30196
30414
  capName: "metrics-provider",
30197
30415
  capScope: "system",
30198
30416
  addonId: null,
30199
- access: "create"
30417
+ access: "view"
30200
30418
  },
30201
30419
  "metricsProvider.listAddonInstances": {
30202
30420
  capName: "metrics-provider",
@@ -32208,6 +32426,12 @@ Object.freeze({
32208
32426
  addonId: null,
32209
32427
  access: "create"
32210
32428
  },
32429
+ "settingsStore.insertMany": {
32430
+ capName: "settings-store",
32431
+ capScope: "system",
32432
+ addonId: null,
32433
+ access: "create"
32434
+ },
32211
32435
  "settingsStore.isEmpty": {
32212
32436
  capName: "settings-store",
32213
32437
  capScope: "system",
@@ -32820,6 +33044,12 @@ Object.freeze({
32820
33044
  addonId: null,
32821
33045
  access: "create"
32822
33046
  },
33047
+ "system.getLoadContributions": {
33048
+ capName: "system",
33049
+ capScope: "system",
33050
+ addonId: null,
33051
+ access: "view"
33052
+ },
32823
33053
  "system.getLoggingSettings": {
32824
33054
  capName: "system",
32825
33055
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.41",
3
+ "version": "1.2.42",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",