@exponential_app/eui 0.0.0-stage → 0.2.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 (272) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +377 -2
  4. package/catalog/a11y.json +705 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +5190 -0
  8. package/catalog/core.schema.json +24542 -0
  9. package/catalog/host.json +95 -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 +4152 -0
  14. package/catalog/recipes.json +64 -0
  15. package/catalog/strings.json +84 -0
  16. package/catalog/style.json +180 -0
  17. package/catalog/theme.schema.json +47754 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +218 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +699 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +97 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +157 -0
  27. package/conformance/manifest.json +233 -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/conformance/voice-wave-child.ts +102 -0
  36. package/dist/chunks/index-5fmaa0xq.js +8384 -0
  37. package/dist/chunks/index-5fmaa0xq.js.map +10 -0
  38. package/dist/chunks/index-62yzr94z.js +2784 -0
  39. package/dist/chunks/index-62yzr94z.js.map +10 -0
  40. package/dist/chunks/index-bg2jsgjq.js +8541 -0
  41. package/dist/chunks/index-bg2jsgjq.js.map +15 -0
  42. package/dist/chunks/index-fy7y2nz8.js +186 -0
  43. package/dist/chunks/index-fy7y2nz8.js.map +9 -0
  44. package/dist/chunks/index-gtk2gwsb.js +4555 -0
  45. package/dist/chunks/index-gtk2gwsb.js.map +31 -0
  46. package/dist/chunks/index-t6qz1770.js +95 -0
  47. package/dist/chunks/index-t6qz1770.js.map +11 -0
  48. package/dist/conformance.js +230462 -0
  49. package/dist/conformance.js.map +10 -0
  50. package/dist/entries/prompt.js +251 -0
  51. package/dist/entries/prompt.js.map +11 -0
  52. package/dist/entries/schema.js +1725 -0
  53. package/dist/entries/schema.js.map +11 -0
  54. package/dist/host/index.js +194 -0
  55. package/dist/host/index.js.map +9 -0
  56. package/dist/index.js +3840 -0
  57. package/dist/index.js.map +29 -0
  58. package/dist/types/src/a11y.d.ts +21 -0
  59. package/dist/types/src/animation.d.ts +76 -0
  60. package/dist/types/src/basic-map.d.ts +38 -0
  61. package/dist/types/src/builder.d.ts +50 -0
  62. package/dist/types/src/catalog.d.ts +54 -0
  63. package/dist/types/src/catalog.described.d.ts +33 -0
  64. package/dist/types/src/catalog.generated.d.ts +904 -0
  65. package/dist/types/src/chart.d.ts +46 -0
  66. package/dist/types/src/code.d.ts +44 -0
  67. package/dist/types/src/color.d.ts +20 -0
  68. package/dist/types/src/conformance.d.ts +39 -0
  69. package/dist/types/src/connector/app.d.ts +14 -0
  70. package/dist/types/src/connector/connector.d.ts +77 -0
  71. package/dist/types/src/connector/index.d.ts +4 -0
  72. package/dist/types/src/css.d.ts +27 -0
  73. package/dist/types/src/define.d.ts +66 -0
  74. package/dist/types/src/direction.d.ts +16 -0
  75. package/dist/types/src/dynamic.d.ts +161 -0
  76. package/dist/types/src/entries/prompt.d.ts +11 -0
  77. package/dist/types/src/entries/schema.d.ts +8 -0
  78. package/dist/types/src/expr.d.ts +71 -0
  79. package/dist/types/src/extension.d.ts +4 -0
  80. package/dist/types/src/format.d.ts +112 -0
  81. package/dist/types/src/geometry.d.ts +40 -0
  82. package/dist/types/src/host/contract.d.ts +225 -0
  83. package/dist/types/src/host/decoders.d.ts +61 -0
  84. package/dist/types/src/host/index.d.ts +15 -0
  85. package/dist/types/src/host/package.d.ts +102 -0
  86. package/dist/types/src/host/policy.d.ts +107 -0
  87. package/dist/types/src/host/record-store.d.ts +103 -0
  88. package/dist/types/src/host/records.d.ts +45 -0
  89. package/dist/types/src/host/router.d.ts +38 -0
  90. package/dist/types/src/host/runtime.d.ts +213 -0
  91. package/dist/types/src/host/signature.d.ts +52 -0
  92. package/dist/types/src/host/sources.d.ts +22 -0
  93. package/dist/types/src/host/tools.d.ts +42 -0
  94. package/dist/types/src/host/transports.d.ts +109 -0
  95. package/dist/types/src/index.d.ts +69 -0
  96. package/dist/types/src/layout.d.ts +20 -0
  97. package/dist/types/src/limits.d.ts +21 -0
  98. package/dist/types/src/list.d.ts +133 -0
  99. package/dist/types/src/locale.d.ts +22 -0
  100. package/dist/types/src/macros.d.ts +29 -0
  101. package/dist/types/src/overlay.d.ts +27 -0
  102. package/dist/types/src/prompt.d.ts +44 -0
  103. package/dist/types/src/qr-code.d.ts +30 -0
  104. package/dist/types/src/recipes.d.ts +17 -0
  105. package/dist/types/src/reducer.d.ts +41 -0
  106. package/dist/types/src/resizable.d.ts +38 -0
  107. package/dist/types/src/schema.d.ts +7 -0
  108. package/dist/types/src/strings.d.ts +13 -0
  109. package/dist/types/src/style.d.ts +201 -0
  110. package/dist/types/src/test-preload.d.ts +1 -0
  111. package/dist/types/src/text-shimmer.d.ts +24 -0
  112. package/dist/types/src/theme-types.d.ts +162 -0
  113. package/dist/types/src/theme.d.ts +75 -0
  114. package/dist/types/src/themes.d.ts +22 -0
  115. package/dist/types/src/tree-guides.d.ts +17 -0
  116. package/dist/types/src/types.d.ts +320 -0
  117. package/dist/types/src/validate.d.ts +31 -0
  118. package/dist/types/src/voice-wave.d.ts +181 -0
  119. package/dist/types/src/web/base-css.d.ts +1 -0
  120. package/dist/types/src/web/box-css.d.ts +63 -0
  121. package/dist/types/src/web/coerce.d.ts +32 -0
  122. package/dist/types/src/web/custom-icons.generated.d.ts +4 -0
  123. package/dist/types/src/web/data.d.ts +107 -0
  124. package/dist/types/src/web/dates.d.ts +12 -0
  125. package/dist/types/src/web/form.d.ts +44 -0
  126. package/dist/types/src/web/host-types.d.ts +126 -0
  127. package/dist/types/src/web/index.d.ts +35 -0
  128. package/dist/types/src/web/inputs.d.ts +55 -0
  129. package/dist/types/src/web/list.d.ts +16 -0
  130. package/dist/types/src/web/listbox.d.ts +14 -0
  131. package/dist/types/src/web/markdown.d.ts +96 -0
  132. package/dist/types/src/web/media.d.ts +63 -0
  133. package/dist/types/src/web/parts.d.ts +4 -0
  134. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  135. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  136. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  137. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  138. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  139. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  140. package/dist/types/src/web/primitives/button.d.ts +6 -0
  141. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  142. package/dist/types/src/web/primitives/card.d.ts +9 -0
  143. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  144. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  145. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  146. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  147. package/dist/types/src/web/primitives/command.d.ts +134 -0
  148. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  149. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  150. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  151. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  152. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  153. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  154. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  155. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  156. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  157. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  158. package/dist/types/src/web/primitives/index.d.ts +50 -0
  159. package/dist/types/src/web/primitives/input.d.ts +5 -0
  160. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  161. package/dist/types/src/web/primitives/label.d.ts +3 -0
  162. package/dist/types/src/web/primitives/measure.d.ts +16 -0
  163. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  164. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  165. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  166. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  167. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  168. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  169. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  170. package/dist/types/src/web/primitives/select.d.ts +47 -0
  171. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  172. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  173. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  174. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  175. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  176. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  177. package/dist/types/src/web/primitives/table.d.ts +11 -0
  178. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  179. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  180. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  181. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  182. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  183. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  184. package/dist/types/src/web/primitives/voice-wave.d.ts +50 -0
  185. package/dist/types/src/web/round5.d.ts +107 -0
  186. package/dist/types/src/web/share.d.ts +6 -0
  187. package/dist/types/src/web/table.d.ts +20 -0
  188. package/dist/types/src/web/theme-css.d.ts +69 -0
  189. package/dist/types/src/web/urls.d.ts +21 -0
  190. package/dist/web/index.js +2565 -0
  191. package/dist/web/index.js.map +28 -0
  192. package/dist/web/primitives/index.js +1476 -0
  193. package/dist/web/primitives/index.js.map +57 -0
  194. package/docs/components.generated.json +6783 -0
  195. package/docs/package-format.md +182 -0
  196. package/docs/round-1-contract.md +679 -0
  197. package/docs/round-2-contract.md +476 -0
  198. package/docs/round-3-contract.md +174 -0
  199. package/docs/round-5-contract.md +268 -0
  200. package/docs/themes.generated.json +3647 -0
  201. package/fixtures/animations.json +2890 -0
  202. package/fixtures/bench-list.json +58 -0
  203. package/fixtures/bind-time.json +54734 -0
  204. package/fixtures/catalog-basic-map.json +1692 -0
  205. package/fixtures/catalog-components.json +10293 -0
  206. package/fixtures/catalog-extension.json +620 -0
  207. package/fixtures/catalog-macros.json +51805 -0
  208. package/fixtures/code-tokens.json +1993 -0
  209. package/fixtures/conformance-baseline.json +59016 -0
  210. package/fixtures/conformance-cases.json +49 -0
  211. package/fixtures/conformance-known.json +2111 -0
  212. package/fixtures/control-geometry.json +5129 -0
  213. package/fixtures/dashboard.data.json +74 -0
  214. package/fixtures/dashboard.json +781 -0
  215. package/fixtures/demo-surface.json +47 -0
  216. package/fixtures/format.json +870 -0
  217. package/fixtures/host-package.json +1262 -0
  218. package/fixtures/host-policy.json +1209 -0
  219. package/fixtures/host-router.json +2034 -0
  220. package/fixtures/host-transport.json +590 -0
  221. package/fixtures/interactions-round1.json +1058 -0
  222. package/fixtures/kitchen-sink.expanded.json +11972 -0
  223. package/fixtures/kitchen-sink.json +3140 -0
  224. package/fixtures/layout-geometry-round1.json +7278 -0
  225. package/fixtures/layout-geometry.json +2072 -0
  226. package/fixtures/overlay-geometry.json +272 -0
  227. package/fixtures/pointer.json +89 -0
  228. package/fixtures/primitive-specimens.json +59 -0
  229. package/fixtures/prompt-budget.json +33 -0
  230. package/fixtures/qr-code.json +480 -0
  231. package/fixtures/resizable.json +714 -0
  232. package/fixtures/round4-contract.json +2985 -0
  233. package/fixtures/specimens.json +11168 -0
  234. package/fixtures/style-conditions.json +336 -0
  235. package/fixtures/template-items.json +2215 -0
  236. package/fixtures/text-direction.json +309 -0
  237. package/fixtures/text-shimmer.json +96 -0
  238. package/fixtures/theme-extends.json +573 -0
  239. package/fixtures/theme-invalid.json +1300 -0
  240. package/fixtures/theme-recipes.json +61762 -0
  241. package/fixtures/theme-resolved.json +25969 -0
  242. package/fixtures/toast-stack.json +215 -0
  243. package/fixtures/tree-guides.json +224 -0
  244. package/fixtures/virtual-list.json +733 -0
  245. package/fixtures/voice-wave.json +19236 -0
  246. package/generated/ExponentialUICatalog.generated.kt +67 -0
  247. package/generated/ExponentialUICatalog.generated.swift +67 -0
  248. package/generated/ExponentialUIThemes.generated.kt +23 -0
  249. package/generated/ExponentialUIThemes.generated.swift +23 -0
  250. package/generated/catalog.descriptions.generated.rs +6 -0
  251. package/generated/catalog.generated.rs +80 -0
  252. package/generated/catalog.themes.generated.rs +34 -0
  253. package/generated/core.descriptions.json +2726 -0
  254. package/generated/core.runtime.json +3944 -0
  255. package/package.json +87 -4
  256. package/themes/exponential.recipes.json +49 -0
  257. package/themes/exponential.theme.json +768 -0
  258. package/themes/neutral.theme.json +6178 -0
  259. package/themes/orange.theme.json +43 -0
  260. package/themes/playful.theme.json +219 -0
  261. package/vendor/a2ui/LICENSE.txt +203 -0
  262. package/vendor/a2ui/README.md +27 -0
  263. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  264. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  265. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  266. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  267. package/vendor/a2ui/v0_9/common_types.json +315 -0
  268. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  269. package/vendor/json-render/LICENSE.txt +201 -0
  270. package/vendor/json-render/README.md +13 -0
  271. package/vendor/nayuki-qr/LICENSE.txt +20 -0
  272. package/vendor/nayuki-qr/README.md +10 -0
@@ -0,0 +1,1262 @@
1
+ {
2
+ "$comment": "VAPP-161: the package format's pure rules beyond validation (docs/package-format.md; validation is fixtures/host-router.json). Inputs hand-written; `expected` (and `signed`, `signedText`) filled by scripts/generate-host.ts from src/host/ (record-store.ts, tools.ts, signature.ts), except `signatures[].expected`, which is hand-written and checked by the TS test against verifyPackageFile (WebCrypto is async; the generator signs with node:crypto). `recordsQuery`: parseRecordsSource(parseSource(source)) (null = not a records source). `recordsValue`: recordsValue(rows, parseRecordsSource(parseSource(source)), {me, names}). `consent`: toolConsent(package) and toolConsentKey per tool (`keys`, by id). `toolCalls`: toolCall(name). `extensions`: validatePackage(a one-template package with these `extensions`, catalogIds, available). `canonical`: canonicalJson(JSON.parse(text)) (RFC 8785; the input stays text so `1.0`, `-0.0` and escapes survive the generator). `signatures`: `file` signed with `key.seed` as `key.name` when `sign` (then `tamper` = [pointer, value] pairs applied), the result as `signed`; `signedText` = the context + the canonical JSON the signature covers (what a host's own Ed25519 signs and verifies); `expected` = verifyPackageFile(signed). The key is the RFC 8032 §7.1 TEST 1 keypair: public, NEVER a real author's. The Rust core replays recordsQuery, consent, toolCalls, extensions, canonical and signedText.",
3
+ "key": {
4
+ "name": "Test Author",
5
+ "seed": "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60",
6
+ "publicKey": "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"
7
+ },
8
+ "recordsQuery": [
9
+ {
10
+ "source": "records:entry",
11
+ "expected": {
12
+ "kind": "entry",
13
+ "mine": false,
14
+ "sort": "createdAt",
15
+ "order": "desc",
16
+ "limit": 100,
17
+ "filters": []
18
+ }
19
+ },
20
+ {
21
+ "source": "records:entry?mine=1&sort=date&order=asc&limit=900&hours.gte=2&note=a&sum=hours&app=other",
22
+ "expected": {
23
+ "kind": "entry",
24
+ "mine": true,
25
+ "sort": "date",
26
+ "order": "asc",
27
+ "limit": 500,
28
+ "filters": [
29
+ {
30
+ "field": "hours",
31
+ "op": "gte",
32
+ "value": "2"
33
+ },
34
+ {
35
+ "field": "note",
36
+ "op": "eq",
37
+ "value": "a"
38
+ }
39
+ ]
40
+ }
41
+ },
42
+ {
43
+ "source": "records:entry?limit=0&order=up&kind=todo",
44
+ "expected": {
45
+ "kind": "entry",
46
+ "mine": false,
47
+ "sort": "createdAt",
48
+ "order": "desc",
49
+ "limit": 100,
50
+ "filters": []
51
+ }
52
+ },
53
+ {
54
+ "source": "RECORDS:todo?done=false",
55
+ "expected": {
56
+ "kind": "todo",
57
+ "mine": false,
58
+ "sort": "createdAt",
59
+ "order": "desc",
60
+ "limit": 100,
61
+ "filters": [
62
+ {
63
+ "field": "done",
64
+ "op": "eq",
65
+ "value": "false"
66
+ }
67
+ ]
68
+ }
69
+ },
70
+ {
71
+ "source": "exp:records?kind=entry",
72
+ "expected": null
73
+ }
74
+ ],
75
+ "recordsValue": [
76
+ {
77
+ "name": "newest first, ties by id",
78
+ "source": "records:entry",
79
+ "me": "u1",
80
+ "rows": [
81
+ {
82
+ "id": "r1",
83
+ "kind": "entry",
84
+ "data": {
85
+ "date": "2026-10-01",
86
+ "hours": 3,
87
+ "note": "a"
88
+ },
89
+ "createdBy": "u1",
90
+ "createdAt": "2026-10-01T09:00:00Z",
91
+ "updatedAt": "2026-10-01T09:00:00Z"
92
+ },
93
+ {
94
+ "id": "r2",
95
+ "kind": "entry",
96
+ "data": {
97
+ "date": "2026-10-02",
98
+ "hours": 10,
99
+ "note": "b"
100
+ },
101
+ "createdBy": "u2",
102
+ "createdAt": "2026-10-02T09:00:00Z",
103
+ "updatedAt": "2026-10-03T09:00:00Z"
104
+ },
105
+ {
106
+ "id": "r3",
107
+ "kind": "entry",
108
+ "data": {
109
+ "date": "2026-10-02",
110
+ "hours": 2
111
+ },
112
+ "createdBy": "u1",
113
+ "createdAt": "2026-10-02T09:00:00Z",
114
+ "updatedAt": "2026-10-02T09:00:00Z"
115
+ },
116
+ {
117
+ "id": "r4",
118
+ "kind": "todo",
119
+ "data": {
120
+ "title": "x",
121
+ "done": false
122
+ },
123
+ "createdBy": "u1",
124
+ "createdAt": "2026-10-04T09:00:00Z",
125
+ "updatedAt": "2026-10-04T09:00:00Z"
126
+ }
127
+ ],
128
+ "names": {
129
+ "u1": "Ada"
130
+ },
131
+ "expected": {
132
+ "rows": [
133
+ {
134
+ "date": "2026-10-02",
135
+ "hours": 10,
136
+ "note": "b",
137
+ "id": "r2",
138
+ "createdAt": "2026-10-02T09:00:00Z",
139
+ "updatedAt": "2026-10-03T09:00:00Z",
140
+ "createdBy": "u2",
141
+ "author": ""
142
+ },
143
+ {
144
+ "date": "2026-10-02",
145
+ "hours": 2,
146
+ "id": "r3",
147
+ "createdAt": "2026-10-02T09:00:00Z",
148
+ "updatedAt": "2026-10-02T09:00:00Z",
149
+ "createdBy": "u1",
150
+ "author": "Ada"
151
+ },
152
+ {
153
+ "date": "2026-10-01",
154
+ "hours": 3,
155
+ "note": "a",
156
+ "id": "r1",
157
+ "createdAt": "2026-10-01T09:00:00Z",
158
+ "updatedAt": "2026-10-01T09:00:00Z",
159
+ "createdBy": "u1",
160
+ "author": "Ada"
161
+ }
162
+ ],
163
+ "count": 3
164
+ }
165
+ },
166
+ {
167
+ "name": "mine, by hours ascending",
168
+ "source": "records:entry?mine=1&sort=hours&order=asc",
169
+ "me": "u1",
170
+ "rows": [
171
+ {
172
+ "id": "r1",
173
+ "kind": "entry",
174
+ "data": {
175
+ "date": "2026-10-01",
176
+ "hours": 3,
177
+ "note": "a"
178
+ },
179
+ "createdBy": "u1",
180
+ "createdAt": "2026-10-01T09:00:00Z",
181
+ "updatedAt": "2026-10-01T09:00:00Z"
182
+ },
183
+ {
184
+ "id": "r2",
185
+ "kind": "entry",
186
+ "data": {
187
+ "date": "2026-10-02",
188
+ "hours": 10,
189
+ "note": "b"
190
+ },
191
+ "createdBy": "u2",
192
+ "createdAt": "2026-10-02T09:00:00Z",
193
+ "updatedAt": "2026-10-03T09:00:00Z"
194
+ },
195
+ {
196
+ "id": "r3",
197
+ "kind": "entry",
198
+ "data": {
199
+ "date": "2026-10-02",
200
+ "hours": 2
201
+ },
202
+ "createdBy": "u1",
203
+ "createdAt": "2026-10-02T09:00:00Z",
204
+ "updatedAt": "2026-10-02T09:00:00Z"
205
+ },
206
+ {
207
+ "id": "r4",
208
+ "kind": "todo",
209
+ "data": {
210
+ "title": "x",
211
+ "done": false
212
+ },
213
+ "createdBy": "u1",
214
+ "createdAt": "2026-10-04T09:00:00Z",
215
+ "updatedAt": "2026-10-04T09:00:00Z"
216
+ }
217
+ ],
218
+ "names": {
219
+ "u1": "Ada"
220
+ },
221
+ "expected": {
222
+ "rows": [
223
+ {
224
+ "date": "2026-10-02",
225
+ "hours": 2,
226
+ "id": "r3",
227
+ "createdAt": "2026-10-02T09:00:00Z",
228
+ "updatedAt": "2026-10-02T09:00:00Z",
229
+ "createdBy": "u1",
230
+ "author": "Ada"
231
+ },
232
+ {
233
+ "date": "2026-10-01",
234
+ "hours": 3,
235
+ "note": "a",
236
+ "id": "r1",
237
+ "createdAt": "2026-10-01T09:00:00Z",
238
+ "updatedAt": "2026-10-01T09:00:00Z",
239
+ "createdBy": "u1",
240
+ "author": "Ada"
241
+ }
242
+ ],
243
+ "count": 2
244
+ }
245
+ },
246
+ {
247
+ "name": "signed out: mine matches nothing",
248
+ "source": "records:entry?mine=1",
249
+ "me": null,
250
+ "rows": [
251
+ {
252
+ "id": "r1",
253
+ "kind": "entry",
254
+ "data": {
255
+ "date": "2026-10-01",
256
+ "hours": 3,
257
+ "note": "a"
258
+ },
259
+ "createdBy": "u1",
260
+ "createdAt": "2026-10-01T09:00:00Z",
261
+ "updatedAt": "2026-10-01T09:00:00Z"
262
+ },
263
+ {
264
+ "id": "r2",
265
+ "kind": "entry",
266
+ "data": {
267
+ "date": "2026-10-02",
268
+ "hours": 10,
269
+ "note": "b"
270
+ },
271
+ "createdBy": "u2",
272
+ "createdAt": "2026-10-02T09:00:00Z",
273
+ "updatedAt": "2026-10-03T09:00:00Z"
274
+ },
275
+ {
276
+ "id": "r3",
277
+ "kind": "entry",
278
+ "data": {
279
+ "date": "2026-10-02",
280
+ "hours": 2
281
+ },
282
+ "createdBy": "u1",
283
+ "createdAt": "2026-10-02T09:00:00Z",
284
+ "updatedAt": "2026-10-02T09:00:00Z"
285
+ },
286
+ {
287
+ "id": "r4",
288
+ "kind": "todo",
289
+ "data": {
290
+ "title": "x",
291
+ "done": false
292
+ },
293
+ "createdBy": "u1",
294
+ "createdAt": "2026-10-04T09:00:00Z",
295
+ "updatedAt": "2026-10-04T09:00:00Z"
296
+ }
297
+ ],
298
+ "names": {},
299
+ "expected": {
300
+ "rows": [],
301
+ "count": 0
302
+ }
303
+ },
304
+ {
305
+ "name": "number and text filters, a limit",
306
+ "source": "records:entry?hours.gt=2&date=2026-10-02&limit=1",
307
+ "me": "u1",
308
+ "rows": [
309
+ {
310
+ "id": "r1",
311
+ "kind": "entry",
312
+ "data": {
313
+ "date": "2026-10-01",
314
+ "hours": 3,
315
+ "note": "a"
316
+ },
317
+ "createdBy": "u1",
318
+ "createdAt": "2026-10-01T09:00:00Z",
319
+ "updatedAt": "2026-10-01T09:00:00Z"
320
+ },
321
+ {
322
+ "id": "r2",
323
+ "kind": "entry",
324
+ "data": {
325
+ "date": "2026-10-02",
326
+ "hours": 10,
327
+ "note": "b"
328
+ },
329
+ "createdBy": "u2",
330
+ "createdAt": "2026-10-02T09:00:00Z",
331
+ "updatedAt": "2026-10-03T09:00:00Z"
332
+ },
333
+ {
334
+ "id": "r3",
335
+ "kind": "entry",
336
+ "data": {
337
+ "date": "2026-10-02",
338
+ "hours": 2
339
+ },
340
+ "createdBy": "u1",
341
+ "createdAt": "2026-10-02T09:00:00Z",
342
+ "updatedAt": "2026-10-02T09:00:00Z"
343
+ },
344
+ {
345
+ "id": "r4",
346
+ "kind": "todo",
347
+ "data": {
348
+ "title": "x",
349
+ "done": false
350
+ },
351
+ "createdBy": "u1",
352
+ "createdAt": "2026-10-04T09:00:00Z",
353
+ "updatedAt": "2026-10-04T09:00:00Z"
354
+ }
355
+ ],
356
+ "names": {},
357
+ "expected": {
358
+ "rows": [
359
+ {
360
+ "date": "2026-10-02",
361
+ "hours": 10,
362
+ "note": "b",
363
+ "id": "r2",
364
+ "createdAt": "2026-10-02T09:00:00Z",
365
+ "updatedAt": "2026-10-03T09:00:00Z",
366
+ "createdBy": "u2",
367
+ "author": ""
368
+ }
369
+ ],
370
+ "count": 1
371
+ }
372
+ },
373
+ {
374
+ "name": "a reserved key never filters",
375
+ "source": "records:todo?sum=x&month=2026-10",
376
+ "me": "u1",
377
+ "rows": [
378
+ {
379
+ "id": "r1",
380
+ "kind": "entry",
381
+ "data": {
382
+ "date": "2026-10-01",
383
+ "hours": 3,
384
+ "note": "a"
385
+ },
386
+ "createdBy": "u1",
387
+ "createdAt": "2026-10-01T09:00:00Z",
388
+ "updatedAt": "2026-10-01T09:00:00Z"
389
+ },
390
+ {
391
+ "id": "r2",
392
+ "kind": "entry",
393
+ "data": {
394
+ "date": "2026-10-02",
395
+ "hours": 10,
396
+ "note": "b"
397
+ },
398
+ "createdBy": "u2",
399
+ "createdAt": "2026-10-02T09:00:00Z",
400
+ "updatedAt": "2026-10-03T09:00:00Z"
401
+ },
402
+ {
403
+ "id": "r3",
404
+ "kind": "entry",
405
+ "data": {
406
+ "date": "2026-10-02",
407
+ "hours": 2
408
+ },
409
+ "createdBy": "u1",
410
+ "createdAt": "2026-10-02T09:00:00Z",
411
+ "updatedAt": "2026-10-02T09:00:00Z"
412
+ },
413
+ {
414
+ "id": "r4",
415
+ "kind": "todo",
416
+ "data": {
417
+ "title": "x",
418
+ "done": false
419
+ },
420
+ "createdBy": "u1",
421
+ "createdAt": "2026-10-04T09:00:00Z",
422
+ "updatedAt": "2026-10-04T09:00:00Z"
423
+ }
424
+ ],
425
+ "names": {},
426
+ "expected": {
427
+ "rows": [
428
+ {
429
+ "title": "x",
430
+ "done": false,
431
+ "id": "r4",
432
+ "createdAt": "2026-10-04T09:00:00Z",
433
+ "updatedAt": "2026-10-04T09:00:00Z",
434
+ "createdBy": "u1",
435
+ "author": ""
436
+ }
437
+ ],
438
+ "count": 1
439
+ }
440
+ }
441
+ ],
442
+ "consent": [
443
+ {
444
+ "package": {
445
+ "tools": {
446
+ "weather": {
447
+ "kind": "mcp",
448
+ "title": "Weather",
449
+ "url": "https://mcp.example.com/weather"
450
+ },
451
+ "files": {
452
+ "kind": "mcp",
453
+ "title": "Files",
454
+ "description": "Reads your notes",
455
+ "command": "npx",
456
+ "args": [
457
+ "-y",
458
+ "@modelcontextprotocol/server-filesystem",
459
+ "/tmp/my notes",
460
+ "",
461
+ "say \"hi\""
462
+ ],
463
+ "env": [
464
+ "HOME"
465
+ ]
466
+ },
467
+ "lint": {
468
+ "kind": "script",
469
+ "title": "Lint",
470
+ "command": "bun",
471
+ "args": [
472
+ "lint.ts"
473
+ ]
474
+ }
475
+ }
476
+ },
477
+ "packageId": "acme.v2",
478
+ "expected": [
479
+ {
480
+ "id": "files",
481
+ "kind": "mcp",
482
+ "transport": "stdio",
483
+ "title": "Files",
484
+ "description": "Reads your notes",
485
+ "target": "npx -y @modelcontextprotocol/server-filesystem \"/tmp/my notes\" \"\" \"say \\\"hi\\\"\"",
486
+ "env": [
487
+ "HOME"
488
+ ]
489
+ },
490
+ {
491
+ "id": "lint",
492
+ "kind": "script",
493
+ "transport": "script",
494
+ "title": "Lint",
495
+ "description": null,
496
+ "target": "bun lint.ts",
497
+ "env": []
498
+ },
499
+ {
500
+ "id": "weather",
501
+ "kind": "mcp",
502
+ "transport": "http",
503
+ "title": "Weather",
504
+ "description": null,
505
+ "target": "https://mcp.example.com/weather",
506
+ "env": []
507
+ }
508
+ ],
509
+ "keys": {
510
+ "files": "acme.v2/files:{\"args\":[\"-y\",\"@modelcontextprotocol/server-filesystem\",\"/tmp/my notes\",\"\",\"say \\\"hi\\\"\"],\"command\":\"npx\",\"description\":\"Reads your notes\",\"env\":[\"HOME\"],\"kind\":\"mcp\",\"title\":\"Files\"}",
511
+ "lint": "acme.v2/lint:{\"args\":[\"lint.ts\"],\"command\":\"bun\",\"kind\":\"script\",\"title\":\"Lint\"}",
512
+ "weather": "acme.v2/weather:{\"kind\":\"mcp\",\"title\":\"Weather\",\"url\":\"https://mcp.example.com/weather\"}"
513
+ }
514
+ },
515
+ {
516
+ "package": {},
517
+ "packageId": "acme.none",
518
+ "expected": [],
519
+ "keys": {}
520
+ }
521
+ ],
522
+ "toolCalls": [
523
+ {
524
+ "name": "tools.weather.forecast",
525
+ "expected": {
526
+ "toolId": "weather",
527
+ "tool": "forecast"
528
+ }
529
+ },
530
+ {
531
+ "name": "tools.lint",
532
+ "expected": {
533
+ "toolId": "lint",
534
+ "tool": null
535
+ }
536
+ },
537
+ {
538
+ "name": "tools.files.read_file.v2",
539
+ "expected": {
540
+ "toolId": "files",
541
+ "tool": "read_file.v2"
542
+ }
543
+ },
544
+ {
545
+ "name": "tools.Bad.x",
546
+ "expected": null
547
+ },
548
+ {
549
+ "name": "tools.",
550
+ "expected": null
551
+ },
552
+ {
553
+ "name": "harness.toast",
554
+ "expected": null
555
+ }
556
+ ],
557
+ "extensions": [
558
+ {
559
+ "name": "registered, compatible",
560
+ "extensions": [
561
+ {
562
+ "id": "https://acme.example/catalogs/charts/v1",
563
+ "version": "1.4.0",
564
+ "components": [
565
+ "Gantt"
566
+ ]
567
+ }
568
+ ],
569
+ "extensionIds": [
570
+ "https://acme.example/catalogs/charts/v1"
571
+ ],
572
+ "available": [
573
+ {
574
+ "id": "https://acme.example/catalogs/charts/v1",
575
+ "version": "1.6.2",
576
+ "components": [
577
+ "Gantt",
578
+ "Burndown"
579
+ ]
580
+ }
581
+ ],
582
+ "expected": []
583
+ },
584
+ {
585
+ "name": "a lower minor does not satisfy",
586
+ "extensions": [
587
+ {
588
+ "id": "https://acme.example/catalogs/charts/v1",
589
+ "version": "1.4.0"
590
+ }
591
+ ],
592
+ "extensionIds": [
593
+ "https://acme.example/catalogs/charts/v1"
594
+ ],
595
+ "available": [
596
+ {
597
+ "id": "https://acme.example/catalogs/charts/v1",
598
+ "version": "1.3.9"
599
+ }
600
+ ],
601
+ "expected": [
602
+ {
603
+ "path": "/extensions/0/version",
604
+ "message": "extension https://acme.example/catalogs/charts/v1 1.3.9 does not satisfy ^1.4.0"
605
+ }
606
+ ]
607
+ },
608
+ {
609
+ "name": "a new major does not satisfy",
610
+ "extensions": [
611
+ {
612
+ "id": "https://acme.example/catalogs/charts/v1",
613
+ "version": "1.4.0"
614
+ }
615
+ ],
616
+ "extensionIds": [
617
+ "https://acme.example/catalogs/charts/v1"
618
+ ],
619
+ "available": [
620
+ {
621
+ "id": "https://acme.example/catalogs/charts/v1",
622
+ "version": "2.0.0"
623
+ }
624
+ ],
625
+ "expected": [
626
+ {
627
+ "path": "/extensions/0/version",
628
+ "message": "extension https://acme.example/catalogs/charts/v1 2.0.0 does not satisfy ^1.4.0"
629
+ }
630
+ ]
631
+ },
632
+ {
633
+ "name": "an unversioned registration satisfies any",
634
+ "extensions": [
635
+ {
636
+ "id": "https://acme.example/catalogs/charts/v1",
637
+ "version": "9.9.9",
638
+ "components": [
639
+ "Gantt",
640
+ "Pie"
641
+ ]
642
+ }
643
+ ],
644
+ "extensionIds": [
645
+ "https://acme.example/catalogs/charts/v1"
646
+ ],
647
+ "available": [
648
+ {
649
+ "id": "https://acme.example/catalogs/charts/v1",
650
+ "components": [
651
+ "Gantt"
652
+ ]
653
+ }
654
+ ],
655
+ "expected": [
656
+ {
657
+ "path": "/extensions/0/components/1",
658
+ "message": "extension https://acme.example/catalogs/charts/v1 has no component Pie"
659
+ }
660
+ ]
661
+ },
662
+ {
663
+ "name": "ids only: no version or component check",
664
+ "extensions": [
665
+ {
666
+ "id": "https://acme.example/catalogs/charts/v1",
667
+ "version": "9.9.9",
668
+ "components": [
669
+ "Pie"
670
+ ]
671
+ }
672
+ ],
673
+ "extensionIds": [
674
+ "https://acme.example/catalogs/charts/v1"
675
+ ],
676
+ "expected": []
677
+ },
678
+ {
679
+ "name": "not registered",
680
+ "extensions": [
681
+ {
682
+ "id": "https://acme.example/catalogs/charts/v1",
683
+ "version": "1.0.0"
684
+ }
685
+ ],
686
+ "extensionIds": [],
687
+ "available": [],
688
+ "expected": [
689
+ {
690
+ "path": "/extensions/0/id",
691
+ "message": "extension https://acme.example/catalogs/charts/v1 is not available on this host"
692
+ }
693
+ ]
694
+ }
695
+ ],
696
+ "canonical": [
697
+ {
698
+ "text": "{\"b\": 1, \"a\": [1.0, 1e21, 1E-7, -0.0, 0.1, 123456789012345680000, 5e-324, 1.5e300, {\"z\": null, \"y\": true}]}",
699
+ "expected": "{\"a\":[1,1e+21,1e-7,0,0.1,123456789012345680000,5e-324,1.5e+300,{\"y\":true,\"z\":null}],\"b\":1}"
700
+ },
701
+ {
702
+ "text": "{\"\\u20ac\": 1, \"\\ud83d\\ude00\": 2, \"\\u00e9\": 3, \"a\": 4, \"A\": 5, \"\": 6}",
703
+ "expected": "{\"\":6,\"A\":5,\"a\":4,\"é\":3,\"€\":1,\"😀\":2}"
704
+ },
705
+ {
706
+ "text": "[\"\\n\\t\\\"\\\\\\u0001\\u007f\\u2028\\/\", \"\\u00e9\", \"\\b\\f\\r\"]",
707
+ "expected": "[\"\\n\\t\\\"\\\\\\u0001
/\",\"é\",\"\\b\\f\\r\"]"
708
+ },
709
+ {
710
+ "text": "{\"nested\": {\"b\": [], \"a\": {}}, \"n\": -12.50}",
711
+ "expected": "{\"n\":-12.5,\"nested\":{\"a\":{},\"b\":[]}}"
712
+ }
713
+ ],
714
+ "signatures": [
715
+ {
716
+ "name": "unsigned: no signature",
717
+ "file": {
718
+ "format": "exponential-app/1",
719
+ "app": {
720
+ "name": "Hours",
721
+ "icon": null,
722
+ "color": null,
723
+ "description": ""
724
+ },
725
+ "package": {
726
+ "id": "acme.hours",
727
+ "name": "Hours",
728
+ "version": "1.0.0",
729
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
730
+ "templates": {
731
+ "t": {
732
+ "components": [
733
+ {
734
+ "id": "root",
735
+ "component": "Text",
736
+ "text": "Hi"
737
+ }
738
+ ]
739
+ }
740
+ }
741
+ }
742
+ },
743
+ "sign": false,
744
+ "signed": {
745
+ "format": "exponential-app/1",
746
+ "app": {
747
+ "name": "Hours",
748
+ "icon": null,
749
+ "color": null,
750
+ "description": ""
751
+ },
752
+ "package": {
753
+ "id": "acme.hours",
754
+ "name": "Hours",
755
+ "version": "1.0.0",
756
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
757
+ "templates": {
758
+ "t": {
759
+ "components": [
760
+ {
761
+ "id": "root",
762
+ "component": "Text",
763
+ "text": "Hi"
764
+ }
765
+ ]
766
+ }
767
+ }
768
+ }
769
+ },
770
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.0\"}}",
771
+ "expected": {
772
+ "status": "unsigned"
773
+ }
774
+ },
775
+ {
776
+ "name": "an author alone is an unverified claim",
777
+ "file": {
778
+ "format": "exponential-app/1",
779
+ "app": {
780
+ "name": "Hours",
781
+ "icon": null,
782
+ "color": null,
783
+ "description": ""
784
+ },
785
+ "package": {
786
+ "id": "acme.hours",
787
+ "name": "Hours",
788
+ "version": "1.0.0",
789
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
790
+ "templates": {
791
+ "t": {
792
+ "components": [
793
+ {
794
+ "id": "root",
795
+ "component": "Text",
796
+ "text": "Hi"
797
+ }
798
+ ]
799
+ }
800
+ }
801
+ },
802
+ "author": {
803
+ "name": "Someone",
804
+ "key": "ed25519:nope"
805
+ }
806
+ },
807
+ "sign": false,
808
+ "signed": {
809
+ "format": "exponential-app/1",
810
+ "app": {
811
+ "name": "Hours",
812
+ "icon": null,
813
+ "color": null,
814
+ "description": ""
815
+ },
816
+ "package": {
817
+ "id": "acme.hours",
818
+ "name": "Hours",
819
+ "version": "1.0.0",
820
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
821
+ "templates": {
822
+ "t": {
823
+ "components": [
824
+ {
825
+ "id": "root",
826
+ "component": "Text",
827
+ "text": "Hi"
828
+ }
829
+ ]
830
+ }
831
+ }
832
+ },
833
+ "author": {
834
+ "name": "Someone",
835
+ "key": "ed25519:nope"
836
+ }
837
+ },
838
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"author\":{\"key\":\"ed25519:nope\",\"name\":\"Someone\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.0\"}}",
839
+ "expected": {
840
+ "status": "unsigned"
841
+ }
842
+ },
843
+ {
844
+ "name": "signed with the test key",
845
+ "file": {
846
+ "format": "exponential-app/1",
847
+ "app": {
848
+ "name": "Hours",
849
+ "icon": null,
850
+ "color": null,
851
+ "description": ""
852
+ },
853
+ "package": {
854
+ "id": "acme.hours",
855
+ "name": "Hours",
856
+ "version": "1.0.0",
857
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
858
+ "templates": {
859
+ "t": {
860
+ "components": [
861
+ {
862
+ "id": "root",
863
+ "component": "Text",
864
+ "text": "Hi"
865
+ }
866
+ ]
867
+ }
868
+ }
869
+ },
870
+ "records": [
871
+ {
872
+ "kind": "entry",
873
+ "data": {
874
+ "hours": 1.5,
875
+ "note": "€😀"
876
+ }
877
+ }
878
+ ]
879
+ },
880
+ "sign": true,
881
+ "signed": {
882
+ "format": "exponential-app/1",
883
+ "app": {
884
+ "name": "Hours",
885
+ "icon": null,
886
+ "color": null,
887
+ "description": ""
888
+ },
889
+ "package": {
890
+ "id": "acme.hours",
891
+ "name": "Hours",
892
+ "version": "1.0.0",
893
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
894
+ "templates": {
895
+ "t": {
896
+ "components": [
897
+ {
898
+ "id": "root",
899
+ "component": "Text",
900
+ "text": "Hi"
901
+ }
902
+ ]
903
+ }
904
+ }
905
+ },
906
+ "records": [
907
+ {
908
+ "kind": "entry",
909
+ "data": {
910
+ "hours": 1.5,
911
+ "note": "€😀"
912
+ }
913
+ }
914
+ ],
915
+ "author": {
916
+ "name": "Test Author",
917
+ "key": "ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
918
+ },
919
+ "signature": {
920
+ "alg": "ed25519",
921
+ "value": "SMLDvQXlKpcHsuz9X9dvRjgYiDZX0_PbeaclSeQegikq0Tf68obvpYBGZbA28si_nIBauNd8Whr2gtZgnXaLCQ"
922
+ }
923
+ },
924
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"author\":{\"key\":\"ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo\",\"name\":\"Test Author\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.0\"},\"records\":[{\"data\":{\"hours\":1.5,\"note\":\"€😀\"},\"kind\":\"entry\"}]}",
925
+ "expected": {
926
+ "status": "valid",
927
+ "author": {
928
+ "name": "Test Author",
929
+ "key": "ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
930
+ }
931
+ }
932
+ },
933
+ {
934
+ "name": "a changed package no longer verifies",
935
+ "file": {
936
+ "format": "exponential-app/1",
937
+ "app": {
938
+ "name": "Hours",
939
+ "icon": null,
940
+ "color": null,
941
+ "description": ""
942
+ },
943
+ "package": {
944
+ "id": "acme.hours",
945
+ "name": "Hours",
946
+ "version": "1.0.0",
947
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
948
+ "templates": {
949
+ "t": {
950
+ "components": [
951
+ {
952
+ "id": "root",
953
+ "component": "Text",
954
+ "text": "Hi"
955
+ }
956
+ ]
957
+ }
958
+ }
959
+ }
960
+ },
961
+ "sign": true,
962
+ "tamper": [
963
+ [
964
+ "/package/version",
965
+ "1.0.1"
966
+ ]
967
+ ],
968
+ "signed": {
969
+ "format": "exponential-app/1",
970
+ "app": {
971
+ "name": "Hours",
972
+ "icon": null,
973
+ "color": null,
974
+ "description": ""
975
+ },
976
+ "package": {
977
+ "id": "acme.hours",
978
+ "name": "Hours",
979
+ "version": "1.0.1",
980
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
981
+ "templates": {
982
+ "t": {
983
+ "components": [
984
+ {
985
+ "id": "root",
986
+ "component": "Text",
987
+ "text": "Hi"
988
+ }
989
+ ]
990
+ }
991
+ }
992
+ },
993
+ "author": {
994
+ "name": "Test Author",
995
+ "key": "ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
996
+ },
997
+ "signature": {
998
+ "alg": "ed25519",
999
+ "value": "wUn9dYHXLdd8NvcBrVDTfn5r18-z1u-U8j_Plx6Y5LXa4O74wR3y_3OthcUYc_LOIbGbOQrZbgg1Ri9bgpEEBQ"
1000
+ }
1001
+ },
1002
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"author\":{\"key\":\"ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo\",\"name\":\"Test Author\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.1\"}}",
1003
+ "expected": {
1004
+ "status": "invalid",
1005
+ "issues": [
1006
+ {
1007
+ "path": "/signature",
1008
+ "message": "does not verify against /author/key"
1009
+ }
1010
+ ]
1011
+ }
1012
+ },
1013
+ {
1014
+ "name": "a changed author name no longer verifies",
1015
+ "file": {
1016
+ "format": "exponential-app/1",
1017
+ "app": {
1018
+ "name": "Hours",
1019
+ "icon": null,
1020
+ "color": null,
1021
+ "description": ""
1022
+ },
1023
+ "package": {
1024
+ "id": "acme.hours",
1025
+ "name": "Hours",
1026
+ "version": "1.0.0",
1027
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
1028
+ "templates": {
1029
+ "t": {
1030
+ "components": [
1031
+ {
1032
+ "id": "root",
1033
+ "component": "Text",
1034
+ "text": "Hi"
1035
+ }
1036
+ ]
1037
+ }
1038
+ }
1039
+ }
1040
+ },
1041
+ "sign": true,
1042
+ "tamper": [
1043
+ [
1044
+ "/author/name",
1045
+ "Mallory"
1046
+ ]
1047
+ ],
1048
+ "signed": {
1049
+ "format": "exponential-app/1",
1050
+ "app": {
1051
+ "name": "Hours",
1052
+ "icon": null,
1053
+ "color": null,
1054
+ "description": ""
1055
+ },
1056
+ "package": {
1057
+ "id": "acme.hours",
1058
+ "name": "Hours",
1059
+ "version": "1.0.0",
1060
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
1061
+ "templates": {
1062
+ "t": {
1063
+ "components": [
1064
+ {
1065
+ "id": "root",
1066
+ "component": "Text",
1067
+ "text": "Hi"
1068
+ }
1069
+ ]
1070
+ }
1071
+ }
1072
+ },
1073
+ "author": {
1074
+ "name": "Mallory",
1075
+ "key": "ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
1076
+ },
1077
+ "signature": {
1078
+ "alg": "ed25519",
1079
+ "value": "wUn9dYHXLdd8NvcBrVDTfn5r18-z1u-U8j_Plx6Y5LXa4O74wR3y_3OthcUYc_LOIbGbOQrZbgg1Ri9bgpEEBQ"
1080
+ }
1081
+ },
1082
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"author\":{\"key\":\"ed25519:11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo\",\"name\":\"Mallory\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.0\"}}",
1083
+ "expected": {
1084
+ "status": "invalid",
1085
+ "issues": [
1086
+ {
1087
+ "path": "/signature",
1088
+ "message": "does not verify against /author/key"
1089
+ }
1090
+ ]
1091
+ }
1092
+ },
1093
+ {
1094
+ "name": "a malformed signature and author",
1095
+ "file": {
1096
+ "format": "exponential-app/1",
1097
+ "app": {
1098
+ "name": "Hours",
1099
+ "icon": null,
1100
+ "color": null,
1101
+ "description": ""
1102
+ },
1103
+ "package": {
1104
+ "id": "acme.hours",
1105
+ "name": "Hours",
1106
+ "version": "1.0.0",
1107
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
1108
+ "templates": {
1109
+ "t": {
1110
+ "components": [
1111
+ {
1112
+ "id": "root",
1113
+ "component": "Text",
1114
+ "text": "Hi"
1115
+ }
1116
+ ]
1117
+ }
1118
+ }
1119
+ },
1120
+ "author": {
1121
+ "name": "",
1122
+ "key": "ed25519:AAAA"
1123
+ },
1124
+ "signature": {
1125
+ "alg": "rsa",
1126
+ "value": "!!"
1127
+ }
1128
+ },
1129
+ "sign": false,
1130
+ "signed": {
1131
+ "format": "exponential-app/1",
1132
+ "app": {
1133
+ "name": "Hours",
1134
+ "icon": null,
1135
+ "color": null,
1136
+ "description": ""
1137
+ },
1138
+ "package": {
1139
+ "id": "acme.hours",
1140
+ "name": "Hours",
1141
+ "version": "1.0.0",
1142
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
1143
+ "templates": {
1144
+ "t": {
1145
+ "components": [
1146
+ {
1147
+ "id": "root",
1148
+ "component": "Text",
1149
+ "text": "Hi"
1150
+ }
1151
+ ]
1152
+ }
1153
+ }
1154
+ },
1155
+ "author": {
1156
+ "name": "",
1157
+ "key": "ed25519:AAAA"
1158
+ },
1159
+ "signature": {
1160
+ "alg": "rsa",
1161
+ "value": "!!"
1162
+ }
1163
+ },
1164
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"author\":{\"key\":\"ed25519:AAAA\",\"name\":\"\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.0\"}}",
1165
+ "expected": {
1166
+ "status": "invalid",
1167
+ "issues": [
1168
+ {
1169
+ "path": "/signature/alg",
1170
+ "message": "alg is ed25519"
1171
+ },
1172
+ {
1173
+ "path": "/signature/value",
1174
+ "message": "value is 64 bytes, base64url"
1175
+ },
1176
+ {
1177
+ "path": "/author/name",
1178
+ "message": "name is 1 to 80 characters"
1179
+ },
1180
+ {
1181
+ "path": "/author/key",
1182
+ "message": "key is ed25519: and 32 bytes, base64url"
1183
+ }
1184
+ ]
1185
+ }
1186
+ },
1187
+ {
1188
+ "name": "no author",
1189
+ "file": {
1190
+ "format": "exponential-app/1",
1191
+ "app": {
1192
+ "name": "Hours",
1193
+ "icon": null,
1194
+ "color": null,
1195
+ "description": ""
1196
+ },
1197
+ "package": {
1198
+ "id": "acme.hours",
1199
+ "name": "Hours",
1200
+ "version": "1.0.0",
1201
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
1202
+ "templates": {
1203
+ "t": {
1204
+ "components": [
1205
+ {
1206
+ "id": "root",
1207
+ "component": "Text",
1208
+ "text": "Hi"
1209
+ }
1210
+ ]
1211
+ }
1212
+ }
1213
+ },
1214
+ "signature": {
1215
+ "alg": "ed25519",
1216
+ "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
1217
+ }
1218
+ },
1219
+ "sign": false,
1220
+ "signed": {
1221
+ "format": "exponential-app/1",
1222
+ "app": {
1223
+ "name": "Hours",
1224
+ "icon": null,
1225
+ "color": null,
1226
+ "description": ""
1227
+ },
1228
+ "package": {
1229
+ "id": "acme.hours",
1230
+ "name": "Hours",
1231
+ "version": "1.0.0",
1232
+ "catalogId": "https://ui.exponential.at/catalogs/core/v1",
1233
+ "templates": {
1234
+ "t": {
1235
+ "components": [
1236
+ {
1237
+ "id": "root",
1238
+ "component": "Text",
1239
+ "text": "Hi"
1240
+ }
1241
+ ]
1242
+ }
1243
+ }
1244
+ },
1245
+ "signature": {
1246
+ "alg": "ed25519",
1247
+ "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
1248
+ }
1249
+ },
1250
+ "signedText": "exponential-ui/package-file/v1\n{\"app\":{\"color\":null,\"description\":\"\",\"icon\":null,\"name\":\"Hours\"},\"format\":\"exponential-app/1\",\"package\":{\"catalogId\":\"https://ui.exponential.at/catalogs/core/v1\",\"id\":\"acme.hours\",\"name\":\"Hours\",\"templates\":{\"t\":{\"components\":[{\"component\":\"Text\",\"id\":\"root\",\"text\":\"Hi\"}]}},\"version\":\"1.0.0\"}}",
1251
+ "expected": {
1252
+ "status": "invalid",
1253
+ "issues": [
1254
+ {
1255
+ "path": "/author",
1256
+ "message": "a signed file names its author {name, key}"
1257
+ }
1258
+ ]
1259
+ }
1260
+ }
1261
+ ]
1262
+ }