camstack 1.2.191 → 1.2.193

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -37,7 +37,7 @@ async function runServe(args) {
37
37
  ...typeof values.data === "string" ? { data: values.data } : {}
38
38
  };
39
39
  Object.assign(process.env, buildServeEnv(opts));
40
- await import("./launcher-AZI5I6X5.js");
40
+ await import("./launcher-MJFET7GO.js");
41
41
  }
42
42
 
43
43
  // src/commands/agent.ts
@@ -82,7 +82,7 @@ async function runAgent(args) {
82
82
  ...typeof values.port === "string" ? { port: values.port } : {}
83
83
  };
84
84
  Object.assign(process.env, buildAgentEnv(opts));
85
- await import("./launcher-AZI5I6X5.js");
85
+ await import("./launcher-MJFET7GO.js");
86
86
  }
87
87
 
88
88
  // src/commands/setup.ts
@@ -14773,7 +14773,7 @@ function date4(params) {
14773
14773
  // ../../node_modules/zod/v4/classic/external.js
14774
14774
  config(en_default());
14775
14775
 
14776
- // ../types/dist/sleep-BxjU_fJM.mjs
14776
+ // ../types/dist/sleep-BSuCCFjf.mjs
14777
14777
  var AUDIO_CHUNK_FORMATS = [
14778
14778
  "f32le",
14779
14779
  "pcmu",
@@ -18584,10 +18584,12 @@ var AddonRoutesScopeSchema = external_exports.object({
18584
18584
  type: external_exports.literal("addon-routes"),
18585
18585
  access: external_exports.array(MethodAccessSchema).min(1)
18586
18586
  });
18587
+ var PreferencesSelfScopeSchema = external_exports.object({ type: external_exports.literal("preferences-self") });
18587
18588
  var CredentialScopeSchema = external_exports.union([
18588
18589
  external_exports.literal("*"),
18589
18590
  ShareViewScopeSchema,
18590
18591
  AddonRoutesScopeSchema,
18592
+ PreferencesSelfScopeSchema,
18591
18593
  TokenScopeSchema
18592
18594
  ]);
18593
18595
  var CREDENTIAL_TOKEN_KIND = "credential";
@@ -18597,6 +18599,58 @@ var CredentialTokenClaimsSchema = external_exports.object({
18597
18599
  jti: external_exports.string().min(16),
18598
18600
  scopes: external_exports.array(CredentialScopeSchema).min(1)
18599
18601
  });
18602
+ var PREFERENCES_NAMESPACE_PATTERN = /^[a-z][a-z0-9.-]{0,63}$/;
18603
+ var PREFERENCES_MAX_VALUE_BYTES = 256 * 1024;
18604
+ var PreferenceNamespaceSchema = external_exports.string().regex(PREFERENCES_NAMESPACE_PATTERN);
18605
+ var PreferenceValueSchema = external_exports.record(external_exports.string(), external_exports.unknown());
18606
+ var PreferenceDeviceIdSchema = external_exports.string().min(1).max(64);
18607
+ var PreferenceRowSchema = external_exports.object({
18608
+ namespace: PreferenceNamespaceSchema,
18609
+ value: PreferenceValueSchema,
18610
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
18611
+ revision: external_exports.number().int().positive(),
18612
+ updatedAt: external_exports.number().int(),
18613
+ /** The client id the last writer sent; `null` when it sent none. */
18614
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
18615
+ });
18616
+ var PreferencesGetInputSchema = external_exports.object({
18617
+ /** Absent: every namespace the caller holds. */
18618
+ namespaces: external_exports.array(PreferenceNamespaceSchema).max(32).optional()
18619
+ });
18620
+ var PreferencesGetOutputSchema = external_exports.object({ rows: external_exports.array(PreferenceRowSchema) });
18621
+ var PreferencesPutInputSchema = external_exports.object({
18622
+ namespace: PreferenceNamespaceSchema,
18623
+ value: PreferenceValueSchema,
18624
+ /**
18625
+ * The revision the edit was based on. Absent: last write wins. `0`: the
18626
+ * namespace must not exist yet. Any other value that is not the current
18627
+ * revision answers `conflict` and writes nothing.
18628
+ */
18629
+ baseRevision: external_exports.number().int().nonnegative().optional(),
18630
+ deviceId: PreferenceDeviceIdSchema.optional()
18631
+ });
18632
+ var PreferencesPutOutputSchema = external_exports.discriminatedUnion("status", [external_exports.object({
18633
+ status: external_exports.literal("saved"),
18634
+ row: PreferenceRowSchema
18635
+ }), external_exports.object({
18636
+ status: external_exports.literal("conflict"),
18637
+ current: PreferenceRowSchema.nullable()
18638
+ })]);
18639
+ var PreferencesDeleteInputSchema = external_exports.object({ namespace: PreferenceNamespaceSchema });
18640
+ var PreferencesDeleteOutputSchema = external_exports.object({
18641
+ /** `false` when the namespace did not exist. */
18642
+ deleted: external_exports.boolean()
18643
+ });
18644
+ var PreferencesChangedSinceInputSchema = external_exports.object({
18645
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
18646
+ revisionByNamespace: external_exports.record(PreferenceNamespaceSchema, external_exports.number().int().nonnegative()).refine((map2) => Object.keys(map2).length <= 32, { message: `at most 32 namespaces` })
18647
+ });
18648
+ var PreferencesChangedSinceOutputSchema = external_exports.object({
18649
+ /** Every row whose revision differs from the client's, and every row it did not list. */
18650
+ rows: external_exports.array(PreferenceRowSchema),
18651
+ /** Namespaces the client listed that no longer exist. */
18652
+ deleted: external_exports.array(PreferenceNamespaceSchema)
18653
+ });
18600
18654
  var AppFlowPurposeSchema = external_exports.enum(["new-session", "step-up"]);
18601
18655
  var AppPageLangSchema = external_exports.enum(["en", "it"]);
18602
18656
  var APP_FLOW_REFUSAL_MESSAGES = {
@@ -23308,6 +23362,12 @@ var DeviceHistorySubjectSchema = external_exports.discriminatedUnion("kind", [ex
23308
23362
  nodeId: external_exports.string().min(1)
23309
23363
  })]);
23310
23364
  var DeviceHistoryKindSchema = external_exports.enum([
23365
+ "gauge",
23366
+ "counter",
23367
+ "boolean",
23368
+ "enum"
23369
+ ]);
23370
+ var DeviceHistoryProducerKindSchema = external_exports.enum([
23311
23371
  "gauge",
23312
23372
  "counter",
23313
23373
  "boolean"
@@ -23343,7 +23403,13 @@ var SeriesInfoSchema = external_exports.object({
23343
23403
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
23344
23404
  unit: external_exports.string().nullable(),
23345
23405
  displayName: external_exports.string(),
23346
- source: external_exports.enum(["cap", "addon"]),
23406
+ source: external_exports.enum([
23407
+ "cap",
23408
+ "addon",
23409
+ "derived"
23410
+ ]),
23411
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
23412
+ values: external_exports.array(external_exports.string()).readonly().nullable(),
23347
23413
  firstTs: external_exports.number(),
23348
23414
  lastTs: external_exports.number()
23349
23415
  });
@@ -23357,17 +23423,31 @@ var QueryPointSchema = external_exports.object({
23357
23423
  twMean: external_exports.number().nullable(),
23358
23424
  min: external_exports.number(),
23359
23425
  max: external_exports.number(),
23360
- /** `null` is unknown, never zero (D393). */
23361
- last: external_exports.number().nullable()
23426
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
23427
+ last: external_exports.number().nullable(),
23428
+ /**
23429
+ * The increase over the point: a `counter`'s growth since the previous point
23430
+ * or bucket (a drop is a reset, counted from zero), and for
23431
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
23432
+ * every other kind, and when it cannot be known.
23433
+ */
23434
+ delta: external_exports.number().nullable(),
23435
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
23436
+ state: external_exports.string().nullable(),
23437
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
23438
+ states: external_exports.record(external_exports.string(), external_exports.number()).nullable()
23362
23439
  });
23363
23440
  var QuerySeriesSchema = external_exports.object({
23364
23441
  scope: external_exports.string(),
23365
23442
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
23366
23443
  before: external_exports.object({
23367
23444
  t: external_exports.number(),
23368
- value: external_exports.number().nullable()
23445
+ value: external_exports.number().nullable(),
23446
+ state: external_exports.string().nullable()
23369
23447
  }).nullable(),
23370
- points: external_exports.array(QueryPointSchema).readonly()
23448
+ points: external_exports.array(QueryPointSchema).readonly(),
23449
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
23450
+ derivedFrom: external_exports.string().nullable()
23371
23451
  });
23372
23452
  var QueryWindowShape = {
23373
23453
  key: external_exports.string(),
@@ -23382,6 +23462,22 @@ var QueryResultSchema = external_exports.object({
23382
23462
  series: external_exports.array(QuerySeriesSchema).readonly(),
23383
23463
  truncated: external_exports.boolean()
23384
23464
  });
23465
+ var QueryManyItemSchema = external_exports.union([external_exports.object({
23466
+ deviceId: external_exports.number().int(),
23467
+ key: external_exports.string(),
23468
+ scope: external_exports.string().optional()
23469
+ }), external_exports.object({
23470
+ forNodeId: external_exports.string().min(1),
23471
+ key: external_exports.string(),
23472
+ scope: external_exports.string().optional()
23473
+ })]);
23474
+ var QueryManyEntrySchema = external_exports.discriminatedUnion("ok", [external_exports.object({
23475
+ ok: external_exports.literal(true),
23476
+ result: QueryResultSchema
23477
+ }), external_exports.object({
23478
+ ok: external_exports.literal(false),
23479
+ error: external_exports.string()
23480
+ })]);
23385
23481
  var TierStatusSchema = external_exports.object({
23386
23482
  tier: DeviceHistoryResolutionSchema,
23387
23483
  /** `null` until the first background count answered. */
@@ -23449,26 +23545,45 @@ var deviceHistoryCapability = {
23449
23545
  * `listNodeSeries` / `queryNode`.
23450
23546
  */
23451
23547
  listSeries: method(external_exports.object({ deviceId: external_exports.number().int() }), external_exports.array(SeriesInfoSchema).readonly()),
23452
- listNodeSeries: method(external_exports.object({ nodeId: external_exports.string().min(1) }), external_exports.array(SeriesInfoSchema).readonly(), { auth: "admin" }),
23548
+ /**
23549
+ * A NODE's series. The subject is `forNodeId`, never `nodeId`: a top-level
23550
+ * `nodeId` is the cap ROUTING key, and `nodeId: 'little-unraid'` sent the
23551
+ * read to that agent, which hosts no device-history.
23552
+ */
23553
+ listNodeSeries: method(external_exports.object({ forNodeId: external_exports.string().min(1) }), external_exports.array(SeriesInfoSchema).readonly(), { auth: "admin" }),
23453
23554
  /**
23454
23555
  * One series (or every scope of it) at one resolution. `auto` picks the
23455
23556
  * finest tier whose retention covers `from` and whose point count fits
23456
23557
  * `maxPoints`; when even the coarsest tier does not fit, the newest
23457
- * `maxPoints` points are returned and `truncated` is true.
23558
+ * `maxPoints` points are returned and `truncated` is true. A series fed by
23559
+ * closed buckets has no raw rows, so `auto` never answers it from raw; nor
23560
+ * {@link DEVICE_HISTORY_ENERGY_KEY}, which is computed from rollups.
23458
23561
  */
23459
23562
  query: method(external_exports.object({
23460
23563
  deviceId: external_exports.number().int(),
23461
23564
  ...QueryWindowShape
23462
23565
  }), QueryResultSchema),
23463
23566
  queryNode: method(external_exports.object({
23464
- nodeId: external_exports.string().min(1),
23567
+ forNodeId: external_exports.string().min(1),
23465
23568
  ...QueryWindowShape
23466
23569
  }), QueryResultSchema, { auth: "admin" }),
23570
+ /**
23571
+ * Several reads over ONE window, answered in order (one entry per item).
23572
+ * Admin-only: its subjects are nested in `items`, where the device scope
23573
+ * gate cannot see them — a principal limited to one device uses `query`.
23574
+ */
23575
+ queryMany: method(external_exports.object({
23576
+ items: external_exports.array(QueryManyItemSchema).min(1).max(24),
23577
+ from: QueryWindowShape.from,
23578
+ to: QueryWindowShape.to,
23579
+ resolution: QueryWindowShape.resolution,
23580
+ maxPoints: QueryWindowShape.maxPoints
23581
+ }), external_exports.object({ results: external_exports.array(QueryManyEntrySchema).readonly() }), { auth: "admin" }),
23467
23582
  /** Producer: declare (idempotent) a series key this addon owns: `addon:<callerAddonId>/<name>`. */
23468
23583
  declareSeries: method(external_exports.object({
23469
23584
  name: external_exports.string().regex(/^[a-z0-9-]+$/),
23470
23585
  subjectKind: external_exports.enum(["device", "node"]),
23471
- kind: DeviceHistoryKindSchema,
23586
+ kind: DeviceHistoryProducerKindSchema,
23472
23587
  unit: external_exports.string().optional(),
23473
23588
  displayName: external_exports.string().min(1),
23474
23589
  ingest: external_exports.enum(["points", "buckets"])
@@ -46576,27 +46691,30 @@ var llmRuntimeCapability = {
46576
46691
  })
46577
46692
  }
46578
46693
  };
46579
- var LlmProfileKindSchema = external_exports.enum([
46580
- "openai-compatible",
46581
- "openai",
46582
- "anthropic",
46583
- "google",
46584
- "managed-local",
46585
- "apple-foundation"
46586
- ]);
46694
+ var LLM_PROFILE_KIND_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/;
46695
+ var LlmProfileKindSchema = external_exports.string().regex(LLM_PROFILE_KIND_PATTERN, "a kind id is lower-case letters, digits and dashes");
46696
+ var LlmModelFeaturesSchema = external_exports.object({
46697
+ vision: external_exports.boolean(),
46698
+ tools: external_exports.boolean(),
46699
+ streaming: external_exports.boolean()
46700
+ });
46701
+ var LlmModelInfoSchema = external_exports.object({
46702
+ id: external_exports.string(),
46703
+ label: external_exports.string().optional(),
46704
+ contextLength: external_exports.number().int().positive().optional(),
46705
+ features: LlmModelFeaturesSchema.partial().optional()
46706
+ });
46707
+ var LlmProviderConfigSchema = external_exports.record(external_exports.string(), external_exports.unknown());
46587
46708
  var LlmProfileSchema = external_exports.object({
46588
46709
  id: external_exports.string(),
46589
46710
  name: external_exports.string(),
46711
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
46590
46712
  kind: LlmProfileKindSchema,
46591
46713
  /** Stamped by the provider — keeps the fanned catalog routable. */
46592
46714
  addonId: external_exports.string(),
46593
46715
  enabled: external_exports.boolean(),
46594
46716
  /** Vendor model id, or the managed runtime's loaded model. */
46595
46717
  model: external_exports.string(),
46596
- /** Required for openai-compatible; override for cloud kinds. */
46597
- baseUrl: external_exports.string().optional(),
46598
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
46599
- apiKey: external_exports.string().optional(),
46600
46718
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
46601
46719
  * degraded to text — that shipped once and produced a confident answer to a
46602
46720
  * question about a picture nobody sent. */
@@ -46604,15 +46722,11 @@ var LlmProfileSchema = external_exports.object({
46604
46722
  temperature: external_exports.number().min(0).max(2).optional(),
46605
46723
  /** Nucleus sampling. Every wire we speak has it. */
46606
46724
  topP: external_exports.number().min(0).max(1).optional(),
46607
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
46608
- * wire does, and the client drops it there (measured: the request body gets
46609
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
46610
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
46725
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
46726
+ * field in its editor only when its descriptor lists it in `profileFields`. */
46611
46727
  topK: external_exports.number().int().positive().optional(),
46612
46728
  maxTokens: external_exports.number().int().positive().optional(),
46613
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
46614
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
46615
- * the model with, so it is the one field that changes a PROCESS. */
46729
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
46616
46730
  contextLength: external_exports.number().int().positive().optional(),
46617
46731
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
46618
46732
  * two system prompts fighting is worse than either alone). */
@@ -46638,26 +46752,76 @@ var LlmProfileSchema = external_exports.object({
46638
46752
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
46639
46753
  * `true` here buys the wiring, not behaviour, until tools are registered. */
46640
46754
  toolsEnabled: external_exports.boolean().default(false),
46641
- extraHeaders: external_exports.record(external_exports.string(), external_exports.string()).optional(),
46642
- /** kind === 'managed-local' only (spec §4). */
46643
- runtime: ManagedRuntimeConfigSchema.optional(),
46644
- /**
46645
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
46646
- * to configure (no key, no URL, no download; `model` is `apple-system`).
46647
- * `supportsVision` on such a row is stamped by the provider from the node's
46648
- * reported `imageInput`, never taken from the operator (D62).
46649
- */
46650
- appleFoundation: external_exports.object({ nodeId: external_exports.string() }).optional()
46755
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
46756
+ providerConfig: LlmProviderConfigSchema.default({})
46757
+ });
46758
+ var LlmProfileFieldSchema = external_exports.enum([
46759
+ "temperature",
46760
+ "topP",
46761
+ "topK",
46762
+ "maxTokens",
46763
+ "contextLength",
46764
+ "systemPrompt",
46765
+ "timeoutMs",
46766
+ "connectTimeoutMs",
46767
+ "firstTokenTimeoutMs",
46768
+ "idleTimeoutMs",
46769
+ "retry",
46770
+ "toolsEnabled"
46771
+ ]);
46772
+ var LlmProviderWidgetSchema = external_exports.object({
46773
+ id: external_exports.string(),
46774
+ placement: external_exports.enum(["connection", "model"]),
46775
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
46776
+ requires: external_exports.array(external_exports.string()).optional()
46651
46777
  });
46652
46778
  var ConfigSchemaPassthrough$3 = external_exports.unknown();
46653
46779
  var LlmProfileKindDescriptorSchema = external_exports.object({
46654
46780
  kind: LlmProfileKindSchema,
46655
46781
  label: external_exports.string(),
46782
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
46656
46783
  icon: external_exports.string(),
46657
46784
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
46658
46785
  addonId: external_exports.string(),
46659
- configSchema: ConfigSchemaPassthrough$3
46786
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
46787
+ connectionSchema: ConfigSchemaPassthrough$3,
46788
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
46789
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
46790
+ /** The kind's defaults; a model from `listModels` may override any of them. */
46791
+ features: LlmModelFeaturesSchema,
46792
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
46793
+ visionEditable: external_exports.boolean(),
46794
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
46795
+ modelCatalog: external_exports.enum([
46796
+ "fetch",
46797
+ "static",
46798
+ "none"
46799
+ ]),
46800
+ staticModels: external_exports.array(LlmModelInfoSchema).optional(),
46801
+ /** The common fields that mean something on this kind's wire. */
46802
+ profileFields: external_exports.array(LlmProfileFieldSchema),
46803
+ providerWidgets: external_exports.array(LlmProviderWidgetSchema).optional()
46660
46804
  });
46805
+ var LlmListModelsInputSchema = external_exports.object({
46806
+ addonId: external_exports.string(),
46807
+ kind: LlmProfileKindSchema,
46808
+ profileId: external_exports.string().optional(),
46809
+ connection: LlmProviderConfigSchema.optional()
46810
+ });
46811
+ var LlmListModelsErrorCodeSchema = external_exports.enum([
46812
+ "auth",
46813
+ "network",
46814
+ "unsupported",
46815
+ "invalid"
46816
+ ]);
46817
+ var LlmListModelsResultSchema = external_exports.discriminatedUnion("ok", [external_exports.object({
46818
+ ok: external_exports.literal(true),
46819
+ models: external_exports.array(LlmModelInfoSchema)
46820
+ }), external_exports.object({
46821
+ ok: external_exports.literal(false),
46822
+ code: LlmListModelsErrorCodeSchema,
46823
+ message: external_exports.string()
46824
+ })]);
46661
46825
  var LlmDefaultSelectorSchema = external_exports.union([external_exports.object({ consumer: external_exports.string() }), external_exports.object({ purpose: external_exports.enum(["text", "vision"]) })]);
46662
46826
  var LlmDefaultSchema = external_exports.object({
46663
46827
  selector: LlmDefaultSelectorSchema,
@@ -46777,8 +46941,17 @@ var llmCapability = {
46777
46941
  auth: "admin",
46778
46942
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
46779
46943
  }),
46780
- /** Live vendor enumeration (GET /models etc.). */
46781
- listModels: method(ProfileRefInputSchema, external_exports.array(external_exports.string())),
46944
+ /**
46945
+ * The models a kind offers, for a SAVED profile or an unsaved draft
46946
+ * (`connection`). A mutation, not a query: a draft may carry a key, and a
46947
+ * query's input travels in the URL. Admin: it dials whatever endpoint the
46948
+ * draft names and may resolve a stored key to do it. The answer never
46949
+ * carries a secret — failures are a typed result, never a throw.
46950
+ */
46951
+ listModels: method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
46952
+ kind: "mutation",
46953
+ auth: "admin"
46954
+ }),
46782
46955
  getDefaults: method(external_exports.object({}), external_exports.array(LlmDefaultSchema)),
46783
46956
  setDefault: method(external_exports.object({
46784
46957
  selector: LlmDefaultSelectorSchema,
@@ -46965,6 +47138,88 @@ var LogEntrySchema = external_exports.object({
46965
47138
  meta: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
46966
47139
  tags: external_exports.record(external_exports.string(), external_exports.string()).optional()
46967
47140
  });
47141
+ var LogReadQuerySchema = external_exports.object({
47142
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
47143
+ requestId: external_exports.string().min(1).max(64).optional(),
47144
+ /** The device the line is about (`tags.deviceId`, numeric). */
47145
+ deviceId: external_exports.number().int().optional(),
47146
+ /**
47147
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
47148
+ * match. Not `addonId`: a cap router reads that name as "which provider".
47149
+ */
47150
+ fromAddonId: external_exports.string().min(1).max(200).optional(),
47151
+ /**
47152
+ * The emitting node: matches the agent that emitted the line, the node
47153
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
47154
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
47155
+ * name as "which node's provider".
47156
+ */
47157
+ fromNodeId: external_exports.string().min(1).max(200).optional(),
47158
+ /** Any other tag, exact match (AND). */
47159
+ tags: external_exports.record(external_exports.string(), external_exports.union([external_exports.string(), external_exports.number()])).optional(),
47160
+ /** Severity FLOOR: this level and above. */
47161
+ level: LogLevelSchema.optional(),
47162
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
47163
+ text: external_exports.string().min(1).max(200).optional(),
47164
+ /** Epoch ms, inclusive. */
47165
+ since: external_exports.number().optional(),
47166
+ /** Epoch ms, inclusive. */
47167
+ until: external_exports.number().optional(),
47168
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
47169
+ before: external_exports.string().min(1).max(1024).optional(),
47170
+ /** Newer than this cursor (exclusive). */
47171
+ after: external_exports.string().min(1).max(1024).optional(),
47172
+ limit: external_exports.number().int().min(1).max(1e3).optional(),
47173
+ /** Wall-clock bound of this slice. The provider caps it. */
47174
+ budgetMs: external_exports.number().int().min(50).max(1e4).optional()
47175
+ });
47176
+ var LogReadEntrySchema = external_exports.object({
47177
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
47178
+ id: external_exports.string().optional(),
47179
+ /** Epoch ms. */
47180
+ timestamp: external_exports.number(),
47181
+ level: LogLevelSchema,
47182
+ scope: external_exports.string().optional(),
47183
+ message: external_exports.string(),
47184
+ tags: external_exports.record(external_exports.string(), external_exports.union([external_exports.string(), external_exports.number()])).optional(),
47185
+ meta: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
47186
+ });
47187
+ var LogReadResultSchema = external_exports.object({
47188
+ /** Newest first. */
47189
+ entries: external_exports.array(LogReadEntrySchema),
47190
+ /** Pass as `before` for the next older page; null when nothing older exists. */
47191
+ nextBefore: external_exports.string().nullable(),
47192
+ /** Pass as `after` to read what arrived since; null when unknown. */
47193
+ nextAfter: external_exports.string().nullable(),
47194
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
47195
+ scannedBytes: external_exports.number().int().nonnegative(),
47196
+ /**
47197
+ * True when the scan in this direction reached the end of the store.
47198
+ * False with fewer than `limit` entries means the budget ran out first —
47199
+ * call again with `nextBefore` to go on.
47200
+ */
47201
+ done: external_exports.boolean(),
47202
+ /** True when `cancelRead` ended this slice early. */
47203
+ cancelled: external_exports.boolean().optional()
47204
+ });
47205
+ var LogReadCapabilitiesSchema = external_exports.object({
47206
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
47207
+ readable: external_exports.boolean(),
47208
+ /** Why not, when `readable` is false — rendered next to the source. */
47209
+ reason: external_exports.string().nullable(),
47210
+ /** Filters the provider applies itself. A false one is applied by nobody. */
47211
+ filters: external_exports.object({
47212
+ deviceId: external_exports.boolean(),
47213
+ addonId: external_exports.boolean(),
47214
+ nodeId: external_exports.boolean(),
47215
+ tags: external_exports.boolean(),
47216
+ level: external_exports.boolean(),
47217
+ text: external_exports.boolean(),
47218
+ timeRange: external_exports.boolean()
47219
+ }),
47220
+ /** How far back the store reaches, when the provider knows (days). */
47221
+ retentionDays: external_exports.number().nullable()
47222
+ });
46968
47223
  var logDestinationCapability = {
46969
47224
  name: "log-destination",
46970
47225
  scope: "system",
@@ -46972,14 +47227,13 @@ var logDestinationCapability = {
46972
47227
  internal: true,
46973
47228
  methods: {
46974
47229
  write: method(LogEntrySchema, external_exports.void(), { kind: "mutation" }),
46975
- query: method(external_exports.object({
46976
- scope: external_exports.array(external_exports.string()).optional(),
46977
- level: LogLevelSchema.optional(),
46978
- since: external_exports.date().optional(),
46979
- until: external_exports.date().optional(),
46980
- limit: external_exports.number().optional(),
46981
- tags: external_exports.record(external_exports.string(), external_exports.string()).optional()
46982
- }), external_exports.array(LogEntrySchema).readonly())
47230
+ /** Absent ⇒ the destination cannot read back (same as `readable: false`). */
47231
+ describeRead: optionalMethod(external_exports.void(), LogReadCapabilitiesSchema, { auth: "admin" }),
47232
+ read: optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }),
47233
+ cancelRead: optionalMethod(external_exports.object({ requestId: external_exports.string().min(1).max(64) }), external_exports.object({ cancelled: external_exports.boolean() }), {
47234
+ kind: "mutation",
47235
+ auth: "admin"
47236
+ })
46983
47237
  },
46984
47238
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
46985
47239
  mount: { kind: "skip" }
@@ -48586,9 +48840,11 @@ var alarmPanelCapability = {
48586
48840
  */
48587
48841
  durability: "restored",
48588
48842
  /**
48589
- * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
48843
+ * History (D850): the panel's lifecycle state as an `enum` series —
48844
+ * change-only, no floor, so an `arming -> pending -> triggered` sequence of a
48845
+ * few seconds keeps every step. Who armed it stays in the events ledger.
48590
48846
  */
48591
- history: "none",
48847
+ history: { fields: { state: { kind: "enum" } } },
48592
48848
  /** Clock fields: written, but excluded from the compare that decides
48593
48849
  * whether persisting is worth a SQLite commit. */
48594
48850
  volatileStateFields: ["lastChangedAt"]
@@ -49156,6 +49412,12 @@ var NcRuleTargetSchema = external_exports.object({
49156
49412
  */
49157
49413
  params: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
49158
49414
  });
49415
+ var NcMediaImageSchema = external_exports.enum([
49416
+ "scene-boxes",
49417
+ "crop",
49418
+ "clean",
49419
+ "none"
49420
+ ]);
49159
49421
  var NcMediaFrameSchema = external_exports.enum([
49160
49422
  "cropped",
49161
49423
  "full",
@@ -49163,16 +49425,29 @@ var NcMediaFrameSchema = external_exports.enum([
49163
49425
  ]);
49164
49426
  var NcLinkedCameraModeSchema = external_exports.enum(["mosaic", "each"]);
49165
49427
  var NcMediaPolicySchema = external_exports.object({
49428
+ /**
49429
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
49430
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
49431
+ * triple below, at load and at every write, and the store keeps only this.
49432
+ */
49433
+ image: NcMediaImageSchema.optional(),
49434
+ /**
49435
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
49436
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
49437
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
49438
+ * Replaces `zoneCrop`.
49439
+ */
49440
+ showTriggerZone: external_exports.boolean().optional(),
49441
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
49166
49442
  attach: external_exports.enum([
49167
49443
  "best",
49168
49444
  "best-matching",
49169
49445
  "keyFrame",
49170
49446
  "none"
49171
- ]).default("best"),
49172
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
49447
+ ]).optional(),
49448
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
49173
49449
  frame: NcMediaFrameSchema.optional(),
49174
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
49175
- * "show me the ZONE", not the whole scene or the subject crop. */
49450
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
49176
49451
  zoneCrop: external_exports.boolean().optional(),
49177
49452
  /**
49178
49453
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -49299,7 +49574,9 @@ var NcRuleInputSchema = external_exports.object({
49299
49574
  * targets.
49300
49575
  */
49301
49576
  targetUsers: external_exports.array(external_exports.string()).optional(),
49302
- media: NcMediaPolicySchema.default({ attach: "best" }),
49577
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
49578
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
49579
+ media: NcMediaPolicySchema.default({}),
49303
49580
  throttle: NcThrottleSchema.default({
49304
49581
  cooldownSec: 60,
49305
49582
  scope: "rule-device"
@@ -50056,13 +50333,31 @@ var NcAlarmModeOpeningsSchema = external_exports.object({
50056
50333
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
50057
50334
  unknown: external_exports.array(external_exports.number().int())
50058
50335
  });
50336
+ var NcAlarmInputBypassViewSchema = external_exports.object({
50337
+ ruleId: external_exports.string(),
50338
+ /** The rule's current name (its frozen name when the rule is gone). */
50339
+ ruleName: external_exports.string(),
50340
+ /** The input: the sensor of the match, else its camera. */
50341
+ deviceId: external_exports.number().int(),
50342
+ /** The input's current name. */
50343
+ name: external_exports.string(),
50344
+ /** When it was bypassed (ms epoch). */
50345
+ since: external_exports.number(),
50346
+ /** Triggers from this input dropped since. */
50347
+ dropped: external_exports.number().int().min(0)
50348
+ });
50059
50349
  var NcAlarmLiveSchema = external_exports.object({
50060
50350
  state: AlarmStateSchema,
50061
50351
  /** The mode being armed into (exit delay) or held; null when disarmed. */
50062
50352
  targetMode: AlarmArmModeSchema.nullable(),
50063
50353
  availableModes: external_exports.array(AlarmArmModeSchema),
50064
50354
  openings: external_exports.array(NcAlarmModeOpeningsSchema),
50065
- exclusions: external_exports.array(NcAlarmExclusionViewSchema)
50355
+ exclusions: external_exports.array(NcAlarmExclusionViewSchema),
50356
+ /**
50357
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
50358
+ * Defaulted so an older hub answer still parses (as "none known").
50359
+ */
50360
+ bypassedInputs: external_exports.array(NcAlarmInputBypassViewSchema).default([])
50066
50361
  });
50067
50362
  var NcAlarmConfigSchema = external_exports.object({
50068
50363
  /**
@@ -61710,9 +62005,11 @@ var connectivityCapability = {
61710
62005
  */
61711
62006
  durability: "restored",
61712
62007
  /**
61713
- * History (D850): none — duplicates device-status.online (one authority for availability).
62008
+ * History (D850): `connected` as a boolean series — change-only, no floor. It
62009
+ * is the upstream entity's own link (a HA connectivity sensor), not the
62010
+ * device's reachability, which stays `device-status.online`.
61714
62011
  */
61715
- history: "none",
62012
+ history: { fields: { connected: { kind: "boolean" } } },
61716
62013
  /** Clock fields: written, but excluded from the compare that decides
61717
62014
  * whether persisting is worth a SQLite commit. */
61718
62015
  volatileStateFields: ["lastChangedAt"]
@@ -62409,11 +62706,22 @@ var dishwasherCapability = {
62409
62706
  },
62410
62707
  runtimeState: DishwasherStatusSchema,
62411
62708
  durability: "session",
62412
- history: { fields: { progressPercent: {
62413
- kind: "gauge",
62414
- unit: "%",
62415
- deadband: 2
62416
- } } }
62709
+ history: { fields: {
62710
+ progressPercent: {
62711
+ kind: "gauge",
62712
+ unit: "%",
62713
+ deadband: 2
62714
+ },
62715
+ state: { kind: "enum" },
62716
+ operationState: { kind: "enum" },
62717
+ remainingSeconds: {
62718
+ kind: "gauge",
62719
+ unit: "s",
62720
+ minIntervalMs: 6e4
62721
+ },
62722
+ doorOpen: { kind: "boolean" },
62723
+ powerOn: { kind: "boolean" }
62724
+ } }
62417
62725
  };
62418
62726
  var DoorbellStatusSchema = external_exports.object({
62419
62727
  /** Ms epoch of the last press. null = never observed since this provider started. */
@@ -62506,9 +62814,15 @@ var enumSensorCapability = {
62506
62814
  */
62507
62815
  durability: "restored",
62508
62816
  /**
62509
- * History (D850): none — text/enum state has no history (non-goal).
62817
+ * History (D850): the value as an `enum` series (an appliance's program or
62818
+ * operation state, an HVAC action). The option set is per device, so the
62819
+ * value list is LEARNED as values are first seen (bounded). A sensor with a
62820
+ * `format` carries a timestamp, not a state, and is not recorded.
62510
62821
  */
62511
- history: "none",
62822
+ history: { fields: { value: {
62823
+ kind: "enum",
62824
+ skipWhenSet: "format"
62825
+ } } },
62512
62826
  /** Clock fields: written, but excluded from the compare that decides
62513
62827
  * whether persisting is worth a SQLite commit. */
62514
62828
  volatileStateFields: ["lastFetchedAt"]
@@ -64377,9 +64691,10 @@ var lockControlCapability = {
64377
64691
  */
64378
64692
  durability: "restored",
64379
64693
  /**
64380
- * History (D850): none — enum state; lock events belong in the events ledger.
64694
+ * History (D850): the lock's state as an `enum` series — change-only, no
64695
+ * floor: a jam or an unlock lasting seconds is the edge an operator looks for.
64381
64696
  */
64382
- history: "none",
64697
+ history: { fields: { state: { kind: "enum" } } },
64383
64698
  /** Clock fields: written, but excluded from the compare that decides
64384
64699
  * whether persisting is worth a SQLite commit. */
64385
64700
  volatileStateFields: ["lastChangedAt"]
@@ -64541,9 +64856,18 @@ var mediaPlayerCapability = {
64541
64856
  */
64542
64857
  durability: "session",
64543
64858
  /**
64544
- * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
64859
+ * History (D850): volume (a level an operator or an automation sets; the
64860
+ * default 10 s floor folds a slider drag into its end value) and mute.
64861
+ * `positionMs` is not recorded: it moves continuously while playing.
64545
64862
  */
64546
- history: "none"
64863
+ history: { fields: {
64864
+ volumeLevel: {
64865
+ kind: "gauge",
64866
+ unit: "%",
64867
+ deadband: 1
64868
+ },
64869
+ isMuted: { kind: "boolean" }
64870
+ } }
64547
64871
  };
64548
64872
  var MeshEndpointSchema = external_exports.object({
64549
64873
  /** Stable identifier within the provider (e.g. `mesh-ipv4`, `magicdns`, `funnel`). */
@@ -69342,9 +69666,29 @@ var streamParamsCapability = {
69342
69666
  */
69343
69667
  durability: "restored",
69344
69668
  /**
69345
- * History (D850): none — encoder configuration.
69669
+ * History (D850): the configured bitrate and frame rate of the main and sub
69670
+ * profiles. Configuration, so change-only on the default floor: a point is an
69671
+ * operator's (or a tuner's) edit, which is exactly what a chart of a stream's
69672
+ * quality over time must show.
69346
69673
  */
69347
- history: "none",
69674
+ history: { fields: {
69675
+ "main.bitrate": {
69676
+ kind: "gauge",
69677
+ unit: "kbps"
69678
+ },
69679
+ "main.framerate": {
69680
+ kind: "gauge",
69681
+ unit: "fps"
69682
+ },
69683
+ "sub.bitrate": {
69684
+ kind: "gauge",
69685
+ unit: "kbps"
69686
+ },
69687
+ "sub.framerate": {
69688
+ kind: "gauge",
69689
+ unit: "fps"
69690
+ }
69691
+ } },
69348
69692
  /** Clock fields: written, but excluded from the compare that decides
69349
69693
  * whether persisting is worth a SQLite commit. */
69350
69694
  volatileStateFields: ["lastFetchedAt"]
@@ -70044,26 +70388,6 @@ var ApiKeySummarySchema = external_exports.object({
70044
70388
  createdAt: external_exports.number(),
70045
70389
  lastUsedAt: external_exports.number().optional()
70046
70390
  });
70047
- var ScopedTokenSummarySchema = external_exports.object({
70048
- id: external_exports.string(),
70049
- userId: external_exports.string(),
70050
- name: external_exports.string(),
70051
- tokenPrefix: external_exports.string(),
70052
- scopes: external_exports.array(TokenScopeSchema),
70053
- expiresAt: external_exports.number().nullish(),
70054
- lastUsedAt: external_exports.number().nullish(),
70055
- createdAt: external_exports.number()
70056
- });
70057
- var CreateScopedTokenInputSchema = external_exports.object({
70058
- userId: external_exports.string(),
70059
- name: external_exports.string(),
70060
- scopes: external_exports.array(TokenScopeSchema),
70061
- expiresAt: external_exports.number().optional()
70062
- });
70063
- var CreateScopedTokenResultSchema = external_exports.object({
70064
- token: external_exports.string(),
70065
- record: ScopedTokenSummarySchema
70066
- });
70067
70391
  var OauthSessionSummarySchema = external_exports.object({
70068
70392
  id: external_exports.string(),
70069
70393
  userId: external_exports.string(),
@@ -70150,18 +70474,6 @@ var userManagementCapability = {
70150
70474
  auth: "admin",
70151
70475
  access: "delete"
70152
70476
  }),
70153
- createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
70154
- kind: "mutation",
70155
- auth: "admin",
70156
- access: "create"
70157
- }),
70158
- revokeScopedToken: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ success: external_exports.literal(true) }), {
70159
- kind: "mutation",
70160
- auth: "admin",
70161
- access: "delete"
70162
- }),
70163
- validateScopedToken: method(external_exports.object({ token: external_exports.string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }),
70164
- listScopedTokens: method(external_exports.object({ userId: external_exports.string() }), external_exports.array(ScopedTokenSummarySchema), { auth: "admin" }),
70165
70477
  setupTotp: method(external_exports.object({ userId: external_exports.string() }), TotpSetupResultSchema, {
70166
70478
  kind: "mutation",
70167
70479
  auth: "admin",
@@ -74839,7 +75151,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
74839
75151
  capName: "llm",
74840
75152
  capScope: "system",
74841
75153
  addonId: null,
74842
- access: "view"
75154
+ access: "create"
74843
75155
  },
74844
75156
  "llm.listNodeModels": {
74845
75157
  capName: "llm",
@@ -75141,7 +75453,19 @@ var METHOD_ACCESS_MAP = Object.freeze({
75141
75453
  addonId: null,
75142
75454
  access: "view"
75143
75455
  },
75144
- "logDestination.query": {
75456
+ "logDestination.cancelRead": {
75457
+ capName: "log-destination",
75458
+ capScope: "system",
75459
+ addonId: null,
75460
+ access: "create"
75461
+ },
75462
+ "logDestination.describeRead": {
75463
+ capName: "log-destination",
75464
+ capScope: "system",
75465
+ addonId: null,
75466
+ access: "view"
75467
+ },
75468
+ "logDestination.read": {
75145
75469
  capName: "log-destination",
75146
75470
  capScope: "system",
75147
75471
  addonId: null,
@@ -79503,12 +79827,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
79503
79827
  addonId: null,
79504
79828
  access: "create"
79505
79829
  },
79506
- "userManagement.createScopedToken": {
79507
- capName: "user-management",
79508
- capScope: "system",
79509
- addonId: null,
79510
- access: "create"
79511
- },
79512
79830
  "userManagement.createUser": {
79513
79831
  capName: "user-management",
79514
79832
  capScope: "system",
@@ -79557,12 +79875,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
79557
79875
  addonId: null,
79558
79876
  access: "view"
79559
79877
  },
79560
- "userManagement.listScopedTokens": {
79561
- capName: "user-management",
79562
- capScope: "system",
79563
- addonId: null,
79564
- access: "view"
79565
- },
79566
79878
  "userManagement.listUsers": {
79567
79879
  capName: "user-management",
79568
79880
  capScope: "system",
@@ -79617,12 +79929,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
79617
79929
  addonId: null,
79618
79930
  access: "delete"
79619
79931
  },
79620
- "userManagement.revokeScopedToken": {
79621
- capName: "user-management",
79622
- capScope: "system",
79623
- addonId: null,
79624
- access: "delete"
79625
- },
79626
79932
  "userManagement.setupTotp": {
79627
79933
  capName: "user-management",
79628
79934
  capScope: "system",
@@ -79653,12 +79959,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
79653
79959
  addonId: null,
79654
79960
  access: "view"
79655
79961
  },
79656
- "userManagement.validateScopedToken": {
79657
- capName: "user-management",
79658
- capScope: "system",
79659
- addonId: null,
79660
- access: "view"
79661
- },
79662
79962
  "userManagement.verifyTotp": {
79663
79963
  capName: "user-management",
79664
79964
  capScope: "system",
@@ -81222,6 +81522,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
81222
81522
  form: "single",
81223
81523
  optional: false
81224
81524
  }],
81525
+ "logDestination.read": [{
81526
+ name: "deviceId",
81527
+ form: "single",
81528
+ optional: true
81529
+ }],
81225
81530
  "mediaPlayer.getStatus": [{
81226
81531
  name: "deviceId",
81227
81532
  form: "single",
@@ -82949,6 +83254,21 @@ var HISTORY_CATALOG = {
82949
83254
  deadband: 1
82950
83255
  }
82951
83256
  },
83257
+ "alarm-panel": { "state": {
83258
+ kind: "enum",
83259
+ values: [
83260
+ "disarmed",
83261
+ "armed_home",
83262
+ "armed_away",
83263
+ "armed_night",
83264
+ "armed_vacation",
83265
+ "armed_custom_bypass",
83266
+ "arming",
83267
+ "disarming",
83268
+ "pending",
83269
+ "triggered"
83270
+ ]
83271
+ } },
82952
83272
  "ambient-light-sensor": { "lux": {
82953
83273
  kind: "gauge",
82954
83274
  unit: "lx",
@@ -82993,6 +83313,7 @@ var HISTORY_CATALOG = {
82993
83313
  minIntervalMs: 0
82994
83314
  }
82995
83315
  },
83316
+ "connectivity": { "connected": { kind: "boolean" } },
82996
83317
  "contact": { "entryOpen": { kind: "boolean" } },
82997
83318
  "cover": { "position": {
82998
83319
  kind: "gauge",
@@ -83000,10 +83321,48 @@ var HISTORY_CATALOG = {
83000
83321
  minIntervalMs: 0
83001
83322
  } },
83002
83323
  "device-status": { "online": { kind: "boolean" } },
83003
- "dishwasher": { "progressPercent": {
83004
- kind: "gauge",
83005
- unit: "%",
83006
- deadband: 2
83324
+ "dishwasher": {
83325
+ "progressPercent": {
83326
+ kind: "gauge",
83327
+ unit: "%",
83328
+ deadband: 2
83329
+ },
83330
+ "state": {
83331
+ kind: "enum",
83332
+ values: [
83333
+ "idle",
83334
+ "running",
83335
+ "paused",
83336
+ "finished",
83337
+ "error",
83338
+ "unavailable"
83339
+ ]
83340
+ },
83341
+ "operationState": {
83342
+ kind: "enum",
83343
+ values: [
83344
+ "Inactive",
83345
+ "Ready",
83346
+ "DelayedStart",
83347
+ "Run",
83348
+ "Pause",
83349
+ "ActionRequired",
83350
+ "Finished",
83351
+ "Error",
83352
+ "Aborting"
83353
+ ]
83354
+ },
83355
+ "remainingSeconds": {
83356
+ kind: "gauge",
83357
+ unit: "s",
83358
+ minIntervalMs: 6e4
83359
+ },
83360
+ "doorOpen": { kind: "boolean" },
83361
+ "powerOn": { kind: "boolean" }
83362
+ },
83363
+ "enum-sensor": { "value": {
83364
+ kind: "enum",
83365
+ skipWhenSet: "format"
83007
83366
  } },
83008
83367
  "fan-control": {
83009
83368
  "percentage": {
@@ -83038,6 +83397,24 @@ var HISTORY_CATALOG = {
83038
83397
  unit: "%",
83039
83398
  deadband: 2
83040
83399
  } },
83400
+ "lock-control": { "state": {
83401
+ kind: "enum",
83402
+ values: [
83403
+ "locked",
83404
+ "unlocked",
83405
+ "locking",
83406
+ "unlocking",
83407
+ "jammed"
83408
+ ]
83409
+ } },
83410
+ "media-player": {
83411
+ "volumeLevel": {
83412
+ kind: "gauge",
83413
+ unit: "%",
83414
+ deadband: 1
83415
+ },
83416
+ "isMuted": { kind: "boolean" }
83417
+ },
83041
83418
  "motion": { "detected": {
83042
83419
  kind: "boolean",
83043
83420
  excludeDeviceTypes: [DeviceType.Camera]
@@ -83124,6 +83501,24 @@ var HISTORY_CATALOG = {
83124
83501
  deadband: 0.1
83125
83502
  } },
83126
83503
  "smoke": { "detected": { kind: "boolean" } },
83504
+ "stream-params": {
83505
+ "main.bitrate": {
83506
+ kind: "gauge",
83507
+ unit: "kbps"
83508
+ },
83509
+ "main.framerate": {
83510
+ kind: "gauge",
83511
+ unit: "fps"
83512
+ },
83513
+ "sub.bitrate": {
83514
+ kind: "gauge",
83515
+ unit: "kbps"
83516
+ },
83517
+ "sub.framerate": {
83518
+ kind: "gauge",
83519
+ unit: "fps"
83520
+ }
83521
+ },
83127
83522
  "switch": { "on": { kind: "boolean" } },
83128
83523
  "tamper": { "tampered": { kind: "boolean" } },
83129
83524
  "temperature-sensor": { "celsius": {
@@ -85976,6 +86371,23 @@ function resolveLoginServer(flag, positionals, env) {
85976
86371
  return flagged ?? positional ?? (fromEnv ? normalizeHubAddress(fromEnv) : void 0);
85977
86372
  }
85978
86373
 
86374
+ // src/commands/login-legacy-flags.ts
86375
+ var LEGACY_LOGIN_FLAG_OPTIONS = {
86376
+ admin: { type: "boolean" },
86377
+ "admin-days": { type: "string" }
86378
+ };
86379
+ var LEGACY_LOGIN_FLAG_MESSAGES = {
86380
+ admin: "--admin is ignored: one login, one token \u2014 drop --admin (admin rights follow your account).",
86381
+ "admin-days": "--admin-days is ignored: one login, one token \u2014 drop --admin-days (the session renews itself)."
86382
+ };
86383
+ function legacyLoginFlagWarnings(values) {
86384
+ const names = Object.keys(LEGACY_LOGIN_FLAG_MESSAGES).filter(isLegacyFlagName);
86385
+ return names.filter((name) => values[name] !== void 0).map((name) => LEGACY_LOGIN_FLAG_MESSAGES[name]);
86386
+ }
86387
+ function isLegacyFlagName(name) {
86388
+ return name in LEGACY_LOGIN_FLAG_OPTIONS;
86389
+ }
86390
+
85979
86391
  // src/commands/auth.ts
85980
86392
  import * as clack from "@clack/prompts";
85981
86393
  import {
@@ -86154,7 +86566,7 @@ function isLoginPayload(value) {
86154
86566
  function revocationFor(session) {
86155
86567
  if (session.tokenId) {
86156
86568
  return {
86157
- procedure: "userManagement.revokeScopedToken",
86569
+ procedure: "auth.revokeToken",
86158
86570
  input: { id: session.tokenId },
86159
86571
  bearer: "fresh"
86160
86572
  };
@@ -87466,9 +87878,7 @@ function buildCommands() {
87466
87878
  " -n, --namespace <ns> Ignored (kept so old scripts do not fail): hubs are found over mDNS",
87467
87879
  " -u, --username <name> Username (skips prompt)",
87468
87880
  " -p, --password <pwd> Password (skips prompt \u2014 prefer letting the CLI prompt)",
87469
- ` --token-name <name> Ignored (kept for scripts); login uses your hub session JWT`,
87470
- " --admin Ignored (kept for muscle memory); admin follows your account role",
87471
- " --admin-days <n> Ignored (kept for muscle memory); one login, one token format"
87881
+ ` --token-name <name> Ignored (kept for scripts); login uses your hub session JWT`
87472
87882
  ].join("\n")
87473
87883
  },
87474
87884
  {
@@ -87693,10 +88103,9 @@ async function runLogin(args) {
87693
88103
  username: { type: "string", short: "u" },
87694
88104
  password: { type: "string", short: "p" },
87695
88105
  "token-name": { type: "string" },
87696
- // Accepted-and-ignored: role comes from the logged-in user (D884). Operators
87697
- // still type `camstack login --admin <host>` from muscle memory — never fail.
87698
- admin: { type: "boolean" },
87699
- "admin-days": { type: "string" },
88106
+ // Removed (D895), still parsed so an old script does not abort: each one
88107
+ // present prints a one-line warning and the login goes on.
88108
+ ...LEGACY_LOGIN_FLAG_OPTIONS,
87700
88109
  // Accepted-and-ignored: `--no-verify` is a `deploy`-only flag (skip the
87701
88110
  // post-deploy health gate). Login has no verify step, but operators
87702
88111
  // muscle-memory it in — we swallow it here so `camstack login --no-verify`
@@ -87717,6 +88126,7 @@ async function runLogin(args) {
87717
88126
  if (stringOpt(parsed.values, "namespace") !== void 0) {
87718
88127
  console.warn("--namespace is ignored: hubs are found over mDNS, not the mesh channel.");
87719
88128
  }
88129
+ for (const warning of legacyLoginFlagWarnings(parsed.values)) console.warn(warning);
87720
88130
  await loginCommand({
87721
88131
  ...explicitServer ? { server: explicitServer } : {},
87722
88132
  ...optionalString(parsed.values, "username"),