@wyndlass/app-sdk 0.0.0-stage → 1.0.0

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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -2
  3. package/cli/app-package.mjs +111 -0
  4. package/cli/commands.mjs +114 -0
  5. package/cli/main.mjs +66 -0
  6. package/cli/package.mjs +119 -0
  7. package/cli/preview.mjs +142 -0
  8. package/cli/zip.mjs +63 -0
  9. package/dist/contract/app-contract.d.ts +221 -0
  10. package/dist/contract/app-contract.js +6 -0
  11. package/dist/contract/app-definition.d.ts +155 -0
  12. package/dist/contract/app-definition.js +3 -0
  13. package/dist/contract/data-answer.d.ts +40 -0
  14. package/dist/contract/data-answer.js +3 -0
  15. package/dist/contract/data-calendar.d.ts +57 -0
  16. package/dist/contract/data-calendar.js +3 -0
  17. package/dist/contract/data-news.d.ts +29 -0
  18. package/dist/contract/data-news.js +3 -0
  19. package/dist/contract/data-quotes.d.ts +75 -0
  20. package/dist/contract/data-quotes.js +3 -0
  21. package/dist/contract/data-series.d.ts +51 -0
  22. package/dist/contract/data-series.js +3 -0
  23. package/dist/contract/data-snapshot.d.ts +30 -0
  24. package/dist/contract/data-snapshot.js +3 -0
  25. package/dist/contract/data-weather.d.ts +421 -0
  26. package/dist/contract/data-weather.js +3 -0
  27. package/dist/contract/player-api-event.d.ts +253 -0
  28. package/dist/contract/player-api-event.js +3 -0
  29. package/dist/contract/player-api-status.d.ts +178 -0
  30. package/dist/contract/player-api-status.js +3 -0
  31. package/dist/easing.d.ts +16 -0
  32. package/dist/easing.js +71 -0
  33. package/dist/index.d.ts +94 -0
  34. package/dist/index.js +218 -0
  35. package/dist/preview/frame/frame.js +2 -0
  36. package/dist/preview/frame/index.html +12 -0
  37. package/dist/preview/index.html +40 -0
  38. package/dist/preview/page.js +7 -0
  39. package/dist/qr.d.ts +5 -0
  40. package/dist/qr.js +14 -0
  41. package/dist/react.d.ts +52 -0
  42. package/dist/react.js +149 -0
  43. package/package.json +83 -3
  44. package/protocol/app-definition.schema.json +435 -0
  45. package/protocol/app-packages.json +172 -0
  46. package/protocol/common.schema.json +197 -0
  47. package/protocol/samples/calendar.json +63 -0
  48. package/protocol/samples/events/app.command.json +14 -0
  49. package/protocol/samples/events/item.end.json +13 -0
  50. package/protocol/samples/events/item.start.json +18 -0
  51. package/protocol/samples/events/state.changed.json +11 -0
  52. package/protocol/samples/news.json +37 -0
  53. package/protocol/samples/player-status.json +58 -0
  54. package/protocol/samples/weather.json +59 -0
  55. package/templates/react/AGENTS.md +13 -0
  56. package/templates/react/README.md +22 -0
  57. package/templates/react/app.json +14 -0
  58. package/templates/react/gitignore +2 -0
  59. package/templates/react/package.json +22 -0
  60. package/templates/react/src/app.css +7 -0
  61. package/templates/react/src/app.tsx +39 -0
  62. package/templates/react/src/env.d.ts +5 -0
  63. package/templates/react/tsconfig.json +13 -0
  64. package/templates/vanilla/AGENTS.md +13 -0
  65. package/templates/vanilla/README.md +22 -0
  66. package/templates/vanilla/app.json +14 -0
  67. package/templates/vanilla/gitignore +2 -0
  68. package/templates/vanilla/package.json +18 -0
  69. package/templates/vanilla/src/app.css +7 -0
  70. package/templates/vanilla/src/app.ts +59 -0
  71. package/templates/vanilla/src/env.d.ts +5 -0
  72. package/templates/vanilla/tsconfig.json +12 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * An instant in UTC (2026-10-14T14:00:00Z); a date (2026-10-14) for a whole-day event; a local time (2026-10-14T09:00:00) for a floating one.
3
+ */
4
+ export type Time = string;
5
+ /**
6
+ * The data service's calendar from an iCalendar, jCal or xCal feed (ADR 0069, WP-0111): the occurrences in the window asked for, repeats and time zones worked out, in time order. Attendees, organizers, alarms and attachments are never carried; a private event has no title, place or description.
7
+ */
8
+ export interface Calendar {
9
+ calendar: {
10
+ /**
11
+ * X-WR-CALNAME, or NAME (RFC 7986).
12
+ */
13
+ name?: string;
14
+ /**
15
+ * X-WR-TIMEZONE, as the calendar gives it.
16
+ */
17
+ timeZone?: string;
18
+ };
19
+ /**
20
+ * @maxItems 1000
21
+ */
22
+ events: {
23
+ /**
24
+ * The event's UID; for a repeat or a changed occurrence, the UID and the occurrence's start (20261014T140000Z).
25
+ */
26
+ id: string;
27
+ title?: string;
28
+ location?: string;
29
+ /**
30
+ * Plain text: markup stripped.
31
+ */
32
+ description?: string;
33
+ start: Time;
34
+ end: Time;
35
+ /**
36
+ * A whole-day event: start and end are dates, the end exclusive.
37
+ */
38
+ allDay?: true;
39
+ /**
40
+ * A floating event: start and end are local times with no zone, read in the screen's time zone.
41
+ */
42
+ floating?: true;
43
+ tentative?: true;
44
+ /**
45
+ * TRANSP:TRANSPARENT: the event does not make its calendar busy.
46
+ */
47
+ free?: true;
48
+ /**
49
+ * CLASS:PRIVATE or CONFIDENTIAL: its title, place and description are left out.
50
+ */
51
+ private?: true;
52
+ }[];
53
+ /**
54
+ * The window held more than 1,000 occurrences: the ones nearest the time asked are kept.
55
+ */
56
+ truncated?: true;
57
+ }
@@ -0,0 +1,3 @@
1
+ // Copied from protocol/generated/ts/data-calendar.d.ts by app-sdk/scripts/copy-protocol.mjs: edit the source, then run `pnpm --filter @wyndlass/app-sdk copy-protocol`.
2
+ /* Generated from protocol/schemas by scripts/generate.mjs. Do not edit. */
3
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The data service's news from an RSS 2.0 or Atom 1.0 feed (ADR 0069), each item's image its own or its page's Open Graph image.
3
+ */
4
+ export interface News {
5
+ feed: {
6
+ title: string;
7
+ url: string;
8
+ link?: string;
9
+ image?: string;
10
+ };
11
+ /**
12
+ * @maxItems 50
13
+ */
14
+ items: {
15
+ id?: string;
16
+ title: string;
17
+ /**
18
+ * Plain text: markup stripped.
19
+ */
20
+ summary?: string;
21
+ link: string;
22
+ published?: string;
23
+ author?: string;
24
+ /**
25
+ * The item's image through the data service's image proxy (a path from the service's root), so screens load only from Wyndlass.
26
+ */
27
+ image?: string;
28
+ }[];
29
+ }
@@ -0,0 +1,3 @@
1
+ // Copied from protocol/generated/ts/data-news.d.ts by app-sdk/scripts/copy-protocol.mjs: edit the source, then run `pnpm --filter @wyndlass/app-sdk copy-protocol`.
2
+ /* Generated from protocol/schemas by scripts/generate.mjs. Do not edit. */
3
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Why a symbol has no answer: the provider does not know it, the plan does not cover it, or there is no answer and no earlier one.
3
+ */
4
+ export type Reason = "unknown-symbol" | "not-in-plan" | "unavailable";
5
+ /**
6
+ * The data service's quotes from Twelve Data (ADR 0069, decision 9; WP-0103): each symbol asked for, in the order asked, or why it is missing. A value the provider does not give is left out.
7
+ */
8
+ export interface Quotes {
9
+ /**
10
+ * @maxItems 30
11
+ */
12
+ quotes: {
13
+ /**
14
+ * The symbol as asked, upper-cased: AAPL, EUR/USD, or with its exchange after a colon (TRP:TSX).
15
+ */
16
+ symbol: string;
17
+ name?: string;
18
+ exchange?: string;
19
+ /**
20
+ * The exchange's market identifier code (ISO 10383).
21
+ */
22
+ mic?: string;
23
+ /**
24
+ * The price's currency, where the provider gives one (not for currency pairs or crypto).
25
+ */
26
+ currency?: string;
27
+ /**
28
+ * The latest price.
29
+ */
30
+ price: number;
31
+ /**
32
+ * The price less the previous close.
33
+ */
34
+ change?: number;
35
+ /**
36
+ * The change as a percentage of the previous close.
37
+ */
38
+ percentChange?: number;
39
+ open?: number;
40
+ high?: number;
41
+ low?: number;
42
+ previousClose?: number;
43
+ /**
44
+ * Shares traded today, where there are shares.
45
+ */
46
+ volume?: number;
47
+ averageVolume?: number;
48
+ fiftyTwoWeek?: {
49
+ low: number;
50
+ high: number;
51
+ };
52
+ /**
53
+ * Whether its market is open now.
54
+ */
55
+ marketOpen: boolean;
56
+ /**
57
+ * When the price was quoted.
58
+ */
59
+ time: string;
60
+ /**
61
+ * True when the provider failed and this is the symbol's last quote, kept for up to a day.
62
+ */
63
+ stale: boolean;
64
+ }[];
65
+ /**
66
+ * @maxItems 30
67
+ */
68
+ missing: {
69
+ /**
70
+ * The symbol as asked, upper-cased: AAPL, EUR/USD, or with its exchange after a colon (TRP:TSX).
71
+ */
72
+ symbol: string;
73
+ reason: Reason;
74
+ }[];
75
+ }
@@ -0,0 +1,3 @@
1
+ // Copied from protocol/generated/ts/data-quotes.d.ts by app-sdk/scripts/copy-protocol.mjs: edit the source, then run `pnpm --filter @wyndlass/app-sdk copy-protocol`.
2
+ /* Generated from protocol/schemas by scripts/generate.mjs. Do not edit. */
3
+ export {};
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The data service's prices for one symbol over a range, from Twelve Data (ADR 0069, decision 9; WP-0103), for charts: the bars oldest first, or why the symbol is missing. A value the provider does not give is left out.
3
+ */
4
+ export interface Series {
5
+ /**
6
+ * The symbol as asked, upper-cased: AAPL, EUR/USD, or with its exchange after a colon (TRP:TSX).
7
+ */
8
+ symbol: string;
9
+ /**
10
+ * 1d: the latest trading day in 5-minute bars (the last 24 hours where a market never closes); 5d: 30-minute bars; 1m, 6m and 1y: days; 5y: weeks.
11
+ */
12
+ range: "1d" | "5d" | "1m" | "6m" | "1y" | "5y";
13
+ interval?: "5min" | "30min" | "1day" | "1week";
14
+ exchange?: string;
15
+ mic?: string;
16
+ currency?: string;
17
+ /**
18
+ * The provider's kind of instrument: Common Stock, ETF, Physical Currency, Digital Currency.
19
+ */
20
+ type?: string;
21
+ /**
22
+ * The exchange's time zone (IANA), which a trading day is counted in.
23
+ */
24
+ timeZone?: string;
25
+ /**
26
+ * For 1d and 5d: whether the market is open now, as its last bar is recent.
27
+ */
28
+ marketOpen?: boolean;
29
+ /**
30
+ * For 1d: the close before the day's first bar, which the day's change is measured from.
31
+ */
32
+ previousClose?: number;
33
+ /**
34
+ * @maxItems 400
35
+ */
36
+ points?: {
37
+ /**
38
+ * The bar's start.
39
+ */
40
+ time: string;
41
+ open: number;
42
+ high: number;
43
+ low: number;
44
+ close: number;
45
+ volume?: number;
46
+ }[];
47
+ /**
48
+ * Why a symbol has no answer: the provider does not know it, the plan does not cover it, or there is no answer and no earlier one.
49
+ */
50
+ missing?: "unknown-symbol" | "not-in-plan" | "unavailable";
51
+ }
@@ -0,0 +1,3 @@
1
+ // Copied from protocol/generated/ts/data-series.d.ts by app-sdk/scripts/copy-protocol.mjs: edit the source, then run `pnpm --filter @wyndlass/app-sdk copy-protocol`.
2
+ /* Generated from protocol/schemas by scripts/generate.mjs. Do not edit. */
3
+ export {};
@@ -0,0 +1,30 @@
1
+ /**
2
+ * A column's key: set when the column is added and never changed, so a binding to it survives a relabel.
3
+ */
4
+ export type Key = string;
5
+ /**
6
+ * One version of a data table as screens read it (WP-0072, ADR 0072; ADR 0053 decision 7): a content-addressed JSON blob the manifest's dataSnapshots name. Bindings address a cell by its row's position in rows and its column's key. Values are typed: numbers as numbers, booleans as booleans, dates and date-times as ISO text; an empty cell is left out.
7
+ */
8
+ export interface DataTableSnapshot {
9
+ /**
10
+ * The table's id, as the manifest's dataSnapshots names it.
11
+ */
12
+ table: string;
13
+ version: number;
14
+ /**
15
+ * @minItems 1
16
+ * @maxItems 50
17
+ */
18
+ columns: [Column, ...Column[]];
19
+ /**
20
+ * @maxItems 5000
21
+ */
22
+ rows: {
23
+ [k: string]: (string | number | boolean) | undefined;
24
+ }[];
25
+ }
26
+ export interface Column {
27
+ key: Key;
28
+ label: string;
29
+ type: "text" | "number" | "currency" | "date" | "datetime" | "url" | "boolean";
30
+ }
@@ -0,0 +1,3 @@
1
+ // Copied from protocol/generated/ts/data-snapshot.d.ts by app-sdk/scripts/copy-protocol.mjs: edit the source, then run `pnpm --filter @wyndlass/app-sdk copy-protocol`.
2
+ /* Generated from protocol/schemas by scripts/generate.mjs. Do not edit. */
3
+ export {};
@@ -0,0 +1,421 @@
1
+ /**
2
+ * A WMO weather code in Wyndlass's words; the weather condition leaf compares against these.
3
+ */
4
+ export type Condition = "clear" | "mostly-clear" | "partly-cloudy" | "cloudy" | "fog" | "drizzle" | "freezing-drizzle" | "rain" | "freezing-rain" | "snow" | "snow-grains" | "showers" | "snow-showers" | "thunderstorm" | "hail-thunderstorm" | "unknown";
5
+ /**
6
+ * The data service's weather for a place (ADR 0069): now and the days ahead, in the units asked, and the facts the weather condition leaf reads, always metric. A value the provider does not give is left out.
7
+ */
8
+ export interface Weather {
9
+ place: {
10
+ lat: number;
11
+ lon: number;
12
+ };
13
+ /**
14
+ * metric: °C and km/h; imperial: °F and mph.
15
+ */
16
+ units: "metric" | "imperial";
17
+ /**
18
+ * The place's IANA time zone.
19
+ */
20
+ timeZone: string;
21
+ current: {
22
+ at: string;
23
+ temperature: number;
24
+ apparentTemperature?: number;
25
+ condition: Condition;
26
+ code: number;
27
+ isDay: boolean;
28
+ humidity?: number;
29
+ windSpeed?: number;
30
+ windDirection?: number;
31
+ precipitationProbability?: number;
32
+ };
33
+ /**
34
+ * @maxItems 7
35
+ */
36
+ daily: [] | [
37
+ {
38
+ date: string;
39
+ high: number;
40
+ low: number;
41
+ condition: Condition;
42
+ /**
43
+ * The WMO weather code.
44
+ */
45
+ code: number;
46
+ precipitationProbability?: number;
47
+ sunrise?: string;
48
+ sunset?: string;
49
+ }
50
+ ] | [
51
+ {
52
+ date: string;
53
+ high: number;
54
+ low: number;
55
+ condition: Condition;
56
+ /**
57
+ * The WMO weather code.
58
+ */
59
+ code: number;
60
+ precipitationProbability?: number;
61
+ sunrise?: string;
62
+ sunset?: string;
63
+ },
64
+ {
65
+ date: string;
66
+ high: number;
67
+ low: number;
68
+ condition: Condition;
69
+ /**
70
+ * The WMO weather code.
71
+ */
72
+ code: number;
73
+ precipitationProbability?: number;
74
+ sunrise?: string;
75
+ sunset?: string;
76
+ }
77
+ ] | [
78
+ {
79
+ date: string;
80
+ high: number;
81
+ low: number;
82
+ condition: Condition;
83
+ /**
84
+ * The WMO weather code.
85
+ */
86
+ code: number;
87
+ precipitationProbability?: number;
88
+ sunrise?: string;
89
+ sunset?: string;
90
+ },
91
+ {
92
+ date: string;
93
+ high: number;
94
+ low: number;
95
+ condition: Condition;
96
+ /**
97
+ * The WMO weather code.
98
+ */
99
+ code: number;
100
+ precipitationProbability?: number;
101
+ sunrise?: string;
102
+ sunset?: string;
103
+ },
104
+ {
105
+ date: string;
106
+ high: number;
107
+ low: number;
108
+ condition: Condition;
109
+ /**
110
+ * The WMO weather code.
111
+ */
112
+ code: number;
113
+ precipitationProbability?: number;
114
+ sunrise?: string;
115
+ sunset?: string;
116
+ }
117
+ ] | [
118
+ {
119
+ date: string;
120
+ high: number;
121
+ low: number;
122
+ condition: Condition;
123
+ /**
124
+ * The WMO weather code.
125
+ */
126
+ code: number;
127
+ precipitationProbability?: number;
128
+ sunrise?: string;
129
+ sunset?: string;
130
+ },
131
+ {
132
+ date: string;
133
+ high: number;
134
+ low: number;
135
+ condition: Condition;
136
+ /**
137
+ * The WMO weather code.
138
+ */
139
+ code: number;
140
+ precipitationProbability?: number;
141
+ sunrise?: string;
142
+ sunset?: string;
143
+ },
144
+ {
145
+ date: string;
146
+ high: number;
147
+ low: number;
148
+ condition: Condition;
149
+ /**
150
+ * The WMO weather code.
151
+ */
152
+ code: number;
153
+ precipitationProbability?: number;
154
+ sunrise?: string;
155
+ sunset?: string;
156
+ },
157
+ {
158
+ date: string;
159
+ high: number;
160
+ low: number;
161
+ condition: Condition;
162
+ /**
163
+ * The WMO weather code.
164
+ */
165
+ code: number;
166
+ precipitationProbability?: number;
167
+ sunrise?: string;
168
+ sunset?: string;
169
+ }
170
+ ] | [
171
+ {
172
+ date: string;
173
+ high: number;
174
+ low: number;
175
+ condition: Condition;
176
+ /**
177
+ * The WMO weather code.
178
+ */
179
+ code: number;
180
+ precipitationProbability?: number;
181
+ sunrise?: string;
182
+ sunset?: string;
183
+ },
184
+ {
185
+ date: string;
186
+ high: number;
187
+ low: number;
188
+ condition: Condition;
189
+ /**
190
+ * The WMO weather code.
191
+ */
192
+ code: number;
193
+ precipitationProbability?: number;
194
+ sunrise?: string;
195
+ sunset?: string;
196
+ },
197
+ {
198
+ date: string;
199
+ high: number;
200
+ low: number;
201
+ condition: Condition;
202
+ /**
203
+ * The WMO weather code.
204
+ */
205
+ code: number;
206
+ precipitationProbability?: number;
207
+ sunrise?: string;
208
+ sunset?: string;
209
+ },
210
+ {
211
+ date: string;
212
+ high: number;
213
+ low: number;
214
+ condition: Condition;
215
+ /**
216
+ * The WMO weather code.
217
+ */
218
+ code: number;
219
+ precipitationProbability?: number;
220
+ sunrise?: string;
221
+ sunset?: string;
222
+ },
223
+ {
224
+ date: string;
225
+ high: number;
226
+ low: number;
227
+ condition: Condition;
228
+ /**
229
+ * The WMO weather code.
230
+ */
231
+ code: number;
232
+ precipitationProbability?: number;
233
+ sunrise?: string;
234
+ sunset?: string;
235
+ }
236
+ ] | [
237
+ {
238
+ date: string;
239
+ high: number;
240
+ low: number;
241
+ condition: Condition;
242
+ /**
243
+ * The WMO weather code.
244
+ */
245
+ code: number;
246
+ precipitationProbability?: number;
247
+ sunrise?: string;
248
+ sunset?: string;
249
+ },
250
+ {
251
+ date: string;
252
+ high: number;
253
+ low: number;
254
+ condition: Condition;
255
+ /**
256
+ * The WMO weather code.
257
+ */
258
+ code: number;
259
+ precipitationProbability?: number;
260
+ sunrise?: string;
261
+ sunset?: string;
262
+ },
263
+ {
264
+ date: string;
265
+ high: number;
266
+ low: number;
267
+ condition: Condition;
268
+ /**
269
+ * The WMO weather code.
270
+ */
271
+ code: number;
272
+ precipitationProbability?: number;
273
+ sunrise?: string;
274
+ sunset?: string;
275
+ },
276
+ {
277
+ date: string;
278
+ high: number;
279
+ low: number;
280
+ condition: Condition;
281
+ /**
282
+ * The WMO weather code.
283
+ */
284
+ code: number;
285
+ precipitationProbability?: number;
286
+ sunrise?: string;
287
+ sunset?: string;
288
+ },
289
+ {
290
+ date: string;
291
+ high: number;
292
+ low: number;
293
+ condition: Condition;
294
+ /**
295
+ * The WMO weather code.
296
+ */
297
+ code: number;
298
+ precipitationProbability?: number;
299
+ sunrise?: string;
300
+ sunset?: string;
301
+ },
302
+ {
303
+ date: string;
304
+ high: number;
305
+ low: number;
306
+ condition: Condition;
307
+ /**
308
+ * The WMO weather code.
309
+ */
310
+ code: number;
311
+ precipitationProbability?: number;
312
+ sunrise?: string;
313
+ sunset?: string;
314
+ }
315
+ ] | [
316
+ {
317
+ date: string;
318
+ high: number;
319
+ low: number;
320
+ condition: Condition;
321
+ /**
322
+ * The WMO weather code.
323
+ */
324
+ code: number;
325
+ precipitationProbability?: number;
326
+ sunrise?: string;
327
+ sunset?: string;
328
+ },
329
+ {
330
+ date: string;
331
+ high: number;
332
+ low: number;
333
+ condition: Condition;
334
+ /**
335
+ * The WMO weather code.
336
+ */
337
+ code: number;
338
+ precipitationProbability?: number;
339
+ sunrise?: string;
340
+ sunset?: string;
341
+ },
342
+ {
343
+ date: string;
344
+ high: number;
345
+ low: number;
346
+ condition: Condition;
347
+ /**
348
+ * The WMO weather code.
349
+ */
350
+ code: number;
351
+ precipitationProbability?: number;
352
+ sunrise?: string;
353
+ sunset?: string;
354
+ },
355
+ {
356
+ date: string;
357
+ high: number;
358
+ low: number;
359
+ condition: Condition;
360
+ /**
361
+ * The WMO weather code.
362
+ */
363
+ code: number;
364
+ precipitationProbability?: number;
365
+ sunrise?: string;
366
+ sunset?: string;
367
+ },
368
+ {
369
+ date: string;
370
+ high: number;
371
+ low: number;
372
+ condition: Condition;
373
+ /**
374
+ * The WMO weather code.
375
+ */
376
+ code: number;
377
+ precipitationProbability?: number;
378
+ sunrise?: string;
379
+ sunset?: string;
380
+ },
381
+ {
382
+ date: string;
383
+ high: number;
384
+ low: number;
385
+ condition: Condition;
386
+ /**
387
+ * The WMO weather code.
388
+ */
389
+ code: number;
390
+ precipitationProbability?: number;
391
+ sunrise?: string;
392
+ sunset?: string;
393
+ },
394
+ {
395
+ date: string;
396
+ high: number;
397
+ low: number;
398
+ condition: Condition;
399
+ /**
400
+ * The WMO weather code.
401
+ */
402
+ code: number;
403
+ precipitationProbability?: number;
404
+ sunrise?: string;
405
+ sunset?: string;
406
+ }
407
+ ];
408
+ /**
409
+ * What the weather condition leaf (condition.schema.json) reads.
410
+ */
411
+ facts: {
412
+ temperatureC: number;
413
+ condition: Condition;
414
+ precipitationProbability?: number;
415
+ windKph: number;
416
+ /**
417
+ * False until a source of alerts is added.
418
+ */
419
+ alertActive: boolean;
420
+ };
421
+ }
@@ -0,0 +1,3 @@
1
+ // Copied from protocol/generated/ts/data-weather.d.ts by app-sdk/scripts/copy-protocol.mjs: edit the source, then run `pnpm --filter @wyndlass/app-sdk copy-protocol`.
2
+ /* Generated from protocol/schemas by scripts/generate.mjs. Do not edit. */
3
+ export {};