@declarion/react 0.57.0 → 0.59.2

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 (166) hide show
  1. package/README.md +0 -2
  2. package/dist-lib/AgentChatPanel.impl-DBH1Ff4G.js +1200 -0
  3. package/dist-lib/DetailAuditStrip-9eJM2Fml.js +288 -0
  4. package/dist-lib/{DraggableChildrenTable-BV5sb8Uo.js → DraggableChildrenTable-4RZC351U.js} +87 -86
  5. package/dist-lib/Grid-CQabaBLx.js +405 -0
  6. package/dist-lib/{LayoutRenderer-C9AH9cXf.js → LayoutRenderer-DGKWZKpW.js} +1000 -1114
  7. package/dist-lib/{ListCardsBody-DXcDg536.js → ListCardsBody-DfGmyNIu.js} +84 -84
  8. package/dist-lib/MarkdownRenderer-BDbzDv_y.js +87 -0
  9. package/dist-lib/{RefreshControl-CNtN8zSl.js → RefreshControl-Bhoib0ZA.js} +126 -155
  10. package/dist-lib/SmartDetailPage.impl-DFjz29Ff.js +1565 -0
  11. package/dist-lib/SmartListPage.impl-BrZLE_Gb.js +3046 -0
  12. package/dist-lib/{SmartRecordListPage.impl-Bkl9aZJ8.js → SmartRecordListPage.impl-C1FJLr80.js} +281 -280
  13. package/dist-lib/SortHeaderMenu-Cijxk4cX.js +107 -0
  14. package/dist-lib/action-dispatch-DY0c8U81.js +1967 -0
  15. package/dist-lib/api/client.d.ts +5 -0
  16. package/dist-lib/api/data.d.ts +2 -4
  17. package/dist-lib/api/entities.d.ts +8 -15
  18. package/dist-lib/api/events.d.ts +3 -3
  19. package/dist-lib/cardProjection-Bkl2SSYz.js +499 -0
  20. package/dist-lib/components/actions/ResponsiveActionBar.d.ts +17 -16
  21. package/dist-lib/components/agents/AgentChatPanel.d.ts +3 -13
  22. package/dist-lib/components/agents/AgentChatPanel.impl.d.ts +14 -0
  23. package/dist-lib/components/agents/AgentPicker.d.ts +1 -2
  24. package/dist-lib/components/chrome/PageShell.d.ts +7 -0
  25. package/dist-lib/components/chrome/RecordHeader.d.ts +1 -2
  26. package/dist-lib/components/chrome/headerActionZone.d.ts +27 -0
  27. package/dist-lib/components/detail-layout/DetailAuditStrip.d.ts +1 -2
  28. package/dist-lib/components/detail-layout/DetailHighlights.d.ts +1 -2
  29. package/dist-lib/components/detail-layout/blockMeta.d.ts +2 -1
  30. package/dist-lib/components/fields/BoolField.d.ts +1 -1
  31. package/dist-lib/components/fields/EnumField.d.ts +1 -1
  32. package/dist-lib/components/fields/IntArrayField.d.ts +1 -1
  33. package/dist-lib/components/fields/MultilangArrayField.d.ts +2 -0
  34. package/dist-lib/components/fields/MultilangField.d.ts +1 -1
  35. package/dist-lib/components/fields/MultilangTextField.d.ts +1 -1
  36. package/dist-lib/components/fields/NumberField.d.ts +1 -1
  37. package/dist-lib/components/fields/PasswordField.d.ts +1 -1
  38. package/dist-lib/components/fields/RefCombobox.d.ts +1 -1
  39. package/dist-lib/components/fields/SecretField.d.ts +1 -1
  40. package/dist-lib/components/fields/StringArrayField.d.ts +1 -1
  41. package/dist-lib/components/fields/TimestampField.d.ts +1 -1
  42. package/dist-lib/components/fields/cells/registry.d.ts +2 -1
  43. package/dist-lib/components/fields/index.d.ts +2 -1
  44. package/dist-lib/components/fields/langMap.d.ts +2 -0
  45. package/dist-lib/components/fields/secretValue.d.ts +2 -0
  46. package/dist-lib/components/file-widgets/UnknownFileWidget.d.ts +3 -0
  47. package/dist-lib/components/file-widgets/UploadFailureText.d.ts +4 -0
  48. package/dist-lib/components/file-widgets/helpers.d.ts +1 -1
  49. package/dist-lib/components/file-widgets/host.d.ts +4 -3
  50. package/dist-lib/components/file-widgets/types.d.ts +1 -0
  51. package/dist-lib/components/file-widgets/upload.d.ts +18 -3
  52. package/dist-lib/components/filters/filter-op-label.d.ts +3 -0
  53. package/dist-lib/components/layout/ImpersonationBanner.d.ts +1 -1
  54. package/dist-lib/components/layout/ImpersonationFrame.d.ts +1 -1
  55. package/dist-lib/components/layout/Layout.d.ts +2 -1
  56. package/dist-lib/components/layout/Sidebar.d.ts +2 -1
  57. package/dist-lib/components/layout/TenantChip.d.ts +1 -1
  58. package/dist-lib/components/list/ViewSwitcher.d.ts +4 -2
  59. package/dist-lib/components/pages/DocumentsMenu.d.ts +1 -2
  60. package/dist-lib/components/pages/ExportMenu.d.ts +3 -5
  61. package/dist-lib/components/pages/RecordDocumentsPanel.d.ts +1 -2
  62. package/dist-lib/components/pages/auth/AuthShell.d.ts +4 -31
  63. package/dist-lib/components/pages/exportRequest.d.ts +4 -6
  64. package/dist-lib/components/pages/list/DeleteViewDialog.d.ts +8 -0
  65. package/dist-lib/components/pages/list/ListCardRow.d.ts +1 -2
  66. package/dist-lib/components/pages/list/ListCardsBody.d.ts +0 -1
  67. package/dist-lib/components/pages/list/ListFloatbar.d.ts +2 -2
  68. package/dist-lib/components/pages/list/ListHeader.d.ts +2 -2
  69. package/dist-lib/components/pages/list/ListNoRows.d.ts +4 -5
  70. package/dist-lib/components/pages/list/ListToolbar.d.ts +3 -2
  71. package/dist-lib/components/pages/list/ListUrlBanner.d.ts +10 -0
  72. package/dist-lib/components/pages/list/RowActionsCell.d.ts +2 -4
  73. package/dist-lib/components/pages/list/RowContextMenu.d.ts +1 -2
  74. package/dist-lib/components/pages/list/columns.d.ts +2 -1
  75. package/dist-lib/components/pages/list/filter-meta.d.ts +2 -1
  76. package/dist-lib/components/pages/list/useActiveView.d.ts +38 -0
  77. package/dist-lib/components/pages/list/useListColumnLayout.d.ts +6 -5
  78. package/dist-lib/components/pages/list/useListQuery.d.ts +4 -4
  79. package/dist-lib/components/pages/list/useListSort.d.ts +5 -4
  80. package/dist-lib/components/pages/list/useListViews.d.ts +18 -8
  81. package/dist-lib/components/pages/list/useRowMenu.d.ts +2 -3
  82. package/dist-lib/components/pages/profile/Profile.d.ts +3 -0
  83. package/dist-lib/components/params/ParamsBlock.d.ts +1 -13
  84. package/dist-lib/components/params/param-editors.d.ts +3 -11
  85. package/dist-lib/components/primitives/ClassifiedFieldLocked.d.ts +1 -2
  86. package/dist-lib/components/shared/DynamicIcon.d.ts +2 -2
  87. package/dist-lib/components/shared/LoadingSkeleton.d.ts +1 -0
  88. package/dist-lib/components/shared/LucideIcon.d.ts +1 -1
  89. package/dist-lib/components/shared/useOwnRefresh.d.ts +1 -1
  90. package/dist-lib/declarion-react.css +1 -1
  91. package/dist-lib/embed/theme.d.ts +1 -1
  92. package/dist-lib/embed/useEmbedNavigate.d.ts +1 -1
  93. package/dist-lib/failure-v-uGSpbX.js +158 -0
  94. package/dist-lib/{field-classification-D6xQYn-h.js → field-classification-C28XE-_P.js} +514 -307
  95. package/dist-lib/format-count-DA4wmmWR.js +1771 -0
  96. package/dist-lib/hooks/useEntityData.d.ts +1 -1
  97. package/dist-lib/hooks/useFilters.d.ts +7 -5
  98. package/dist-lib/hooks/useLanguage.d.ts +4 -0
  99. package/dist-lib/hooks/useParams.d.ts +4 -51
  100. package/dist-lib/hooks/useRegisterScreenTab.d.ts +1 -1
  101. package/dist-lib/hooks/useSSE.d.ts +3 -3
  102. package/dist-lib/hooks/useTabTitle.d.ts +2 -0
  103. package/dist-lib/hooks/useText.d.ts +3 -3
  104. package/dist-lib/hooks/useVersionWatcher.d.ts +1 -1
  105. package/dist-lib/hooks/useViews.d.ts +20 -0
  106. package/dist-lib/index.d.ts +8 -7
  107. package/dist-lib/index.js +2716 -5803
  108. package/dist-lib/lib/action-dispatch.d.ts +2 -1
  109. package/dist-lib/lib/actions.d.ts +30 -42
  110. package/dist-lib/lib/anchor.d.ts +3 -4
  111. package/dist-lib/lib/decimal-text.d.ts +1 -0
  112. package/dist-lib/lib/document-templates.d.ts +1 -2
  113. package/dist-lib/lib/download.d.ts +2 -1
  114. package/dist-lib/lib/evidence-verdict.d.ts +2 -1
  115. package/dist-lib/lib/failure.d.ts +2 -0
  116. package/dist-lib/lib/field-classification.d.ts +3 -3
  117. package/dist-lib/lib/filters.d.ts +18 -2
  118. package/dist-lib/lib/format-count.d.ts +8 -7
  119. package/dist-lib/lib/language.d.ts +19 -0
  120. package/dist-lib/lib/mass-edit.d.ts +2 -1
  121. package/dist-lib/lib/realtime-query-keys.d.ts +1 -1
  122. package/dist-lib/lib/realtime-reconcile.d.ts +3 -4
  123. package/dist-lib/lib/screen-back.d.ts +4 -6
  124. package/dist-lib/lib/sort.d.ts +9 -9
  125. package/dist-lib/lib/timestamp.d.ts +5 -7
  126. package/dist-lib/lib/ui-actions.d.ts +2 -1
  127. package/dist-lib/peekDraftStore-D-cTbiIr.js +199 -0
  128. package/dist-lib/registry-Cb3W-czW.js +1950 -0
  129. package/dist-lib/safe-url-oSJw5pzO.js +34 -0
  130. package/dist-lib/stores/icon-registry.d.ts +2 -2
  131. package/dist-lib/stores/list-layout.d.ts +3 -4
  132. package/dist-lib/stores/realtime.d.ts +1 -1
  133. package/dist-lib/stores/tabs.d.ts +3 -2
  134. package/dist-lib/testing.d.ts +6 -0
  135. package/dist-lib/testing.js +98 -76
  136. package/dist-lib/types/api.d.ts +7 -8
  137. package/dist-lib/types/fieldType.d.ts +1 -1
  138. package/dist-lib/types/files.d.ts +4 -4
  139. package/dist-lib/types/schema.d.ts +44 -50
  140. package/dist-lib/useAgentConversation-D97IqE-J.js +623 -0
  141. package/dist-lib/{useCurrentScreen-CzwzQpoW.js → useCurrentScreen-BL5NZFCw.js} +2777 -3768
  142. package/dist-lib/useListQuery-BG1GyKtJ.js +103 -0
  143. package/dist-lib/useProperties-4Lg3odrt.js +83 -0
  144. package/dist-lib/{useTabSearchMirror-C39U85cg.js → useTabSearchMirror-ZVLlINBX.js} +49 -51
  145. package/dist-lib/useText-BFDCTUSo.js +952 -0
  146. package/dist-lib/{value-Bo8C8WMU.js → value-By1-WJ8J.js} +74 -76
  147. package/dist-lib/vite/fingerprint-plugin.d.ts +2 -3
  148. package/package.json +9 -9
  149. package/dist-lib/Grid-DWgUPuZ3.js +0 -404
  150. package/dist-lib/MarkdownRenderer-CcSFc2N3.js +0 -85
  151. package/dist-lib/RecordIdBadge-CGxPR-8q.js +0 -24
  152. package/dist-lib/SmartDetailPage.impl-lskCd-WG.js +0 -1846
  153. package/dist-lib/SmartListPage.impl-CrGbdzyK.js +0 -2854
  154. package/dist-lib/SortHeaderMenu-SYSAaqQJ.js +0 -106
  155. package/dist-lib/action-dispatch-CR4ajBtT.js +0 -1985
  156. package/dist-lib/cardProjection-CW5RIMko.js +0 -699
  157. package/dist-lib/components/pages/home/HomeStub.d.ts +0 -6
  158. package/dist-lib/components/pages/jobs/Jobs.d.ts +0 -1
  159. package/dist-lib/components/pages/pipeline/Pipeline.d.ts +0 -1
  160. package/dist-lib/format-count-Dobmi-Ji.js +0 -1551
  161. package/dist-lib/hooks/useUserLocale.d.ts +0 -1
  162. package/dist-lib/lib/messages.d.ts +0 -12
  163. package/dist-lib/peekDraftStore-5wQ7lq_V.js +0 -194
  164. package/dist-lib/registry-CjgUaF7C.js +0 -1768
  165. package/dist-lib/useListQuery-D7Hr5WM1.js +0 -96
  166. package/dist-lib/useProperties-CqtCzFCr.js +0 -81
@@ -2,6 +2,7 @@ import { OrderedMap } from "./ordmap";
2
2
  import type { FileFieldDef } from "./files";
3
3
  import type { IconDef } from "../stores/icon-registry.d.ts";
4
4
  import type { FilterNode } from "../lib/filters.d.ts";
5
+ import type { TextFn } from "../lib/language.d.ts";
5
6
  export { OrderedMap };
6
7
  export type { IconDef };
7
8
  export type LocalizedString = Record<string, string>;
@@ -14,9 +15,8 @@ export type LocalizedString = Record<string, string>;
14
15
  * none — no request at all; render the globe placeholder.
15
16
  *
16
17
  * Declared per column by `field.display.favicon_source`, and nowhere else -
17
- * there is no parameter (plan 2026-07-09 Decision 23). Absent = `google`,
18
- * today's rendered default. Mirrors `validFaviconSources` in
19
- * golang/internal/engine/types_field_display.go.
18
+ * there is no parameter. Absent = `google`, today's rendered default. The
19
+ * server accepts exactly these three values.
20
20
  */
21
21
  export type FaviconSource = "google" | "direct" | "none";
22
22
  /**
@@ -37,9 +37,8 @@ export interface EmptyStateDef {
37
37
  * with Go's engine.DetailScreenNone - keep the literal "none" in sync.
38
38
  */
39
39
  export declare const DETAIL_SCREEN_NONE = "none";
40
- export declare function loc(ls: LocalizedString | undefined, lang?: string): string;
41
40
  export declare const DISPLAY_KEY = "$display";
42
- export declare function getDisplayValue(row: Record<string, unknown> | null | undefined, entity: {
41
+ export declare function getDisplayValue(t: TextFn, row: Record<string, unknown> | null | undefined, entity: {
43
42
  display?: {
44
43
  display_field?: string;
45
44
  };
@@ -47,12 +46,13 @@ export declare function getDisplayValue(row: Record<string, unknown> | null | un
47
46
  get(name: string): EntityField | undefined;
48
47
  };
49
48
  } | null | undefined): string | undefined;
50
- export declare function resolveRefRecordLabel(record: Record<string, unknown>, displayKey: string | undefined, fallback: string): string;
51
- export declare function screenTitleForPath(pathname: string, screens: Record<string, Screen> | undefined, entities?: Record<string, Entity>): {
49
+ export declare function resolveRefRecordLabel(t: TextFn, record: Record<string, unknown>, displayKey: string | undefined, fallback: string): string;
50
+ export declare function screenTitleForPath(t: TextFn, pathname: string, screens: Record<string, Screen> | undefined, entities?: Record<string, Entity>): {
52
51
  title: string;
53
52
  icon?: string;
53
+ exact: boolean;
54
54
  } | undefined;
55
- export declare function fieldDisplayName(field: EntityField, fieldName: string, entities?: Record<string, Entity>): string;
55
+ export declare function fieldDisplayName(t: TextFn, field: EntityField, fieldName: string, entities?: Record<string, Entity>): string;
56
56
  export interface RefDisplay {
57
57
  field: string;
58
58
  }
@@ -163,8 +163,7 @@ export interface EntityField {
163
163
  array?: boolean;
164
164
  copyable?: boolean;
165
165
  /**
166
- * Plan 2026-05-26 §4 / B13. Names the data_classifications tier
167
- * gating reads + writes on this field. Read-side: stripped from the
166
+ * Names the data_classifications tier gating reads + writes on this field. Read-side: stripped from the
168
167
  * row when the caller lacks `classification:<tier>:read`. Write-side:
169
168
  * 422 FIELDS_FORBIDDEN when the caller writes the key without
170
169
  * `classification:<tier>:write`. Frontend reads the tier's localized
@@ -176,7 +175,7 @@ export interface EntityField {
176
175
  }
177
176
  /**
178
177
  * Per-caller classification decision for one classified field on one
179
- * entity. Plan 2026-05-26 §8 / B9. Populated by the schema endpoint
178
+ * entity. Populated by the schema endpoint
180
179
  * from the caller's grants + authority tier; the frontend reads this
181
180
  * to render the locked-widget badge ("🔒 Compensation"), disable write
182
181
  * inputs, and surface the operator-facing `required_permission` hint
@@ -332,8 +331,7 @@ export interface EntityVariant {
332
331
  actions?: string[];
333
332
  }
334
333
  /** A set of CRUD op flags, each present or absent. The YAML-decoded shape of
335
- * an entity's `public` opt-out block (deny-by-default authorization, plan
336
- * 2026-06-17). A flag being true means that op is open to ALL authenticated
334
+ * an entity's `public` opt-out block (deny-by-default authorization). A flag being true means that op is open to ALL authenticated
337
335
  * callers with no grant required. Mirrors engine.OpSet. On the /api/schema
338
336
  * wire it always serializes as this object (never a bare bool, even though
339
337
  * YAML accepts `public: true`). */
@@ -396,8 +394,7 @@ export interface Entity {
396
394
  associations?: Record<string, AssociationDef>;
397
395
  files?: OrderedMap<FileFieldDef>;
398
396
  detail_screen?: string;
399
- /** Standard CSV export gate per docs/plans/2026-05-01-standard-table-export.md.
400
- * Absent block (or absent `enabled`) means export is enabled. Only an
397
+ /** Standard CSV export gate. Absent block (or absent `enabled`) means export is enabled. Only an
401
398
  * explicit `enabled: false` opts out, mirroring the Go ExportEnabled()
402
399
  * helper. Same shape ships on Screen for per-screen overrides. */
403
400
  export?: ExportConfig;
@@ -410,8 +407,8 @@ export interface Entity {
410
407
  * profile -> "user"). Absent = writes land under the entity's own code. Used
411
408
  * by ParamsBlock to compute the attachable parameter set. */
412
409
  params_scope?: string;
413
- /** Server-enforced WHERE applied unconditionally on every read/write
414
- * via server/handlers/data_prefilter.go. Values may be literal scalars
410
+ /** Server-enforced WHERE applied unconditionally on every read/write.
411
+ * Values may be literal scalars
415
412
  * OR `$caller.*` expressions (`$caller.user_id`, `$caller.tenant_id`)
416
413
  * resolved at request time. Security boundary, not a UX hint. */
417
414
  prefilter?: Record<string, unknown>;
@@ -421,9 +418,9 @@ export interface Entity {
421
418
  * with_check). `"tenant_admin"` admits any administrative standing in the
422
419
  * active tenant (superadmin / tenant_owner / any role grant). `"superadmin"`
423
420
  * admits only the platform-wide god flag. Empty = no tier floor (standard
424
- * RBAC). The legacy `"platform_admin"` alias was removed (plan 2026-06-17). */
421
+ * RBAC). The legacy `"platform_admin"` alias was removed. */
425
422
  access?: "self" | "tenant_admin" | "superadmin";
426
- /** Deny-by-default authorization (plan 2026-06-17). Absent = every op
423
+ /** Deny-by-default authorization. Absent = every op
427
424
  * requires its `entity:<code>:<op>` grant. `public.<op>: true` opts that op
428
425
  * out of the grant requirement, opening it to all authenticated callers
429
426
  * (NOT anonymous). The Entity.Access floor is checked first and is never
@@ -435,11 +432,11 @@ export interface Entity {
435
432
  * Optional structural tree for placing and grouping actions across all
436
433
  * placement slots. Absent = runtime composes a flat list from all actions
437
434
  * matching each slot's visibility[], sorted by position ascending.
438
- * Server delivers RBAC-pruned nodes in tagged-union wire format (plan §8).
435
+ * Server delivers RBAC-pruned nodes in tagged-union wire format.
439
436
  */
440
437
  action_layout?: ActionLayoutNode[];
441
438
  /**
442
- * Plan 2026-05-26 §B9 / §B13. Per-caller classification access
439
+ * Per-caller classification access
443
440
  * decision keyed by field name. Only present for entities that
444
441
  * declare at least one classified field; absent on non-classification
445
442
  * entities so the wire stays byte-equivalent for non-classification
@@ -454,8 +451,7 @@ export interface Entity {
454
451
  * toolbar shows a green "Live" indicator. Absent or false (default OFF)
455
452
  * means the entity is not live: no indicator, and the always-present
456
453
  * manual refresh control is the only freshness mechanism. Server emits
457
- * this with `omitempty`, so `false` arrives as absent. See
458
- * docs/plans/completed/2026-05-18-realtime-cdc-redesign.md.
454
+ * this with `omitempty`, so `false` arrives as absent.
459
455
  */
460
456
  realtime?: boolean;
461
457
  /**
@@ -464,8 +460,7 @@ export interface Entity {
464
460
  * O(1) query-planner estimate, rendered coarse (~3.6M) for high-volume
465
461
  * tables. Independent of `realtime`. The SDK keys list-view count
466
462
  * precision on the response `meta.count_mode`, not this field, so a
467
- * forced exact count still renders precisely. See
468
- * docs/plans/2026-05-18-declarative-row-count.md.
463
+ * forced exact count still renders precisely.
469
464
  */
470
465
  count?: "exact" | "estimated";
471
466
  /**
@@ -475,7 +470,7 @@ export interface Entity {
475
470
  * AND the deployment has ClickHouse wired at boot - a cross-store hot+cold
476
471
  * read cannot offset-paginate. Absent means "offset" (every plain Postgres /
477
472
  * ClickHouse-only / ClickHouse-disabled-archive entity). The SDK branches the
478
- * list UI on this. See docs/plans/2026-06-20-cross-store-list-cursor-pagination.md.
473
+ * list UI on this.
479
474
  */
480
475
  list_pagination?: "offset" | "cursor";
481
476
  /**
@@ -488,7 +483,7 @@ export interface Entity {
488
483
  * template is found via the lazy `document.templates.available` runtime
489
484
  * probe (tenant templates are runtime data and are never baked into the
490
485
  * schema). `generate_one` gates the detail-scope toolbar; `generate_many`
491
- * gates the list-scope toolbar. See docs/document-generation.md.
486
+ * gates the list-scope toolbar.
492
487
  */
493
488
  documents?: {
494
489
  generate_one?: boolean;
@@ -603,8 +598,8 @@ export interface AuditConfig {
603
598
  enabled?: boolean;
604
599
  lines?: AuditLineDef[];
605
600
  }
606
- /** Resolved per-screen visibility decision (deny-by-default authorization,
607
- * plan 2026-06-17). Computed by the engine at load - authors write
601
+ /** Resolved per-screen visibility decision (deny-by-default authorization).
602
+ * Computed by the engine at load - authors write
608
603
  * `public` / `required_permission`, never this. `public` and
609
604
  * `required_permission` are mutually exclusive; `source` is the audit
610
605
  * provenance (authored:public | authored | authored->public |
@@ -717,8 +712,7 @@ export interface Screen {
717
712
  * viewer's own default view wins over it. */
718
713
  default_view?: string;
719
714
  /** Action slot promotion for list screens (rule-of-2). UI honors first 2.
720
- * Note: primary_record_actions (detail header) was removed in Task 5 of plan
721
- * 2026-04-21-action-toolbar-priority-overflow. Use action_layout instead. */
715
+ * The detail-header `primary_record_actions` was removed; use action_layout. */
722
716
  primary_actions?: string[];
723
717
  primary_bulk_actions?: string[];
724
718
  /** "open" (default) navigates to detail; "peek" opens QuickPeek drawer. */
@@ -735,7 +729,7 @@ export interface Screen {
735
729
  * Optional per-screen structural tree for placing and grouping actions.
736
730
  * When set, fully replaces entity.action_layout for this screen.
737
731
  * Absent = inherit entity.action_layout (then default-flat if also absent).
738
- * Server delivers RBAC-pruned nodes in tagged-union wire format (plan §8).
732
+ * Server delivers RBAC-pruned nodes in tagged-union wire format.
739
733
  */
740
734
  action_layout?: ActionLayoutNode[];
741
735
  }
@@ -860,7 +854,7 @@ export interface UIStep {
860
854
  }
861
855
  /**
862
856
  * Leaf node in an action_layout tree. References a single action by code.
863
- * Wire format (plan §8): {"kind": "action", "code": "<code>"}
857
+ * Wire format: {"kind": "action", "code": "<code>"}
864
858
  */
865
859
  export interface ActionLayoutLeaf {
866
860
  kind: "action";
@@ -868,7 +862,7 @@ export interface ActionLayoutLeaf {
868
862
  }
869
863
  /**
870
864
  * Branch node in an action_layout tree. Groups child nodes under a labelled dropdown.
871
- * Wire format (plan §8): {"kind": "group", "name": {...}, "icon": "...", "items": [...]}
865
+ * Wire format: {"kind": "group", "name": {...}, "icon": "...", "items": [...]}
872
866
  * Items is always non-empty (enforced by loader).
873
867
  */
874
868
  export interface ActionLayoutGroup {
@@ -900,7 +894,7 @@ export interface ActionConditionEntry {
900
894
  export type ActionConditionList = ActionConditionEntry[];
901
895
  export interface Action {
902
896
  /**
903
- * Server-side handler code. One of four dispatch fields - see plan §1-§2.
897
+ * Server-side handler code. One of four dispatch fields.
904
898
  * Reason: the new wire format encodes dispatch mode by which field is set
905
899
  * (handler | association | widget | href), so an explicit `type` enum is
906
900
  * redundant and was removed. Exactly one of the four should be set per action.
@@ -908,12 +902,12 @@ export interface Action {
908
902
  handler?: string;
909
903
  /**
910
904
  * Association code for nav-only actions that navigate to a related list.
911
- * Reason: same dispatch-by-field-presence rule; see plan §1-§2.
905
+ * Reason: same dispatch-by-field-presence rule.
912
906
  */
913
907
  association?: string;
914
908
  /**
915
- * SDK widget registry name. Phase 2 wires the registry; today the field
916
- * is plumbed through the schema and consumed by Task 38's toolbar pipeline.
909
+ * SDK widget registry name. The SDK has no widget registry yet: an action
910
+ * carrying `widget` logs a warning and falls back to `onRun`.
917
911
  * Reason: lets actions render bespoke UI (e.g. inline picker) instead of
918
912
  * server-handled forms, without inventing a new entity per widget.
919
913
  */
@@ -956,15 +950,15 @@ export interface Action {
956
950
  */
957
951
  size?: "sm" | "md" | "lg";
958
952
  /**
959
- * Keyboard shortcut hint (e.g. "Cmd+S"). Rendered in tooltip/menu.
960
- * Reason: discoverability for power users; binding is wired in Task 38.
953
+ * Keyboard shortcut hint (e.g. "Cmd+S"), carried on the wire. The SDK
954
+ * neither renders it nor binds the key yet.
961
955
  */
962
956
  shortcut?: string;
963
957
  /**
964
958
  * Localized explanation of what the action does. Surfaces as the control
965
959
  * tooltip (precedence: disabled-reason > description > name) and the
966
960
  * ActionDialog subtitle. Optional; absent renders exactly as before.
967
- * (Supersedes the removed `help` field - plan 2026-07-02 Decision 16.)
961
+ * Supersedes the removed `help` field.
968
962
  */
969
963
  description?: LocalizedString;
970
964
  };
@@ -973,25 +967,24 @@ export interface Action {
973
967
  conditions?: ActionCondition[];
974
968
  /**
975
969
  * Ordering within a placement slot and overflow priority. Lower = earlier
976
- * in bar AND last to overflow. Default 0; ties broken by declaration order.
977
- * Step-10 convention. See plan §1 and §3.
970
+ * in bar AND last to overflow. Default 0; ties broken by action code.
971
+ * Convention: step by 10 so a later action fits between two.
978
972
  */
979
973
  position?: number;
980
974
  /**
981
975
  * Hide the action when condition does not hold against current row.
982
976
  * Distinct from RBAC hide and from `enabled_if` disable. AND semantics
983
- * across array elements. See plan §1, §5.
977
+ * across array elements.
984
978
  */
985
979
  visible_if?: ActionConditionList;
986
980
  /**
987
981
  * Disable the action (greyed out + tooltip) when condition does not hold.
988
982
  * For bulk-mode multi-row selection, disabled if ANY selected row fails.
989
- * See plan §1, §5.
990
983
  */
991
984
  enabled_if?: ActionConditionList;
992
985
  /**
993
986
  * Localized tooltip shown when action is disabled by `enabled_if`.
994
- * Required when `enabled_if` is set (loader validates in Task 3).
987
+ * Required when `enabled_if` is set; the schema loader enforces it.
995
988
  */
996
989
  enabled_if_reason?: LocalizedString;
997
990
  /** Forces confirm + danger styling. */
@@ -1037,6 +1030,8 @@ export interface HandlerDef {
1037
1030
  }
1038
1031
  export interface Schema {
1039
1032
  languages: LanguageDef[];
1033
+ language: string;
1034
+ deployment_language: string;
1040
1035
  structures: Record<string, StructureDef>;
1041
1036
  entities: Record<string, Entity>;
1042
1037
  screens: Record<string, Screen>;
@@ -1059,7 +1054,7 @@ export interface Schema {
1059
1054
  areas?: AreaDef[];
1060
1055
  accents?: Record<string, AccentDef>;
1061
1056
  /**
1062
- * Plan 2026-05-26 §B9 / §B13. data_classifications catalog keyed by
1057
+ * data_classifications catalog keyed by
1063
1058
  * tier code — display name + description + audit_on_read flag + icon
1064
1059
  * + sod_protected flag. Absent when the consumer declares no tiers
1065
1060
  * (preserves byte-equivalent wire shape for non-classification
@@ -1072,13 +1067,12 @@ export interface Schema {
1072
1067
  * call sites. Carries ONLY declared/overridden entries (the built-in ~119
1073
1068
  * travel as bare names, never here); absent when no module declares an
1074
1069
  * `icons:` block. The Admin loads this into the runtime icon registry
1075
- * (setIconRegistry) so custom glyphs render across the chrome. Plan
1076
- * 2026-06-12-consumer-extensible-icons.md §4.
1070
+ * (setIconRegistry) so custom glyphs render across the chrome.
1077
1071
  */
1078
1072
  icons?: Record<string, IconDef>;
1079
1073
  }
1080
1074
  /**
1081
- * Plan 2026-05-26 §B9. One entry in the top-level classifications map.
1075
+ * One entry in the top-level classifications map.
1082
1076
  * Mirrors engine.DataClassification.
1083
1077
  */
1084
1078
  export interface ClassificationTierDef {