@exponential-at/ui 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +360 -2
  4. package/catalog/a11y.json +668 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +4752 -0
  8. package/catalog/core.schema.json +22667 -0
  9. package/catalog/host.json +64 -0
  10. package/catalog/layout.json +20 -0
  11. package/catalog/limits.json +9 -0
  12. package/catalog/locale.json +48 -0
  13. package/catalog/macros.json +3417 -0
  14. package/catalog/recipes.json +61 -0
  15. package/catalog/strings.json +72 -0
  16. package/catalog/style.json +128 -0
  17. package/catalog/theme.schema.json +42543 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +217 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +683 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +96 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +154 -0
  27. package/conformance/manifest.json +224 -0
  28. package/conformance/parity-compare.ts +191 -0
  29. package/conformance/parity-report.schema.json +73 -0
  30. package/conformance/parity.ts +412 -0
  31. package/conformance/pixel.ts +177 -0
  32. package/conformance/primitives-page.ts +49 -0
  33. package/conformance/report.schema.json +66 -0
  34. package/conformance/run.ts +118 -0
  35. package/dist/chunks/index-98npjvsd.js +3940 -0
  36. package/dist/chunks/index-98npjvsd.js.map +27 -0
  37. package/dist/chunks/index-gwkt14w3.js +7314 -0
  38. package/dist/chunks/index-gwkt14w3.js.map +10 -0
  39. package/dist/chunks/index-njt7yzzm.js +134 -0
  40. package/dist/chunks/index-njt7yzzm.js.map +9 -0
  41. package/dist/chunks/index-we7va6v6.js +7984 -0
  42. package/dist/chunks/index-we7va6v6.js.map +15 -0
  43. package/dist/chunks/index-xrm6f7wc.js +2563 -0
  44. package/dist/chunks/index-xrm6f7wc.js.map +10 -0
  45. package/dist/conformance.js +182749 -0
  46. package/dist/conformance.js.map +10 -0
  47. package/dist/entries/prompt.js +251 -0
  48. package/dist/entries/prompt.js.map +11 -0
  49. package/dist/entries/schema.js +1725 -0
  50. package/dist/entries/schema.js.map +11 -0
  51. package/dist/host/index.js +122 -0
  52. package/dist/host/index.js.map +9 -0
  53. package/dist/index.js +3213 -0
  54. package/dist/index.js.map +27 -0
  55. package/dist/types/src/a11y.d.ts +21 -0
  56. package/dist/types/src/animation.d.ts +76 -0
  57. package/dist/types/src/basic-map.d.ts +38 -0
  58. package/dist/types/src/builder.d.ts +50 -0
  59. package/dist/types/src/catalog.d.ts +54 -0
  60. package/dist/types/src/catalog.described.d.ts +33 -0
  61. package/dist/types/src/catalog.generated.d.ts +829 -0
  62. package/dist/types/src/chart.d.ts +46 -0
  63. package/dist/types/src/code.d.ts +44 -0
  64. package/dist/types/src/color.d.ts +20 -0
  65. package/dist/types/src/conformance.d.ts +39 -0
  66. package/dist/types/src/connector/app.d.ts +14 -0
  67. package/dist/types/src/connector/connector.d.ts +77 -0
  68. package/dist/types/src/connector/index.d.ts +4 -0
  69. package/dist/types/src/css.d.ts +29 -0
  70. package/dist/types/src/define.d.ts +66 -0
  71. package/dist/types/src/direction.d.ts +16 -0
  72. package/dist/types/src/dynamic.d.ts +159 -0
  73. package/dist/types/src/entries/prompt.d.ts +11 -0
  74. package/dist/types/src/entries/schema.d.ts +8 -0
  75. package/dist/types/src/expr.d.ts +71 -0
  76. package/dist/types/src/extension.d.ts +4 -0
  77. package/dist/types/src/format.d.ts +112 -0
  78. package/dist/types/src/geometry.d.ts +40 -0
  79. package/dist/types/src/host/contract.d.ts +188 -0
  80. package/dist/types/src/host/decoders.d.ts +61 -0
  81. package/dist/types/src/host/index.d.ts +11 -0
  82. package/dist/types/src/host/package.d.ts +58 -0
  83. package/dist/types/src/host/policy.d.ts +105 -0
  84. package/dist/types/src/host/router.d.ts +34 -0
  85. package/dist/types/src/host/runtime.d.ts +205 -0
  86. package/dist/types/src/host/sources.d.ts +15 -0
  87. package/dist/types/src/host/transports.d.ts +109 -0
  88. package/dist/types/src/index.d.ts +63 -0
  89. package/dist/types/src/layout.d.ts +20 -0
  90. package/dist/types/src/limits.d.ts +21 -0
  91. package/dist/types/src/list.d.ts +133 -0
  92. package/dist/types/src/locale.d.ts +22 -0
  93. package/dist/types/src/macros.d.ts +29 -0
  94. package/dist/types/src/overlay.d.ts +27 -0
  95. package/dist/types/src/prompt.d.ts +44 -0
  96. package/dist/types/src/recipes.d.ts +17 -0
  97. package/dist/types/src/reducer.d.ts +41 -0
  98. package/dist/types/src/resizable.d.ts +38 -0
  99. package/dist/types/src/schema.d.ts +7 -0
  100. package/dist/types/src/strings.d.ts +13 -0
  101. package/dist/types/src/style.d.ts +201 -0
  102. package/dist/types/src/test-preload.d.ts +1 -0
  103. package/dist/types/src/text-shimmer.d.ts +24 -0
  104. package/dist/types/src/theme-types.d.ts +162 -0
  105. package/dist/types/src/theme.d.ts +73 -0
  106. package/dist/types/src/themes.d.ts +22 -0
  107. package/dist/types/src/tree-guides.d.ts +17 -0
  108. package/dist/types/src/types.d.ts +314 -0
  109. package/dist/types/src/validate.d.ts +31 -0
  110. package/dist/types/src/web/base-css.d.ts +1 -0
  111. package/dist/types/src/web/box-css.d.ts +55 -0
  112. package/dist/types/src/web/coerce.d.ts +32 -0
  113. package/dist/types/src/web/data.d.ts +105 -0
  114. package/dist/types/src/web/dates.d.ts +12 -0
  115. package/dist/types/src/web/form.d.ts +44 -0
  116. package/dist/types/src/web/host-types.d.ts +119 -0
  117. package/dist/types/src/web/index.d.ts +28 -0
  118. package/dist/types/src/web/inputs.d.ts +55 -0
  119. package/dist/types/src/web/list.d.ts +13 -0
  120. package/dist/types/src/web/listbox.d.ts +14 -0
  121. package/dist/types/src/web/markdown.d.ts +96 -0
  122. package/dist/types/src/web/media.d.ts +62 -0
  123. package/dist/types/src/web/parts.d.ts +4 -0
  124. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  125. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  126. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  127. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  128. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  129. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  130. package/dist/types/src/web/primitives/button.d.ts +6 -0
  131. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  132. package/dist/types/src/web/primitives/card.d.ts +9 -0
  133. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  134. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  135. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  136. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  137. package/dist/types/src/web/primitives/command.d.ts +134 -0
  138. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  139. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  140. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  141. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  142. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  143. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  144. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  145. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  146. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  147. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  148. package/dist/types/src/web/primitives/index.d.ts +48 -0
  149. package/dist/types/src/web/primitives/input.d.ts +5 -0
  150. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  151. package/dist/types/src/web/primitives/label.d.ts +3 -0
  152. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  153. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  154. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  155. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  156. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  157. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  158. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  159. package/dist/types/src/web/primitives/select.d.ts +47 -0
  160. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  161. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  162. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  163. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  164. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  165. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  166. package/dist/types/src/web/primitives/table.d.ts +11 -0
  167. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  168. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  169. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  170. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  171. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  172. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  173. package/dist/types/src/web/share.d.ts +6 -0
  174. package/dist/types/src/web/table.d.ts +20 -0
  175. package/dist/types/src/web/theme-css.d.ts +69 -0
  176. package/dist/types/src/web/urls.d.ts +21 -0
  177. package/dist/web/index.js +2303 -0
  178. package/dist/web/index.js.map +26 -0
  179. package/dist/web/primitives/index.js +1450 -0
  180. package/dist/web/primitives/index.js.map +57 -0
  181. package/docs/components.generated.json +6238 -0
  182. package/docs/round-1-contract.md +679 -0
  183. package/docs/round-2-contract.md +476 -0
  184. package/docs/round-3-contract.md +174 -0
  185. package/docs/themes.generated.json +3503 -0
  186. package/fixtures/animations.json +2890 -0
  187. package/fixtures/bench-list.json +58 -0
  188. package/fixtures/bind-time.json +30664 -0
  189. package/fixtures/catalog-basic-map.json +1692 -0
  190. package/fixtures/catalog-components.json +9323 -0
  191. package/fixtures/catalog-extension.json +620 -0
  192. package/fixtures/catalog-macros.json +36370 -0
  193. package/fixtures/code-tokens.json +1993 -0
  194. package/fixtures/conformance-baseline.json +55544 -0
  195. package/fixtures/conformance-cases.json +49 -0
  196. package/fixtures/conformance-known.json +2123 -0
  197. package/fixtures/control-geometry.json +4200 -0
  198. package/fixtures/dashboard.data.json +74 -0
  199. package/fixtures/dashboard.json +752 -0
  200. package/fixtures/demo-surface.json +47 -0
  201. package/fixtures/format.json +870 -0
  202. package/fixtures/host-policy.json +1067 -0
  203. package/fixtures/host-router.json +1152 -0
  204. package/fixtures/host-transport.json +590 -0
  205. package/fixtures/interactions-round1.json +773 -0
  206. package/fixtures/kitchen-sink.expanded.json +10844 -0
  207. package/fixtures/kitchen-sink.json +3049 -0
  208. package/fixtures/layout-geometry-round1.json +7278 -0
  209. package/fixtures/layout-geometry.json +2072 -0
  210. package/fixtures/overlay-geometry.json +272 -0
  211. package/fixtures/primitive-specimens.json +58 -0
  212. package/fixtures/prompt-budget.json +33 -0
  213. package/fixtures/resizable.json +714 -0
  214. package/fixtures/round4-contract.json +2985 -0
  215. package/fixtures/specimens.json +9832 -0
  216. package/fixtures/style-conditions.json +336 -0
  217. package/fixtures/template-items.json +2215 -0
  218. package/fixtures/text-direction.json +309 -0
  219. package/fixtures/text-shimmer.json +96 -0
  220. package/fixtures/theme-extends.json +573 -0
  221. package/fixtures/theme-invalid.json +1296 -0
  222. package/fixtures/theme-recipes.json +58600 -0
  223. package/fixtures/theme-resolved.json +23949 -0
  224. package/fixtures/toast-stack.json +215 -0
  225. package/fixtures/tree-guides.json +224 -0
  226. package/fixtures/virtual-list.json +733 -0
  227. package/generated/ExponentialUICatalog.generated.kt +67 -0
  228. package/generated/ExponentialUICatalog.generated.swift +67 -0
  229. package/generated/ExponentialUIThemes.generated.kt +23 -0
  230. package/generated/ExponentialUIThemes.generated.swift +23 -0
  231. package/generated/catalog.descriptions.generated.rs +6 -0
  232. package/generated/catalog.generated.rs +80 -0
  233. package/generated/catalog.themes.generated.rs +34 -0
  234. package/generated/core.descriptions.json +2505 -0
  235. package/generated/core.runtime.json +3609 -0
  236. package/package.json +87 -4
  237. package/themes/exponential.recipes.json +49 -0
  238. package/themes/exponential.theme.json +755 -0
  239. package/themes/neutral.theme.json +5676 -0
  240. package/themes/orange.theme.json +43 -0
  241. package/themes/playful.theme.json +219 -0
  242. package/vendor/a2ui/LICENSE.txt +203 -0
  243. package/vendor/a2ui/README.md +27 -0
  244. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  245. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  246. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  247. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  248. package/vendor/a2ui/v0_9/common_types.json +315 -0
  249. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  250. package/vendor/json-render/LICENSE.txt +201 -0
  251. package/vendor/json-render/README.md +13 -0
@@ -0,0 +1,27 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/catalog.generated.ts", "../src/strings.ts", "../src/format.ts", "../src/expr.ts", "../src/limits.ts", "../src/dynamic.ts", "../src/tree-guides.ts", "../src/macros.ts", "../src/validate.ts", "../src/basic-map.ts", "../src/reducer.ts", "../src/host/policy.ts", "../src/host/sources.ts", "../src/host/decoders.ts", "../src/host/package.ts", "../src/host/router.ts", "../src/host/runtime.ts", "../src/host/transports.ts"],
4
+ "sourcesContent": [
5
+ "// AUTO-GENERATED by packages/exponential-ui/scripts/generate.ts — do not edit.\n// Source of truth: packages/exponential-ui/catalog/core.catalog.json (+ tokens.json, style.json, basic-map.json, strings.json, locale.json, code.json, a11y.json, layout.json).\n\nimport type { Style } from \"./style\"\nimport type { DataBinding, FunctionCall } from \"./types\"\n\nexport const CATALOG_ID = \"https://ui.exponential.at/catalogs/core/v1\"\nexport const LITE_CATALOG_ID = \"https://ui.exponential.at/catalogs/core-lite/v1\"\nexport const BASIC_CATALOG_ID = \"https://a2ui.org/specification/v0_9/basic_catalog.json\"\nexport const BASIC_VERSION = \"v0.9\"\nexport const CATALOG_VERSION = \"1\"\nexport const UNKNOWN_COMPONENT_NAME = \"Unknown\"\n\n/** Every component in source order (the hidden placeholder included). */\nexport const COMPONENT_NAMES = [\"Box\",\"Stack\",\"Grid\",\"Card\",\"Separator\",\"List\",\"Resizable\",\"ScrollArea\",\"Sidebar\",\"SplitView\",\"AppBar\",\"Page\",\"Toolbar\",\"Section\",\"Group\",\"Text\",\"Heading\",\"Markdown\",\"CodeBlock\",\"Kbd\",\"Label\",\"Image\",\"Icon\",\"Video\",\"AudioPlayer\",\"Avatar\",\"Carousel\",\"Tabs\",\"Segmented\",\"Accordion\",\"Collapsible\",\"Trace\",\"TraceItem\",\"Pagination\",\"Breadcrumb\",\"Stepper\",\"Dialog\",\"Drawer\",\"DockCard\",\"AlertDialog\",\"Popover\",\"Tooltip\",\"Menu\",\"Toast\",\"Badge\",\"Alert\",\"Chip\",\"EmptyState\",\"Progress\",\"Meter\",\"Ring\",\"Spinner\",\"Skeleton\",\"Table\",\"Chart\",\"Sparkline\",\"StatTile\",\"Button\",\"Link\",\"Toggle\",\"Form\",\"FieldGroup\",\"FormActions\",\"Input\",\"Textarea\",\"NumberField\",\"Checkbox\",\"Radio\",\"ChoiceTiles\",\"Switch\",\"Slider\",\"Rating\",\"Select\",\"SearchList\",\"ChipInput\",\"DatePicker\",\"DateRangePicker\",\"TimePicker\",\"FileUpload\",\"Composer\",\"Row\",\"TreeGuides\",\"Unknown\"] as const\nexport type ComponentName = (typeof COMPONENT_NAMES)[number]\nexport const NATIVE_COMPONENTS = [\"Box\",\"List\",\"Resizable\",\"Text\",\"Markdown\",\"CodeBlock\",\"Image\",\"Icon\",\"Video\",\"AudioPlayer\",\"Avatar\",\"Carousel\",\"Tabs\",\"Segmented\",\"Accordion\",\"Dialog\",\"Drawer\",\"Popover\",\"Tooltip\",\"Menu\",\"Toast\",\"Ring\",\"Spinner\",\"Skeleton\",\"Table\",\"Chart\",\"Button\",\"Link\",\"Toggle\",\"Form\",\"Input\",\"Textarea\",\"NumberField\",\"Checkbox\",\"Radio\",\"ChoiceTiles\",\"Switch\",\"Slider\",\"Select\",\"SearchList\",\"ChipInput\",\"DatePicker\",\"DateRangePicker\",\"TimePicker\",\"FileUpload\",\"Composer\",\"TreeGuides\",\"Unknown\"] as const\nexport const MACRO_COMPONENTS = [\"Stack\",\"Grid\",\"Card\",\"Separator\",\"ScrollArea\",\"Sidebar\",\"SplitView\",\"AppBar\",\"Page\",\"Toolbar\",\"Section\",\"Group\",\"Heading\",\"Kbd\",\"Label\",\"Collapsible\",\"Trace\",\"TraceItem\",\"Pagination\",\"Breadcrumb\",\"Stepper\",\"DockCard\",\"AlertDialog\",\"Badge\",\"Alert\",\"Chip\",\"EmptyState\",\"Progress\",\"Meter\",\"Sparkline\",\"StatTile\",\"FieldGroup\",\"FormActions\",\"Rating\",\"Row\"] as const\n/** The core-lite subset (no overlays, media or Chart). */\nexport const LITE_COMPONENTS = [\"Box\",\"Stack\",\"Grid\",\"Card\",\"Separator\",\"List\",\"Resizable\",\"ScrollArea\",\"Sidebar\",\"SplitView\",\"AppBar\",\"Page\",\"Toolbar\",\"Section\",\"Group\",\"Text\",\"Heading\",\"Markdown\",\"CodeBlock\",\"Kbd\",\"Label\",\"Icon\",\"Avatar\",\"Tabs\",\"Segmented\",\"Collapsible\",\"Trace\",\"TraceItem\",\"Breadcrumb\",\"Stepper\",\"Badge\",\"Alert\",\"Chip\",\"EmptyState\",\"Progress\",\"Meter\",\"Ring\",\"Skeleton\",\"StatTile\",\"Button\",\"Link\",\"Form\",\"FieldGroup\",\"FormActions\",\"Input\",\"Textarea\",\"NumberField\",\"Checkbox\",\"Switch\",\"Rating\",\"Select\",\"SearchList\",\"ChipInput\",\"DatePicker\",\"DateRangePicker\",\"TimePicker\",\"FileUpload\",\"Composer\",\"Row\"] as const\nexport const COMPONENT_GROUPS: Record<ComponentName, string> = {\"Box\":\"layout\",\"Stack\":\"layout\",\"Grid\":\"layout\",\"Card\":\"layout\",\"Separator\":\"layout\",\"List\":\"layout\",\"Resizable\":\"layout\",\"ScrollArea\":\"layout\",\"Sidebar\":\"layout\",\"SplitView\":\"layout\",\"AppBar\":\"layout\",\"Page\":\"layout\",\"Toolbar\":\"layout\",\"Section\":\"list\",\"Group\":\"list\",\"Text\":\"text\",\"Heading\":\"text\",\"Markdown\":\"text\",\"CodeBlock\":\"text\",\"Kbd\":\"text\",\"Label\":\"text\",\"Image\":\"media\",\"Icon\":\"media\",\"Video\":\"media\",\"AudioPlayer\":\"media\",\"Avatar\":\"media\",\"Carousel\":\"media\",\"Tabs\":\"navigation\",\"Segmented\":\"navigation\",\"Accordion\":\"navigation\",\"Collapsible\":\"navigation\",\"Trace\":\"list\",\"TraceItem\":\"list\",\"Pagination\":\"navigation\",\"Breadcrumb\":\"navigation\",\"Stepper\":\"navigation\",\"Dialog\":\"overlay\",\"Drawer\":\"overlay\",\"DockCard\":\"overlay\",\"AlertDialog\":\"overlay\",\"Popover\":\"overlay\",\"Tooltip\":\"overlay\",\"Menu\":\"overlay\",\"Toast\":\"overlay\",\"Badge\":\"feedback\",\"Alert\":\"feedback\",\"Chip\":\"feedback\",\"EmptyState\":\"feedback\",\"Progress\":\"feedback\",\"Meter\":\"feedback\",\"Ring\":\"feedback\",\"Spinner\":\"feedback\",\"Skeleton\":\"feedback\",\"Table\":\"data\",\"Chart\":\"data\",\"Sparkline\":\"data\",\"StatTile\":\"data\",\"Button\":\"action\",\"Link\":\"action\",\"Toggle\":\"action\",\"Form\":\"input\",\"FieldGroup\":\"input\",\"FormActions\":\"input\",\"Input\":\"input\",\"Textarea\":\"input\",\"NumberField\":\"input\",\"Checkbox\":\"input\",\"Radio\":\"input\",\"ChoiceTiles\":\"input\",\"Switch\":\"input\",\"Slider\":\"input\",\"Rating\":\"input\",\"Select\":\"input\",\"SearchList\":\"input\",\"ChipInput\":\"input\",\"DatePicker\":\"input\",\"DateRangePicker\":\"input\",\"TimePicker\":\"input\",\"FileUpload\":\"input\",\"Composer\":\"input\",\"Row\":\"list\",\"TreeGuides\":\"list\",\"Unknown\":\"feedback\"}\n/** The specimen id each component has on ui.exponential.at. */\nexport const SPECIMEN_IDS: Record<ComponentName, string> = {\"Box\":\"exponential-ui-box\",\"Stack\":\"exponential-ui-stack\",\"Grid\":\"exponential-ui-grid\",\"Card\":\"exponential-ui-card\",\"Separator\":\"exponential-ui-separator\",\"List\":\"exponential-ui-list\",\"Resizable\":\"exponential-ui-resizable\",\"ScrollArea\":\"exponential-ui-scroll-area\",\"Sidebar\":\"exponential-ui-sidebar\",\"SplitView\":\"exponential-ui-split-view\",\"AppBar\":\"exponential-ui-app-bar\",\"Page\":\"exponential-ui-page\",\"Toolbar\":\"exponential-ui-toolbar\",\"Section\":\"exponential-ui-section\",\"Group\":\"exponential-ui-group\",\"Text\":\"exponential-ui-text\",\"Heading\":\"exponential-ui-heading\",\"Markdown\":\"exponential-ui-markdown\",\"CodeBlock\":\"exponential-ui-code-block\",\"Kbd\":\"exponential-ui-kbd\",\"Label\":\"exponential-ui-label\",\"Image\":\"exponential-ui-image\",\"Icon\":\"exponential-ui-icon\",\"Video\":\"exponential-ui-video\",\"AudioPlayer\":\"exponential-ui-audio-player\",\"Avatar\":\"exponential-ui-avatar\",\"Carousel\":\"exponential-ui-carousel\",\"Tabs\":\"exponential-ui-tabs\",\"Segmented\":\"exponential-ui-segmented\",\"Accordion\":\"exponential-ui-accordion\",\"Collapsible\":\"exponential-ui-collapsible\",\"Trace\":\"exponential-ui-trace\",\"TraceItem\":\"exponential-ui-trace-item\",\"Pagination\":\"exponential-ui-pagination\",\"Breadcrumb\":\"exponential-ui-breadcrumb\",\"Stepper\":\"exponential-ui-stepper\",\"Dialog\":\"exponential-ui-dialog\",\"Drawer\":\"exponential-ui-drawer\",\"DockCard\":\"exponential-ui-dock-card\",\"AlertDialog\":\"exponential-ui-alert-dialog\",\"Popover\":\"exponential-ui-popover\",\"Tooltip\":\"exponential-ui-tooltip\",\"Menu\":\"exponential-ui-menu\",\"Toast\":\"exponential-ui-toast\",\"Badge\":\"exponential-ui-badge\",\"Alert\":\"exponential-ui-alert\",\"Chip\":\"exponential-ui-chip\",\"EmptyState\":\"exponential-ui-empty-state\",\"Progress\":\"exponential-ui-progress\",\"Meter\":\"exponential-ui-meter\",\"Ring\":\"exponential-ui-ring\",\"Spinner\":\"exponential-ui-spinner\",\"Skeleton\":\"exponential-ui-skeleton\",\"Table\":\"exponential-ui-table\",\"Chart\":\"exponential-ui-chart\",\"Sparkline\":\"exponential-ui-sparkline\",\"StatTile\":\"exponential-ui-stat-tile\",\"Button\":\"exponential-ui-button\",\"Link\":\"exponential-ui-link\",\"Toggle\":\"exponential-ui-toggle\",\"Form\":\"exponential-ui-form\",\"FieldGroup\":\"exponential-ui-field-group\",\"FormActions\":\"exponential-ui-form-actions\",\"Input\":\"exponential-ui-input\",\"Textarea\":\"exponential-ui-textarea\",\"NumberField\":\"exponential-ui-number-field\",\"Checkbox\":\"exponential-ui-checkbox\",\"Radio\":\"exponential-ui-radio\",\"ChoiceTiles\":\"exponential-ui-choice-tiles\",\"Switch\":\"exponential-ui-switch\",\"Slider\":\"exponential-ui-slider\",\"Rating\":\"exponential-ui-rating\",\"Select\":\"exponential-ui-select\",\"SearchList\":\"exponential-ui-search-list\",\"ChipInput\":\"exponential-ui-chip-input\",\"DatePicker\":\"exponential-ui-date-picker\",\"DateRangePicker\":\"exponential-ui-date-range-picker\",\"TimePicker\":\"exponential-ui-time-picker\",\"FileUpload\":\"exponential-ui-file-upload\",\"Composer\":\"exponential-ui-composer\",\"Row\":\"exponential-ui-row\",\"TreeGuides\":\"exponential-ui-tree-guides\",\"Unknown\":\"exponential-ui-unknown\"}\n\nexport const ENUMS = {\n variant: [\"default\",\"secondary\",\"outline\",\"ghost\",\"destructive\",\"link\"],\n size: [\"sm\",\"default\",\"lg\",\"icon\"],\n tone: [\"neutral\",\"primary\",\"success\",\"warning\",\"danger\",\"info\"],\n gap: [\"none\",\"xs\",\"sm\",\"md\",\"lg\",\"xl\"],\n align: [\"start\",\"center\",\"end\",\"stretch\"],\n justify: [\"start\",\"center\",\"end\",\"between\",\"around\",\"evenly\"],\n textVariant: [\"body\",\"caption\",\"muted\",\"lead\",\"code\",\"label\",\"title\"],\n headingLevel: [\"h1\",\"h2\",\"h3\",\"h4\"],\n imageFit: [\"contain\",\"cover\",\"fill\",\"none\",\"scaleDown\"],\n orientation: [\"horizontal\",\"vertical\"],\n side: [\"top\",\"right\",\"bottom\",\"left\"],\n inputType: [\"text\",\"email\",\"password\",\"number\",\"search\",\"url\",\"tel\"],\n validateOn: [\"change\",\"blur\",\"submit\"],\n alertType: [\"info\",\"success\",\"warning\",\"error\"],\n controlSize: [\"sm\",\"default\",\"lg\"],\n spinnerSize: [\"xs\",\"sm\",\"default\",\"lg\"],\n tabClosable: [\"none\",\"hover\",\"always\"],\n groupType: [\"single\",\"multiple\"],\n rowChevron: [\"none\",\"right\",\"selector\"],\n rowSurface: [\"flat\",\"card\"],\n chipShape: [\"pill\",\"rect\"],\n density: [\"default\",\"compact\"],\n listDirection: [\"vertical\",\"horizontal\"],\n chartKind: [\"bar\",\"stackedBar\",\"line\",\"area\",\"pie\",\"donut\",\"sparkline\"],\n segmentedVariant: [\"segmented\",\"toggles\",\"outline\",\"bar\"],\n liveTone: [\"live\",\"attention\",\"done\",\"unread\",\"idle\",\"muted\"],\n menuItemKind: [\"item\",\"checkbox\",\"separator\",\"label\",\"submenu\"],\n openOn: [\"press\",\"hover\"],\n menuOpenOn: [\"press\",\"contextmenu\"],\n live: [\"off\",\"polite\",\"assertive\"],\n selectable: [\"none\",\"single\",\"multiple\"],\n cellType: [\"text\",\"number\",\"date\",\"boolean\",\"badge\",\"slot\",\"currency\",\"percent\",\"relativeTime\"],\n sortDirection: [\"asc\",\"desc\"],\n imageLoading: [\"lazy\",\"eager\"],\n scrollDirection: [\"vertical\",\"horizontal\",\"both\"],\n collapseBelow: [\"never\",\"sm\",\"md\",\"lg\",\"xl\"],\n codeLanguage: [\"plain\",\"json\",\"js\",\"ts\",\"tsx\",\"rust\",\"swift\",\"kotlin\",\"python\",\"bash\",\"html\",\"css\",\"sql\",\"yaml\",\"markdown\",\"ansi\"],\n codeToken: [\"plain\",\"keyword\",\"string\",\"number\",\"comment\",\"punctuation\",\"operator\",\"type\",\"function\",\"property\",\"tag\",\"attribute\",\"success\",\"warning\",\"error\"],\n codeBlockVariant: [\"default\",\"destructive\"],\n codeBlockSize: [\"default\",\"sm\"],\n traceStatus: [\"running\",\"error\",\"pending\"],\n traceSize: [\"default\",\"sm\"],\n} as const\nexport type VariantValue = (typeof ENUMS)[\"variant\"][number]\nexport type SizeValue = (typeof ENUMS)[\"size\"][number]\nexport type ToneValue = (typeof ENUMS)[\"tone\"][number]\nexport type GapValue = (typeof ENUMS)[\"gap\"][number]\nexport type AlignValue = (typeof ENUMS)[\"align\"][number]\nexport type JustifyValue = (typeof ENUMS)[\"justify\"][number]\nexport type TextVariantValue = (typeof ENUMS)[\"textVariant\"][number]\nexport type HeadingLevelValue = (typeof ENUMS)[\"headingLevel\"][number]\nexport type ImageFitValue = (typeof ENUMS)[\"imageFit\"][number]\nexport type OrientationValue = (typeof ENUMS)[\"orientation\"][number]\nexport type SideValue = (typeof ENUMS)[\"side\"][number]\nexport type InputTypeValue = (typeof ENUMS)[\"inputType\"][number]\nexport type ValidateOnValue = (typeof ENUMS)[\"validateOn\"][number]\nexport type AlertTypeValue = (typeof ENUMS)[\"alertType\"][number]\nexport type ControlSizeValue = (typeof ENUMS)[\"controlSize\"][number]\nexport type SpinnerSizeValue = (typeof ENUMS)[\"spinnerSize\"][number]\nexport type TabClosableValue = (typeof ENUMS)[\"tabClosable\"][number]\nexport type GroupTypeValue = (typeof ENUMS)[\"groupType\"][number]\nexport type RowChevronValue = (typeof ENUMS)[\"rowChevron\"][number]\nexport type RowSurfaceValue = (typeof ENUMS)[\"rowSurface\"][number]\nexport type ChipShapeValue = (typeof ENUMS)[\"chipShape\"][number]\nexport type DensityValue = (typeof ENUMS)[\"density\"][number]\nexport type ListDirectionValue = (typeof ENUMS)[\"listDirection\"][number]\nexport type ChartKindValue = (typeof ENUMS)[\"chartKind\"][number]\nexport type SegmentedVariantValue = (typeof ENUMS)[\"segmentedVariant\"][number]\nexport type LiveToneValue = (typeof ENUMS)[\"liveTone\"][number]\nexport type MenuItemKindValue = (typeof ENUMS)[\"menuItemKind\"][number]\nexport type OpenOnValue = (typeof ENUMS)[\"openOn\"][number]\nexport type MenuOpenOnValue = (typeof ENUMS)[\"menuOpenOn\"][number]\nexport type LiveValue = (typeof ENUMS)[\"live\"][number]\nexport type SelectableValue = (typeof ENUMS)[\"selectable\"][number]\nexport type CellTypeValue = (typeof ENUMS)[\"cellType\"][number]\nexport type SortDirectionValue = (typeof ENUMS)[\"sortDirection\"][number]\nexport type ImageLoadingValue = (typeof ENUMS)[\"imageLoading\"][number]\nexport type ScrollDirectionValue = (typeof ENUMS)[\"scrollDirection\"][number]\nexport type CollapseBelowValue = (typeof ENUMS)[\"collapseBelow\"][number]\nexport type CodeLanguageValue = (typeof ENUMS)[\"codeLanguage\"][number]\nexport type CodeTokenValue = (typeof ENUMS)[\"codeToken\"][number]\nexport type CodeBlockVariantValue = (typeof ENUMS)[\"codeBlockVariant\"][number]\nexport type CodeBlockSizeValue = (typeof ENUMS)[\"codeBlockSize\"][number]\nexport type TraceStatusValue = (typeof ENUMS)[\"traceStatus\"][number]\nexport type TraceSizeValue = (typeof ENUMS)[\"traceSize\"][number]\n\n/** Token NAMES by group (values come from a theme). */\nexport const TOKEN_NAMES = {\n \"color\": [\"background\",\"foreground\",\"card\",\"cardForeground\",\"popover\",\"popoverForeground\",\"primary\",\"primaryForeground\",\"secondary\",\"secondaryForeground\",\"muted\",\"mutedForeground\",\"accent\",\"accentForeground\",\"destructive\",\"destructiveForeground\",\"success\",\"successForeground\",\"warning\",\"warningForeground\",\"info\",\"infoForeground\",\"border\",\"input\",\"ring\",\"chart1\",\"chart2\",\"chart3\",\"chart4\",\"chart5\",\"chart6\",\"chart7\",\"chart8\"],\n \"spacing\": [\"none\",\"xxs\",\"xs\",\"sm\",\"md\",\"lg\",\"xl\",\"xl2\",\"xl3\"],\n \"radius\": [\"none\",\"sm\",\"md\",\"lg\",\"xl\",\"xl2\",\"xl3\",\"full\"],\n \"type.size\": [\"xs\",\"sm\",\"base\",\"lg\",\"xl\",\"xl2\",\"xl3\"],\n \"type.lineHeight\": [\"xs\",\"sm\",\"base\",\"lg\",\"xl\",\"xl2\",\"xl3\"],\n \"type.weight\": [\"regular\",\"medium\",\"semibold\",\"bold\"],\n \"type.family\": [\"sans\",\"mono\"],\n \"control\": [\"buttonSm\",\"buttonMd\",\"buttonLg\",\"buttonIcon\",\"input\",\"textarea\",\"row\",\"rowCompact\",\"pill\",\"badge\",\"chip\",\"toggle\",\"switch\",\"checkbox\",\"slider\",\"progress\",\"meter\",\"avatarSm\",\"avatarMd\",\"avatarLg\",\"iconSm\",\"iconMd\",\"iconLg\",\"hairline\",\"appBar\",\"tabBar\",\"toast\"],\n \"shadow\": [\"none\",\"sm\",\"md\",\"lg\",\"xl\"],\n \"opacity\": [\"primary\",\"secondary\",\"tertiary\",\"quaternary\",\"disabled\"],\n \"border\": [\"none\",\"hairline\",\"thick\"],\n \"motion\": [\"fast\",\"standard\",\"slow\"],\n \"breakpoint\": [\"sm\",\"md\",\"lg\",\"xl\"],\n \"ease\": [\"standard\",\"decelerate\",\"accelerate\"],\n \"density\": [\"compact\",\"comfortable\"],\n \"blur\": [\"sm\",\"md\",\"lg\",\"xl\"],\n \"scale\": [\"press\",\"popoverFrom\"],\n} as const\nexport type TokenGroup = keyof typeof TOKEN_NAMES\n\nexport const STYLE_KEY_NAMES = [\"display\",\"flexDirection\",\"flexWrap\",\"justifyContent\",\"alignItems\",\"alignContent\",\"alignSelf\",\"justifySelf\",\"flexGrow\",\"flexShrink\",\"flexBasis\",\"gap\",\"rowGap\",\"columnGap\",\"direction\",\"overflow\",\"overflowX\",\"overflowY\",\"width\",\"height\",\"minWidth\",\"minHeight\",\"maxWidth\",\"maxHeight\",\"aspectRatio\",\"position\",\"top\",\"right\",\"bottom\",\"left\",\"inset\",\"insetInlineStart\",\"insetInlineEnd\",\"insetBlockStart\",\"insetBlockEnd\",\"padding\",\"paddingTop\",\"paddingRight\",\"paddingBottom\",\"paddingLeft\",\"paddingHorizontal\",\"paddingVertical\",\"paddingInlineStart\",\"paddingInlineEnd\",\"margin\",\"marginTop\",\"marginRight\",\"marginBottom\",\"marginLeft\",\"marginHorizontal\",\"marginVertical\",\"marginInlineStart\",\"marginInlineEnd\",\"gridTemplateColumns\",\"gridTemplateRows\",\"gridTemplateAreas\",\"gridArea\",\"gridColumn\",\"gridRow\",\"backgroundColor\",\"backgroundGradient\",\"color\",\"borderWidth\",\"borderTopWidth\",\"borderRightWidth\",\"borderBottomWidth\",\"borderLeftWidth\",\"borderColor\",\"borderStyle\",\"borderRadius\",\"borderTopLeftRadius\",\"borderTopRightRadius\",\"borderBottomRightRadius\",\"borderBottomLeftRadius\",\"opacity\",\"boxShadow\",\"fontSize\",\"fontWeight\",\"lineHeight\",\"letterSpacing\",\"textAlign\",\"textDecoration\",\"textTransform\",\"fontStyle\",\"fontFamily\",\"transition\",\"transitionEasing\",\"transform\",\"visibility\",\"pointerEvents\",\"userSelect\",\"cursor\",\"backdropBlur\",\"animation\",\"animationDuration\"] as const\nexport const STYLE_STATE_NAMES = [\":hover\",\":focus-visible\",\":pressed\"] as const\n\n/** The Icon prop's vocabulary: packages/icons/icons.json at generate time. */\nexport const ICON_NAMES = [\"a-large-small\",\"action-chat\",\"action-create\",\"action-default\",\"action-repository\",\"action-run\",\"action-suggestion\",\"activity\",\"anchor\",\"app-editor-chat\",\"archive\",\"arrow-down\",\"arrow-down-left\",\"arrow-left\",\"arrow-left-right\",\"arrow-right\",\"arrow-up-right\",\"at-sign\",\"atom\",\"auth-passkey\",\"award\",\"ban\",\"bell\",\"bell-off\",\"bold\",\"book-open\",\"bookmark\",\"bot\",\"boxes\",\"braces\",\"brain\",\"briefcase\",\"brush-cleaning\",\"bug\",\"building\",\"building-2\",\"calculator\",\"calendar\",\"calendar-days\",\"camera\",\"car\",\"chart-line\",\"check\",\"chevron-down\",\"chevron-left\",\"chevron-right\",\"chevron-up\",\"chevrons-up-down\",\"circle\",\"circle-arrow-up\",\"circle-check\",\"circle-dashed\",\"circle-dot\",\"circle-minus\",\"circle-question-mark\",\"circle-slash\",\"circle-stop\",\"circle-user\",\"circle-x\",\"clipboard-list\",\"clock\",\"cloud\",\"code\",\"coding-assistant\",\"coding-command\",\"coding-compact\",\"coding-diff\",\"coding-ended\",\"coding-in-review\",\"coding-needs-input\",\"coding-plan\",\"coding-running\",\"coding-stop\",\"coding-subagent\",\"coding-tool\",\"coffee\",\"compass\",\"computer\",\"copy\",\"corner-down-right\",\"cpu\",\"credit-card\",\"crown\",\"database\",\"download\",\"droplet\",\"dumbbell\",\"editor-bold\",\"editor-clear-formatting\",\"editor-code\",\"editor-emoji\",\"editor-heading-1\",\"editor-heading-2\",\"editor-heading-3\",\"editor-image\",\"editor-issue-ref\",\"editor-italic\",\"editor-link\",\"editor-list\",\"editor-list-ordered\",\"editor-list-todo\",\"editor-mention\",\"editor-quote\",\"editor-strikethrough\",\"editor-text\",\"editor-text-format\",\"editor-unlink\",\"ellipsis\",\"ellipsis-vertical\",\"event-assignee-changed\",\"event-board-moved\",\"event-estimate-changed\",\"event-label-added\",\"event-label-removed\",\"event-priority-changed\",\"event-relation-added\",\"event-relation-removed\",\"event-status-changed\",\"event-title-changed\",\"external-link\",\"eye\",\"eye-off\",\"fast-forward\",\"file\",\"file-diff\",\"file-pen-line\",\"file-text\",\"fingerprint\",\"flag\",\"flame\",\"flask-conical\",\"fold-vertical\",\"folder\",\"folder-kanban\",\"folder-open\",\"gamepad-2\",\"gauge\",\"gem\",\"gift\",\"git-branch\",\"git-merge\",\"git-pull-request\",\"github\",\"globe\",\"graduation-cap\",\"guide-changes\",\"hammer\",\"hard-drive\",\"hash\",\"heading-1\",\"heading-2\",\"heading-3\",\"headphones\",\"heart\",\"heart-off\",\"history\",\"hourglass\",\"house\",\"image\",\"images\",\"inbox\",\"info\",\"italic\",\"key\",\"landmark\",\"laptop\",\"layers\",\"layers-2\",\"layout-grid\",\"leaf\",\"lightbulb\",\"link\",\"link-2\",\"list\",\"list-checks\",\"list-end\",\"list-ordered\",\"list-todo\",\"list-tree\",\"loader-circle\",\"lock\",\"lock-open\",\"log-in\",\"log-out\",\"mail\",\"map\",\"map-pin\",\"maximize-2\",\"media-fast-forward\",\"media-rewind\",\"media-skip-next\",\"media-skip-previous\",\"media-volume-down\",\"media-volume-mute\",\"media-volume-off\",\"media-volume-up\",\"megaphone\",\"menu\",\"message-circle\",\"message-square\",\"message-square-plus\",\"message-square-reply\",\"mic\",\"microscope\",\"minimize-2\",\"minus\",\"monitor\",\"monitor-off\",\"moon\",\"mountain\",\"move\",\"music\",\"nav-account\",\"nav-actions\",\"nav-admin\",\"nav-apps\",\"nav-boards\",\"nav-changelog\",\"nav-computer\",\"nav-create-issue\",\"nav-devices\",\"nav-drafts\",\"nav-files\",\"nav-getting-started\",\"nav-inbox\",\"nav-issues\",\"nav-my-issues\",\"nav-notifications\",\"nav-rail-collapse\",\"nav-rail-expand\",\"nav-report-bug\",\"nav-search\",\"nav-settings\",\"nav-sign-out\",\"nav-source-control\",\"nav-team-switcher\",\"nav-terminal\",\"nav-threads\",\"newspaper\",\"notification-agent-message\",\"notification-issue-assigned\",\"notification-issue-comment\",\"notification-issue-created\",\"notification-issue-mention\",\"notification-issue-status-changed\",\"notification-mark-read\",\"notification-mute\",\"notification-pr-merged\",\"notification-pr-opened\",\"notification-reporter-reply\",\"notification-session-blocked\",\"os-apple\",\"os-linux\",\"os-windows\",\"package\",\"paintbrush\",\"palette\",\"panel-left-close\",\"panel-left-open\",\"paperclip\",\"pause\",\"pen-tool\",\"pencil\",\"phone\",\"pin\",\"pin-off\",\"plane\",\"play\",\"plug\",\"plus\",\"pr-batch\",\"pr-closed\",\"pr-draft\",\"pr-merged\",\"pr-open\",\"pr-stack\",\"printer\",\"priority-high\",\"priority-low\",\"priority-medium\",\"priority-none\",\"priority-urgent\",\"progress-1-4\",\"progress-1-5\",\"progress-2-4\",\"progress-2-5\",\"progress-3-4\",\"progress-3-5\",\"progress-4-5\",\"puzzle\",\"quote\",\"refresh-cw\",\"relation-blocked-by\",\"relation-blocks\",\"relation-duplicate\",\"relation-parent\",\"relation-related\",\"relation-section\",\"relation-sub-issue\",\"remove-formatting\",\"repeat\",\"rewind\",\"rocket\",\"rotate-ccw\",\"run-pause\",\"run-resume\",\"sc-push\",\"scale\",\"search\",\"search-x\",\"send\",\"server\",\"session-shell\",\"session-tree\",\"settings\",\"settings-about\",\"settings-account\",\"settings-agents\",\"settings-api\",\"settings-billing\",\"settings-boards\",\"settings-general\",\"settings-import\",\"settings-issues\",\"settings-labels\",\"settings-licenses\",\"settings-local-repos\",\"settings-mcp\",\"settings-members\",\"settings-notifications\",\"settings-rate\",\"settings-repositories\",\"settings-servers\",\"settings-sessions\",\"settings-statuses\",\"settings-storage\",\"settings-sync\",\"settings-tools\",\"settings-widget\",\"share-2\",\"shield\",\"shield-check\",\"shield-question-mark\",\"shopping-bag\",\"shopping-cart\",\"signal-high\",\"signal-low\",\"signal-medium\",\"skip-back\",\"skip-forward\",\"sliders-horizontal\",\"smartphone\",\"smile\",\"sparkles\",\"square-kanban\",\"square-pen\",\"square-slash\",\"square-terminal\",\"star\",\"star-half\",\"star-off\",\"status-backlog\",\"status-cancelled\",\"status-done\",\"status-duplicate\",\"status-in-progress\",\"status-in-review\",\"status-todo\",\"stethoscope\",\"store\",\"strikethrough\",\"sun\",\"support-open\",\"support-resolved\",\"tag\",\"target\",\"terminal\",\"tool-script\",\"trace-background\",\"trace-chevron\",\"trace-completed\",\"trace-edit\",\"trace-failed\",\"trace-fetch\",\"trace-read\",\"trace-reasoning\",\"trace-search\",\"trace-subagent\",\"trace-task-done\",\"trace-task-pending\",\"trace-task-running\",\"trace-terminal\",\"trace-todo\",\"trace-tool\",\"trash-2\",\"tree-pine\",\"triangle-alert\",\"trigger-event\",\"trigger-schedule\",\"trophy\",\"truck\",\"type\",\"ui-add\",\"ui-agent-source\",\"ui-archive\",\"ui-arrow-down\",\"ui-arrow-right\",\"ui-assignee\",\"ui-attach\",\"ui-avatar-placeholder\",\"ui-back\",\"ui-branch\",\"ui-check\",\"ui-checklist\",\"ui-chevron-down\",\"ui-chevron-left\",\"ui-chevron-right\",\"ui-chevron-up\",\"ui-clean\",\"ui-clear\",\"ui-clock\",\"ui-close\",\"ui-cloud\",\"ui-copy\",\"ui-delete\",\"ui-delete-account\",\"ui-device\",\"ui-device-default\",\"ui-device-offline\",\"ui-dock-side\",\"ui-docs\",\"ui-download\",\"ui-due-date\",\"ui-edit\",\"ui-empty-search\",\"ui-error\",\"ui-estimate\",\"ui-external-link\",\"ui-favorite-off\",\"ui-file\",\"ui-float\",\"ui-folder\",\"ui-folder-open\",\"ui-fullscreen\",\"ui-fullscreen-exit\",\"ui-github\",\"ui-help\",\"ui-hide\",\"ui-history\",\"ui-icon-placeholder\",\"ui-indeterminate\",\"ui-info\",\"ui-invite\",\"ui-issue\",\"ui-link\",\"ui-loading\",\"ui-mail\",\"ui-mcp\",\"ui-member\",\"ui-menu\",\"ui-minus\",\"ui-more\",\"ui-more-vertical\",\"ui-offline\",\"ui-organization\",\"ui-owner\",\"ui-permission\",\"ui-pin\",\"ui-print\",\"ui-private\",\"ui-properties\",\"ui-queued\",\"ui-redock\",\"ui-refresh\",\"ui-remove-member\",\"ui-repeat\",\"ui-repository\",\"ui-selected\",\"ui-selector\",\"ui-send\",\"ui-server\",\"ui-share\",\"ui-sign-in\",\"ui-sign-out\",\"ui-staging\",\"ui-star-half\",\"ui-star-off\",\"ui-stop\",\"ui-submit\",\"ui-subscribe\",\"ui-success\",\"ui-swap\",\"ui-team\",\"ui-unassigned\",\"ui-undo\",\"ui-undock\",\"ui-unlock\",\"ui-unpin\",\"ui-unselected\",\"ui-unsubscribe\",\"ui-update\",\"ui-usage\",\"ui-warning\",\"ui-watch\",\"ui-widget\",\"undo-2\",\"unlink\",\"upload\",\"user\",\"user-minus\",\"user-plus\",\"user-x\",\"users\",\"video\",\"volume-1\",\"volume-2\",\"volume-off\",\"volume-x\",\"wallet\",\"wifi-off\",\"work-faces\",\"work-results\",\"workflow\",\"wrench\",\"x\",\"zap\"] as const\n\nexport const FUNCTION_NAMES = [\"required\",\"regex\",\"length\",\"numeric\",\"email\",\"formatString\",\"formatNumber\",\"formatCurrency\",\"formatDate\",\"pluralize\",\"openUrl\",\"and\",\"or\",\"not\",\"percent\",\"add\",\"sub\",\"eq\",\"lt\",\"clamp\",\"cond\",\"fallback\",\"concat\",\"coalesce\",\"text\",\"map\",\"len\",\"fill\",\"set\",\"formatPercent\",\"formatRelativeTime\",\"filter\"] as const\n\n/** VAPP-108: the typed authoring surface (src/define.ts). A ~ prop also\n * takes a binding or a call, a ^ prop a per-breakpoint object. */\nexport type Dynamic = DataBinding | FunctionCall\nexport type Responsive<T> = { base: T; sm?: T; md?: T; lg?: T; xl?: T }\nexport type IconName = (typeof ICON_NAMES)[number]\n/** The shared shapes (catalog `defs`). */\nexport interface Shapes {\n option: { label: string | Dynamic; value: string; icon?: IconName; disabled?: boolean; description?: string; image?: string }\n check: { condition: boolean | Dynamic; message: string }\n tab: { label: string | Dynamic; value: string; icon?: IconName; count?: number }\n menuItem: { label?: string; value?: string; kind?: MenuItemKindValue; icon?: IconName; shortcut?: string; checked?: boolean | Dynamic; destructive?: boolean; disabled?: boolean; items?: Shapes[\"menuItem\"][] | Dynamic; searchable?: boolean; placeholder?: string }\n searchItem: { label: string | Dynamic; value: string; icon?: IconName; identifier?: string; disabled?: boolean }\n accordionItem: { title: string | Dynamic; value: string; count?: number }\n segment: { value: number; tone?: ToneValue; label?: string }\n series: { name: string; values: number[]; tone?: ToneValue }\n pageItem: { title?: string }\n step: { label: string; description?: string }\n column: { key: string; label: string; type?: CellTypeValue; slot?: string; width?: number; align?: \"start\" | \"center\" | \"end\"; sortable?: boolean; currency?: string; decimals?: number }\n sort: { key: string; direction: SortDirectionValue }\n panel: { min?: number; max?: number; collapsible?: boolean }\n file: { name: string; size?: number; type?: string; url?: string }\n}\n/** Every component's props, by name. */\nexport interface ComponentProps {\n Box: { style?: Style; pressable?: boolean }\n Stack: { direction?: OrientationValue | Responsive<OrientationValue> | Dynamic; gap?: GapValue | Responsive<GapValue>; align?: AlignValue | Responsive<AlignValue> | Dynamic; justify?: JustifyValue | Responsive<JustifyValue> | Dynamic; wrap?: boolean | Responsive<boolean>; style?: Style }\n Grid: { columns?: number | Responsive<number>; gap?: GapValue | Responsive<GapValue>; style?: Style }\n Card: { title?: string; description?: string; padded?: boolean; style?: Style }\n Separator: { orientation?: OrientationValue }\n List: { direction?: ListDirectionValue; gap?: GapValue; divided?: boolean; sectionBy?: string; stickyHeaders?: boolean; style?: Style }\n Resizable: { direction?: OrientationValue | Responsive<OrientationValue>; sizes?: number[] | Dynamic; panels?: Shapes[\"panel\"][]; handle?: boolean; style?: Style }\n ScrollArea: { direction?: ScrollDirectionValue; maxHeight?: number; style?: Style }\n Sidebar: { side?: \"left\" | \"right\"; width?: number; collapseBelow?: CollapseBelowValue; collapsed?: boolean | Dynamic }\n SplitView: { open?: boolean | Dynamic; width?: number }\n AppBar: { title: string | Dynamic; subtitle?: string | Dynamic; back?: boolean }\n Page: { title: string | Dynamic; subtitle?: string | Dynamic; back?: boolean; padded?: boolean }\n Toolbar: { gap?: GapValue }\n Section: { title?: string | Dynamic; caption?: string | Dynamic; count?: number | Dynamic; icon?: IconName; collapsible?: boolean; open?: boolean | Dynamic; tint?: ToneValue; tree?: boolean; loading?: boolean | Dynamic; style?: Style }\n Group: { title?: string; footer?: string }\n Text: { text: string | Dynamic; variant?: TextVariantValue; align?: \"start\" | \"center\" | \"end\"; lines?: number; tone?: ToneValue; shimmer?: boolean; live?: LiveValue; style?: Style }\n Heading: { text: string | Dynamic; level?: HeadingLevelValue }\n Markdown: { text: string | Dynamic; lines?: number; style?: Style }\n CodeBlock: { code: string | Dynamic; language?: CodeLanguageValue; title?: string; lineNumbers?: boolean; wrap?: boolean; copyable?: boolean; highlight?: number[]; maxLines?: number; variant?: CodeBlockVariantValue | Dynamic; size?: CodeBlockSizeValue }\n Kbd: { keys: string }\n Label: { text: string | Dynamic; for?: string; required?: boolean }\n Image: { src?: string | Dynamic; alt: string | Dynamic; fit?: ImageFitValue; width?: number; height?: number; aspectRatio?: number; fallback?: IconName; loading?: ImageLoadingValue; focalX?: number; focalY?: number; style?: Style }\n Icon: { name: IconName | Dynamic; size?: ControlSizeValue; tone?: ToneValue | Dynamic; label?: string }\n Video: { src: string | Dynamic; poster?: string; durationMs?: number; autoplay?: boolean; aspectRatio?: number; style?: Style }\n AudioPlayer: { src: string | Dynamic; title?: string; durationMs?: number }\n Avatar: { name: string | Dynamic; src?: string | Dynamic; size?: ControlSizeValue; seed?: string }\n Carousel: { page?: number | Dynamic; loop?: boolean; indicators?: boolean }\n Tabs: { tabs: Shapes[\"tab\"][]; value?: string | Dynamic; fill?: boolean; closable?: TabClosableValue; addable?: boolean }\n Segmented: { items: Shapes[\"option\"][]; type?: GroupTypeValue; value?: string | Dynamic; variant?: SegmentedVariantValue; size?: ControlSizeValue; fill?: boolean }\n Accordion: { items: Shapes[\"accordionItem\"][]; type?: GroupTypeValue; value?: string | Dynamic }\n Collapsible: { title: string; open?: boolean | Dynamic; count?: number }\n Trace: { size?: TraceSizeValue }\n TraceItem: { title: string | Dynamic; icon?: IconName; description?: string; status?: TraceStatusValue; size?: TraceSizeValue; collapsible?: boolean; open?: boolean | Dynamic }\n Pagination: { totalPages: number; page?: number | Dynamic }\n Breadcrumb: { items: Shapes[\"option\"][] }\n Stepper: { steps: Shapes[\"step\"][]; current?: number | Dynamic; orientation?: OrientationValue }\n Dialog: { title?: string; description?: string; open?: boolean | Dynamic; dismissible?: boolean }\n Drawer: { title?: string; description?: string; open?: boolean | Dynamic; side?: SideValue | Responsive<SideValue>; dismissible?: boolean; dragToDismiss?: boolean }\n DockCard: { label: string | Dynamic; title: string | Dynamic; caption?: string | Dynamic; meta?: string | Dynamic; icon?: IconName; tone?: ToneValue; open?: boolean | Dynamic }\n AlertDialog: { title: string; description?: string; confirmLabel?: string; cancelLabel?: string; destructive?: boolean; open?: boolean | Dynamic }\n Popover: { open?: boolean | Dynamic; side?: SideValue; openOn?: OpenOnValue }\n Tooltip: { content: string; side?: SideValue }\n Menu: { label?: string; icon?: IconName; items: Shapes[\"menuItem\"][]; openOn?: MenuOpenOnValue }\n Toast: { title: string | Dynamic; description?: string | Dynamic; type?: AlertTypeValue; open?: boolean | Dynamic; duration?: number; actionLabel?: string; dismissible?: boolean }\n Badge: { text: string | Dynamic; variant?: VariantValue | Dynamic; icon?: IconName }\n Alert: { title: string; message?: string; type?: AlertTypeValue }\n Chip: { label: string | Dynamic; shape?: ChipShapeValue; selected?: boolean; tone?: ToneValue | Dynamic; dot?: string; icon?: IconName; image?: string; detail?: string; removable?: boolean; pressable?: boolean }\n EmptyState: { icon: IconName; title: string; description?: string; actionLabel?: string; size?: \"page\" | \"list\" }\n Progress: { value: number | Dynamic; max?: number; label?: string; tone?: ToneValue }\n Meter: { segments: Shapes[\"segment\"][]; max?: number; label?: string; value?: string }\n Ring: { value: number | Dynamic; size?: ControlSizeValue; tone?: ToneValue; label?: string }\n Spinner: { size?: SpinnerSizeValue; label?: string }\n Skeleton: { width?: string; height?: string; rounded?: boolean; rows?: number; rowHeight?: number; dot?: boolean }\n Table: { columns: Shapes[\"column\"][]; rows: Record<string, unknown>[] | Dynamic; rowKey?: string; sort?: Shapes[\"sort\"] | Dynamic; selectable?: SelectableValue; selected?: string[] | Dynamic; caption?: string; emptyText?: string; striped?: boolean; density?: DensityValue; stickyHeader?: boolean }\n Chart: { kind: ChartKindValue; categories?: string[] | Dynamic; series: Shapes[\"series\"][] | Dynamic; title?: string; height?: number; xLabel?: string; yLabel?: string; min?: number; max?: number; showAxes?: boolean; showGrid?: boolean; showLegend?: boolean; showValues?: boolean }\n Sparkline: { values: number[] | Dynamic; tone?: ToneValue; height?: number }\n StatTile: { label: string | Dynamic; value: string | Dynamic; delta?: string | Dynamic; tone?: ToneValue | Dynamic; trend?: number[] | Dynamic }\n Button: { label?: string | Dynamic; icon?: IconName | Dynamic; variant?: VariantValue; size?: SizeValue; disabled?: boolean | Dynamic; loading?: boolean; pendingLabel?: string; submit?: boolean }\n Link: { label: string | Dynamic; href?: string; external?: boolean }\n Toggle: { label: string; icon?: IconName; pressed?: boolean | Dynamic; variant?: \"default\" | \"outline\"; size?: ControlSizeValue }\n Form: { name: string; disabled?: boolean | Dynamic; busy?: boolean | Dynamic; summary?: boolean }\n FieldGroup: { columns?: number }\n FormActions: { submit: string | Dynamic; cancel?: boolean; destructive?: boolean }\n Input: { label: string; name: string; type?: InputTypeValue; placeholder?: string; value?: string | Dynamic; disabled?: boolean; checks?: Shapes[\"check\"][]; validateOn?: ValidateOnValue }\n Textarea: { label: string; name: string; placeholder?: string; rows?: number; autosize?: boolean; maxRows?: number; value?: string | Dynamic; disabled?: boolean; checks?: Shapes[\"check\"][]; validateOn?: ValidateOnValue }\n NumberField: { label: string; name: string; value?: number | Dynamic; min?: number; max?: number; step?: number; precision?: number; unit?: string; placeholder?: string; disabled?: boolean; checks?: Shapes[\"check\"][]; validateOn?: ValidateOnValue }\n Checkbox: { label: string | Dynamic; name: string; checked?: boolean | Dynamic; disabled?: boolean; checks?: Shapes[\"check\"][] }\n Radio: { label?: string; name: string; options: Shapes[\"option\"][]; value?: string | Dynamic; orientation?: OrientationValue; checks?: Shapes[\"check\"][] }\n ChoiceTiles: { name: string; options: Shapes[\"option\"][]; type?: GroupTypeValue; value?: string | Dynamic; columns?: number; disabled?: boolean; checks?: Shapes[\"check\"][] }\n Switch: { label: string | Dynamic; name: string; checked?: boolean | Dynamic; description?: string; disabled?: boolean }\n Slider: { label?: string; min?: number | Dynamic; max: number | Dynamic; step?: number; value?: number | Dynamic }\n Rating: { value?: number | Dynamic; max?: number; readOnly?: boolean; size?: ControlSizeValue }\n Select: { label?: string; name: string; options?: Shapes[\"option\"][] | Dynamic; source?: string; placeholder?: string; value?: string | Dynamic; multiple?: boolean; searchable?: boolean; emptyText?: string; disabled?: boolean; checks?: Shapes[\"check\"][]; validateOn?: ValidateOnValue }\n SearchList: { items: Shapes[\"searchItem\"][] | Dynamic; query?: string | Dynamic; placeholder?: string; value?: string | Dynamic; emptyText?: string; maxRows?: number; showCount?: boolean }\n ChipInput: { label?: string; name: string; values?: string[] | Dynamic; suggestions?: Shapes[\"option\"][] | Dynamic; placeholder?: string; max?: number; disabled?: boolean; checks?: Shapes[\"check\"][] }\n DatePicker: { label?: string; name: string; value?: string | Dynamic; min?: string; max?: string; placeholder?: string; firstDayOfWeek?: number }\n DateRangePicker: { label?: string; name: string; start?: string | Dynamic; end?: string | Dynamic; min?: string; max?: string; placeholder?: string; firstDayOfWeek?: number }\n TimePicker: { label?: string; name: string; value?: string | Dynamic; min?: string; max?: string; step?: number; placeholder?: string; disabled?: boolean }\n FileUpload: { label?: string; name: string; accept?: string; multiple?: boolean; maxSize?: number; files?: Shapes[\"file\"][] | Dynamic; hint?: string; disabled?: boolean }\n Composer: { placeholder?: string; value?: string | Dynamic; submitLabel?: string; attachments?: boolean; busy?: boolean }\n Row: { title: string | Dynamic; identifier?: string | Dynamic; subtitle?: string | Dynamic; meta?: string | Dynamic; value?: string | Dynamic; placeholder?: string; icon?: IconName | Dynamic; chevron?: RowChevronValue | Dynamic; selected?: boolean | Dynamic; density?: DensityValue; surface?: RowSurfaceValue; pressable?: boolean; depth?: number }\n TreeGuides: { depth: number; elbowAt?: number; tee?: boolean; passThrough?: number[] }\n Unknown: { component: string; catalogId?: string }\n}\n\n/** A2UI basic component → core component. */\nexport const BASIC_COMPONENT_MAP: Record<string, string> = {\"Text\":\"Text\",\"Image\":\"Image\",\"Icon\":\"Icon\",\"Video\":\"Video\",\"AudioPlayer\":\"AudioPlayer\",\"Row\":\"Stack\",\"Column\":\"Stack\",\"List\":\"List\",\"Card\":\"Card\",\"Tabs\":\"Tabs\",\"Modal\":\"Dialog\",\"Divider\":\"Separator\",\"Button\":\"Button\",\"TextField\":\"Input\",\"CheckBox\":\"Checkbox\",\"ChoicePicker\":\"Radio\",\"Slider\":\"Slider\",\"DateTimeInput\":\"DatePicker\"}\n/** A2UI basic icon name → icons.json name (the placeholder where none exists). */\nexport const BASIC_ICON_MAP: Record<string, string> = {\"accountCircle\":\"ui-assignee\",\"add\":\"ui-add\",\"arrowBack\":\"ui-back\",\"arrowForward\":\"ui-arrow-right\",\"attachFile\":\"ui-attach\",\"calendarToday\":\"calendar\",\"call\":\"phone\",\"camera\":\"camera\",\"check\":\"ui-check\",\"close\":\"ui-close\",\"delete\":\"ui-delete\",\"download\":\"ui-download\",\"edit\":\"ui-edit\",\"event\":\"ui-due-date\",\"error\":\"ui-error\",\"fastForward\":\"media-fast-forward\",\"favorite\":\"heart\",\"favoriteOff\":\"ui-favorite-off\",\"folder\":\"ui-folder\",\"help\":\"ui-help\",\"home\":\"house\",\"info\":\"ui-info\",\"locationOn\":\"map-pin\",\"lock\":\"ui-private\",\"lockOpen\":\"ui-unlock\",\"mail\":\"ui-mail\",\"menu\":\"ui-menu\",\"moreVert\":\"ui-more-vertical\",\"moreHoriz\":\"ui-more\",\"notificationsOff\":\"ui-unsubscribe\",\"notifications\":\"ui-subscribe\",\"pause\":\"run-pause\",\"payment\":\"credit-card\",\"person\":\"ui-avatar-placeholder\",\"phone\":\"smartphone\",\"photo\":\"image\",\"play\":\"action-run\",\"print\":\"ui-print\",\"refresh\":\"ui-refresh\",\"rewind\":\"media-rewind\",\"search\":\"nav-search\",\"send\":\"ui-send\",\"settings\":\"nav-settings\",\"share\":\"ui-share\",\"shoppingCart\":\"shopping-cart\",\"skipNext\":\"media-skip-next\",\"skipPrevious\":\"media-skip-previous\",\"star\":\"star\",\"starHalf\":\"ui-star-half\",\"starOff\":\"ui-star-off\",\"stop\":\"ui-stop\",\"upload\":\"sc-push\",\"visibility\":\"ui-watch\",\"visibilityOff\":\"ui-hide\",\"volumeDown\":\"media-volume-down\",\"volumeMute\":\"media-volume-mute\",\"volumeOff\":\"media-volume-off\",\"volumeUp\":\"media-volume-up\",\"warning\":\"ui-warning\"}\nexport const BASIC_PLACEHOLDER_ICON = \"ui-icon-placeholder\"\n",
6
+ "// Round 1 (docs/round-1-contract.md §4): the built-in UI strings. The ids\n// and English defaults live in catalog/strings.json; a host overrides any id\n// per surface; `$string.<id>` in a prop value resolves through this table at\n// bind time. Pure, mirrored by the Rust core and the native renderers.\n\nimport stringsJson from \"../catalog/strings.json\" with { type: \"json\" }\n\nexport const DEFAULT_STRINGS: Readonly<Record<string, string>> = stringsJson.strings\nexport const STRING_IDS: readonly string[] = Object.keys(DEFAULT_STRINGS)\n\nconst REF = /^\\$string\\.([a-zA-Z][a-zA-Z0-9]*)$/\nconst PLACEHOLDER = /\\{([a-zA-Z][a-zA-Z0-9]*)\\}/g\n\n/** `$string.choose` → `choose`; null for any other value. */\nexport function parseStringRef(value: unknown): string | null {\n if (typeof value !== `string`) return null\n const m = REF.exec(value)\n return m ? m[1] : null\n}\n\n/** True for a well-formed reference to a KNOWN id. */\nexport function isStringRef(value: unknown): boolean {\n const id = parseStringRef(value)\n return id !== null && id in DEFAULT_STRINGS\n}\n\n/** The host's overrides merged over the defaults. */\nexport function stringTable(overrides: Readonly<Record<string, string>> = {}): Record<string, string> {\n return { ...DEFAULT_STRINGS, ...overrides }\n}\n\n/** `{name}` placeholders filled from `params`; unknown ones stay. */\nexport function formatString(template: string, params: Record<string, unknown> = {}): string {\n return template.replace(PLACEHOLDER, (whole, name: string) => (name in params && params[name] !== undefined && params[name] !== null ? String(params[name]) : whole))\n}\n\n/** A prop value with any `$string.<id>` reference replaced by the table's\n * text (an unknown id resolves to the id itself); other values pass. */\nexport function resolveString(value: unknown, table: Readonly<Record<string, string>> = DEFAULT_STRINGS): unknown {\n const id = parseStringRef(value)\n if (id === null) return value\n return table[id] ?? id\n}\n",
7
+ "// Round 2 (docs/round-2-contract.md §3): FORMATTING through a host-supplied\n// Formatter. A renderer formats every number, currency, percent, date and\n// relative time it shows (Table cells, NumberField, chart ticks, calendar\n// names, the format* bind functions) through ONE Formatter per surface, in\n// the surface's `locale` and `timeZone`. The TS renderers build it on Intl\n// (`intlFormatter`); the Rust core defines a `Formatter` trait whose default\n// is the ENGLISH fallback (`englishFormatter`, catalog/locale.json\n// `englishFallback`); FFI hosts pass a foreign one. fixtures/format.json locks\n// the fallback (= Intl en-US, ICU 74+; instants in the surface zone, given\n// to the fallback as a UTC offset per instant), and the display of a bound non-string\n// value in a text prop (`displayString`). Pure.\n\nimport localeJson from \"../catalog/locale.json\" with { type: \"json\" }\n\nexport type PluralCategory = `zero` | `one` | `two` | `few` | `many` | `other`\nexport type DateStyle = `short` | `medium` | `long` | `full`\nexport type RelativeUnit = `second` | `minute` | `hour` | `day` | `week` | `month` | `year`\n\nexport interface NumberOptions {\n /** Fixed fraction digits (min = max); absent = 0..3 for numbers, the\n * currency's minor digits for currencies, 0 for percents. */\n decimals?: number\n /** Locale grouping separators (default true). */\n grouping?: boolean\n}\n\nexport interface DateOptions {\n /** A Unicode TR35 pattern (`MMM d, yyyy`, `HH:mm`); wins over `style`. */\n format?: string\n /** A locale preset (default `medium`: `Oct 14, 2026`). */\n style?: DateStyle\n /** Append the short time (`2:30 PM`) to a preset. */\n time?: boolean\n}\n\n/** What a host supplies per surface (SurfaceSettings.locale + timeZone). */\nexport interface Formatter {\n readonly locale: string\n number(value: number, options?: NumberOptions): string\n currency(value: number, currency: string, options?: NumberOptions): string\n /** `value` is a ratio: 0.256 → `26%`. */\n percent(value: number, options?: { decimals?: number }): string\n /** `value` = `yyyy-mm-dd` (a calendar day, no zone), an ISO date-time (an\n * instant; no offset = UTC) or epoch milliseconds; unreadable = ``. */\n date(value: unknown, options?: DateOptions): string\n /** `value` as for `date`, against `now` (epoch ms). */\n relativeTime(value: unknown, now: number): string\n plural(value: number): PluralCategory\n}\n\nconst FALLBACK = localeJson.englishFallback\nconst MS = { second: 1000, minute: 60_000, hour: 3_600_000, day: 86_400_000 }\n\n// ---------------------------------------------------------------------------\n// Display of a non-string value in a text prop\n// ---------------------------------------------------------------------------\n\n/** What a `string`/`markdown` prop shows for a bound value: strings as they\n * are, finite numbers as ECMAScript `Number.prototype.toString` (shortest\n * round trip, `-0` → `0`, exponent form below 1e-6 and from 1e21), booleans\n * `true`/`false`; null, undefined, non-finite numbers, objects and arrays\n * show nothing (``). No locale formatting (use formatNumber for that). */\nexport function displayString(value: unknown): string {\n if (typeof value === `string`) return value\n if (typeof value === `number`) return Number.isFinite(value) ? String(value) : ``\n if (typeof value === `boolean`) return String(value)\n return ``\n}\n\n// ---------------------------------------------------------------------------\n// Decimal arithmetic on the shortest round-trip string (ICU's halfExpand)\n// ---------------------------------------------------------------------------\n\ninterface Decimal {\n int: string\n frac: string\n}\n\n/** |n| as its shortest round-trip decimal digits, split at the point. */\nfunction decimalOf(abs: number): Decimal {\n const m = /^(\\d+)(?:\\.(\\d+))?(?:e([+-]\\d+))?$/.exec(String(abs))\n if (!m) return { int: `0`, frac: `` }\n const digits = m[1] + (m[2] ?? ``)\n let point = m[1].length + (m[3] ? Number(m[3]) : 0)\n let all = digits\n if (point <= 0) {\n all = `0`.repeat(1 - point) + all\n point = 1\n }\n if (point > all.length) all = all + `0`.repeat(point - all.length)\n const int = all.slice(0, point).replace(/^0+(?=\\d)/, ``)\n return { int, frac: all.slice(point).replace(/0+$/, ``) }\n}\n\n/** Move the point `places` to the right (percent = 2). */\nfunction shift(d: Decimal, places: number): Decimal {\n const frac = d.frac + `0`.repeat(Math.max(0, places - d.frac.length))\n const int = (d.int + frac.slice(0, places)).replace(/^0+(?=\\d)/, ``)\n return { int, frac: frac.slice(places).replace(/0+$/, ``) }\n}\n\n/** Round to at most `max` fraction digits, half away from zero, then pad to\n * `min`. */\nfunction round(d: Decimal, min: number, max: number): Decimal {\n let { int, frac } = d\n if (frac.length > max) {\n const up = frac.charCodeAt(max) >= 53 // '5'\n let kept = int + frac.slice(0, max)\n if (up) {\n const chars = kept.split(``)\n let i = chars.length - 1\n for (; i >= 0; i--) {\n if (chars[i] === `9`) chars[i] = `0`\n else {\n chars[i] = String(Number(chars[i]) + 1)\n break\n }\n }\n kept = (i < 0 ? `1` : ``) + chars.join(``)\n }\n const intLen = kept.length - max\n int = kept.slice(0, intLen) || `0`\n frac = kept.slice(intLen).replace(/0+$/, ``)\n }\n if (frac.length < min) frac = frac + `0`.repeat(min - frac.length)\n return { int, frac }\n}\n\nfunction group(int: string, on: boolean): string {\n if (!on || int.length < 4) return int\n let out = ``\n for (let i = 0; i < int.length; i++) {\n if (i > 0 && (int.length - i) % 3 === 0) out += `,`\n out += int[i]\n }\n return out\n}\n\nfunction englishNumber(value: number, min: number, max: number, grouping: boolean): { sign: string; body: string } {\n const neg = value < 0 || Object.is(value, -0)\n if (Number.isNaN(value)) return { sign: ``, body: `NaN` }\n if (!Number.isFinite(value)) return { sign: neg ? `-` : ``, body: `∞` }\n const d = round(decimalOf(Math.abs(value)), min, max)\n return { sign: neg ? `-` : ``, body: `${group(d.int, grouping)}${d.frac ? `.${d.frac}` : ``}` }\n}\n\nconst fixedDigits = (decimals: number | undefined): number | undefined =>\n typeof decimals === `number` && Number.isFinite(decimals) ? Math.max(0, Math.min(20, Math.trunc(decimals))) : undefined\n\n/** The minor digits of a currency (ISO 4217; 2 when not listed). */\nexport function currencyDigits(code: string): number {\n return (FALLBACK.currencyDigits as Record<string, number>)[code.toUpperCase()] ?? 2\n}\n\n// ---------------------------------------------------------------------------\n// Dates\n// ---------------------------------------------------------------------------\n\n/** The instant a date value names: `yyyy-mm-dd` = that calendar day (UTC\n * midnight, `dateOnly`), an ISO date-time (no offset = UTC), epoch ms. */\nexport function parseDateValue(value: unknown): { ms: number; dateOnly: boolean } | null {\n if (typeof value === `number`) return Number.isFinite(value) ? { ms: value, dateOnly: false } : null\n if (typeof value !== `string` || value.trim() === ``) return null\n const day = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (day) {\n const ms = Date.UTC(Number(day[1]), Number(day[2]) - 1, Number(day[3]))\n return Number.isFinite(ms) ? { ms, dateOnly: true } : null\n }\n if (!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?$/.test(value)) return null\n const zoned = /(Z|[+-]\\d{2}:\\d{2})$/.test(value) ? value : `${value}Z`\n const ms = Date.parse(zoned)\n return Number.isFinite(ms) ? { ms, dateOnly: false } : null\n}\n\ninterface DateFields {\n year: number\n month: number // 1..12\n day: number\n weekday: number // 0 = Sunday\n hour: number\n minute: number\n second: number\n}\n\nfunction utcFields(ms: number): DateFields {\n const d = new Date(ms)\n return { year: d.getUTCFullYear(), month: d.getUTCMonth() + 1, day: d.getUTCDate(), weekday: d.getUTCDay(), hour: d.getUTCHours(), minute: d.getUTCMinutes(), second: d.getUTCSeconds() }\n}\n\ninterface DateNames {\n months: readonly string[]\n monthsShort: readonly string[]\n weekdays: readonly string[]\n weekdaysShort: readonly string[]\n dayPeriods: readonly string[]\n}\n\nconst pad = (n: number, width: number) => String(n).padStart(width, `0`)\n\n/** A TR35 pattern over fields: `y yy yyyy M MM MMM MMMM d dd E EEE EEEE h hh\n * H HH m mm s ss a`, `'quoted'` literals (`''` = an apostrophe); any other\n * letter run is copied as written. Digits are ASCII. */\nexport function formatPattern(pattern: string, f: DateFields, names: DateNames): string {\n let out = ``\n let i = 0\n while (i < pattern.length) {\n const ch = pattern[i]\n if (ch === `'`) {\n if (pattern[i + 1] === `'`) {\n out += `'`\n i += 2\n continue\n }\n // A quoted literal; `''` inside it is an apostrophe too.\n i++\n while (i < pattern.length) {\n if (pattern[i] === `'`) {\n if (pattern[i + 1] === `'`) {\n out += `'`\n i += 2\n continue\n }\n i++\n break\n }\n out += pattern[i]\n i++\n }\n continue\n }\n if (!/[A-Za-z]/.test(ch)) {\n out += ch\n i++\n continue\n }\n let n = 1\n while (pattern[i + n] === ch) n++\n const run = pattern.slice(i, i + n)\n i += n\n const h12 = f.hour % 12 === 0 ? 12 : f.hour % 12\n switch (ch) {\n case `y`:\n out += n === 2 ? pad(f.year % 100, 2) : pad(f.year, n)\n break\n case `M`:\n out += n >= 4 ? names.months[f.month - 1] : n === 3 ? names.monthsShort[f.month - 1] : pad(f.month, n)\n break\n case `d`:\n out += pad(f.day, n)\n break\n case `E`:\n out += n >= 4 ? names.weekdays[f.weekday] : names.weekdaysShort[f.weekday]\n break\n case `h`:\n out += pad(h12, n)\n break\n case `H`:\n out += pad(f.hour, n)\n break\n case `m`:\n out += pad(f.minute, n)\n break\n case `s`:\n out += pad(f.second, n)\n break\n case `a`:\n out += names.dayPeriods[f.hour < 12 ? 0 : 1]\n break\n default:\n out += run\n }\n }\n return out\n}\n\n/** The en-US preset patterns (`style`), the time a preset appends and the\n * joiner per style (locale.json `englishFallback`). */\nexport const ENGLISH_DATE_PATTERNS: Readonly<Record<DateStyle, string>> = FALLBACK.datePatterns\nexport const ENGLISH_TIME_PATTERN: string = FALLBACK.timePattern\nexport const ENGLISH_DATE_TIME_JOIN: Readonly<Record<DateStyle, string>> = FALLBACK.dateTimeJoin\n\n/** The surface zone as the English fallback sees it: the UTC offset in\n * minutes (east positive) in force at an instant (epoch ms). A host\n * without an IANA database passes its platform's local offset; the\n * fixtures pin a fixed one (`offsetMinutes`). */\nexport type ZoneOffset = (utcMs: number) => number\n\n/** A fixed offset (minutes east of UTC); `fixedOffset(0)` = UTC. */\nexport const fixedOffset = (minutes: number): ZoneOffset => () => minutes\n\n/** An IANA zone's offset through Intl (TS hosts; the Rust core takes its\n * host's offset instead). */\nexport function intlZoneOffset(timeZone: string): ZoneOffset {\n const dtf = new Intl.DateTimeFormat(`en-US`, { timeZone, year: `numeric`, month: `numeric`, day: `numeric`, hour: `numeric`, minute: `numeric`, second: `numeric`, hourCycle: `h23` })\n return (ms) => {\n const at = Math.floor(ms / 1000) * 1000\n const p = Object.fromEntries(dtf.formatToParts(new Date(at)).map((x) => [x.type, x.value]))\n const local = Date.UTC(Number(p.year), Number(p.month) - 1, Number(p.day), Number(p.hour) % 24, Number(p.minute), Number(p.second))\n return Math.round((local - at) / 60_000)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Relative time\n// ---------------------------------------------------------------------------\n\n/** The unit a delta (value − now, ms) is shown in, and its count (truncated\n * toward zero): under a minute seconds, under an hour minutes, under a day\n * hours, under 7 days days, under 30 days weeks, under 365 days months (of\n * 30 days), else years (of 365 days). */\nexport function relativeTimeUnit(deltaMs: number): { value: number; unit: RelativeUnit } {\n const abs = Math.abs(deltaMs)\n const t = (unit: number) => Math.trunc(deltaMs / unit) || 0\n if (abs < MS.minute) return { value: t(MS.second), unit: `second` }\n if (abs < MS.hour) return { value: t(MS.minute), unit: `minute` }\n if (abs < MS.day) return { value: t(MS.hour), unit: `hour` }\n if (abs < 7 * MS.day) return { value: t(MS.day), unit: `day` }\n if (abs < 30 * MS.day) return { value: t(7 * MS.day), unit: `week` }\n if (abs < 365 * MS.day) return { value: t(30 * MS.day), unit: `month` }\n return { value: t(365 * MS.day), unit: `year` }\n}\n\n// ---------------------------------------------------------------------------\n// The English fallback\n// ---------------------------------------------------------------------------\n\nconst ENGLISH_NAMES: DateNames = FALLBACK\n\n/** The Formatter a renderer uses without a platform ICU (the Rust core's\n * default): Intl en-US, decided by data (catalog/locale.json\n * `englishFallback`). Instants show in the surface zone `zone` (default\n * UTC); a `yyyy-mm-dd` value is a calendar day and never shifts. */\nexport function englishFormatter(zone: ZoneOffset = fixedOffset(0)): Formatter {\n return {\n locale: `en-US`,\n number(value, options = {}) {\n const fixed = fixedDigits(options.decimals)\n const { sign, body } = englishNumber(value, fixed ?? 0, fixed ?? 3, options.grouping !== false)\n return `${sign}${body}`\n },\n currency(value, currency, options = {}) {\n const code = currency.toUpperCase()\n const digits = fixedDigits(options.decimals) ?? currencyDigits(code)\n const { sign, body } = englishNumber(value, digits, digits, options.grouping !== false)\n const prefix = (FALLBACK.currencyPrefix as Record<string, string>)[code] ?? FALLBACK.unknownCurrency.replace(`{code}`, code)\n return `${sign}${prefix}${body}`\n },\n percent(value, options = {}) {\n const digits = fixedDigits(options.decimals) ?? 0\n if (!Number.isFinite(value)) {\n const { sign, body } = englishNumber(value, 0, 0, true)\n return `${sign}${body}%`\n }\n const neg = value < 0 || Object.is(value, -0)\n const d = round(shift(decimalOf(Math.abs(value)), 2), digits, digits)\n return `${neg ? `-` : ``}${group(d.int, true)}${d.frac ? `.${d.frac}` : ``}%`\n },\n date(value, options = {}) {\n const parsed = parseDateValue(value)\n if (!parsed) return ``\n const f = utcFields(parsed.dateOnly ? parsed.ms : parsed.ms + zone(parsed.ms) * 60_000)\n if (options.format) return formatPattern(options.format, f, ENGLISH_NAMES)\n const style = options.style ?? `medium`\n const date = formatPattern(ENGLISH_DATE_PATTERNS[style], f, ENGLISH_NAMES)\n if (!options.time) return date\n const time = formatPattern(ENGLISH_TIME_PATTERN, f, ENGLISH_NAMES)\n return ENGLISH_DATE_TIME_JOIN[style].replace(`{date}`, date).replace(`{time}`, time)\n },\n relativeTime(value, now) {\n const parsed = parseDateValue(value)\n if (!parsed) return ``\n const { value: n, unit } = relativeTimeUnit(parsed.ms - now)\n const auto = (FALLBACK.relative.auto as Record<string, Record<string, string>>)[unit]?.[String(n)]\n if (auto) return auto\n const [one, many] = (FALLBACK.relative.units as Record<string, string[]>)[unit]\n const count = englishNumber(Math.abs(n), 0, 0, true).body\n const unitName = Math.abs(n) === 1 ? one : many\n const template = n < 0 ? FALLBACK.relative.past : FALLBACK.relative.future\n return template.replace(`{value}`, count).replace(`{unit}`, unitName)\n },\n plural(value) {\n return Math.abs(value) === 1 ? `one` : `other`\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// The Intl formatter (TS renderers)\n// ---------------------------------------------------------------------------\n\n/** A Formatter on the platform's Intl in `locale` (BCP 47) and `timeZone`\n * (IANA; default UTC, as the fixtures pin it). Patterns use the locale's\n * month/weekday/day-period NAMES with ASCII digits. */\nexport function intlFormatter(locale: string, timeZone = `UTC`): Formatter {\n const nf = (o: Intl.NumberFormatOptions) => new Intl.NumberFormat(locale, o)\n let names: DateNames | null = null\n const dateNames = (): DateNames => {\n if (names) return names\n const at = (o: Intl.DateTimeFormatOptions, ms: number) => new Intl.DateTimeFormat(locale, { ...o, timeZone: `UTC` }).format(new Date(ms))\n const months = Array.from({ length: 12 }, (_, i) => Date.UTC(2026, i, 1))\n const days = Array.from({ length: 7 }, (_, i) => Date.UTC(2026, 0, 4 + i)) // 2026-01-04 is a Sunday\n const period = (h: number) => new Intl.DateTimeFormat(locale, { hour: `numeric`, hour12: true, timeZone: `UTC` }).formatToParts(new Date(Date.UTC(2026, 0, 1, h))).find((p) => p.type === `dayPeriod`)?.value ?? (h < 12 ? `AM` : `PM`)\n names = {\n months: months.map((ms) => at({ month: `long` }, ms)),\n monthsShort: months.map((ms) => at({ month: `short` }, ms)),\n weekdays: days.map((ms) => at({ weekday: `long` }, ms)),\n weekdaysShort: days.map((ms) => at({ weekday: `short` }, ms)),\n dayPeriods: [period(9), period(15)],\n }\n return names\n }\n const zonedFields = (ms: number): DateFields => {\n const parts = new Intl.DateTimeFormat(`en-US`, { timeZone, year: `numeric`, month: `numeric`, day: `numeric`, hour: `numeric`, minute: `numeric`, second: `numeric`, weekday: `short`, hourCycle: `h23` }).formatToParts(new Date(ms))\n const get = (t: string) => parts.find((p) => p.type === t)?.value ?? `0`\n return { year: Number(get(`year`)), month: Number(get(`month`)), day: Number(get(`day`)), weekday: [`Sun`, `Mon`, `Tue`, `Wed`, `Thu`, `Fri`, `Sat`].indexOf(get(`weekday`)), hour: Number(get(`hour`)) % 24, minute: Number(get(`minute`)), second: Number(get(`second`)) }\n }\n return {\n locale,\n number(value, options = {}) {\n const fixed = fixedDigits(options.decimals)\n return nf({ minimumFractionDigits: fixed ?? 0, maximumFractionDigits: fixed ?? 3, useGrouping: options.grouping !== false }).format(value)\n },\n currency(value, currency, options = {}) {\n const fixed = fixedDigits(options.decimals)\n return nf({ style: `currency`, currency, ...(fixed !== undefined ? { minimumFractionDigits: fixed, maximumFractionDigits: fixed } : {}), useGrouping: options.grouping !== false }).format(value)\n },\n percent(value, options = {}) {\n const fixed = fixedDigits(options.decimals) ?? 0\n return nf({ style: `percent`, minimumFractionDigits: fixed, maximumFractionDigits: fixed }).format(value)\n },\n date(value, options = {}) {\n const parsed = parseDateValue(value)\n if (!parsed) return ``\n const zone = parsed.dateOnly ? `UTC` : timeZone\n if (options.format) return formatPattern(options.format, parsed.dateOnly ? utcFields(parsed.ms) : zonedFields(parsed.ms), dateNames())\n return new Intl.DateTimeFormat(locale, { dateStyle: options.style ?? `medium`, ...(options.time ? { timeStyle: `short` } : {}), timeZone: zone }).format(new Date(parsed.ms))\n },\n relativeTime(value, now) {\n const parsed = parseDateValue(value)\n if (!parsed) return ``\n const { value: n, unit } = relativeTimeUnit(parsed.ms - now)\n return new Intl.RelativeTimeFormat(locale, { numeric: `auto` }).format(n, unit)\n },\n plural(value) {\n return new Intl.PluralRules(locale).select(value) as PluralCategory\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// The format functions of the bind table\n// ---------------------------------------------------------------------------\n\n/** The bind-time format functions (A2UI basic `formatNumber`,\n * `formatCurrency`, `formatDate`, `pluralize` + the core `formatPercent`,\n * `formatRelativeTime`), all through ONE Formatter. */\nexport const FORMAT_FUNCTION_NAMES = [`formatNumber`, `formatCurrency`, `formatPercent`, `formatDate`, `formatRelativeTime`, `pluralize`] as const\n\n/** A numeric string: optional ASCII whitespace around an optional sign,\n * decimal digits with an optional fraction and exponent (`' 12 '`, `1e3`,\n * `-.5`). Hex, `Infinity`, separators and anything else are not numbers. */\nconst NUMERIC = /^[ \\t\\n\\r]*[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?[ \\t\\n\\r]*$/\nconst toNum = (v: unknown): number => (typeof v === `number` ? v : typeof v === `string` && NUMERIC.test(v) ? Number(v) : NaN)\nconst optNum = (v: unknown): number | undefined => (v === undefined || v === null ? undefined : toNum(v))\n\n/** The format functions over a Formatter; `now` = the clock\n * `formatRelativeTime` reads when its call has no `now` (a renderer\n * re-binds such a node at least once a minute). A value that is not a\n * number, a numeric string (`NUMERIC`) or a date formats to ``. */\nexport function formatFunctions(formatter: Formatter, now: () => number = () => Date.now()): Record<(typeof FORMAT_FUNCTION_NAMES)[number], (args: Record<string, unknown>) => unknown> {\n const numberOr = (value: unknown, f: (n: number) => string) => {\n const n = toNum(value)\n return Number.isFinite(n) ? f(n) : ``\n }\n return {\n formatNumber: ({ value, decimals, grouping }) => numberOr(value, (n) => formatter.number(n, { decimals: optNum(decimals), grouping: grouping === undefined ? undefined : grouping !== false })),\n formatCurrency: ({ value, currency, decimals, grouping }) => numberOr(value, (n) => (typeof currency === `string` && /^[A-Za-z]{3}$/.test(currency) ? formatter.currency(n, currency, { decimals: optNum(decimals), grouping: grouping === undefined ? undefined : grouping !== false }) : ``)),\n formatPercent: ({ value, decimals }) => numberOr(value, (n) => formatter.percent(n, { decimals: optNum(decimals) })),\n formatDate: ({ value, format, style, time }) =>\n formatter.date(value, { ...(typeof format === `string` && format ? { format } : {}), ...(style === `short` || style === `medium` || style === `long` || style === `full` ? { style } : {}), ...(time === true ? { time: true } : {}) }),\n formatRelativeTime: ({ value, now: at }) => formatter.relativeTime(value, typeof at === `number` ? at : (parseDateValue(at)?.ms ?? now())),\n pluralize: (args) => {\n const n = toNum(args.value)\n if (!Number.isFinite(n)) return args.other\n if (n === 0 && args.zero !== undefined) return args.zero\n const category = formatter.plural(n)\n return args[category] ?? args.other\n },\n }\n}\n\n/** The fallback's format functions (the reference bind table's). */\nexport const ENGLISH_FORMAT_FUNCTIONS = formatFunctions(englishFormatter())\n",
8
+ "// VAPP-85: the macro template's value language (catalog/macros.json\n// `$comment`): `{props.x}` paths with `|fallback`, `len(path)`, `range(n)`,\n// `!path`, string interpolation, and the $map / $cond / $eq / $lt / $add /\n// $sub / $clamp / $percent / $coalesce / $text / $not / $fill value objects. Pure, so the\n// Rust core can mirror it line by line.\n//\n// Round 1 (docs/round-1-contract.md §1): an input may be an A2UI DYNAMIC\n// value — a data binding `{path}` or a function call `{call, args}` — which\n// has no value at expansion time. The evaluator then EMITS a function call\n// that the renderer evaluates at bind time, instead of computing. The calls it\n// emits are the CORE functions (percent, add, sub, eq, lt, clamp, cond,\n// fallback, concat, coalesce, text, map, len, fill; `CORE_FUNCTIONS` below)\n// PLUS the basic catalog's logic functions `not`, `and` and `or` (`{!x}`,\n// `$not`, bound `$if`/`$any`), evaluated with the same `truthy`: a renderer\n// MUST implement the whole bind table (`src/dynamic.ts BIND_FUNCTIONS`,\n// generated as `bindFunctionNames`). A whole-string `{props.x}` /\n// `{props.x|fallback}` that is a MEMBER of a props/style/context object (or\n// an array item) and whose value is dynamic passes the dynamic value through\n// UNCHANGED (the fallback is dropped), so a two-way `{path}` binding survives\n// expansion; as an OPERAND of a `$`-object it keeps the fallback\n// (`fallback{value, default}`), so `$eq: [\"{props.page|1}\", 1]` still sees 1\n// when the bound page is missing. `$fill` ALWAYS emits `fill` (its template is\n// a `$string.<id>` the surface's string table resolves at bind time).\n\nimport { formatString } from \"./strings\"\nimport { ENGLISH_FORMAT_FUNCTIONS } from \"./format\"\n\nexport interface ExprContext {\n id: string\n props: Record<string, unknown>\n vars: Record<string, unknown>\n}\n\n/** An A2UI data binding: an object with exactly one key, `path`. */\nexport interface DataBinding {\n path: string\n}\n/** An A2UI function call. */\nexport interface FunctionCall {\n call: string\n args?: Record<string, unknown>\n returnType?: string\n}\nexport type Dynamic = DataBinding | FunctionCall\n\nconst WHOLE = /^\\{([^{}]+)\\}$/\nconst EMBEDDED = /\\{([^{}]+)\\}/g\nconst FUNCTION = /^(len|range)\\((.+)\\)$/\n\nexport function isBinding(value: unknown): value is DataBinding {\n return typeof value === `object` && value !== null && !Array.isArray(value) && typeof (value as DataBinding).path === `string` && Object.keys(value as object).length === 1\n}\nexport function isCall(value: unknown): value is FunctionCall {\n return typeof value === `object` && value !== null && !Array.isArray(value) && typeof (value as FunctionCall).call === `string`\n}\n/** A value the expander cannot evaluate: the renderer will. */\nexport function isDynamic(value: unknown): value is Dynamic {\n return isBinding(value) || isCall(value)\n}\n\n/** `undefined`, `null`, `false` and `\"\"` are false; 0 is TRUE (a count of\n * zero still shows). */\nexport function truthy(value: unknown): boolean {\n return value !== undefined && value !== null && value !== false && value !== ``\n}\n\nfunction call(name: string, args: Record<string, unknown>): FunctionCall {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(args)) if (v !== undefined) out[k] = v\n return { call: name, args: out }\n}\n\nfunction parseLiteral(text: string): unknown {\n if (text === `true`) return true\n if (text === `false`) return false\n if (text === `null`) return null\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) return Number(text)\n return text\n}\n\nfunction lookup(path: string, ctx: ExprContext): unknown {\n if (path === `id`) return ctx.id\n const [head, ...rest] = path.split(`.`)\n let cur: unknown\n if (head === `props`) cur = ctx.props\n else if (head in ctx.vars) cur = ctx.vars[head]\n else return undefined\n for (const key of rest) {\n if (cur === undefined || cur === null) return undefined\n cur = (cur as Record<string, unknown>)[key]\n }\n return cur\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === `number` ? value : Number(value ?? 0) || 0\n}\n\n/** A string that spells a finite number (`\"5\"`, `\" 2.5 \"`), else undefined. */\nfunction numericString(value: string): number | undefined {\n const text = value.trim()\n if (text === ``) return undefined\n const n = Number(text)\n return Number.isFinite(n) ? n : undefined\n}\n\n/** `eq` (and `$eq`): strict equality, except that a NUMBER and a string\n * spelling that number are equal (`5` vs `\"5\"`: form and URL state arrive as\n * strings). Nothing else coerces (`0` vs `\"\"`, `1` vs `true` differ). */\nexport function valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a === `number` && typeof b === `string`) return numericString(b) === a\n if (typeof b === `number` && typeof a === `string`) return numericString(a) === b\n return false\n}\n\n/** `clamp`: the value as a number held inside [min, max]; a missing bound\n * (undefined or null) does not clamp; `min` wins when max < min. */\nexport function clampNumber(value: unknown, min: unknown, max: unknown): number {\n let n = toNumber(value)\n if (max !== undefined && max !== null) n = Math.min(n, toNumber(max))\n if (min !== undefined && min !== null) n = Math.max(n, toNumber(min))\n return n\n}\n\n/** `fill`: the template (already resolved through the string table) with its\n * `{name}` placeholders filled from params (strings.ts formatString). */\nexport function fillTemplate(template: unknown, params: unknown): string {\n const text = template === undefined || template === null ? `` : String(template)\n return formatString(text, typeof params === `object` && params !== null ? (params as Record<string, unknown>) : {})\n}\n\n/** The most indexes `range(n)` yields (R8 F51): a Rating's `max` of 1e8 or\n * 1e300 would otherwise allocate that many items before the component\n * budget could refuse them. Equals `maxTemplateItems`; a larger `n` is\n * silently clamped (the reducer's `maxComponents` reports the overflow).\n * Mirrors `MAX_RANGE_ITEMS` in the Rust core's `expr.rs`. */\nexport const MAX_RANGE_ITEMS = 10_000\n\n/** One expression: `len(path)`, `range(n)`, `path|fallback`, `!path`, `path`.\n * The function forms wrap the whole expression and are tried first, so a\n * fallback inside their parentheses stays theirs. */\nexport function evalExpr(expr: string, ctx: ExprContext): unknown {\n const text = expr.trim()\n const fn = FUNCTION.exec(text)\n if (fn) {\n const inner = evalExpr(fn[2], ctx)\n if (fn[1] === `len`) {\n if (isDynamic(inner)) return call(`len`, { value: inner })\n return Array.isArray(inner) ? inner.length : typeof inner === `string` ? inner.length : 0\n }\n // range: the indexes 0..n-1 (at most MAX_RANGE_ITEMS; NaN = 0); a bound\n // count cannot be expanded (→ no items).\n if (isDynamic(inner)) return undefined\n const n = Math.min(MAX_RANGE_ITEMS, Math.max(0, Math.floor(toNumber(inner))) || 0)\n return Array.from({ length: n }, (_, i) => i)\n }\n const bar = text.indexOf(`|`)\n if (bar >= 0) {\n const value = evalExpr(text.slice(0, bar), ctx)\n const fallback = parseLiteral(text.slice(bar + 1))\n if (value === undefined || value === null) return fallback\n if (isDynamic(value)) return call(`fallback`, { value, default: fallback })\n return value\n }\n if (text.startsWith(`!`)) {\n const value = evalExpr(text.slice(1), ctx)\n if (isDynamic(value)) return call(`not`, { value })\n return !truthy(value)\n }\n return lookup(text, ctx)\n}\n\n/** The member rule: a dynamic value passes through untouched; the\n * `fallback` a `|fallback` wrapped it in is unwrapped again. */\nfunction passThrough(value: unknown): unknown {\n if (isCall(value) && value.call === `fallback` && isDynamic(value.args?.value)) return value.args?.value\n return value\n}\n\n/** An operand of a `$`-object (or its result): a whole string evaluates as\n * its expression, keeping a `|fallback` as `fallback{…}` when dynamic. */\nfunction evalOperand(value: unknown, ctx: ExprContext): unknown {\n if (typeof value === `string`) {\n const whole = WHOLE.exec(value)\n if (whole) return evalExpr(whole[1], ctx)\n }\n return evalValue(value, ctx)\n}\n\n/** A condition: a string expression or a value object ($eq …). `true` or\n * `false` when it can be decided now; the dynamic value when it cannot. */\nexport function evalConditionValue(cond: unknown, ctx: ExprContext): boolean | Dynamic {\n const value = typeof cond === `string` ? evalExpr(cond, ctx) : evalOperand(cond, ctx)\n if (isDynamic(value)) return value\n return truthy(value)\n}\n\n/** A condition decided NOW: a dynamic condition counts as true (the part\n * exists; `visible` carries the bound test, see macros.ts). */\nexport function evalCondition(cond: unknown, ctx: ExprContext): boolean {\n const value = evalConditionValue(cond, ctx)\n return value === true || isDynamic(value)\n}\n\nfunction interpolate(value: string, ctx: ExprContext): unknown {\n const parts: unknown[] = []\n let dynamic = false\n let last = 0\n for (const match of value.matchAll(EMBEDDED)) {\n const at = match.index ?? 0\n if (at > last) parts.push(value.slice(last, at))\n const v = evalExpr(match[1], ctx)\n if (isDynamic(v)) dynamic = true\n parts.push(v)\n last = at + match[0].length\n }\n if (last < value.length) parts.push(value.slice(last))\n if (dynamic) return call(`concat`, { values: parts.filter((p) => p !== undefined && p !== null && p !== ``) })\n return parts.map((p) => (p === undefined || p === null ? `` : String(p))).join(``)\n}\n\n/** Any template value: strings interpolate, arrays and objects recurse, the\n * `$`-objects compute (or emit a call when an input is dynamic). `undefined`\n * results are dropped by the caller. */\nexport function evalValue(value: unknown, ctx: ExprContext): unknown {\n if (typeof value === `string`) {\n const whole = WHOLE.exec(value)\n if (whole) return passThrough(evalExpr(whole[1], ctx))\n return interpolate(value, ctx)\n }\n if (Array.isArray(value)) {\n return value.map((item) => evalValue(item, ctx)).filter((item) => item !== undefined)\n }\n if (typeof value !== `object` || value === null) return value\n const obj = value as Record<string, unknown>\n if (`$map` in obj) {\n const spec = obj.$map as { from: string; cases: Record<string, unknown>; default?: unknown }\n const from = evalExpr(spec.from, ctx)\n if (isDynamic(from)) {\n const cases: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(spec.cases)) {\n const evaluated = evalOperand(v, ctx)\n if (evaluated !== undefined) cases[k] = evaluated\n }\n return call(`map`, { value: from, cases, default: evalOperand(spec.default, ctx) })\n }\n const key = from === undefined || from === null ? `` : String(from)\n const hit = Object.prototype.hasOwnProperty.call(spec.cases, key) ? spec.cases[key] : spec.default\n return evalOperand(hit, ctx)\n }\n if (`$cond` in obj) {\n const [cond, then, otherwise] = obj.$cond as [unknown, unknown, unknown]\n const decided = evalConditionValue(cond, ctx)\n if (isDynamic(decided)) return call(`cond`, { if: decided, then: evalOperand(then, ctx), else: evalOperand(otherwise, ctx) })\n return evalOperand(decided ? then : otherwise, ctx)\n }\n if (`$eq` in obj) {\n const [a, b] = (obj.$eq as [unknown, unknown]).map((x) => evalOperand(x, ctx))\n if (isDynamic(a) || isDynamic(b)) return call(`eq`, { a, b })\n return valuesEqual(a, b)\n }\n if (`$lt` in obj) {\n const [a, b] = (obj.$lt as [unknown, unknown]).map((x) => evalOperand(x, ctx))\n if (isDynamic(a) || isDynamic(b)) return call(`lt`, { a, b })\n return toNumber(a) < toNumber(b)\n }\n if (`$add` in obj) {\n const [a, b] = (obj.$add as [unknown, unknown]).map((x) => evalOperand(x, ctx))\n if (isDynamic(a) || isDynamic(b)) return call(`add`, { a, b })\n return toNumber(a) + toNumber(b)\n }\n if (`$sub` in obj) {\n const [a, b] = (obj.$sub as [unknown, unknown]).map((x) => evalOperand(x, ctx))\n if (isDynamic(a) || isDynamic(b)) return call(`sub`, { a, b })\n return toNumber(a) - toNumber(b)\n }\n if (`$clamp` in obj) {\n const [v, min, max] = (obj.$clamp as [unknown, unknown, unknown]).map((x) => evalOperand(x, ctx))\n if (isDynamic(v) || isDynamic(min) || isDynamic(max)) return call(`clamp`, { value: v, min, max })\n return clampNumber(v, min, max)\n }\n if (`$fill` in obj) {\n // Always emitted: the template is (usually) a `$string.<id>` only the\n // surface's string table can resolve, at bind time.\n const [template, params] = obj.$fill as [unknown, Record<string, unknown> | undefined]\n const filled: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(params ?? {})) {\n const evaluated = evalOperand(v, ctx)\n if (evaluated !== undefined) filled[k] = evaluated\n }\n return call(`fill`, { template: evalOperand(template, ctx), params: filled })\n }\n if (`$percent` in obj) {\n const [v, max] = (obj.$percent as [unknown, unknown]).map((x) => evalOperand(x, ctx))\n if (isDynamic(v) || isDynamic(max)) return call(`percent`, { value: v, max })\n return percent(v, max)\n }\n if (`$text` in obj) {\n const spec = obj.$text\n const v = typeof spec === `string` ? evalExpr(spec, ctx) : evalOperand(spec, ctx)\n if (isDynamic(v)) return call(`text`, { value: v })\n return v === undefined || v === null ? undefined : String(v)\n }\n if (`$coalesce` in obj) {\n const out: unknown[] = []\n for (const candidate of obj.$coalesce as unknown[]) {\n const v = evalOperand(candidate, ctx)\n if (v === undefined) continue\n if (isDynamic(v)) {\n out.push(v)\n continue\n }\n if (!truthy(v)) continue\n if (out.length === 0) return v\n out.push(v)\n break\n }\n if (out.length === 0) return undefined\n if (out.length === 1) return out[0]\n return call(`coalesce`, { values: out })\n }\n if (`$not` in obj) {\n const decided = evalConditionValue(obj.$not, ctx)\n if (isDynamic(decided)) return call(`not`, { value: decided })\n return !decided\n }\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n const evaluated = evalValue(v, ctx)\n if (evaluated === undefined) continue\n const key = k.includes(`{`) ? evalValue(k, ctx) : k\n out[typeof key === `string` ? key : k] = evaluated\n }\n return out\n}\n\n/** `$percent`'s arithmetic, shared with the core `percent` function: the\n * share of `max` as \"N%\", clamped to 0..100, two decimals. */\nexport function percent(value: unknown, max: unknown): string {\n const m = toNumber(max)\n const pct = m > 0 ? (toNumber(value) / m) * 100 : 0\n const clamped = Math.min(100, Math.max(0, pct))\n return `${Math.round(clamped * 100) / 100}%`\n}\n\n/** Round 4 (VAPP-103) `filter`: the items of an array that match, in order,\n * so a List or Table binds to a filtered view without an agent round trip.\n * `where` = field → value, every entry must hold (`eq` equality); an entry\n * whose value is missing, null or \"\" does NOT constrain (a bound \"all\"\n * choice). `query` = a case-insensitive substring of ANY of `fields` (the\n * item's own string and number values when `fields` is absent; a string or\n * number item matches itself); a missing, null or blank query does not\n * constrain. Not an array → []. */\nexport function filterItems(items: unknown, query: unknown, fields: unknown, where: unknown): unknown[] {\n if (!Array.isArray(items)) return []\n const needle = typeof query === `string` ? query.trim().toLowerCase() : typeof query === `number` ? String(query) : ``\n const keys = Array.isArray(fields) ? fields.filter((f): f is string => typeof f === `string`) : null\n const conditions = typeof where === `object` && where !== null && !Array.isArray(where) ? Object.entries(where as Record<string, unknown>).filter(([, v]) => v !== undefined && v !== null && v !== ``) : []\n const searchable = (v: unknown) => (typeof v === `string` ? v : typeof v === `number` ? String(v) : null)\n return items.filter((item) => {\n const record = typeof item === `object` && item !== null && !Array.isArray(item) ? (item as Record<string, unknown>) : null\n for (const [field, want] of conditions) if (!valuesEqual(record?.[field], want)) return false\n if (needle === ``) return true\n const values = record ? (keys ?? Object.keys(record)).map((k) => record[k]) : [item]\n return values.some((v) => searchable(v)?.toLowerCase().includes(needle) ?? false)\n })\n}\n\n/** The core value functions (core.catalog.json `functions.core`; `set` is\n * an action, src/dynamic.ts runAction) as the renderer\n * evaluates them once the arguments are resolved: the reference every\n * client function table mirrors. `undefined` = no value. */\nexport const CORE_FUNCTIONS: Record<string, (args: Record<string, unknown>) => unknown> = {\n percent: ({ value, max }) => percent(value, max),\n add: ({ a, b }) => toNumber(a) + toNumber(b),\n sub: ({ a, b }) => toNumber(a) - toNumber(b),\n eq: ({ a, b }) => valuesEqual(a, b),\n lt: ({ a, b }) => toNumber(a) < toNumber(b),\n clamp: ({ value, min, max }) => clampNumber(value, min, max),\n cond: ({ if: test, then, else: otherwise }) => (truthy(test) ? then : otherwise),\n fallback: ({ value, default: fallback }) => (value === undefined || value === null ? fallback : value),\n concat: ({ values }) => (Array.isArray(values) ? values.map((v) => (v === undefined || v === null ? `` : String(v))).join(``) : ``),\n coalesce: ({ values }) => (Array.isArray(values) ? values.find(truthy) : undefined),\n text: ({ value }) => (value === undefined || value === null ? undefined : String(value)),\n map: ({ value, cases, default: fallback }) => {\n const key = value === undefined || value === null ? `` : String(value)\n const table = (cases ?? {}) as Record<string, unknown>\n return Object.prototype.hasOwnProperty.call(table, key) ? table[key] : fallback\n },\n len: ({ value }) => (Array.isArray(value) ? value.length : typeof value === `string` ? value.length : 0),\n fill: ({ template, params }) => fillTemplate(template, params),\n filter: ({ items, query, fields, where }) => filterItems(items, query, fields, where),\n // Round 2 (docs/round-2-contract.md §3): the two core format functions, here\n // through the English fallback; a renderer runs them (and the basic\n // format* ones) through the surface's Formatter (src/dynamic.ts).\n formatPercent: ENGLISH_FORMAT_FUNCTIONS.formatPercent,\n formatRelativeTime: ENGLISH_FORMAT_FUNCTIONS.formatRelativeTime,\n}\nexport const CORE_FUNCTION_NAMES: readonly string[] = Object.keys(CORE_FUNCTIONS)\n",
9
+ "// VAPP-103: the input limits (catalog/limits.json), one place for the TS\n// reference and the generated constants of every target. Past a limit the\n// core reports an issue and does no work.\n\nimport limitsJson from \"../catalog/limits.json\" with { type: \"json\" }\n\nexport const LIMITS: Readonly<Record<string, number>> = Object.fromEntries(Object.entries(limitsJson).filter(([k]) => !k.startsWith(`$`))) as Record<string, number>\n/** Nodes the reducer places in one surface's tree (template nodes included). */\nexport const MAX_COMPONENTS: number = limitsJson.maxComponents\n/** Component nesting levels (the root = 1). */\nexport const MAX_DEPTH: number = limitsJson.maxDepth\n/** One server message as UTF-8 JSON. */\nexport const MAX_MESSAGE_BYTES: number = limitsJson.maxMessageBytes\n/** Template items one surface instantiates. */\nexport const MAX_TEMPLATE_ITEMS: number = limitsJson.maxTemplateItems\n/** A data pointer's length in UTF-8 bytes. */\nexport const MAX_POINTER_BYTES: number = limitsJson.maxPointerBytes\n/** A data pointer's token count. */\nexport const MAX_POINTER_SEGMENTS: number = limitsJson.maxPointerSegments\n\n/** The issue messages, byte-identical in every core. */\nexport const LIMIT_ISSUES = {\n usedTwice: `id used twice; only its first place renders`,\n depth: `nesting deeper than ${MAX_DEPTH} levels`,\n components: `surface: more than ${MAX_COMPONENTS} components; the rest is dropped`,\n templateItems: `template: more than ${MAX_TEMPLATE_ITEMS} items; the rest is not rendered`,\n messageBytes: `message larger than ${MAX_MESSAGE_BYTES} bytes`,\n} as const\n",
10
+ "// Round 1 (docs/round-1-contract.md §1): the BIND-TIME half of the macro\n// contract. The expander leaves a data binding `{path}` or a function call\n// `{call, args}` wherever an input was bound; a renderer resolves those\n// against its data model when it binds a node. This module is the reference\n// every renderer's resolver mirrors: JSON-pointer lookup (absolute, relative\n// to the node's data scope, or inside a literal row), the core functions plus\n// the basic catalog's logic functions, values resolved at ANY depth EXCEPT\n// inside DATA (a shape-less object prop such as Table `rows`, and anything a\n// binding returns), `$string.<id>` built-in copy through the surface's string\n// table (never inside data), the action order (evaluate everything, then\n// `set`, then the event), and the per-ROW binding of row-scoped slot cells\n// (Table). Pure.\n\nimport { sharedCatalogView, type CatalogView } from \"./catalog\"\nimport { CORE_FUNCTIONS, isBinding, isCall, isDynamic, truthy } from \"./expr\"\nimport { ENGLISH_FORMAT_FUNCTIONS, FORMAT_FUNCTION_NAMES, englishFormatter, formatFunctions, type Formatter } from \"./format\"\nimport { resolveString } from \"./strings\"\nimport type { Action, ComponentDef, ExtensionDef, PropSchema, UiNode } from \"./types\"\nimport { MAX_POINTER_BYTES, MAX_POINTER_SEGMENTS } from \"./limits\"\n\n/** Where relative paths resolve: the pointer of the current template item\n * (`/rows/3`), or the root; `item` (when the key is present) = a LITERAL\n * item that is not in the data model (a Table row of literal `rows`):\n * relative paths then read inside it, absolute ones still the data. */\nexport interface DataScope {\n base?: string\n item?: unknown\n}\n\n/** RFC 6901 unescaping of one reference token. */\nconst unescape = (token: string) => token.replace(/~1/g, `/`).replace(/~0/g, `~`)\n\n/** The absolute pointer a binding path names in a scope: `/a/b` stays,\n * `b/c` joins the scope's base, `` (empty) is the base itself. */\n/** A table's OWN entry for an agent-chosen key, never `Object.prototype`'s. */\nfunction own<T>(table: Record<string, T> | undefined, key: string): T | undefined {\n return table !== undefined && Object.prototype.hasOwnProperty.call(table, key) ? table[key] : undefined\n}\n\nexport function absolutePath(path: string, scope: DataScope = {}): string {\n if (path.startsWith(`/`)) return path\n const base = scope.base ?? ``\n if (path === ``) return base\n return `${base}/${path}`\n}\n\n/** True when relative paths of this scope read a literal item. */\nexport function hasItem(scope: DataScope | undefined): boolean {\n return scope !== undefined && Object.prototype.hasOwnProperty.call(scope, `item`)\n}\n\n/** The value a binding path names in a scope: inside the literal item for a\n * relative path under an item scope, else at its absolute pointer. */\nexport function readPath(data: unknown, path: string, scope: DataScope = {}): unknown {\n if (!path.startsWith(`/`) && hasItem(scope)) return path === `` ? scope.item : readPointer(scope.item, `/${path}`)\n return readPointer(data, absolutePath(path, scope))\n}\n\n/** The value at an absolute pointer; undefined when any step is missing.\n * `` and `/` = the whole model (as `writeTokens` writes it); only OWN\n * keys and real indices are read (`/constructor` names nothing). */\nexport function readPointer(data: unknown, pointer: string): unknown {\n if (pointer === `` || pointer === `/`) return data\n let cur: unknown = data\n // VAPP-107 (property-tested): a pointer without its leading slash reads\n // the same tokens it writes (`writeTokens`, the Rust core's\n // `pointer_tokens`), not an empty first token.\n for (const raw of (pointer.startsWith(`/`) ? pointer.slice(1) : pointer).split(`/`)) {\n if (cur === undefined || cur === null || typeof cur !== `object`) return undefined\n const token = unescape(raw)\n if (Array.isArray(cur)) cur = /^[0-9]+$/.test(token) ? cur[Number(token)] : undefined\n else cur = Object.prototype.hasOwnProperty.call(cur, token) ? (cur as Record<string, unknown>)[token] : undefined\n }\n return cur\n}\n\n/** A pointer write: the new data model, or `error` (data unchanged). */\nexport interface PointerWrite {\n data: unknown\n error?: string\n}\n\nconst utf8Length = (text: string) => new TextEncoder().encode(text).length\n\n/** A pointer's tokens (`` and `/` = the whole model), or the limit it breaks. */\nexport function writeTokens(pointer: string): string[] | string {\n if (utf8Length(pointer) > MAX_POINTER_BYTES) return POINTER_ISSUES.bytes\n if (pointer === `` || pointer === `/`) return []\n const tokens = (pointer.startsWith(`/`) ? pointer.slice(1) : pointer).split(`/`)\n if (tokens.length > MAX_POINTER_SEGMENTS) return POINTER_ISSUES.segments\n return tokens.map(unescape)\n}\n\n/** VAPP-103: the pointer-write refusals, byte-identical in every core. */\nexport const POINTER_ISSUES = {\n bytes: `data: pointer longer than ${MAX_POINTER_BYTES} bytes`,\n segments: `data: pointer has more than ${MAX_POINTER_SEGMENTS} segments`,\n notIndex: (token: string) => `data: ${JSON.stringify(token)} is not an array index`,\n pastEnd: (token: string, length: number) => `data: index ${token} is past the end of the array (${length} items)`,\n} as const\n\n/** The index a token names in an array of `length` items: digits up to\n * `length` (`length` and `-` append), else the refusal (JSON Pointer:\n * never a gap, never a key). */\nfunction arrayIndex(token: string, length: number): number | string {\n if (token === `-`) return length\n if (!/^[0-9]+$/.test(token)) return POINTER_ISSUES.notIndex(token)\n const index = Number(token)\n return index <= length ? index : POINTER_ISSUES.pastEnd(token, length)\n}\n\nfunction setOwn(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, { value, writable: true, enumerable: true, configurable: true })\n}\n\n/** A copy of `data` with `value` written at the absolute pointer\n * (`undefined` removes). Missing containers are OBJECTS; an array takes an\n * index up to its length (`length` and `-` append). Refused (data\n * unchanged, `error` set): a pointer past `maxPointerBytes` /\n * `maxPointerSegments`, a non-index token or an index past the end of an\n * array. Iterative: any depth, no recursion. */\nexport function writePointer(data: unknown, pointer: string, value: unknown): PointerWrite {\n const tokens = writeTokens(pointer)\n if (typeof tokens === `string`) return { data, error: tokens }\n if (tokens.length === 0) return { data: value === undefined ? {} : value }\n const chain: (unknown[] | Record<string, unknown>)[] = []\n const keys: (number | string)[] = []\n let cur: unknown = data\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!\n const last = i === tokens.length - 1\n if (Array.isArray(cur)) {\n const index = arrayIndex(token, cur.length)\n if (typeof index === `string`) return { data, error: index }\n const next = [...cur]\n if (!last) cur = next[index]\n else if (value === undefined) {\n if (index < next.length) next.splice(index, 1)\n } else next[index] = value\n chain.push(next)\n keys.push(index)\n } else {\n const next: Record<string, unknown> = {}\n if (cur !== null && typeof cur === `object`) for (const [k, v] of Object.entries(cur)) setOwn(next, k, v)\n if (!last) cur = Object.prototype.hasOwnProperty.call(next, token) ? next[token] : undefined\n else if (value === undefined) delete next[token]\n else setOwn(next, token, value)\n chain.push(next)\n keys.push(token)\n }\n }\n for (let i = chain.length - 2; i >= 0; i--) {\n const parent = chain[i]!\n if (Array.isArray(parent)) parent[keys[i] as number] = chain[i + 1]\n else setOwn(parent, keys[i] as string, chain[i + 1])\n }\n return { data: chain[0] }\n}\n\n/** The basic catalog's logic functions as the core evaluates them (the\n * validators and formatters are the renderers' own; they are locale work). */\nconst LOGIC_FUNCTIONS: Record<string, (args: Record<string, unknown>) => unknown> = {\n and: ({ values }) => Array.isArray(values) && values.every(truthy),\n or: ({ values }) => Array.isArray(values) && values.some(truthy),\n not: ({ value }) => !truthy(value),\n required: ({ value }) => truthy(value) && !(Array.isArray(value) && value.length === 0),\n}\n\nexport type FunctionTable = Record<string, (args: Record<string, unknown>) => unknown>\n\n/** The reference function table: the core functions + and/or/not/required\n * + (round 2) the format functions through the English fallback Formatter\n * (`formatNumber`, `formatCurrency`, `formatPercent`, `formatDate`,\n * `formatRelativeTime`, `pluralize`; ResolveOptions.formatter replaces it).\n * `set` is an action, never a value. The expander EMITS `not`/`and`/`or`\n * too, so a renderer must implement this whole table (generated as\n * `bindFunctionNames`), not just the core names. */\nexport const BIND_FUNCTIONS: FunctionTable = { ...LOGIC_FUNCTIONS, ...CORE_FUNCTIONS, ...ENGLISH_FORMAT_FUNCTIONS }\nexport const BIND_FUNCTION_NAMES: readonly string[] = Object.keys(BIND_FUNCTIONS)\n\nexport interface ResolveOptions {\n scope?: DataScope\n /** Extra functions (the host's own, the locale formatters). */\n functions?: FunctionTable\n /** The surface's built-in string table (`stringTable(overrides)`): a\n * `$string.<id>` value resolves through it. Absent = left as written. */\n strings?: Readonly<Record<string, string>>\n /** The surface's extensions: their components' prop schemas decide which\n * props are DATA (bindTree). */\n extensions?: readonly ExtensionDef[]\n /** Round 2: the surface's Formatter (SurfaceSettings.locale + timeZone);\n * the format functions run through it. Absent = the English fallback. */\n formatter?: Formatter\n /** The clock `formatRelativeTime` reads without a `now` argument. */\n now?: () => number\n}\n\nconst FORMAT_NAMES: ReadonlySet<string> = new Set(FORMAT_FUNCTION_NAMES)\nconst FORMAT_TABLES = new WeakMap<Formatter, FunctionTable>()\n\nfunction formatTable(options: ResolveOptions): FunctionTable | undefined {\n if (!options.formatter && !options.now) return undefined\n const formatter = options.formatter ?? (english ??= englishFormatter())\n if (options.now) return formatFunctions(formatter, options.now)\n let table = FORMAT_TABLES.get(formatter)\n if (!table) FORMAT_TABLES.set(formatter, (table = formatFunctions(formatter)))\n return table\n}\n\nlet english: Formatter | undefined\n\n/** A prop or style value with every binding and call resolved, at any\n * depth. An unknown function resolves to undefined. */\nexport function resolveDynamic(value: unknown, data: unknown, options: ResolveOptions = {}): unknown {\n if (isBinding(value)) return readPath(data, value.path, options.scope)\n if (isCall(value)) {\n const args: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value.args ?? {})) args[k] = resolveDynamic(v, data, options)\n // Own entries only: `{call: \"constructor\"}` is no function (VAPP-107).\n const fn = own(options.functions, value.call) ?? (FORMAT_NAMES.has(value.call) ? own(formatTable(options), value.call) : undefined) ?? own(BIND_FUNCTIONS, value.call)\n return fn ? fn(args) : undefined\n }\n if (typeof value === `string`) return options.strings ? resolveString(value, options.strings) : value\n if (Array.isArray(value)) return value.map((v) => resolveDynamic(v, data, options))\n if (typeof value === `object` && value !== null) {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n const r = resolveDynamic(v, data, options)\n if (r !== undefined) out[k] = r\n }\n return out\n }\n return value\n}\n\n/** A node's `visible`: absent = shown; else its resolved truthiness. */\nexport function isVisible(visible: unknown, data: unknown, options: ResolveOptions = {}): boolean {\n if (visible === undefined) return true\n return truthy(resolveDynamic(visible, data, options))\n}\n\nexport interface ActionOutcome {\n /** The data model after the action's `set` (unchanged without one). */\n data: unknown\n /** VAPP-103: the `set` was refused (writePointer's reason). */\n error?: string\n /** The event to dispatch, its context resolved BEFORE the write. */\n event?: { name: string; context?: Record<string, unknown> }\n /** A function other than `set` the host must run (openUrl…), args resolved. */\n call?: { call: string; args: Record<string, unknown> }\n}\n\n/** Round 4 (VAPP-103): the data an interaction's action resolves against =\n * the data model WITH the source component's OWN write applied first.\n * `own` = EXACTLY what the component wrote, by prop (an Input's `value`,\n * a Checkbox's `checked`, an overlay's `open`, a FileUpload's MERGED\n * `files`), never inferred from the event payload (an `upload` payload's\n * `added` is the new batch, the write is the whole list): each prop that\n * is a `{path}` binding is written at that path, so a `context.query`\n * bound to the path the Input writes reads the text just typed. Renderers\n * apply it before `runAction` (Rust: every write lands before\n * `Surface::fire`). */\nexport function withOwnWrites(data: unknown, props: Record<string, unknown>, own: Record<string, unknown> | undefined, scope: DataScope = {}): unknown {\n let out = data\n for (const [key, value] of Object.entries(own ?? {})) {\n const bound = props[key]\n if (!isBinding(bound)) continue\n if (!bound.path.startsWith(`/`) && hasItem(scope)) continue\n // A refused write (limits, index rules) leaves the data as it is.\n out = writePointer(out, absolutePath(bound.path, scope), value).data\n }\n return out\n}\n\n/** The overlay components (catalog group `overlay`; AlertDialog expands to\n * a non-dismissible Dialog). */\nexport const OVERLAY_COMPONENTS: readonly string[] = [`Dialog`, `Drawer`, `AlertDialog`, `Popover`, `Tooltip`, `Menu`, `Toast`]\nconst OVERLAYS: ReadonlySet<string> = new Set(OVERLAY_COMPONENTS)\n\n/** Round 4 (VAPP-103): a successful Form submit CLOSES the overlay around\n * the form (the author never resets the bound `open` flag). The NEAREST\n * enclosing overlay of ANY kind decides: it closes only when it is a\n * Dialog or Drawer that is dismissible (`dismissible: false` — an\n * AlertDialog — never auto-closes); a nearest Popover, Menu, Tooltip or\n * Toast closes nothing, nor does anything around it. The id of that\n * overlay in the EXPANDED tree, null when nothing closes. Renderers close\n * it like a dismiss (`open` false written through, `change {open:\n * false}`) right after the form's `submit`. */\nexport function submitClosesOverlay(root: UiNode, formId: string): string | null {\n const walk = (n: UiNode, overlay: UiNode | null): UiNode | null | undefined => {\n const here = OVERLAYS.has(n.component) && n.id !== formId ? n : overlay\n if (n.id === formId && n.component === `Form`) return here\n for (const slot of Object.values(n.slots ?? {})) {\n const hit = walk(slot, here)\n if (hit !== undefined) return hit\n }\n for (const child of n.children) {\n const hit = walk(child, here)\n if (hit !== undefined) return hit\n }\n return undefined\n }\n const nearest = walk(root, null)\n if (!nearest || (nearest.component !== `Dialog` && nearest.component !== `Drawer`) || nearest.props.dismissible === false) return null\n return nearest.id\n}\n\n/** What a press does: resolve the function args and the event context\n * against the data AS IT IS (after `withOwnWrites`), then apply `set`, then\n * hand back the event. */\nexport function runAction(action: Action, data: unknown, options: ResolveOptions = {}): ActionOutcome {\n const out: ActionOutcome = { data }\n const event = action.event\n ? { name: action.event.name, ...(action.event.context ? { context: resolveDynamic(action.event.context, data, options) as Record<string, unknown> } : {}) }\n : undefined\n // A2UI's `functionCall`.\n const fn = action.functionCall\n if (fn) {\n const args = resolveDynamic(fn.args ?? {}, data, options) as Record<string, unknown>\n if (fn.call === `set`) {\n // A relative path under a literal-item scope names no data: no write.\n if (typeof args.path === `string` && (args.path.startsWith(`/`) || !hasItem(options.scope))) {\n const pointer = absolutePath(args.path, options.scope)\n // No value: the key exists without one, which JSON drops (the\n // containers on the way are still created).\n const written = writePointer(data, pointer, args.value === undefined ? null : args.value)\n const final = args.value === undefined && !written.error ? writePointer(written.data, pointer, undefined) : written\n out.data = final.data\n if (final.error) out.error = final.error\n }\n } else out.call = { call: fn.call, args }\n }\n if (event) out.event = event\n return out\n}\n\n/** A DATA schema: a shape-less `object` (any object) or an array of them —\n * Table `rows` in the core catalog. A literal value there is the author's\n * data, copied verbatim: no binding, call or `$string.<id>` inside it is\n * interpreted (a row `{path: \"/etc/hosts\"}` is a row). A dynamic value AT\n * the position still resolves (and its result is never descended). */\nexport function isDataSchema(schema: PropSchema | undefined): boolean {\n if (!schema) return false\n if (schema.type === `object`) return schema.shape === undefined\n if (schema.type === `array`) return schema.items !== undefined && isDataSchema(schema.items)\n return false\n}\n\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === `object` && v !== null && !Array.isArray(v)\n\n/** One prop value resolved along its schema: dynamic → resolved, DATA\n * literal → verbatim, arrays and shaped objects → per item / property,\n * anything else → `resolveDynamic` (any depth). */\nexport function resolveProp(value: unknown, schema: PropSchema | undefined, data: unknown, options: ResolveOptions = {}, defs: Record<string, { properties: Record<string, PropSchema> }> = {}): unknown {\n if (isDynamic(value)) return resolveDynamic(value, data, options)\n if (isDataSchema(schema)) return value\n if (schema?.type === `array` && schema.items && Array.isArray(value)) return value.map((item) => resolveProp(item, schema.items, data, options, defs))\n const shape = schema?.type === `object` && schema.shape ? defs[schema.shape] : undefined\n if (shape && isObj(value)) {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n const r = resolveProp(v, shape.properties[k], data, options, defs)\n if (r !== undefined) out[k] = r\n }\n return out\n }\n return resolveDynamic(value, data, options)\n}\n\n/** A node's props resolved along its component's schema (an unknown\n * component's props resolve at any depth). */\nexport function resolveNodeProps(def: ComponentDef | undefined, props: Record<string, unknown>, data: unknown, options: ResolveOptions = {}, defs: Record<string, { properties: Record<string, PropSchema> }> = {}): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(props)) {\n const r = resolveProp(v, def?.props[k], data, options, defs)\n if (r !== undefined) out[k] = r\n }\n return out\n}\n\n/** True when the component's slots are ROW-SCOPED (catalog `slotScope:\n * \"row\"`, Table): each slot is a cell template the painter binds once per\n * row (`bindRowSlot`), never against the surface. */\nexport function hasRowSlots(def: ComponentDef | undefined): boolean {\n return def?.slotScope === `row`\n}\n\n/** The scope row `index` of a row-scoped component binds its slot cells in.\n * `rowsProp` = the UNBOUND `rows` value: a binding → `{base: <its pointer>/\n * <index>}` (relative paths read the row in the data model and `set` writes\n * into it); a literal or a call → `{item: rows[index]}` (relative paths read\n * inside the row; a relative `set` writes nothing). `index` = the row's index\n * in `rows` as given, before any local sort. */\nexport function rowScope(rowsProp: unknown, rows: readonly unknown[], index: number, scope: DataScope = {}): DataScope {\n if (isBinding(rowsProp)) return { base: `${absolutePath(rowsProp.path, scope)}/${index}` }\n return { ...(scope.base !== undefined ? { base: scope.base } : {}), item: rows[index] }\n}\n\n/** A row-scoped slot cell bound for row `index` (see `rowScope`). */\nexport function bindRowSlot(slot: UiNode, rowsProp: unknown, rows: readonly unknown[], index: number, data: unknown, options: ResolveOptions = {}): UiNode | null {\n return bindTree(slot, data, { ...options, scope: rowScope(rowsProp, rows, index, options.scope) })\n}\n\n/** Round 2 (docs/round-2-contract.md §4): the scope a List's `section`\n * header binds in — a LITERAL item `{value, count, index}` (relative paths\n * read it: `{path: \"value\"}`; absolute ones the surface data). */\nexport function sectionScope(section: { value: string; count: number }, index: number, scope: DataScope = {}): DataScope {\n return { ...(scope.base !== undefined ? { base: scope.base } : {}), item: { value: section.value, count: section.count, index } }\n}\n\n/** A List `section` header bound for section `index` (see `sectionScope`). */\nexport function bindSectionHeader(slot: UiNode, section: { value: string; count: number }, index: number, data: unknown, options: ResolveOptions = {}): UiNode | null {\n return bindTree(slot, data, { ...options, scope: sectionScope(section, index, options.scope) })\n}\n\n/** The BIND pass a renderer runs over an expanded tree for one data model:\n * every prop resolved along its schema (`resolveNodeProps`: DATA props\n * verbatim), every style value, recipe prop and `accessibility` value\n * resolved (`resolveDynamic`), a node whose `visible` resolves falsy dropped\n * with its subtree, `visible` itself removed. Actions stay unresolved (they\n * evaluate at press time, `runAction`); a `template` and the slots of a\n * ROW-SCOPED component (Table cells) stay UNBOUND — the painter binds them\n * per item / per row (`bindRowSlot`). fixtures/bind-time.json locks it. Pure. */\nconst viewFor = (extensions?: readonly ExtensionDef[]): CatalogView => sharedCatalogView(extensions)\n\nexport function bindTree(node: UiNode, data: unknown, options: ResolveOptions = {}): UiNode | null {\n const view = viewFor(options.extensions)\n const walk = (n: UiNode): UiNode | null => {\n if (!isVisible(n.visible, data, options)) return null\n const def = view.components[n.component]\n const out: UiNode = { id: n.id, component: n.component, props: resolveNodeProps(def, n.props, data, options, view.defs), children: [] }\n if (n.style) out.style = resolveDynamic(n.style, data, options) as Record<string, unknown>\n if (n.on) out.on = n.on\n if (n.accessibility) {\n const a11y = resolveDynamic(n.accessibility, data, options) as Record<string, unknown>\n if (Object.keys(a11y).length > 0) out.accessibility = a11y\n }\n for (const child of n.children) {\n const bound = walk(child)\n if (bound) out.children.push(bound)\n }\n if (n.slots) {\n if (hasRowSlots(def)) out.slots = n.slots\n else\n for (const [slot, child] of Object.entries(n.slots)) {\n const bound = walk(child)\n if (bound) (out.slots ??= {})[slot] = bound\n }\n }\n if (n.template) out.template = n.template\n if (n.recipe) out.recipe = { ...n.recipe, props: resolveDynamic(n.recipe.props, data, options) as Record<string, unknown> }\n return out\n }\n return walk(node)\n}\n",
11
+ "// Round 3 (VAPP-102, docs/round-3-contract.md §2): the tree connector rule\n// the CORE computes for nested rows. `treeGuides(depths)` is the ×4 rule of\n// the app (`packages/ui/src/tree-guides.ts`, desktop `domain::tree_guides`,\n// iOS `TreeGuides.swift`, Android `TreeGuides.kt`), copied verbatim so a\n// Section of Rows connects like a session tree or a PR stack. `applyTreeGuides`\n// is the ONE post-expansion pass (the end of `expandMacros`; the Rust core\n// mirrors it in `tree_guides.rs`): over every node's children in order, each\n// Row root contributes its numeric `recipe.props.depth` (anything else counts\n// as 0 and ends every subtree), and the rule fills the Row's `guides` part (a\n// TreeGuides native) with `elbowAt` / `tee` / `passThrough`. Locked by\n// `fixtures/tree-guides.json` and the Row cases of `catalog-macros.json`.\n\nimport type { UiNode } from \"./types\"\n\n/** Guide geometry for ONE row, in gutter LEVELS (not pixels). */\nexport interface TreeGuide {\n /** The gutter level the elbow sits in (`depth - 1`); `null` for a root. */\n elbowAt: number | null\n /** The elbow's vertical continues past the centre: a later sibling follows. */\n tee: boolean\n /** Ancestor gutter levels carrying a straight full-height line, ascending. */\n passThrough: number[]\n}\n\n/** Whether the subtree hanging off gutter `level` continues AFTER row `index`:\n * another row at depth `level + 1` follows before the walk leaves that\n * subtree (a row at depth `≤ level`). */\nfunction continuesAfter(depths: readonly number[], index: number, level: number): boolean {\n for (let at = index + 1; at < depths.length; at += 1) {\n const depth = depths[at]!\n if (depth <= level) return false\n if (depth === level + 1) return true\n }\n return false\n}\n\n/** The guides for a flat list of VISIBLE rows, given their depths. */\nexport function treeGuides(depths: readonly number[]): TreeGuide[] {\n return depths.map((depth, index) => {\n if (depth <= 0) return { elbowAt: null, tee: false, passThrough: [] }\n const passThrough: number[] = []\n for (let level = 0; level <= depth - 2; level += 1) {\n if (continuesAfter(depths, index, level)) passThrough.push(level)\n }\n return { elbowAt: depth - 1, tee: continuesAfter(depths, index, depth - 1), passThrough }\n })\n}\n\n/** The expanded root of a `Row` macro. */\nexport function isRowRoot(node: UiNode): boolean {\n return node.recipe?.macro === `Row` && node.recipe.part === `root`\n}\n\n/** A sibling's depth: a Row root's recipe prop, else any node's own numeric\n * `depth` prop (an extension row such as SessionRow or PrRow), when a finite\n * number > 0, else 0 (a bound depth cannot be computed against its siblings). */\nfunction siblingDepth(node: UiNode): number {\n const depth = isRowRoot(node) ? node.recipe?.props.depth : node.props.depth\n return typeof depth === `number` && Number.isFinite(depth) && depth > 0 ? Math.floor(depth) : 0\n}\n\n/** A non-Row sibling that takes part: its own numeric `depth` prop (> 0). */\nfunction hasDepth(node: UiNode): boolean {\n return !isRowRoot(node) && node.component !== `TreeGuides` && typeof node.props.depth === `number`\n}\n\n/** The filled guide as props: `{depth, elbowAt?, tee, passThrough}`. */\nfunction guideProps(depth: number, g: TreeGuide): Record<string, unknown> {\n const props: Record<string, unknown> = { depth }\n if (g.elbowAt !== null) props.elbowAt = g.elbowAt\n props.tee = g.tee\n props.passThrough = g.passThrough\n return props\n}\n\n/** Fill the guides of ONE sibling list (a node's children, or a lone root /\n * slot value). A Row root's `guides` part takes the props; any other node\n * with a numeric `depth` gets them as its `guide` prop (`elbowAt?`, `tee`,\n * `passThrough`), which an extension painter draws. */\nfunction fillSiblings(nodes: UiNode[]): void {\n const depths = nodes.map(siblingDepth)\n const guides = treeGuides(depths)\n nodes.forEach((node, i) => {\n const g = guides[i]!\n if (isRowRoot(node)) {\n const part = guidesPart(node)\n if (part) part.props = guideProps(depths[i]!, g)\n } else if (hasDepth(node)) {\n const { depth: _d, ...guide } = guideProps(depths[i]!, g)\n node.props = { ...node.props, guide }\n }\n })\n}\n\n/** The Row's `guides` part, when its depth emitted one. */\nfunction guidesPart(row: UiNode): UiNode | undefined {\n return row.children.find((c) => c.component === `TreeGuides` && c.recipe?.part === `guides`)\n}\n\n/** Fill every Row's guides from the rows around it. Mutates `root` in place\n * (the expander hands it a fresh tree); returns it for chaining. */\nexport function applyTreeGuides(root: UiNode): UiNode {\n const visit = (node: UiNode) => {\n fillSiblings(node.children)\n for (const slot of Object.values(node.slots ?? {})) {\n // A slot value has no siblings: a lone row is a root.\n fillSiblings([slot])\n visit(slot)\n }\n node.children.forEach(visit)\n }\n fillSiblings([root])\n visit(root)\n return root\n}\n",
12
+ "// VAPP-85: the macro expander — applies catalog/macros.json (plus extension\n// macros) to a normalized tree until every node is native. The rules are in\n// the table's `$comment`; fixtures/catalog-macros.json locks the output and\n// the Rust core replays the same table.\n//\n// Round 1 (docs/round-1-contract.md): a `$if`/`$any` that cannot be decided\n// at expansion time (a bound input) emits the part WITH `visible` = the\n// bound condition; `\"$slot:name\"` children splice an author slot in place\n// and a template `slots` entry may be a template node; a RESPONSIVE prop\n// (`{base, sm?, md?…}`) is expanded per breakpoint into `@media (min-width:\n// $breakpoint.<bp>)` blocks on every part whose style it changes; a `$set`\n// on a part whose macro prop is BOUND adds the `set` write-back to that\n// part's action (two-way binding without a host round trip); a part's\n// `$a11y` becomes the node's `accessibility` (role, states, name: §6).\n\nimport { TOKEN_GROUPS, sharedCatalogView } from \"./catalog\"\nimport { applyTreeGuides } from \"./tree-guides\"\nimport type { CatalogView } from \"./catalog\"\nimport { evalConditionValue, evalValue, isBinding, isDynamic, truthy, type ExprContext } from \"./expr\"\nimport type { Action, ExtensionDef, MacroChild, MacroDef, MacroTemplate, ReduceIssue, UiNode, Visible } from \"./types\"\n\nconst MAX_DEPTH = 16\n/** The breakpoint names in ascending order (tokens.json). */\nexport const BREAKPOINTS: readonly string[] = TOKEN_GROUPS.breakpoint\n\ninterface Variant {\n breakpoint: string\n props: Record<string, unknown>\n}\n\ninterface Expansion {\n view: CatalogView\n macro: string\n def: MacroDef\n source: UiNode\n /** The author's props with every responsive value at its `base`. */\n baseProps: Record<string, unknown>\n /** One per breakpoint a responsive prop names, ascending. */\n variants: Variant[]\n claimed: Set<string>\n /** Where expansion problems go (the reducer's issue list), if anyone listens. */\n issues?: ReduceIssue[]\n}\n\nfunction clone<T>(value: T): T {\n return value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T)\n}\n\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === `object` && v !== null && !Array.isArray(v)\n\n/** `{base, sm?, md?, lg?, xl?}`: an object with `base` and only breakpoint\n * keys besides. */\nexport function isResponsiveValue(value: unknown): value is Record<string, unknown> & { base: unknown } {\n if (!isObj(value) || !(`base` in value)) return false\n return Object.keys(value).every((k) => k === `base` || BREAKPOINTS.includes(k))\n}\n\n/** The value a responsive prop takes at a breakpoint: the nearest defined\n * key at or below it, `base` under the first one. `null` = the base. */\nexport function responsiveAt(value: Record<string, unknown> & { base: unknown }, breakpoint: string | null): unknown {\n let out = value.base\n if (breakpoint === null) return out\n for (const bp of BREAKPOINTS) {\n if (bp in value) out = value[bp]\n if (bp === breakpoint) break\n }\n return out\n}\n\n/** The author's props with every responsive object replaced by its value at\n * `breakpoint`. */\nexport function propsAt(props: Record<string, unknown>, breakpoint: string | null): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(props)) out[k] = isResponsiveValue(v) ? responsiveAt(v, breakpoint) : v\n return out\n}\n\nfunction responsiveVariants(props: Record<string, unknown>): Variant[] {\n const used = new Set<string>()\n for (const v of Object.values(props)) if (isResponsiveValue(v)) for (const k of Object.keys(v)) if (k !== `base`) used.add(k)\n return BREAKPOINTS.filter((bp) => used.has(bp)).map((bp) => ({ breakpoint: bp, props: propsAt(props, bp) }))\n}\n\nfunction mergeStyle(\n base: Record<string, unknown> | undefined,\n over: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !over) return undefined\n const out: Record<string, unknown> = { ...(base ?? {}) }\n for (const [k, v] of Object.entries(over ?? {})) {\n const nested = typeof v === `object` && v !== null && !Array.isArray(v)\n out[k] = nested\n ? { ...((out[k] as Record<string, unknown>) ?? {}), ...(v as Record<string, unknown>) }\n : v\n }\n return out\n}\n\nfunction routedAction(\n action: Action,\n context: Record<string, unknown> | undefined\n): Action {\n const out = clone(action)\n if (context && out.event) {\n out.event.context = { ...(out.event.context ?? {}), ...context }\n }\n return out\n}\n\n/** The macro's recipe discriminators: the author's value, else the prop's\n * catalog default, so a theme always sees a concrete value. */\nfunction recipeProps(exp: Expansion, ctx: ExprContext, extra: unknown): Record<string, unknown> {\n const props: Record<string, unknown> = {}\n const schema = exp.view.components[exp.macro]?.props ?? {}\n for (const name of exp.def.recipeProps) {\n const value = exp.baseProps[name] ?? schema[name]?.default\n if (value !== undefined) props[name] = value\n }\n if (extra) {\n const evaluated = evalValue(extra, ctx) as Record<string, unknown>\n for (const [k, v] of Object.entries(evaluated)) props[k] = v\n }\n return props\n}\n\nfunction andOf(conditions: unknown[], op: `and` | `or`): Visible {\n if (conditions.length === 1) return conditions[0] as Visible\n return { call: op, args: { values: conditions } }\n}\n\n/** The part's `$if`/`$any`: `false` = leave it out, `true` = emit it, a\n * dynamic value = emit it with that as `visible`. */\nfunction decideConditions(tpl: MacroTemplate, ctx: ExprContext): boolean | Visible {\n const bound: unknown[] = []\n if (tpl.$if !== undefined) {\n const conds = Array.isArray(tpl.$if) ? tpl.$if : [tpl.$if]\n for (const c of conds) {\n const r = evalConditionValue(c, ctx)\n if (r === false) return false\n if (r !== true) bound.push(r)\n }\n }\n if (tpl.$any !== undefined) {\n let decided = false\n const any: unknown[] = []\n for (const c of tpl.$any) {\n const r = evalConditionValue(c, ctx)\n if (r === true) {\n decided = true\n break\n }\n if (r !== false) any.push(r)\n }\n if (!decided) {\n if (any.length === 0) return false\n bound.push(andOf(any, `or`))\n }\n }\n return bound.length === 0 ? true : andOf(bound, `and`)\n}\n\nfunction expandTemplate(\n tpl: MacroTemplate,\n exp: Expansion,\n ctx: ExprContext,\n parentId: string\n): UiNode[] {\n const decided = decideConditions(tpl, ctx)\n if (decided === false) return []\n const visible = decided === true ? undefined : decided\n if (tpl.$each !== undefined) {\n const items = evalValue(`{${tpl.$each}}`, ctx)\n if (!Array.isArray(items)) return []\n const as = tpl.$as ?? `item`\n return items.map((item, index) =>\n buildNode(tpl, exp, { ...ctx, vars: { ...ctx.vars, [as]: item, index } }, `${parentId}.${tpl.part}.${index}`, visible)\n )\n }\n const id = tpl.part === `root` ? exp.source.id : `${parentId}.${tpl.part}`\n return [buildNode(tpl, exp, ctx, id, visible)]\n}\n\nconst canon = (v: unknown) => JSON.stringify(v)\n\n/** The part's style: evaluated with the base props, then once per\n * breakpoint variant; every key a variant changes lands in its media block. */\nfunction partStyle(tpl: MacroTemplate, exp: Expansion, ctx: ExprContext): Record<string, unknown> | undefined {\n if (!tpl.style) return undefined\n const style = evalValue(tpl.style, ctx) as Record<string, unknown>\n let previous = style\n for (const variant of exp.variants) {\n const at = evalValue(tpl.style, { ...ctx, props: variant.props }) as Record<string, unknown>\n const diff: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(at)) if (!k.startsWith(`@`) && !k.startsWith(`:`) && canon(previous[k]) !== canon(v)) diff[k] = v\n if (Object.keys(diff).length > 0) {\n const key = `@media (min-width: $breakpoint.${variant.breakpoint})`\n style[key] = { ...((style[key] as Record<string, unknown>) ?? {}), ...diff }\n }\n previous = at\n }\n return Object.keys(style).length > 0 ? style : undefined\n}\n\nfunction buildNode(\n tpl: MacroTemplate,\n exp: Expansion,\n ctx: ExprContext,\n id: string,\n visible: Visible | undefined\n): UiNode {\n const props = (evalValue(tpl.props ?? {}, ctx) as Record<string, unknown>) ?? {}\n const style = partStyle(tpl, exp, ctx)\n const node: UiNode = { id, component: tpl.component, props, children: [] }\n if (style) node.style = style\n if (visible !== undefined) node.visible = visible\n node.recipe = { macro: exp.macro, part: tpl.part, props: recipeProps(exp, ctx, tpl.$recipe) }\n if (tpl.$on) {\n const on: Record<string, Action> = {}\n for (const [partEvent, macroEvent] of Object.entries(tpl.$on)) {\n const action = exp.source.on?.[macroEvent]\n if (!action) continue\n exp.claimed.add(macroEvent)\n const context = tpl.$context\n ? (evalValue(tpl.$context, ctx) as Record<string, unknown>)\n : undefined\n on[partEvent] = routedAction(action, context)\n }\n if (Object.keys(on).length > 0) node.on = on\n }\n if (tpl.$set) {\n for (const [partEvent, spec] of Object.entries(tpl.$set)) {\n const bound = exp.baseProps[spec.prop]\n if (!isBinding(bound)) continue\n const on = (node.on ??= {})\n if (on[partEvent]?.functionCall) {\n // An Action carries ONE `functionCall`: the author's routed function call\n // wins and the bound prop is not written back (reported, never lost\n // silently). Route an `event` to keep the two-way write.\n const macroEvent = tpl.$on?.[partEvent] ?? partEvent\n const message = `on.${macroEvent}: a function action replaces the two-way set of props.${spec.prop}; write it in that function's handler or use an event`\n if (!exp.issues?.some((i) => i.id === exp.source.id && i.message === message)) exp.issues?.push({ id: exp.source.id, message })\n continue\n }\n const value = evalValue(spec.value, ctx)\n on[partEvent] = { ...(on[partEvent] ?? {}), functionCall: { call: `set`, args: value === undefined ? { path: bound.path } : { path: bound.path, value } } }\n }\n }\n if (tpl.$a11y) {\n const a11y = evalValue(tpl.$a11y, ctx) as Record<string, unknown>\n if (Object.keys(a11y).length > 0) node.accessibility = a11y\n }\n if (tpl.slots) {\n for (const [slot, ref] of Object.entries(tpl.slots)) {\n if (typeof ref === `string`) {\n const name = ref.startsWith(`$slot:`) ? ref.slice(6) : null\n const value = name ? exp.source.slots?.[name] : undefined\n if (value) (node.slots ??= {})[slot] = value\n continue\n }\n const [built] = expandTemplate(ref, exp, ctx, id)\n if (built) (node.slots ??= {})[slot] = built\n }\n }\n for (const child of tpl.children ?? []) {\n if (child === `$children`) {\n node.children.push(...exp.source.children)\n if (exp.source.template) node.template = exp.source.template\n continue\n }\n if (typeof child === `string`) {\n if (child.startsWith(`$slot:`)) {\n const value = exp.source.slots?.[child.slice(6)]\n if (value) node.children.push(value)\n }\n continue\n }\n node.children.push(...expandTemplate(child as MacroTemplate, exp, ctx, id))\n }\n return node\n}\n\n/** Expand one macro node (children already native) into its template. */\nfunction expandMacro(node: UiNode, macro: string, def: MacroDef, view: CatalogView, depth: number, issues?: ReduceIssue[]): UiNode {\n if (depth > MAX_DEPTH) throw new Error(`macro ${macro}: expansion deeper than ${MAX_DEPTH}`)\n const baseProps = propsAt(node.props, null)\n // Round 3: an `on.press` implies `pressable` on a macro that offers it (Row, Chip).\n if (node.on?.press && baseProps.pressable === undefined && view.components[macro]?.props.pressable) baseProps.pressable = true\n const exp: Expansion = { view, macro, def, source: node, baseProps, variants: responsiveVariants(node.props), claimed: new Set(), issues }\n const ctx: ExprContext = { id: node.id, props: baseProps, vars: {} }\n const [root] = expandTemplate(def.root, exp, ctx, node.id)\n root.style = mergeStyle(root.style, node.style)\n if (root.style && Object.keys(root.style).length === 0) delete root.style\n if (node.visible !== undefined) root.visible = node.visible\n // The author's label/description (or an outer macro part's $a11y) win\n // over the root part's own.\n if (node.accessibility) root.accessibility = { ...(root.accessibility ?? {}), ...node.accessibility }\n const remaining: Record<string, Action> = { ...(root.on ?? {}) }\n for (const [event, action] of Object.entries(node.on ?? {})) {\n if (!exp.claimed.has(event)) remaining[event] = action\n }\n if (Object.keys(remaining).length > 0) root.on = remaining\n else delete root.on\n return expandTree(root, view, depth + 1, issues)\n}\n\nfunction expandTree(node: UiNode, view: CatalogView, depth: number, issues?: ReduceIssue[]): UiNode {\n const out: UiNode = { ...node, children: node.children.map((c) => expandTree(c, view, depth, issues)) }\n if (node.slots) {\n out.slots = {}\n for (const [slot, child] of Object.entries(node.slots)) out.slots[slot] = expandTree(child, view, depth, issues)\n }\n const def = view.macros[out.component]\n if (def && view.components[out.component]?.kind === `macro`) {\n return expandMacro(out, out.component, def, view, depth, issues)\n }\n return out\n}\n\n/** The normalized tree with every macro (core + extensions) expanded into\n * natives, recipes attached. Pure: the input is not mutated; expansion\n * problems (an author function that replaces a `$set` write) are pushed to\n * `options.issues` when given. */\nexport function expandMacros(\n root: UiNode,\n options: { extensions?: readonly ExtensionDef[]; issues?: ReduceIssue[] } = {}\n): UiNode {\n // Round 3: the tree guides of nested Rows come from their siblings, so\n // they are filled AFTER the whole tree is native (src/tree-guides.ts).\n return applyTreeGuides(expandTree(clone(root), sharedCatalogView(options.extensions), 0, options.issues))\n}\n\n/** True for a value the expander would keep (see expr.ts). */\nexport const keeps = truthy\nexport { isDynamic }\nexport type { MacroChild }\n",
13
+ "// VAPP-85: props validation against a component definition — the catalog's\n// own mini schema (types.ts PropSchema), so the reducer, the fixtures and the\n// generator agree without a JSON Schema engine. core.schema.json is the same\n// rules for external consumers.\n\nimport { FUNCTION_NAMES, ICON_NAMES } from \"./catalog.generated\"\nimport { isKnownToken, parseTokenRef, sharedCatalogView } from \"./catalog\"\nimport { isCall, isDynamic } from \"./expr\"\nimport { isDataSchema } from \"./dynamic\"\nimport { BREAKPOINTS, isResponsiveValue } from \"./macros\"\nimport { isStringRef, parseStringRef } from \"./strings\"\nimport { validateStyle } from \"./style\"\nimport type { CatalogView } from \"./catalog\"\nimport type { ComponentDef, ExtensionDef, PropSchema } from \"./types\"\n\nconst ICONS: ReadonlySet<string> = new Set(ICON_NAMES)\nconst viewOf = (extensions?: readonly ExtensionDef[]): CatalogView => sharedCatalogView(extensions)\nconst FUNCTIONS: ReadonlySet<string> = new Set(FUNCTION_NAMES)\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/\n\nexport interface PropIssue {\n path: string\n message: string\n}\n\nexport { isDynamic }\n\nfunction checkScalar(\n schema: PropSchema,\n value: unknown,\n path: string,\n view: CatalogView,\n issues: PropIssue[]\n): void {\n switch (schema.type) {\n case `string`:\n case `markdown`:\n case `url`:\n if (typeof value !== `string`) issues.push({ path, message: `expected a string` })\n else if (parseStringRef(value) !== null && !isStringRef(value))\n issues.push({ path, message: `unknown built-in string ${value} (catalog/strings.json)` })\n return\n case `date`:\n if (typeof value !== `string` || (value !== `` && !ISO_DATE.test(value)))\n issues.push({ path, message: `expected yyyy-mm-dd` })\n return\n case `number`:\n if (typeof value !== `number` || !Number.isFinite(value))\n issues.push({ path, message: `expected a number` })\n else if (schema.minimum !== undefined && value < schema.minimum) issues.push({ path, message: `expected at least ${schema.minimum}` })\n else if (schema.maximum !== undefined && value > schema.maximum) issues.push({ path, message: `expected at most ${schema.maximum}` })\n return\n case `boolean`:\n if (typeof value !== `boolean`) issues.push({ path, message: `expected a boolean` })\n return\n case `enum`: {\n const values = schema.values ?? (schema.enum ? view.enums[schema.enum] : undefined)\n if (!values) issues.push({ path, message: `enum ${schema.enum} is not defined` })\n else if (!values.includes(value as string))\n issues.push({ path, message: `expected one of ${values.join(`|`)}` })\n return\n }\n case `icon`:\n if (typeof value !== `string` || !ICONS.has(value))\n issues.push({ path, message: `not an icons.json name` })\n return\n case `color`:\n // Round 4 (VAPP-103): a node's colour is a TOKEN, never a literal, so\n // the theme's light and dark modes both apply (themes keep literals).\n if (isKnownToken(value) && parseTokenRef(value)?.group === `color`) return\n issues.push({ path, message: `expected $color.<name>` })\n return\n case `style`:\n for (const issue of validateStyle(value, { path, root: false }))\n issues.push(issue)\n return\n case `array`:\n if (!Array.isArray(value)) {\n issues.push({ path, message: `expected an array` })\n return\n }\n if (schema.items)\n value.forEach((item, i) => checkValue(schema.items!, item, `${path}[${i}]`, view, issues))\n return\n case `object`: {\n if (typeof value !== `object` || value === null || Array.isArray(value)) {\n issues.push({ path, message: `expected an object` })\n return\n }\n if (!schema.shape) return\n const def = view.defs[schema.shape]\n if (!def) {\n issues.push({ path, message: `shape ${schema.shape} is not defined` })\n return\n }\n checkProps(def.properties, value as Record<string, unknown>, path, view, issues)\n return\n }\n }\n}\n\nfunction checkValue(\n schema: PropSchema,\n value: unknown,\n path: string,\n view: CatalogView,\n issues: PropIssue[]\n): void {\n if (schema.bindable && isDynamic(value)) return\n if (schema.responsive && isResponsiveValue(value)) {\n for (const [bp, v] of Object.entries(value)) checkScalar(schema, v, `${path}.${bp}`, view, issues)\n return\n }\n if (schema.responsive && typeof value === `object` && value !== null && !Array.isArray(value) && !isDynamic(value)) {\n issues.push({ path, message: `a responsive value needs base and only ${BREAKPOINTS.join(`|`)} besides` })\n return\n }\n checkScalar(schema, value, path, view, issues)\n}\n\nfunction checkProps(\n schemas: Record<string, PropSchema>,\n props: Record<string, unknown>,\n path: string,\n view: CatalogView,\n issues: PropIssue[]\n): void {\n for (const [name, schema] of Object.entries(schemas)) {\n const value = props[name]\n if (value === undefined || value === null) {\n if (schema.required) issues.push({ path: `${path}.${name}`, message: `required` })\n continue\n }\n checkValue(schema, value, `${path}.${name}`, view, issues)\n }\n for (const name of Object.keys(props)) {\n if (!(name in schemas)) issues.push({ path: `${path}.${name}`, message: `unknown prop` })\n }\n}\n\n/** A function name a surface may call: a catalog function, or a HOST\n * function, which is always namespaced (`app.toast`, `harness.openIssue`). */\nexport function isCallableName(name: string): boolean {\n return FUNCTIONS.has(name) || /^[A-Za-z_][\\w-]*(\\.[A-Za-z_][\\w-]*)+$/.test(name)\n}\n\nfunction checkCall(value: { call: string }, path: string, issues: PropIssue[]): void {\n if (!isCallableName(value.call))\n issues.push({ path, message: `unknown function \"${value.call}\"; known: the catalog functions, or a namespaced host function (app.toast)` })\n}\n\n/** Every `{call}` at any depth of an EXPRESSION (`visible`, a call's args,\n * an event context): each resolves at any depth (`resolveDynamic`), so\n * every `{call}` in it is a call. */\nfunction checkCallsDeep(value: unknown, path: string, issues: PropIssue[]): void {\n if (Array.isArray(value)) {\n value.forEach((v, i) => checkCallsDeep(v, `${path}[${i}]`, issues))\n return\n }\n if (typeof value !== `object` || value === null) return\n if (isCall(value)) checkCall(value, path, issues)\n for (const [k, v] of Object.entries(value)) checkCallsDeep(v, `${path}.${k}`, issues)\n}\n\n/** The calls a PROP makes, walked along its schema exactly as the bind\n * pass resolves it (`resolveProp`): a `{call}` AT a position is a call\n * (its args are expressions); a DATA position (Table `rows`: shape-less\n * objects) is the author's literal data, never descended (a row\n * `{call: \"+1 555 0100\"}` is a row); arrays and shaped objects walk per\n * item / property; a `style` prop resolves at any depth; anything else is\n * a literal. */\nfunction checkPropCalls(value: unknown, schema: PropSchema | undefined, path: string, view: CatalogView, issues: PropIssue[]): void {\n if (isCall(value)) {\n checkCall(value, path, issues)\n checkCallsDeep(value.args, `${path}.args`, issues)\n return\n }\n if (!schema || isDataSchema(schema)) return\n if (schema.type === `style`) return checkCallsDeep(value, path, issues)\n if (schema.type === `array` && schema.items && Array.isArray(value)) {\n value.forEach((item, i) => checkPropCalls(item, schema.items, `${path}[${i}]`, view, issues))\n return\n }\n const shape = schema.type === `object` && schema.shape ? view.defs[schema.shape] : undefined\n if (shape && typeof value === `object` && value !== null && !Array.isArray(value))\n for (const [k, v] of Object.entries(value)) checkPropCalls(v, shape.properties[k], `${path}.${k}`, view, issues)\n}\n\n/** The calls an ACTION makes: its `functionCall` (name + args) and its\n * event context (an expression). Nothing else in it is evaluated. */\nfunction checkActionCalls(action: unknown, path: string, issues: PropIssue[]): void {\n if (typeof action !== `object` || action === null) return\n const { functionCall, event } = action as { functionCall?: unknown; event?: unknown }\n if (isCall(functionCall)) {\n checkCall(functionCall, `${path}.functionCall`, issues)\n checkCallsDeep(functionCall.args, `${path}.functionCall.args`, issues)\n }\n if (typeof event === `object` && event !== null) checkCallsDeep((event as { context?: unknown }).context, `${path}.event.context`, issues)\n}\n\n/** What validateProps leaves out, round 4 (VAPP-103): the node's `style`\n * (whitelisted keys, known tokens, `$color.*` colours), every function a\n * prop (along its schema: never inside DATA), `visible` or an `on` action\n * calls, and a Table's slot columns (each `type: slot` column names one of\n * the node's slots). In this order; the Rust core\n * (`validate::validate_node`) reports the same issues. */\nexport function validateNode(\n node: { component: string; props: Record<string, unknown>; style?: unknown; visible?: unknown; on?: Record<string, unknown>; slots?: Record<string, unknown> },\n options: { extensions?: readonly ExtensionDef[] } = {}\n): PropIssue[] {\n const issues: PropIssue[] = []\n const view = viewOf(options.extensions)\n const def = view.components[node.component]\n if (node.style !== undefined) for (const issue of validateStyle(node.style, { path: `style` })) issues.push(issue)\n for (const [k, v] of Object.entries(node.props)) checkPropCalls(v, def?.props[k], `props.${k}`, view, issues)\n if (node.visible !== undefined) checkCallsDeep(node.visible, `visible`, issues)\n for (const [event, action] of Object.entries(node.on ?? {})) checkActionCalls(action, `on.${event}`, issues)\n if (node.component === `Table` && Array.isArray(node.props.columns)) {\n const slots = Object.keys(node.slots ?? {})\n node.props.columns.forEach((column, i) => {\n if (typeof column !== `object` || column === null || (column as { type?: unknown }).type !== `slot`) return\n const slot = (column as { slot?: unknown }).slot\n if (typeof slot !== `string`) issues.push({ path: `props.columns[${i}].slot`, message: `a slot column names one of the Table's slots` })\n else if (!slots.includes(slot)) issues.push({ path: `props.columns[${i}].slot`, message: `no slot \"${slot}\" on this Table; slots: ${slots.join(`|`) || `none`}` })\n })\n }\n return issues\n}\n\n/** Every issue in a node's props against its component definition. */\nexport function validateProps(\n def: ComponentDef,\n props: Record<string, unknown>,\n options: { path?: string; extensions?: readonly ExtensionDef[] } = {}\n): PropIssue[] {\n const issues: PropIssue[] = []\n checkProps(def.props, props, options.path ?? `props`, viewOf(options.extensions), issues)\n return issues\n}\n",
14
+ "// VAPP-85 (D14): the A2UI basic catalog → core catalog map, applied by the\n// reducer. The declarative part is catalog/basic-map.json; the NAMED\n// transforms listed under its `transforms` are implemented here, one function\n// per name, in the words of the table.\n\nimport basicMapJson from \"../catalog/basic-map.json\" with { type: \"json\" }\nimport type { Action, ChildTemplate, FlatComponent } from \"./types\"\n\ninterface PropRule {\n from?: string\n map?: Record<string, unknown>\n default?: unknown\n const?: unknown\n}\ninterface ComponentRule {\n to: string\n props: Record<string, string | PropRule>\n children?: `children` | `child`\n transform?: string\n}\n\nexport const basicMap = basicMapJson as unknown as {\n from: string\n to: string\n version: string\n placeholderIcon: string\n components: Record<string, ComponentRule>\n transforms: Record<string, string>\n icons: Record<string, string | null>\n functions: Record<string, string>\n}\n\n/** What a basic component becomes before the reducer nests its children. */\nexport interface MappedComponent {\n component: string\n props: Record<string, unknown>\n childrenIds: string[]\n template?: ChildTemplate\n slots: Record<string, string>\n on?: Record<string, Action>\n style?: Record<string, unknown>\n}\n\nexport function mapBasicIcon(name: unknown): string {\n if (typeof name !== `string`) return basicMap.placeholderIcon\n return (own(basicMap.icons, name) ? basicMap.icons[name] : undefined) ?? basicMap.placeholderIcon\n}\n\nfunction isBinding(value: unknown): value is { path: string } {\n return typeof value === `object` && value !== null && typeof (value as { path?: unknown }).path === `string`\n}\n\ntype Transform = (out: MappedComponent, flat: FlatComponent, lookup: (id: string) => FlatComponent | undefined) => void\n\nconst transforms: Record<string, Transform> = {\n textVariant(out, flat) {\n const variant = flat.variant\n if (variant === `h1` || variant === `h2` || variant === `h3` || variant === `h4`) {\n out.component = `Heading`\n out.props = { text: out.props.text, level: variant }\n return\n }\n out.props.variant = variant === `h5` ? `label` : variant === `caption` ? `caption` : `body`\n },\n imageVariant(out, flat) {\n const variant = (flat.variant as string | undefined) ?? `mediumFeature`\n if (variant === `avatar`) {\n out.component = `Avatar`\n out.props = { src: out.props.src, name: flat.description ?? `` }\n return\n }\n const style: Record<string, unknown> =\n variant === `icon`\n ? { width: 24, height: 24 }\n : variant === `smallFeature`\n ? { width: 120, height: 120 }\n : variant === `header`\n ? { width: `100%`, aspectRatio: 3 }\n : { width: `100%`, aspectRatio: 1.7777778 }\n out.style = { ...(out.style ?? {}), ...style }\n },\n iconName(out, flat) {\n out.props.name = mapBasicIcon(flat.name)\n },\n tabs(out, flat) {\n const tabs = Array.isArray(flat.tabs) ? (flat.tabs as { title: unknown; child: string }[]) : []\n out.props.tabs = tabs.map((tab) => ({ label: tab.title, value: tab.child }))\n out.childrenIds = tabs.map((tab) => tab.child)\n if (tabs.length > 0) out.props.value = tabs[0].child\n },\n modal(out, flat) {\n if (typeof flat.trigger === `string`) out.slots.trigger = flat.trigger\n if (typeof flat.content === `string`) out.childrenIds = [flat.content]\n out.props.open = false\n },\n buttonChild(out, flat, lookup) {\n const childId = typeof flat.child === `string` ? flat.child : undefined\n const child = childId ? lookup(childId) : undefined\n if (child?.component === `Text`) out.props.label = child.text\n else if (child?.component === `Icon`) out.props.icon = mapBasicIcon(child.name)\n else if (childId) out.childrenIds = [childId]\n if (out.props.icon !== undefined && out.props.label === undefined) out.props.size = `icon`\n if (flat.action !== undefined) out.on = { press: flat.action as Action }\n },\n textField(out, flat) {\n out.props.name = flat.id\n const variant = (flat.variant as string | undefined) ?? `shortText`\n if (variant === `longText`) out.component = `Textarea`\n else out.props.type = variant === `number` ? `number` : variant === `obscured` ? `password` : `text`\n if (typeof flat.validationRegexp === `string`) {\n const value = isBinding(flat.value) ? flat.value.path : flat.id\n const checks = Array.isArray(out.props.checks) ? [...(out.props.checks as unknown[])] : []\n checks.push({\n condition: { call: `regex`, args: { value: { path: value }, pattern: flat.validationRegexp } },\n message: `Invalid value`,\n })\n out.props.checks = checks\n }\n },\n fieldName(out, flat) {\n out.props.name = flat.id\n },\n choicePicker(out, flat) {\n out.props.name = flat.id\n const multiple = flat.variant === `multipleSelection`\n const value = flat.value\n const joined = Array.isArray(value)\n ? multiple\n ? (value as string[]).join(`,`)\n : ((value as string[])[0] ?? ``)\n : value\n if (joined !== undefined) out.props.value = joined\n if (flat.filterable === true) {\n out.component = `Select`\n out.props.searchable = true\n out.props.multiple = multiple\n } else if (flat.displayStyle === `chips`) {\n out.component = `Segmented`\n out.props = { items: out.props.options, type: multiple ? `multiple` : `single`, variant: `outline`, value: out.props.value }\n } else if (multiple) {\n out.component = `Select`\n out.props.multiple = true\n }\n },\n}\n\n/** An OWN key of a table: an agent-chosen name (`valueOf`, `constructor`,\n * `__proto__`) never finds `Object.prototype`'s members (VAPP-107). */\nfunction own(table: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(table, key)\n}\n\n/** Map one basic component; `null` when the table has no row (→ Unknown). */\nexport function mapBasicComponent(\n flat: FlatComponent,\n lookup: (id: string) => FlatComponent | undefined\n): MappedComponent | null {\n const rule = own(basicMap.components, flat.component) ? basicMap.components[flat.component] : undefined\n if (!rule) return null\n const props: Record<string, unknown> = {}\n for (const [coreProp, spec] of Object.entries(rule.props)) {\n if (typeof spec === `string`) {\n if (flat[spec] !== undefined) props[coreProp] = flat[spec]\n continue\n }\n if (`const` in spec) {\n props[coreProp] = spec.const\n continue\n }\n let value = spec.from !== undefined ? flat[spec.from] : undefined\n if (spec.map && typeof value === `string` && own(spec.map, value)) value = spec.map[value]\n if (value === undefined && spec.default !== undefined) value = spec.default\n if (value !== undefined) props[coreProp] = value\n }\n const out: MappedComponent = { component: rule.to, props, childrenIds: [], slots: {} }\n if (rule.children === `children`) {\n const children = flat.children\n if (Array.isArray(children)) out.childrenIds = children\n else if (children && typeof children === `object`)\n out.template = { component: children.componentId, path: children.path, ...(typeof children.key === `string` ? { key: children.key } : {}) }\n } else if (rule.children === `child` && typeof flat.child === `string`) {\n out.childrenIds = [flat.child]\n }\n if (rule.transform) {\n const fn = transforms[rule.transform]\n if (!fn) throw new Error(`basic-map.json names an unimplemented transform: ${rule.transform}`)\n fn(out, flat, lookup)\n }\n return out\n}\n\nexport const BASIC_TRANSFORM_NAMES: readonly string[] = Object.keys(transforms)\n",
15
+ "// VAPP-85: the TypeScript REFERENCE reducer. A surface's flat component list\n// (A2UI `updateComponents`, core OR basic catalog) → ONE normalized tree in\n// the core vocabulary, macros expanded, every unknown component the explicit\n// `Unknown` placeholder. The Rust core (VAPP-86) replays the same fixtures.\n\nimport {\n A2UI_BASIC_CATALOG_ID,\n CORE_CATALOG_ID,\n CORE_LITE_CATALOG_ID,\n UNKNOWN_COMPONENT,\n sharedCatalogView,\n} from \"./catalog\"\nimport { mapBasicComponent } from \"./basic-map\"\nimport { isDynamic } from \"./expr\"\nimport { expandMacros } from \"./macros\"\nimport { validateNode, validateProps } from \"./validate\"\nimport { LIMIT_ISSUES, MAX_COMPONENTS, MAX_DEPTH } from \"./limits\"\nimport type {\n ChildTemplate,\n ExtensionDef,\n FlatComponent,\n NestedNode,\n ReduceIssue,\n UiNode,\n Visible,\n WireChildTemplate,\n} from \"./types\"\n\n/** The keys of a flat component that are not props (round 1 adds `visible`). */\nexport const RESERVED_KEYS: readonly string[] = [`id`, `component`, `children`, `slots`, `on`, `style`, `visible`, `accessibility`, `template`]\nconst RESERVED = new Set(RESERVED_KEYS)\n\nexport interface ReduceOptions {\n /** The surface's catalog: the core, the lite subset, the basic catalog or an extension's id. */\n catalogId: string\n extensions?: readonly ExtensionDef[]\n /** The root component id (A2UI: `root`). */\n rootId?: string\n /** Expand macros (default true); false keeps the pre-expansion tree. */\n expand?: boolean\n /** Record prop validation issues (default true). */\n validate?: boolean\n}\n\nexport interface ReduceResult {\n root: UiNode\n issues: ReduceIssue[]\n /** Round 2 (docs/round-2-contract.md §4): the nodes a data `template`\n * renders per item, by component id, LIFTED out of the tree (a template\n * node listed as a child too never renders in place), validated and\n * expanded like the root; in discovery order. Absent without templates. */\n templates?: Record<string, UiNode>\n}\n\n/** Lift every node a `template.component` names out of the trees (children\n * and slots, at any depth, the root excepted) into the template table;\n * ids no tree holds are built with `buildMissing` (the flat path), else\n * reported. Nested templates (a template inside a template node) are\n * lifted too. A template that would instantiate ITSELF (its own owner, an\n * ancestor of its owner, or through other templates) and one naming the\n * root are reported (`template: cycle through this id`) and never lifted:\n * the node stays where it was and its owner renders no items. Mutates the\n * freshly built trees. */\nfunction liftTemplates(root: UiNode, issues: ReduceIssue[], buildMissing?: (id: string) => UiNode | undefined): Map<string, UiNode> {\n const order: string[] = []\n const want = new Set<string>()\n const found = new Map<string, UiNode>()\n const missing = new Set<string>()\n let rootNamed = false\n // Every node strip changed, as it was first (to put a cyclic template back).\n const originals = new Map<UiNode, { children: UiNode[]; slots?: Record<string, UiNode> }>()\n const collect = (n: UiNode) => {\n const id = n.template?.component\n if (id === root.id) rootNamed = true\n else if (id !== undefined && !want.has(id)) {\n want.add(id)\n order.push(id)\n }\n for (const slot of Object.values(n.slots ?? {})) collect(slot)\n n.children.forEach(collect)\n }\n const strip = (n: UiNode) => {\n const lifts = n.children.some((c) => want.has(c.id)) || Object.values(n.slots ?? {}).some((c) => want.has(c.id))\n if (lifts && !originals.has(n)) originals.set(n, { children: [...n.children], ...(n.slots ? { slots: { ...n.slots } } : {}) })\n n.children = n.children.filter((c) => {\n if (!want.has(c.id)) return true\n if (!found.has(c.id)) found.set(c.id, c)\n return false\n })\n if (n.slots) {\n for (const [name, slot] of Object.entries(n.slots)) {\n if (!want.has(slot.id)) continue\n if (!found.has(slot.id)) found.set(slot.id, slot)\n delete n.slots[name]\n }\n if (Object.keys(n.slots).length === 0) delete n.slots\n }\n for (const slot of Object.values(n.slots ?? {})) strip(slot)\n n.children.forEach(strip)\n }\n collect(root)\n for (let before = ``; before !== `${want.size}/${found.size}/${missing.size}`; ) {\n before = `${want.size}/${found.size}/${missing.size}`\n strip(root)\n for (let n = -1; n !== found.size; ) {\n n = found.size\n for (const node of [...found.values()]) strip(node)\n }\n for (const id of order) {\n if (found.has(id) || missing.has(id)) continue\n const built = buildMissing?.(id)\n if (built) found.set(id, built)\n else {\n missing.add(id)\n issues.push({ id, message: `template: no component with this id` })\n }\n }\n for (const node of [...found.values()]) collect(node)\n }\n if (rootNamed) issues.push({ id: root.id, message: `template: cycle through this id` })\n // Cycles: a template that reaches itself through the templates its\n // subtree's owners name. Each round puts the cyclic ones back in place\n // (which may give their new ancestors edges), until none is left.\n const lifted = new Set(found.keys())\n for (;;) {\n for (const [node, orig] of originals) {\n node.children = orig.children.filter((c) => !lifted.has(c.id))\n if (orig.slots) {\n const kept = Object.entries(orig.slots).filter(([, c]) => !lifted.has(c.id))\n if (kept.length > 0) node.slots = Object.fromEntries(kept)\n else delete node.slots\n }\n }\n const deps = new Map<string, Set<string>>()\n for (const id of lifted) {\n const out = new Set<string>()\n const walk = (n: UiNode) => {\n const t = n.template?.component\n if (t !== undefined && lifted.has(t)) out.add(t)\n for (const slot of Object.values(n.slots ?? {})) walk(slot)\n n.children.forEach(walk)\n }\n walk(found.get(id)!)\n deps.set(id, out)\n }\n const reaches = (from: string, to: string): boolean => {\n const seen = new Set<string>()\n const stack = [...(deps.get(from) ?? [])]\n while (stack.length > 0) {\n const id = stack.pop()!\n if (id === to) return true\n if (seen.has(id)) continue\n seen.add(id)\n stack.push(...(deps.get(id) ?? []))\n }\n return false\n }\n const cyclic = order.filter((id) => lifted.has(id) && reaches(id, id))\n if (cyclic.length === 0) break\n for (const id of cyclic) {\n lifted.delete(id)\n issues.push({ id, message: `template: cycle through this id` })\n }\n }\n const out = new Map<string, UiNode>()\n for (const id of order) {\n const node = found.get(id)\n if (node && lifted.has(id)) out.set(id, node)\n }\n return out\n}\n\n/** Expand the root, then each lifted template (one issue list), and cap\n * each EXPANDED tree's depth right after its expansion (the Rust core's\n * `finish`): `maxDepth` bounds the reduced tree a host serializes, not the\n * authored one (a Card is two levels once expanded). */\nfunction finish(root: UiNode, lifted: Map<string, UiNode>, expand: boolean, extensions: readonly ExtensionDef[], catalogId: string, issues: ReduceIssue[]): ReduceResult {\n // R8 F51: ONE budget over the expanded trees (the root's, then every\n // lifted template's): a macro's `$each` parts count.\n const budget = { left: MAX_COMPONENTS, reported: issues.some((i) => i.message === LIMIT_ISSUES.components) }\n root = capComponents(capDepth(expand ? expandMacros(root, { extensions, issues }) : root, catalogId, issues), budget, issues)\n if (lifted.size === 0) return { root, issues }\n const templates: Record<string, UiNode> = {}\n for (const [id, node] of lifted) templates[id] = capComponents(capDepth(expand ? expandMacros(node, { extensions, issues }) : node, catalogId, issues), budget, issues)\n return { root, issues, templates }\n}\n\n/** R8 F51: the `maxComponents` budget over an EXPANDED tree (the flat\n * builder counted the authored nodes; a macro's `$each` multiplies them: a\n * Rating with `max: 10000` is 20,001 parts). Pre-order (a child, its\n * subtree, the next child; children before slots); a node past the budget\n * is dropped with its subtree, the first refusal is the budget issue (once\n * per surface). Recursive: `capDepth` ran first, so the tree is at most\n * `maxDepth` levels deep. */\nfunction capComponents(root: UiNode, budget: { left: number; reported: boolean }, issues: ReduceIssue[]): UiNode {\n spend(budget, root.id, issues)\n const walk = (node: UiNode): void => {\n node.children = node.children.filter((child) => {\n if (!spend(budget, child.id, issues)) return false\n walk(child)\n return true\n })\n if (node.slots)\n for (const [name, slot] of Object.entries(node.slots)) {\n if (!spend(budget, slot.id, issues)) delete node.slots[name]\n else walk(slot)\n }\n }\n walk(root)\n return root\n}\n\n/** VAPP-103: every node at level MAX_DEPTH + 1 (the tree's root = 1;\n * children, then slots, one level down) becomes the Unknown placeholder\n * for its id and component, its subtree dropped, with the depth issue on\n * its id once (pre-order; an id already reported, e.g. by the authored-\n * depth check, is not reported again). An Unknown LEAF there is already a\n * placeholder: kept, never re-reported. Iterative. */\nfunction capDepth(root: UiNode, catalogId: string, issues: ReduceIssue[]): UiNode {\n const reported = new Set(issues.filter((i) => i.message === LIMIT_ISSUES.depth).map((i) => i.id))\n const stack: { node: UiNode; depth: number }[] = [{ node: root, depth: 1 }]\n while (stack.length) {\n const { node, depth } = stack.pop()!\n const cap = (child: UiNode): UiNode => {\n if (depth + 1 <= MAX_DEPTH) return child\n if (child.component === UNKNOWN_COMPONENT && child.children.length === 0 && child.slots === undefined) return child\n if (!reported.has(child.id)) {\n reported.add(child.id)\n issues.push({ id: child.id, message: LIMIT_ISSUES.depth })\n }\n return unknown(child.id, child.component, catalogId)\n }\n const next: UiNode[] = []\n node.children = node.children.map((child) => {\n const capped = cap(child)\n next.push(capped)\n return capped\n })\n if (node.slots)\n for (const [name, slot] of Object.entries(node.slots)) {\n const capped = cap(slot)\n node.slots[name] = capped\n next.push(capped)\n }\n if (depth + 1 > MAX_DEPTH) continue\n for (let i = next.length - 1; i >= 0; i--) stack.push({ node: next[i]!, depth: depth + 1 })\n }\n return root\n}\n\nfunction unknown(id: string, component: string, catalogId: string): UiNode {\n return { id, component: UNKNOWN_COMPONENT, props: { component, catalogId }, children: [] }\n}\n\nfunction ownProps(flat: FlatComponent): Record<string, unknown> {\n const props: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(flat)) {\n if (!RESERVED.has(key) && value !== undefined) props[key] = value\n }\n return props\n}\n\nfunction knownCatalog(catalogId: string, extensions: readonly ExtensionDef[]): boolean {\n return (\n catalogId === CORE_CATALOG_ID ||\n catalogId === CORE_LITE_CATALOG_ID ||\n catalogId === A2UI_BASIC_CATALOG_ID ||\n extensions.some((ext) => ext.id === catalogId)\n )\n}\n\n/** A `visible` value is a boolean or a dynamic value (a binding or a call). */\nexport function validVisible(value: unknown): value is Visible {\n return typeof value === `boolean` || isDynamic(value)\n}\n\nexport function childTemplate(value: WireChildTemplate): ChildTemplate {\n const out: ChildTemplate = { component: value.componentId, path: value.path }\n if (typeof value.key === `string`) out.key = value.key\n return out\n}\n\n/** Reduce a flat component list. Children are resolved from the root down, so\n * components nothing references (a basic Button's consumed Text child) do\n * not appear. A missing or cyclic reference becomes an Unknown placeholder\n * plus an issue. VAPP-103: an id placed a second time (two parents, or one\n * parent twice) renders at its first place only (`id used twice`), a node\n * deeper than `maxDepth` is an Unknown placeholder, and past\n * `maxComponents` nodes the rest is dropped (catalog/limits.json). */\nexport function reduceSurface(components: readonly FlatComponent[], options: ReduceOptions): ReduceResult {\n const extensions = options.extensions ?? []\n const view = sharedCatalogView(extensions)\n const issues: ReduceIssue[] = []\n const byId = new Map<string, FlatComponent>()\n components.forEach((flat, i) => {\n // VAPP-107 (property-tested): an entry that is not a component object\n // (null, a string, no string id) is an issue, never a throw (the Rust\n // core refuses the message at parse time).\n if (!flat || typeof flat !== `object` || typeof flat.id !== `string` || typeof flat.component !== `string`) {\n issues.push({ id: options.rootId ?? `root`, message: `components[${i}] is not a component (an object with a string id and component)` })\n return\n }\n if (byId.has(flat.id)) issues.push({ id: flat.id, message: `duplicate id; the last definition wins` })\n byId.set(flat.id, flat)\n })\n const lookup = (id: string) => byId.get(id)\n const basic = options.catalogId === A2UI_BASIC_CATALOG_ID\n if (!knownCatalog(options.catalogId, extensions))\n issues.push({ id: options.rootId ?? `root`, message: `unsupported catalog ${options.catalogId}` })\n const visiting = new Set<string>()\n const placed = new Set<string>()\n // R8 F52: the ids whose second place was already reported (a 4 MB\n // `children: [\"x\", \"x\", …]` costs ONE issue, not one per reference).\n const twiceReported = new Set<string>()\n const budget = { left: MAX_COMPONENTS, reported: false }\n\n // R8 F52: the Unknown placeholders for a missing or cyclic id are placed\n // nodes too, so they spend the budget BEFORE they are made: a message\n // whose children list repeats an unknown id a million times stops at\n // `maxComponents` placeholders (one budget issue).\n const build = (id: string, depth: number): UiNode | undefined => {\n const flat = byId.get(id)\n if (flat) {\n // A cycle (the id is an ancestor) before a second place: the ancestor\n // is in `placed` too.\n if (visiting.has(id)) {\n if (!spend(budget, id, issues)) return undefined\n issues.push({ id, message: `cycle through this id` })\n return unknown(id, flat.component, options.catalogId)\n }\n if (placed.has(id)) {\n if (!twiceReported.has(id)) {\n twiceReported.add(id)\n issues.push({ id, message: LIMIT_ISSUES.usedTwice })\n }\n return undefined\n }\n }\n if (!spend(budget, id, issues)) return undefined\n if (!flat) {\n issues.push({ id, message: `no component with this id` })\n return unknown(id, `#${id}`, options.catalogId)\n }\n placed.add(id)\n if (depth > MAX_DEPTH) {\n issues.push({ id, message: LIMIT_ISSUES.depth })\n return unknown(id, flat.component, options.catalogId)\n }\n const child = (childId: string) => build(childId, depth + 1)\n const children = (ids: readonly string[]) => ids.map(child).filter((n): n is UiNode => n !== undefined)\n visiting.add(id)\n let node: UiNode\n if (basic) {\n const mapped = mapBasicComponent(flat, lookup)\n if (!mapped) {\n issues.push({ id, message: `basic component ${flat.component} has no mapping` })\n node = unknown(id, flat.component, options.catalogId)\n } else {\n node = { id, component: mapped.component, props: mapped.props, children: children(mapped.childrenIds) }\n if (mapped.template) node.template = mapped.template\n if (mapped.style) node.style = mapped.style\n if (mapped.on) node.on = mapped.on\n for (const [slot, childId] of Object.entries(mapped.slots)) {\n const built = child(childId)\n if (built) (node.slots ??= {})[slot] = built\n }\n }\n } else {\n const def = view.components[flat.component]\n if (!def) {\n issues.push({ id, message: `unknown component ${flat.component}` })\n node = unknown(id, flat.component, options.catalogId)\n } else {\n node = { id, component: flat.component, props: ownProps(flat), children: [] }\n if (Array.isArray(flat.children)) node.children = children(flat.children)\n else if (flat.children && typeof flat.children === `object`) node.template = childTemplate(flat.children)\n if (flat.style) node.style = flat.style\n if (flat.on) node.on = flat.on\n for (const [slot, childId] of Object.entries(flat.slots ?? {})) {\n const built = child(childId)\n if (built) (node.slots ??= {})[slot] = built\n }\n }\n }\n // `visible` and `accessibility` hold on EVERY component, basic or core.\n if (flat.visible !== undefined) {\n if (validVisible(flat.visible)) node.visible = flat.visible\n else issues.push({ id, message: `visible: expected a boolean, a binding or a function call` })\n }\n if (flat.accessibility) node.accessibility = flat.accessibility\n visiting.delete(id)\n if (options.validate !== false && node.component !== UNKNOWN_COMPONENT) {\n const def = view.components[node.component]\n if (def) {\n for (const issue of validateProps(def, node.props, { path: `props`, extensions }))\n issues.push({ id, message: `${issue.path}: ${issue.message}` })\n if (def.children === `none` && node.children.length > 0)\n issues.push({ id, message: `${node.component} takes no children` })\n for (const slot of Object.keys(node.slots ?? {}))\n if (!slotAllowed(def.slots, slot)) issues.push({ id, message: `slots.${slot}: ${node.component} has no such slot` })\n for (const issue of validateNode(node, { extensions })) issues.push({ id, message: `${issue.path}: ${issue.message}` })\n }\n }\n return node\n }\n\n const rootId = options.rootId ?? `root`\n let root = build(rootId, 1) ?? unknown(rootId, `#${rootId}`, options.catalogId)\n const lifted = liftTemplates(root, issues, (id) => (byId.has(id) && !placed.has(id) ? build(id, 1) : undefined))\n return finish(root, lifted, options.expand !== false, extensions, options.catalogId, issues)\n}\n\n/** Take one node from the surface's budget; the first refusal is an issue. */\nfunction spend(budget: { left: number; reported: boolean }, id: string, issues: ReduceIssue[]): boolean {\n if (budget.left > 0) {\n budget.left -= 1\n return true\n }\n if (!budget.reported) issues.push({ id, message: LIMIT_ISSUES.components })\n budget.reported = true\n return false\n}\n\n/** A component's slot list admits a name when it lists it or lists `*`. */\nexport function slotAllowed(slots: readonly string[] | undefined, name: string): boolean {\n return (slots ?? []).some((s) => s === `*` || s === name)\n}\n\n/** The nested authoring form → a normalized tree (same validation and\n * expansion as reduceSurface). */\nexport function reduceNested(tree: NestedNode, options: Omit<ReduceOptions, `rootId`>): ReduceResult {\n const extensions = options.extensions ?? []\n const view = sharedCatalogView(extensions)\n const issues: ReduceIssue[] = []\n const budget = { left: MAX_COMPONENTS, reported: false }\n const walk = (n: NestedNode, depth: number): UiNode | undefined => {\n if (!spend(budget, n.id, issues)) return undefined\n if (depth > MAX_DEPTH) {\n issues.push({ id: n.id, message: LIMIT_ISSUES.depth })\n return unknown(n.id, n.component, options.catalogId)\n }\n const def = view.components[n.component]\n if (!def) {\n issues.push({ id: n.id, message: `unknown component ${n.component}` })\n return unknown(n.id, n.component, options.catalogId)\n }\n const children = (n.children ?? []).map((c) => walk(c, depth + 1)).filter((c): c is UiNode => c !== undefined)\n const node: UiNode = { id: n.id, component: n.component, props: { ...(n.props ?? {}) }, children }\n if (n.style) node.style = n.style\n if (n.visible !== undefined) {\n if (validVisible(n.visible)) node.visible = n.visible\n else issues.push({ id: n.id, message: `visible: expected a boolean, a binding or a function call` })\n }\n if (n.on) node.on = n.on\n if (n.accessibility) node.accessibility = n.accessibility\n if (n.template) node.template = n.template\n if (n.slots) {\n node.slots = {}\n for (const [slot, child] of Object.entries(n.slots)) {\n const built = walk(child, depth + 1)\n if (built) node.slots[slot] = built\n }\n }\n if (options.validate !== false) {\n for (const issue of validateProps(def, node.props, { path: `props`, extensions }))\n issues.push({ id: n.id, message: `${issue.path}: ${issue.message}` })\n if (def.children === `none` && node.children.length > 0)\n issues.push({ id: n.id, message: `${n.component} takes no children` })\n for (const slot of Object.keys(node.slots ?? {}))\n if (!slotAllowed(def.slots, slot)) issues.push({ id: n.id, message: `slots.${slot}: ${n.component} has no such slot` })\n for (const issue of validateNode(node, { extensions })) issues.push({ id: n.id, message: `${issue.path}: ${issue.message}` })\n }\n return node\n }\n let root = walk(tree, 1)!\n const lifted = liftTemplates(root, issues)\n return finish(root, lifted, options.expand !== false, extensions, options.catalogId, issues)\n}\n\n/** Pre-order ids of a tree, the painters' accessibility order. */\nexport function preorder(root: UiNode): string[] {\n const out: string[] = []\n const walk = (n: UiNode) => {\n out.push(n.id)\n for (const slot of Object.values(n.slots ?? {})) walk(slot)\n n.children.forEach(walk)\n }\n walk(root)\n return out\n}\n",
16
+ "// VAPP-91: the policy rules every host applies before a client function, a\n// URL open or a media load (`catalog/host.json` functions / urls / media).\n// Pure; `fixtures/host-policy.json` locks them on every platform.\n\nimport { DEFAULT_MEDIA_SCHEMES, DEFAULT_URL_SCHEMES, MEDIA_LIMITS } from \"./contract\"\nimport { coreCatalog } from \"../catalog\"\n\n/** The catalog's built-in client functions: the basic 14 + round 1's 15\n * core ones (`functions.names`). */\nexport const BUILTIN_FUNCTIONS: readonly string[] = (coreCatalog as unknown as { functions: { names: string[] } }).functions.names\n\nexport type FunctionDecision = `allow` | `ask` | `deny` | `not_found`\n\nexport interface FunctionPolicy {\n allow?: readonly string[]\n ask?: readonly string[]\n deny?: readonly string[]\n /** For a registered name no list matches; default `allow`. */\n default?: `allow` | `ask` | `deny`\n}\n\n/** `harness.*` matches `harness.toast`; anything else is exact. */\nexport function matchesPattern(pattern: string, name: string): boolean {\n return pattern.endsWith(`*`) ? name.startsWith(pattern.slice(0, -1)) : pattern === name\n}\n\n/** The gate: built-ins always run; an unregistered name is `not_found`;\n * then deny wins, then allow, then ask, then the policy's default. */\nexport function decideFunction(policy: FunctionPolicy | undefined, name: string, registered: boolean): FunctionDecision {\n if (BUILTIN_FUNCTIONS.includes(name)) return `allow`\n if (!registered) return `not_found`\n const p = policy ?? {}\n const any = (list?: readonly string[]) => (list ?? []).some((pattern) => matchesPattern(pattern, name))\n if (any(p.deny)) return `deny`\n if (any(p.allow)) return `allow`\n if (any(p.ask)) return `ask`\n return p.default ?? `allow`\n}\n\n/** Two policies stacked (a package's allowlist under the host's own): the\n * stricter decision wins. */\nexport function combineDecisions(a: FunctionDecision, b: FunctionDecision): FunctionDecision {\n const rank: Record<FunctionDecision, number> = { allow: 0, ask: 1, deny: 2, not_found: 3 }\n return rank[a] >= rank[b] ? a : b\n}\n\n/** A declarative package's `functions` list as a policy: listed = allow,\n * anything else = deny. */\nexport function packagePolicy(functions: readonly string[] | undefined): FunctionPolicy {\n return { allow: functions ?? [], default: `deny` }\n}\n\nexport interface UrlPolicy {\n /** The schemes allowed; default `DEFAULT_URL_SCHEMES` (https, http,\n * mailto, tel). `[\"https\"]` = https only. */\n schemes?: readonly string[]\n /** http(s) hosts allowed: exact or `*.example.com`; unset = any. */\n hosts?: readonly string[]\n /** VAPP-107: private, loopback and link-local hosts (`isPrivateHost`)\n * are DENIED for http(s) unless listed here: exact, `*.suffix`, or `*`\n * for every private address. A `hosts` allowlist does not opt one in. */\n allowPrivate?: readonly string[]\n baseUrl?: string\n}\n\nexport interface UrlDecision {\n allowed: boolean\n /** The absolute url when it parses. */\n url?: string\n reason?: `invalid` | `scheme` | `host` | `private`\n}\n\nfunction absolute(url: string, baseUrl?: string): URL | null {\n try {\n return new URL(url)\n } catch {\n if (!baseUrl) return null\n try {\n return new URL(url, baseUrl)\n } catch {\n return null\n }\n }\n}\n\nfunction hostMatches(pattern: string, host: string): boolean {\n const p = pattern.toLowerCase()\n return p.startsWith(`*.`) ? host.endsWith(p.slice(1)) && host.length > p.length - 1 : host === p\n}\n\n/** The dotted-decimal IPv4 a WHATWG-parsed hostname is (the parser has\n * already normalized `0x7f.1`, `2130706433` and the like), else null. */\nfunction ipv4(host: string): [number, number, number, number] | null {\n const m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host)\n if (!m) return null\n const parts = m.slice(1).map(Number) as [number, number, number, number]\n return parts.every((n) => n <= 255) ? parts : null\n}\n\n/** A WHATWG-serialized IPv6 (`[...]`, lower-case hex, `::` once) as its\n * eight 16-bit pieces, else null. */\nfunction ipv6(host: string): number[] | null {\n if (!host.startsWith(`[`) || !host.endsWith(`]`)) return null\n const text = host.slice(1, -1)\n const halves = text.split(`::`)\n if (halves.length > 2) return null\n const pieces = (part: string): number[] | null => {\n if (part === ``) return []\n const out: number[] = []\n for (const p of part.split(`:`)) {\n if (!/^[0-9a-f]{1,4}$/.test(p)) return null\n out.push(parseInt(p, 16))\n }\n return out\n }\n const head = pieces(halves[0]!)\n const tail = halves.length === 2 ? pieces(halves[1]!) : []\n if (!head || !tail) return null\n if (halves.length === 1) return head.length === 8 ? head : null\n if (head.length + tail.length > 7) return null\n return [...head, ...new Array<number>(8 - head.length - tail.length).fill(0), ...tail]\n}\n\nfunction privateV4([a, b]: [number, number, number, number]): boolean {\n // 0.0.0.0/8 (\"this\" network), 10/8, 127/8 (loopback), 169.254/16\n // (link-local), 172.16/12, 192.168/16.\n return a === 0 || a === 10 || a === 127 || (a === 169 && b === 254) || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168)\n}\n\n/** VAPP-107: is a parsed, lower-cased hostname one the URL and media policy\n * deny by default (`catalog/host.json` urls.privateHosts)? `localhost`\n * and `*.localhost`, `*.local` (mDNS), the IPv4 blocks 0/8, 10/8, 127/8,\n * 169.254/16, 172.16/12, 192.168/16, and IPv6 `::`, `::1`, fe80::/10,\n * fc00::/7 plus an IPv4-mapped address of a private IPv4. LITERALS only:\n * the policy never resolves names (a public name that resolves privately\n * is the host network's job). */\nexport function isPrivateHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/\\.$/, ``)\n if (host === `localhost` || host.endsWith(`.localhost`) || host.endsWith(`.local`)) return true\n const v4 = ipv4(host)\n if (v4) return privateV4(v4)\n const v6 = ipv6(host)\n if (!v6) return false\n if (v6.every((p) => p === 0)) return true\n if (v6.slice(0, 7).every((p) => p === 0) && v6[7] === 1) return true\n if ((v6[0]! & 0xffc0) === 0xfe80 || (v6[0]! & 0xfe00) === 0xfc00) return true\n if (v6.slice(0, 5).every((p) => p === 0) && v6[5] === 0xffff) return privateV4([v6[6]! >> 8, v6[6]! & 0xff, v6[7]! >> 8, v6[7]! & 0xff])\n return false\n}\n\nfunction privateAllowed(allow: readonly string[] | undefined, host: string): boolean {\n return (allow ?? []).some((p) => p === `*` || hostMatches(p, host))\n}\n\n/** The decision for a url: it must parse (relative against `baseUrl`), use\n * one of `schemes`, and for http(s) match `hosts` when set and not be a\n * private host unless `allowPrivate` covers it. */\nexport function decideUrl(policy: UrlPolicy | undefined, url: string): UrlDecision {\n const parsed = absolute(url.trim(), policy?.baseUrl)\n if (!parsed) return { allowed: false, reason: `invalid` }\n const scheme = parsed.protocol.replace(/:$/, ``).toLowerCase()\n const schemes = policy?.schemes ?? DEFAULT_URL_SCHEMES\n if (!schemes.includes(scheme)) return { allowed: false, url: parsed.href, reason: `scheme` }\n if (scheme === `http` || scheme === `https`) {\n const host = parsed.hostname.toLowerCase()\n if (policy?.hosts && !policy.hosts.some((h) => hostMatches(h, host))) return { allowed: false, url: parsed.href, reason: `host` }\n if (isPrivateHost(host) && !privateAllowed(policy?.allowPrivate, host)) return { allowed: false, url: parsed.href, reason: `private` }\n }\n return { allowed: true, url: parsed.href }\n}\n\nexport interface MediaRule {\n prefix: string\n headers: Record<string, string>\n}\n\nexport interface MediaOptions {\n baseUrl?: string\n rules?: readonly MediaRule[]\n /** The schemes a src may use; default `DEFAULT_MEDIA_SCHEMES` (https,\n * http, data). `file` only when listed. */\n schemes?: readonly string[]\n /** http(s) hosts media may load from: exact or `*.example.com`; unset = any. */\n hosts?: readonly string[]\n /** VAPP-107: the private hosts media may load from (`UrlPolicy.allowPrivate`). */\n allowPrivate?: readonly string[]\n}\n\nexport interface MediaRequest {\n url: string\n headers: Record<string, string>\n}\n\n/** The image / media loader's request: the absolute url plus the headers of\n * every rule whose prefix it starts with (later rules win per header).\n * Null when the url does not resolve or the media policy (schemes, hosts)\n * denies it: nothing loads. */\nexport function mediaRequest(url: string, options: MediaOptions = {}): MediaRequest | null {\n const d = decideUrl({ baseUrl: options.baseUrl, schemes: options.schemes ?? DEFAULT_MEDIA_SCHEMES, hosts: options.hosts, allowPrivate: options.allowPrivate }, url)\n if (!d.allowed || !d.url) return null\n const href = d.url\n const headers: Record<string, string> = {}\n for (const rule of options.rules ?? []) if (href.startsWith(rule.prefix)) Object.assign(headers, rule.headers)\n return { url: href, headers: sortKeys(headers) }\n}\n\n/** The href a renderer may navigate to (Link, markdown links, FileUpload\n * file urls), or undefined when the URL policy denies it. */\nexport function safeHref(policy: UrlPolicy | undefined, url: unknown): string | undefined {\n if (typeof url !== `string` || !url) return undefined\n const d = decideUrl(policy, url)\n return d.allowed ? d.url : undefined\n}\n\nexport function sortKeys<T>(record: Record<string, T>): Record<string, T> {\n return Object.fromEntries(Object.entries(record).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))\n}\n\n/** Width × height from an image's header (PNG, JPEG, GIF, WebP, BMP) or an\n * SVG's root `width`/`height`/`viewBox` without decoding it: what a loader\n * checks against `MEDIA_LIMITS.maxPixels` BEFORE decoding (the Rust core's\n * `image_dimensions`). Null = not a header this reads (truncated bytes,\n * another format). VAPP-103 rfix: an SVG has a size (`svgDimensions`). */\nexport function imageDimensions(bytes: Uint8Array): [number, number] | null {\n if (isSvg(bytes)) return svgDimensions(bytes)\n const n = bytes.length\n const be16 = (i: number) => (i + 2 <= n ? (bytes[i]! << 8) | bytes[i + 1]! : null)\n const le16 = (i: number) => (i + 2 <= n ? bytes[i]! | (bytes[i + 1]! << 8) : null)\n const be32 = (i: number) => (i + 4 <= n ? ((bytes[i]! << 24) | (bytes[i + 1]! << 16) | (bytes[i + 2]! << 8) | bytes[i + 3]!) >>> 0 : null)\n const le32 = (i: number) => (i + 4 <= n ? (bytes[i]! | (bytes[i + 1]! << 8) | (bytes[i + 2]! << 16) | (bytes[i + 3]! << 24)) >>> 0 : null)\n const le24 = (i: number) => (i + 3 <= n ? bytes[i]! | (bytes[i + 1]! << 8) | (bytes[i + 2]! << 16) : null)\n const starts = (sig: number[], at = 0) => sig.every((b, i) => bytes[at + i] === b)\n const pair = (w: number | null, h: number | null): [number, number] | null => (w === null || h === null ? null : [w, h])\n if (starts([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return pair(be32(16), be32(20))\n if (starts([0x47, 0x49, 0x46, 0x38]) && (bytes[4] === 0x37 || bytes[4] === 0x39) && bytes[5] === 0x61) return pair(le16(6), le16(8))\n if (starts([0x42, 0x4d])) {\n const h = le32(22)\n return pair(le32(18), h === null ? null : Math.abs(h | 0))\n }\n if (n >= 30 && starts([0x52, 0x49, 0x46, 0x46]) && starts([0x57, 0x45, 0x42, 0x50], 8)) {\n const kind = String.fromCharCode(bytes[12]!, bytes[13]!, bytes[14]!, bytes[15]!)\n if (kind === `VP8 `) return pair(le16(26)! & 0x3fff, le16(28)! & 0x3fff)\n if (kind === `VP8L`) {\n const b = le32(21)\n return b === null ? null : [(b & 0x3fff) + 1, ((b >>> 14) & 0x3fff) + 1]\n }\n if (kind === `VP8X`) {\n const w = le24(24)\n const h = le24(27)\n return w === null || h === null ? null : [w + 1, h + 1]\n }\n return null\n }\n if (starts([0xff, 0xd8])) {\n let i = 2\n while (i + 4 <= n) {\n if (bytes[i] !== 0xff) {\n i += 1\n continue\n }\n const marker = bytes[i + 1]!\n if (marker === 0xff) {\n i += 1\n continue\n }\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n i += 2\n continue\n }\n const len = be16(i + 2)\n if (len === null) return null\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) return pair(be16(i + 7), be16(i + 5))\n i += 2 + len\n }\n }\n return null\n}\n\n/** An SVG by its first non-blank bytes (`<svg` or `<?xml`). */\nfunction isSvg(bytes: Uint8Array): boolean {\n const head = bytes.subarray(0, 256)\n let i = 0\n while (i < head.length && (head[i] === 0x20 || head[i] === 0x09 || head[i] === 0x0a || head[i] === 0x0c || head[i] === 0x0d)) i += 1\n const text = String.fromCharCode(...head.subarray(i, i + 5)).toLowerCase()\n return text.startsWith(`<svg`) || text.startsWith(`<?xml`)\n}\n\nconst SVG_UNITS: Record<string, number> = { \"\": 1, px: 1, pt: 4 / 3, pc: 16, in: 96, cm: 96 / 2.54, mm: 96 / 25.4, em: 16, ex: 8 }\n\n/** An SVG length in px (null = a percentage, unknown unit, negative or not a number). */\nfunction svgLength(value: string): number | null {\n const v = value.trim()\n const m = /^[0-9.+\\-eE]*/.exec(v)!\n let num = m[0]\n let unit = v.slice(num.length)\n if (/[eE]$/.test(num)) {\n num = num.slice(0, -1)\n unit = v.slice(num.length)\n }\n const scale = SVG_UNITS[unit.trim()]\n if (scale === undefined || !/^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/.test(num)) return null\n const n = Number(num)\n return Number.isFinite(n) && n >= 0 ? n * scale : null\n}\n\nfunction svgViewBox(value: string): [number, number] | null {\n const parts = value.split(/[\\s,]+/).filter((p) => p !== ``)\n if (parts.length !== 4 || parts.some((p) => !/^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/.test(p))) return null\n const w = Number(parts[2])\n const h = Number(parts[3])\n return w > 0 && h > 0 && Number.isFinite(w) && Number.isFinite(h) ? [w, h] : null\n}\n\n/** The size an SVG rasterizes at: its root's `width`/`height` (px, or\n * pt/pc/in/cm/mm/em/ex at 96 dpi and a 16 px em; `%` = unset); a missing\n * one follows the `viewBox` aspect, both missing = the `viewBox` size, no\n * `viewBox` = 100. Null = no `<svg` root tag (the Rust core's `svg_dimensions`). */\nexport function svgDimensions(bytes: Uint8Array): [number, number] | null {\n let at = -1\n for (let i = 0; i + 4 <= bytes.length; i++) {\n if (bytes[i] === 0x3c && bytes[i + 1] === 0x73 && bytes[i + 2] === 0x76 && bytes[i + 3] === 0x67) {\n at = i\n break\n }\n }\n if (at < 0) return null\n let end = bytes.indexOf(0x3e, at)\n if (end < 0) end = bytes.length\n const tag = new TextDecoder().decode(bytes.subarray(at + 4, end))\n let width: number | null = null\n let height: number | null = null\n let viewBox: [number, number] | null = null\n for (const m of tag.matchAll(/(?<=\\s)([A-Za-z_:][A-Za-z0-9_:.\\-]*)\\s*=\\s*(\"([^\"]*)\"?|'([^']*)'?)/g)) {\n const value = m[3] ?? m[4] ?? ``\n if (m[1] === `width`) width = svgLength(value)\n else if (m[1] === `height`) height = svgLength(value)\n else if (m[1] === `viewBox`) viewBox = svgViewBox(value)\n }\n let w: number\n let h: number\n if (width !== null && height !== null) [w, h] = [width, height]\n else if (width !== null) [w, h] = [width, viewBox ? (width * viewBox[1]) / viewBox[0] : 100]\n else if (height !== null) [w, h] = [viewBox ? (height * viewBox[0]) / viewBox[1] : 100, height]\n else [w, h] = viewBox ?? [100, 100]\n const px = (v: number) => (Number.isFinite(v) ? Math.min(Math.max(Math.ceil(v), 0), 0xffffffff) : 0xffffffff)\n return [px(w), px(h)]\n}\n\n/** The frames an image decodes into: a GIF's image descriptors, an APNG's\n * `acTL` count, an animated WebP's `ANMF` chunks; 1 otherwise (the Rust\n * core's `image_frames`). */\nexport function imageFrames(bytes: Uint8Array): number {\n const n = bytes.length\n const be32 = (i: number) => (i + 4 <= n ? ((bytes[i]! << 24) | (bytes[i + 1]! << 16) | (bytes[i + 2]! << 8) | bytes[i + 3]!) >>> 0 : null)\n const le32 = (i: number) => (i + 4 <= n ? (bytes[i]! | (bytes[i + 1]! << 8) | (bytes[i + 2]! << 16) | (bytes[i + 3]! << 24)) >>> 0 : null)\n const tag = (i: number) => (i + 4 <= n ? String.fromCharCode(bytes[i]!, bytes[i + 1]!, bytes[i + 2]!, bytes[i + 3]!) : null)\n const starts = (sig: number[]) => sig.every((b, i) => bytes[i] === b)\n let frames = 1\n if (starts([0x47, 0x49, 0x46, 0x38]) && (bytes[4] === 0x37 || bytes[4] === 0x39) && bytes[5] === 0x61) {\n const skipBlocks = (i: number) => {\n while (i < n) {\n const size = bytes[i]!\n i += 1 + size\n if (size === 0) break\n }\n return i\n }\n const table = (packed: number) => (packed & 0x80 ? 3 << ((packed & 7) + 1) : 0)\n let i = 13 + (n > 10 ? table(bytes[10]!) : 0)\n frames = 0\n for (;;) {\n if (bytes[i] === 0x2c) {\n frames += 1\n if (i + 9 >= n) break\n i = skipBlocks(i + 10 + table(bytes[i + 9]!) + 1)\n } else if (bytes[i] === 0x21) i = skipBlocks(i + 2)\n else break\n }\n } else if (starts([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n let i = 8\n for (;;) {\n const len = be32(i)\n const kind = tag(i + 4)\n if (len === null || kind === null || kind === `IDAT`) break\n if (kind === `acTL`) {\n frames = be32(i + 8) ?? 1\n break\n }\n i += 12 + len\n }\n } else if (n >= 21 && tag(0) === `RIFF` && tag(8) === `WEBP` && tag(12) === `VP8X` && bytes[20]! & 0x02) {\n let i = 12\n frames = 0\n for (;;) {\n const kind = tag(i)\n const size = le32(i + 4)\n if (kind === null || size === null) break\n if (kind === `ANMF`) frames += 1\n i += 8 + size + (size & 1)\n }\n }\n return Math.max(frames, 1)\n}\n\n/** VAPP-103 rfix: the pixel cap on a whole image before it decodes (the\n * Rust core's `media_image_within_limits`): a raster (PNG, JPEG, GIF, WebP,\n * BMP) or SVG whose size cannot be read is refused, and width × height ×\n * `imageFrames` must fit `maxPixels`. Null = within the limits, else the\n * reason; bytes of no known image format pass (the decoder refuses them).\n * `limits` defaults to `MEDIA_LIMITS` (a host may pass its own). */\nexport function mediaImageWithinLimits(bytes: Uint8Array, limits: { maxBytes: number; maxPixels: number } = MEDIA_LIMITS): string | null {\n const { maxBytes, maxPixels } = limits\n if (bytes.length > maxBytes) return `media is over ${maxBytes} bytes`\n const starts = (sig: number[], at = 0) => sig.every((b, i) => bytes[at + i] === b)\n const raster =\n starts([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) ||\n (starts([0x47, 0x49, 0x46, 0x38]) && (bytes[4] === 0x37 || bytes[4] === 0x39) && bytes[5] === 0x61) ||\n starts([0x42, 0x4d]) ||\n starts([0xff, 0xd8]) ||\n (bytes.length >= 12 && starts([0x52, 0x49, 0x46, 0x46]) && starts([0x57, 0x45, 0x42, 0x50], 8))\n if (!raster && !isSvg(bytes)) return null\n const dims = imageDimensions(bytes)\n if (!dims) return `media: image dimensions unreadable`\n const [w, h] = dims\n const frames = imageFrames(bytes)\n if (frames <= 1) return w * h > maxPixels ? `media is ${w}×${h}, over ${maxPixels} pixels` : null\n return w * h * frames > maxPixels ? `media is ${w}×${h} × ${frames} frames, over ${maxPixels} pixels` : null\n}\n",
17
+ "// VAPP-91: binding sources. A data model path can follow a host source\n// (`exp:issues?board=…`): the host registers one resolver per scheme, the\n// router emits a `bind` op, the resolver's emits land at the path.\n\nimport { sortKeys } from \"./policy\"\n\nexport interface ParsedSource {\n /** The source as written. */\n uri: string\n scheme: string\n name: string\n params: Record<string, string>\n}\n\nconst SOURCE = /^([a-zA-Z][a-zA-Z0-9+.-]*):([^?]+)(?:\\?(.*))?$/\n\nfunction decode(part: string): string {\n try {\n return decodeURIComponent(part.replace(/\\+/g, ` `))\n } catch {\n return part\n }\n}\n\n/** `exp:issues?board=b1&limit=20` → `{scheme: \"exp\", name: \"issues\",\n * params: {board: \"b1\", limit: \"20\"}}`; null when it does not parse. */\nexport function parseSource(uri: string): ParsedSource | null {\n const m = SOURCE.exec(uri.trim())\n if (!m) return null\n const name = decode(m[2]!)\n if (!name) return null\n const params: Record<string, string> = {}\n for (const pair of (m[3] ?? ``).split(`&`)) {\n if (!pair) continue\n const eq = pair.indexOf(`=`)\n const key = decode(eq < 0 ? pair : pair.slice(0, eq))\n if (!key) continue\n params[key] = eq < 0 ? `` : decode(pair.slice(eq + 1))\n }\n return { uri, scheme: m[1]!.toLowerCase(), name, params: sortKeys(params) }\n}\n\n/** What a resolver emits into: the value lands at the bound path. */\nexport type SourceEmit = (value: unknown) => void\n\n/** A scheme's resolver: start following `source`, return the cancel. */\nexport type SourceResolver = (source: ParsedSource, emit: SourceEmit) => (() => void) | void\n\nexport type SourceResolvers = Record<string, SourceResolver>\n",
18
+ "// VAPP-91: the wire decoders every transport adapter shares (pure,\n// incremental, fixture-locked in fixtures/host-transport.json): A2UI JSONL\n// over a byte stream, Server-Sent Events, and the A2UI-over-MCP carrier.\n\nimport { MCP_ACTION_TOOL, MCP_MIME_TYPES, SSE_EVENTS } from \"./contract\"\nimport type { ClientMessage } from \"./contract\"\nimport { LIMIT_ISSUES, MAX_MESSAGE_BYTES } from \"../limits\"\n\nexport interface DecodeIssue {\n /** 1-based line (JSONL) or event (SSE) number. */\n at: number\n message: string\n}\n\nexport interface Decoded {\n messages: unknown[]\n issues: DecodeIssue[]\n}\n\nfunction parseLine(line: string, at: number, out: Decoded): void {\n const text = line.trim()\n if (!text) return\n try {\n out.messages.push(JSON.parse(text))\n } catch {\n out.issues.push({ at, message: `line ${at} is not JSON` })\n }\n}\n\n/** UTF-8 bytes of a string (a surrogate pair = 4; chunk-safe per unit). */\nfunction utf8Bytes(text: string): number {\n let n = 0\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i)\n n += c < 0x80 ? 1 : c < 0x800 ? 2 : c >= 0xd800 && c <= 0xdfff ? 2 : 3\n }\n return n\n}\n\n/** VAPP-103: the line splitter both stream decoders share (the Rust core's\n * `Lines`): each push scans its chunk once, the unterminated tail is kept\n * as pieces (never rescanned), and a line past `maxMessageBytes` is\n * `null` (its bytes are dropped up to the next newline, never buffered). */\nclass Lines {\n private parts: string[] = []\n private bytes = 0\n /** Inside an oversized line: drop until its newline. */\n private skipping = false\n\n push(chunk: string): (string | null)[] {\n const out: (string | null)[] = []\n let start = 0\n if (this.skipping) {\n const i = chunk.indexOf(`\\n`)\n if (i < 0) return out\n this.skipping = false\n start = i + 1\n }\n let nl = chunk.indexOf(`\\n`, start)\n while (nl >= 0) {\n const piece = chunk.slice(start, nl)\n const oversized = this.bytes + utf8Bytes(piece) > MAX_MESSAGE_BYTES\n out.push(oversized ? null : this.parts.length ? this.parts.join(``) + piece : piece)\n this.parts = []\n this.bytes = 0\n start = nl + 1\n nl = chunk.indexOf(`\\n`, start)\n }\n if (start < chunk.length) {\n const tail = chunk.slice(start)\n this.parts.push(tail)\n this.bytes += utf8Bytes(tail)\n }\n if (this.bytes > MAX_MESSAGE_BYTES) {\n out.push(null)\n this.parts = []\n this.bytes = 0\n this.skipping = true\n }\n return out\n }\n\n /** The unterminated tail (null inside an oversized line). */\n end(): string | null {\n const skipping = this.skipping\n const tail = this.parts.join(``)\n this.parts = []\n this.bytes = 0\n this.skipping = false\n return skipping ? null : tail\n }\n}\n\nconst oversized = (at: number, what: `line` | `event`): DecodeIssue => ({ at, message: `${what} ${at}: ${LIMIT_ISSUES.messageBytes}` })\n\n/** One message per line. `push` takes any chunking (a line may span\n * chunks), `end` flushes a last line without a newline. A line past\n * `maxMessageBytes` is an issue (`line N: message larger than … bytes`),\n * never buffered. */\nexport class JsonlDecoder {\n private lines = new Lines()\n private line = 0\n\n push(chunk: string): Decoded {\n const out: Decoded = { messages: [], issues: [] }\n for (const raw of this.lines.push(chunk)) {\n this.line += 1\n if (raw === null) out.issues.push(oversized(this.line, `line`))\n else parseLine(raw, this.line, out)\n }\n return out\n }\n\n end(): Decoded {\n const out: Decoded = { messages: [], issues: [] }\n const raw = this.lines.end()\n if (raw !== null && raw.trim()) {\n this.line += 1\n parseLine(raw, this.line, out)\n }\n return out\n }\n}\n\n/** A whole JSONL document (or one JSON value / a JSON array of messages). */\nexport function decodeJsonl(text: string): Decoded {\n const trimmed = text.trim()\n if (trimmed.startsWith(`[`)) {\n try {\n const value = JSON.parse(trimmed)\n if (Array.isArray(value)) return { messages: value, issues: [] }\n } catch {\n // fall through: JSONL whose first line is an array is still JSONL\n }\n }\n const d = new JsonlDecoder()\n const a = d.push(text)\n const b = d.end()\n return { messages: [...a.messages, ...b.messages], issues: [...a.issues, ...b.issues] }\n}\n\n/** Server-Sent Events: `data:` lines join with `\\n` per event, a blank line\n * dispatches, `:` comments and other fields are ignored (`retry:` is\n * kept as `retryMs`), an `event:` name\n * outside SSE_EVENTS drops the event. An event's data is one message or\n * JSONL. */\nexport class SseDecoder {\n /** The last `retry:` field (ms): the server resumes the stream after it\n * ends (a transport reconnects on a clean end only then). */\n retryMs?: number\n private lines = new Lines()\n private data: string[] = []\n /** The event's data bytes so far (past `maxMessageBytes` it is dropped\n * and dispatches as an issue). */\n private dataBytes = 0\n private oversized = false\n private event = ``\n private count = 0\n\n push(chunk: string): Decoded {\n const out: Decoded = { messages: [], issues: [] }\n for (const raw of this.lines.push(chunk)) {\n if (raw === null) this.dropData()\n else this.line(raw.endsWith(`\\r`) ? raw.slice(0, -1) : raw, out)\n }\n return out\n }\n\n end(): Decoded {\n const out: Decoded = { messages: [], issues: [] }\n const raw = this.lines.end()\n if (raw === null) this.dropData()\n else if (raw) this.line(raw, out)\n this.dispatch(out)\n return out\n }\n\n /** The event is past `maxMessageBytes`: forget its data (it dispatches\n * as an issue). */\n private dropData(): void {\n this.data = []\n this.dataBytes = 0\n this.oversized = true\n }\n\n private line(line: string, out: Decoded): void {\n if (line === ``) return this.dispatch(out)\n if (line.startsWith(`:`)) return\n const colon = line.indexOf(`:`)\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? `` : line.slice(colon + 1)\n if (value.startsWith(` `)) value = value.slice(1)\n if (field === `data`) {\n if (this.oversized) return\n this.dataBytes += utf8Bytes(value) + 1\n if (this.dataBytes > MAX_MESSAGE_BYTES) return this.dropData()\n this.data.push(value)\n } else if (field === `event`) this.event = value\n else if (field === `retry` && /^\\d+$/.test(value)) this.retryMs = Number(value)\n }\n\n private dispatch(out: Decoded): void {\n this.dataBytes = 0\n if (this.oversized) {\n this.oversized = false\n this.count += 1\n this.data = []\n this.event = ``\n out.issues.push(oversized(this.count, `event`))\n return\n }\n if (!this.data.length) {\n this.event = ``\n return\n }\n this.count += 1\n const name = this.event || `message`\n const data = this.data.join(`\\n`)\n this.data = []\n this.event = ``\n if (!SSE_EVENTS.includes(name)) return\n const d = decodeJsonl(data)\n out.messages.push(...d.messages)\n if (d.issues.length) out.issues.push({ at: this.count, message: `event ${this.count} is not JSON` })\n }\n}\n\n/** The A2UI-over-MCP carrier: the messages inside an MCP tool result\n * (`content[]` resources with an A2UI mime type, or\n * `structuredContent.a2ui`). */\nexport function messagesFromMcpResult(result: unknown): Decoded {\n const out: Decoded = { messages: [], issues: [] }\n if (!result || typeof result !== `object`) return out\n const r = result as { content?: unknown; structuredContent?: unknown }\n const structured = (r.structuredContent as { a2ui?: unknown } | undefined)?.a2ui\n if (Array.isArray(structured)) out.messages.push(...structured)\n if (Array.isArray(r.content)) {\n r.content.forEach((item, i) => {\n const resource = (item as { type?: string; resource?: { mimeType?: string; text?: string } })?.resource\n if ((item as { type?: string })?.type !== `resource` || !resource || !MCP_MIME_TYPES.includes(resource.mimeType ?? ``)) return\n if (typeof resource.text !== `string`) return\n const d = decodeJsonl(resource.text)\n out.messages.push(...d.messages)\n for (const issue of d.issues) out.issues.push({ at: i + 1, message: `content[${i}]: ${issue.message}` })\n })\n }\n return out\n}\n\n/** A client message as the MCP tools/call that carries it back. */\nexport function mcpActionCall(message: ClientMessage, tool: string = MCP_ACTION_TOOL): { method: `tools/call`; params: { name: string; arguments: { message: ClientMessage } } } {\n return { method: `tools/call`, params: { name: tool, arguments: { message } } }\n}\n",
19
+ "// VAPP-91: catalog negotiation and declarative app packages (VAPP-82: a\n// manifest + A2UI templates + bindings, data never code).\n\nimport { A2UI_BASIC_CATALOG_ID, CORE_CATALOG_ID, CORE_LITE_CATALOG_ID } from \"../catalog\"\nimport { A2UI_VERSION } from \"../catalog\"\nimport type { FlatComponent } from \"../types\"\nimport type { ServerMessage } from \"./contract\"\nimport { matchesPattern } from \"./policy\"\nimport { parseSource } from \"./sources\"\n\n/** The core, the core lite, the A2UI basic catalog, then every registered\n * extension id in order, de-duplicated. */\nexport function supportedCatalogIds(extensionIds: readonly string[] = []): string[] {\n const out: string[] = []\n for (const id of [CORE_CATALOG_ID, CORE_LITE_CATALOG_ID, A2UI_BASIC_CATALOG_ID, ...extensionIds]) if (!out.includes(id)) out.push(id)\n return out\n}\n\n/** A2UI's `a2uiClientCapabilities`. */\nexport function clientCapabilities(extensionIds: readonly string[] = []): { \"v0.9\": { supportedCatalogIds: string[] } } {\n return { \"v0.9\": { supportedCatalogIds: supportedCatalogIds(extensionIds) } }\n}\n\nexport interface TemplateBinding {\n path: string\n source: string\n}\n\nexport interface AppTemplate {\n components: FlatComponent[]\n data?: unknown\n bindings?: TemplateBinding[]\n}\n\nexport interface AppPackage {\n id: string\n name: string\n version: string\n catalogId: string\n templates: Record<string, AppTemplate>\n /** Function patterns the package's surfaces may call (allowlist). */\n functions?: string[]\n /** VAPP-107: the binding sources the package's surfaces may follow\n * (`exp:devices`, or a prefix `exp:*`); unset = any registered scheme.\n * Set, a template binding or a later `bindDataModel` outside it is\n * refused (`sourceAllowed`). */\n sources?: string[]\n /** A built-in theme id or a theme JSON. */\n theme?: unknown\n icon?: { glyph?: string; color?: string }\n description?: string\n}\n\nexport interface PackageIssue {\n path: string\n message: string\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> => !!v && typeof v === `object` && !Array.isArray(v)\nconst POINTER = /^(\\/([^/~]|~[01])*)*$/\n\n/** Every problem with a package, each with a JSON pointer into it. */\nexport function validatePackage(pkg: unknown, catalogIds: readonly string[] = supportedCatalogIds()): PackageIssue[] {\n const issues: PackageIssue[] = []\n if (!isObject(pkg)) return [{ path: ``, message: `a package is an object` }]\n for (const key of [`id`, `name`, `version`, `catalogId`])\n if (typeof pkg[key] !== `string` || !(pkg[key] as string)) issues.push({ path: `/${key}`, message: `${key} is a required string` })\n if (typeof pkg.catalogId === `string` && pkg.catalogId && !catalogIds.includes(pkg.catalogId))\n issues.push({ path: `/catalogId`, message: `unsupported catalog ${pkg.catalogId}` })\n if (!isObject(pkg.templates) || !Object.keys(pkg.templates).length) issues.push({ path: `/templates`, message: `templates is a non-empty object` })\n else\n for (const [id, template] of Object.entries(pkg.templates)) {\n const at = `/templates/${id}`\n if (!isObject(template)) {\n issues.push({ path: at, message: `a template is an object` })\n continue\n }\n const components = template.components\n if (!Array.isArray(components) || !components.length) issues.push({ path: `${at}/components`, message: `components is a non-empty array` })\n else {\n const ids = new Set<string>()\n components.forEach((c, i) => {\n if (!isObject(c) || typeof c.id !== `string` || typeof c.component !== `string`) issues.push({ path: `${at}/components/${i}`, message: `a component needs an id and a component` })\n else if (ids.has(c.id)) issues.push({ path: `${at}/components/${i}/id`, message: `duplicate id ${c.id}` })\n else ids.add(c.id)\n })\n if (!ids.has(`root`)) issues.push({ path: `${at}/components`, message: `no component has the id root` })\n }\n if (template.bindings !== undefined) {\n if (!Array.isArray(template.bindings)) issues.push({ path: `${at}/bindings`, message: `bindings is an array` })\n else\n template.bindings.forEach((b, i) => {\n const bp = `${at}/bindings/${i}`\n if (!isObject(b) || typeof b.path !== `string` || !POINTER.test(b.path)) issues.push({ path: `${bp}/path`, message: `path is a JSON pointer` })\n if (!isObject(b) || typeof b.source !== `string` || !parseSource(b.source)) issues.push({ path: `${bp}/source`, message: `source is a scheme:name URI` })\n })\n }\n }\n if (pkg.functions !== undefined && (!Array.isArray(pkg.functions) || pkg.functions.some((f) => typeof f !== `string` || !f)))\n issues.push({ path: `/functions`, message: `functions is a list of names or prefix* patterns` })\n if (pkg.sources !== undefined && (!Array.isArray(pkg.sources) || pkg.sources.some((f) => typeof f !== `string` || !f)))\n issues.push({ path: `/sources`, message: `sources is a list of scheme:name sources or prefix* patterns` })\n else if (Array.isArray(pkg.sources) && isObject(pkg.templates))\n for (const [id, template] of Object.entries(pkg.templates)) {\n if (!isObject(template) || !Array.isArray(template.bindings)) continue\n template.bindings.forEach((b, i) => {\n if (isObject(b) && typeof b.source === `string` && parseSource(b.source) && !sourceAllowed(pkg.sources as string[], b.source))\n issues.push({ path: `/templates/${id}/bindings/${i}/source`, message: `source ${b.source} is not in the package's sources` })\n })\n }\n return issues\n}\n\n/** VAPP-107: may a package whose `sources` list is `allowed` follow this\n * source URI? Unset = yes; else the URI's `scheme:name` (scheme\n * lower-cased, the query dropped) must match a listed source exactly or a\n * `prefix*` pattern. */\nexport function sourceAllowed(allowed: readonly string[] | undefined, source: string): boolean {\n if (allowed === undefined) return true\n const parsed = parseSource(source)\n if (!parsed) return false\n const name = `${parsed.scheme}:${parsed.name}`\n return allowed.some((p) => matchesPattern(p, name) || matchesPattern(p, source))\n}\n\n/** A template as the messages that create it: createSurface, the\n * components, the merged initial data, one bindDataModel per binding. */\nexport function templateMessages(pkg: AppPackage, templateId: string, surfaceId: string, data?: unknown): ServerMessage[] | null {\n const template = pkg.templates[templateId]\n if (!template) return null\n const version = A2UI_VERSION\n const out: ServerMessage[] = [\n { version, createSurface: { surfaceId, catalogId: pkg.catalogId } },\n { version, updateComponents: { surfaceId, components: template.components } },\n ]\n const merged = mergeData(template.data, data)\n if (merged !== undefined) out.push({ version, updateDataModel: { surfaceId, path: `/`, value: merged } })\n for (const b of template.bindings ?? []) out.push({ version, bindDataModel: { surfaceId, path: b.path, source: b.source } })\n return out\n}\n\n/** The template's data under the caller's (objects merge one level deep in\n * key order; anything else: the caller's wins). */\nexport function mergeData(base: unknown, over: unknown): unknown {\n if (over === undefined) return base\n if (isObject(base) && isObject(over)) return { ...base, ...over }\n return over\n}\n",
20
+ "// VAPP-91: the host router. Server messages in, ops out (`catalog/host.json`\n// ops); the platform host performs them on its surfaces. Pure and\n// synchronous, so fixtures/host-router.json locks the same behaviour on\n// every platform (the Rust core's `host::HostRouter`, which Swift and Kotlin\n// reach through the facade).\n\nimport { A2UI_VERSION } from \"../catalog\"\nimport { errorMessage, MESSAGE_KINDS } from \"./contract\"\nimport type { HostOp, ServerMessage } from \"./contract\"\nimport { sourceAllowed, supportedCatalogIds, templateMessages, validatePackage } from \"./package\"\nimport type { PackageIssue, AppPackage } from \"./package\"\nimport { parseSource } from \"./sources\"\nimport { LIMIT_ISSUES, MAX_MESSAGE_BYTES } from \"../limits\"\n\nconst isObject = (v: unknown): v is Record<string, unknown> => !!v && typeof v === `object` && !Array.isArray(v)\n\nexport interface HostRouterOptions {\n /** Extension catalog ids the host registered (negotiation). */\n extensionIds?: readonly string[]\n}\n\nexport interface SurfaceInfo {\n surfaceId: string\n catalogId: string\n /** The package whose template created it (its function policy). */\n packageId?: string\n}\n\nexport class HostRouter {\n private extensionIds: string[]\n private surfaces = new Map<string, SurfaceInfo>()\n private packages = new Map<string, AppPackage>()\n\n constructor(options: HostRouterOptions = {}) {\n this.extensionIds = [...(options.extensionIds ?? [])]\n }\n\n get supportedCatalogIds(): string[] {\n return supportedCatalogIds(this.extensionIds)\n }\n\n registerExtension(id: string): void {\n if (!this.extensionIds.includes(id)) this.extensionIds.push(id)\n }\n\n /** Install a declarative package: its templates become `applyTemplate`\n * targets. Returns the validation issues (installed only when none). */\n installPackage(pkg: AppPackage): PackageIssue[] {\n const issues = validatePackage(pkg, this.supportedCatalogIds)\n if (!issues.length) this.packages.set(pkg.id, pkg)\n return issues\n }\n\n package(id: string): AppPackage | undefined {\n return this.packages.get(id)\n }\n\n surface(id: string): SurfaceInfo | undefined {\n return this.surfaces.get(id)\n }\n\n surfaceIds(): string[] {\n return [...this.surfaces.keys()]\n }\n\n /** One server message → the ops to perform, in order. Never throws. */\n route(message: unknown): HostOp[] {\n // VAPP-103: a message past `maxMessageBytes` (as UTF-8 JSON) is refused.\n if (oversized(message)) return [this.invalid(isObject(message) ? surfaceIdOf(message) : ``, LIMIT_ISSUES.messageBytes)]\n if (!isObject(message)) return [this.invalid(``, `a message is a JSON object`)]\n if (message.version !== undefined && message.version !== A2UI_VERSION) return [this.invalid(surfaceIdOf(message), `unsupported version ${String(message.version)}`)]\n const kinds = Object.keys(message).filter((k) => k !== `version`)\n if (kinds.length !== 1 || !MESSAGE_KINDS.includes(kinds[0]!)) return [this.invalid(surfaceIdOf(message), `expected exactly one of ${MESSAGE_KINDS.join(`, `)}`)]\n const kind = kinds[0] as keyof ServerMessage\n const body = message[kind]\n if (!isObject(body) || typeof body.surfaceId !== `string` || !body.surfaceId) return [this.invalid(``, `${kind}.surfaceId is required`)]\n const surfaceId = body.surfaceId\n switch (kind) {\n case `createSurface`: {\n if (typeof body.catalogId !== `string`) return [this.invalid(surfaceId, `createSurface.catalogId is required`)]\n if (!this.supportedCatalogIds.includes(body.catalogId))\n return [{ op: `send`, message: errorMessage(`UNSUPPORTED_CATALOG`, surfaceId, `catalog ${body.catalogId} is not supported`) }]\n this.surfaces.set(surfaceId, { surfaceId, catalogId: body.catalogId })\n const op: HostOp = { op: `create`, surfaceId, catalogId: body.catalogId }\n if (body.theme !== undefined) op.theme = body.theme\n if (body.sendDataModel === true) op.sendDataModel = true\n return [op]\n }\n case `updateComponents`: {\n if (!Array.isArray(body.components)) return [this.invalid(surfaceId, `updateComponents.components is required`)]\n if (!this.surfaces.has(surfaceId)) return [this.missing(surfaceId)]\n return [{ op: `components`, surfaceId, components: body.components as never }]\n }\n case `updateDataModel`: {\n if (!this.surfaces.has(surfaceId)) return [this.missing(surfaceId)]\n if (body.path !== undefined && typeof body.path !== `string`) return [this.invalid(surfaceId, `updateDataModel.path is a string`)]\n const path = normalizePath(body.path as string | undefined)\n return [`value` in body ? { op: `data`, surfaceId, path, value: body.value } : { op: `data`, surfaceId, path }]\n }\n case `deleteSurface`: {\n if (!this.surfaces.has(surfaceId)) return [this.missing(surfaceId)]\n this.surfaces.delete(surfaceId)\n return [{ op: `delete`, surfaceId }]\n }\n case `bindDataModel`: {\n const info = this.surfaces.get(surfaceId)\n if (!info) return [this.missing(surfaceId)]\n if (typeof body.path !== `string` || typeof body.source !== `string` || !parseSource(body.source))\n return [this.invalid(surfaceId, `bindDataModel needs a path and a scheme:name source`)]\n // VAPP-107: a package surface follows only the sources its package lists.\n const pkg = info.packageId ? this.packages.get(info.packageId) : undefined\n if (pkg && !sourceAllowed(pkg.sources, body.source))\n return [{ op: `send`, message: errorMessage(`SOURCE_DENIED`, surfaceId, `source ${body.source} is not in package ${pkg.id}'s sources`, normalizePath(body.path) || `/`) }]\n return [{ op: `bind`, surfaceId, path: normalizePath(body.path), source: body.source }]\n }\n case `applyTemplate`: {\n if (typeof body.templateId !== `string`) return [this.invalid(surfaceId, `applyTemplate.templateId is required`)]\n const pkg = this.findPackage(body.templateId, typeof body.packageId === `string` ? body.packageId : undefined)\n if (!pkg) return [{ op: `send`, message: errorMessage(`TEMPLATE_NOT_FOUND`, surfaceId, `no installed package has the template ${body.templateId}`) }]\n const ops: HostOp[] = []\n for (const m of templateMessages(pkg, body.templateId, surfaceId, body.data) ?? []) {\n ops.push(...this.route(m))\n // The surface belongs to the package from its creation on (its\n // function policy and source allowlist apply to the template's own binds).\n const info = this.surfaces.get(surfaceId)\n if (info) info.packageId = pkg.id\n }\n return ops\n }\n }\n return [this.invalid(surfaceId, `unknown message`)]\n }\n\n private findPackage(templateId: string, packageId?: string): AppPackage | undefined {\n if (packageId !== undefined) {\n const pkg = this.packages.get(packageId)\n return pkg && pkg.templates[templateId] ? pkg : undefined\n }\n for (const pkg of this.packages.values()) if (pkg.templates[templateId]) return pkg\n return undefined\n }\n\n private invalid(surfaceId: string, message: string): HostOp {\n return { op: `send`, message: errorMessage(`INVALID_MESSAGE`, surfaceId, message) }\n }\n\n private missing(surfaceId: string): HostOp {\n return { op: `send`, message: errorMessage(`SURFACE_NOT_FOUND`, surfaceId, `no surface ${surfaceId}; send createSurface first`) }\n }\n}\n\n/** Is the message's JSON past `maxMessageBytes`? (A string's UTF-8 size is\n * at most 3 bytes per UTF-16 unit: the exact count only near the limit.) */\nfunction oversized(message: unknown): boolean {\n let text: string | undefined\n try {\n text = JSON.stringify(message)\n } catch {\n return false\n }\n if (text === undefined || text.length * 3 <= MAX_MESSAGE_BYTES) return false\n return text.length > MAX_MESSAGE_BYTES || new TextEncoder().encode(text).length > MAX_MESSAGE_BYTES\n}\n\nfunction surfaceIdOf(message: Record<string, unknown>): string {\n for (const v of Object.values(message)) if (isObject(v) && typeof v.surfaceId === `string`) return v.surfaceId\n return ``\n}\n\n/** A2UI: an omitted path or `/` is the whole data model (`\"\"` in JSON\n * pointer terms, which every surface's setPointer takes). */\nexport function normalizePath(path: string | undefined): string {\n return path === undefined || path === `/` ? `` : path\n}\n",
21
+ "// VAPP-91: the framework-agnostic host runtime for TypeScript renderers.\n// It owns the transport, the router, one SurfaceStore per surface, the\n// source subscriptions, the function registry and the policy hooks; a\n// renderer (React: `@exponential-at/ui-react` `<HostSurface>`) paints a\n// store and hands its interactions back through `dispatch`.\n\nimport { writePointer } from \"../dynamic\"\nimport { reduceSurface } from \"../reducer\"\nimport { tryLoadTheme } from \"../theme\"\nimport type { ResolvedTheme } from \"../theme-types\"\nimport { BUILTIN_THEME_IDS, BUILTIN_THEMES, builtinTheme } from \"../themes\"\nimport type { ExtensionDef, FlatComponent, ReduceIssue, UiNode } from \"../types\"\nimport { RENDER_FAILED, actionMessage, errorMessage } from \"./contract\"\nimport type { ClientMessage, HostOp } from \"./contract\"\nimport { clientCapabilities } from \"./package\"\nimport type { PackageIssue, AppPackage } from \"./package\"\nimport { combineDecisions, decideFunction, decideUrl, mediaRequest, packagePolicy } from \"./policy\"\nimport type { FunctionDecision, FunctionPolicy, MediaOptions, MediaRequest, UrlPolicy } from \"./policy\"\nimport { HostRouter } from \"./router\"\nimport { parseSource } from \"./sources\"\nimport type { SourceResolvers } from \"./sources\"\n\nexport type TransportStatus = `connecting` | `open` | `closed` | `error`\n\n/** Messages in, client messages out. Adapters: `transports.ts`. */\nexport interface Transport {\n /** Start delivering messages; report the connection state. */\n start(receive: (message: unknown) => void, status: (status: TransportStatus, detail?: string) => void): void\n send(message: ClientMessage): void | Promise<void>\n close(): void\n}\n\nexport interface FunctionCallInfo {\n surfaceId: string\n componentId: string\n name: string\n args: Record<string, unknown>\n}\n\nexport type HostFunction = (args: Record<string, unknown>, call: FunctionCallInfo) => unknown | Promise<unknown>\n\nexport interface HostPolicy {\n /** The declarative gate; `ask` decisions go to onFunctionCall. */\n functions?: FunctionPolicy\n /** The consent hook: true runs the call. Unset = `ask` is denied. */\n onFunctionCall?: (call: FunctionCallInfo) => boolean | Promise<boolean>\n urls?: UrlPolicy\n /** Opens an allowed url (default: `window.open(url, \"_blank\")`). */\n openUrl?: (url: string) => void\n media?: MediaOptions\n}\n\nexport interface HostOptions {\n transport?: Transport\n functions?: Record<string, HostFunction>\n sources?: SourceResolvers\n extensions?: readonly ExtensionDef[]\n packages?: readonly AppPackage[]\n policy?: HostPolicy\n /** Every client message that leaves (after the transport got it). */\n onSend?: (message: ClientMessage) => void\n /** Ops the host performs (tests, logging). */\n onOp?: (op: HostOp) => void\n /** Every problem the host meets (a package that failed validation, an\n * error it answered a message with, an invalid surface theme). A\n * transport-less host has no server to tell: this is where they land. */\n onIssue?: (issue: HostIssue) => void\n}\n\n/** One problem the host met; `host.issues` keeps the latest ones. */\nexport interface HostIssue {\n /** A host error code (`TEMPLATE_NOT_FOUND`…) or `PACKAGE_INVALID`. */\n code: string\n message: string\n surfaceId?: string\n /** A JSON pointer (into the package or the message). */\n path?: string\n packageId?: string\n}\n\n/** A package passed in `HostOptions.packages` that failed validation. */\nexport class PackageError extends Error {\n constructor(\n readonly packageId: string,\n readonly issues: PackageIssue[]\n ) {\n super(`exponential-ui: package ${packageId} is unusable: ${issues.map((i) => `${i.path || `/`} ${i.message}`).join(`; `)}`)\n this.name = `PackageError`\n }\n}\n\nconst MAX_ISSUES = 100\n\n/** A `createSurface.theme` (a built-in id or a theme JSON) → the resolved\n * theme, or why it is unusable. */\nexport function resolveSurfaceTheme(input: unknown): { theme: ResolvedTheme | null; issues: string[] } {\n if (typeof input === `string`) {\n if (!BUILTIN_THEME_IDS.includes(input)) return { theme: null, issues: [`unknown built-in theme \"${input}\"; known: ${BUILTIN_THEME_IDS.join(`|`)}`] }\n return { theme: builtinTheme(input), issues: [] }\n }\n const { theme, issues } = tryLoadTheme(input, { themes: BUILTIN_THEMES })\n return { theme, issues: issues.map((i) => (i.path ? `${i.path}: ${i.message}` : i.message)) }\n}\n\nexport interface FunctionOutcome {\n decision: FunctionDecision\n result?: unknown\n error?: string\n}\n\ntype Listener = () => void\n\n/** One surface's state: the flat components, the data model, the reduced\n * tree. Mutations notify subscribers; `root` is reduced lazily. */\nexport class SurfaceStore {\n readonly surfaceId: string\n catalogId: string\n packageId?: string\n sendDataModel = false\n /** The flat components, mutated in place while nothing holds them. */\n private list: FlatComponent[] = []\n /** `list` was handed out (`components`): the next update copies first. */\n private shared = false\n private positions = new Map<string, number>()\n data: Record<string, unknown> = {}\n /** The server's `createSurface.theme`, resolved (undefined = the\n * renderer's own theme). */\n theme?: ResolvedTheme\n private reduced: { root: UiNode | null; issues: ReduceIssue[]; templates?: Record<string, UiNode> } | null = null\n private listeners = new Set<Listener>()\n version = 0\n\n constructor(surfaceId: string, catalogId: string, private extensions: () => readonly ExtensionDef[]) {\n this.surfaceId = surfaceId\n this.catalogId = catalogId\n }\n\n /** The flat components as a SNAPSHOT: an array handed out here is never\n * mutated afterwards (the next update copies first), so a renderer that\n * keeps it sees a stable value; a stream nobody reads stays linear. */\n get components(): readonly FlatComponent[] {\n this.shared = true\n return this.list\n }\n\n /** The flat component with this id (undefined = none). */\n component(id: string): FlatComponent | undefined {\n const at = this.positions.get(id)\n return at === undefined ? undefined : this.list[at]\n }\n\n get root(): UiNode | null {\n return this.reduce().root\n }\n\n get issues(): ReduceIssue[] {\n return this.reduce().issues\n }\n\n /** Round 2 §4: the reducer's lifted data templates (absent without any). */\n get templates(): Record<string, UiNode> | undefined {\n return this.reduce().templates\n }\n\n private reduce() {\n if (!this.reduced)\n this.reduced = this.list.length ? reduceSurface(this.list, { catalogId: this.catalogId, extensions: this.extensions() }) : { root: null, issues: [] }\n return this.reduced\n }\n\n /** A2UI: a later update replaces components BY ID and keeps the rest\n * (an id → position map: a streamed surface costs linear, VAPP-103). */\n setComponents(components: readonly FlatComponent[]): void {\n if (this.shared) {\n this.list = this.list.slice()\n this.shared = false\n }\n for (const c of components) {\n const at = this.positions.get(c.id)\n if (at === undefined) {\n this.positions.set(c.id, this.list.length)\n this.list.push(c)\n } else this.list[at] = c\n }\n this.reduced = null\n this.notify()\n }\n\n /** Re-reduce on the next read (the extension set changed). */\n invalidate(): void {\n this.reduced = null\n this.notify()\n }\n\n /** Write the data model at `pointer` (`undefined` removes); a refused\n * write (writePointer) changes nothing and returns the reason. */\n setData(pointer: string, value: unknown): string | undefined {\n const written = writePointer(this.data, pointer, value)\n if (written.error) return written.error\n this.data = written.data as Record<string, unknown>\n this.notify()\n return undefined\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n notify(): void {\n this.version += 1\n for (const l of [...this.listeners]) l()\n }\n}\n\nexport class ExponentialHost {\n readonly router: HostRouter\n private stores = new Map<string, SurfaceStore>()\n private subscriptions = new Map<string, (() => void)[]>()\n /** Per surface: the FLAT component owning a failed node → that\n * component as it was when it failed + the node ids already reported. */\n private paintErrors = new Map<string, Map<string, { component: FlatComponent | undefined; ids: Set<string> }>>()\n private listeners = new Set<Listener>()\n private functions: Record<string, HostFunction>\n private sources: SourceResolvers\n private extensions: ExtensionDef[]\n status: TransportStatus = `closed`\n statusDetail?: string\n /** The last UNSUPPORTED_CATALOG id seen (the catalog-update banner). */\n unsupportedCatalog?: string\n /** The latest problems (newest last, capped); a new array per change. */\n issues: readonly HostIssue[] = []\n\n constructor(private options: HostOptions = {}) {\n this.extensions = [...(options.extensions ?? [])]\n this.router = new HostRouter({ extensionIds: this.extensions.map((e) => e.id) })\n this.functions = { ...(options.functions ?? {}) }\n this.sources = { ...(options.sources ?? {}) }\n for (const pkg of options.packages ?? []) {\n const issues = this.installPackage(pkg)\n if (issues.length) throw new PackageError(typeof pkg?.id === `string` && pkg.id ? pkg.id : `?`, issues)\n }\n }\n\n /** False for a local-only host (packages, in-memory feeds): no\n * `host_offline` state to show. */\n get hasTransport(): boolean {\n return this.options.transport !== undefined\n }\n\n // --- negotiation + registration ----------------------------------------\n\n get supportedCatalogIds(): string[] {\n return this.router.supportedCatalogIds\n }\n\n clientCapabilities() {\n return clientCapabilities(this.extensions.map((e) => e.id))\n }\n\n get extensionDefs(): readonly ExtensionDef[] {\n return this.extensions\n }\n\n registerExtension(ext: ExtensionDef): void {\n if (this.extensions.some((e) => e.id === ext.id)) return\n this.extensions.push(ext)\n this.router.registerExtension(ext.id)\n for (const store of this.stores.values()) store.invalidate()\n }\n\n registerFunction(name: string, fn: HostFunction): void {\n this.functions[name] = fn\n }\n\n registerSource(scheme: string, resolver: SourceResolvers[string]): void {\n this.sources[scheme.toLowerCase()] = resolver\n }\n\n /** Install a package; its validation issues are returned AND reported\n * (`issues`, `onIssue`). A package with issues is not installed. */\n installPackage(pkg: AppPackage): PackageIssue[] {\n const issues = this.router.installPackage(pkg)\n const packageId = typeof pkg?.id === `string` ? pkg.id : undefined\n for (const i of issues) this.report({ code: `PACKAGE_INVALID`, message: i.message, path: i.path, ...(packageId ? { packageId } : {}) })\n return issues\n }\n\n private report(issue: HostIssue): void {\n const next = [...this.issues, issue]\n this.issues = next.length > MAX_ISSUES ? next.slice(next.length - MAX_ISSUES) : next\n this.options.onIssue?.(issue)\n this.notify()\n }\n\n // --- surfaces -----------------------------------------------------------\n\n surface(id: string): SurfaceStore | undefined {\n return this.stores.get(id)\n }\n\n surfaceIds(): string[] {\n return [...this.stores.keys()]\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n private notify(): void {\n for (const l of [...this.listeners]) l()\n }\n\n // --- transport ----------------------------------------------------------\n\n connect(): void {\n const t = this.options.transport\n if (!t) return\n t.start(\n (m) => this.receive(m),\n (status, detail) => {\n this.status = status\n this.statusDetail = detail\n this.notify()\n }\n )\n }\n\n close(): void {\n this.options.transport?.close()\n for (const id of this.surfaceIds()) this.perform({ op: `delete`, surfaceId: id })\n }\n\n /** One server message (a transport calls this; tests and in-memory hosts\n * may call it directly). */\n receive(message: unknown): HostOp[] {\n const ops = this.router.route(message)\n for (const op of ops) this.perform(op)\n return ops\n }\n\n send(message: ClientMessage): void {\n void this.options.transport?.send(message)\n this.options.onSend?.(message)\n if (`error` in message) {\n const e = message.error\n this.report({ code: e.code, message: e.message, ...(e.surfaceId ? { surfaceId: e.surfaceId } : {}), ...(e.path !== undefined ? { path: e.path } : {}) })\n }\n }\n\n private perform(op: HostOp): void {\n this.options.onOp?.(op)\n switch (op.op) {\n case `create`: {\n this.unbind(op.surfaceId)\n this.forgetPaintErrors(op.surfaceId)\n const store = new SurfaceStore(op.surfaceId, op.catalogId, () => this.extensions)\n store.sendDataModel = op.sendDataModel === true\n store.packageId = this.router.surface(op.surfaceId)?.packageId\n if (op.theme !== undefined && op.theme !== null) {\n const { theme, issues } = resolveSurfaceTheme(op.theme)\n if (theme) store.theme = theme\n else this.send(errorMessage(`VALIDATION_FAILED`, op.surfaceId, `createSurface.theme is unusable: ${issues.join(`; `)}`, `/createSurface/theme`))\n }\n this.stores.set(op.surfaceId, store)\n this.notify()\n return\n }\n case `components`: {\n // An updated component's failures are forgotten (its props\n // changed: it may paint now, or fail anew); the rest stay reported.\n const failed = this.paintErrors.get(op.surfaceId)\n if (failed) for (const c of op.components) failed.delete(c.id)\n this.stores.get(op.surfaceId)?.setComponents(op.components)\n return\n }\n case `data`: {\n const error = this.stores.get(op.surfaceId)?.setData(op.path, op.value)\n if (error) this.send(errorMessage(`VALIDATION_FAILED`, op.surfaceId, error, op.path || `/`))\n return\n }\n case `bind`: {\n const store = this.stores.get(op.surfaceId)\n const source = parseSource(op.source)\n const resolver = source ? this.sources[source.scheme] : undefined\n if (!store || !source) return\n if (!resolver) {\n this.send(errorMessage(`VALIDATION_FAILED`, op.surfaceId, `no resolver for the source scheme ${source.scheme}`, op.path || `/`))\n return\n }\n const cancel = resolver(source, (value) => this.stores.get(op.surfaceId)?.setData(op.path, value))\n if (cancel) this.subscriptions.set(op.surfaceId, [...(this.subscriptions.get(op.surfaceId) ?? []), cancel])\n return\n }\n case `delete`:\n this.unbind(op.surfaceId)\n this.forgetPaintErrors(op.surfaceId)\n this.stores.delete(op.surfaceId)\n this.notify()\n return\n case `send`: {\n const err = `error` in op.message ? op.message.error : undefined\n if (err?.code === `UNSUPPORTED_CATALOG`) {\n this.unsupportedCatalog = err.message.replace(/^catalog (\\S+).*$/, `$1`)\n this.notify()\n }\n this.send(op.message)\n return\n }\n }\n }\n\n private unbind(surfaceId: string): void {\n for (const cancel of this.subscriptions.get(surfaceId) ?? []) cancel()\n this.subscriptions.delete(surfaceId)\n }\n\n // --- interactions out ---------------------------------------------------\n\n /** A component's server event: the A2UI client action message. */\n action(event: { surfaceId: string; componentId: string; name: string; context?: Record<string, unknown>; payload?: Record<string, unknown>; timestamp?: string }): ClientMessage {\n const message = actionMessage({\n name: event.name,\n surfaceId: event.surfaceId,\n sourceComponentId: event.componentId,\n timestamp: event.timestamp ?? new Date().toISOString(),\n context: event.context ?? {},\n payload: event.payload,\n })\n this.send(message)\n return message\n }\n\n /** The policy decision for a call, before any consent hook. */\n decide(surfaceId: string, name: string): FunctionDecision {\n // Own names only: `constructor` is not a registered function (VAPP-107).\n const registered = Object.prototype.hasOwnProperty.call(this.functions, name)\n let decision = decideFunction(this.options.policy?.functions, name, registered)\n const pkgId = this.stores.get(surfaceId)?.packageId\n const pkg = pkgId ? this.router.package(pkgId) : undefined\n if (pkg) decision = combineDecisions(decision, decideFunction(packagePolicy(pkg.functions), name, registered))\n return decision\n }\n\n /** An action `functionCall` to a host function: gate, consent, run. A\n * built-in other than openUrl has no effect as an action. */\n async callFunction(call: FunctionCallInfo): Promise<FunctionOutcome> {\n if (call.name === `openUrl`) {\n const url = typeof call.args.url === `string` ? call.args.url : ``\n return { decision: this.openUrl(url) ? `allow` : `deny` }\n }\n let decision = this.decide(call.surfaceId, call.name)\n if (decision === `not_found`) {\n this.send(errorMessage(`FUNCTION_NOT_FOUND`, call.surfaceId, `no function ${call.name}`))\n return { decision }\n }\n let consentError: string | undefined\n if (decision === `ask`) {\n // A throwing/rejecting consent hook is a deny, never a rejected call\n // (the painter's pending control must settle).\n let ok = false\n try {\n ok = (await this.options.policy?.onFunctionCall?.(call)) === true\n } catch (e) {\n consentError = e instanceof Error ? e.message : String(e)\n }\n if (!ok) decision = `deny`\n }\n if (decision === `deny`) {\n this.send(errorMessage(`FUNCTION_DENIED`, call.surfaceId, consentError === undefined ? `${call.name} was not allowed` : `${call.name} was not allowed: the consent hook failed: ${consentError}`))\n return consentError === undefined ? { decision } : { decision, error: consentError }\n }\n const fn = Object.prototype.hasOwnProperty.call(this.functions, call.name) ? this.functions[call.name] : undefined\n if (!fn) return { decision: `allow` }\n try {\n return { decision: `allow`, result: await fn(call.args, call) }\n } catch (e) {\n return { decision: `allow`, error: e instanceof Error ? e.message : String(e) }\n }\n }\n\n /** The URL policy every href passes (relative urls against the urls' or\n * the media `baseUrl`). */\n urlPolicy(): UrlPolicy {\n return { baseUrl: this.options.policy?.media?.baseUrl, ...this.options.policy?.urls }\n }\n\n /** openUrl / Link through the URL policy. True when it opened. */\n openUrl(url: string): boolean {\n const d = decideUrl(this.urlPolicy(), url)\n if (!d.allowed || !d.url) return false\n const open = this.options.policy?.openUrl ?? ((u: string) => globalThis.window?.open(u, `_blank`, `noopener`))\n open(d.url)\n return true\n }\n\n /** A renderer's painter for `componentId` failed. Reported ONCE per\n * surface + component id (whatever the message) as an A2UI\n * `RENDER_FAILED` error (and so a host issue), and not again until that\n * component's props change (an `updateComponents` naming it, or the\n * surface re-created). A part or template-instance id counts under the\n * flat component it belongs to (`card.body` → `card`), so the record is\n * bounded by the surface's components. */\n paintError(error: { surfaceId: string; componentId: string; message: string }): void {\n const store = this.stores.get(error.surfaceId)\n let owner = error.componentId\n while (store && !store.component(owner) && owner.includes(`.`)) owner = owner.slice(0, owner.lastIndexOf(`.`))\n const current = store?.component(owner)\n let failed = this.paintErrors.get(error.surfaceId)\n if (!failed) this.paintErrors.set(error.surfaceId, (failed = new Map()))\n let entry = failed.get(owner)\n if (!entry || entry.component !== current) failed.set(owner, (entry = { component: current, ids: new Set() }))\n if (entry.ids.has(error.componentId)) return\n entry.ids.add(error.componentId)\n this.send(errorMessage(RENDER_FAILED, error.surfaceId, error.message, `/components/${error.componentId}`))\n }\n\n private forgetPaintErrors(surfaceId: string): void {\n this.paintErrors.delete(surfaceId)\n }\n\n /** The media policy every src passes (`policy.media`). */\n mediaOptions(): MediaOptions | undefined {\n return this.options.policy?.media\n }\n\n /** The image loader's request (absolute url + auth headers). */\n mediaRequest(url: string): MediaRequest | null {\n return mediaRequest(url, this.options.policy?.media)\n }\n}\n",
22
+ "// VAPP-91: the transport adapters the TS SDK ships. Each speaks A2UI\n// messages in and client messages out through the shared decoders; none\n// knows anything about the host behind it. Web platform APIs only (fetch,\n// WebSocket, TextDecoder): browsers, Bun, Node ≥ 22.\n\nimport type { ClientMessage } from \"./contract\"\nimport { JsonlDecoder, SseDecoder, decodeJsonl, mcpActionCall, messagesFromMcpResult } from \"./decoders\"\nimport type { Decoded } from \"./decoders\"\nimport type { Transport, TransportStatus } from \"./runtime\"\n\ntype Receive = (message: unknown) => void\ntype Status = (status: TransportStatus, detail?: string) => void\n\n/** In-memory: `feed` messages in, read what the host sent from `sent`. */\nexport class MemoryTransport implements Transport {\n readonly sent: ClientMessage[] = []\n private receiveFn?: Receive\n private pending: unknown[] = []\n onSend?: (message: ClientMessage) => void\n\n start(receive: Receive, status: Status): void {\n this.receiveFn = receive\n status(`open`)\n const queued = this.pending\n this.pending = []\n queued.forEach(receive)\n }\n\n feed(...messages: unknown[]): void {\n if (!this.receiveFn) this.pending.push(...messages)\n else messages.forEach(this.receiveFn)\n }\n\n /** JSONL text, as a stream server would send it. */\n feedJsonl(text: string): void {\n this.feed(...decodeJsonl(text).messages)\n }\n\n send(message: ClientMessage): void {\n this.sent.push(message)\n this.onSend?.(message)\n }\n\n close(): void {\n this.receiveFn = undefined\n }\n}\n\nexport interface HttpTransportOptions {\n /** The stream to read (GET). */\n url: string\n /** Where client messages go (POST, JSON body); default `url`. */\n postUrl?: string\n headers?: Record<string, string>\n /** Reconnect after a drop (an error or an aborted stream), ms (0 =\n * never). Default 2000. */\n reconnectMs?: number\n /** Reconnect after a CLEAN end of the stream too (the server resumes it).\n * Default false: a stream that ends is done (status `closed`). An SSE\n * stream that sent a `retry:` field signals this itself. */\n resumable?: boolean\n fetch?: typeof fetch\n}\n\nabstract class StreamTransport implements Transport {\n private controller?: AbortController\n /** Bumped by every start/close: a loop whose generation is stale exits\n * (an old loop asleep in its reconnect wait never runs beside a new\n * one). */\n private generation = 0\n\n constructor(protected options: HttpTransportOptions) {}\n\n protected abstract decoder(): { push(chunk: string): Decoded; end(): Decoded; retryMs?: number }\n protected abstract accept(): string\n\n start(receive: Receive, status: Status): void {\n this.controller?.abort()\n const gen = ++this.generation\n void this.run(gen, receive, status)\n }\n\n private async run(gen: number, receive: Receive, status: Status): Promise<void> {\n const f = this.options.fetch ?? fetch\n const live = () => gen === this.generation\n while (live()) {\n const controller = new AbortController()\n this.controller = controller\n status(`connecting`)\n let wait = this.options.reconnectMs ?? 2000\n try {\n const res = await f(this.options.url, { headers: { accept: this.accept(), ...this.options.headers }, signal: controller.signal })\n if (!live()) return\n if (!res.ok || !res.body) throw new Error(`HTTP ${res.status}`)\n status(`open`)\n const reader = res.body.getReader()\n const text = new TextDecoder()\n const dec = this.decoder()\n for (;;) {\n const { done, value } = await reader.read()\n if (!live()) return\n if (done) break\n dec.push(text.decode(value, { stream: true })).messages.forEach(receive)\n }\n dec.end().messages.forEach(receive)\n status(`closed`)\n // A clean end: done, unless the server said it resumes the stream.\n const resumable = this.options.resumable === true || dec.retryMs !== undefined\n if (!resumable) {\n if (live()) this.generation += 1\n return\n }\n if (dec.retryMs !== undefined && this.options.reconnectMs === undefined) wait = dec.retryMs\n } catch (e) {\n if (!live()) return\n status(`error`, e instanceof Error ? e.message : String(e))\n }\n if (!wait || !live()) return\n await new Promise((r) => setTimeout(r, wait))\n }\n }\n\n async send(message: ClientMessage): Promise<void> {\n const f = this.options.fetch ?? fetch\n await f(this.options.postUrl ?? this.options.url, { method: `POST`, headers: { \"content-type\": `application/json`, ...this.options.headers }, body: JSON.stringify(message) })\n }\n\n close(): void {\n this.generation += 1\n this.controller?.abort()\n }\n}\n\n/** A2UI JSONL over a streamed HTTP response (`application/jsonl`). */\nexport class JsonlStreamTransport extends StreamTransport {\n protected decoder() {\n return new JsonlDecoder()\n }\n protected accept() {\n return `application/jsonl, application/x-ndjson`\n }\n}\n\n/** Server-Sent Events read through fetch (headers allowed, unlike\n * EventSource). */\nexport class SseTransport extends StreamTransport {\n protected decoder() {\n return new SseDecoder()\n }\n protected accept() {\n return `text/event-stream`\n }\n}\n\n/** One A2UI message (or JSONL) per frame; client messages go back as\n * frames. */\nexport class WebSocketTransport implements Transport {\n private socket?: WebSocket\n /** Bumped by every start/close: a stale socket's reconnect timer is a\n * no-op. */\n private generation = 0\n\n constructor(private options: { url: string; protocols?: string | string[]; reconnectMs?: number; WebSocket?: typeof WebSocket }) {}\n\n start(receive: Receive, status: Status): void {\n const gen = ++this.generation\n const live = () => gen === this.generation\n const WS = this.options.WebSocket ?? WebSocket\n status(`connecting`)\n const socket = new WS(this.options.url, this.options.protocols)\n this.socket = socket\n socket.onopen = () => live() && status(`open`)\n socket.onmessage = (ev) => {\n if (live() && typeof ev.data === `string`) decodeJsonl(ev.data).messages.forEach(receive)\n }\n socket.onerror = () => live() && status(`error`, `websocket error`)\n socket.onclose = () => {\n if (!live()) return\n status(`closed`)\n const wait = this.options.reconnectMs ?? 2000\n if (wait) setTimeout(() => live() && this.start(receive, status), wait)\n }\n }\n\n send(message: ClientMessage): void {\n if (this.socket?.readyState === 1) this.socket.send(JSON.stringify(message))\n }\n\n close(): void {\n this.generation += 1\n this.socket?.close()\n }\n}\n\nexport interface McpTransportOptions {\n /** The MCP server's streamable-HTTP endpoint. */\n url: string\n /** The tool whose result carries the surface (called once at start). */\n tool: string\n arguments?: Record<string, unknown>\n /** The tool client messages go to; default `a2ui_event`. */\n actionTool?: string\n headers?: Record<string, string>\n fetch?: typeof fetch\n}\n\n/** A2UI over MCP: calls `tool`, delivers the A2UI resources in its result,\n * and sends every client message as a tools/call to `actionTool` (its\n * result may carry more messages). JSON-RPC over plain POST; an SSE\n * response body is read through the SSE decoder. */\nexport class McpTransport implements Transport {\n private id = 0\n private receiveFn?: Receive\n private session?: string\n\n constructor(private options: McpTransportOptions) {}\n\n start(receive: Receive, status: Status): void {\n this.receiveFn = receive\n status(`connecting`)\n void (async () => {\n try {\n await this.rpc(`initialize`, { protocolVersion: `2025-06-18`, capabilities: {}, clientInfo: { name: `exponential-ui`, version: `0.1.0` } })\n const result = await this.rpc(`tools/call`, { name: this.options.tool, arguments: this.options.arguments ?? {} })\n status(`open`)\n messagesFromMcpResult(result).messages.forEach(receive)\n } catch (e) {\n status(`error`, e instanceof Error ? e.message : String(e))\n }\n })()\n }\n\n async send(message: ClientMessage): Promise<void> {\n const call = mcpActionCall(message, this.options.actionTool)\n const result = await this.rpc(call.method, call.params)\n if (this.receiveFn) messagesFromMcpResult(result).messages.forEach(this.receiveFn)\n }\n\n close(): void {\n this.receiveFn = undefined\n }\n\n private async rpc(method: string, params: unknown): Promise<unknown> {\n const f = this.options.fetch ?? fetch\n const id = ++this.id\n const res = await f(this.options.url, {\n method: `POST`,\n headers: { \"content-type\": `application/json`, accept: `application/json, text/event-stream`, ...(this.session ? { \"mcp-session-id\": this.session } : {}), ...this.options.headers },\n body: JSON.stringify({ jsonrpc: `2.0`, id, method, params }),\n })\n const session = res.headers.get(`mcp-session-id`)\n if (session) this.session = session\n if (!res.ok) throw new Error(`MCP HTTP ${res.status}`)\n const type = res.headers.get(`content-type`) ?? ``\n const body = await res.text()\n const replies = type.includes(`text/event-stream`) ? (() => {\n const d = new SseDecoder()\n return [...d.push(body).messages, ...d.end().messages]\n })() : [JSON.parse(body)]\n const reply = replies.find((r) => (r as { id?: number })?.id === id) as { result?: unknown; error?: { message?: string } } | undefined\n if (!reply) throw new Error(`MCP: no reply to ${method}`)\n if (reply.error) throw new Error(`MCP: ${reply.error.message ?? `error`}`)\n return reply.result\n }\n}\n"
23
+ ],
24
+ "mappings": "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",
25
+ "debugId": "10AAE9080E35A11264756E2164756E21",
26
+ "names": []
27
+ }