mnfst 0.5.246 → 0.5.248

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.
@@ -31,7 +31,7 @@
31
31
  "live_url": {
32
32
  "type": "string",
33
33
  "format": "uri",
34
- "description": "Production URL — used by the prerender pipeline for canonical/sitemap output."
34
+ "description": "Production URL \u2014 used by the prerender pipeline for canonical/sitemap output."
35
35
  },
36
36
  "start_url": {
37
37
  "type": "string",
@@ -43,11 +43,25 @@
43
43
  },
44
44
  "display": {
45
45
  "type": "string",
46
- "enum": ["fullscreen", "standalone", "minimal-ui", "browser"]
46
+ "enum": [
47
+ "fullscreen",
48
+ "standalone",
49
+ "minimal-ui",
50
+ "browser"
51
+ ]
47
52
  },
48
53
  "orientation": {
49
54
  "type": "string",
50
- "enum": ["any", "natural", "landscape", "landscape-primary", "landscape-secondary", "portrait", "portrait-primary", "portrait-secondary"]
55
+ "enum": [
56
+ "any",
57
+ "natural",
58
+ "landscape",
59
+ "landscape-primary",
60
+ "landscape-secondary",
61
+ "portrait",
62
+ "portrait-primary",
63
+ "portrait-secondary"
64
+ ]
51
65
  },
52
66
  "background_color": {
53
67
  "type": "string",
@@ -61,22 +75,37 @@
61
75
  "type": "array",
62
76
  "items": {
63
77
  "type": "object",
64
- "required": ["src"],
78
+ "required": [
79
+ "src"
80
+ ],
65
81
  "properties": {
66
- "src": { "type": "string" },
67
- "sizes": { "type": "string" },
68
- "type": { "type": "string" },
69
- "purpose": { "type": "string" }
82
+ "src": {
83
+ "type": "string"
84
+ },
85
+ "sizes": {
86
+ "type": "string"
87
+ },
88
+ "type": {
89
+ "type": "string"
90
+ },
91
+ "purpose": {
92
+ "type": "string"
93
+ }
70
94
  }
71
95
  }
72
96
  },
73
97
  "components": {
74
98
  "type": "array",
75
99
  "description": "Component HTML files registered as <x-name> tags.",
76
- "items": { "type": "string" }
100
+ "items": {
101
+ "type": "string"
102
+ }
77
103
  },
78
104
  "version": {
79
- "type": ["string", "number"],
105
+ "type": [
106
+ "string",
107
+ "number"
108
+ ],
80
109
  "description": "Optional author-set release stamp. Appended as ?v= to component HTML fetches so browser caches bust on change. mnfst-publish injects a content-derived `deployment` stamp automatically, which takes precedence."
81
110
  },
82
111
  "deployment": {
@@ -90,17 +119,23 @@
90
119
  "preloadedComponents": {
91
120
  "type": "array",
92
121
  "description": "Components loaded eagerly on initial page load (header, logo, etc.).",
93
- "items": { "type": "string" }
122
+ "items": {
123
+ "type": "string"
124
+ }
94
125
  },
95
126
  "publishIgnore": {
96
127
  "type": "array",
97
128
  "description": "Gitignore-style patterns for files to exclude from the published bundle, independent of git. Applied on top of .gitignore and the built-in secret guards. A .manifestignore file at the project root works the same way.",
98
- "items": { "type": "string" }
129
+ "items": {
130
+ "type": "string"
131
+ }
99
132
  },
100
133
  "assets": {
101
134
  "type": "array",
102
135
  "description": "Paths or simple globs (e.g. \"sprites/*.png\") of files the hosting service worker precaches for offline use even when nothing in the HTML references them (dynamically loaded sprites, audio, fonts). Files referenced from HTML/CSS are precached automatically.",
103
- "items": { "type": "string" }
136
+ "items": {
137
+ "type": "string"
138
+ }
104
139
  },
105
140
  "data": {
106
141
  "type": "object",
@@ -121,7 +156,9 @@
121
156
  },
122
157
  "headers": {
123
158
  "type": "object",
124
- "additionalProperties": { "type": "string" }
159
+ "additionalProperties": {
160
+ "type": "string"
161
+ }
125
162
  },
126
163
  "params": {
127
164
  "type": "object"
@@ -137,59 +174,142 @@
137
174
  "type": "string",
138
175
  "description": "Single CSV with locale columns; locale resolution happens internally."
139
176
  },
140
- "appwriteTableId": { "type": "string" },
141
- "appwriteBucketId": { "type": "string" },
142
- "appwriteDatabaseId": { "type": "string" },
143
- "appwriteProjectId": { "type": "string" },
144
- "appwriteEndpoint": { "type": "string" },
145
- "appwriteDevKey": { "type": "string" },
177
+ "appwriteTableId": {
178
+ "type": "string"
179
+ },
180
+ "appwriteBucketId": {
181
+ "type": "string"
182
+ },
183
+ "appwriteDatabaseId": {
184
+ "type": "string"
185
+ },
186
+ "appwriteProjectId": {
187
+ "type": "string"
188
+ },
189
+ "appwriteEndpoint": {
190
+ "type": "string"
191
+ },
192
+ "appwriteDevKey": {
193
+ "type": "string"
194
+ },
146
195
  "scope": {
147
196
  "oneOf": [
148
- { "type": "string", "enum": ["user", "team"] },
149
- { "type": "array", "items": { "type": "string", "enum": ["user", "team"] } }
197
+ {
198
+ "type": "string",
199
+ "enum": [
200
+ "user",
201
+ "team"
202
+ ]
203
+ },
204
+ {
205
+ "type": "array",
206
+ "items": {
207
+ "type": "string",
208
+ "enum": [
209
+ "user",
210
+ "team"
211
+ ]
212
+ }
213
+ }
150
214
  ]
151
215
  },
152
216
  "scopeColumn": {
153
217
  "description": "Column name(s) `scope` filters/writes on. Default teamId/userId. A string sets both; an object sets them independently.",
154
218
  "oneOf": [
155
- { "type": "string" },
219
+ {
220
+ "type": "string"
221
+ },
156
222
  {
157
223
  "type": "object",
158
224
  "properties": {
159
- "team": { "type": "string" },
160
- "user": { "type": "string" }
225
+ "team": {
226
+ "type": "string"
227
+ },
228
+ "user": {
229
+ "type": "string"
230
+ }
161
231
  },
162
232
  "additionalProperties": false
163
233
  }
164
234
  ]
165
235
  },
166
- "autoInjectUserId": { "type": "boolean" },
167
- "autoInjectTeamId": { "type": "boolean" },
236
+ "autoInjectUserId": {
237
+ "type": "boolean"
238
+ },
239
+ "autoInjectTeamId": {
240
+ "type": "boolean"
241
+ },
168
242
  "queries": {
169
243
  "type": "array",
170
- "items": { "type": "string" }
244
+ "items": {
245
+ "type": "string"
246
+ }
247
+ },
248
+ "realtime": {
249
+ "description": "Realtime subscription config. false disables the subscription. { mode, maxRows } bounds growth: 'append' (default) stops appending at maxRows and counts skipped events in $realtimeOverflow; 'window' keeps the initial window size by evicting the oldest realtime-appended rows. maxRows defaults to max(500, 2x the initially loaded rows); 0 opts into legacy unbounded growth.",
250
+ "oneOf": [
251
+ {
252
+ "type": "boolean"
253
+ },
254
+ {
255
+ "type": "object",
256
+ "properties": {
257
+ "mode": {
258
+ "type": "string",
259
+ "enum": [
260
+ "append",
261
+ "window"
262
+ ]
263
+ },
264
+ "maxRows": {
265
+ "type": "number",
266
+ "minimum": 0
267
+ }
268
+ },
269
+ "additionalProperties": false
270
+ }
271
+ ]
171
272
  },
172
273
  "storage": {
173
274
  "type": "object",
174
275
  "description": "Map of storage-bucket source names to the column on this row that holds their file IDs.",
175
- "additionalProperties": { "type": "string" }
276
+ "additionalProperties": {
277
+ "type": "string"
278
+ }
279
+ },
280
+ "throttle": {
281
+ "type": "number"
282
+ },
283
+ "cleanupInterval": {
284
+ "type": "number"
285
+ },
286
+ "minChangeThreshold": {
287
+ "type": "number"
288
+ },
289
+ "idleThreshold": {
290
+ "type": "number"
291
+ },
292
+ "enableVisualRendering": {
293
+ "type": "boolean"
294
+ },
295
+ "includeVelocity": {
296
+ "type": "boolean"
176
297
  },
177
- "throttle": { "type": "number" },
178
- "cleanupInterval": { "type": "number" },
179
- "minChangeThreshold": { "type": "number" },
180
- "idleThreshold": { "type": "number" },
181
- "enableVisualRendering": { "type": "boolean" },
182
- "includeVelocity": { "type": "boolean" },
183
298
  "persist": {
184
299
  "description": "Persist this source's rows in IndexedDB and hydrate them before the network on the next visit (stale until the first fresh landing). `true` = boot tier with defaults.",
185
300
  "oneOf": [
186
- { "type": "boolean" },
301
+ {
302
+ "type": "boolean"
303
+ },
187
304
  {
188
305
  "type": "object",
189
306
  "properties": {
190
307
  "tier": {
191
308
  "type": "string",
192
- "enum": ["boot", "lazy"],
309
+ "enum": [
310
+ "boot",
311
+ "lazy"
312
+ ],
193
313
  "default": "boot",
194
314
  "description": "boot: hydrate during data-plugin init, before the first paint; lazy: hydrate on the first $x.<source> read."
195
315
  },
@@ -204,13 +324,22 @@
204
324
  "description": "Field that orders recency for `maxRows` (default $updatedAt if present, else insertion order)."
205
325
  },
206
326
  "ttl": {
207
- "oneOf": [{ "type": "string" }, { "type": "number" }],
327
+ "oneOf": [
328
+ {
329
+ "type": "string"
330
+ },
331
+ {
332
+ "type": "number"
333
+ }
334
+ ],
208
335
  "default": "7d",
209
336
  "description": "Snapshot lifetime: a duration string (`7d`, `12h`, `30m`) or milliseconds. Expired entries are ignored and deleted."
210
337
  },
211
338
  "strip": {
212
339
  "type": "array",
213
- "items": { "type": "string" },
340
+ "items": {
341
+ "type": "string"
342
+ },
214
343
  "description": "Field names or glob patterns removed from every row before it is written. `*secret*`, `*token*`, `*password*` and `credentials*` are always stripped."
215
344
  }
216
345
  },
@@ -239,9 +368,16 @@
239
368
  "type": "object",
240
369
  "description": "Appwrite global configuration. Per-source overrides live on the data entry.",
241
370
  "properties": {
242
- "projectId": { "type": "string" },
243
- "endpoint": { "type": "string", "format": "uri" },
244
- "databaseId": { "type": "string" },
371
+ "projectId": {
372
+ "type": "string"
373
+ },
374
+ "endpoint": {
375
+ "type": "string",
376
+ "format": "uri"
377
+ },
378
+ "databaseId": {
379
+ "type": "string"
380
+ },
245
381
  "devKey": {
246
382
  "type": "string",
247
383
  "description": "May reference an env var via ${VAR_NAME}."
@@ -253,24 +389,54 @@
253
389
  "type": "array",
254
390
  "items": {
255
391
  "type": "string",
256
- "enum": ["guest", "guest-auto", "guest-manual", "magic", "otp", "oauth", "password"]
392
+ "enum": [
393
+ "guest",
394
+ "guest-auto",
395
+ "guest-manual",
396
+ "magic",
397
+ "otp",
398
+ "oauth",
399
+ "password"
400
+ ]
257
401
  }
258
402
  },
259
403
  "teams": {
260
404
  "type": "object",
261
405
  "properties": {
262
- "permanent": { "type": "array", "items": { "type": "string" } },
263
- "template": { "type": "array", "items": { "type": "string" } },
264
- "guests": { "type": "boolean", "description": "Seed permanent/template teams for guest (anonymous) sessions too. Off by default." },
265
- "authenticated": { "type": "boolean", "description": "Seed permanent/template teams for authenticated (non-anonymous) sessions. On by default; set false (with guests:true) to make seeding guest-only." }
406
+ "permanent": {
407
+ "type": "array",
408
+ "items": {
409
+ "type": "string"
410
+ }
411
+ },
412
+ "template": {
413
+ "type": "array",
414
+ "items": {
415
+ "type": "string"
416
+ }
417
+ },
418
+ "guests": {
419
+ "type": "boolean",
420
+ "description": "Seed permanent/template teams for guest (anonymous) sessions too. Off by default."
421
+ },
422
+ "authenticated": {
423
+ "type": "boolean",
424
+ "description": "Seed permanent/template teams for authenticated (non-anonymous) sessions. On by default; set false (with guests:true) to make seeding guest-only."
425
+ }
266
426
  }
267
427
  },
268
- "guestUpgrade": { "type": "boolean", "description": "Preserve a guest's account (and its teams) when they sign in, instead of replacing it. Works with magic links and OAuth; email OTP cannot convert anonymous accounts (Appwrite limitation). Defaults to the value of teams.guests." },
428
+ "guestUpgrade": {
429
+ "type": "boolean",
430
+ "description": "Preserve a guest's account (and its teams) when they sign in, instead of replacing it. Works with magic links and OAuth; email OTP cannot convert anonymous accounts (Appwrite limitation). Defaults to the value of teams.guests."
431
+ },
269
432
  "guestMigration": {
270
433
  "type": "object",
271
- "description": "Carry a guest's teams over to the account they sign into via email OTP (which cannot convert in place). Requires the deployed guest-migration Appwrite Function — see templates/guest-migration-function.",
434
+ "description": "Carry a guest's teams over to the account they sign into via email OTP (which cannot convert in place). Requires the deployed guest-migration Appwrite Function \u2014 see templates/guest-migration-function.",
272
435
  "properties": {
273
- "functionId": { "type": "string", "description": "Id of the deployed guest-migration function." }
436
+ "functionId": {
437
+ "type": "string",
438
+ "description": "Id of the deployed guest-migration function."
439
+ }
274
440
  }
275
441
  },
276
442
  "roles": {
@@ -279,17 +445,30 @@
279
445
  "type": "object",
280
446
  "additionalProperties": {
281
447
  "type": "array",
282
- "items": { "type": "string" }
448
+ "items": {
449
+ "type": "string"
450
+ }
283
451
  }
284
452
  }
285
453
  },
286
- "creatorRole": { "type": "string" },
454
+ "creatorRole": {
455
+ "type": "string"
456
+ },
287
457
  "creatorRoles": {
288
458
  "description": "Role(s) the team creator is assigned atomically at creation. null or [] = owner-only (creator holds just Appwrite's intrinsic owner; no template role). Takes precedence over creatorRole.",
289
459
  "oneOf": [
290
- { "type": "string" },
291
- { "type": "array", "items": { "type": "string" } },
292
- { "type": "null" }
460
+ {
461
+ "type": "string"
462
+ },
463
+ {
464
+ "type": "array",
465
+ "items": {
466
+ "type": "string"
467
+ }
468
+ },
469
+ {
470
+ "type": "null"
471
+ }
293
472
  ]
294
473
  }
295
474
  }
@@ -298,7 +477,7 @@
298
477
  },
299
478
  "status": {
300
479
  "type": "object",
301
- "description": "Named, top-level-addressable status signals exposed via $status.<name>. Each entry rolls up one or more underlying signals into a single health state. Signal layer only — the author renders their own UI.",
480
+ "description": "Named, top-level-addressable status signals exposed via $status.<name>. Each entry rolls up one or more underlying signals into a single health state. Signal layer only \u2014 the author renders their own UI.",
302
481
  "additionalProperties": {
303
482
  "oneOf": [
304
483
  {
@@ -308,7 +487,9 @@
308
487
  {
309
488
  "type": "array",
310
489
  "description": "Multiple signals rolled up (worst-of by default).",
311
- "items": { "$ref": "#/definitions/statusSignal" }
490
+ "items": {
491
+ "$ref": "#/definitions/statusSignal"
492
+ }
312
493
  },
313
494
  {
314
495
  "type": "object",
@@ -316,11 +497,16 @@
316
497
  "properties": {
317
498
  "signals": {
318
499
  "type": "array",
319
- "items": { "$ref": "#/definitions/statusSignal" }
500
+ "items": {
501
+ "$ref": "#/definitions/statusSignal"
502
+ }
320
503
  },
321
504
  "rollup": {
322
505
  "type": "string",
323
- "enum": ["worst", "best"],
506
+ "enum": [
507
+ "worst",
508
+ "best"
509
+ ],
324
510
  "default": "worst"
325
511
  },
326
512
  "refresh": {
@@ -333,7 +519,7 @@
333
519
  },
334
520
  "staleAfter": {
335
521
  "type": "number",
336
- "description": "Milliseconds without a known signal before the entry reads as stale (default refresh × 3)."
522
+ "description": "Milliseconds without a known signal before the entry reads as stale (default refresh \u00d7 3)."
337
523
  }
338
524
  },
339
525
  "additionalProperties": true
@@ -359,7 +545,9 @@
359
545
  "ai": {
360
546
  "description": "Chat plugin config. Presence (object or bare true) auto-loads the chat plugin ($chat). Custom-adapter projects can use true with no config.",
361
547
  "oneOf": [
362
- { "type": "boolean" },
548
+ {
549
+ "type": "boolean"
550
+ },
363
551
  {
364
552
  "type": "object",
365
553
  "additionalProperties": true,
@@ -367,15 +555,38 @@
367
555
  "persist": {
368
556
  "description": "Persisted conversation windows on the shared IndexedDB store: the last `messages` of the `conversations` most recently opened conversations, hydrated (stale) before the adapter load. Off by default; true = defaults.",
369
557
  "oneOf": [
370
- { "type": "boolean" },
558
+ {
559
+ "type": "boolean"
560
+ },
371
561
  {
372
562
  "type": "object",
373
563
  "additionalProperties": false,
374
564
  "properties": {
375
- "messages": { "type": "integer", "minimum": 1, "default": 50 },
376
- "conversations": { "type": "integer", "minimum": 1, "default": 30 },
377
- "ttl": { "type": ["string", "number"], "default": "7d", "description": "Duration string (ms|s|m|h|d|w) or milliseconds." },
378
- "strip": { "type": "array", "items": { "type": "string" }, "description": "Message field names, globs or dotted paths removed before writing, on top of the always-on secret patterns." }
565
+ "messages": {
566
+ "type": "integer",
567
+ "minimum": 1,
568
+ "default": 50
569
+ },
570
+ "conversations": {
571
+ "type": "integer",
572
+ "minimum": 1,
573
+ "default": 30
574
+ },
575
+ "ttl": {
576
+ "type": [
577
+ "string",
578
+ "number"
579
+ ],
580
+ "default": "7d",
581
+ "description": "Duration string (ms|s|m|h|d|w) or milliseconds."
582
+ },
583
+ "strip": {
584
+ "type": "array",
585
+ "items": {
586
+ "type": "string"
587
+ },
588
+ "description": "Message field names, globs or dotted paths removed before writing, on top of the always-on secret patterns."
589
+ }
379
590
  }
380
591
  }
381
592
  ]
@@ -385,9 +596,11 @@
385
596
  ]
386
597
  },
387
598
  "chat": {
388
- "description": "Alias of ai — presence auto-loads the chat plugin ($chat).",
599
+ "description": "Alias of ai \u2014 presence auto-loads the chat plugin ($chat).",
389
600
  "oneOf": [
390
- { "type": "boolean" },
601
+ {
602
+ "type": "boolean"
603
+ },
391
604
  {
392
605
  "type": "object",
393
606
  "additionalProperties": true,
@@ -395,15 +608,38 @@
395
608
  "persist": {
396
609
  "description": "Persisted conversation windows on the shared IndexedDB store: the last `messages` of the `conversations` most recently opened conversations, hydrated (stale) before the adapter load. Off by default; true = defaults.",
397
610
  "oneOf": [
398
- { "type": "boolean" },
611
+ {
612
+ "type": "boolean"
613
+ },
399
614
  {
400
615
  "type": "object",
401
616
  "additionalProperties": false,
402
617
  "properties": {
403
- "messages": { "type": "integer", "minimum": 1, "default": 50 },
404
- "conversations": { "type": "integer", "minimum": 1, "default": 30 },
405
- "ttl": { "type": ["string", "number"], "default": "7d", "description": "Duration string (ms|s|m|h|d|w) or milliseconds." },
406
- "strip": { "type": "array", "items": { "type": "string" }, "description": "Message field names, globs or dotted paths removed before writing, on top of the always-on secret patterns." }
618
+ "messages": {
619
+ "type": "integer",
620
+ "minimum": 1,
621
+ "default": 50
622
+ },
623
+ "conversations": {
624
+ "type": "integer",
625
+ "minimum": 1,
626
+ "default": 30
627
+ },
628
+ "ttl": {
629
+ "type": [
630
+ "string",
631
+ "number"
632
+ ],
633
+ "default": "7d",
634
+ "description": "Duration string (ms|s|m|h|d|w) or milliseconds."
635
+ },
636
+ "strip": {
637
+ "type": "array",
638
+ "items": {
639
+ "type": "string"
640
+ },
641
+ "description": "Message field names, globs or dotted paths removed before writing, on top of the always-on secret patterns."
642
+ }
407
643
  }
408
644
  }
409
645
  ]
@@ -416,13 +652,49 @@
416
652
  "type": "object",
417
653
  "description": "Static rendering configuration consumed by mnfst-render.",
418
654
  "properties": {
419
- "localUrl": { "type": "string", "format": "uri" },
420
- "liveUrl": { "type": "string", "format": "uri" },
421
- "output": { "type": "string", "default": "dist" },
422
- "routerBase": { "type": "string", "default": "" },
655
+ "localUrl": {
656
+ "type": "string",
657
+ "format": "uri"
658
+ },
659
+ "liveUrl": {
660
+ "type": "string",
661
+ "format": "uri"
662
+ },
663
+ "output": {
664
+ "type": "string",
665
+ "default": "dist"
666
+ },
667
+ "routerBase": {
668
+ "type": "string",
669
+ "default": ""
670
+ },
671
+ "incremental": {
672
+ "type": "boolean",
673
+ "default": false,
674
+ "description": "Skip re-rendering routes whose fingerprinted inputs are unchanged since the last successful run (ledger in .mnfst-cache/routes.json). Anything uncertain renders. Once a ledger exists, every full render refreshes it (participation); explicit false turns capture and recording fully off."
675
+ },
676
+ "blockRequests": {
677
+ "type": "array",
678
+ "items": {
679
+ "type": "string"
680
+ },
681
+ "description": "URL patterns (substring match, * glob within a pattern) whose requests are aborted during prerender, e.g. a custom analytics tracker. Patterns are substring-matched \u2014 a short pattern can block more than intended."
682
+ },
683
+ "blockTelemetry": {
684
+ "type": "boolean",
685
+ "default": true,
686
+ "description": "Block well-known analytics and error/RUM collection endpoints (GA, Plausible, Segment, Mixpanel, Meta, Sentry, Bugsnag, Rollbar, Cloudflare RUM, New Relic, Datadog) during prerender so renders don't register as visitors or crash reports. Collection endpoints only, never script loads. Set false to allow."
687
+ },
688
+ "runCache": {
689
+ "type": "boolean",
690
+ "default": true,
691
+ "description": "Fetch each cross-origin URL at most once per render run and replay the first 2xx response to every later page (a prerender is a point-in-time snapshot, so run-level consistency is intended). Failures are never cached and retry on the next page. Set false (or --no-run-cache) to fetch per page."
692
+ },
423
693
  "locales": {
424
694
  "type": "array",
425
- "items": { "type": "string" }
695
+ "items": {
696
+ "type": "string"
697
+ }
426
698
  }
427
699
  },
428
700
  "additionalProperties": true
@@ -439,16 +711,20 @@
439
711
  },
440
712
  "utilities": {
441
713
  "type": "object",
442
- "description": "Utilities-plugin overrides for classes a plain HTML/component scan can't find on its own — e.g. built from a runtime value (`:class=\"ok ? 'bg-green-500' : 'bg-amber-500'\"`). `safelist` classes are baked into the static utilities sheet (scanClasses/compileUtilities) and treated as covered by the runtime; `patterns` classes are trusted as covered by the runtime only (a regex can't be baked).",
714
+ "description": "Utilities-plugin overrides for classes a plain HTML/component scan can't find on its own \u2014 e.g. built from a runtime value (`:class=\"ok ? 'bg-green-500' : 'bg-amber-500'\"`). `safelist` classes are baked into the static utilities sheet (scanClasses/compileUtilities) and treated as covered by the runtime; `patterns` classes are trusted as covered by the runtime only (a regex can't be baked).",
443
715
  "properties": {
444
716
  "safelist": {
445
717
  "type": "array",
446
- "items": { "type": "string" },
718
+ "items": {
719
+ "type": "string"
720
+ },
447
721
  "description": "Exact utility class names, e.g. [\"bg-amber-500\", \"bg-green-500\"]."
448
722
  },
449
723
  "patterns": {
450
724
  "type": "array",
451
- "items": { "type": "string" },
725
+ "items": {
726
+ "type": "string"
727
+ },
452
728
  "description": "Regex source strings matched against each class token, e.g. \"^bg-(red|green|blue)-[0-9]+$\"."
453
729
  }
454
730
  },
@@ -467,24 +743,68 @@
467
743
  "type": "object",
468
744
  "additionalProperties": true,
469
745
  "properties": {
470
- "label": { "type": "string" },
471
- "url": { "type": "string", "description": "HTTP probe target." },
472
- "expect": { "type": "number", "description": "Exact status code to treat as operational (default: any 2xx)." },
473
- "degradedAbove": { "type": "number", "description": "Latency in ms above which the probe reads as degraded." },
474
- "method": { "type": "string" },
475
- "headers": { "type": "object", "additionalProperties": { "type": "string" } },
476
- "timeout": { "type": "number" },
477
- "static": { "type": "string", "description": "Literal state (operational | degraded | partial_outage | major_outage | maintenance)." },
478
- "feed": { "type": "string", "description": "URL returning JSON whose state field is read." },
479
- "path": { "type": "string", "description": "Dot-path into a feed response to the state value." },
480
- "mirror": { "type": "string", "description": "Named upstream whose own status feed is reflected (e.g. 'appwrite')." },
481
- "appwriteService": { "type": "string", "description": "Resolves against the global appwrite endpoint's /health." },
482
- "mcp": { "type": "string", "description": "Hosted (Manifest MCP) signal; a feed URL when self-resolving." },
483
- "heartbeat": { "type": "string", "description": "Dead-man's-switch key; call $status.beat(key) to pulse." },
484
- "expectEvery": { "type": "number", "description": "Heartbeat window in ms before it reads as down." }
746
+ "label": {
747
+ "type": "string"
748
+ },
749
+ "url": {
750
+ "type": "string",
751
+ "description": "HTTP probe target."
752
+ },
753
+ "expect": {
754
+ "type": "number",
755
+ "description": "Exact status code to treat as operational (default: any 2xx)."
756
+ },
757
+ "degradedAbove": {
758
+ "type": "number",
759
+ "description": "Latency in ms above which the probe reads as degraded."
760
+ },
761
+ "method": {
762
+ "type": "string"
763
+ },
764
+ "headers": {
765
+ "type": "object",
766
+ "additionalProperties": {
767
+ "type": "string"
768
+ }
769
+ },
770
+ "timeout": {
771
+ "type": "number"
772
+ },
773
+ "static": {
774
+ "type": "string",
775
+ "description": "Literal state (operational | degraded | partial_outage | major_outage | maintenance)."
776
+ },
777
+ "feed": {
778
+ "type": "string",
779
+ "description": "URL returning JSON whose state field is read."
780
+ },
781
+ "path": {
782
+ "type": "string",
783
+ "description": "Dot-path into a feed response to the state value."
784
+ },
785
+ "mirror": {
786
+ "type": "string",
787
+ "description": "Named upstream whose own status feed is reflected (e.g. 'appwrite')."
788
+ },
789
+ "appwriteService": {
790
+ "type": "string",
791
+ "description": "Resolves against the global appwrite endpoint's /health."
792
+ },
793
+ "mcp": {
794
+ "type": "string",
795
+ "description": "Hosted (Manifest MCP) signal; a feed URL when self-resolving."
796
+ },
797
+ "heartbeat": {
798
+ "type": "string",
799
+ "description": "Dead-man's-switch key; call $status.beat(key) to pulse."
800
+ },
801
+ "expectEvery": {
802
+ "type": "number",
803
+ "description": "Heartbeat window in ms before it reads as down."
804
+ }
485
805
  }
486
806
  }
487
807
  ]
488
808
  }
489
809
  }
490
- }
810
+ }