@wildo-ai/zod-decorators 1.1.1 → 1.1.3

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.
@@ -402,6 +402,12 @@ export declare const StringDisplayMode: {
402
402
  * `TEXTAREA` — the edit side stays markdown SOURCE either way.
403
403
  */
404
404
  readonly MARKDOWN: "markdown";
405
+ /**
406
+ * A MACHINE IDENTIFIER — a slug, a ref, an addressable key (`success-criterion-…`). Rendered
407
+ * small, muted and monospace so it stays greppable and verbatim while RECEDING behind the prose
408
+ * it identifies. Use for values a reader needs to copy or trace, never to read as content.
409
+ */
410
+ readonly IDENTIFIER: "identifier";
405
411
  readonly COLOR: "color";
406
412
  readonly LINK: "link";
407
413
  readonly EMAIL: "email";
@@ -710,6 +716,21 @@ export interface ForeignKeyStructuralParams {
710
716
  * (e.g. `referrerScopeType`). Without it, `polymorphicVariants` is rename-only.
711
717
  */
712
718
  polymorphicDiscriminatorField?: string;
719
+ /**
720
+ * EXPLICIT target resource type, for an FK whose FIELD NAME cannot resolve it.
721
+ *
722
+ * The frontend resolves a reference field's target through the field-name → resource map
723
+ * (enriched from relationships' `foreignKeyField`). That works only when the field is named for
724
+ * its target (`assignedToUserId`) or a relationship declares it — and relationship FK names are
725
+ * held to the `Id`/`Ids` convention. A field that references a resource under its OWN vocabulary
726
+ * (`icpRefs` inside a specification document, a rename-only FK) has no honest entry in that map;
727
+ * declaring the target here lets the reference display resolve, label and navigate it without
728
+ * bending the field's name or the map's uniqueness.
729
+ *
730
+ * Takes precedence over the field-name map; polymorphic variants (above) still win over both,
731
+ * because a per-record discriminator is more specific than any static declaration.
732
+ */
733
+ referencedResourceType?: string;
713
734
  }
714
735
  /** @wildo_source:part:end zod.decorators.shared-structural-params */
715
736
  /**
@@ -977,7 +998,14 @@ export declare const FileMimeTypeGroups: {
977
998
  };
978
999
  export type FileMimeTypeGroup = keyof typeof FileMimeTypeGroups;
979
1000
  /**
980
- * File nature classification for constraint validation and UI display.
1001
+ * @wildo_source:part:start zod.decorators.file-vocabularies facet:layer:shared facet:audience:app-developer
1002
+ *
1003
+ * The vocabularies a `z_file()` field selects from. Pick a member of each; the option bag names the
1004
+ * type, and these are the values.
1005
+ *
1006
+ * File nature classification, chosen with `z_file({ nature })`. It selects which per-nature
1007
+ * constraint bag applies and how the form control and display surface behave. `ALL` accepts any
1008
+ * kind and is the right answer for a generic attachment field.
981
1009
  */
982
1010
  export declare enum FileNature {
983
1011
  IMAGE = "image",
@@ -988,6 +1016,7 @@ export declare enum FileNature {
988
1016
  ARCHIVE = "archive",
989
1017
  ALL = "all"
990
1018
  }
1019
+ /** @wildo_source:part:end zod.decorators.file-vocabularies */
991
1020
  /**
992
1021
  * Rendering-level file nature categories.
993
1022
  *
@@ -1123,7 +1152,19 @@ export interface FileMediaPreviewOptions {
1123
1152
  showCaption?: boolean;
1124
1153
  }
1125
1154
  /**
1126
- * Storage providers accepted for file uploads.
1155
+ * @wildo_source:part:start zod.decorators.file-vocabularies
1156
+ *
1157
+ * Where a field's bytes may be stored, chosen with `z_file({ storageAccepted: [...] })`. ORDER
1158
+ * EXPRESSES PREFERENCE: list several and the first CONFIGURED one is used. Omit the option entirely
1159
+ * and the field resolves to managed storage.
1160
+ *
1161
+ * ⚠️ **Only `WILDO_MANAGED` and `LOCAL_DIRECTORY` have a provider behind them.** `ONEDRIVE`,
1162
+ * `GOOGLE_DRIVE` and `DROPBOX` are declared vocabulary with no implementation — a field naming only
1163
+ * those has no configured provider, and startup configuration validation refuses the application
1164
+ * rather than letting it serve a field that could never accept an upload.
1165
+ *
1166
+ * ⚠️ **The target is decided once, when the file is created, and the object never moves.** Changing
1167
+ * a field's declared target changes where NEW files go; it does not relocate what is already stored.
1127
1168
  */
1128
1169
  export declare enum FileStorageAccepted {
1129
1170
  WILDO_MANAGED = "wildo_managed",
@@ -1132,6 +1173,7 @@ export declare enum FileStorageAccepted {
1132
1173
  GOOGLE_DRIVE = "google_drive",
1133
1174
  DROPBOX = "dropbox"
1134
1175
  }
1176
+ /** @wildo_source:part:end zod.decorators.file-vocabularies */
1135
1177
  /**
1136
1178
  * Context object passed to `FilePathBinding` resolver functions.
1137
1179
  *
@@ -1186,13 +1228,19 @@ export interface FileMultipleFilePolicy {
1186
1228
  *
1187
1229
  * ```
1188
1230
  * <provider root>/
1189
- * [applicationId/] ← only if includeApplicationId is true
1190
- * [folderPath(ctx)/] ← dynamic folder path
1191
- * <fileName(ctx) | fileId> ← explicit name or UUID fallback
1231
+ * applications/<applicationId>/files/ ← unless includeApplicationId is false
1232
+ * <storageName>/ ← the linked resource's collection, else `_unlinked`
1233
+ * <scope>/<scopeId>/ ← the tenant segments (organizations/<id>, user_self/<id>,
1234
+ * or application/<applicationId>)
1235
+ * [folderPath(ctx)/] ← dynamic folder path
1236
+ * <fileName(ctx) | fileId> ← explicit name or UUID fallback
1192
1237
  * ```
1193
1238
  *
1194
- * When nothing is configured, the fallback is the legacy `{fileId}` key
1195
- * for full backward compatibility.
1239
+ * Only the last two lines are authored here. Everything above them is derived by the framework and
1240
+ * is identical on every path-based provider, because `<scope>/<scopeId>` is what makes one tenant's
1241
+ * blobs a PREFIX — the unit erasure, orphan sweeps and per-tenant listing operate on.
1242
+ *
1243
+ * When nothing is configured, the leaf is the `{fileId}` UUID.
1196
1244
  *
1197
1245
  * @example
1198
1246
  * ```typescript
@@ -1250,13 +1298,18 @@ export interface FilePathBinding {
1250
1298
  */
1251
1299
  multipleFilePolicy?: FileMultipleFilePolicy;
1252
1300
  /**
1253
- * Whether to include the applicationId as a path segment.
1301
+ * Whether the framework-derived prefix — `applications/<appId>/files/<storageName>/<scope>/<scopeId>/`
1302
+ * — is placed above the authored `folderPath` / `fileName`.
1254
1303
  *
1255
- * Each provider has its own default:
1256
- * - `wildo_managed` (S3) → `true` (always, for bucket isolation)
1257
- * - `local_directory` → `false` (volume is typically per-app)
1304
+ * Defaults to `true` on EVERY provider. It used to default to `false` for `local_directory`
1305
+ * ("the volume is typically per-app"), and that is what left local-directory deployments with no
1306
+ * tenant structure at all: a per-app volume separates applications from one another and separates
1307
+ * nothing inside one.
1258
1308
  *
1259
- * Set explicitly to override the provider default.
1309
+ * Setting it to `false` collapses the key to the bare `[folderPath/]<fileName|fileId>` on every
1310
+ * provider. That discards the whole prefix, not merely the application segment — so erasure,
1311
+ * orphan sweeps, per-tenant listing and credential confinement all stop being expressible for
1312
+ * that field. Author it only for a store whose layout is fixed by something outside Wildo.
1260
1313
  */
1261
1314
  includeApplicationId?: boolean;
1262
1315
  }
@@ -1304,6 +1357,22 @@ export declare const AudioFormat: {
1304
1357
  };
1305
1358
  export type AudioFormat = typeof AudioFormat[keyof typeof AudioFormat];
1306
1359
  /**
1360
+ * @wildo_source:part:start zod.decorators.file-nature-constraints facet:layer:shared facet:audience:app-developer
1361
+ *
1362
+ * The per-NATURE constraint bags a `z_file()` field may carry — one per media kind, selected by the
1363
+ * field's `nature`. `imageConstraints`, `videoConstraints`, `audioConstraints` and
1364
+ * `documentConstraints` on the `z_file()` options each take the matching interface below.
1365
+ *
1366
+ * ⚠️ **A constraint describes what the FIELD ACCEPTS, not what the bytes ARE.** The media type comes
1367
+ * from the upload's declared content type; nothing here decodes the file to confirm that something
1368
+ * claiming to be an image is one. Treat these as an authoring contract and a form control's
1369
+ * behaviour, not as a security boundary — the defence against a mislabelled file is on the SERVING
1370
+ * side, where every response carries a no-sniff header and a restrictive content policy.
1371
+ *
1372
+ * ⚠️ **`generateThumbnails` (image, PLURAL) and `generateThumbnail` (video, SINGULAR) are different
1373
+ * options on different bags.** The names differ by one letter and do not behave alike; read each
1374
+ * one's own note below rather than assuming the image semantics carry over.
1375
+ *
1307
1376
  * Image-specific constraints for file validation.
1308
1377
  */
1309
1378
  export interface FileNatureConstraints_Image {
@@ -1316,6 +1385,22 @@ export interface FileNatureConstraints_Image {
1316
1385
  height: number;
1317
1386
  };
1318
1387
  allowedFormats?: ImageFormat[];
1388
+ /**
1389
+ * May the serve path derive a downscaled preview rendition of this image?
1390
+ *
1391
+ * **Opt-OUT, and absence means PERMIT.** Omitting it, or setting `true`, lets `?variant=thumbnail`
1392
+ * return a rendition. Setting it **`false` REFUSES** that request — it does not quietly serve the
1393
+ * original bytes, which is what every other ineligible case does and what an author suppressing
1394
+ * renditions for cost or privacy is trying to avoid. A caller wanting the image anyway asks for
1395
+ * the original variant explicitly.
1396
+ *
1397
+ * The `{ sizes: [...] }` form reads as permission and **its sizes are not honoured**: the
1398
+ * derivation has one fixed longest edge. Do not author sizes expecting them to reach the renderer.
1399
+ *
1400
+ * Wired 2026-09-08 (#477's sibling, #478). Before that this flag was declared, set on the
1401
+ * framework's own user-avatar field, and read by nothing — so it degraded permissively: an author
1402
+ * who set it `false` still got thumbnails, and got no error saying so.
1403
+ */
1319
1404
  generateThumbnails?: boolean | {
1320
1405
  sizes: {
1321
1406
  width: number;
@@ -1347,6 +1432,7 @@ export interface FileNatureConstraints_Document {
1347
1432
  maxPages?: number;
1348
1433
  minPages?: number;
1349
1434
  }
1435
+ /** @wildo_source:part:end zod.decorators.file-nature-constraints */
1350
1436
  /**
1351
1437
  * @wildo_source:part:start zod.decorators.rag-source facet:layer:shared facet:family:decorator facet:family:param-surface facet:kind:api facet:audience:app-developer
1352
1438
  *
@@ -1365,7 +1451,6 @@ export interface FileNatureConstraints_Document {
1365
1451
  *
1366
1452
  * - `FIXED_SIZE` — split every `chunkSize` characters/tokens regardless of structure.
1367
1453
  * - `RECURSIVE` — split on a separator hierarchy (paragraph → sentence → word) down to `chunkSize`.
1368
- * - `SEMANTIC` — split at embedding-detected topic boundaries.
1369
1454
  * - `MARKDOWN` — split on markdown structure (headings, lists, code fences).
1370
1455
  * - `CODE` — split on source-code structure (functions, classes, blocks). Unified in (2026-08-26)
1371
1456
  * from a second copy of this vocabulary that `saas-models` then carried: the member sets differed
@@ -1373,11 +1458,16 @@ export interface FileNatureConstraints_Document {
1373
1458
  * invalidated configurations authored against the wider one — so the union won. That second copy,
1374
1459
  * and the agent-level RAG configuration schemas around it, were retired on 2026-08-27 as a
1375
1460
  * pre-capability design the shipped capability superseded; this object is now the only home.
1461
+ *
1462
+ * There is deliberately NO semantic/embedding-based member. It is the option people reach for
1463
+ * first, and published evaluations put it BELOW `RECURSIVE` on both recall and precision while
1464
+ * costing an embedding pass per document — so `RECURSIVE` is the right default for prose, and the
1465
+ * two structure-aware members are for text whose structure carries meaning.
1466
+ *
1376
1467
  */
1377
1468
  export declare const RAGChunkingStrategy: {
1378
1469
  readonly FIXED_SIZE: "fixed_size";
1379
1470
  readonly RECURSIVE: "recursive";
1380
- readonly SEMANTIC: "semantic";
1381
1471
  readonly MARKDOWN: "markdown";
1382
1472
  readonly CODE: "code";
1383
1473
  };
@@ -1472,6 +1562,15 @@ export type FileMetadata = {
1472
1562
  uploadedAt: Date;
1473
1563
  } & FileUploaderOwnership;
1474
1564
  /**
1565
+ * @wildo_source:part:start zod.decorators.file-vocabularies
1566
+ *
1567
+ * What happens to the file when its parent record is deleted, chosen with
1568
+ * `z_file({ onParentDelete })`. Defaults to `CASCADE`.
1569
+ *
1570
+ * ⚠️ `SOFT_DELETE` behaves IDENTICALLY to `CASCADE` at runtime today. It exists as an explicit
1571
+ * semantic marker for consumers that want to model a softer intent — choosing it does not currently
1572
+ * change what happens to the file.
1573
+ *
1475
1574
  * File behavior when parent resource is deleted.
1476
1575
  * - CASCADE: Mark the file deleted as part of parent removal; physical storage cleanup is deferred to the cleanup batch
1477
1576
  * - SOFT_DELETE: Same current runtime behavior as CASCADE, but keeps an explicit semantic marker for consumers that want to model softer intent
@@ -1483,6 +1582,7 @@ export declare const FileOnParentDelete: {
1483
1582
  readonly ORPHAN: "orphan";
1484
1583
  };
1485
1584
  export type FileOnParentDelete = typeof FileOnParentDelete[keyof typeof FileOnParentDelete];
1585
+ /** @wildo_source:part:end zod.decorators.file-vocabularies */
1486
1586
  /**
1487
1587
  * @wildo_source:part:start zod.decorators.file-schema
1488
1588
  *
@@ -1541,9 +1641,16 @@ export interface FileSchemaMetadata {
1541
1641
  textExtraction?: FileTextExtractionOptions;
1542
1642
  /**
1543
1643
  * Antivirus scan policy for this file field.
1544
- * - 'required': always scan after upload, regardless of global config
1545
- * - 'skip': never scan this field, even if global scanning is enabled
1546
- * - undefined: inherit from `appConfig.files.scanning.enabled`
1644
+ * - 'required': always scan after upload, whatever the application-wide default says. If no scanner
1645
+ * is reachable the upload is FAILED rather than passed — a demanded scan that cannot run refuses.
1646
+ * - 'skip': never scan this field, even when the application has a scanner.
1647
+ * - undefined: inherit the application-wide default, which is DERIVED from whether a scanner is
1648
+ * reachable at all (a ClamAV host, or YARA both enabled and reachable). Provisioning the sidecar IS
1649
+ * the application-level opt-in; there is no separate on/off flag to set.
1650
+ *
1651
+ * That last line named `appConfig.files.scanning.enabled` until 2026-09-09. No configuration schema
1652
+ * has ever declared a `files` section, so the value an undeclared field inherited was `false` in every
1653
+ * application — this text described a switch that could not be turned on.
1547
1654
  */
1548
1655
  scanPolicy?: 'required' | 'skip';
1549
1656
  /** Behavior when parent resource is deleted (default: CASCADE) */
@@ -1654,9 +1761,16 @@ export interface FileSchemaOptions {
1654
1761
  /** @wildo_source:part:end zod.decorators.file-rag-source */
1655
1762
  /**
1656
1763
  * Antivirus scan policy for this file field.
1657
- * - 'required': always scan after upload, regardless of global config
1658
- * - 'skip': never scan this field, even if global scanning is enabled
1659
- * - undefined: inherit from `appConfig.files.scanning.enabled`
1764
+ * - 'required': always scan after upload, whatever the application-wide default says. If no scanner
1765
+ * is reachable the upload is FAILED rather than passed — a demanded scan that cannot run refuses.
1766
+ * - 'skip': never scan this field, even when the application has a scanner.
1767
+ * - undefined: inherit the application-wide default, which is DERIVED from whether a scanner is
1768
+ * reachable at all (a ClamAV host, or YARA both enabled and reachable). Provisioning the sidecar IS
1769
+ * the application-level opt-in; there is no separate on/off flag to set.
1770
+ *
1771
+ * That last line named `appConfig.files.scanning.enabled` until 2026-09-09. No configuration schema
1772
+ * has ever declared a `files` section, so the value an undeclared field inherited was `false` in every
1773
+ * application — this text described a switch that could not be turned on.
1660
1774
  */
1661
1775
  scanPolicy?: 'required' | 'skip';
1662
1776
  /** Behavior when parent resource is deleted (default: CASCADE) */
@@ -1786,12 +1900,18 @@ export interface BackendOnlyFieldParams {
1786
1900
  * then stripped from all subsequent READ operations.
1787
1901
  * Useful for secrets, API keys, etc. that should only be returned once.
1788
1902
  *
1789
- * This is also the framework's ONLY disclosure-audit trigger: a field that carries it emits one
1903
+ * This is one of the framework's two disclosure-audit triggers: a field that carries it emits one
1790
1904
  * `FIELD_ACCESS` audit event at the moment it is first (and last) exposed. That pairing is not a
1791
- * coincidence — first exposure is the only point at which a backend-only field crosses the client
1905
+ * coincidence: first exposure is the only point at which a backend-only field crosses the client
1792
1906
  * boundary at all, so it is the only point at which "this value left the system" is a true claim.
1793
1907
  *
1794
- * Scope limit worth knowing before relying on it: the audit event is raised from the TOP-LEVEL
1908
+ * The other trigger is `.isEphemeral()`, which fires on ANY operation rather than only on create,
1909
+ * so a rotate or a regenerate that hands the secret over again is recorded too. The two answer
1910
+ * different questions and neither implies the other: this one names the stored artifact, the
1911
+ * ephemeral marker names the value actually handed over. A field may carry either, both, or
1912
+ * neither, and one marked both is audited once.
1913
+ *
1914
+ * Scope limit worth knowing before relying on either: the audit event is raised from the TOP-LEVEL
1795
1915
  * shape of the response DTO. A single `CREATE` is the reliably covered case; do not assume a
1796
1916
  * bulk-create response gives you the same guarantee without checking.
1797
1917
  *
@@ -2060,8 +2180,28 @@ export interface BusinessKeySetParams {
2060
2180
  * @wildo_source:part:start zod.decorators.shared-structural-params facet:layer:shared facet:family:decorator facet:family:param-surface
2061
2181
  *
2062
2182
  * Parameters for the ttl decorator.
2063
- * Marks a Date field for TTL (Time To Live) expiration in MongoDB.
2064
- * MongoDB will automatically delete documents when the TTL expires.
2183
+ *
2184
+ * Declares a ROW LIFETIME: rows of this resource are deleted once the instant derived from this
2185
+ * Date field has passed. This is storage limitation — a compliance surface — not housekeeping, so
2186
+ * the declaration is ADAPTER-NEUTRAL and means the same thing wherever the resource is stored.
2187
+ *
2188
+ * How the deletion happens differs, and you do not choose it:
2189
+ * - on MongoDB, a native index expires the rows;
2190
+ * - on PostgreSQL there is no equivalent, so a scheduled sweep deletes them in bounded batches.
2191
+ *
2192
+ * The sweep is registered whichever store is in use, so a resource that declares a lifetime is
2193
+ * enforced on both. Do NOT read the MongoDB index as the mechanism and conclude the declaration is
2194
+ * inert elsewhere.
2195
+ *
2196
+ * Two consequences worth knowing before you declare one:
2197
+ * - the sweep is deliberately bounded per run, so a table receiving rows faster than they expire
2198
+ * stays above its target until the rate changes; it reports when it stops early;
2199
+ * - a resource CANNOT declare both a lifetime and retrieval-source fields (`.ragSource()`). That
2200
+ * pair is refused at startup, because rows expiring under a native index leave with no
2201
+ * application code running, so the derived search chunks could never be removed with them.
2202
+ *
2203
+ * This is unrelated to `retentionPolicy`, which decides what an ERASURE does to a row that must
2204
+ * SURVIVE. This one decides whether the row lives at all.
2065
2205
  *
2066
2206
  * @example
2067
2207
  * createdAt: z.date().ttl({ expireAfterSeconds: 3600 }) // Expire 1 hour after createdAt
@@ -2326,6 +2466,19 @@ export interface BooleanLabellingCustomParams {
2326
2466
  trueValue: string;
2327
2467
  falseValue: string;
2328
2468
  }
2469
+ /**
2470
+ * How a display field's LABEL is styled, independent of chrome mode (which decides layout).
2471
+ *
2472
+ * - `DEFAULT` — the chrome's ordinary label treatment.
2473
+ * - `TITLE` — the label reads as a SMALL TITLE above its content (small, semibold, foreground):
2474
+ * for a field that acts as a mini-section inside a prose flow — "Who suffers it" above its
2475
+ * answer — where the ordinary muted label would not carry the structure.
2476
+ */
2477
+ export declare const DisplayLabelStyle: {
2478
+ readonly DEFAULT: "default";
2479
+ readonly TITLE: "title";
2480
+ };
2481
+ export type DisplayLabelStyle = typeof DisplayLabelStyle[keyof typeof DisplayLabelStyle];
2329
2482
  /**
2330
2483
  * @wildo_source:part:start zod.decorators.primitive-ui
2331
2484
  *
@@ -2337,6 +2490,8 @@ export interface PrimitiveUIBaseDisplayParams {
2337
2490
  component?: DisplayFieldComponent;
2338
2491
  /** Chrome layout mode for the field wrapper in display context. */
2339
2492
  chromeMode?: ResponsiveAware<DisplayChromeMode>;
2493
+ /** Label styling, orthogonal to `chromeMode` (which decides LAYOUT). See `DisplayLabelStyle`. */
2494
+ labelStyle?: DisplayLabelStyle;
2340
2495
  /** Force-hide specific chrome sub-elements in display context. Plain object = all breakpoints. */
2341
2496
  forceHide?: ResponsiveAware<ForceHideDisplayConfig>;
2342
2497
  /** Whether to show a tooltip icon in display chrome. Text comes from i18n. */
@@ -2681,11 +2836,41 @@ export interface ForeignKeyUIParams {
2681
2836
  summaryOverride?: ForeignKeyUIDisplayParams;
2682
2837
  edit?: ForeignKeyUIEditParams;
2683
2838
  }
2839
+ /**
2840
+ * List marker treatment for a PRIMITIVE array's display items.
2841
+ *
2842
+ * Its own enum rather than a new `DisplayDirection` member on purpose: direction answers "which
2843
+ * axis do items flow on", marker style answers "does each item announce itself as one of several" —
2844
+ * merging them would make `BULLETS × horizontal` an unrepresentable-but-meaningful combination and
2845
+ * overload an enum that alignment code also reads.
2846
+ */
2847
+ export declare enum ArrayListStyle {
2848
+ /** Bare stacked values — the historical default. */
2849
+ PLAIN = "plain",
2850
+ /** A real bulleted list. For enumerations a reader SCANS — alternatives, consequences, principles — where bare stacked lines read as one run-on paragraph. */
2851
+ BULLETS = "bullets",
2852
+ /**
2853
+ * A RULED list: one hairline between entries, none above the first or below the last.
2854
+ *
2855
+ * For OBJECT entries a reader compares — an ICP after an ICP, a persona after a persona — where
2856
+ * spacing alone stops saying where one ends. It is the alternative to framing each entry as a
2857
+ * card, and the reason to prefer it is compounding chrome: inside a section that is already a
2858
+ * bounded region, a card per entry is a third frame around content that has two. Unlike
2859
+ * {@link ArrayListStyle.BULLETS}, which is for primitive lines, this is for entries.
2860
+ */
2861
+ SEPARATED = "separated"
2862
+ }
2684
2863
  export interface ArrayUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2685
2864
  /** Direction for rendering items in display context. */
2686
2865
  displayMode?: DisplayDirection;
2687
2866
  /** Max items shown in display (rest truncated). */
2688
2867
  maxItems?: number;
2868
+ /**
2869
+ * Marker treatment for PRIMITIVE items (see {@link ArrayListStyle}). No effect on object arrays —
2870
+ * their items are cards/rows, not list lines — and no effect on horizontal flow, where markers
2871
+ * have no line to anchor to.
2872
+ */
2873
+ listStyle?: ArrayListStyle;
2689
2874
  }
2690
2875
  /**
2691
2876
  * How NEW items are added to an array field in an edit / inline-edit surface.
@@ -2767,6 +2952,18 @@ export interface ObjectUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2767
2952
  displayMode?: DisplayDirection;
2768
2953
  /** Max properties shown in display (rest truncated). */
2769
2954
  maxItems?: number;
2955
+ /**
2956
+ * The member that IS this object's headline when the object renders as a unit (a nested object
2957
+ * block, an array item card): it renders FIRST, label hidden, with title emphasis; the remaining
2958
+ * members follow in schema order.
2959
+ *
2960
+ * Explicit rather than detected: "the first string field" guesses wrong the moment a stable
2961
+ * identifier precedes the human statement in the schema — exactly the shape ref-addressable
2962
+ * entries have (`ref` first, `statement` second), where detection would headline the machine key.
2963
+ * Names a member that does not exist → ignored, so a schema rename degrades to the old uniform
2964
+ * rendering instead of crashing the display.
2965
+ */
2966
+ primaryField?: string;
2770
2967
  }
2771
2968
  export type ObjectUIEditParams = PrimitiveUIBaseEditParams;
2772
2969
  export interface ObjectUIParams {
@@ -2846,15 +3043,34 @@ export declare enum CodeDeclarationKind {
2846
3043
  UNKNOWN = "unknown"
2847
3044
  }
2848
3045
  /**
2849
- * Public-import-oriented symbol reference used by semantic specifications.
3046
+ * Symbol reference used by semantic specifications to address one exported symbol.
3047
+ *
3048
+ * Downstream transposers and prompts prefer these refs over file-path guesses, so a
3049
+ * ref has to be honest about WHICH KIND of address it carries. Two facts are useful
3050
+ * and they are not the same fact, so they have separate fields:
2850
3051
  *
2851
- * Downstream transposers/prompts should prefer these refs over file-path
2852
- * guesses so generated code imports the right public symbol.
3052
+ * - `importPath` is an IMPORT SPECIFIER — something a generated `import` statement
3053
+ * can actually resolve, declared in the owning package's `package.json#exports`.
3054
+ * - `filePathHint` is a LOCATION — where a maintainer opens the file. It is never
3055
+ * rendered as something importable.
3056
+ *
3057
+ * Authoring a source path in `importPath` is the defect issue #150 records: it made
3058
+ * the companion hand a coding agent an import specifier that cannot resolve, because
3059
+ * an application package typically declares no export map entry for its internal
3060
+ * modules. When in doubt, author `filePathHint` — a location that is merely useful
3061
+ * is better than an address that is wrong.
2853
3062
  */
2854
3063
  export interface CodeSymbolRef {
2855
3064
  /** Package name to import from (for example `@wildo-ai/saas-models`). */
2856
3065
  packageName: string;
2857
- /** Optional public subpath when the package root is not the import target. */
3066
+ /**
3067
+ * Optional PUBLIC SUBPATH, when the package root is not the import target.
3068
+ *
3069
+ * Must be a subpath the owning package declares in `package.json#exports`, so that
3070
+ * `${packageName}/${importPath}` is a resolvable import specifier. If the symbol has
3071
+ * no public door, leave this unset and author `filePathHint` instead — do NOT put a
3072
+ * path inside `src/` here.
3073
+ */
2858
3074
  importPath?: string;
2859
3075
  /** Literal exported symbol name. */
2860
3076
  exportName: string;
@@ -2862,7 +3078,14 @@ export interface CodeSymbolRef {
2862
3078
  symbolKind: CodeSymbolKind;
2863
3079
  /** More specific declaration family for code-generation handling. */
2864
3080
  declarationKind?: CodeDeclarationKind;
2865
- /** Optional local-path hint for companion-side tooling/debugging. */
3081
+ /**
3082
+ * Optional MODULE LOCATION — where the symbol is defined inside the owning package,
3083
+ * relative to that package's source root (for example
3084
+ * `modules/tasks-manager/resources/tasks/tasks.ui-behavior`).
3085
+ *
3086
+ * This is a navigation aid, not an import target: it is rendered as a location and
3087
+ * must never be concatenated onto `packageName` to build an import specifier.
3088
+ */
2866
3089
  filePathHint?: string;
2867
3090
  /** Extra caveats or usage notes for downstream prompts. */
2868
3091
  notes?: string[];
@@ -3094,10 +3317,12 @@ export declare enum ZodDecorator {
3094
3317
  * could ask to have erased.
3095
3318
  *
3096
3319
  * ⚠️ This is a WRITE-side claim — "when this field CHANGES, the change itself is evidence" — and
3097
- * is independent of the READ-side disclosure trail. The only disclosure trigger the framework has
3098
- * is `isBackendOnly({ isReturnedAtCreation: true })`, which fires one `FIELD_ACCESS` event when a
3099
- * server-minted secret is first exposed. A field can carry either, both, or neither. There is no
3100
- * general "audit every read of this field" marker — do not go looking for one.
3320
+ * is independent of the READ-side disclosure trail. The framework has exactly two disclosure
3321
+ * triggers: `isBackendOnly({ isReturnedAtCreation: true })`, which fires one `FIELD_ACCESS` event
3322
+ * when a server-minted secret is first exposed on a create, and `.isEphemeral()`, which fires on
3323
+ * any operation so a rotate or regenerate is recorded as well. A field can carry any combination
3324
+ * of the three markers. There is still no general "audit every read of this field" marker; do not
3325
+ * go looking for one.
3101
3326
  *
3102
3327
  * assurance-control: WILDO.SECRETS.DISCLOSURE_AUDIT
3103
3328
  */