@camstack/addon-post-analysis 1.2.667 → 1.2.668

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.
Files changed (16) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{clip-model-registry-DpzRS8q3.mjs → clip-model-registry-BYJ5lbPi.mjs} +197 -30
  3. package/dist/{clip-model-registry-D7cqhFK3.js → clip-model-registry-DTC5bkf8.js} +197 -30
  4. package/dist/embedding-encoder/index.js +1 -1
  5. package/dist/embedding-encoder/index.mjs +1 -1
  6. package/dist/pipeline-analytics/_stub.js +2 -2
  7. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DmTIEp0m.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DBEA3TPX.mjs} +2 -2
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DxtNkzmw.mjs +26 -0
  9. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CU7mDiJp.mjs +26 -0
  10. package/dist/pipeline-analytics/{hostInit-ODebWXu_.mjs → hostInit-ChYqK-gn.mjs} +2 -2
  11. package/dist/pipeline-analytics/index.js +12 -3
  12. package/dist/pipeline-analytics/index.mjs +12 -3
  13. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  14. package/package.json +2 -2
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DAAkZRnK.mjs +0 -26
  16. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-znrgUrN1.mjs +0 -26
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.668] - 2026-11-05
11
+
12
+ ### Changed
13
+
14
+ - The finish notification's cycle facts match a run that ended up to 30 minutes before the announcement
15
+
10
16
  ## [1.2.667] - 2026-11-03
11
17
 
12
18
  ### Changed
@@ -6038,7 +6038,7 @@ var ZodIssueCode = {
6038
6038
  var ZodFirstPartyTypeKind;
6039
6039
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6040
6040
  //#endregion
6041
- //#region ../types/dist/sleep-hK-Dss3z.mjs
6041
+ //#region ../types/dist/sleep-D1jjWAr8.mjs
6042
6042
  /**
6043
6043
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6044
6044
  * window to float samples (D455).
@@ -6631,7 +6631,7 @@ var NOT_RUN = {
6631
6631
  * throws: an unreachable or refusing engine is logged and reported `declared: false`,
6632
6632
  * because the hub (and this addon's boot) must not hang on a migration.
6633
6633
  */
6634
- async function runAddonMigrations(host, migrations, logger) {
6634
+ async function runAddonMigrations(host, migrations, logger, options = {}) {
6635
6635
  const first = migrations[0];
6636
6636
  if (first === void 0) return NOT_RUN;
6637
6637
  const owner = first.meta.owner;
@@ -6660,7 +6660,9 @@ async function runAddonMigrations(host, migrations, logger) {
6660
6660
  else if (status === "blocked") blocked.push(id);
6661
6661
  else skipped.push(id);
6662
6662
  };
6663
+ const selected = options.only === void 0 ? null : new Set(options.only);
6663
6664
  for (const step of declaration.steps) {
6665
+ if (selected !== null && !selected.has(step.id)) continue;
6664
6666
  const bound = byId.get(step.id);
6665
6667
  if (bound === void 0 || step.action === "skip") {
6666
6668
  skipped.push(step.id);
@@ -7778,14 +7780,18 @@ var BaseAddon = class {
7778
7780
  * nothing; the boot continues. A migration that FAILED (or was blocked by one)
7779
7781
  * and declares `onFailure: 'block-owner'` makes this throw, so the addon does not
7780
7782
  * serve data whose shape it cannot trust; `tolerate` migrations never do.
7783
+ *
7784
+ * ALWAYS pass the whole catalogue; a phase that must run only some of it passes
7785
+ * `{ only: [ids] }` — never a filtered catalogue (the engine would judge the
7786
+ * omitted applied ids "newer").
7781
7787
  */
7782
- async runMigrations(migrations) {
7788
+ async runMigrations(migrations, options) {
7783
7789
  const api = this.ctx.api.migrations;
7784
7790
  const report = await runAddonMigrations({
7785
7791
  declareOwner: (input) => api.declareOwner.mutate(input),
7786
7792
  startMigration: (input) => api.startMigration.mutate(input),
7787
7793
  finishMigration: (input) => api.finishMigration.mutate(input)
7788
- }, migrations, this.ctx.logger);
7794
+ }, migrations, this.ctx.logger, options);
7789
7795
  if (report.blockOwner.length > 0) throw new AddonMigrationsBlockedError(report.blockOwner);
7790
7796
  return report;
7791
7797
  }
@@ -8816,6 +8822,10 @@ var RECORD_SETTINGS_MAX_ROWS = 5e4;
8816
8822
  * (`collectZodSecretPaths`): dotted keys, `[]` for "each element of this array"
8817
8823
  * (`auth.accessToken`, `headers[].value`).
8818
8824
  *
8825
+ * `{}` after a key means "each value of this map" (`applianceSecrets{}`): the map's own key
8826
+ * names the value (`applianceSecrets{fridge}`), so no id key is declared and a body that drops a
8827
+ * key releases exactly that key's secret.
8828
+ *
8819
8829
  * Array elements are matched by a DECLARED id key (`secretArrayKeys`:
8820
8830
  * `{ headers: 'name' }`), never by index, so reordering a list keeps every
8821
8831
  * keychain ref (the same rule as `arrayItemFieldPath`). The concrete path of a
@@ -8828,11 +8838,13 @@ function parseSecretPath(path) {
8828
8838
  if (path.length === 0) throw new InvalidRecordError("an empty secret path");
8829
8839
  return path.split(".").map((raw) => {
8830
8840
  const each = raw.endsWith("[]");
8831
- const key = each ? raw.slice(0, -2) : raw;
8841
+ const map = raw.endsWith("{}");
8842
+ const key = each || map ? raw.slice(0, -2) : raw;
8832
8843
  if (key.length === 0) throw new InvalidRecordError(`secret path "${path}" has an empty segment`);
8833
8844
  return {
8834
8845
  key,
8835
- each
8846
+ each,
8847
+ map
8836
8848
  };
8837
8849
  });
8838
8850
  }
@@ -8919,7 +8931,8 @@ function isZodSecret(schema) {
8919
8931
  }
8920
8932
  /**
8921
8933
  * Every declared secret path in a config schema: dotted keys, `[]` for "each
8922
- * element of this array" (`connection.password`, `rows[].token`). A declared
8934
+ * element of this array" (`connection.password`, `rows[].token`), `{}` for "each value of this
8935
+ * map" (`applianceSecrets{}`). A declared
8923
8936
  * object or array is reported as one path and not descended into — everything
8924
8937
  * under it is secret.
8925
8938
  */
@@ -8930,6 +8943,7 @@ function collectZodSecretPaths(schema, prefix = "") {
8930
8943
  const def = defOf(layer);
8931
8944
  if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
8932
8945
  else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
8946
+ else if (def.type === "record" && def.valueType) paths.push(...collectZodSecretPaths(def.valueType, `${prefix}{}`));
8933
8947
  else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
8934
8948
  else if (def.type === "intersection") {
8935
8949
  if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
@@ -9069,7 +9083,7 @@ function defineRecordKinds(specs) {
9069
9083
  retention: spec.retention,
9070
9084
  deviceRemoval: spec.deviceRemoval,
9071
9085
  maxDataBytes: spec.maxDataBytes,
9072
- secretPaths: [...secretPaths],
9086
+ secretPaths: [...new Set([...secretPaths, ...spec.retiredSecretPaths ?? []])],
9073
9087
  secretArrayKeys: spec.secretArrayKeys === void 0 ? void 0 : { ...spec.secretArrayKeys },
9074
9088
  transactFamily: spec.transactFamily,
9075
9089
  entry: spec.entry === void 0 ? void 0 : {
@@ -11978,7 +11992,7 @@ function sleep(ms) {
11978
11992
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
11979
11993
  }
11980
11994
  //#endregion
11981
- //#region ../types/dist/composition-BSGHhcr8.mjs
11995
+ //#region ../types/dist/composition-pOHbTzRB.mjs
11982
11996
  /**
11983
11997
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
11984
11998
  * canonical form sorts object keys alphabetically at every depth so two
@@ -14647,7 +14661,13 @@ var MigrationLedgerEntrySchema = object({
14647
14661
  * joined by the engine from the catalogues it knows this boot. Absent when no
14648
14662
  * catalogue lists the id (a newer database).
14649
14663
  */
14650
- meta: MigrationMetaSchema.optional()
14664
+ meta: MigrationMetaSchema.optional(),
14665
+ /**
14666
+ * Set when this is an applied row of an addon owner whose catalogue the answering
14667
+ * process has not loaded (the owner has not declared yet): the row is applied, the
14668
+ * process just cannot judge it. Never `skipped-newer` — that needs the owner loaded.
14669
+ */
14670
+ ownerNotLoaded: boolean().optional()
14651
14671
  });
14652
14672
  /** A catalogued migration that is not applied, with where it stands. */
14653
14673
  var MigrationPendingEntrySchema = object({
@@ -51179,6 +51199,9 @@ var RunningProposalEvidenceSchema = object({
51179
51199
  runsFound: number().int().nonnegative(),
51180
51200
  pausesFound: number().int().nonnegative(),
51181
51201
  longestPauseMs: number().nonnegative(),
51202
+ /** Episodes shorter than ~90 s (an anti-crease pulse, a display waking): never a run, never a pause. */
51203
+ pulsesFound: number().int().nonnegative(),
51204
+ longestPulseMs: number().nonnegative(),
51182
51205
  idleFloorW: number(),
51183
51206
  noiseCeilingW: number(),
51184
51207
  plateauW: number(),
@@ -52469,7 +52492,27 @@ method(object({
52469
52492
  * exposes only the COMMON surface: link state, supported device
52470
52493
  * kinds (so the UI can filter the device picker), and per-device
52471
52494
  * expose/unexpose.
52472
- */
52495
+ *
52496
+ * INSTANCES. One export addon can serve several independent targets (a
52497
+ * HomeKit bridge, a Home Assistant broker). `listInstances` names them.
52498
+ * `instanceId` on a READ is optional: absent = the whole addon (linked if any
52499
+ * enabled instance is, `exposedDeviceCount` = distinct devices, `setup` = the
52500
+ * default instance's); present = that instance; an id the provider does not
52501
+ * serve is refused with `ExportInstanceUnknownError` (`export-instance-unknown`),
52502
+ * never answered empty. `instanceId` on a WRITE is REQUIRED: a membership
52503
+ * change always names the target it changes. A single-instance provider
52504
+ * accepts an absent id on a read or its own id, and refuses any other.
52505
+ */
52506
+ /** Which instance of an export addon a call addresses. Absent on a read = the whole addon. */
52507
+ var InstanceIdSchema$1 = string().min(1);
52508
+ var InstancePinSchema = object({ instanceId: InstanceIdSchema$1.optional() });
52509
+ /** One independent export target of an addon. */
52510
+ var ExportInstanceSchema = object({
52511
+ instanceId: InstanceIdSchema$1,
52512
+ name: string(),
52513
+ enabled: boolean(),
52514
+ kind: string().optional()
52515
+ });
52473
52516
  var LinkStateSchema = _enum([
52474
52517
  "unlinked",
52475
52518
  "linked",
@@ -52520,10 +52563,14 @@ var ExposedDeviceSchema = object({
52520
52563
  capabilities: array(string()).optional()
52521
52564
  });
52522
52565
  var ExposeInputSchema = object({
52566
+ instanceId: InstanceIdSchema$1,
52523
52567
  deviceId: string(),
52524
52568
  capabilities: array(string()).optional()
52525
52569
  });
52526
- var UnexposeInputSchema = object({ deviceId: string() });
52570
+ var UnexposeInputSchema = object({
52571
+ instanceId: InstanceIdSchema$1,
52572
+ deviceId: string()
52573
+ });
52527
52574
  /**
52528
52575
  * What an exporter may expose besides devices (D968). An action and a
52529
52576
  * notification target are LIST ENTRIES, never devices (D954): they enter an
@@ -52552,15 +52599,21 @@ var ExposedEntitySchema = object({
52552
52599
  entity: ExportEntityRefSchema,
52553
52600
  exposedAs: string().optional()
52554
52601
  });
52555
- var ExposeEntityInputSchema = object({ entity: ExportEntityRefSchema });
52556
- var UnexposeEntityInputSchema = object({ entity: ExportEntityRefSchema });
52557
- method(_void(), DeviceExportStatusSchema), method(_void(), array(DeviceKindSchema)), method(_void(), array(ExposedDeviceSchema)), method(ExposeInputSchema, _void(), {
52602
+ var ExposeEntityInputSchema = object({
52603
+ instanceId: InstanceIdSchema$1,
52604
+ entity: ExportEntityRefSchema
52605
+ });
52606
+ var UnexposeEntityInputSchema = object({
52607
+ instanceId: InstanceIdSchema$1,
52608
+ entity: ExportEntityRefSchema
52609
+ });
52610
+ method(InstancePinSchema, DeviceExportStatusSchema), method(_void(), array(ExportInstanceSchema)), method(InstancePinSchema, array(DeviceKindSchema)), method(InstancePinSchema, array(ExposedDeviceSchema)), method(ExposeInputSchema, _void(), {
52558
52611
  kind: "mutation",
52559
52612
  auth: "admin"
52560
52613
  }), method(UnexposeInputSchema, _void(), {
52561
52614
  kind: "mutation",
52562
52615
  auth: "admin"
52563
- }), optionalMethod(_void(), array(ExportEntityKindSchema)), optionalMethod(_void(), array(ExposedEntitySchema)), optionalMethod(ExposeEntityInputSchema, _void(), {
52616
+ }), optionalMethod(_void(), array(ExportEntityKindSchema)), optionalMethod(InstancePinSchema, array(ExposedEntitySchema)), optionalMethod(ExposeEntityInputSchema, _void(), {
52564
52617
  kind: "mutation",
52565
52618
  auth: "admin"
52566
52619
  }), optionalMethod(UnexposeEntityInputSchema, _void(), {
@@ -57096,6 +57149,12 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
57096
57149
  }), object({ success: boolean() }), {
57097
57150
  kind: "mutation",
57098
57151
  auth: "admin"
57152
+ }), method(object({ id: string() }), object({
57153
+ rows: number().int().nonnegative(),
57154
+ secrets: number().int().nonnegative()
57155
+ }), {
57156
+ kind: "mutation",
57157
+ auth: "admin"
57099
57158
  }), method(_void(), array(AvailableIntegrationTypeSchema), { auth: "admin" }), method(object({
57100
57159
  addonId: string(),
57101
57160
  settings: record(string(), unknown())
@@ -57124,13 +57183,65 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
57124
57183
  */
57125
57184
  var ConfigSchemaPassthrough$3 = custom();
57126
57185
  var IntegrationInstanceIdSchema = string().min(1);
57186
+ var IntegrationInstanceModeSchema = _enum(["single", "multiple"]);
57187
+ /**
57188
+ * One kind of instance a provider can create (an adapter, an account type). The sign-in and
57189
+ * connect fields follow the `broker` contract (`broker.cap.ts`): `signIn.basePath` is a
57190
+ * hub-relative route set speaking the sign-in contract, `connectPath` / `disconnectPath` open an
57191
+ * interactive account link (popup) and may carry `{{brokerId}}`, which the UI replaces with the
57192
+ * instance id.
57193
+ */
57194
+ var IntegrationInstanceKindSchema = object({
57195
+ /** Stable id of the kind, sent back as `createInstance.kind`. */
57196
+ id: string().min(1),
57197
+ label: string().min(1),
57198
+ /** The kind signs in through a server-held interactive session. */
57199
+ signIn: object({
57200
+ basePath: string().min(1),
57201
+ methods: array(_enum(["device-code", "proxy"])).optional()
57202
+ }).optional(),
57203
+ /** Relative hub path to start an interactive account link of an instance of this kind. */
57204
+ connectPath: string().min(1).optional(),
57205
+ /** Relative hub path to disconnect that account. */
57206
+ disconnectPath: string().min(1).optional()
57207
+ });
57127
57208
  var IntegrationInstanceDescriptionSchema = object({
57209
+ /** What the instances are for the Integrations page; see {@link IntegrationInstanceRoleSchema}. */
57210
+ role: _enum([
57211
+ "devices",
57212
+ "services",
57213
+ "both"
57214
+ ]),
57215
+ /** How the devices of an instance are found; absent means `{ mode: 'none' }`. */
57216
+ discovery: object({
57217
+ mode: _enum([
57218
+ "none",
57219
+ "lan",
57220
+ "account"
57221
+ ]),
57222
+ scopedToInstance: boolean()
57223
+ }).optional(),
57128
57224
  /** `single`: at most one instance can exist (Loki). `multiple`: an account each. */
57129
- instanceMode: _enum(["single", "multiple"]),
57225
+ instanceMode: IntegrationInstanceModeSchema,
57130
57226
  /** What the instance is, for the UI (`destination`, `relay`, `account`). */
57131
57227
  kind: string(),
57132
57228
  /** True when `testInstance` really probes the remote. */
57133
- canTest: boolean()
57229
+ canTest: boolean(),
57230
+ /**
57231
+ * The kinds an instance can be of. Absent or one entry: nothing to choose; more than one: the
57232
+ * Add flow asks which first and sends it as `createInstance.kind`.
57233
+ */
57234
+ kinds: array(IntegrationInstanceKindSchema).optional(),
57235
+ /**
57236
+ * The provider accepts `createInstance.id` for an id that once existed (an adopted id, because
57237
+ * devices carry it). The UI then offers "restore under its old id" on Add. Absent means no.
57238
+ */
57239
+ allowRestoreId: boolean().optional(),
57240
+ /**
57241
+ * `createInstance` without an `id` works: the provider mints it. Absent means the caller must
57242
+ * send an id (the UI then mints an opaque one).
57243
+ */
57244
+ mintsId: boolean().optional()
57134
57245
  });
57135
57246
  var IntegrationInstanceStatusSchema = object({
57136
57247
  state: _enum([
@@ -57139,7 +57250,9 @@ var IntegrationInstanceStatusSchema = object({
57139
57250
  "error",
57140
57251
  "unknown"
57141
57252
  ]),
57142
- detail: string().optional()
57253
+ detail: string().optional(),
57254
+ /** A short human word for the state ("Signed in", "Token expired"); shown instead of `state`. */
57255
+ label: string().optional()
57143
57256
  });
57144
57257
  var IntegrationInstanceSchema = object({
57145
57258
  id: IntegrationInstanceIdSchema,
@@ -57147,13 +57260,18 @@ var IntegrationInstanceSchema = object({
57147
57260
  /** The addon's own rule (an URL is present, a client id is present...). */
57148
57261
  configured: boolean(),
57149
57262
  /**
57150
- * The instance's own on/off switch (D996): always present, derived from the record body
57151
- * (`enabled !== false`, so a row written before the field existed is on).
57263
+ * The instance's own on/off switch (D996), derived from the record body (`enabled !== false`,
57264
+ * so a row written before the field existed is on). Absent when the `integrations` registry
57265
+ * owns the switch (`describe().role` is `devices`): read it from the registry row.
57152
57266
  */
57153
- enabled: boolean(),
57267
+ enabled: boolean().optional(),
57268
+ /** The kind of this instance (one of `describe().kinds[].id`), when the provider has kinds. */
57269
+ kind: string().optional(),
57154
57270
  /** Values for the instance form; a secret is a `SecretFieldView`, never text. */
57155
57271
  formValues: record(string(), unknown()),
57156
- status: IntegrationInstanceStatusSchema.optional()
57272
+ status: IntegrationInstanceStatusSchema.optional(),
57273
+ /** Epoch ms of the last probe of the remote that produced `status`; absent when never checked. */
57274
+ lastCheckedAt: number().optional()
57157
57275
  });
57158
57276
  var IntegrationInstancePatchSchema = object({
57159
57277
  id: IntegrationInstanceIdSchema,
@@ -57162,8 +57280,9 @@ var IntegrationInstancePatchSchema = object({
57162
57280
  values: record(string(), unknown())
57163
57281
  });
57164
57282
  method(_void(), IntegrationInstanceDescriptionSchema, { auth: "admin" }), method(object({ id: IntegrationInstanceIdSchema.nullable() }), ConfigSchemaPassthrough$3, { auth: "admin" }), method(_void(), array(IntegrationInstanceSchema).readonly(), { auth: "admin" }), method(object({ id: IntegrationInstanceIdSchema }), IntegrationInstanceSchema.nullable(), { auth: "admin" }), method(object({
57165
- id: IntegrationInstanceIdSchema,
57166
- name: string().min(1)
57283
+ id: IntegrationInstanceIdSchema.optional(),
57284
+ name: string().min(1),
57285
+ kind: string().min(1).optional()
57167
57286
  }), object({ id: string() }), {
57168
57287
  kind: "mutation",
57169
57288
  auth: "admin"
@@ -59323,6 +59442,11 @@ var LogEntrySchema = object({
59323
59442
  * flight, and not asking for the next slice ends the scan.
59324
59443
  */
59325
59444
  var LogReadQuerySchema = object({
59445
+ /**
59446
+ * Which destination INSTANCE answers (a destination addon may hold several records). Absent ⇒
59447
+ * the provider's first readable one, so a caller written before instances existed is unchanged.
59448
+ */
59449
+ instanceId: string().min(1).max(200).optional(),
59326
59450
  /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
59327
59451
  requestId: string().min(1).max(64).optional(),
59328
59452
  /** The device the line is about (`tags.deviceId`, numeric). */
@@ -59385,6 +59509,8 @@ var LogReadResultSchema = object({
59385
59509
  /** True when `cancelRead` ended this slice early. */
59386
59510
  cancelled: boolean().optional()
59387
59511
  });
59512
+ /** Names one destination instance; absent ⇒ the provider's first readable one. */
59513
+ var LogInstanceSelectorSchema = object({ instanceId: string().min(1).max(200).optional() });
59388
59514
  var LogReadCapabilitiesSchema = object({
59389
59515
  /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
59390
59516
  readable: boolean(),
@@ -59403,7 +59529,7 @@ var LogReadCapabilitiesSchema = object({
59403
59529
  /** How far back the store reaches, when the provider knows (days). */
59404
59530
  retentionDays: number().nullable()
59405
59531
  });
59406
- method(LogEntrySchema, _void(), { kind: "mutation" }), optionalMethod(_void(), LogReadCapabilitiesSchema, { auth: "admin" }), optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }), optionalMethod(object({ requestId: string().min(1).max(64) }), object({ cancelled: boolean() }), {
59532
+ method(LogEntrySchema, _void(), { kind: "mutation" }), optionalMethod(LogInstanceSelectorSchema, LogReadCapabilitiesSchema, { auth: "admin" }), optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }), optionalMethod(object({ requestId: string().min(1).max(64) }), object({ cancelled: boolean() }), {
59407
59533
  kind: "mutation",
59408
59534
  auth: "admin"
59409
59535
  });
@@ -83245,6 +83371,25 @@ function buildEventKindDescriptor(kind, source) {
83245
83371
  }
83246
83372
  };
83247
83373
  }
83374
+ /**
83375
+ * What a remote key is CALLED and what it LOOKS like, for every role (D963),
83376
+ * shared by the admin UI and the viewer. A role is data on the wire; each
83377
+ * client resolves its name from `label` (English and Italian side by side) and
83378
+ * its glyph from `icon`, a lucide id from the shared icon catalogue — the
83379
+ * server sends an id, a client maps it to its own icon set.
83380
+ *
83381
+ * `legend` is text printed on the key INSTEAD of a glyph (a digit has no
83382
+ * pictogram): a client that can draw text shows it, one that cannot falls back
83383
+ * to `icon`.
83384
+ */
83385
+ function digit(n) {
83386
+ return {
83387
+ label: t(n, n),
83388
+ icon: "hash",
83389
+ legend: n
83390
+ };
83391
+ }
83392
+ digit("0"), digit("1"), digit("2"), digit("3"), digit("4"), digit("5"), digit("6"), digit("7"), digit("8"), digit("9");
83248
83393
  DeviceFeature.MediaPlayerPower, DeviceFeature.MediaPlayerVolumeStep, DeviceFeature.MediaPlayerChannelStep, DeviceFeature.MediaPlayerMute, DeviceFeature.MediaPlayerStop, DeviceFeature.MediaPlayerNext, DeviceFeature.MediaPlayerPrevious;
83249
83394
  var btn = (idSuffix, row, col, init) => ({
83250
83395
  idSuffix,
@@ -83383,11 +83528,15 @@ discriminatedUnion("kind", [object({
83383
83528
  * 1. idle floor F = time-weighted median; noise ceiling N = highest value seen
83384
83529
  * near F. A device that is not near one level most of the time has no floor.
83385
83530
  * 2. coarse activity = above max(2N, N + 5 W); consecutive stretches are episodes.
83386
- * 3. gaps between episodes split in two by the largest log-scale jump (>= 3x):
83387
- * the short ones are pauses INSIDE a run (a soak), the long ones separate runs.
83531
+ * 3. an episode shorter than `PULSE_MAX_MS` is a PULSE (an anti-crease tumble, a
83532
+ * display waking): it is neither a run nor a pause. Among the remaining
83533
+ * episodes, gaps over `PAUSE_MAX_MS` always separate runs; the rest split in
83534
+ * two by the largest log-scale jump (>= 3x): the short ones are pauses INSIDE
83535
+ * a run (a soak), the long ones separate runs. A stretch under `MIN_RUN_MS`
83536
+ * is no run.
83388
83537
  * 4. T = geometric mean of N and the plateau's 10th percentile, snapped to a
83389
- * grid a person would type; stop dwell covers the longest pause; start dwell
83390
- * covers the longest standby blip above T.
83538
+ * grid a person would type; stop dwell covers the longest pause and the
83539
+ * kind's floor; start dwell covers the longest pulse and standby blip above T.
83391
83540
  * 5. the numbers are proved by REPLAY through the real `dwell` evaluation: each
83392
83541
  * run must hold exactly one true interval and nothing may flap outside.
83393
83542
  */
@@ -83398,6 +83547,10 @@ var MINUTE_MS$1 = 60 * SECOND_MS;
83398
83547
  30 * SECOND_MS;
83399
83548
  60 * SECOND_MS;
83400
83549
  20 * MINUTE_MS$1;
83550
+ 90 * SECOND_MS;
83551
+ 30 * MINUTE_MS$1;
83552
+ 10 * MINUTE_MS$1;
83553
+ DeviceType.Dryer, 3 * MINUTE_MS$1, DeviceType.Dishwasher, 3 * MINUTE_MS$1, DeviceType.Washer, 10 * MINUTE_MS$1;
83401
83554
  10 * SECOND_MS;
83402
83555
  10 * SECOND_MS;
83403
83556
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverStoppable, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
@@ -86582,6 +86735,13 @@ Object.freeze({
86582
86735
  access: "view",
86583
86736
  role: "admin"
86584
86737
  },
86738
+ "deviceExport.listInstances": {
86739
+ capName: "device-export",
86740
+ capScope: "system",
86741
+ addonId: null,
86742
+ access: "view",
86743
+ role: "admin"
86744
+ },
86585
86745
  "deviceExport.listSupportedDeviceKinds": {
86586
86746
  capName: "device-export",
86587
86747
  capScope: "system",
@@ -88234,6 +88394,13 @@ Object.freeze({
88234
88394
  access: "create",
88235
88395
  role: "admin"
88236
88396
  },
88397
+ "integrations.clearSettings": {
88398
+ capName: "integrations",
88399
+ capScope: "system",
88400
+ addonId: null,
88401
+ access: "delete",
88402
+ role: "admin"
88403
+ },
88237
88404
  "integrations.create": {
88238
88405
  capName: "integrations",
88239
88406
  capScope: "system",