@camstack/types 1.2.267 → 1.2.269

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 (69) hide show
  1. package/dist/addon.js +4 -4
  2. package/dist/addon.mjs +3 -3
  3. package/dist/capabilities/battery.cap.d.ts +17 -2
  4. package/dist/capabilities/capability-definition.d.ts +30 -1
  5. package/dist/capabilities/composer.cap.d.ts +105 -0
  6. package/dist/capabilities/consumables.cap.d.ts +79 -0
  7. package/dist/capabilities/core-blocks.cap.d.ts +1213 -104
  8. package/dist/capabilities/device-extension.cap.d.ts +12 -13
  9. package/dist/capabilities/device-manager.cap.d.ts +4 -4
  10. package/dist/capabilities/device-state.cap.d.ts +186 -2
  11. package/dist/capabilities/doorbell.cap.d.ts +4 -0
  12. package/dist/capabilities/index.d.ts +3 -3
  13. package/dist/capabilities/media-player.cap.d.ts +4 -4
  14. package/dist/capabilities/recording-archive.cap.d.ts +3 -3
  15. package/dist/catalogs/sensor-active-state.d.ts +25 -1
  16. package/dist/composition/composition-events.d.ts +42 -0
  17. package/dist/composition/composition-graph.d.ts +42 -9
  18. package/dist/composition/composition-items.d.ts +25 -0
  19. package/dist/composition/composition-report.d.ts +115 -12
  20. package/dist/composition/composition.d.ts +162 -3
  21. package/dist/composition/customization-name.d.ts +6 -0
  22. package/dist/composition/evaluate-field.d.ts +20 -0
  23. package/dist/composition/examples.d.ts +33 -0
  24. package/dist/composition/expression-kinds.d.ts +1 -0
  25. package/dist/composition/field-kinds.d.ts +42 -0
  26. package/dist/composition/index.d.ts +2 -0
  27. package/dist/composition/plan-result.d.ts +18 -0
  28. package/dist/composition/state-fields.d.ts +6 -0
  29. package/dist/composition/validate-composition.d.ts +44 -9
  30. package/dist/composition-BAH3n-zq.js +2582 -0
  31. package/dist/composition-D5BQywfe.mjs +2055 -0
  32. package/dist/device/device-context.d.ts +9 -0
  33. package/dist/device/device-runtime-state.d.ts +15 -1
  34. package/dist/device/index.d.ts +1 -1
  35. package/dist/device-extension/slot-descriptor.d.ts +8 -11
  36. package/dist/device-extension/slot-provider.d.ts +0 -2
  37. package/dist/enums/event-category.d.ts +25 -0
  38. package/dist/enums.js +1 -1
  39. package/dist/enums.mjs +1 -1
  40. package/dist/err-msg-DX6i_MY4.mjs +339 -0
  41. package/dist/err-msg-Dx2Kor0g.js +368 -0
  42. package/dist/{event-category-BVDXG4tB.mjs → event-category-C5xZWqz6.mjs} +31 -1
  43. package/dist/{event-category-BVfsrBYA.js → event-category-MbnB-6AN.js} +48 -0
  44. package/dist/expression/ast.d.ts +2 -0
  45. package/dist/expression/builtins.d.ts +9 -0
  46. package/dist/expression/evaluator.d.ts +8 -2
  47. package/dist/expression/expression-source.d.ts +26 -4
  48. package/dist/expression/index.d.ts +6 -6
  49. package/dist/generated/addon-api.d.ts +42 -0
  50. package/dist/generated/device-proxy.d.ts +1 -1
  51. package/dist/generated/method-access-map.d.ts +1 -1
  52. package/dist/generated/method-device-selectors.d.ts +2 -2
  53. package/dist/generated/system-proxy.d.ts +2 -2
  54. package/dist/index.d.ts +7 -6
  55. package/dist/index.js +1687 -1833
  56. package/dist/index.mjs +1359 -1550
  57. package/dist/interfaces/kernel-abstractions.d.ts +16 -0
  58. package/dist/interfaces/recording-config.d.ts +3 -3
  59. package/dist/interfaces/status-overlay.d.ts +42 -0
  60. package/dist/node.d.ts +1 -0
  61. package/dist/node.js +29 -8
  62. package/dist/node.mjs +23 -3
  63. package/dist/{sleep-8K9gue-H.js → sleep-Bg0IB7gg.js} +10 -367
  64. package/dist/{sleep-DC-wdyeS.mjs → sleep-E6eD4yQS.mjs} +11 -344
  65. package/package.json +1 -1
  66. package/dist/canonical-hash-CPK2Dy60.mjs +0 -715
  67. package/dist/canonical-hash-CSE4ioRi.js +0 -792
  68. package/dist/err-msg-COpsHMw2.js +0 -18
  69. package/dist/err-msg-IQTHeDzc.mjs +0 -13
@@ -0,0 +1,42 @@
1
+ import { type CompositionFieldSource } from './composition.js';
2
+ import type { CompositionFeatureMode, CompositionFieldRole, CompositionProblem, CompositionProblemCode, CompositionUnavailableMode } from './composition-report.js';
3
+ import { type ExpressionKindSet } from './expression-kinds.js';
4
+ import { type StateFieldDescription } from './state-fields.js';
5
+ import type { CapabilityLookup } from './validate-composition.js';
6
+ interface KindsFound {
7
+ readonly ok: true;
8
+ readonly kinds: ExpressionKindSet;
9
+ }
10
+ interface KindsRefused {
11
+ readonly ok: false;
12
+ readonly code: CompositionProblemCode;
13
+ readonly message: string;
14
+ }
15
+ type KindsResult = KindsFound | KindsRefused;
16
+ export declare function sourceKinds(source: CompositionFieldSource, lookupCap: CapabilityLookup): KindsResult;
17
+ export declare function compatibility(cap: string, target: StateFieldDescription, kinds: ExpressionKindSet, at: string): readonly CompositionProblem[];
18
+ /**
19
+ * An enum target whose source is a save-time-KNOWN string literal outside its
20
+ * `enumValues` is refused now rather than left to fail the write later. A
21
+ * dynamic source (a `from` read, a non-literal expression) is left to
22
+ * runtime — see {@link literalStringValue}.
23
+ */
24
+ export declare function enumLiteralProblem(cap: string, target: StateFieldDescription, source: CompositionFieldSource, at: string): CompositionProblem | null;
25
+ export declare function roleOf(source: CompositionFieldSource): CompositionFieldRole;
26
+ interface UnavailableChosen {
27
+ readonly ok: true;
28
+ readonly unavailable: CompositionUnavailableMode;
29
+ }
30
+ interface UnavailableRefused {
31
+ readonly ok: false;
32
+ readonly problem: CompositionProblem;
33
+ }
34
+ export type UnavailableResult = UnavailableChosen | UnavailableRefused;
35
+ /**
36
+ * How a planned field says "unavailable", per feature mode and AFTER `roleOf`
37
+ * (D393, D663 rulings S1 + S1b). The composer cannot take a device it does not
38
+ * own offline, and D393 forbids a stale number, so on an existing target a
39
+ * field that READS a source never gets `offline`.
40
+ */
41
+ export declare function unavailableFor(tf: StateFieldDescription, role: CompositionFieldRole, mode: CompositionFeatureMode, cap: string, at: string): UnavailableResult;
42
+ export {};
@@ -3,7 +3,9 @@
3
3
  * inside @camstack/types import the deep modules, never this file.
4
4
  */
5
5
  export * from './composition.js';
6
+ export * from './composition-events.js';
6
7
  export * from './composition-graph.js';
8
+ export * from './composition-items.js';
7
9
  export * from './composition-report.js';
8
10
  export * from './evaluate-field.js';
9
11
  export * from './examples.js';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The result of planning part of a composition, and the two helpers every
3
+ * planner builds it with. Internal to the composition module — NOT in the
4
+ * barrel (`problem`/`refused` are too generic a name for `@camstack/types`).
5
+ */
6
+ import type { CompositionFeaturePlan, CompositionFieldPlan, CompositionProblem, CompositionProblemCode } from './composition-report.js';
7
+ import type { CompositionEventPlan } from './composition-events.js';
8
+ export interface CompositionPlanResult {
9
+ readonly problems: readonly CompositionProblem[];
10
+ readonly fields: readonly CompositionFieldPlan[];
11
+ /** One entry per planned feature, with its mode; empty for a per-field or per-item result. */
12
+ readonly features: readonly CompositionFeaturePlan[];
13
+ readonly events: readonly CompositionEventPlan[];
14
+ }
15
+ export declare function problem(code: CompositionProblemCode, path: string, message: string): CompositionProblem;
16
+ export declare function refused(...problems: readonly CompositionProblem[]): CompositionPlanResult;
17
+ /** Where a planned field sits in the composition: `features[N].fields.<path>` or `features[N].items.<key>.fields.<path>`. */
18
+ export declare function compositionFieldAt(field: CompositionFieldPlan): string;
@@ -17,3 +17,9 @@ export declare function describeStateField(schema: z.ZodType, path: string): Sta
17
17
  export declare function describeTopLevelStateFields(schema: z.ZodType): ReadonlyMap<string, StateFieldDescription>;
18
18
  /** Top-level keys a value MUST carry: those whose schema refuses `undefined`. */
19
19
  export declare function requiredTopLevelKeys(schema: z.ZodType): readonly string[];
20
+ /**
21
+ * The proper prefixes of `path` whose schema accepts `undefined`: a required
22
+ * leaf under one of them is required only once something writes that parent
23
+ * (`remaining.unit` is required only when `remaining` is present).
24
+ */
25
+ export declare function optionalAncestors(schema: z.ZodType, path: string): readonly string[];
@@ -1,16 +1,19 @@
1
1
  /**
2
2
  * Save-time validation of a composition (D659): shape, capability fit, field
3
- * kinds, nullability, sources, cycles. Every refusal names its reason (D391),
3
+ * kinds, nullability, sources, cycles — and on an EXISTING target (D663),
4
+ * add vs replace per feature, self reads, one composition per device. Every refusal names its reason (D391),
4
5
  * and every variant a later slice implements is refused BY NAME with that slice.
5
6
  *
6
- * Pure: the caller DESCRIBES the sources (one read each) and passes the other
7
- * stored compositions. `planComposition` is the static half the composer
7
+ * Pure: the caller DESCRIBES the sources and an existing target (one read
8
+ * each) and passes the other stored compositions. `planComposition` is the static half the composer
8
9
  * re-runs at apply time, where the sources are the tracker's business.
9
10
  */
10
11
  import type { CapabilityDefinition } from '../capabilities/capability-definition.js';
12
+ import type { DeviceType } from '../device/device-type.js';
11
13
  import { type Composition, type CompositionSourceRef } from './composition.js';
14
+ import { type CompositionPlanResult } from './plan-result.js';
12
15
  import { type CompositionPeer } from './composition-graph.js';
13
- import type { CompositionFieldPlan, CompositionProblem, CompositionValidation } from './composition-report.js';
16
+ import { type CompositionValidation } from './composition-report.js';
14
17
  export type CapabilityLookup = (capName: string) => CapabilityDefinition | null;
15
18
  export declare function buildCapabilityLookup(defs: readonly CapabilityDefinition[]): CapabilityLookup;
16
19
  /** Caps every `BaseDevice` registers on itself; a second registration throws. */
@@ -28,19 +31,51 @@ export interface CompositionSourceUnreadable {
28
31
  readonly error: string;
29
32
  }
30
33
  export type CompositionSourceDescription = CompositionSourceFound | CompositionSourceAbsent | CompositionSourceUnreadable;
34
+ /** An existing target device, read once: its type and each cap bound to it, with the addon serving it. */
35
+ export interface CompositionTargetFound {
36
+ readonly kind: 'found';
37
+ readonly deviceId: number;
38
+ readonly type: DeviceType;
39
+ /** cap name → `nativeAddonId` (`getBindings`). A cap the composer grafted carries `COMPOSER_ADDON_ID`. */
40
+ readonly nativeCaps: ReadonlyMap<string, string>;
41
+ }
42
+ export type CompositionTargetDescription = CompositionTargetFound | CompositionSourceAbsent | CompositionSourceUnreadable;
31
43
  export interface ValidateCompositionContext {
32
44
  readonly lookupCap: CapabilityLookup;
33
45
  /** Keyed by `compositionSourceKey`. A ref with no entry was not read, and is refused as unreadable. */
34
46
  readonly sources: ReadonlyMap<string, CompositionSourceDescription>;
35
47
  /** The device this composition writes; null on create, when the block has no id yet. */
36
48
  readonly self: CompositionSourceRef | null;
49
+ /** The block being saved; null on create. Its stored old version is recognised by this id (D663). */
50
+ readonly blockId: string | null;
51
+ /** The EXISTING target device, read once; null for a new-device composition (a missing read is refused). */
52
+ readonly target: CompositionTargetDescription | null;
37
53
  /** Every OTHER stored composition; cycles run through them. */
38
54
  readonly peers: readonly CompositionPeer[];
55
+ /**
56
+ * Devices of stored customizations whose target could not be read, by
57
+ * `compositionSourceKey` → why. Their peers are OVER-approximated (nothing
58
+ * `replaced`, so every self-read is an edge — edges are only added, a cycle
59
+ * never hidden). A cyclic component holding a candidate node and such a
60
+ * device refuses NAMING the device ("possible cycle"); a component without a
61
+ * candidate node is never this save's cycle (`findCandidateCycles`).
62
+ */
63
+ readonly unreadTargets?: ReadonlyMap<string, string>;
39
64
  }
40
- export interface CompositionPlanResult {
41
- readonly problems: readonly CompositionProblem[];
42
- readonly fields: readonly CompositionFieldPlan[];
43
- }
44
- export declare function planComposition(composition: Composition, lookupCap: CapabilityLookup): CompositionPlanResult;
65
+ export type { CompositionPlanResult } from './plan-result.js';
66
+ /** The candidate's block id before its first save. Stored block ids are `randomUUID()`, so none can carry it. */
67
+ export declare const PENDING_BLOCK_ID = "(unsaved)";
68
+ /**
69
+ * The static plan. `target` describes an EXISTING target device (one read);
70
+ * it is ignored for a new one. On an existing target each feature REPLACES a
71
+ * cap the device has natively, else ADDS it (D663).
72
+ */
73
+ export declare function planComposition(composition: Composition, lookupCap: CapabilityLookup, target?: CompositionTargetDescription): CompositionPlanResult;
45
74
  export declare function compositionSourceRefs(composition: Composition): readonly CompositionSourceRef[];
75
+ /**
76
+ * `compositionFieldKey` of every field a REPLACE feature of `plan` owns — the
77
+ * candidate's own, and a stored peer's `CompositionPeer.replaced` (D663): one
78
+ * derivation, so the graph reads both the same way.
79
+ */
80
+ export declare function replacedFieldKeys(plan: CompositionPlanResult): ReadonlySet<string>;
46
81
  export declare function validateComposition(composition: Composition, ctx: ValidateCompositionContext): CompositionValidation;