@shepherdjerred/home-assistant 0.1.0-dev.14474

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 (73) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +674 -0
  3. package/README.md +126 -0
  4. package/demos/codegen-fixture.cast +40 -0
  5. package/demos/home-assistant-fixture.json +33 -0
  6. package/demos/record-codegen-demo.sh +119 -0
  7. package/dist/codegen/cli.d.ts +3 -0
  8. package/dist/codegen/cli.d.ts.map +1 -0
  9. package/dist/codegen/cli.js +118 -0
  10. package/dist/codegen/cli.js.map +1 -0
  11. package/dist/codegen/emit.d.ts +8 -0
  12. package/dist/codegen/emit.d.ts.map +1 -0
  13. package/dist/codegen/emit.js +143 -0
  14. package/dist/codegen/emit.js.map +1 -0
  15. package/dist/codegen/introspect.d.ts +193 -0
  16. package/dist/codegen/introspect.d.ts.map +1 -0
  17. package/dist/codegen/introspect.js +131 -0
  18. package/dist/codegen/introspect.js.map +1 -0
  19. package/dist/codegen/known-events.d.ts +10 -0
  20. package/dist/codegen/known-events.d.ts.map +1 -0
  21. package/dist/codegen/known-events.js +25 -0
  22. package/dist/codegen/known-events.js.map +1 -0
  23. package/dist/codegen/selector-to-ts.d.ts +15 -0
  24. package/dist/codegen/selector-to-ts.d.ts.map +1 -0
  25. package/dist/codegen/selector-to-ts.js +110 -0
  26. package/dist/codegen/selector-to-ts.js.map +1 -0
  27. package/dist/index.d.ts +14 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +7 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/rest/client.d.ts +34 -0
  32. package/dist/rest/client.d.ts.map +1 -0
  33. package/dist/rest/client.js +112 -0
  34. package/dist/rest/client.js.map +1 -0
  35. package/dist/rest/errors.d.ts +12 -0
  36. package/dist/rest/errors.d.ts.map +1 -0
  37. package/dist/rest/errors.js +23 -0
  38. package/dist/rest/errors.js.map +1 -0
  39. package/dist/rest/schemas.d.ts +124 -0
  40. package/dist/rest/schemas.d.ts.map +1 -0
  41. package/dist/rest/schemas.js +64 -0
  42. package/dist/rest/schemas.js.map +1 -0
  43. package/dist/schema/types.d.ts +138 -0
  44. package/dist/schema/types.d.ts.map +1 -0
  45. package/dist/schema/types.js +12 -0
  46. package/dist/schema/types.js.map +1 -0
  47. package/dist/shared/config.d.ts +6 -0
  48. package/dist/shared/config.d.ts.map +1 -0
  49. package/dist/shared/config.js +4 -0
  50. package/dist/shared/config.js.map +1 -0
  51. package/dist/ws/client.d.ts +58 -0
  52. package/dist/ws/client.d.ts.map +1 -0
  53. package/dist/ws/client.js +343 -0
  54. package/dist/ws/client.js.map +1 -0
  55. package/dist/ws/errors.d.ts +14 -0
  56. package/dist/ws/errors.d.ts.map +1 -0
  57. package/dist/ws/errors.js +27 -0
  58. package/dist/ws/errors.js.map +1 -0
  59. package/dist/ws/messages.d.ts +130 -0
  60. package/dist/ws/messages.d.ts.map +1 -0
  61. package/dist/ws/messages.js +79 -0
  62. package/dist/ws/messages.js.map +1 -0
  63. package/dist/ws/socket-helpers.d.ts +23 -0
  64. package/dist/ws/socket-helpers.d.ts.map +1 -0
  65. package/dist/ws/socket-helpers.js +73 -0
  66. package/dist/ws/socket-helpers.js.map +1 -0
  67. package/dist/ws/subscriptions.d.ts +37 -0
  68. package/dist/ws/subscriptions.d.ts.map +1 -0
  69. package/dist/ws/subscriptions.js +58 -0
  70. package/dist/ws/subscriptions.js.map +1 -0
  71. package/examples/basic-client.mjs +18 -0
  72. package/examples/codegen-fixture.mjs +95 -0
  73. package/package.json +69 -0
@@ -0,0 +1,193 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * REST-level introspection of a live Home Assistant instance. Hits the four
4
+ * endpoints we need — /api/states, /api/services, /api/events, /api/config —
5
+ * and returns validated payloads. Fails fast on any HTTP error.
6
+ */
7
+ export declare const EntityStateSnapshot: z.ZodObject<{
8
+ entity_id: z.ZodString;
9
+ state: z.ZodString;
10
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
11
+ }, z.core.$loose>;
12
+ export type EntityStateSnapshot = z.infer<typeof EntityStateSnapshot>;
13
+ export declare const ServiceFieldSelectorEntity: z.ZodObject<{
14
+ entity: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
15
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
16
+ }, z.core.$loose>, z.ZodArray<z.ZodObject<{
17
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
18
+ }, z.core.$loose>>]>>;
19
+ }, z.core.$loose>;
20
+ export declare const ServiceFieldSelector: z.ZodObject<{
21
+ number: z.ZodOptional<z.ZodUnknown>;
22
+ text: z.ZodOptional<z.ZodUnknown>;
23
+ boolean: z.ZodOptional<z.ZodUnknown>;
24
+ entity: z.ZodOptional<z.ZodUnknown>;
25
+ object: z.ZodOptional<z.ZodUnknown>;
26
+ template: z.ZodOptional<z.ZodUnknown>;
27
+ select: z.ZodOptional<z.ZodObject<{
28
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
29
+ value: z.ZodString;
30
+ }, z.core.$loose>]>>>;
31
+ }, z.core.$loose>>;
32
+ }, z.core.$loose>;
33
+ export type ServiceFieldSelector = z.infer<typeof ServiceFieldSelector>;
34
+ export declare const ServiceFieldSpec: z.ZodObject<{
35
+ required: z.ZodOptional<z.ZodBoolean>;
36
+ description: z.ZodOptional<z.ZodString>;
37
+ example: z.ZodOptional<z.ZodUnknown>;
38
+ default: z.ZodOptional<z.ZodUnknown>;
39
+ selector: z.ZodOptional<z.ZodObject<{
40
+ number: z.ZodOptional<z.ZodUnknown>;
41
+ text: z.ZodOptional<z.ZodUnknown>;
42
+ boolean: z.ZodOptional<z.ZodUnknown>;
43
+ entity: z.ZodOptional<z.ZodUnknown>;
44
+ object: z.ZodOptional<z.ZodUnknown>;
45
+ template: z.ZodOptional<z.ZodUnknown>;
46
+ select: z.ZodOptional<z.ZodObject<{
47
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
48
+ value: z.ZodString;
49
+ }, z.core.$loose>]>>>;
50
+ }, z.core.$loose>>;
51
+ }, z.core.$loose>>;
52
+ }, z.core.$loose>;
53
+ export type ServiceFieldSpec = z.infer<typeof ServiceFieldSpec>;
54
+ export declare const ServiceTargetSpec: z.ZodObject<{
55
+ entity: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
56
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
57
+ }, z.core.$loose>, z.ZodArray<z.ZodObject<{
58
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
59
+ }, z.core.$loose>>]>>;
60
+ }, z.core.$loose>;
61
+ export type ServiceTargetSpec = z.infer<typeof ServiceTargetSpec>;
62
+ export declare const ServiceSpec: z.ZodObject<{
63
+ name: z.ZodOptional<z.ZodString>;
64
+ description: z.ZodOptional<z.ZodString>;
65
+ fields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
66
+ required: z.ZodOptional<z.ZodBoolean>;
67
+ description: z.ZodOptional<z.ZodString>;
68
+ example: z.ZodOptional<z.ZodUnknown>;
69
+ default: z.ZodOptional<z.ZodUnknown>;
70
+ selector: z.ZodOptional<z.ZodObject<{
71
+ number: z.ZodOptional<z.ZodUnknown>;
72
+ text: z.ZodOptional<z.ZodUnknown>;
73
+ boolean: z.ZodOptional<z.ZodUnknown>;
74
+ entity: z.ZodOptional<z.ZodUnknown>;
75
+ object: z.ZodOptional<z.ZodUnknown>;
76
+ template: z.ZodOptional<z.ZodUnknown>;
77
+ select: z.ZodOptional<z.ZodObject<{
78
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
79
+ value: z.ZodString;
80
+ }, z.core.$loose>]>>>;
81
+ }, z.core.$loose>>;
82
+ }, z.core.$loose>>;
83
+ }, z.core.$loose>>>;
84
+ target: z.ZodOptional<z.ZodObject<{
85
+ entity: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
86
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
87
+ }, z.core.$loose>, z.ZodArray<z.ZodObject<{
88
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
89
+ }, z.core.$loose>>]>>;
90
+ }, z.core.$loose>>;
91
+ response: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
92
+ optional: z.ZodOptional<z.ZodBoolean>;
93
+ }, z.core.$loose>]>>;
94
+ }, z.core.$loose>;
95
+ export type ServiceSpec = z.infer<typeof ServiceSpec>;
96
+ export declare const DomainServicesEntry: z.ZodObject<{
97
+ domain: z.ZodString;
98
+ services: z.ZodRecord<z.ZodString, z.ZodObject<{
99
+ name: z.ZodOptional<z.ZodString>;
100
+ description: z.ZodOptional<z.ZodString>;
101
+ fields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
102
+ required: z.ZodOptional<z.ZodBoolean>;
103
+ description: z.ZodOptional<z.ZodString>;
104
+ example: z.ZodOptional<z.ZodUnknown>;
105
+ default: z.ZodOptional<z.ZodUnknown>;
106
+ selector: z.ZodOptional<z.ZodObject<{
107
+ number: z.ZodOptional<z.ZodUnknown>;
108
+ text: z.ZodOptional<z.ZodUnknown>;
109
+ boolean: z.ZodOptional<z.ZodUnknown>;
110
+ entity: z.ZodOptional<z.ZodUnknown>;
111
+ object: z.ZodOptional<z.ZodUnknown>;
112
+ template: z.ZodOptional<z.ZodUnknown>;
113
+ select: z.ZodOptional<z.ZodObject<{
114
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
115
+ value: z.ZodString;
116
+ }, z.core.$loose>]>>>;
117
+ }, z.core.$loose>>;
118
+ }, z.core.$loose>>;
119
+ }, z.core.$loose>>>;
120
+ target: z.ZodOptional<z.ZodObject<{
121
+ entity: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
122
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
123
+ }, z.core.$loose>, z.ZodArray<z.ZodObject<{
124
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
125
+ }, z.core.$loose>>]>>;
126
+ }, z.core.$loose>>;
127
+ response: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
128
+ optional: z.ZodOptional<z.ZodBoolean>;
129
+ }, z.core.$loose>]>>;
130
+ }, z.core.$loose>>;
131
+ }, z.core.$strip>;
132
+ export type DomainServicesEntry = z.infer<typeof DomainServicesEntry>;
133
+ export declare const ServicesResponse: z.ZodArray<z.ZodObject<{
134
+ domain: z.ZodString;
135
+ services: z.ZodRecord<z.ZodString, z.ZodObject<{
136
+ name: z.ZodOptional<z.ZodString>;
137
+ description: z.ZodOptional<z.ZodString>;
138
+ fields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
139
+ required: z.ZodOptional<z.ZodBoolean>;
140
+ description: z.ZodOptional<z.ZodString>;
141
+ example: z.ZodOptional<z.ZodUnknown>;
142
+ default: z.ZodOptional<z.ZodUnknown>;
143
+ selector: z.ZodOptional<z.ZodObject<{
144
+ number: z.ZodOptional<z.ZodUnknown>;
145
+ text: z.ZodOptional<z.ZodUnknown>;
146
+ boolean: z.ZodOptional<z.ZodUnknown>;
147
+ entity: z.ZodOptional<z.ZodUnknown>;
148
+ object: z.ZodOptional<z.ZodUnknown>;
149
+ template: z.ZodOptional<z.ZodUnknown>;
150
+ select: z.ZodOptional<z.ZodObject<{
151
+ options: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
152
+ value: z.ZodString;
153
+ }, z.core.$loose>]>>>;
154
+ }, z.core.$loose>>;
155
+ }, z.core.$loose>>;
156
+ }, z.core.$loose>>>;
157
+ target: z.ZodOptional<z.ZodObject<{
158
+ entity: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
159
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
160
+ }, z.core.$loose>, z.ZodArray<z.ZodObject<{
161
+ domain: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
162
+ }, z.core.$loose>>]>>;
163
+ }, z.core.$loose>>;
164
+ response: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
165
+ optional: z.ZodOptional<z.ZodBoolean>;
166
+ }, z.core.$loose>]>>;
167
+ }, z.core.$loose>>;
168
+ }, z.core.$strip>>;
169
+ export type ServicesResponse = z.infer<typeof ServicesResponse>;
170
+ export declare const EventListEntry: z.ZodObject<{
171
+ event: z.ZodString;
172
+ listener_count: z.ZodOptional<z.ZodNumber>;
173
+ }, z.core.$loose>;
174
+ export type EventListEntry = z.infer<typeof EventListEntry>;
175
+ export declare const EventsResponse: z.ZodArray<z.ZodObject<{
176
+ event: z.ZodString;
177
+ listener_count: z.ZodOptional<z.ZodNumber>;
178
+ }, z.core.$loose>>;
179
+ export type EventsResponse = z.infer<typeof EventsResponse>;
180
+ export declare const ConfigResponse: z.ZodObject<{
181
+ version: z.ZodOptional<z.ZodString>;
182
+ components: z.ZodOptional<z.ZodArray<z.ZodString>>;
183
+ time_zone: z.ZodOptional<z.ZodString>;
184
+ }, z.core.$loose>;
185
+ export type ConfigResponse = z.infer<typeof ConfigResponse>;
186
+ export type HaIntrospection = {
187
+ states: EntityStateSnapshot[];
188
+ services: ServicesResponse;
189
+ events: EventsResponse;
190
+ config: ConfigResponse;
191
+ };
192
+ export declare function introspect(baseUrl: string, token: string): Promise<HaIntrospection>;
193
+ //# sourceMappingURL=introspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../src/codegen/introspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,eAAO,MAAM,mBAAmB;;;;iBAMtB,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,eAAO,MAAM,0BAA0B;;;;;;iBAmB7B,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;;;;;;;iBAiBvB,CAAC;AACX,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;iBAQnB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;iBAmBpB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAad,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAA+B,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,cAAc;;;iBAKjB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc;;;kBAA0B,CAAC;AACtD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc;;;;iBAMjB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAS1B"}
@@ -0,0 +1,131 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * REST-level introspection of a live Home Assistant instance. Hits the four
4
+ * endpoints we need — /api/states, /api/services, /api/events, /api/config —
5
+ * and returns validated payloads. Fails fast on any HTTP error.
6
+ */
7
+ export const EntityStateSnapshot = z
8
+ .object({
9
+ entity_id: z.string(),
10
+ state: z.string(),
11
+ attributes: z.record(z.string(), z.unknown()),
12
+ })
13
+ .loose();
14
+ export const ServiceFieldSelectorEntity = z
15
+ .object({
16
+ entity: z
17
+ .union([
18
+ z
19
+ .object({
20
+ domain: z.union([z.string(), z.array(z.string())]).optional(),
21
+ })
22
+ .loose(),
23
+ z.array(z
24
+ .object({
25
+ domain: z.union([z.string(), z.array(z.string())]).optional(),
26
+ })
27
+ .loose()),
28
+ ])
29
+ .optional(),
30
+ })
31
+ .loose();
32
+ export const ServiceFieldSelector = z
33
+ .object({
34
+ number: z.unknown().optional(),
35
+ text: z.unknown().optional(),
36
+ boolean: z.unknown().optional(),
37
+ entity: z.unknown().optional(),
38
+ object: z.unknown().optional(),
39
+ template: z.unknown().optional(),
40
+ select: z
41
+ .object({
42
+ options: z
43
+ .array(z.union([z.string(), z.object({ value: z.string() }).loose()]))
44
+ .optional(),
45
+ })
46
+ .loose()
47
+ .optional(),
48
+ })
49
+ .loose();
50
+ export const ServiceFieldSpec = z
51
+ .object({
52
+ required: z.boolean().optional(),
53
+ description: z.string().optional(),
54
+ example: z.unknown().optional(),
55
+ default: z.unknown().optional(),
56
+ selector: ServiceFieldSelector.optional(),
57
+ })
58
+ .loose();
59
+ export const ServiceTargetSpec = z
60
+ .object({
61
+ entity: z
62
+ .union([
63
+ z
64
+ .object({
65
+ domain: z.union([z.string(), z.array(z.string())]).optional(),
66
+ })
67
+ .loose(),
68
+ z.array(z
69
+ .object({
70
+ domain: z.union([z.string(), z.array(z.string())]).optional(),
71
+ })
72
+ .loose()),
73
+ ])
74
+ .optional(),
75
+ })
76
+ .loose();
77
+ export const ServiceSpec = z
78
+ .object({
79
+ name: z.string().optional(),
80
+ description: z.string().optional(),
81
+ fields: z.record(z.string(), ServiceFieldSpec).optional(),
82
+ target: ServiceTargetSpec.optional(),
83
+ response: z
84
+ .union([
85
+ z.boolean(),
86
+ z.object({ optional: z.boolean().optional() }).loose(),
87
+ ])
88
+ .optional(),
89
+ })
90
+ .loose();
91
+ export const DomainServicesEntry = z.object({
92
+ domain: z.string(),
93
+ services: z.record(z.string(), ServiceSpec),
94
+ });
95
+ export const ServicesResponse = z.array(DomainServicesEntry);
96
+ export const EventListEntry = z
97
+ .object({
98
+ event: z.string(),
99
+ listener_count: z.number().optional(),
100
+ })
101
+ .loose();
102
+ export const EventsResponse = z.array(EventListEntry);
103
+ export const ConfigResponse = z
104
+ .object({
105
+ version: z.string().optional(),
106
+ components: z.array(z.string()).optional(),
107
+ time_zone: z.string().optional(),
108
+ })
109
+ .loose();
110
+ export async function introspect(baseUrl, token) {
111
+ const normalized = baseUrl.replace(/\/+$/u, "");
112
+ const [states, services, events, config] = await Promise.all([
113
+ fetchJson(normalized, token, "/api/states", z.array(EntityStateSnapshot)),
114
+ fetchJson(normalized, token, "/api/services", ServicesResponse),
115
+ fetchJson(normalized, token, "/api/events", EventsResponse),
116
+ fetchJson(normalized, token, "/api/config", ConfigResponse),
117
+ ]);
118
+ return { states, services, events, config };
119
+ }
120
+ async function fetchJson(baseUrl, token, path, schema) {
121
+ const response = await fetch(`${baseUrl}${path}`, {
122
+ headers: { Authorization: `Bearer ${token}` },
123
+ });
124
+ if (!response.ok) {
125
+ const text = await response.text().catch(() => "");
126
+ throw new Error(`ha-codegen: GET ${path} failed: ${String(response.status)} ${response.statusText}${text === "" ? "" : ` — ${text}`}`);
127
+ }
128
+ const body = (await response.json());
129
+ return schema.parse(body);
130
+ }
131
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/codegen/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hand-curated event data shapes for well-known Home Assistant event types.
3
+ * These are layered under the generated event list so consumers get narrowed
4
+ * `event.data` payloads on common subscriptions without having to declare
5
+ * them themselves. Unknown events default to `Record<string, unknown>`.
6
+ *
7
+ * Source: Home Assistant core event definitions.
8
+ */
9
+ export declare const KNOWN_EVENT_DATA: Readonly<Record<string, string>>;
10
+ //# sourceMappingURL=known-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-events.d.ts","sourceRoot":"","sources":["../../src/codegen/known-events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAepD,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Hand-curated event data shapes for well-known Home Assistant event types.
3
+ * These are layered under the generated event list so consumers get narrowed
4
+ * `event.data` payloads on common subscriptions without having to declare
5
+ * them themselves. Unknown events default to `Record<string, unknown>`.
6
+ *
7
+ * Source: Home Assistant core event definitions.
8
+ */
9
+ export const KNOWN_EVENT_DATA = {
10
+ state_changed: `{ entity_id: string; old_state: unknown; new_state: unknown }`,
11
+ call_service: `{ domain: string; service: string; service_data?: Record<string, unknown>; service_call_id?: string }`,
12
+ service_registered: `{ domain: string; service: string }`,
13
+ service_removed: `{ domain: string; service: string }`,
14
+ component_loaded: `{ component: string }`,
15
+ automation_triggered: `{ name: string; entity_id: string; source?: string }`,
16
+ script_started: `{ name: string; entity_id: string }`,
17
+ homeassistant_start: `Record<string, never>`,
18
+ homeassistant_started: `Record<string, never>`,
19
+ homeassistant_stop: `Record<string, never>`,
20
+ homeassistant_final_write: `Record<string, never>`,
21
+ user_added: `{ user_id: string }`,
22
+ user_removed: `{ user_id: string }`,
23
+ logbook_entry: `{ name?: string; message?: string; entity_id?: string; domain?: string }`,
24
+ };
25
+ //# sourceMappingURL=known-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-events.js","sourceRoot":"","sources":["../../src/codegen/known-events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,aAAa,EAAE,+DAA+D;IAC9E,YAAY,EAAE,uGAAuG;IACrH,kBAAkB,EAAE,qCAAqC;IACzD,eAAe,EAAE,qCAAqC;IACtD,gBAAgB,EAAE,uBAAuB;IACzC,oBAAoB,EAAE,sDAAsD;IAC5E,cAAc,EAAE,qCAAqC;IACrD,mBAAmB,EAAE,uBAAuB;IAC5C,qBAAqB,EAAE,uBAAuB;IAC9C,kBAAkB,EAAE,uBAAuB;IAC3C,yBAAyB,EAAE,uBAAuB;IAClD,UAAU,EAAE,qBAAqB;IACjC,YAAY,EAAE,qBAAqB;IACnC,aAAa,EAAE,0EAA0E;CACjF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { HaFieldType } from "../schema/types.js";
2
+ import type { ServiceFieldSpec, ServiceTargetSpec } from "./introspect.js";
3
+ /**
4
+ * Translate an HA field spec (selector + metadata) into the structural shape
5
+ * the runtime HaServiceFieldMeta records carry at compile time.
6
+ */
7
+ export type FieldMeta = {
8
+ type: HaFieldType;
9
+ required: boolean;
10
+ domain?: string;
11
+ options?: string[];
12
+ };
13
+ export declare function fieldMetaFromSpec(spec: ServiceFieldSpec): FieldMeta;
14
+ export declare function targetDomainFromSpec(target: ServiceTargetSpec | undefined): string | undefined;
15
+ //# sourceMappingURL=selector-to-ts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector-to-ts.d.ts","sourceRoot":"","sources":["../../src/codegen/selector-to-ts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAEV,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAgBF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAmCnE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,MAAM,GAAG,SAAS,CAKpB"}
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ const SelectOptionStringSchema = z.string();
3
+ const SelectOptionObjectSchema = z.object({ value: z.string() }).loose();
4
+ const EntityDescriptorSchema = z
5
+ .object({
6
+ domain: z.union([z.string(), z.array(z.string())]).optional(),
7
+ })
8
+ .loose();
9
+ const EntityFieldSchema = z
10
+ .object({
11
+ entity: z.union([EntityDescriptorSchema, z.array(EntityDescriptorSchema)]),
12
+ })
13
+ .loose();
14
+ export function fieldMetaFromSpec(spec) {
15
+ const required = spec.required === true;
16
+ const selector = spec.selector;
17
+ if (selector === undefined) {
18
+ return { type: inferFromExample(spec), required };
19
+ }
20
+ if (selector.number !== undefined) {
21
+ return { type: "number", required };
22
+ }
23
+ if (selector.boolean !== undefined) {
24
+ return { type: "boolean", required };
25
+ }
26
+ if (selector.text !== undefined || selector.template !== undefined) {
27
+ return { type: "string", required };
28
+ }
29
+ if (selector.select !== undefined) {
30
+ const options = extractSelectOptions(selector);
31
+ return {
32
+ type: "string",
33
+ required,
34
+ ...(options !== undefined && { options }),
35
+ };
36
+ }
37
+ if (selector.object !== undefined) {
38
+ return { type: "object", required };
39
+ }
40
+ if (selector.entity !== undefined) {
41
+ const domain = extractEntityDomain(selector);
42
+ return {
43
+ type: "entity",
44
+ required,
45
+ ...(domain !== undefined && { domain }),
46
+ };
47
+ }
48
+ return { type: "unknown", required };
49
+ }
50
+ export function targetDomainFromSpec(target) {
51
+ if (target === undefined) {
52
+ return undefined;
53
+ }
54
+ return extractEntityDomain(target);
55
+ }
56
+ function extractSelectOptions(selector) {
57
+ const select = selector.select;
58
+ if (select?.options === undefined) {
59
+ return undefined;
60
+ }
61
+ const out = [];
62
+ for (const opt of select.options) {
63
+ const asString = SelectOptionStringSchema.safeParse(opt);
64
+ if (asString.success) {
65
+ out.push(asString.data);
66
+ continue;
67
+ }
68
+ const asObject = SelectOptionObjectSchema.safeParse(opt);
69
+ if (asObject.success) {
70
+ out.push(asObject.data.value);
71
+ }
72
+ }
73
+ return out.length > 0 ? out : undefined;
74
+ }
75
+ function extractEntityDomain(obj) {
76
+ const parsed = EntityFieldSchema.safeParse(obj);
77
+ if (!parsed.success) {
78
+ return undefined;
79
+ }
80
+ const entity = parsed.data.entity;
81
+ const descriptor = Array.isArray(entity) ? entity[0] : entity;
82
+ if (descriptor === undefined) {
83
+ return undefined;
84
+ }
85
+ const domain = descriptor.domain;
86
+ if (typeof domain === "string") {
87
+ return domain;
88
+ }
89
+ if (Array.isArray(domain) && typeof domain[0] === "string") {
90
+ return domain[0];
91
+ }
92
+ return undefined;
93
+ }
94
+ function inferFromExample(spec) {
95
+ const example = spec.example;
96
+ if (typeof example === "number") {
97
+ return "number";
98
+ }
99
+ if (typeof example === "boolean") {
100
+ return "boolean";
101
+ }
102
+ if (typeof example === "string") {
103
+ return "string";
104
+ }
105
+ if (example !== null && typeof example === "object") {
106
+ return "object";
107
+ }
108
+ return "unknown";
109
+ }
110
+ //# sourceMappingURL=selector-to-ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector-to-ts.js","sourceRoot":"","sources":["../../src/codegen/selector-to-ts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { HomeAssistantRestClient } from "./rest/client.js";
2
+ export type { CallServiceOptions, HistoryOptions } from "./rest/client.js";
3
+ export { HaApiError, HaAuthError, HaNotFoundError } from "./rest/errors.js";
4
+ export type { EntityState, HaConfig, ServiceCallResult, ServiceCallChangedStates, ServiceCallWithResponse, HistoryResponse, FireEventResponse, ConfigEntryDiagnostics, } from "./rest/schemas.js";
5
+ export { EntityState as EntityStateSchema, HaConfig as HaConfigSchema, ServiceCallResult as ServiceCallResultSchema, ServiceCallChangedStates as ServiceCallChangedStatesSchema, ServiceCallWithResponse as ServiceCallWithResponseSchema, HistoryResponse as HistoryResponseSchema, FireEventResponse as FireEventResponseSchema, ConfigEntryDiagnostics as ConfigEntryDiagnosticsSchema, } from "./rest/schemas.js";
6
+ export { HomeAssistantEventClient } from "./ws/client.js";
7
+ export type { ConnectionStateListener, HomeAssistantEventClientOptions, } from "./ws/client.js";
8
+ export { HaWebSocketError, HaWebSocketAuthError, HaWebSocketClosedError, HaWebSocketResultError, } from "./ws/errors.js";
9
+ export type { EntityRegistryEntry, EventEnvelope, EventMessage, } from "./ws/messages.js";
10
+ export { EntityRegistryEntry as EntityRegistryEntrySchema, StateChangedEventData as StateChangedEventDataSchema, } from "./ws/messages.js";
11
+ export type { EventHandler, Subscription } from "./ws/subscriptions.js";
12
+ export type { HomeAssistantConfig } from "./shared/config.js";
13
+ export type { Domain, EntityAttributesFor, EntityId, EntityIdByDomain, EntityStateFor, EventDataFor, EventEnvelopeFor, EventType, HaEntityMeta, HaFieldType, HaSchema, HaServiceFieldMeta, HaServiceMeta, DefaultHaSchema, Service, ServiceDataFor, } from "./schema/types.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC5E,YAAY,EACV,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,IAAI,iBAAiB,EAChC,QAAQ,IAAI,cAAc,EAC1B,iBAAiB,IAAI,uBAAuB,EAC5C,wBAAwB,IAAI,8BAA8B,EAC1D,uBAAuB,IAAI,6BAA6B,EACxD,eAAe,IAAI,qBAAqB,EACxC,iBAAiB,IAAI,uBAAuB,EAC5C,sBAAsB,IAAI,4BAA4B,GACvD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,YAAY,EACV,uBAAuB,EACvB,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,IAAI,yBAAyB,EAChD,qBAAqB,IAAI,2BAA2B,GACrD,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,MAAM,EACN,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,OAAO,EACP,cAAc,GACf,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { HomeAssistantRestClient } from "./rest/client.js";
2
+ export { HaApiError, HaAuthError, HaNotFoundError } from "./rest/errors.js";
3
+ export { EntityState as EntityStateSchema, HaConfig as HaConfigSchema, ServiceCallResult as ServiceCallResultSchema, ServiceCallChangedStates as ServiceCallChangedStatesSchema, ServiceCallWithResponse as ServiceCallWithResponseSchema, HistoryResponse as HistoryResponseSchema, FireEventResponse as FireEventResponseSchema, ConfigEntryDiagnostics as ConfigEntryDiagnosticsSchema, } from "./rest/schemas.js";
4
+ export { HomeAssistantEventClient } from "./ws/client.js";
5
+ export { HaWebSocketError, HaWebSocketAuthError, HaWebSocketClosedError, HaWebSocketResultError, } from "./ws/errors.js";
6
+ export { EntityRegistryEntry as EntityRegistryEntrySchema, StateChangedEventData as StateChangedEventDataSchema, } from "./ws/messages.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAW5E,OAAO,EACL,WAAW,IAAI,iBAAiB,EAChC,QAAQ,IAAI,cAAc,EAC1B,iBAAiB,IAAI,uBAAuB,EAC5C,wBAAwB,IAAI,8BAA8B,EAC1D,uBAAuB,IAAI,6BAA6B,EACxD,eAAe,IAAI,qBAAqB,EACxC,iBAAiB,IAAI,uBAAuB,EAC5C,sBAAsB,IAAI,4BAA4B,GACvD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAK1D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACL,mBAAmB,IAAI,yBAAyB,EAChD,qBAAqB,IAAI,2BAA2B,GACrD,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import type { DefaultHaSchema, Domain, EntityId, EventDataFor, EventType, HaSchema, Service, ServiceDataFor } from "../schema/types.js";
3
+ import type { HomeAssistantConfig } from "../shared/config.js";
4
+ import { EntityState, FireEventResponse, HaConfig, HistoryResponse, ServiceCallResult } from "./schemas.js";
5
+ export type CallServiceOptions = {
6
+ returnResponse?: boolean;
7
+ };
8
+ export type HistoryOptions = {
9
+ start?: Date;
10
+ end?: Date;
11
+ minimalResponse?: boolean;
12
+ noAttributes?: boolean;
13
+ significantChangesOnly?: boolean;
14
+ };
15
+ export declare class HomeAssistantRestClient<S extends HaSchema = DefaultHaSchema> {
16
+ private readonly baseUrl;
17
+ private readonly token;
18
+ constructor(config: HomeAssistantConfig);
19
+ getConfig(): Promise<HaConfig>;
20
+ getStates(): Promise<EntityState[]>;
21
+ getState<E extends EntityId<S>>(entityId: E): Promise<Omit<EntityState, "entity_id"> & {
22
+ entity_id: E;
23
+ }>;
24
+ callService<D extends Domain<S>, V extends Service<S, D>>(domain: D, service: V, data?: ServiceDataFor<S, D, V>, options?: CallServiceOptions): Promise<ServiceCallResult>;
25
+ fireEvent<E extends EventType<S>>(eventType: E, data?: EventDataFor<S, E> extends Record<string, unknown> ? EventDataFor<S, E> : Record<string, unknown>): Promise<FireEventResponse>;
26
+ renderTemplate(template: string): Promise<string>;
27
+ getHistory(entityIds: string[], options?: HistoryOptions): Promise<HistoryResponse>;
28
+ getConfigEntryDiagnostics<T>(configEntryId: string, dataSchema: z.ZodType<T>): Promise<T>;
29
+ private buildServicePath;
30
+ private request;
31
+ private assertOk;
32
+ private rawRequest;
33
+ }
34
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rest/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,eAAe,EACf,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,OAAO,EACP,cAAc,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EACL,WAAW,EAEX,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAIF,qBAAa,uBAAuB,CAAC,CAAC,SAAS,QAAQ,GAAG,eAAe;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,YAAmB,MAAM,EAAE,mBAAmB,EAG7C;IAEY,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,CAG1C;IAEY,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAG/C;IAEY,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EACzC,QAAQ,EAAE,CAAC,GACV,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,CAAC,CAQ5D;IAEY,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACnE,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,CAAC,EACV,IAAI,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAM5B;IAEY,SAAS,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAC3C,SAAS,EAAE,CAAC,EACZ,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrD,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAO5B;IAEY,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7D;IAEY,UAAU,CACrB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAmB1B;IAEY,yBAAyB,CAAC,CAAC,EACtC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAIZ;IAED,OAAO,CAAC,gBAAgB;YAYV,OAAO;YAcP,QAAQ;IAwBtB,OAAO,CAAC,UAAU;CAgBnB"}