@brydio/manifest 0.1.0-alpha.4 → 0.1.0-alpha.41

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.
package/src/schema.d.ts CHANGED
@@ -1,6 +1,54 @@
1
1
  import { z } from 'zod';
2
2
  import { FieldTypeInvalid, type FieldType } from './field-types.js';
3
+ import { type OpenProblemCode } from './open-schema.js';
4
+ import { type ConfirmProblemCode } from './confirm-email.js';
5
+ import { type AnonymousProblemCode, type AnonymousSpec } from './anonymous.js';
6
+ import { type EditorsProblemCode, type ReadersProblemCode } from './readers.js';
3
7
  export { COLOUR_TOKENS, FIELD_LIMITS, parseFieldType, RESERVED_FIELDS, structuredFields, type FieldKind, type FieldType, } from './field-types.js';
8
+ /**
9
+ * What an app adds to `.brydio/app.json` to be more than a bundle of servers
10
+ * and skills: where it is shown, what it keeps, the tools that come from what
11
+ * it keeps, its screens, and what it asks the workspace for (contracts §4).
12
+ *
13
+ * Every key is optional, so every manifest E5 already imports still parses.
14
+ * A copy of Brydio's `apps/api/src/apps/manifest/manifest-ext.schema.ts`, the
15
+ * schema the server reads an installed app's manifest with. The two change
16
+ * together; `test/manifest.test.ts` parses the same manifests with both.
17
+ *
18
+ * Zod says what the additions *are*. The checks that are claims about one
19
+ * field against another — a search list naming a date, a placement naming a
20
+ * screen nobody declared — are `dataProblems` below, with a code each, so an
21
+ * import report can say which collection and which field, not just "invalid".
22
+ */
23
+ declare const placementSettingSchema: z.ZodObject<{
24
+ type: z.ZodEnum<{
25
+ string: "string";
26
+ url: "url";
27
+ }>;
28
+ label: z.ZodString;
29
+ required: z.ZodOptional<z.ZodBoolean>;
30
+ placeholder: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ export type PlacementSettingSpec = z.infer<typeof placementSettingSchema>;
33
+ /**
34
+ * How deep a folder's rows may nest, counting its own rows as the first
35
+ * level (ADR-A21): Issues → sprints → issues is two. Each level is listed
36
+ * only when a person opens its parent, so depth costs nothing while closed;
37
+ * the limit is for the sidebar's width and a person's patience.
38
+ */
39
+ export declare const MAX_FOLDER_DEPTH = 4;
40
+ /** The sizes a Home card or a project widget can be drawn at (CC11-F10). */
41
+ export declare const HOME_CARD_SIZES: readonly ["small", "medium", "large"];
42
+ export type HomeCardSize = (typeof HOME_CARD_SIZES)[number];
43
+ /** The kinds drawn as a card, which say the sizes they draw well at. */
44
+ export declare const SIZED_PLACEMENT_KINDS: readonly ["home", "project-widget"];
45
+ /** A stable identity for one independently addable placement offering. */
46
+ export declare const PLACEMENT_KEY: RegExp;
47
+ export declare function effectivePlacementKey(one: {
48
+ key?: string;
49
+ kind: string;
50
+ screen: string;
51
+ }): string;
4
52
  /** Most custom tools one app may declare (A3-F08). */
5
53
  export declare const MAX_CUSTOM_TOOLS = 20;
6
54
  /** A tool name the model and a policy row can both use as it is. */
@@ -16,26 +64,111 @@ declare const customToolSchema: z.ZodObject<{
16
64
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
17
65
  write: z.ZodOptional<z.ZodBoolean>;
18
66
  collection: z.ZodOptional<z.ZodString>;
67
+ public: z.ZodOptional<z.ZodBoolean>;
19
68
  }, z.core.$strip>;
20
69
  export type CustomToolSpec = z.infer<typeof customToolSchema>;
70
+ /** Most secrets one app may declare (ADR-A24). */
71
+ export declare const MAX_APP_SECRETS = 20;
72
+ /** The longest value one secret may hold, in characters. */
73
+ export declare const MAX_SECRET_CHARS: number;
74
+ /** A secret's name, as a handler asks for it: `api_key`. */
75
+ export declare const SECRET_NAME: RegExp;
76
+ /**
77
+ * A secret the app needs (ADR-A24): named here, never valued here. The value
78
+ * is entered in the app's settings by an administrator, or stored by the
79
+ * app's own handler with `secrets.set`, and only that app's handlers can read
80
+ * it, with `secrets.get`. A screen never can.
81
+ *
82
+ * `install` (the default) is one value for the whole install; `instance` is
83
+ * one per instance.
84
+ */
85
+ declare const secretSchema: z.ZodObject<{
86
+ name: z.ZodString;
87
+ label: z.ZodString;
88
+ description: z.ZodOptional<z.ZodString>;
89
+ required: z.ZodOptional<z.ZodBoolean>;
90
+ scope: z.ZodOptional<z.ZodEnum<{
91
+ instance: "instance";
92
+ install: "install";
93
+ }>>;
94
+ }, z.core.$strip>;
95
+ export type SecretSpec = z.infer<typeof secretSchema>;
21
96
  declare const extensionShape: {
22
97
  placements: z.ZodOptional<z.ZodArray<z.ZodObject<{
98
+ key: z.ZodOptional<z.ZodString>;
23
99
  kind: z.ZodEnum<{
100
+ home: "home";
101
+ "project-widget": "project-widget";
24
102
  "project-tab": "project-tab";
25
103
  "project-sidebar": "project-sidebar";
26
104
  "workspace-sidebar": "workspace-sidebar";
105
+ "public-page": "public-page";
106
+ "chat-card": "chat-card";
27
107
  }>;
28
108
  screen: z.ZodString;
109
+ sizes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
110
+ small: "small";
111
+ medium: "medium";
112
+ large: "large";
113
+ }>>>;
29
114
  label: z.ZodOptional<z.ZodString>;
30
115
  icon: z.ZodOptional<z.ZodString>;
116
+ settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
117
+ type: z.ZodEnum<{
118
+ string: "string";
119
+ url: "url";
120
+ }>;
121
+ label: z.ZodString;
122
+ required: z.ZodOptional<z.ZodBoolean>;
123
+ placeholder: z.ZodOptional<z.ZodString>;
124
+ }, z.core.$strip>>>;
125
+ children: z.ZodOptional<z.ZodObject<{
126
+ tool: z.ZodString;
127
+ refreshSeconds: z.ZodOptional<z.ZodNumber>;
128
+ cap: z.ZodOptional<z.ZodNumber>;
129
+ noun: z.ZodOptional<z.ZodString>;
130
+ create: z.ZodOptional<z.ZodObject<{
131
+ tool: z.ZodString;
132
+ noun: z.ZodOptional<z.ZodString>;
133
+ titleField: z.ZodOptional<z.ZodString>;
134
+ parentField: z.ZodOptional<z.ZodString>;
135
+ }, z.core.$strip>>;
136
+ nested: z.ZodOptional<z.ZodArray<z.ZodObject<{
137
+ noun: z.ZodOptional<z.ZodString>;
138
+ create: z.ZodOptional<z.ZodObject<{
139
+ tool: z.ZodString;
140
+ noun: z.ZodOptional<z.ZodString>;
141
+ titleField: z.ZodOptional<z.ZodString>;
142
+ parentField: z.ZodOptional<z.ZodString>;
143
+ }, z.core.$strip>>;
144
+ }, z.core.$strip>>>;
145
+ }, z.core.$strip>>;
31
146
  }, z.core.$strip>>>;
32
147
  data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
33
148
  schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
34
149
  search: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
150
  label: z.ZodOptional<z.ZodString>;
151
+ openSchema: z.ZodOptional<z.ZodObject<{
152
+ fields: z.ZodString;
153
+ table: z.ZodOptional<z.ZodString>;
154
+ }, z.core.$strict>>;
155
+ publicRead: z.ZodOptional<z.ZodBoolean>;
156
+ publicSubmit: z.ZodOptional<z.ZodBoolean>;
157
+ confirmEmail: z.ZodOptional<z.ZodObject<{
158
+ field: z.ZodString;
159
+ subject: z.ZodOptional<z.ZodString>;
160
+ message: z.ZodOptional<z.ZodString>;
161
+ link: z.ZodOptional<z.ZodBoolean>;
162
+ }, z.core.$strict>>;
163
+ anonymous: z.ZodOptional<z.ZodObject<{
164
+ group: z.ZodString;
165
+ minimum: z.ZodOptional<z.ZodNumber>;
166
+ }, z.core.$strict>>;
167
+ readers: z.ZodOptional<z.ZodString>;
168
+ editors: z.ZodOptional<z.ZodString>;
36
169
  }, z.core.$strip>>>;
37
170
  tools: z.ZodOptional<z.ZodObject<{
38
- generated: z.ZodOptional<z.ZodBoolean>;
171
+ generated: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"read">]>>;
39
172
  custom: z.ZodOptional<z.ZodArray<z.ZodObject<{
40
173
  name: z.ZodString;
41
174
  description: z.ZodString;
@@ -43,6 +176,7 @@ declare const extensionShape: {
43
176
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
44
177
  write: z.ZodOptional<z.ZodBoolean>;
45
178
  collection: z.ZodOptional<z.ZodString>;
179
+ public: z.ZodOptional<z.ZodBoolean>;
46
180
  }, z.core.$strip>>>;
47
181
  }, z.core.$strip>>;
48
182
  screens: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -53,6 +187,17 @@ declare const extensionShape: {
53
187
  collections: z.ZodOptional<z.ZodArray<z.ZodString>>;
54
188
  host: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
189
  }, z.core.$strip>>;
190
+ /** The secrets its handlers read (ADR-A24): names only, never values. */
191
+ secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
192
+ name: z.ZodString;
193
+ label: z.ZodString;
194
+ description: z.ZodOptional<z.ZodString>;
195
+ required: z.ZodOptional<z.ZodBoolean>;
196
+ scope: z.ZodOptional<z.ZodEnum<{
197
+ instance: "instance";
198
+ install: "install";
199
+ }>>;
200
+ }, z.core.$strip>>>;
56
201
  /**
57
202
  * How records move when the schema changes between versions (A3-F07).
58
203
  * Checked against the previous version when a version is published, and
@@ -99,7 +244,7 @@ export interface DataProblem {
99
244
  field?: string;
100
245
  message: string;
101
246
  }
102
- export type DataProblemCode = FieldTypeInvalid['code'] | 'data_too_many_collections' | 'data_too_many_fields' | 'data_collection_name_format' | 'data_field_name_format' | 'data_field_reserved' | 'data_label_format' | 'data_label_taken' | 'data_project_field_twice' | 'data_search_unknown_field' | 'data_search_not_text' | 'grant_collection_missing' | 'grant_tool_missing' | 'custom_name_taken' | 'custom_collection_unknown' | 'custom_input_invalid' | 'placement_screen_unknown';
247
+ export type DataProblemCode = FieldTypeInvalid['code'] | OpenProblemCode | ConfirmProblemCode | AnonymousProblemCode | ReadersProblemCode | EditorsProblemCode | 'data_too_many_collections' | 'data_too_many_fields' | 'data_collection_name_format' | 'data_field_name_format' | 'data_field_reserved' | 'data_label_format' | 'data_label_taken' | 'data_project_field_twice' | 'data_search_unknown_field' | 'data_search_not_text' | 'grant_collection_missing' | 'grant_tool_missing' | 'custom_name_taken' | 'custom_collection_unknown' | 'custom_input_invalid' | 'placement_key_taken' | 'placement_screen_unknown' | 'placement_home_sizes' | 'placement_sizes_not_home' | 'placement_widget_sizes' | 'placement_tab_retired' | 'placement_public_shape' | 'placement_public_nothing' | 'placement_chat_card_shape' | 'grant_tool_cross_app_self' | 'placement_children_too_deep' | 'placement_create_tool_unknown' | 'placement_create_not_write' | 'secret_name_taken' | 'grant_secrets_missing';
103
248
  type Additions = z.infer<z.ZodObject<typeof extensionShape>>;
104
249
  /**
105
250
  * Everything wrong with an app's additions that a type cannot say.
@@ -108,28 +253,101 @@ type Additions = z.infer<z.ZodObject<typeof extensionShape>>;
108
253
  * report; the zod schemas below run it too, so a parse never accepts what
109
254
  * this refuses.
110
255
  */
111
- export declare function dataProblems(additions: Additions, options?: {
256
+ export interface DataProblemOptions {
257
+ /** Off where the grants are the install's record, not the manifest's. */
112
258
  grants?: boolean;
113
- }): DataProblem[];
259
+ /** On for a manifest being written now: refuses kinds that are retired, such as `project-tab`. */
260
+ retired?: boolean;
261
+ }
262
+ export declare function dataProblems(additions: Additions, options?: DataProblemOptions): DataProblem[];
263
+ /**
264
+ * Another installed app's tool, as `grants.tools` names it (FO07): the name
265
+ * the assistant knows it by, `<slug>__<tool>`. Null for anything else.
266
+ * A handler calls it with `tools.call('<slug>__<tool>', input)`.
267
+ */
268
+ export declare function crossAppTool(name: string): {
269
+ app: string;
270
+ tool: string;
271
+ } | null;
272
+ /** An app's name as the front of its tools' assistant names: `issue-tracker` → `issue_tracker`. */
273
+ export declare const appToolPrefix: (name: string) => string;
114
274
  /** The additions alone, for code that has the rest of the manifest already. */
115
275
  export declare const manifestExtensionsSchema: z.ZodObject<{
116
276
  placements: z.ZodOptional<z.ZodArray<z.ZodObject<{
277
+ key: z.ZodOptional<z.ZodString>;
117
278
  kind: z.ZodEnum<{
279
+ home: "home";
280
+ "project-widget": "project-widget";
118
281
  "project-tab": "project-tab";
119
282
  "project-sidebar": "project-sidebar";
120
283
  "workspace-sidebar": "workspace-sidebar";
284
+ "public-page": "public-page";
285
+ "chat-card": "chat-card";
121
286
  }>;
122
287
  screen: z.ZodString;
288
+ sizes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
289
+ small: "small";
290
+ medium: "medium";
291
+ large: "large";
292
+ }>>>;
123
293
  label: z.ZodOptional<z.ZodString>;
124
294
  icon: z.ZodOptional<z.ZodString>;
295
+ settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
296
+ type: z.ZodEnum<{
297
+ string: "string";
298
+ url: "url";
299
+ }>;
300
+ label: z.ZodString;
301
+ required: z.ZodOptional<z.ZodBoolean>;
302
+ placeholder: z.ZodOptional<z.ZodString>;
303
+ }, z.core.$strip>>>;
304
+ children: z.ZodOptional<z.ZodObject<{
305
+ tool: z.ZodString;
306
+ refreshSeconds: z.ZodOptional<z.ZodNumber>;
307
+ cap: z.ZodOptional<z.ZodNumber>;
308
+ noun: z.ZodOptional<z.ZodString>;
309
+ create: z.ZodOptional<z.ZodObject<{
310
+ tool: z.ZodString;
311
+ noun: z.ZodOptional<z.ZodString>;
312
+ titleField: z.ZodOptional<z.ZodString>;
313
+ parentField: z.ZodOptional<z.ZodString>;
314
+ }, z.core.$strip>>;
315
+ nested: z.ZodOptional<z.ZodArray<z.ZodObject<{
316
+ noun: z.ZodOptional<z.ZodString>;
317
+ create: z.ZodOptional<z.ZodObject<{
318
+ tool: z.ZodString;
319
+ noun: z.ZodOptional<z.ZodString>;
320
+ titleField: z.ZodOptional<z.ZodString>;
321
+ parentField: z.ZodOptional<z.ZodString>;
322
+ }, z.core.$strip>>;
323
+ }, z.core.$strip>>>;
324
+ }, z.core.$strip>>;
125
325
  }, z.core.$strip>>>;
126
326
  data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
127
327
  schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
128
328
  search: z.ZodOptional<z.ZodArray<z.ZodString>>;
129
329
  label: z.ZodOptional<z.ZodString>;
330
+ openSchema: z.ZodOptional<z.ZodObject<{
331
+ fields: z.ZodString;
332
+ table: z.ZodOptional<z.ZodString>;
333
+ }, z.core.$strict>>;
334
+ publicRead: z.ZodOptional<z.ZodBoolean>;
335
+ publicSubmit: z.ZodOptional<z.ZodBoolean>;
336
+ confirmEmail: z.ZodOptional<z.ZodObject<{
337
+ field: z.ZodString;
338
+ subject: z.ZodOptional<z.ZodString>;
339
+ message: z.ZodOptional<z.ZodString>;
340
+ link: z.ZodOptional<z.ZodBoolean>;
341
+ }, z.core.$strict>>;
342
+ anonymous: z.ZodOptional<z.ZodObject<{
343
+ group: z.ZodString;
344
+ minimum: z.ZodOptional<z.ZodNumber>;
345
+ }, z.core.$strict>>;
346
+ readers: z.ZodOptional<z.ZodString>;
347
+ editors: z.ZodOptional<z.ZodString>;
130
348
  }, z.core.$strip>>>;
131
349
  tools: z.ZodOptional<z.ZodObject<{
132
- generated: z.ZodOptional<z.ZodBoolean>;
350
+ generated: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"read">]>>;
133
351
  custom: z.ZodOptional<z.ZodArray<z.ZodObject<{
134
352
  name: z.ZodString;
135
353
  description: z.ZodString;
@@ -137,6 +355,7 @@ export declare const manifestExtensionsSchema: z.ZodObject<{
137
355
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
138
356
  write: z.ZodOptional<z.ZodBoolean>;
139
357
  collection: z.ZodOptional<z.ZodString>;
358
+ public: z.ZodOptional<z.ZodBoolean>;
140
359
  }, z.core.$strip>>>;
141
360
  }, z.core.$strip>>;
142
361
  screens: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -147,6 +366,16 @@ export declare const manifestExtensionsSchema: z.ZodObject<{
147
366
  collections: z.ZodOptional<z.ZodArray<z.ZodString>>;
148
367
  host: z.ZodOptional<z.ZodArray<z.ZodString>>;
149
368
  }, z.core.$strip>>;
369
+ secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
370
+ name: z.ZodString;
371
+ label: z.ZodString;
372
+ description: z.ZodOptional<z.ZodString>;
373
+ required: z.ZodOptional<z.ZodBoolean>;
374
+ scope: z.ZodOptional<z.ZodEnum<{
375
+ instance: "instance";
376
+ install: "install";
377
+ }>>;
378
+ }, z.core.$strip>>>;
150
379
  migrations: z.ZodOptional<z.ZodArray<z.ZodObject<{
151
380
  version: z.ZodString;
152
381
  steps: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -183,22 +412,80 @@ export declare const manifestExtensionsSchema: z.ZodObject<{
183
412
  */
184
413
  export declare const storedExtensionsSchema: z.ZodObject<{
185
414
  placements: z.ZodOptional<z.ZodArray<z.ZodObject<{
415
+ key: z.ZodOptional<z.ZodString>;
186
416
  kind: z.ZodEnum<{
417
+ home: "home";
418
+ "project-widget": "project-widget";
187
419
  "project-tab": "project-tab";
188
420
  "project-sidebar": "project-sidebar";
189
421
  "workspace-sidebar": "workspace-sidebar";
422
+ "public-page": "public-page";
423
+ "chat-card": "chat-card";
190
424
  }>;
191
425
  screen: z.ZodString;
426
+ sizes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
427
+ small: "small";
428
+ medium: "medium";
429
+ large: "large";
430
+ }>>>;
192
431
  label: z.ZodOptional<z.ZodString>;
193
432
  icon: z.ZodOptional<z.ZodString>;
433
+ settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
434
+ type: z.ZodEnum<{
435
+ string: "string";
436
+ url: "url";
437
+ }>;
438
+ label: z.ZodString;
439
+ required: z.ZodOptional<z.ZodBoolean>;
440
+ placeholder: z.ZodOptional<z.ZodString>;
441
+ }, z.core.$strip>>>;
442
+ children: z.ZodOptional<z.ZodObject<{
443
+ tool: z.ZodString;
444
+ refreshSeconds: z.ZodOptional<z.ZodNumber>;
445
+ cap: z.ZodOptional<z.ZodNumber>;
446
+ noun: z.ZodOptional<z.ZodString>;
447
+ create: z.ZodOptional<z.ZodObject<{
448
+ tool: z.ZodString;
449
+ noun: z.ZodOptional<z.ZodString>;
450
+ titleField: z.ZodOptional<z.ZodString>;
451
+ parentField: z.ZodOptional<z.ZodString>;
452
+ }, z.core.$strip>>;
453
+ nested: z.ZodOptional<z.ZodArray<z.ZodObject<{
454
+ noun: z.ZodOptional<z.ZodString>;
455
+ create: z.ZodOptional<z.ZodObject<{
456
+ tool: z.ZodString;
457
+ noun: z.ZodOptional<z.ZodString>;
458
+ titleField: z.ZodOptional<z.ZodString>;
459
+ parentField: z.ZodOptional<z.ZodString>;
460
+ }, z.core.$strip>>;
461
+ }, z.core.$strip>>>;
462
+ }, z.core.$strip>>;
194
463
  }, z.core.$strip>>>;
195
464
  data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
196
465
  schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
197
466
  search: z.ZodOptional<z.ZodArray<z.ZodString>>;
198
467
  label: z.ZodOptional<z.ZodString>;
468
+ openSchema: z.ZodOptional<z.ZodObject<{
469
+ fields: z.ZodString;
470
+ table: z.ZodOptional<z.ZodString>;
471
+ }, z.core.$strict>>;
472
+ publicRead: z.ZodOptional<z.ZodBoolean>;
473
+ publicSubmit: z.ZodOptional<z.ZodBoolean>;
474
+ confirmEmail: z.ZodOptional<z.ZodObject<{
475
+ field: z.ZodString;
476
+ subject: z.ZodOptional<z.ZodString>;
477
+ message: z.ZodOptional<z.ZodString>;
478
+ link: z.ZodOptional<z.ZodBoolean>;
479
+ }, z.core.$strict>>;
480
+ anonymous: z.ZodOptional<z.ZodObject<{
481
+ group: z.ZodString;
482
+ minimum: z.ZodOptional<z.ZodNumber>;
483
+ }, z.core.$strict>>;
484
+ readers: z.ZodOptional<z.ZodString>;
485
+ editors: z.ZodOptional<z.ZodString>;
199
486
  }, z.core.$strip>>>;
200
487
  tools: z.ZodOptional<z.ZodObject<{
201
- generated: z.ZodOptional<z.ZodBoolean>;
488
+ generated: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"read">]>>;
202
489
  custom: z.ZodOptional<z.ZodArray<z.ZodObject<{
203
490
  name: z.ZodString;
204
491
  description: z.ZodString;
@@ -206,6 +493,7 @@ export declare const storedExtensionsSchema: z.ZodObject<{
206
493
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
207
494
  write: z.ZodOptional<z.ZodBoolean>;
208
495
  collection: z.ZodOptional<z.ZodString>;
496
+ public: z.ZodOptional<z.ZodBoolean>;
209
497
  }, z.core.$strip>>>;
210
498
  }, z.core.$strip>>;
211
499
  screens: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -216,6 +504,16 @@ export declare const storedExtensionsSchema: z.ZodObject<{
216
504
  collections: z.ZodOptional<z.ZodArray<z.ZodString>>;
217
505
  host: z.ZodOptional<z.ZodArray<z.ZodString>>;
218
506
  }, z.core.$strip>>;
507
+ secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
508
+ name: z.ZodString;
509
+ label: z.ZodString;
510
+ description: z.ZodOptional<z.ZodString>;
511
+ required: z.ZodOptional<z.ZodBoolean>;
512
+ scope: z.ZodOptional<z.ZodEnum<{
513
+ instance: "instance";
514
+ install: "install";
515
+ }>>;
516
+ }, z.core.$strip>>>;
219
517
  migrations: z.ZodOptional<z.ZodArray<z.ZodObject<{
220
518
  version: z.ZodString;
221
519
  steps: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -266,7 +564,14 @@ export declare const appManifestSchema: z.ZodObject<{
266
564
  terms: z.ZodOptional<z.ZodString>;
267
565
  support: z.ZodOptional<z.ZodString>;
268
566
  }, z.core.$strip>>;
269
- icon: z.ZodOptional<z.ZodString>;
567
+ logo: z.ZodOptional<z.ZodObject<{
568
+ color: z.ZodString;
569
+ mono: z.ZodString;
570
+ }, z.core.$strip>>;
571
+ icon: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
572
+ color: z.ZodString;
573
+ mono: z.ZodString;
574
+ }, z.core.$strip>]>>;
270
575
  brandColor: z.ZodOptional<z.ZodString>;
271
576
  brandColorDark: z.ZodOptional<z.ZodString>;
272
577
  defaultPrompts: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -280,22 +585,80 @@ export declare const appManifestSchema: z.ZodObject<{
280
585
  }, z.core.$strip>>;
281
586
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
282
587
  placements: z.ZodOptional<z.ZodArray<z.ZodObject<{
588
+ key: z.ZodOptional<z.ZodString>;
283
589
  kind: z.ZodEnum<{
590
+ home: "home";
591
+ "project-widget": "project-widget";
284
592
  "project-tab": "project-tab";
285
593
  "project-sidebar": "project-sidebar";
286
594
  "workspace-sidebar": "workspace-sidebar";
595
+ "public-page": "public-page";
596
+ "chat-card": "chat-card";
287
597
  }>;
288
598
  screen: z.ZodString;
599
+ sizes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
600
+ small: "small";
601
+ medium: "medium";
602
+ large: "large";
603
+ }>>>;
289
604
  label: z.ZodOptional<z.ZodString>;
290
605
  icon: z.ZodOptional<z.ZodString>;
606
+ settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
607
+ type: z.ZodEnum<{
608
+ string: "string";
609
+ url: "url";
610
+ }>;
611
+ label: z.ZodString;
612
+ required: z.ZodOptional<z.ZodBoolean>;
613
+ placeholder: z.ZodOptional<z.ZodString>;
614
+ }, z.core.$strip>>>;
615
+ children: z.ZodOptional<z.ZodObject<{
616
+ tool: z.ZodString;
617
+ refreshSeconds: z.ZodOptional<z.ZodNumber>;
618
+ cap: z.ZodOptional<z.ZodNumber>;
619
+ noun: z.ZodOptional<z.ZodString>;
620
+ create: z.ZodOptional<z.ZodObject<{
621
+ tool: z.ZodString;
622
+ noun: z.ZodOptional<z.ZodString>;
623
+ titleField: z.ZodOptional<z.ZodString>;
624
+ parentField: z.ZodOptional<z.ZodString>;
625
+ }, z.core.$strip>>;
626
+ nested: z.ZodOptional<z.ZodArray<z.ZodObject<{
627
+ noun: z.ZodOptional<z.ZodString>;
628
+ create: z.ZodOptional<z.ZodObject<{
629
+ tool: z.ZodString;
630
+ noun: z.ZodOptional<z.ZodString>;
631
+ titleField: z.ZodOptional<z.ZodString>;
632
+ parentField: z.ZodOptional<z.ZodString>;
633
+ }, z.core.$strip>>;
634
+ }, z.core.$strip>>>;
635
+ }, z.core.$strip>>;
291
636
  }, z.core.$strip>>>;
292
637
  data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
293
638
  schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
294
639
  search: z.ZodOptional<z.ZodArray<z.ZodString>>;
295
640
  label: z.ZodOptional<z.ZodString>;
641
+ openSchema: z.ZodOptional<z.ZodObject<{
642
+ fields: z.ZodString;
643
+ table: z.ZodOptional<z.ZodString>;
644
+ }, z.core.$strict>>;
645
+ publicRead: z.ZodOptional<z.ZodBoolean>;
646
+ publicSubmit: z.ZodOptional<z.ZodBoolean>;
647
+ confirmEmail: z.ZodOptional<z.ZodObject<{
648
+ field: z.ZodString;
649
+ subject: z.ZodOptional<z.ZodString>;
650
+ message: z.ZodOptional<z.ZodString>;
651
+ link: z.ZodOptional<z.ZodBoolean>;
652
+ }, z.core.$strict>>;
653
+ anonymous: z.ZodOptional<z.ZodObject<{
654
+ group: z.ZodString;
655
+ minimum: z.ZodOptional<z.ZodNumber>;
656
+ }, z.core.$strict>>;
657
+ readers: z.ZodOptional<z.ZodString>;
658
+ editors: z.ZodOptional<z.ZodString>;
296
659
  }, z.core.$strip>>>;
297
660
  tools: z.ZodOptional<z.ZodObject<{
298
- generated: z.ZodOptional<z.ZodBoolean>;
661
+ generated: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"read">]>>;
299
662
  custom: z.ZodOptional<z.ZodArray<z.ZodObject<{
300
663
  name: z.ZodString;
301
664
  description: z.ZodString;
@@ -303,6 +666,7 @@ export declare const appManifestSchema: z.ZodObject<{
303
666
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
304
667
  write: z.ZodOptional<z.ZodBoolean>;
305
668
  collection: z.ZodOptional<z.ZodString>;
669
+ public: z.ZodOptional<z.ZodBoolean>;
306
670
  }, z.core.$strip>>>;
307
671
  }, z.core.$strip>>;
308
672
  screens: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -313,6 +677,193 @@ export declare const appManifestSchema: z.ZodObject<{
313
677
  collections: z.ZodOptional<z.ZodArray<z.ZodString>>;
314
678
  host: z.ZodOptional<z.ZodArray<z.ZodString>>;
315
679
  }, z.core.$strip>>;
680
+ secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
681
+ name: z.ZodString;
682
+ label: z.ZodString;
683
+ description: z.ZodOptional<z.ZodString>;
684
+ required: z.ZodOptional<z.ZodBoolean>;
685
+ scope: z.ZodOptional<z.ZodEnum<{
686
+ instance: "instance";
687
+ install: "install";
688
+ }>>;
689
+ }, z.core.$strip>>>;
690
+ migrations: z.ZodOptional<z.ZodArray<z.ZodObject<{
691
+ version: z.ZodString;
692
+ steps: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
693
+ op: z.ZodLiteral<"add">;
694
+ collection: z.ZodString;
695
+ field: z.ZodString;
696
+ default: z.ZodOptional<z.ZodUnknown>;
697
+ }, z.core.$strip>, z.ZodObject<{
698
+ op: z.ZodLiteral<"rename">;
699
+ collection: z.ZodString;
700
+ from: z.ZodString;
701
+ to: z.ZodString;
702
+ }, z.core.$strip>, z.ZodObject<{
703
+ op: z.ZodLiteral<"drop">;
704
+ collection: z.ZodString;
705
+ field: z.ZodString;
706
+ }, z.core.$strip>, z.ZodObject<{
707
+ op: z.ZodLiteral<"dropCollection">;
708
+ collection: z.ZodString;
709
+ }, z.core.$strip>, z.ZodObject<{
710
+ op: z.ZodLiteral<"replace">;
711
+ collection: z.ZodString;
712
+ field: z.ZodString;
713
+ from: z.ZodString;
714
+ to: z.ZodString;
715
+ }, z.core.$strip>], "op">>;
716
+ }, z.core.$strip>>>;
717
+ sdk: z.ZodOptional<z.ZodString>;
718
+ }, z.core.$strip>;
719
+ /**
720
+ * A manifest being written now, as `brydio validate`, `build` and `dev` read
721
+ * it: the same, and nothing retired (`placement_tab_retired`) — which a
722
+ * published version may still hold.
723
+ */
724
+ export declare const newAppManifestSchema: z.ZodObject<{
725
+ name: z.ZodString;
726
+ version: z.ZodString;
727
+ displayName: z.ZodOptional<z.ZodString>;
728
+ summary: z.ZodOptional<z.ZodString>;
729
+ description: z.ZodOptional<z.ZodString>;
730
+ author: z.ZodOptional<z.ZodObject<{
731
+ name: z.ZodString;
732
+ email: z.ZodOptional<z.ZodString>;
733
+ url: z.ZodOptional<z.ZodString>;
734
+ }, z.core.$strip>>;
735
+ homepage: z.ZodOptional<z.ZodString>;
736
+ repository: z.ZodOptional<z.ZodString>;
737
+ license: z.ZodOptional<z.ZodString>;
738
+ keywords: z.ZodOptional<z.ZodArray<z.ZodString>>;
739
+ links: z.ZodOptional<z.ZodObject<{
740
+ privacy: z.ZodOptional<z.ZodString>;
741
+ terms: z.ZodOptional<z.ZodString>;
742
+ support: z.ZodOptional<z.ZodString>;
743
+ }, z.core.$strip>>;
744
+ logo: z.ZodOptional<z.ZodObject<{
745
+ color: z.ZodString;
746
+ mono: z.ZodString;
747
+ }, z.core.$strip>>;
748
+ icon: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
749
+ color: z.ZodString;
750
+ mono: z.ZodString;
751
+ }, z.core.$strip>]>>;
752
+ brandColor: z.ZodOptional<z.ZodString>;
753
+ brandColorDark: z.ZodOptional<z.ZodString>;
754
+ defaultPrompts: z.ZodOptional<z.ZodArray<z.ZodString>>;
755
+ skills: z.ZodOptional<z.ZodString>;
756
+ servers: z.ZodOptional<z.ZodString>;
757
+ integrations: z.ZodOptional<z.ZodString>;
758
+ requires: z.ZodOptional<z.ZodObject<{
759
+ servers: z.ZodDefault<z.ZodArray<z.ZodString>>;
760
+ integrations: z.ZodDefault<z.ZodArray<z.ZodString>>;
761
+ builtin: z.ZodDefault<z.ZodArray<z.ZodString>>;
762
+ }, z.core.$strip>>;
763
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
764
+ placements: z.ZodOptional<z.ZodArray<z.ZodObject<{
765
+ key: z.ZodOptional<z.ZodString>;
766
+ kind: z.ZodEnum<{
767
+ home: "home";
768
+ "project-widget": "project-widget";
769
+ "project-tab": "project-tab";
770
+ "project-sidebar": "project-sidebar";
771
+ "workspace-sidebar": "workspace-sidebar";
772
+ "public-page": "public-page";
773
+ "chat-card": "chat-card";
774
+ }>;
775
+ screen: z.ZodString;
776
+ sizes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
777
+ small: "small";
778
+ medium: "medium";
779
+ large: "large";
780
+ }>>>;
781
+ label: z.ZodOptional<z.ZodString>;
782
+ icon: z.ZodOptional<z.ZodString>;
783
+ settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
784
+ type: z.ZodEnum<{
785
+ string: "string";
786
+ url: "url";
787
+ }>;
788
+ label: z.ZodString;
789
+ required: z.ZodOptional<z.ZodBoolean>;
790
+ placeholder: z.ZodOptional<z.ZodString>;
791
+ }, z.core.$strip>>>;
792
+ children: z.ZodOptional<z.ZodObject<{
793
+ tool: z.ZodString;
794
+ refreshSeconds: z.ZodOptional<z.ZodNumber>;
795
+ cap: z.ZodOptional<z.ZodNumber>;
796
+ noun: z.ZodOptional<z.ZodString>;
797
+ create: z.ZodOptional<z.ZodObject<{
798
+ tool: z.ZodString;
799
+ noun: z.ZodOptional<z.ZodString>;
800
+ titleField: z.ZodOptional<z.ZodString>;
801
+ parentField: z.ZodOptional<z.ZodString>;
802
+ }, z.core.$strip>>;
803
+ nested: z.ZodOptional<z.ZodArray<z.ZodObject<{
804
+ noun: z.ZodOptional<z.ZodString>;
805
+ create: z.ZodOptional<z.ZodObject<{
806
+ tool: z.ZodString;
807
+ noun: z.ZodOptional<z.ZodString>;
808
+ titleField: z.ZodOptional<z.ZodString>;
809
+ parentField: z.ZodOptional<z.ZodString>;
810
+ }, z.core.$strip>>;
811
+ }, z.core.$strip>>>;
812
+ }, z.core.$strip>>;
813
+ }, z.core.$strip>>>;
814
+ data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
815
+ schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
816
+ search: z.ZodOptional<z.ZodArray<z.ZodString>>;
817
+ label: z.ZodOptional<z.ZodString>;
818
+ openSchema: z.ZodOptional<z.ZodObject<{
819
+ fields: z.ZodString;
820
+ table: z.ZodOptional<z.ZodString>;
821
+ }, z.core.$strict>>;
822
+ publicRead: z.ZodOptional<z.ZodBoolean>;
823
+ publicSubmit: z.ZodOptional<z.ZodBoolean>;
824
+ confirmEmail: z.ZodOptional<z.ZodObject<{
825
+ field: z.ZodString;
826
+ subject: z.ZodOptional<z.ZodString>;
827
+ message: z.ZodOptional<z.ZodString>;
828
+ link: z.ZodOptional<z.ZodBoolean>;
829
+ }, z.core.$strict>>;
830
+ anonymous: z.ZodOptional<z.ZodObject<{
831
+ group: z.ZodString;
832
+ minimum: z.ZodOptional<z.ZodNumber>;
833
+ }, z.core.$strict>>;
834
+ readers: z.ZodOptional<z.ZodString>;
835
+ editors: z.ZodOptional<z.ZodString>;
836
+ }, z.core.$strip>>>;
837
+ tools: z.ZodOptional<z.ZodObject<{
838
+ generated: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"read">]>>;
839
+ custom: z.ZodOptional<z.ZodArray<z.ZodObject<{
840
+ name: z.ZodString;
841
+ description: z.ZodString;
842
+ handler: z.ZodString;
843
+ input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
844
+ write: z.ZodOptional<z.ZodBoolean>;
845
+ collection: z.ZodOptional<z.ZodString>;
846
+ public: z.ZodOptional<z.ZodBoolean>;
847
+ }, z.core.$strip>>>;
848
+ }, z.core.$strip>>;
849
+ screens: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
850
+ entry: z.ZodString;
851
+ }, z.core.$strip>>>;
852
+ grants: z.ZodOptional<z.ZodObject<{
853
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
854
+ collections: z.ZodOptional<z.ZodArray<z.ZodString>>;
855
+ host: z.ZodOptional<z.ZodArray<z.ZodString>>;
856
+ }, z.core.$strip>>;
857
+ secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
858
+ name: z.ZodString;
859
+ label: z.ZodString;
860
+ description: z.ZodOptional<z.ZodString>;
861
+ required: z.ZodOptional<z.ZodBoolean>;
862
+ scope: z.ZodOptional<z.ZodEnum<{
863
+ instance: "instance";
864
+ install: "install";
865
+ }>>;
866
+ }, z.core.$strip>>>;
316
867
  migrations: z.ZodOptional<z.ZodArray<z.ZodObject<{
317
868
  version: z.ZodString;
318
869
  steps: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -361,6 +912,23 @@ export interface CollectionSpec {
361
912
  search: string[];
362
913
  /** The one `project` field, whose value is copied to `app_document.project_id`. */
363
914
  projectField: string | null;
915
+ /**
916
+ * Fields defined at runtime (P5): the companion collection, and the field
917
+ * naming a row's table (null: one table per instance). The store reads the
918
+ * live definitions; `fields` here holds only the manifest's own.
919
+ */
920
+ openSchema?: {
921
+ fields: string;
922
+ table: string | null;
923
+ };
924
+ /** On a companion: the open collection whose fields its records define (P5). */
925
+ definesFieldsOf?: string;
926
+ /** Answers kept with no writer, read only a whole group of at least `minimum` at a time (P13). */
927
+ anonymous?: AnonymousSpec;
928
+ /** The string[] field naming who alone may read a record, when it names anyone (P16). */
929
+ readers?: string;
930
+ /** The string[] field naming who alone may change a record, when it names anyone (DW06). */
931
+ editors?: string;
364
932
  }
365
933
  /**
366
934
  * The singular a collection's tools are named with: the manifest's, else the