@sixb/core 0.1.20 → 0.1.22

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 (1519) hide show
  1. package/dist/actions/commit-edits.d.ts +3 -1
  2. package/dist/actions/commit-edits.d.ts.map +1 -1
  3. package/dist/actions/execution.d.ts.map +1 -1
  4. package/dist/actions/index.js +71 -60
  5. package/dist/actions/index.js.map +1 -1
  6. package/dist/actions/read-facade.d.ts +9 -1
  7. package/dist/actions/read-facade.d.ts.map +1 -1
  8. package/dist/actions/request.d.ts +15 -1
  9. package/dist/actions/request.d.ts.map +1 -1
  10. package/dist/actions/run/context.d.ts +1 -0
  11. package/dist/actions/run/context.d.ts.map +1 -1
  12. package/dist/actions/run/execute.d.ts +2 -3
  13. package/dist/actions/run/execute.d.ts.map +1 -1
  14. package/dist/actions/run/executor.d.ts +3 -0
  15. package/dist/actions/run/executor.d.ts.map +1 -1
  16. package/dist/actions/run/normalize.d.ts +2 -1
  17. package/dist/actions/run/normalize.d.ts.map +1 -1
  18. package/dist/actions/run/signals.d.ts +1 -3
  19. package/dist/actions/run/signals.d.ts.map +1 -1
  20. package/dist/actions/run/types.d.ts +16 -1
  21. package/dist/actions/run/types.d.ts.map +1 -1
  22. package/dist/actions/run-authorization.d.ts +23 -0
  23. package/dist/actions/run-authorization.d.ts.map +1 -1
  24. package/dist/actions/types/context.d.ts +17 -1
  25. package/dist/actions/types/context.d.ts.map +1 -1
  26. package/dist/actions/validators.d.ts.map +1 -1
  27. package/dist/activity/connection.d.ts +62 -0
  28. package/dist/activity/connection.d.ts.map +1 -0
  29. package/dist/activity/device.d.ts +8 -0
  30. package/dist/activity/device.d.ts.map +1 -0
  31. package/dist/activity/execution.d.ts +48 -0
  32. package/dist/activity/execution.d.ts.map +1 -0
  33. package/dist/activity/service.d.ts +79 -0
  34. package/dist/activity/service.d.ts.map +1 -0
  35. package/dist/activity/shares.d.ts +24 -0
  36. package/dist/activity/shares.d.ts.map +1 -0
  37. package/dist/activity/timeline.d.ts +103 -0
  38. package/dist/activity/timeline.d.ts.map +1 -0
  39. package/dist/agents/accounting.d.ts +15 -0
  40. package/dist/agents/accounting.d.ts.map +1 -0
  41. package/dist/agents/adapters.d.ts.map +1 -1
  42. package/dist/agents/agent-mail.d.ts +9 -0
  43. package/dist/agents/agent-mail.d.ts.map +1 -0
  44. package/dist/agents/api-gateway.d.ts +5 -0
  45. package/dist/agents/api-gateway.d.ts.map +1 -1
  46. package/dist/agents/approval-continuation.d.ts +23 -0
  47. package/dist/agents/approval-continuation.d.ts.map +1 -0
  48. package/dist/agents/approval-executor.d.ts +56 -0
  49. package/dist/agents/approval-executor.d.ts.map +1 -0
  50. package/dist/agents/approval-outcome.d.ts +8 -0
  51. package/dist/agents/approval-outcome.d.ts.map +1 -0
  52. package/dist/agents/approvals.d.ts +210 -0
  53. package/dist/agents/approvals.d.ts.map +1 -0
  54. package/dist/agents/authority.d.ts +10 -0
  55. package/dist/agents/authority.d.ts.map +1 -1
  56. package/dist/agents/builders.d.ts.map +1 -1
  57. package/dist/agents/cancel.d.ts +23 -0
  58. package/dist/agents/cancel.d.ts.map +1 -0
  59. package/dist/agents/child-question.d.ts +18 -0
  60. package/dist/agents/child-question.d.ts.map +1 -0
  61. package/dist/agents/children.d.ts +99 -0
  62. package/dist/agents/children.d.ts.map +1 -0
  63. package/dist/agents/context/index.js +1 -1
  64. package/dist/agents/context-compaction.d.ts.map +1 -1
  65. package/dist/agents/errors.d.ts +13 -1
  66. package/dist/agents/errors.d.ts.map +1 -1
  67. package/dist/agents/execution.d.ts +180 -14
  68. package/dist/agents/execution.d.ts.map +1 -1
  69. package/dist/agents/fork.d.ts +16 -0
  70. package/dist/agents/fork.d.ts.map +1 -0
  71. package/dist/agents/ids.d.ts +7 -0
  72. package/dist/agents/ids.d.ts.map +1 -1
  73. package/dist/agents/index.d.ts +20 -8
  74. package/dist/agents/index.d.ts.map +1 -1
  75. package/dist/agents/index.js +170 -84
  76. package/dist/agents/index.js.map +1 -1
  77. package/dist/agents/memory-execution.d.ts +57 -0
  78. package/dist/agents/memory-execution.d.ts.map +1 -0
  79. package/dist/agents/memory.d.ts +49 -0
  80. package/dist/agents/memory.d.ts.map +1 -0
  81. package/dist/agents/message.d.ts +50 -1
  82. package/dist/agents/message.d.ts.map +1 -1
  83. package/dist/agents/model-loop.d.ts +19 -0
  84. package/dist/agents/model-loop.d.ts.map +1 -1
  85. package/dist/agents/model-routing.d.ts +19 -0
  86. package/dist/agents/model-routing.d.ts.map +1 -0
  87. package/dist/agents/participants.d.ts +18 -0
  88. package/dist/agents/participants.d.ts.map +1 -0
  89. package/dist/agents/reference.d.ts.map +1 -1
  90. package/dist/agents/request.d.ts +36 -2
  91. package/dist/agents/request.d.ts.map +1 -1
  92. package/dist/agents/run-scope.d.ts +51 -0
  93. package/dist/agents/run-scope.d.ts.map +1 -0
  94. package/dist/agents/skills.d.ts.map +1 -1
  95. package/dist/agents/streams/index.d.ts +3 -2
  96. package/dist/agents/streams/index.d.ts.map +1 -1
  97. package/dist/agents/streams/index.js +8 -4
  98. package/dist/agents/streams/index.js.map +1 -1
  99. package/dist/agents/streams/internal.d.ts +1 -1
  100. package/dist/agents/streams/internal.d.ts.map +1 -1
  101. package/dist/agents/streams/internal.js +6 -4
  102. package/dist/agents/streams/internal.js.map +1 -1
  103. package/dist/agents/streams/protocol.d.ts +122 -3
  104. package/dist/agents/streams/protocol.d.ts.map +1 -1
  105. package/dist/agents/subagent-runs.d.ts +12 -0
  106. package/dist/agents/subagent-runs.d.ts.map +1 -0
  107. package/dist/agents/thread-access.d.ts +53 -0
  108. package/dist/agents/thread-access.d.ts.map +1 -0
  109. package/dist/agents/tool-definition.d.ts +5 -4
  110. package/dist/agents/tool-definition.d.ts.map +1 -1
  111. package/dist/agents/types.d.ts +31 -12
  112. package/dist/agents/types.d.ts.map +1 -1
  113. package/dist/agents/validation.d.ts +1 -1
  114. package/dist/agents/validation.d.ts.map +1 -1
  115. package/dist/artifacts/access.d.ts +52 -0
  116. package/dist/artifacts/access.d.ts.map +1 -0
  117. package/dist/artifacts/address.d.ts +48 -0
  118. package/dist/artifacts/address.d.ts.map +1 -0
  119. package/dist/artifacts/canvas.d.ts +92 -0
  120. package/dist/artifacts/canvas.d.ts.map +1 -0
  121. package/dist/artifacts/csv.d.ts +27 -0
  122. package/dist/artifacts/csv.d.ts.map +1 -0
  123. package/dist/artifacts/errors.d.ts +16 -0
  124. package/dist/artifacts/errors.d.ts.map +1 -0
  125. package/dist/artifacts/execution.d.ts +138 -0
  126. package/dist/artifacts/execution.d.ts.map +1 -0
  127. package/dist/artifacts/formula/check.d.ts +24 -0
  128. package/dist/artifacts/formula/check.d.ts.map +1 -0
  129. package/dist/artifacts/formula/evaluate.d.ts +32 -0
  130. package/dist/artifacts/formula/evaluate.d.ts.map +1 -0
  131. package/dist/artifacts/formula/index.d.ts +38 -0
  132. package/dist/artifacts/formula/index.d.ts.map +1 -0
  133. package/dist/artifacts/formula/parser.d.ts +67 -0
  134. package/dist/artifacts/formula/parser.d.ts.map +1 -0
  135. package/dist/artifacts/frames/assets.d.ts +30 -0
  136. package/dist/artifacts/frames/assets.d.ts.map +1 -0
  137. package/dist/artifacts/frames/entries.d.ts +19 -0
  138. package/dist/artifacts/frames/entries.d.ts.map +1 -0
  139. package/dist/artifacts/frames/grants.d.ts +37 -0
  140. package/dist/artifacts/frames/grants.d.ts.map +1 -0
  141. package/dist/artifacts/frames/index.d.ts +12 -0
  142. package/dist/artifacts/frames/index.d.ts.map +1 -0
  143. package/dist/artifacts/frames/index.js +1285 -0
  144. package/dist/artifacts/frames/index.js.map +16 -0
  145. package/dist/artifacts/frames/kit.d.ts +71 -0
  146. package/dist/artifacts/frames/kit.d.ts.map +1 -0
  147. package/dist/artifacts/frames/probe.d.ts +45 -0
  148. package/dist/artifacts/frames/probe.d.ts.map +1 -0
  149. package/dist/artifacts/frames/protocol.d.ts +167 -0
  150. package/dist/artifacts/frames/protocol.d.ts.map +1 -0
  151. package/dist/artifacts/frames/runtime.d.ts +31 -0
  152. package/dist/artifacts/frames/runtime.d.ts.map +1 -0
  153. package/dist/artifacts/html.d.ts +6 -0
  154. package/dist/artifacts/html.d.ts.map +1 -0
  155. package/dist/artifacts/ids.d.ts +5 -0
  156. package/dist/artifacts/ids.d.ts.map +1 -0
  157. package/dist/artifacts/index.d.ts +22 -0
  158. package/dist/artifacts/index.d.ts.map +1 -0
  159. package/dist/artifacts/index.js +247 -0
  160. package/dist/artifacts/index.js.map +10 -0
  161. package/dist/artifacts/kinds.d.ts +5 -0
  162. package/dist/artifacts/kinds.d.ts.map +1 -0
  163. package/dist/artifacts/limits.d.ts +58 -0
  164. package/dist/artifacts/limits.d.ts.map +1 -0
  165. package/dist/artifacts/live-sheet.d.ts +65 -0
  166. package/dist/artifacts/live-sheet.d.ts.map +1 -0
  167. package/dist/artifacts/outline.d.ts +70 -0
  168. package/dist/artifacts/outline.d.ts.map +1 -0
  169. package/dist/artifacts/publish/files.d.ts +15 -0
  170. package/dist/artifacts/publish/files.d.ts.map +1 -0
  171. package/dist/artifacts/publish/index.d.ts +7 -0
  172. package/dist/artifacts/publish/index.d.ts.map +1 -0
  173. package/dist/artifacts/publish/index.js +76 -0
  174. package/dist/{chunk-7n30ybym.js.map → artifacts/publish/index.js.map} +1 -1
  175. package/dist/artifacts/publish/publish.d.ts +84 -0
  176. package/dist/artifacts/publish/publish.d.ts.map +1 -0
  177. package/dist/artifacts/publish/queries.d.ts +33 -0
  178. package/dist/artifacts/publish/queries.d.ts.map +1 -0
  179. package/dist/artifacts/publish/references.d.ts +30 -0
  180. package/dist/artifacts/publish/references.d.ts.map +1 -0
  181. package/dist/artifacts/publish/validate/canvas.d.ts +18 -0
  182. package/dist/artifacts/publish/validate/canvas.d.ts.map +1 -0
  183. package/dist/artifacts/publish/validate/document.d.ts +17 -0
  184. package/dist/artifacts/publish/validate/document.d.ts.map +1 -0
  185. package/dist/artifacts/publish/validate/file.d.ts +8 -0
  186. package/dist/artifacts/publish/validate/file.d.ts.map +1 -0
  187. package/dist/artifacts/publish/validate/html.d.ts +20 -0
  188. package/dist/artifacts/publish/validate/html.d.ts.map +1 -0
  189. package/dist/artifacts/publish/validate/page.d.ts +15 -0
  190. package/dist/artifacts/publish/validate/page.d.ts.map +1 -0
  191. package/dist/artifacts/publish/validate/sheet.d.ts +23 -0
  192. package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
  193. package/dist/artifacts/publish/validate/slides.d.ts +15 -0
  194. package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
  195. package/dist/artifacts/queries.d.ts +95 -0
  196. package/dist/artifacts/queries.d.ts.map +1 -0
  197. package/dist/artifacts/references.d.ts +12 -0
  198. package/dist/artifacts/references.d.ts.map +1 -0
  199. package/dist/artifacts/resolve.d.ts +47 -0
  200. package/dist/artifacts/resolve.d.ts.map +1 -0
  201. package/dist/artifacts/run-query.d.ts +26 -0
  202. package/dist/artifacts/run-query.d.ts.map +1 -0
  203. package/dist/artifacts/serialize-query.d.ts +12 -0
  204. package/dist/artifacts/serialize-query.d.ts.map +1 -0
  205. package/dist/artifacts/sheet-rules.d.ts +26 -0
  206. package/dist/artifacts/sheet-rules.d.ts.map +1 -0
  207. package/dist/artifacts/theme.d.ts +19 -0
  208. package/dist/artifacts/theme.d.ts.map +1 -0
  209. package/dist/artifacts/tones.d.ts +8 -0
  210. package/dist/artifacts/tones.d.ts.map +1 -0
  211. package/dist/artifacts/warnings.d.ts +11 -0
  212. package/dist/artifacts/warnings.d.ts.map +1 -0
  213. package/dist/artifacts/workbook.d.ts +135 -0
  214. package/dist/artifacts/workbook.d.ts.map +1 -0
  215. package/dist/auth/index.d.ts +1 -1
  216. package/dist/auth/index.d.ts.map +1 -1
  217. package/dist/auth/index.js +16 -13
  218. package/dist/auth/index.js.map +1 -1
  219. package/dist/auth/member-events.d.ts +13 -0
  220. package/dist/auth/member-events.d.ts.map +1 -0
  221. package/dist/auth/profile.d.ts +11 -0
  222. package/dist/auth/profile.d.ts.map +1 -0
  223. package/dist/auth/runtime.d.ts +31 -3
  224. package/dist/auth/runtime.d.ts.map +1 -1
  225. package/dist/auth/strategy.d.ts +3 -1
  226. package/dist/auth/strategy.d.ts.map +1 -1
  227. package/dist/auth/strategy.js +7 -3
  228. package/dist/auth/strategy.js.map +1 -1
  229. package/dist/auth/types.d.ts +30 -1
  230. package/dist/auth/types.d.ts.map +1 -1
  231. package/dist/authorization/decision.d.ts +17 -0
  232. package/dist/authorization/decision.d.ts.map +1 -1
  233. package/dist/authorization/event-visibility.d.ts +5 -1
  234. package/dist/authorization/event-visibility.d.ts.map +1 -1
  235. package/dist/authorization/grant-kinds.d.ts +2 -2
  236. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  237. package/dist/authorization/index.d.ts +2 -2
  238. package/dist/authorization/index.d.ts.map +1 -1
  239. package/dist/authorization/index.js +14 -9
  240. package/dist/authorization/index.js.map +1 -1
  241. package/dist/authorization/resolve.d.ts +19 -1
  242. package/dist/authorization/resolve.d.ts.map +1 -1
  243. package/dist/authorization/run-visibility.d.ts +8 -1
  244. package/dist/authorization/run-visibility.d.ts.map +1 -1
  245. package/dist/authorization/types.d.ts +14 -0
  246. package/dist/authorization/types.d.ts.map +1 -1
  247. package/dist/blob-storage/browser.js +1 -1
  248. package/dist/blob-storage/index.js +2 -2
  249. package/dist/blob-storage/internal.d.ts +1 -1
  250. package/dist/blob-storage/internal.d.ts.map +1 -1
  251. package/dist/blob-storage/internal.js +11 -5
  252. package/dist/blob-storage/internal.js.map +1 -1
  253. package/dist/blob-storage/media-type.d.ts +12 -0
  254. package/dist/blob-storage/media-type.d.ts.map +1 -1
  255. package/dist/bootstrap/index.js +76 -66
  256. package/dist/bootstrap/index.js.map +2 -2
  257. package/dist/{chunk-tg2cw67r.js → chunk-02bzjgnt.js} +6 -6
  258. package/dist/{chunk-tg2cw67r.js.map → chunk-02bzjgnt.js.map} +1 -1
  259. package/dist/{chunk-mfs23znk.js → chunk-07kkp2e1.js} +1 -1
  260. package/dist/{chunk-6p49a5cq.js → chunk-098anw4f.js} +21 -19
  261. package/dist/chunk-098anw4f.js.map +12 -0
  262. package/dist/{chunk-fkgc1wt8.js → chunk-0phpbbvm.js} +3 -3
  263. package/dist/{chunk-ere85b8y.js → chunk-0xmt5p5y.js} +116 -27
  264. package/dist/chunk-0xmt5p5y.js.map +14 -0
  265. package/dist/{chunk-t6f3tdnr.js → chunk-16a9dmfy.js} +33 -2
  266. package/dist/{chunk-t6f3tdnr.js.map → chunk-16a9dmfy.js.map} +5 -4
  267. package/dist/{chunk-hkc3jct7.js → chunk-18sk89cg.js} +18 -10
  268. package/dist/chunk-18sk89cg.js.map +10 -0
  269. package/dist/{chunk-way52z4h.js → chunk-1t6k1avb.js} +6 -12
  270. package/dist/{chunk-way52z4h.js.map → chunk-1t6k1avb.js.map} +3 -4
  271. package/dist/chunk-2626mh4m.js +693 -0
  272. package/dist/chunk-2626mh4m.js.map +19 -0
  273. package/dist/{chunk-qczk96d9.js → chunk-2adz0h75.js} +13 -4
  274. package/dist/chunk-2adz0h75.js.map +11 -0
  275. package/dist/{chunk-3t2hgbgd.js → chunk-2fn60nvs.js} +40 -8
  276. package/dist/chunk-2fn60nvs.js.map +15 -0
  277. package/dist/{chunk-99nd4rc1.js → chunk-2gjj5dx3.js} +5 -4
  278. package/dist/{chunk-99nd4rc1.js.map → chunk-2gjj5dx3.js.map} +3 -3
  279. package/dist/chunk-3fqxbn31.js +107 -0
  280. package/dist/chunk-3fqxbn31.js.map +11 -0
  281. package/dist/{chunk-y0c4e6ex.js → chunk-3gbefjg5.js} +1 -1
  282. package/dist/{chunk-yzwja0mj.js → chunk-45ngkxkp.js} +52 -31
  283. package/dist/chunk-45ngkxkp.js.map +13 -0
  284. package/dist/{chunk-fa02jy15.js → chunk-48jezz3j.js} +1 -1
  285. package/dist/{chunk-ren4kg2j.js → chunk-4b26qwbg.js} +13 -13
  286. package/dist/{chunk-ren4kg2j.js.map → chunk-4b26qwbg.js.map} +1 -1
  287. package/dist/{chunk-9k93ah50.js → chunk-4f3ydv7t.js} +33 -69
  288. package/dist/chunk-4f3ydv7t.js.map +10 -0
  289. package/dist/chunk-4y26vs3v.js +97 -0
  290. package/dist/chunk-4y26vs3v.js.map +10 -0
  291. package/dist/{chunk-4as3wt1c.js → chunk-4ymrcdbm.js} +7 -3
  292. package/dist/chunk-4ymrcdbm.js.map +12 -0
  293. package/dist/{chunk-hcbyfxbe.js → chunk-5grk14e5.js} +76 -2
  294. package/dist/{chunk-hcbyfxbe.js.map → chunk-5grk14e5.js.map} +4 -3
  295. package/dist/chunk-5tfev0fv.js +676 -0
  296. package/dist/chunk-5tfev0fv.js.map +15 -0
  297. package/dist/chunk-65abf64x.js +13 -0
  298. package/dist/chunk-65abf64x.js.map +10 -0
  299. package/dist/{chunk-hvsb78a1.js → chunk-65pyhyas.js} +114 -107
  300. package/dist/chunk-65pyhyas.js.map +20 -0
  301. package/dist/{chunk-1sr8ryzk.js → chunk-661ezhks.js} +303 -6
  302. package/dist/chunk-661ezhks.js.map +11 -0
  303. package/dist/{chunk-z3y5kg1x.js → chunk-6eqsgvxk.js} +3 -3
  304. package/dist/{chunk-z3y5kg1x.js.map → chunk-6eqsgvxk.js.map} +2 -2
  305. package/dist/{chunk-c85m1hyj.js → chunk-6n69k945.js} +2 -2
  306. package/dist/{chunk-xfs8x8m9.js → chunk-6p0pastb.js} +5 -5
  307. package/dist/{chunk-rrzt8jdy.js → chunk-6rrtzea3.js} +116 -110
  308. package/dist/chunk-6rrtzea3.js.map +14 -0
  309. package/dist/{chunk-t7x8dmn0.js → chunk-6y0mkhex.js} +3 -3
  310. package/dist/{chunk-es1gxsbf.js → chunk-73v685wb.js} +14 -16
  311. package/dist/chunk-73v685wb.js.map +12 -0
  312. package/dist/{chunk-6c6sn0bh.js → chunk-7gr4j2eq.js} +7930 -5973
  313. package/dist/chunk-7gr4j2eq.js.map +120 -0
  314. package/dist/{chunk-hjzdd750.js → chunk-7mc2wkre.js} +391 -91
  315. package/dist/chunk-7mc2wkre.js.map +50 -0
  316. package/dist/chunk-7z5p905k.js +1660 -0
  317. package/dist/chunk-7z5p905k.js.map +22 -0
  318. package/dist/{chunk-3zxk45er.js → chunk-8ncg20rd.js} +3 -68
  319. package/dist/{chunk-3zxk45er.js.map → chunk-8ncg20rd.js.map} +4 -5
  320. package/dist/{chunk-yxd3nnqt.js → chunk-9mab3dvg.js} +26 -2
  321. package/dist/chunk-9mab3dvg.js.map +11 -0
  322. package/dist/chunk-9wr3yajk.js +42 -0
  323. package/dist/chunk-9wr3yajk.js.map +10 -0
  324. package/dist/chunk-a3faa34j.js +74 -0
  325. package/dist/chunk-a3faa34j.js.map +10 -0
  326. package/dist/chunk-az47zep4.js +41 -0
  327. package/dist/chunk-az47zep4.js.map +10 -0
  328. package/dist/{chunk-v9xd5wzd.js → chunk-bab05bhg.js} +1 -1
  329. package/dist/{chunk-5j58wjct.js → chunk-bktev1ds.js} +14 -11
  330. package/dist/{chunk-5j58wjct.js.map → chunk-bktev1ds.js.map} +3 -3
  331. package/dist/{chunk-b38szspf.js → chunk-c0vk1djt.js} +5 -3
  332. package/dist/chunk-c0vk1djt.js.map +11 -0
  333. package/dist/chunk-c69nj7se.js +3 -0
  334. package/dist/chunk-c69nj7se.js.map +9 -0
  335. package/dist/{chunk-0yh890a4.js → chunk-c844dkwd.js} +35 -7
  336. package/dist/{chunk-0yh890a4.js.map → chunk-c844dkwd.js.map} +3 -3
  337. package/dist/{chunk-d09tj99x.js → chunk-cdk3egjj.js} +24 -5
  338. package/dist/chunk-cdk3egjj.js.map +12 -0
  339. package/dist/chunk-cswhawa2.js +113 -0
  340. package/dist/chunk-cswhawa2.js.map +10 -0
  341. package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
  342. package/dist/chunk-d2m879s4.js +288 -0
  343. package/dist/chunk-d2m879s4.js.map +12 -0
  344. package/dist/chunk-d7vyc7k6.js +10 -0
  345. package/dist/chunk-d7vyc7k6.js.map +10 -0
  346. package/dist/{chunk-vyf9kfqf.js → chunk-dp0cdtj2.js} +2 -2
  347. package/dist/{chunk-6x0pqh32.js → chunk-e5wf5vz0.js} +3 -1
  348. package/dist/chunk-e5wf5vz0.js.map +10 -0
  349. package/dist/{chunk-bx9q3cwv.js → chunk-efmm01gj.js} +108 -1045
  350. package/dist/chunk-efmm01gj.js.map +18 -0
  351. package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
  352. package/dist/chunk-eptrvnby.js.map +12 -0
  353. package/dist/{chunk-n33z5bjw.js → chunk-ezne9wc9.js} +1762 -502
  354. package/dist/chunk-ezne9wc9.js.map +71 -0
  355. package/dist/chunk-fe8zwt8b.js +688 -0
  356. package/dist/chunk-fe8zwt8b.js.map +19 -0
  357. package/dist/chunk-ff5xkv0p.js +211 -0
  358. package/dist/chunk-ff5xkv0p.js.map +10 -0
  359. package/dist/{chunk-br3k6qbf.js → chunk-fm62y49k.js} +1 -1
  360. package/dist/{chunk-nq6gpjt7.js → chunk-fntqb7qy.js} +30 -4
  361. package/dist/{chunk-nq6gpjt7.js.map → chunk-fntqb7qy.js.map} +5 -5
  362. package/dist/{chunk-1zq2p6g0.js → chunk-fp2kq35z.js} +26 -10
  363. package/dist/{chunk-1zq2p6g0.js.map → chunk-fp2kq35z.js.map} +5 -5
  364. package/dist/chunk-g5bvzyyr.js +32 -0
  365. package/dist/chunk-g5bvzyyr.js.map +10 -0
  366. package/dist/{chunk-9ybhtmg4.js → chunk-g663fahq.js} +2 -2
  367. package/dist/{chunk-k6q3n2sc.js → chunk-gvj5cd3b.js} +29 -13
  368. package/dist/chunk-gvj5cd3b.js.map +12 -0
  369. package/dist/{chunk-yevzdx4y.js → chunk-h33shhq6.js} +10 -12
  370. package/dist/{chunk-yevzdx4y.js.map → chunk-h33shhq6.js.map} +3 -4
  371. package/dist/{chunk-vpq4shxz.js → chunk-h3pbv7n8.js} +1771 -36
  372. package/dist/chunk-h3pbv7n8.js.map +48 -0
  373. package/dist/chunk-hke9aeen.js +9 -0
  374. package/dist/chunk-hke9aeen.js.map +10 -0
  375. package/dist/chunk-hn2r7z41.js.map +1 -1
  376. package/dist/{chunk-pbcbn83d.js → chunk-hqsp2sx4.js} +54 -8
  377. package/dist/chunk-hqsp2sx4.js.map +14 -0
  378. package/dist/{chunk-9w055r5b.js → chunk-hwarjrgf.js} +1 -1
  379. package/dist/{chunk-9dmt152s.js → chunk-hyesv9dv.js} +2 -2
  380. package/dist/chunk-hz5d43gn.js +45 -0
  381. package/dist/chunk-hz5d43gn.js.map +10 -0
  382. package/dist/{chunk-91mg3nj9.js → chunk-j936th07.js} +86 -41
  383. package/dist/chunk-j936th07.js.map +12 -0
  384. package/dist/chunk-jcfw4h7m.js +9 -0
  385. package/dist/chunk-jcfw4h7m.js.map +10 -0
  386. package/dist/chunk-kcqpk9w1.js +75 -0
  387. package/dist/chunk-kcqpk9w1.js.map +10 -0
  388. package/dist/{chunk-x6m907x7.js → chunk-m2nevja0.js} +6 -7
  389. package/dist/{chunk-x6m907x7.js.map → chunk-m2nevja0.js.map} +3 -3
  390. package/dist/{chunk-x9v4cx1d.js → chunk-m36fw8ft.js} +1 -1
  391. package/dist/{chunk-a40ad1ft.js → chunk-mbsbxarb.js} +1 -1
  392. package/dist/chunk-mzx71snp.js +129 -0
  393. package/dist/chunk-mzx71snp.js.map +10 -0
  394. package/dist/{chunk-6aawea28.js → chunk-n8q5j6y5.js} +1 -1
  395. package/dist/{chunk-dk8tkk5f.js → chunk-n9zpx9c6.js} +4 -4
  396. package/dist/{chunk-7t429e3f.js → chunk-npcr0228.js} +1 -1
  397. package/dist/chunk-nydf3dbe.js +663 -0
  398. package/dist/chunk-nydf3dbe.js.map +13 -0
  399. package/dist/chunk-pdt5cw8z.js +233 -0
  400. package/dist/chunk-pdt5cw8z.js.map +11 -0
  401. package/dist/{chunk-rj69qcrd.js → chunk-pgrf64hp.js} +55 -7
  402. package/dist/chunk-pgrf64hp.js.map +12 -0
  403. package/dist/{chunk-z4m0yz8c.js → chunk-q4pmvkg0.js} +1 -1
  404. package/dist/chunk-qhqgp4jf.js +1418 -0
  405. package/dist/chunk-qhqgp4jf.js.map +22 -0
  406. package/dist/chunk-qx00vjrj.js +144 -0
  407. package/dist/chunk-qx00vjrj.js.map +13 -0
  408. package/dist/{chunk-5e43w60z.js → chunk-r6szek0x.js} +184 -7
  409. package/dist/chunk-r6szek0x.js.map +10 -0
  410. package/dist/{chunk-v4jbb3rs.js → chunk-rap5w0x0.js} +156 -2
  411. package/dist/chunk-rap5w0x0.js.map +10 -0
  412. package/dist/{chunk-pfp1txq2.js → chunk-sgx82nnt.js} +5 -31
  413. package/dist/{chunk-pfp1txq2.js.map → chunk-sgx82nnt.js.map} +3 -4
  414. package/dist/{chunk-bkpke1sg.js → chunk-t5608tkq.js} +3 -1
  415. package/dist/{chunk-bkpke1sg.js.map → chunk-t5608tkq.js.map} +3 -3
  416. package/dist/{chunk-29yx306f.js → chunk-tdxfsg1c.js} +507 -265
  417. package/dist/chunk-tdxfsg1c.js.map +23 -0
  418. package/dist/chunk-vabga7fk.js +176 -0
  419. package/dist/chunk-vabga7fk.js.map +12 -0
  420. package/dist/{chunk-gsjm1wms.js → chunk-vhbw5sqm.js} +33 -3
  421. package/dist/chunk-vhbw5sqm.js.map +10 -0
  422. package/dist/{chunk-tpn40322.js → chunk-vpgwq5nf.js} +104 -17
  423. package/dist/chunk-vpgwq5nf.js.map +21 -0
  424. package/dist/{chunk-0rbyz4qy.js → chunk-vyt322b6.js} +586 -171
  425. package/dist/{chunk-0rbyz4qy.js.map → chunk-vyt322b6.js.map} +12 -9
  426. package/dist/chunk-waqk73p1.js +2380 -0
  427. package/dist/chunk-waqk73p1.js.map +23 -0
  428. package/dist/{chunk-jhm3zsa7.js → chunk-wkv3h3q7.js} +64 -2
  429. package/dist/{chunk-jhm3zsa7.js.map → chunk-wkv3h3q7.js.map} +3 -3
  430. package/dist/chunk-wsc1brye.js +27 -0
  431. package/dist/chunk-wsc1brye.js.map +10 -0
  432. package/dist/chunk-x0v3jd47.js +124 -0
  433. package/dist/chunk-x0v3jd47.js.map +10 -0
  434. package/dist/{chunk-96yw3pwd.js → chunk-y7dbmaqh.js} +28 -2
  435. package/dist/chunk-y7dbmaqh.js.map +10 -0
  436. package/dist/{chunk-d0bqz29d.js → chunk-yc9ners4.js} +124 -19
  437. package/dist/{chunk-d0bqz29d.js.map → chunk-yc9ners4.js.map} +8 -8
  438. package/dist/{chunk-8mx7qw3y.js → chunk-zbc929zg.js} +29 -5
  439. package/dist/chunk-zbc929zg.js.map +13 -0
  440. package/dist/chunk-zrvhsq7f.js +37 -0
  441. package/dist/chunk-zrvhsq7f.js.map +10 -0
  442. package/dist/datasets/builders.d.ts +15 -2
  443. package/dist/datasets/builders.d.ts.map +1 -1
  444. package/dist/datasets/column-index.d.ts +7 -0
  445. package/dist/datasets/column-index.d.ts.map +1 -0
  446. package/dist/datasets/execution.d.ts +3 -2
  447. package/dist/datasets/execution.d.ts.map +1 -1
  448. package/dist/datasets/write.js +8 -8
  449. package/dist/error-reporting/internal.js +4 -4
  450. package/dist/errors/catalog.d.ts +26 -0
  451. package/dist/errors/catalog.d.ts.map +1 -1
  452. package/dist/errors/internal.d.ts +1 -0
  453. package/dist/errors/internal.d.ts.map +1 -1
  454. package/dist/errors/internal.js +7 -4
  455. package/dist/errors/internal.js.map +1 -1
  456. package/dist/events/definitions.d.ts +7 -0
  457. package/dist/events/definitions.d.ts.map +1 -1
  458. package/dist/events/execution.d.ts +12 -2
  459. package/dist/events/execution.d.ts.map +1 -1
  460. package/dist/events/index.d.ts +2 -3
  461. package/dist/events/index.d.ts.map +1 -1
  462. package/dist/events/index.js +9 -11
  463. package/dist/events/index.js.map +1 -1
  464. package/dist/events/scope.d.ts.map +1 -1
  465. package/dist/events/scope.js +1 -1
  466. package/dist/events/selectors/builder.d.ts +12 -1
  467. package/dist/events/selectors/builder.d.ts.map +1 -1
  468. package/dist/events/selectors/index.d.ts +2 -2
  469. package/dist/events/selectors/index.d.ts.map +1 -1
  470. package/dist/events/selectors/index.js +2 -2
  471. package/dist/events/selectors/types.d.ts +19 -3
  472. package/dist/events/selectors/types.d.ts.map +1 -1
  473. package/dist/events/service.d.ts +17 -2
  474. package/dist/events/service.d.ts.map +1 -1
  475. package/dist/events/types/index.d.ts +3 -1
  476. package/dist/events/types/index.d.ts.map +1 -1
  477. package/dist/events/types/users.d.ts +63 -0
  478. package/dist/events/types/users.d.ts.map +1 -0
  479. package/dist/events/view-conditions.d.ts +34 -0
  480. package/dist/events/view-conditions.d.ts.map +1 -0
  481. package/dist/execution/agent.d.ts +15 -0
  482. package/dist/execution/agent.d.ts.map +1 -1
  483. package/dist/execution/agent.js +72 -59
  484. package/dist/execution/agent.js.map +1 -1
  485. package/dist/execution/authorization.d.ts.map +1 -1
  486. package/dist/execution/authorized-object-reader.d.ts +102 -12
  487. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  488. package/dist/execution/lineage.d.ts +7 -0
  489. package/dist/execution/lineage.d.ts.map +1 -0
  490. package/dist/execution/object-reader-clearance.d.ts +41 -0
  491. package/dist/execution/object-reader-clearance.d.ts.map +1 -0
  492. package/dist/execution/object-reader-ontology.d.ts +12 -0
  493. package/dist/execution/object-reader-ontology.d.ts.map +1 -0
  494. package/dist/execution/object-reader-security.d.ts +66 -0
  495. package/dist/execution/object-reader-security.d.ts.map +1 -0
  496. package/dist/execution/object-reader-users.d.ts +20 -0
  497. package/dist/execution/object-reader-users.d.ts.map +1 -0
  498. package/dist/execution/preparation.d.ts +23 -0
  499. package/dist/execution/preparation.d.ts.map +1 -0
  500. package/dist/execution/primitive.js +70 -59
  501. package/dist/execution/primitive.js.map +1 -1
  502. package/dist/execution/request.d.ts +2 -1
  503. package/dist/execution/request.d.ts.map +1 -1
  504. package/dist/execution/request.js +72 -57
  505. package/dist/execution/request.js.map +3 -3
  506. package/dist/execution/unique-lookup.d.ts +14 -0
  507. package/dist/execution/unique-lookup.d.ts.map +1 -0
  508. package/dist/execution/visible-objects.d.ts +12 -0
  509. package/dist/execution/visible-objects.d.ts.map +1 -0
  510. package/dist/http/api-routes.d.ts +17 -0
  511. package/dist/http/api-routes.d.ts.map +1 -1
  512. package/dist/http/index.js +1 -1
  513. package/dist/index.d.ts +49 -16
  514. package/dist/index.d.ts.map +1 -1
  515. package/dist/index.js +168 -142
  516. package/dist/index.js.map +1 -1
  517. package/dist/lake-storage/in-memory.d.ts +1 -0
  518. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  519. package/dist/lake-storage/index.d.ts +6 -3
  520. package/dist/lake-storage/index.d.ts.map +1 -1
  521. package/dist/lake-storage/index.js +21 -13
  522. package/dist/lake-storage/index.js.map +1 -1
  523. package/dist/lake-storage/lineage.d.ts +94 -0
  524. package/dist/lake-storage/lineage.d.ts.map +1 -0
  525. package/dist/lake-storage/sql-transforms.d.ts +45 -0
  526. package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
  527. package/dist/lake-storage/types.d.ts +55 -1
  528. package/dist/lake-storage/types.d.ts.map +1 -1
  529. package/dist/lake-storage/version-inputs.d.ts +14 -3
  530. package/dist/lake-storage/version-inputs.d.ts.map +1 -1
  531. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  532. package/dist/materialization/errors.d.ts +25 -0
  533. package/dist/materialization/errors.d.ts.map +1 -1
  534. package/dist/materialization/event-envelopes.d.ts +5 -0
  535. package/dist/materialization/event-envelopes.d.ts.map +1 -1
  536. package/dist/materialization/index.d.ts +1 -1
  537. package/dist/materialization/index.d.ts.map +1 -1
  538. package/dist/materialization/index.js +14 -8
  539. package/dist/materialization/index.js.map +1 -1
  540. package/dist/materialization/model.d.ts +20 -2
  541. package/dist/materialization/model.d.ts.map +1 -1
  542. package/dist/materializer/edits/commit.d.ts.map +1 -1
  543. package/dist/materializer/edits/load-state.d.ts +5 -1
  544. package/dist/materializer/edits/load-state.d.ts.map +1 -1
  545. package/dist/materializer/edits/plan.d.ts.map +1 -1
  546. package/dist/materializer/edits/unique-values.d.ts +47 -0
  547. package/dist/materializer/edits/unique-values.d.ts.map +1 -0
  548. package/dist/materializer/edits/working-state.d.ts +6 -1
  549. package/dist/materializer/edits/working-state.d.ts.map +1 -1
  550. package/dist/materializer/execution/work-records.d.ts +7 -1
  551. package/dist/materializer/execution/work-records.d.ts.map +1 -1
  552. package/dist/materializer/index.js +51 -46
  553. package/dist/materializer/index.js.map +1 -1
  554. package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
  555. package/dist/materializer/projections/source-materialization.d.ts +1 -0
  556. package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
  557. package/dist/materializer/shared/normalize.d.ts.map +1 -1
  558. package/dist/materializer/shared/projection-run.d.ts +0 -1
  559. package/dist/materializer/shared/projection-run.d.ts.map +1 -1
  560. package/dist/materializer/telemetry/plan.d.ts.map +1 -1
  561. package/dist/models/audio/catalog.d.ts +13 -1
  562. package/dist/models/audio/catalog.d.ts.map +1 -1
  563. package/dist/models/audio/errors.d.ts +6 -1
  564. package/dist/models/audio/errors.d.ts.map +1 -1
  565. package/dist/models/audio/runtime.d.ts.map +1 -1
  566. package/dist/models/audio/speech.d.ts +8 -0
  567. package/dist/models/audio/speech.d.ts.map +1 -0
  568. package/dist/models/audio/types.d.ts +93 -0
  569. package/dist/models/audio/types.d.ts.map +1 -1
  570. package/dist/models/calls.d.ts +27 -0
  571. package/dist/models/calls.d.ts.map +1 -0
  572. package/dist/models/catalog-index.d.ts +7 -4
  573. package/dist/models/catalog-index.d.ts.map +1 -1
  574. package/dist/models/catalog.d.ts +55 -3
  575. package/dist/models/catalog.d.ts.map +1 -1
  576. package/dist/models/decision/runtime.d.ts +6 -1
  577. package/dist/models/decision/runtime.d.ts.map +1 -1
  578. package/dist/models/decision/validation.d.ts +4 -1
  579. package/dist/models/decision/validation.d.ts.map +1 -1
  580. package/dist/models/definitions.d.ts +23 -1
  581. package/dist/models/definitions.d.ts.map +1 -1
  582. package/dist/models/events.d.ts +12 -1
  583. package/dist/models/events.d.ts.map +1 -1
  584. package/dist/models/execution/binding.d.ts +3 -1
  585. package/dist/models/execution/binding.d.ts.map +1 -1
  586. package/dist/models/execution/index.d.ts +1 -0
  587. package/dist/models/execution/index.d.ts.map +1 -1
  588. package/dist/models/execution/index.js +50 -39
  589. package/dist/models/execution/index.js.map +1 -1
  590. package/dist/models/execution/model-call-accounting.d.ts.map +1 -1
  591. package/dist/models/execution/model-call-recorder.d.ts +3 -0
  592. package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
  593. package/dist/models/execution/usage.d.ts.map +1 -1
  594. package/dist/models/execution.d.ts +4 -2
  595. package/dist/models/execution.d.ts.map +1 -1
  596. package/dist/models/generation-types.d.ts +8 -1
  597. package/dist/models/generation-types.d.ts.map +1 -1
  598. package/dist/models/image/catalog.d.ts +13 -0
  599. package/dist/models/image/catalog.d.ts.map +1 -0
  600. package/dist/models/image/errors.d.ts +8 -0
  601. package/dist/models/image/errors.d.ts.map +1 -0
  602. package/dist/models/image/runtime.d.ts +8 -0
  603. package/dist/models/image/runtime.d.ts.map +1 -0
  604. package/dist/models/image/types.d.ts +103 -0
  605. package/dist/models/image/types.d.ts.map +1 -0
  606. package/dist/models/index.d.ts +12 -8
  607. package/dist/models/index.d.ts.map +1 -1
  608. package/dist/models/index.js +17 -7
  609. package/dist/models/index.js.map +1 -1
  610. package/dist/models/input-file.d.ts +9 -0
  611. package/dist/models/input-file.d.ts.map +1 -0
  612. package/dist/models/language-model.d.ts +13 -0
  613. package/dist/models/language-model.d.ts.map +1 -1
  614. package/dist/models/pricing.d.ts +25 -10
  615. package/dist/models/pricing.d.ts.map +1 -1
  616. package/dist/models/rate-card.d.ts +44 -6
  617. package/dist/models/rate-card.d.ts.map +1 -1
  618. package/dist/objects/clearance-redaction.d.ts +27 -0
  619. package/dist/objects/clearance-redaction.d.ts.map +1 -0
  620. package/dist/objects/conditional-writes.d.ts +37 -0
  621. package/dist/objects/conditional-writes.d.ts.map +1 -0
  622. package/dist/objects/execution.d.ts +2 -0
  623. package/dist/objects/execution.d.ts.map +1 -1
  624. package/dist/objects/index.d.ts +1 -0
  625. package/dist/objects/index.d.ts.map +1 -1
  626. package/dist/objects/index.js +77 -60
  627. package/dist/objects/index.js.map +1 -1
  628. package/dist/objects/link/authorization.d.ts +11 -5
  629. package/dist/objects/link/authorization.d.ts.map +1 -1
  630. package/dist/objects/link/endpoints.d.ts +21 -2
  631. package/dist/objects/link/endpoints.d.ts.map +1 -1
  632. package/dist/objects/link/remove.d.ts.map +1 -1
  633. package/dist/objects/link/upsert-batch.d.ts.map +1 -1
  634. package/dist/objects/link/upsert.d.ts.map +1 -1
  635. package/dist/objects/materializer-adapter.d.ts +13 -4
  636. package/dist/objects/materializer-adapter.d.ts.map +1 -1
  637. package/dist/objects/object/delete.d.ts +3 -0
  638. package/dist/objects/object/delete.d.ts.map +1 -1
  639. package/dist/objects/object/upsert-batch.d.ts.map +1 -1
  640. package/dist/objects/object/upsert.d.ts.map +1 -1
  641. package/dist/objects/property-clearance.d.ts +47 -24
  642. package/dist/objects/property-clearance.d.ts.map +1 -1
  643. package/dist/objects/query/clearance-admission.d.ts +10 -0
  644. package/dist/objects/query/clearance-admission.d.ts.map +1 -0
  645. package/dist/objects/query/current-user.d.ts +17 -0
  646. package/dist/objects/query/current-user.d.ts.map +1 -0
  647. package/dist/objects/query/executor.d.ts +14 -0
  648. package/dist/objects/query/executor.d.ts.map +1 -1
  649. package/dist/objects/query/index.d.ts +2 -2
  650. package/dist/objects/query/index.d.ts.map +1 -1
  651. package/dist/objects/query/index.js +55 -49
  652. package/dist/objects/query/index.js.map +1 -1
  653. package/dist/objects/query/ir.d.ts +19 -1
  654. package/dist/objects/query/ir.d.ts.map +1 -1
  655. package/dist/objects/query/link-query-clearance.d.ts +21 -0
  656. package/dist/objects/query/link-query-clearance.d.ts.map +1 -0
  657. package/dist/objects/query/matches-predicate.d.ts +9 -0
  658. package/dist/objects/query/matches-predicate.d.ts.map +1 -0
  659. package/dist/objects/query/normalize.d.ts.map +1 -1
  660. package/dist/objects/query/user-expansions.d.ts +27 -0
  661. package/dist/objects/query/user-expansions.d.ts.map +1 -0
  662. package/dist/objects/query/validate.d.ts.map +1 -1
  663. package/dist/objects/runtime-batch.d.ts +3 -1
  664. package/dist/objects/runtime-batch.d.ts.map +1 -1
  665. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  666. package/dist/objects/sdk/query-executor.d.ts +6 -0
  667. package/dist/objects/sdk/query-executor.d.ts.map +1 -1
  668. package/dist/objects/serialize.d.ts +39 -0
  669. package/dist/objects/serialize.d.ts.map +1 -0
  670. package/dist/objects/unique-violation.d.ts +22 -0
  671. package/dist/objects/unique-violation.d.ts.map +1 -0
  672. package/dist/ontology/builders.d.ts +3 -1
  673. package/dist/ontology/builders.d.ts.map +1 -1
  674. package/dist/ontology/docs-markdown.d.ts +1 -1
  675. package/dist/ontology/docs-markdown.d.ts.map +1 -1
  676. package/dist/ontology/index.d.ts +2 -2
  677. package/dist/ontology/index.d.ts.map +1 -1
  678. package/dist/ontology/index.js +13 -9
  679. package/dist/ontology/index.js.map +1 -1
  680. package/dist/ontology/internal.js +9 -7
  681. package/dist/ontology/internal.js.map +3 -3
  682. package/dist/ontology/json-schema.d.ts.map +1 -1
  683. package/dist/ontology/primitives.d.ts +3 -0
  684. package/dist/ontology/primitives.d.ts.map +1 -1
  685. package/dist/ontology/registry.d.ts +6 -0
  686. package/dist/ontology/registry.d.ts.map +1 -1
  687. package/dist/ontology/types.d.ts +9 -0
  688. package/dist/ontology/types.d.ts.map +1 -1
  689. package/dist/ontology/unique-values.d.ts +26 -0
  690. package/dist/ontology/unique-values.d.ts.map +1 -0
  691. package/dist/ontology/user-ref.d.ts +23 -0
  692. package/dist/ontology/user-ref.d.ts.map +1 -1
  693. package/dist/ontology/validation/properties.d.ts.map +1 -1
  694. package/dist/ontology/validation/schema.d.ts.map +1 -1
  695. package/dist/pipelines/index.d.ts +2 -0
  696. package/dist/pipelines/index.d.ts.map +1 -1
  697. package/dist/pipelines/index.js +61 -46
  698. package/dist/pipelines/index.js.map +1 -1
  699. package/dist/pipelines/lineage.d.ts +17 -0
  700. package/dist/pipelines/lineage.d.ts.map +1 -0
  701. package/dist/projections/internal.d.ts +2 -2
  702. package/dist/projections/internal.js +42 -38
  703. package/dist/projections/internal.js.map +1 -1
  704. package/dist/projections/registry.d.ts +4 -0
  705. package/dist/projections/registry.d.ts.map +1 -1
  706. package/dist/projections/revision.d.ts +15 -0
  707. package/dist/projections/revision.d.ts.map +1 -1
  708. package/dist/projections/run-dispatch.d.ts.map +1 -1
  709. package/dist/projections/types.d.ts +2 -0
  710. package/dist/projections/types.d.ts.map +1 -1
  711. package/dist/query.d.ts +4 -2
  712. package/dist/query.d.ts.map +1 -1
  713. package/dist/query.js +2 -2
  714. package/dist/rules/execution.d.ts.map +1 -1
  715. package/dist/runtime/ai-cost.d.ts +2 -0
  716. package/dist/runtime/ai-cost.d.ts.map +1 -1
  717. package/dist/runtime/ai-usage.d.ts +7 -0
  718. package/dist/runtime/ai-usage.d.ts.map +1 -1
  719. package/dist/runtime/create.d.ts +3 -0
  720. package/dist/runtime/create.d.ts.map +1 -1
  721. package/dist/runtime/host.d.ts +6 -0
  722. package/dist/runtime/host.d.ts.map +1 -1
  723. package/dist/runtime/index.d.ts +1 -1
  724. package/dist/runtime/index.d.ts.map +1 -1
  725. package/dist/runtime/internal.d.ts +2 -0
  726. package/dist/runtime/internal.d.ts.map +1 -1
  727. package/dist/runtime/internal.js +58 -50
  728. package/dist/runtime/internal.js.map +1 -1
  729. package/dist/runtime/ontology-mutations.d.ts +2 -0
  730. package/dist/runtime/ontology-mutations.d.ts.map +1 -1
  731. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  732. package/dist/runtime/sixb.d.ts +10 -0
  733. package/dist/runtime/sixb.d.ts.map +1 -1
  734. package/dist/runtime/types.d.ts +66 -8
  735. package/dist/runtime/types.d.ts.map +1 -1
  736. package/dist/sandboxes/auth.d.ts +16 -0
  737. package/dist/sandboxes/auth.d.ts.map +1 -1
  738. package/dist/sandboxes/config.d.ts.map +1 -1
  739. package/dist/sandboxes/configuration.d.ts +26 -0
  740. package/dist/sandboxes/configuration.d.ts.map +1 -1
  741. package/dist/sandboxes/index.d.ts +1 -1
  742. package/dist/sandboxes/index.d.ts.map +1 -1
  743. package/dist/sandboxes/index.js +15 -13
  744. package/dist/sandboxes/index.js.map +1 -1
  745. package/dist/sandboxes/sandbox.d.ts +28 -5
  746. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  747. package/dist/schedules/builders.d.ts.map +1 -1
  748. package/dist/schedules/index.js +3 -3
  749. package/dist/schedules/runtime.d.ts.map +1 -1
  750. package/dist/schedules/validation.d.ts.map +1 -1
  751. package/dist/security/applied-markings-contribution.d.ts +58 -0
  752. package/dist/security/applied-markings-contribution.d.ts.map +1 -0
  753. package/dist/security/applied-markings-host.d.ts +10 -0
  754. package/dist/security/applied-markings-host.d.ts.map +1 -0
  755. package/dist/security/applied-markings-snapshot.d.ts +67 -0
  756. package/dist/security/applied-markings-snapshot.d.ts.map +1 -0
  757. package/dist/security/applied-markings.d.ts +73 -0
  758. package/dist/security/applied-markings.d.ts.map +1 -0
  759. package/dist/security/dataset-version-markings.d.ts +47 -0
  760. package/dist/security/dataset-version-markings.d.ts.map +1 -0
  761. package/dist/security/grants.d.ts +13 -4
  762. package/dist/security/grants.d.ts.map +1 -1
  763. package/dist/security/index.d.ts +2 -1
  764. package/dist/security/index.d.ts.map +1 -1
  765. package/dist/security/internal.d.ts +15 -0
  766. package/dist/security/internal.d.ts.map +1 -0
  767. package/dist/security/internal.js +135 -0
  768. package/dist/security/internal.js.map +10 -0
  769. package/dist/security/marking-propagation.d.ts +62 -0
  770. package/dist/security/marking-propagation.d.ts.map +1 -0
  771. package/dist/security/marking-sets.d.ts +14 -0
  772. package/dist/security/marking-sets.d.ts.map +1 -0
  773. package/dist/security/markings.d.ts +6 -3
  774. package/dist/security/markings.d.ts.map +1 -1
  775. package/dist/security/pipeline-markings.d.ts +20 -0
  776. package/dist/security/pipeline-markings.d.ts.map +1 -0
  777. package/dist/security/project.d.ts +7 -0
  778. package/dist/security/project.d.ts.map +1 -0
  779. package/dist/security/projection-markings.d.ts +71 -0
  780. package/dist/security/projection-markings.d.ts.map +1 -0
  781. package/dist/security/public.js +2 -2
  782. package/dist/security/redactions.d.ts +4 -1
  783. package/dist/security/redactions.d.ts.map +1 -1
  784. package/dist/security/registry.d.ts +6 -0
  785. package/dist/security/registry.d.ts.map +1 -1
  786. package/dist/security/types.d.ts +64 -6
  787. package/dist/security/types.d.ts.map +1 -1
  788. package/dist/security/validation.d.ts.map +1 -1
  789. package/dist/security/view-conditions.d.ts +37 -0
  790. package/dist/security/view-conditions.d.ts.map +1 -0
  791. package/dist/shares/execution.d.ts.map +1 -1
  792. package/dist/shares/internal.js +40 -36
  793. package/dist/shares/internal.js.map +2 -2
  794. package/dist/storage/action-runs/failure.js +3 -3
  795. package/dist/storage/action-runs/in-memory.d.ts +4 -0
  796. package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
  797. package/dist/storage/action-runs/provider.js +1 -1
  798. package/dist/storage/action-runs/types.d.ts +9 -1
  799. package/dist/storage/action-runs/types.d.ts.map +1 -1
  800. package/dist/storage/activity/in-memory.d.ts +55 -0
  801. package/dist/storage/activity/in-memory.d.ts.map +1 -0
  802. package/dist/storage/activity/index.d.ts +3 -0
  803. package/dist/storage/activity/index.d.ts.map +1 -0
  804. package/dist/storage/activity/policy.d.ts +96 -0
  805. package/dist/storage/activity/policy.d.ts.map +1 -0
  806. package/dist/storage/activity/types.d.ts +191 -0
  807. package/dist/storage/activity/types.d.ts.map +1 -0
  808. package/dist/storage/agents/errors.d.ts +3 -1
  809. package/dist/storage/agents/errors.d.ts.map +1 -1
  810. package/dist/storage/agents/in-memory.d.ts +124 -3
  811. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  812. package/dist/storage/agents/index.d.ts +2 -2
  813. package/dist/storage/agents/index.d.ts.map +1 -1
  814. package/dist/storage/agents/provider.d.ts +154 -4
  815. package/dist/storage/agents/provider.d.ts.map +1 -1
  816. package/dist/storage/agents/provider.js +60 -8
  817. package/dist/storage/agents/provider.js.map +1 -1
  818. package/dist/storage/agents/types.d.ts +573 -20
  819. package/dist/storage/agents/types.d.ts.map +1 -1
  820. package/dist/storage/ai-cost/analytics.d.ts +10 -1
  821. package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
  822. package/dist/storage/ai-cost/groups.d.ts +9 -0
  823. package/dist/storage/ai-cost/groups.d.ts.map +1 -1
  824. package/dist/storage/ai-cost/index.d.ts +1 -1
  825. package/dist/storage/ai-cost/index.d.ts.map +1 -1
  826. package/dist/storage/ai-cost/provider.d.ts +2 -1
  827. package/dist/storage/ai-cost/provider.d.ts.map +1 -1
  828. package/dist/storage/ai-cost/provider.js +11 -5
  829. package/dist/storage/ai-cost/provider.js.map +1 -1
  830. package/dist/storage/ai-cost/types.d.ts +14 -2
  831. package/dist/storage/ai-cost/types.d.ts.map +1 -1
  832. package/dist/storage/ai-cost/validation.d.ts.map +1 -1
  833. package/dist/storage/ai-limits/enforcement.js +6 -5
  834. package/dist/storage/ai-limits/enforcement.js.map +1 -1
  835. package/dist/storage/ai-limits/provider.d.ts +1 -1
  836. package/dist/storage/ai-limits/provider.d.ts.map +1 -1
  837. package/dist/storage/ai-limits/provider.js +3 -2
  838. package/dist/storage/ai-limits/provider.js.map +1 -1
  839. package/dist/storage/ai-usage/in-memory.d.ts +5 -1
  840. package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
  841. package/dist/storage/ai-usage/index.d.ts +2 -2
  842. package/dist/storage/ai-usage/index.d.ts.map +1 -1
  843. package/dist/storage/ai-usage/record.d.ts +5 -1
  844. package/dist/storage/ai-usage/record.d.ts.map +1 -1
  845. package/dist/storage/ai-usage/types.d.ts +33 -0
  846. package/dist/storage/ai-usage/types.d.ts.map +1 -1
  847. package/dist/storage/ai-usage/usage.d.ts +2 -0
  848. package/dist/storage/ai-usage/usage.d.ts.map +1 -1
  849. package/dist/storage/artifacts/errors.d.ts +18 -0
  850. package/dist/storage/artifacts/errors.d.ts.map +1 -0
  851. package/dist/storage/artifacts/in-memory.d.ts +55 -0
  852. package/dist/storage/artifacts/in-memory.d.ts.map +1 -0
  853. package/dist/storage/artifacts/index.d.ts +5 -0
  854. package/dist/storage/artifacts/index.d.ts.map +1 -0
  855. package/dist/storage/artifacts/record.d.ts +34 -0
  856. package/dist/storage/artifacts/record.d.ts.map +1 -0
  857. package/dist/storage/artifacts/types.d.ts +263 -0
  858. package/dist/storage/artifacts/types.d.ts.map +1 -0
  859. package/dist/storage/auth/in-memory/auth-storage.d.ts +3 -2
  860. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  861. package/dist/storage/auth/in-memory/sessions.d.ts +2 -1
  862. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  863. package/dist/storage/auth/in-memory/users.d.ts +7 -3
  864. package/dist/storage/auth/in-memory/users.d.ts.map +1 -1
  865. package/dist/storage/auth/index.d.ts +1 -1
  866. package/dist/storage/auth/index.d.ts.map +1 -1
  867. package/dist/storage/auth/types.d.ts +59 -9
  868. package/dist/storage/auth/types.d.ts.map +1 -1
  869. package/dist/storage/connector-connections/provider.js +2 -2
  870. package/dist/storage/executions/in-memory.d.ts +3 -1
  871. package/dist/storage/executions/in-memory.d.ts.map +1 -1
  872. package/dist/storage/executions/index.d.ts +1 -1
  873. package/dist/storage/executions/index.d.ts.map +1 -1
  874. package/dist/storage/executions/provider.d.ts +2 -0
  875. package/dist/storage/executions/provider.d.ts.map +1 -1
  876. package/dist/storage/executions/provider.js +9 -223
  877. package/dist/storage/executions/provider.js.map +3 -4
  878. package/dist/storage/executions/types.d.ts +46 -0
  879. package/dist/storage/executions/types.d.ts.map +1 -1
  880. package/dist/storage/file-upload-sessions/provider.js +17 -14
  881. package/dist/storage/file-upload-sessions/provider.js.map +1 -1
  882. package/dist/storage/in-memory/index.d.ts +8 -0
  883. package/dist/storage/in-memory/index.d.ts.map +1 -1
  884. package/dist/storage/index.d.ts +15 -11
  885. package/dist/storage/index.d.ts.map +1 -1
  886. package/dist/storage/index.js +78 -66
  887. package/dist/storage/index.js.map +1 -1
  888. package/dist/storage/internal.d.ts +4 -1
  889. package/dist/storage/internal.d.ts.map +1 -1
  890. package/dist/storage/internal.js +80 -19
  891. package/dist/storage/internal.js.map +1 -1
  892. package/dist/storage/migrations/migrate-storage.d.ts +4 -1
  893. package/dist/storage/migrations/migrate-storage.d.ts.map +1 -1
  894. package/dist/storage/migrations/prepare-unique-properties.d.ts +18 -0
  895. package/dist/storage/migrations/prepare-unique-properties.d.ts.map +1 -0
  896. package/dist/storage/objects/guard.d.ts +1 -1
  897. package/dist/storage/objects/guard.d.ts.map +1 -1
  898. package/dist/storage/objects/in-memory/conditional-reader.d.ts +5 -0
  899. package/dist/storage/objects/in-memory/conditional-reader.d.ts.map +1 -0
  900. package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
  901. package/dist/storage/objects/in-memory/read-scope.d.ts +3 -9
  902. package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -1
  903. package/dist/storage/objects/in-memory/read-source.d.ts +10 -1
  904. package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -1
  905. package/dist/storage/objects/in-memory/scoped-reader.d.ts +14 -0
  906. package/dist/storage/objects/in-memory/scoped-reader.d.ts.map +1 -0
  907. package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
  908. package/dist/storage/objects/in-memory/storage.d.ts +36 -1
  909. package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
  910. package/dist/storage/objects/index.d.ts +2 -2
  911. package/dist/storage/objects/index.d.ts.map +1 -1
  912. package/dist/storage/objects/read-scope.d.ts +9 -1
  913. package/dist/storage/objects/read-scope.d.ts.map +1 -1
  914. package/dist/storage/objects/types.d.ts +64 -1
  915. package/dist/storage/objects/types.d.ts.map +1 -1
  916. package/dist/storage/ontology/in-memory/index.d.ts +2 -0
  917. package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
  918. package/dist/storage/ontology/in-memory/materializations.d.ts +1 -0
  919. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  920. package/dist/storage/ontology/in-memory/replacement-plans.d.ts.map +1 -1
  921. package/dist/storage/ontology/in-memory/sources.d.ts +2 -1
  922. package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
  923. package/dist/storage/ontology/in-memory/unique-values.d.ts +32 -0
  924. package/dist/storage/ontology/in-memory/unique-values.d.ts.map +1 -0
  925. package/dist/storage/ontology/index.d.ts +5 -2
  926. package/dist/storage/ontology/index.d.ts.map +1 -1
  927. package/dist/storage/ontology/materializations.d.ts +34 -1
  928. package/dist/storage/ontology/materializations.d.ts.map +1 -1
  929. package/dist/storage/ontology/provider-work.d.ts +15 -2
  930. package/dist/storage/ontology/provider-work.d.ts.map +1 -1
  931. package/dist/storage/ontology/provider.d.ts +1 -1
  932. package/dist/storage/ontology/provider.d.ts.map +1 -1
  933. package/dist/storage/ontology/provider.js +9 -4
  934. package/dist/storage/ontology/provider.js.map +1 -1
  935. package/dist/storage/ontology/sources.d.ts +15 -0
  936. package/dist/storage/ontology/sources.d.ts.map +1 -1
  937. package/dist/storage/ontology/unique-values.d.ts +54 -0
  938. package/dist/storage/ontology/unique-values.d.ts.map +1 -0
  939. package/dist/storage/operation-scope.d.ts +1 -1
  940. package/dist/storage/operation-scope.d.ts.map +1 -1
  941. package/dist/storage/operation-scope.js +1 -1
  942. package/dist/storage/projection-runs/in-memory.d.ts +0 -6
  943. package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
  944. package/dist/storage/projection-runs/provider.js +3 -3
  945. package/dist/storage/share-grants/in-memory.d.ts +2 -1
  946. package/dist/storage/share-grants/in-memory.d.ts.map +1 -1
  947. package/dist/storage/share-grants/index.d.ts +1 -1
  948. package/dist/storage/share-grants/index.d.ts.map +1 -1
  949. package/dist/storage/share-grants/provider.js +4 -3
  950. package/dist/storage/share-grants/provider.js.map +1 -1
  951. package/dist/storage/share-grants/types.d.ts +6 -0
  952. package/dist/storage/share-grants/types.d.ts.map +1 -1
  953. package/dist/storage/types.d.ts +6 -2
  954. package/dist/storage/types.d.ts.map +1 -1
  955. package/dist/storage/workflow-runs/in-memory.d.ts +4 -0
  956. package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
  957. package/dist/storage/workflow-runs/provider.js +18 -14
  958. package/dist/storage/workflow-runs/provider.js.map +1 -1
  959. package/dist/storage/workflow-runs/types.d.ts +5 -0
  960. package/dist/storage/workflow-runs/types.d.ts.map +1 -1
  961. package/dist/syncs/index.js +49 -45
  962. package/dist/syncs/index.js.map +1 -1
  963. package/dist/testing/action-run-storage-contract.d.ts.map +1 -1
  964. package/dist/testing/activity-storage-contract.d.ts +14 -0
  965. package/dist/testing/activity-storage-contract.d.ts.map +1 -0
  966. package/dist/testing/agent-approval-storage-contract.d.ts +17 -0
  967. package/dist/testing/agent-approval-storage-contract.d.ts.map +1 -0
  968. package/dist/testing/agent-memory-storage-contract.d.ts +12 -0
  969. package/dist/testing/agent-memory-storage-contract.d.ts.map +1 -0
  970. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  971. package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
  972. package/dist/testing/ai-limit-storage-contract.d.ts +0 -1
  973. package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -1
  974. package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -1
  975. package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
  976. package/dist/testing/artifact-storage-contract.d.ts +13 -0
  977. package/dist/testing/artifact-storage-contract.d.ts.map +1 -0
  978. package/dist/testing/auth-storage-contract.d.ts +13 -0
  979. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  980. package/dist/testing/broker-contract.d.ts +5 -0
  981. package/dist/testing/broker-contract.d.ts.map +1 -1
  982. package/dist/testing/effective-storage-contract.d.ts.map +1 -1
  983. package/dist/testing/execution-storage-contract.d.ts.map +1 -1
  984. package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -1
  985. package/dist/testing/index.d.ts +11 -5
  986. package/dist/testing/index.d.ts.map +1 -1
  987. package/dist/testing/index.js +9340 -3794
  988. package/dist/testing/index.js.map +32 -26
  989. package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
  990. package/dist/testing/lake-storage-contract.d.ts +2 -0
  991. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  992. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  993. package/dist/testing/object-conditional-read-scope-contract.d.ts +11 -0
  994. package/dist/testing/object-conditional-read-scope-contract.d.ts.map +1 -0
  995. package/dist/testing/object-query-contract.d.ts +0 -2
  996. package/dist/testing/object-query-contract.d.ts.map +1 -1
  997. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  998. package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
  999. package/dist/testing/queues-contract.d.ts +5 -0
  1000. package/dist/testing/queues-contract.d.ts.map +1 -1
  1001. package/dist/testing/sandboxes-contract.d.ts.map +1 -1
  1002. package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
  1003. package/dist/testing/share-session-storage-contract.d.ts.map +1 -1
  1004. package/dist/testing/unique-values-contract.d.ts +21 -0
  1005. package/dist/testing/unique-values-contract.d.ts.map +1 -0
  1006. package/dist/testing/webhook-execution.d.ts +0 -8
  1007. package/dist/testing/webhook-execution.d.ts.map +1 -1
  1008. package/dist/testing/webhook-run-storage-contract.d.ts.map +1 -1
  1009. package/dist/users/execution.d.ts +40 -0
  1010. package/dist/users/execution.d.ts.map +1 -0
  1011. package/dist/users/index.d.ts +3 -0
  1012. package/dist/users/index.d.ts.map +1 -0
  1013. package/dist/webhooks/internal.js +42 -38
  1014. package/dist/webhooks/internal.js.map +2 -2
  1015. package/dist/workers/index.js +5 -7
  1016. package/dist/workers/index.js.map +4 -4
  1017. package/dist/workers/queue-worker.d.ts +0 -2
  1018. package/dist/workers/queue-worker.d.ts.map +1 -1
  1019. package/dist/workers/worker.d.ts +0 -2
  1020. package/dist/workers/worker.d.ts.map +1 -1
  1021. package/dist/workflows/builders.d.ts.map +1 -1
  1022. package/dist/workflows/index.js +76 -66
  1023. package/dist/workflows/index.js.map +1 -1
  1024. package/dist/workflows/request.d.ts +12 -1
  1025. package/dist/workflows/request.d.ts.map +1 -1
  1026. package/dist/workflows/types.d.ts +15 -2
  1027. package/dist/workflows/types.d.ts.map +1 -1
  1028. package/dist/workflows/validation.d.ts +7 -0
  1029. package/dist/workflows/validation.d.ts.map +1 -1
  1030. package/package.json +25 -1
  1031. package/src/actions/commit-edits.ts +6 -1
  1032. package/src/actions/execution.ts +55 -23
  1033. package/src/actions/read-facade.ts +33 -0
  1034. package/src/actions/request.ts +234 -66
  1035. package/src/actions/run/context.ts +47 -1
  1036. package/src/actions/run/execute.ts +13 -6
  1037. package/src/actions/run/executor.ts +11 -2
  1038. package/src/actions/run/normalize.ts +12 -2
  1039. package/src/actions/run/phases.ts +2 -0
  1040. package/src/actions/run/run-action.ts +12 -3
  1041. package/src/actions/run/signals.ts +3 -9
  1042. package/src/actions/run/types.ts +17 -1
  1043. package/src/actions/run-authorization.ts +95 -0
  1044. package/src/actions/types/context.ts +20 -3
  1045. package/src/actions/validators.ts +19 -8
  1046. package/src/activity/README.md +158 -0
  1047. package/src/activity/connection.ts +217 -0
  1048. package/src/activity/device.ts +41 -0
  1049. package/src/activity/execution.ts +210 -0
  1050. package/src/activity/service.ts +274 -0
  1051. package/src/activity/shares.ts +62 -0
  1052. package/src/activity/timeline.ts +385 -0
  1053. package/src/agents/accounting.ts +59 -0
  1054. package/src/agents/adapters.ts +10 -0
  1055. package/src/agents/agent-mail.ts +29 -0
  1056. package/src/agents/api-gateway.ts +14 -3
  1057. package/src/agents/approval-continuation.ts +48 -0
  1058. package/src/agents/approval-executor.ts +318 -0
  1059. package/src/agents/approval-outcome.ts +59 -0
  1060. package/src/agents/approvals.ts +566 -0
  1061. package/src/agents/authority.ts +24 -1
  1062. package/src/agents/builders.ts +5 -3
  1063. package/src/agents/cancel.ts +103 -0
  1064. package/src/agents/child-question.ts +46 -0
  1065. package/src/agents/children.ts +404 -0
  1066. package/src/agents/context-compaction.ts +12 -0
  1067. package/src/agents/errors.ts +31 -0
  1068. package/src/agents/execution.ts +788 -90
  1069. package/src/agents/fork.ts +158 -0
  1070. package/src/agents/ids.ts +18 -6
  1071. package/src/agents/index.ts +63 -3
  1072. package/src/agents/memory-execution.ts +186 -0
  1073. package/src/agents/memory.ts +178 -0
  1074. package/src/agents/message.ts +57 -0
  1075. package/src/agents/model-loop.ts +93 -6
  1076. package/src/agents/model-routing.ts +193 -0
  1077. package/src/agents/participants.ts +213 -0
  1078. package/src/agents/reference.ts +2 -0
  1079. package/src/agents/request.ts +398 -64
  1080. package/src/agents/run-scope.ts +134 -0
  1081. package/src/agents/skills.ts +6 -0
  1082. package/src/agents/streams/index.ts +5 -0
  1083. package/src/agents/streams/internal.ts +1 -0
  1084. package/src/agents/streams/protocol.ts +385 -7
  1085. package/src/agents/subagent-runs.ts +41 -0
  1086. package/src/agents/thread-access.ts +137 -0
  1087. package/src/agents/tool-definition.ts +5 -3
  1088. package/src/agents/types.ts +43 -18
  1089. package/src/agents/validation.ts +4 -0
  1090. package/src/artifacts/access.ts +125 -0
  1091. package/src/artifacts/address.ts +132 -0
  1092. package/src/artifacts/canvas.ts +369 -0
  1093. package/src/artifacts/csv.ts +118 -0
  1094. package/src/artifacts/errors.ts +32 -0
  1095. package/src/artifacts/execution.ts +553 -0
  1096. package/src/artifacts/formula/check.ts +171 -0
  1097. package/src/artifacts/formula/evaluate.ts +288 -0
  1098. package/src/artifacts/formula/index.ts +199 -0
  1099. package/src/artifacts/formula/parser.ts +357 -0
  1100. package/src/artifacts/frames/assets.ts +104 -0
  1101. package/src/artifacts/frames/entries.ts +35 -0
  1102. package/src/artifacts/frames/grants.ts +125 -0
  1103. package/src/artifacts/frames/index.ts +21 -0
  1104. package/src/artifacts/frames/kit.ts +569 -0
  1105. package/src/artifacts/frames/probe.ts +357 -0
  1106. package/src/artifacts/frames/protocol.ts +328 -0
  1107. package/src/artifacts/frames/runtime.ts +458 -0
  1108. package/src/artifacts/html.ts +25 -0
  1109. package/src/artifacts/ids.ts +18 -0
  1110. package/src/artifacts/index.ts +125 -0
  1111. package/src/artifacts/kinds.ts +8 -0
  1112. package/src/artifacts/limits.ts +58 -0
  1113. package/src/artifacts/live-sheet.ts +345 -0
  1114. package/src/artifacts/outline.ts +95 -0
  1115. package/src/artifacts/publish/files.ts +87 -0
  1116. package/src/artifacts/publish/index.ts +14 -0
  1117. package/src/artifacts/publish/publish.ts +336 -0
  1118. package/src/artifacts/publish/queries.ts +336 -0
  1119. package/src/artifacts/publish/references.ts +135 -0
  1120. package/src/artifacts/publish/validate/canvas.ts +118 -0
  1121. package/src/artifacts/publish/validate/document.ts +114 -0
  1122. package/src/artifacts/publish/validate/file.ts +19 -0
  1123. package/src/artifacts/publish/validate/html.ts +78 -0
  1124. package/src/artifacts/publish/validate/page.ts +65 -0
  1125. package/src/artifacts/publish/validate/sheet.ts +297 -0
  1126. package/src/artifacts/publish/validate/slides.ts +82 -0
  1127. package/src/artifacts/queries.ts +512 -0
  1128. package/src/artifacts/references.ts +11 -0
  1129. package/src/artifacts/resolve.ts +112 -0
  1130. package/src/artifacts/run-query.ts +212 -0
  1131. package/src/artifacts/serialize-query.ts +25 -0
  1132. package/src/artifacts/sheet-rules.ts +180 -0
  1133. package/src/artifacts/theme.ts +116 -0
  1134. package/src/artifacts/tones.ts +20 -0
  1135. package/src/artifacts/warnings.ts +10 -0
  1136. package/src/artifacts/workbook.ts +674 -0
  1137. package/src/auth/index.ts +4 -0
  1138. package/src/auth/member-events.ts +114 -0
  1139. package/src/auth/profile.ts +118 -0
  1140. package/src/auth/runtime.ts +190 -9
  1141. package/src/auth/strategy.ts +3 -0
  1142. package/src/auth/types.ts +32 -0
  1143. package/src/authorization/decision.ts +52 -0
  1144. package/src/authorization/event-visibility.ts +17 -16
  1145. package/src/authorization/grant-kinds.ts +46 -2
  1146. package/src/authorization/index.ts +6 -1
  1147. package/src/authorization/resolve.ts +58 -1
  1148. package/src/authorization/run-visibility.ts +8 -1
  1149. package/src/authorization/types.ts +14 -0
  1150. package/src/blob-storage/internal.ts +1 -1
  1151. package/src/blob-storage/media-type.ts +69 -0
  1152. package/src/datasets/builders.ts +66 -2
  1153. package/src/datasets/column-index.ts +19 -0
  1154. package/src/datasets/execution.ts +23 -9
  1155. package/src/errors/catalog.ts +26 -1
  1156. package/src/errors/internal.ts +18 -8
  1157. package/src/events/definitions.ts +26 -0
  1158. package/src/events/execution.ts +171 -21
  1159. package/src/events/index.ts +10 -1
  1160. package/src/events/scope.ts +2 -0
  1161. package/src/events/selectors/builder.ts +50 -0
  1162. package/src/events/selectors/index.ts +4 -0
  1163. package/src/events/selectors/types.ts +32 -1
  1164. package/src/events/service.ts +55 -2
  1165. package/src/events/types/index.ts +10 -0
  1166. package/src/events/types/users.ts +73 -0
  1167. package/src/events/view-conditions.ts +241 -0
  1168. package/src/execution/agent.ts +25 -0
  1169. package/src/execution/authorization.ts +70 -0
  1170. package/src/execution/authorized-object-reader.ts +486 -266
  1171. package/src/execution/lineage.ts +14 -0
  1172. package/src/execution/object-reader-clearance.ts +91 -0
  1173. package/src/execution/object-reader-ontology.ts +60 -0
  1174. package/src/execution/object-reader-security.ts +270 -0
  1175. package/src/execution/object-reader-users.ts +122 -0
  1176. package/src/execution/preparation.ts +78 -0
  1177. package/src/execution/request.ts +2 -0
  1178. package/src/execution/unique-lookup.ts +55 -0
  1179. package/src/execution/visible-objects.ts +26 -0
  1180. package/src/http/api-routes.ts +331 -7
  1181. package/src/index.ts +169 -4
  1182. package/src/lake-storage/in-memory.ts +26 -3
  1183. package/src/lake-storage/index.ts +13 -1
  1184. package/src/lake-storage/lineage.ts +385 -0
  1185. package/src/lake-storage/sql-transforms.ts +45 -0
  1186. package/src/lake-storage/types.ts +59 -1
  1187. package/src/lake-storage/version-inputs.ts +35 -6
  1188. package/src/maintenance/ontology-maintenance.ts +15 -0
  1189. package/src/materialization/errors.ts +37 -0
  1190. package/src/materialization/event-envelopes.ts +11 -3
  1191. package/src/materialization/index.ts +1 -0
  1192. package/src/materialization/model.ts +24 -4
  1193. package/src/materializer/README.md +7 -1
  1194. package/src/materializer/edits/commit.ts +56 -12
  1195. package/src/materializer/edits/load-state.ts +15 -7
  1196. package/src/materializer/edits/operations.ts +12 -0
  1197. package/src/materializer/edits/plan.ts +2 -0
  1198. package/src/materializer/edits/unique-values.ts +255 -0
  1199. package/src/materializer/edits/working-state.ts +8 -1
  1200. package/src/materializer/execution/work-records.ts +47 -0
  1201. package/src/materializer/projections/finish-run.ts +0 -1
  1202. package/src/materializer/projections/replace.ts +1 -1
  1203. package/src/materializer/projections/replacement-plan.ts +4 -1
  1204. package/src/materializer/projections/source-materialization.ts +2 -1
  1205. package/src/materializer/shared/normalize.ts +37 -6
  1206. package/src/materializer/shared/projection-run.ts +1 -2
  1207. package/src/materializer/telemetry/append.ts +14 -17
  1208. package/src/materializer/telemetry/plan.ts +2 -0
  1209. package/src/models/audio/catalog.ts +89 -10
  1210. package/src/models/audio/errors.ts +18 -1
  1211. package/src/models/audio/runtime.ts +10 -13
  1212. package/src/models/audio/speech.ts +261 -0
  1213. package/src/models/audio/types.ts +97 -0
  1214. package/src/models/calls.ts +100 -0
  1215. package/src/models/catalog-index.ts +21 -2
  1216. package/src/models/catalog.ts +211 -35
  1217. package/src/models/decision/runtime.ts +21 -22
  1218. package/src/models/decision/validation.ts +4 -1
  1219. package/src/models/definitions.ts +57 -8
  1220. package/src/models/events.ts +72 -1
  1221. package/src/models/execution/README.md +34 -5
  1222. package/src/models/execution/binding.ts +3 -1
  1223. package/src/models/execution/embedding.ts +1 -0
  1224. package/src/models/execution/index.ts +5 -0
  1225. package/src/models/execution/model-call-accounting.ts +3 -1
  1226. package/src/models/execution/model-call-recorder.ts +29 -1
  1227. package/src/models/execution/usage.ts +8 -0
  1228. package/src/models/execution.ts +20 -22
  1229. package/src/models/generation-types.ts +8 -1
  1230. package/src/models/image/catalog.ts +89 -0
  1231. package/src/models/image/errors.ts +19 -0
  1232. package/src/models/image/runtime.ts +335 -0
  1233. package/src/models/image/types.ts +111 -0
  1234. package/src/models/index.ts +38 -4
  1235. package/src/models/{audio/file.ts → input-file.ts} +22 -13
  1236. package/src/models/language-model.ts +13 -0
  1237. package/src/models/pricing.ts +263 -42
  1238. package/src/models/rate-card.ts +161 -12
  1239. package/src/objects/authorized-ontology-view.ts +1 -0
  1240. package/src/objects/clearance-redaction.ts +138 -0
  1241. package/src/objects/conditional-writes.ts +109 -0
  1242. package/src/objects/execution.ts +4 -0
  1243. package/src/objects/index.ts +8 -0
  1244. package/src/objects/link/authorization.ts +37 -8
  1245. package/src/objects/link/endpoints.ts +42 -11
  1246. package/src/objects/link/remove.ts +27 -12
  1247. package/src/objects/link/upsert-batch.ts +9 -5
  1248. package/src/objects/link/upsert.ts +20 -14
  1249. package/src/objects/materializer-adapter.ts +55 -18
  1250. package/src/objects/object/delete.ts +26 -7
  1251. package/src/objects/object/upsert-batch.ts +46 -18
  1252. package/src/objects/object/upsert.ts +25 -8
  1253. package/src/objects/property-clearance.ts +171 -152
  1254. package/src/objects/query/clearance-admission.ts +112 -0
  1255. package/src/objects/query/current-user.ts +76 -0
  1256. package/src/objects/query/executor.ts +39 -103
  1257. package/src/objects/query/explain.ts +20 -7
  1258. package/src/objects/query/index.ts +2 -0
  1259. package/src/objects/query/ir.ts +20 -0
  1260. package/src/objects/query/link-query-clearance.ts +73 -0
  1261. package/src/objects/query/links.ts +8 -0
  1262. package/src/objects/query/matches-predicate.ts +108 -0
  1263. package/src/objects/query/normalize.ts +50 -19
  1264. package/src/objects/query/scalar-values.ts +19 -3
  1265. package/src/objects/query/user-expansions.ts +65 -0
  1266. package/src/objects/query/validate.ts +248 -10
  1267. package/src/objects/runtime-batch.ts +8 -2
  1268. package/src/objects/sdk/object-set.ts +12 -1
  1269. package/src/objects/sdk/query-builder.ts +39 -8
  1270. package/src/objects/sdk/query-executor.ts +6 -0
  1271. package/src/objects/serialize.ts +79 -0
  1272. package/src/objects/unique-violation.ts +59 -0
  1273. package/src/objects/vectors/handle.ts +3 -3
  1274. package/src/ontology/builders.ts +15 -1
  1275. package/src/ontology/docs-markdown.ts +2 -1
  1276. package/src/ontology/index.ts +2 -2
  1277. package/src/ontology/json-schema.ts +4 -0
  1278. package/src/ontology/primitives.ts +21 -8
  1279. package/src/ontology/registry.ts +16 -0
  1280. package/src/ontology/types.ts +9 -0
  1281. package/src/ontology/unique-values.ts +84 -0
  1282. package/src/ontology/user-ref.ts +39 -0
  1283. package/src/ontology/validation/properties.ts +43 -0
  1284. package/src/ontology/validation/schema.ts +9 -1
  1285. package/src/pipelines/index.ts +2 -0
  1286. package/src/pipelines/lineage.ts +45 -0
  1287. package/src/projections/internal.ts +2 -2
  1288. package/src/projections/registry.ts +16 -10
  1289. package/src/projections/revision.ts +112 -45
  1290. package/src/projections/run-dispatch.ts +38 -25
  1291. package/src/projections/types.ts +2 -0
  1292. package/src/query.ts +5 -0
  1293. package/src/rules/execution.ts +43 -11
  1294. package/src/runtime/ai-cost.ts +30 -0
  1295. package/src/runtime/ai-usage.ts +32 -1
  1296. package/src/runtime/create.ts +4 -0
  1297. package/src/runtime/host.ts +73 -1
  1298. package/src/runtime/index.ts +2 -0
  1299. package/src/runtime/internal.ts +2 -0
  1300. package/src/runtime/ontology-mutations.ts +19 -4
  1301. package/src/runtime/resolve-definitions.ts +69 -3
  1302. package/src/runtime/sixb.ts +53 -9
  1303. package/src/runtime/types.ts +99 -9
  1304. package/src/sandboxes/README.md +29 -7
  1305. package/src/sandboxes/auth.ts +16 -0
  1306. package/src/sandboxes/config.ts +2 -7
  1307. package/src/sandboxes/configuration.ts +61 -7
  1308. package/src/sandboxes/index.ts +1 -0
  1309. package/src/sandboxes/sandbox.ts +27 -5
  1310. package/src/schedules/builders.ts +3 -1
  1311. package/src/schedules/runtime.ts +6 -0
  1312. package/src/schedules/validation.ts +23 -1
  1313. package/src/security/README.md +62 -0
  1314. package/src/security/applied-markings-contribution.ts +277 -0
  1315. package/src/security/applied-markings-host.ts +41 -0
  1316. package/src/security/applied-markings-snapshot.ts +235 -0
  1317. package/src/security/applied-markings.ts +405 -0
  1318. package/src/security/dataset-version-markings.ts +163 -0
  1319. package/src/security/grants.ts +191 -11
  1320. package/src/security/index.ts +5 -0
  1321. package/src/security/internal.ts +18 -0
  1322. package/src/security/marking-propagation.ts +255 -0
  1323. package/src/security/marking-sets.ts +42 -0
  1324. package/src/security/markings.ts +29 -178
  1325. package/src/security/pipeline-markings.ts +175 -0
  1326. package/src/security/project.ts +13 -0
  1327. package/src/security/projection-markings.ts +421 -0
  1328. package/src/security/redactions.ts +7 -2
  1329. package/src/security/registry.ts +32 -7
  1330. package/src/security/types.ts +68 -5
  1331. package/src/security/validation.ts +34 -11
  1332. package/src/security/view-conditions.ts +215 -0
  1333. package/src/shares/execution.ts +43 -10
  1334. package/src/storage/action-runs/in-memory.ts +18 -0
  1335. package/src/storage/action-runs/types.ts +10 -0
  1336. package/src/storage/activity/in-memory.ts +374 -0
  1337. package/src/storage/activity/index.ts +27 -0
  1338. package/src/storage/activity/policy.ts +430 -0
  1339. package/src/storage/activity/types.ts +211 -0
  1340. package/src/storage/agents/errors.ts +3 -0
  1341. package/src/storage/agents/in-memory.ts +789 -32
  1342. package/src/storage/agents/index.ts +42 -0
  1343. package/src/storage/agents/provider.ts +730 -16
  1344. package/src/storage/agents/types.ts +628 -27
  1345. package/src/storage/ai-cost/analytics.ts +60 -7
  1346. package/src/storage/ai-cost/codec.ts +6 -1
  1347. package/src/storage/ai-cost/groups.ts +44 -1
  1348. package/src/storage/ai-cost/index.ts +1 -0
  1349. package/src/storage/ai-cost/provider.ts +2 -0
  1350. package/src/storage/ai-cost/types.ts +18 -1
  1351. package/src/storage/ai-cost/validation.ts +39 -12
  1352. package/src/storage/ai-limits/provider.ts +4 -7
  1353. package/src/storage/ai-usage/in-memory.ts +28 -1
  1354. package/src/storage/ai-usage/index.ts +9 -1
  1355. package/src/storage/ai-usage/record.ts +44 -7
  1356. package/src/storage/ai-usage/types.ts +38 -0
  1357. package/src/storage/ai-usage/usage.ts +15 -1
  1358. package/src/storage/artifacts/errors.ts +28 -0
  1359. package/src/storage/artifacts/in-memory.ts +388 -0
  1360. package/src/storage/artifacts/index.ts +35 -0
  1361. package/src/storage/artifacts/record.ts +260 -0
  1362. package/src/storage/artifacts/types.ts +293 -0
  1363. package/src/storage/auth/in-memory/auth-storage.ts +27 -2
  1364. package/src/storage/auth/in-memory/sessions.ts +21 -0
  1365. package/src/storage/auth/in-memory/users.ts +40 -6
  1366. package/src/storage/auth/index.ts +3 -0
  1367. package/src/storage/auth/types.ts +61 -7
  1368. package/src/storage/executions/in-memory.ts +93 -1
  1369. package/src/storage/executions/index.ts +5 -0
  1370. package/src/storage/executions/provider.ts +12 -0
  1371. package/src/storage/executions/types.ts +47 -0
  1372. package/src/storage/in-memory/index.ts +16 -0
  1373. package/src/storage/index.ts +132 -1
  1374. package/src/storage/internal.ts +39 -1
  1375. package/src/storage/migrations/migrate-storage.ts +8 -1
  1376. package/src/storage/migrations/prepare-unique-properties.ts +161 -0
  1377. package/src/storage/objects/guard.ts +7 -3
  1378. package/src/storage/objects/in-memory/conditional-reader.ts +72 -0
  1379. package/src/storage/objects/in-memory/query.ts +4 -105
  1380. package/src/storage/objects/in-memory/read-scope.ts +15 -14
  1381. package/src/storage/objects/in-memory/read-source.ts +11 -1
  1382. package/src/storage/objects/in-memory/scoped-reader.ts +243 -0
  1383. package/src/storage/objects/in-memory/selected-reader.ts +6 -231
  1384. package/src/storage/objects/in-memory/storage.ts +183 -1
  1385. package/src/storage/objects/index.ts +9 -1
  1386. package/src/storage/objects/read-scope.ts +191 -0
  1387. package/src/storage/objects/types.ts +68 -1
  1388. package/src/storage/ontology/in-memory/index.ts +3 -0
  1389. package/src/storage/ontology/in-memory/materializations.ts +35 -0
  1390. package/src/storage/ontology/in-memory/replacement-plans.ts +4 -0
  1391. package/src/storage/ontology/in-memory/sources.ts +23 -0
  1392. package/src/storage/ontology/in-memory/unique-values.ts +62 -0
  1393. package/src/storage/ontology/index.ts +12 -0
  1394. package/src/storage/ontology/materializations.ts +35 -1
  1395. package/src/storage/ontology/provider-work.ts +76 -0
  1396. package/src/storage/ontology/provider.ts +3 -0
  1397. package/src/storage/ontology/sources.ts +17 -0
  1398. package/src/storage/ontology/unique-values.ts +56 -0
  1399. package/src/storage/operation-scope.ts +9 -1
  1400. package/src/storage/projection-runs/in-memory.ts +3 -35
  1401. package/src/storage/share-grants/in-memory.ts +8 -0
  1402. package/src/storage/share-grants/index.ts +1 -0
  1403. package/src/storage/share-grants/types.ts +8 -0
  1404. package/src/storage/types.ts +6 -0
  1405. package/src/storage/workflow-runs/in-memory.ts +16 -0
  1406. package/src/storage/workflow-runs/types.ts +5 -0
  1407. package/src/testing/action-run-storage-contract.ts +25 -0
  1408. package/src/testing/activity-storage-contract.ts +840 -0
  1409. package/src/testing/agent-approval-storage-contract.ts +1117 -0
  1410. package/src/testing/agent-memory-storage-contract.ts +400 -0
  1411. package/src/testing/agent-storage-contract.ts +1206 -50
  1412. package/src/testing/ai-cost-storage-contract.ts +31 -1
  1413. package/src/testing/ai-limit-storage-contract.ts +9 -7
  1414. package/src/testing/ai-model-call-groups-contract.ts +76 -0
  1415. package/src/testing/ai-usage-storage-contract.ts +120 -13
  1416. package/src/testing/artifact-storage-contract.ts +851 -0
  1417. package/src/testing/auth-storage-contract.ts +597 -73
  1418. package/src/testing/broker-contract.ts +28 -23
  1419. package/src/testing/effective-storage-contract.ts +3 -8
  1420. package/src/testing/execution-storage-contract.ts +200 -1
  1421. package/src/testing/file-upload-session-storage-contract.ts +12 -24
  1422. package/src/testing/index.ts +26 -4
  1423. package/src/testing/lake-merge-storage-contract.ts +38 -0
  1424. package/src/testing/lake-storage-contract.ts +269 -30
  1425. package/src/testing/materializer-storage-contract.ts +37 -9
  1426. package/src/testing/object-conditional-read-scope-contract.ts +634 -0
  1427. package/src/testing/object-query-contract.ts +386 -186
  1428. package/src/testing/ontology-storage-contract.ts +286 -22
  1429. package/src/testing/projection-run-storage-contract.ts +8 -18
  1430. package/src/testing/queues-contract.ts +39 -70
  1431. package/src/testing/sandboxes-contract.ts +3 -14
  1432. package/src/testing/share-grant-storage-contract.ts +28 -16
  1433. package/src/testing/share-session-storage-contract.ts +4 -14
  1434. package/src/testing/unique-values-contract.ts +907 -0
  1435. package/src/testing/webhook-execution.ts +1 -1
  1436. package/src/testing/webhook-run-storage-contract.ts +6 -9
  1437. package/src/users/execution.ts +131 -0
  1438. package/src/users/index.ts +2 -0
  1439. package/src/workers/queue-worker.ts +1 -3
  1440. package/src/workers/worker.ts +1 -3
  1441. package/src/workflows/builders.ts +20 -0
  1442. package/src/workflows/request.ts +46 -8
  1443. package/src/workflows/types.ts +15 -2
  1444. package/src/workflows/validation.ts +95 -9
  1445. package/dist/chunk-1k89ecfr.js +0 -85
  1446. package/dist/chunk-1k89ecfr.js.map +0 -10
  1447. package/dist/chunk-1sr8ryzk.js.map +0 -11
  1448. package/dist/chunk-29yx306f.js.map +0 -22
  1449. package/dist/chunk-3t2hgbgd.js.map +0 -15
  1450. package/dist/chunk-4as3wt1c.js.map +0 -12
  1451. package/dist/chunk-4vyr1j8f.js +0 -128
  1452. package/dist/chunk-4vyr1j8f.js.map +0 -11
  1453. package/dist/chunk-5e43w60z.js.map +0 -10
  1454. package/dist/chunk-6c6sn0bh.js.map +0 -106
  1455. package/dist/chunk-6p49a5cq.js.map +0 -12
  1456. package/dist/chunk-6x0pqh32.js.map +0 -10
  1457. package/dist/chunk-7n30ybym.js +0 -3
  1458. package/dist/chunk-7n440zgt.js +0 -261
  1459. package/dist/chunk-7n440zgt.js.map +0 -12
  1460. package/dist/chunk-8mx7qw3y.js.map +0 -13
  1461. package/dist/chunk-91mg3nj9.js.map +0 -12
  1462. package/dist/chunk-96yw3pwd.js.map +0 -10
  1463. package/dist/chunk-9gyp8hg1.js +0 -363
  1464. package/dist/chunk-9gyp8hg1.js.map +0 -14
  1465. package/dist/chunk-9k93ah50.js.map +0 -11
  1466. package/dist/chunk-b38szspf.js.map +0 -11
  1467. package/dist/chunk-bx9q3cwv.js.map +0 -19
  1468. package/dist/chunk-d09tj99x.js.map +0 -12
  1469. package/dist/chunk-ere85b8y.js.map +0 -15
  1470. package/dist/chunk-es1gxsbf.js.map +0 -13
  1471. package/dist/chunk-gsjm1wms.js.map +0 -10
  1472. package/dist/chunk-hjzdd750.js.map +0 -49
  1473. package/dist/chunk-hkc3jct7.js.map +0 -10
  1474. package/dist/chunk-hvsb78a1.js.map +0 -20
  1475. package/dist/chunk-k6q3n2sc.js.map +0 -12
  1476. package/dist/chunk-n33z5bjw.js.map +0 -66
  1477. package/dist/chunk-pbcbn83d.js.map +0 -14
  1478. package/dist/chunk-pqajwytd.js +0 -68
  1479. package/dist/chunk-pqajwytd.js.map +0 -11
  1480. package/dist/chunk-qczk96d9.js.map +0 -11
  1481. package/dist/chunk-rdghfsss.js +0 -39
  1482. package/dist/chunk-rdghfsss.js.map +0 -10
  1483. package/dist/chunk-rj69qcrd.js.map +0 -11
  1484. package/dist/chunk-rrzt8jdy.js.map +0 -14
  1485. package/dist/chunk-s16apyk9.js +0 -256
  1486. package/dist/chunk-s16apyk9.js.map +0 -16
  1487. package/dist/chunk-s54c868q.js +0 -307
  1488. package/dist/chunk-s54c868q.js.map +0 -12
  1489. package/dist/chunk-tpn40322.js.map +0 -19
  1490. package/dist/chunk-tw03bsmb.js.map +0 -11
  1491. package/dist/chunk-v4jbb3rs.js.map +0 -10
  1492. package/dist/chunk-vpq4shxz.js.map +0 -39
  1493. package/dist/chunk-yxd3nnqt.js.map +0 -11
  1494. package/dist/chunk-yzwja0mj.js.map +0 -14
  1495. package/dist/events/toStoredEvent.d.ts +0 -9
  1496. package/dist/events/toStoredEvent.d.ts.map +0 -1
  1497. package/dist/models/audio/file.d.ts +0 -9
  1498. package/dist/models/audio/file.d.ts.map +0 -1
  1499. package/src/events/toStoredEvent.ts +0 -33
  1500. /package/dist/{chunk-mfs23znk.js.map → chunk-07kkp2e1.js.map} +0 -0
  1501. /package/dist/{chunk-fkgc1wt8.js.map → chunk-0phpbbvm.js.map} +0 -0
  1502. /package/dist/{chunk-y0c4e6ex.js.map → chunk-3gbefjg5.js.map} +0 -0
  1503. /package/dist/{chunk-fa02jy15.js.map → chunk-48jezz3j.js.map} +0 -0
  1504. /package/dist/{chunk-c85m1hyj.js.map → chunk-6n69k945.js.map} +0 -0
  1505. /package/dist/{chunk-xfs8x8m9.js.map → chunk-6p0pastb.js.map} +0 -0
  1506. /package/dist/{chunk-t7x8dmn0.js.map → chunk-6y0mkhex.js.map} +0 -0
  1507. /package/dist/{chunk-v9xd5wzd.js.map → chunk-bab05bhg.js.map} +0 -0
  1508. /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
  1509. /package/dist/{chunk-vyf9kfqf.js.map → chunk-dp0cdtj2.js.map} +0 -0
  1510. /package/dist/{chunk-br3k6qbf.js.map → chunk-fm62y49k.js.map} +0 -0
  1511. /package/dist/{chunk-9ybhtmg4.js.map → chunk-g663fahq.js.map} +0 -0
  1512. /package/dist/{chunk-9w055r5b.js.map → chunk-hwarjrgf.js.map} +0 -0
  1513. /package/dist/{chunk-9dmt152s.js.map → chunk-hyesv9dv.js.map} +0 -0
  1514. /package/dist/{chunk-x9v4cx1d.js.map → chunk-m36fw8ft.js.map} +0 -0
  1515. /package/dist/{chunk-a40ad1ft.js.map → chunk-mbsbxarb.js.map} +0 -0
  1516. /package/dist/{chunk-6aawea28.js.map → chunk-n8q5j6y5.js.map} +0 -0
  1517. /package/dist/{chunk-dk8tkk5f.js.map → chunk-n9zpx9c6.js.map} +0 -0
  1518. /package/dist/{chunk-7t429e3f.js.map → chunk-npcr0228.js.map} +0 -0
  1519. /package/dist/{chunk-z4m0yz8c.js.map → chunk-q4pmvkg0.js.map} +0 -0
@@ -0,0 +1,23 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/artifacts/theme.ts", "../src/artifacts/queries.ts", "../src/artifacts/resolve.ts", "../src/artifacts/tones.ts", "../src/artifacts/canvas.ts", "../src/artifacts/outline.ts", "../src/artifacts/csv.ts", "../src/artifacts/formula/parser.ts", "../src/artifacts/workbook.ts", "../src/artifacts/formula/check.ts", "../src/artifacts/formula/evaluate.ts", "../src/artifacts/formula/index.ts", "../src/artifacts/live-sheet.ts", "../src/artifacts/sheet-rules.ts"],
4
+ "sourcesContent": [
5
+ "/** An artifact may carry this file at its root to override the app's theme. */\nexport const ARTIFACT_THEME_FILE = \"theme.json\"\n\n/**\n * An artifact's own theme. `mode` pins light or dark whatever the viewer's app uses; `tokens`\n * override the app's values for the names in {@link ARTIFACT_THEME_TOKENS}.\n */\nexport interface ArtifactTheme {\n readonly mode?: \"light\" | \"dark\"\n readonly tokens?: Readonly<Record<string, string>>\n}\n\nconst COLOR_TOKENS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--border\",\n \"--chart-1\",\n \"--chart-2\",\n \"--chart-3\",\n \"--chart-4\",\n \"--chart-5\",\n] as const\nconst FONT_TOKENS = [\"--font-sans\", \"--font-serif\", \"--font-mono\"] as const\n\n/** The tokens a theme may set. Every other app token stays the app's. */\nexport const ARTIFACT_THEME_TOKENS: readonly string[] = [\n ...COLOR_TOKENS,\n ...FONT_TOKENS,\n \"--radius\",\n]\n\n// Values land in CSS custom properties, so each kind of token takes one narrow shape: nothing that\n// could close the declaration, open a URL, or call a function other than a color space.\nconst HEX_COLOR = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i\nconst FUNCTION_COLOR =\n /^(?:rgba?|hsla?|oklch|oklab|lab|lch)\\((?:[\\d.%\\s,/+-]|deg|turn|rad|none)*\\)$/i\nconst FONT_FAMILY =\n /^\\s*(?:\"[\\w -]+\"|'[\\w -]+'|[\\w-]+)(?:\\s*,\\s*(?:\"[\\w -]+\"|'[\\w -]+'|[\\w-]+))*\\s*$/\nconst LENGTH = /^(?:0|\\d{1,3}(?:\\.\\d+)?(?:px|rem|em))$/\n\n/** Reads a `theme.json`. Returns the reason it was refused, in words the author can act on. */\nexport function parseArtifactTheme(\n text: string\n): { readonly theme: ArtifactTheme } | { readonly error: string } {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n return { error: `${ARTIFACT_THEME_FILE} is not valid JSON.` }\n }\n if (!isObject(value)) return { error: `${ARTIFACT_THEME_FILE} must be a JSON object.` }\n\n const unknownKey = Object.keys(value).find((key) => key !== \"mode\" && key !== \"tokens\")\n if (unknownKey) {\n return {\n error: `${ARTIFACT_THEME_FILE} has '${unknownKey}'; it takes only \"mode\" and \"tokens\".`,\n }\n }\n if (value.mode !== undefined && value.mode !== \"light\" && value.mode !== \"dark\") {\n return { error: `${ARTIFACT_THEME_FILE} \"mode\" must be \"light\" or \"dark\".` }\n }\n if (value.tokens !== undefined && !isObject(value.tokens)) {\n return { error: `${ARTIFACT_THEME_FILE} \"tokens\" must be an object of token names to values.` }\n }\n\n const tokens: Record<string, string> = {}\n for (const [name, tokenValue] of Object.entries(value.tokens ?? {})) {\n if (!ARTIFACT_THEME_TOKENS.includes(name)) {\n return {\n error: `${ARTIFACT_THEME_FILE} sets '${name}'. A theme can set ${ARTIFACT_THEME_TOKENS.join(\", \")}.`,\n }\n }\n if (typeof tokenValue !== \"string\" || !tokenValueFits(name, tokenValue)) {\n return {\n error: `${ARTIFACT_THEME_FILE} gives '${name}' a value it cannot use: ${expected(name)}.`,\n }\n }\n tokens[name] = tokenValue.trim()\n }\n\n return {\n theme: {\n ...(value.mode === undefined ? {} : { mode: value.mode }),\n ...(Object.keys(tokens).length === 0 ? {} : { tokens }),\n },\n }\n}\n\nfunction tokenValueFits(name: string, value: string): boolean {\n const trimmed = value.trim()\n if (name === \"--radius\") return LENGTH.test(trimmed)\n if ((FONT_TOKENS as readonly string[]).includes(name)) {\n return trimmed.length <= 200 && FONT_FAMILY.test(trimmed)\n }\n return HEX_COLOR.test(trimmed) || FUNCTION_COLOR.test(trimmed)\n}\n\nfunction expected(name: string): string {\n if (name === \"--radius\") return \"a length such as 8px or 0.5rem\"\n if ((FONT_TOKENS as readonly string[]).includes(name)) {\n return 'a font list such as \"Inter Tight\", system-ui, sans-serif'\n }\n return \"a color such as #2f7280 or oklch(0.62 0.1 210)\"\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
6
+ "import type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQuerySortField,\n} from \"../objects/query/ir\"\nimport type { PrimitiveSchema } from \"../ontology/types\"\nimport type { ObjectFacetRequest, ObjectFacetResult, ObjectRow } from \"../storage/objects/types\"\nimport type { ArtifactKind } from \"./kinds\"\n\n/**\n * A version's queries: one `queries/<name>.json` file each, holding what `sixb objects query\n * --file` runs or `sixb objects facets --file` sends. Each reader runs them with their own rights,\n * so what an artifact shows is never a copy of what its author could read.\n */\nexport const ARTIFACT_QUERIES_DIRECTORY = \"queries/\"\n\n/** The kinds that show live data. A document shows a live sheet instead, and a file is as it is. */\nexport const ARTIFACT_QUERY_KINDS: readonly ArtifactKind[] = [\"sheet\", \"page\", \"slides\", \"canvas\"]\n\n/** A query read from its file: rows, or the facets of the rows. */\nexport type ArtifactQuery =\n | { readonly kind: \"objects\"; readonly query: ObjectQuery }\n | {\n readonly kind: \"facets\"\n readonly query: ObjectQuery\n readonly facets: readonly ObjectFacetRequest[]\n }\n\n/** What a query read for its reader: the rows they may see, or the facets of those rows. */\nexport type ArtifactQueryResult = ArtifactObjectsQueryResult | ArtifactFacetsQueryResult\n\n/** What a query returns and reads, as whoever runs it may see it. */\nexport interface ArtifactQueryShape {\n /** The object types the query returns. */\n readonly resultObjectTypeIds: readonly string[]\n /** Every object type the query reads: where it starts, and each type it traverses or expands. */\n readonly readObjectTypeIds: readonly string[]\n /** What each value of a row holds, from the ontology as whoever runs the query may view it. */\n readonly schema: ArtifactQuerySchema\n}\n\n/**\n * The properties a query's rows hold, and those of the objects it expands on them: what a live\n * view types its columns by. A property the reader's view of the ontology leaves out is absent.\n */\nexport interface ArtifactQuerySchema {\n /** By property id, over the types the query returns; the first type's when two disagree. */\n readonly properties: Readonly<Record<string, ArtifactQueryProperty>>\n /** By link id, for each link the query expands on its rows: the properties of what it reaches. */\n readonly links: Readonly<\n Record<string, { readonly properties: Readonly<Record<string, ArtifactQueryProperty>> }>\n >\n}\n\n/** A property's type, with a value type resolved to the schema it names. */\nexport interface ArtifactQueryProperty {\n readonly type: ArtifactQueryPropertyType\n /** What an enum's values are. */\n readonly valueType?: \"string\" | \"integer\"\n}\n\nexport type ArtifactQueryPropertyType = PrimitiveSchema | \"enum\" | \"array\" | \"object\" | \"map\"\n\n/** What checking a query as its author learned: what it returns, reads, and holds. */\nexport interface CheckedArtifactQuery extends ArtifactQueryShape {\n readonly kind: ArtifactQuery[\"kind\"]\n}\n\nexport interface ArtifactObjectsQueryResult extends ArtifactQueryShape {\n readonly kind: \"objects\"\n /**\n * At most `ARTIFACT_LIMITS.maxQueryRows`, as the reader reads them: a marked property they are\n * not cleared for is left out and listed in the row's `redactions`.\n */\n readonly objects: readonly ObjectRow[]\n /** Every row the query matches for the reader, those past the cap included. */\n readonly total: number\n /** Whether rows are left out because of the cap. A query's own `limit` leaves none out. */\n readonly truncated: boolean\n}\n\nexport interface ArtifactFacetsQueryResult extends ArtifactQueryShape {\n readonly kind: \"facets\"\n /** Every row the query matches for the reader. */\n readonly total: number\n readonly facets: readonly ObjectFacetResult[]\n}\n\n/** Lowercase letters, digits and hyphens, as a canvas item's id. */\nconst QUERY_NAME = /^[a-z0-9][a-z0-9-]{0,63}$/\n\nexport function isArtifactQueryName(name: string): boolean {\n return QUERY_NAME.test(name)\n}\n\nexport function artifactQueryPath(name: string): string {\n return `${ARTIFACT_QUERIES_DIRECTORY}${name}.json`\n}\n\n/** The query a path names, or `undefined` when it is not one `queries/<name>.json` file. */\nexport function artifactQueryName(path: string): string | undefined {\n if (!path.startsWith(ARTIFACT_QUERIES_DIRECTORY) || !path.endsWith(\".json\")) return undefined\n\n const name = path.slice(ARTIFACT_QUERIES_DIRECTORY.length, -\".json\".length)\n return isArtifactQueryName(name) ? name : undefined\n}\n\nclass QueryShapeError extends Error {\n constructor(\n readonly path: string,\n message: string\n ) {\n super(message)\n }\n}\n\n/**\n * Reads a query file into its query, and where the query sits in the file (`$`, or `$.query` in\n * a request) so a problem found later names its place in the file. A file is one of:\n *\n * - a query node, `{ \"kind\": \"start\", ... }`, for rows;\n * - `{ \"query\": <node> }`, for rows;\n * - `{ \"query\": <node>, \"facets\": [{ \"propertyId\": \"status\", \"limit\": 10 }] }`, for facets.\n *\n * Only what an author writes is read: the fields core resolves itself are refused, as the API\n * refuses them. `page`, `vector` and `rerank` are refused too, saying why.\n */\nexport function parseArtifactQuery(\n path: string,\n text: string\n): { readonly query: ArtifactQuery; readonly at: \"$\" | \"$.query\" } | { readonly error: string } {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n return { error: `${path} is not valid JSON.` }\n }\n\n try {\n return readFile(value)\n } catch (error) {\n if (error instanceof QueryShapeError)\n return { error: `${path}: ${error.path}: ${error.message}` }\n throw error\n }\n}\n\nfunction readFile(value: unknown): { query: ArtifactQuery; at: \"$\" | \"$.query\" } {\n const file = record(value, \"$\")\n\n if (Object.hasOwn(file, \"kind\")) {\n return { query: { kind: \"objects\", query: readNode(file, \"$\") }, at: \"$\" }\n }\n\n if (!Object.hasOwn(file, \"query\")) {\n throw new QueryShapeError(\n \"$\",\n 'a query file holds a query node, with \"kind\", or a request, with \"query\".'\n )\n }\n\n if (!Object.hasOwn(file, \"facets\")) {\n only(file, \"$\", [\"query\", \"includeTotal\"], \"a query request\")\n // A file written for `sixb objects query` keeps its total: a reader always gets one.\n if (file.includeTotal !== undefined) boolean(file, \"includeTotal\", \"$\")\n\n return { query: { kind: \"objects\", query: readNode(file.query, \"$.query\") }, at: \"$.query\" }\n }\n\n only(file, \"$\", [\"query\", \"facets\"], \"a facets request\")\n const query = readNode(file.query, \"$.query\")\n const facets = list(file.facets, \"$.facets\").map((facet, index) =>\n readFacet(facet, `$.facets[${index}]`)\n )\n if (facets.length === 0) throw new QueryShapeError(\"$.facets\", \"list at least one facet.\")\n\n return { query: { kind: \"facets\", query, facets }, at: \"$.query\" }\n}\n\nfunction readFacet(value: unknown, path: string): ObjectFacetRequest {\n const facet = record(value, path)\n only(facet, path, [\"propertyId\", \"limit\"], \"a facet\")\n\n const limit = facet.limit\n if (typeof limit !== \"number\" || !Number.isInteger(limit) || limit <= 0) {\n throw new QueryShapeError(`${path}.limit`, \"must be a positive whole number.\")\n }\n\n return { propertyId: text(facet, \"propertyId\", path), limit }\n}\n\nconst NODE_KEYS = {\n start: [\"objectTypeId\", \"includeSubtypes\"],\n refs: [\"refs\"],\n filter: [\"input\", \"predicate\"],\n text: [\"input\", \"query\", \"fields\"],\n traverse: [\"input\", \"linkId\", \"direction\", \"sourceObjectTypeId\"],\n set: [\"op\", \"inputs\"],\n sort: [\"input\", \"fields\"],\n limit: [\"input\", \"limit\"],\n project: [\"input\", \"properties\"],\n expand: [\"input\", \"expansions\", \"users\"],\n} as const\n\n/** Why each node the API runs is not one a query file may hold. */\nconst REFUSED_NODES: Readonly<Record<string, string>> = {\n page: 'Sixb pages the result for each reader; bound the query with \"limit\" instead.',\n vector: \"each reader who opens the artifact would pay for an embedding call.\",\n rerank: \"each reader who opens the artifact would pay for a reranking call.\",\n}\n\nfunction readNode(value: unknown, path: string): ObjectQuery {\n const node = record(value, path)\n const kind = node.kind\n\n if (typeof kind === \"string\" && Object.hasOwn(REFUSED_NODES, kind)) {\n throw new QueryShapeError(\n `${path}.kind`,\n `\"${kind}\" is not allowed in an artifact's query: ${REFUSED_NODES[kind]}`\n )\n }\n if (typeof kind !== \"string\" || !Object.hasOwn(NODE_KEYS, kind)) {\n throw new QueryShapeError(\n `${path}.kind`,\n `${JSON.stringify(kind)} is not a query node; use ${Object.keys(NODE_KEYS).join(\", \")}.`\n )\n }\n\n const known = kind as keyof typeof NODE_KEYS\n only(node, path, [\"kind\", ...NODE_KEYS[known]], `a \"${known}\" node`)\n const input = () => readNode(node.input, `${path}.input`)\n\n switch (known) {\n case \"start\":\n return {\n kind: known,\n objectTypeId: text(node, \"objectTypeId\", path),\n ...(node.includeSubtypes === undefined\n ? {}\n : { includeSubtypes: boolean(node, \"includeSubtypes\", path) }),\n }\n\n case \"refs\":\n return {\n kind: known,\n refs: list(node.refs, `${path}.refs`).map((ref, index) => {\n const at = `${path}.refs[${index}]`\n const entry = record(ref, at)\n only(entry, at, [\"objectTypeId\", \"primaryId\"], \"a ref\")\n return {\n objectTypeId: text(entry, \"objectTypeId\", at),\n primaryId: text(entry, \"primaryId\", at),\n }\n }),\n }\n\n case \"filter\":\n return {\n kind: known,\n input: input(),\n predicate: readPredicate(node.predicate, `${path}.predicate`),\n }\n\n case \"text\":\n return {\n kind: known,\n input: input(),\n query: string(node, \"query\", path),\n ...(node.fields === undefined ? {} : { fields: texts(node.fields, `${path}.fields`) }),\n }\n\n case \"traverse\":\n return {\n kind: known,\n input: input(),\n linkId: text(node, \"linkId\", path),\n direction: direction(node, path),\n ...(node.sourceObjectTypeId === undefined\n ? {}\n : { sourceObjectTypeId: text(node, \"sourceObjectTypeId\", path) }),\n }\n\n case \"set\":\n return {\n kind: known,\n op: oneOf(node, \"op\", path, [\"union\", \"intersect\", \"subtract\"] as const),\n inputs: list(node.inputs, `${path}.inputs`).map((each, index) =>\n readNode(each, `${path}.inputs[${index}]`)\n ),\n }\n\n case \"sort\":\n return { kind: known, input: input(), fields: sortFields(node.fields, `${path}.fields`) }\n\n case \"limit\":\n return { kind: known, input: input(), limit: count(node, \"limit\", path) }\n\n case \"project\":\n return {\n kind: known,\n input: input(),\n ...(node.properties === undefined\n ? {}\n : { properties: texts(node.properties, `${path}.properties`) }),\n }\n\n case \"expand\":\n return {\n kind: known,\n input: input(),\n expansions: expansions(node.expansions, `${path}.expansions`),\n ...(node.users === undefined ? {} : { users: texts(node.users, `${path}.users`) }),\n }\n }\n}\n\nfunction readPredicate(value: unknown, path: string): ObjectQueryPredicate {\n const predicate = record(value, path)\n const op = predicate.op\n\n switch (op) {\n case \"and\":\n case \"or\":\n only(predicate, path, [\"op\", \"items\"], `an \"${op}\" predicate`)\n return {\n op,\n items: list(predicate.items, `${path}.items`).map((item, index) =>\n readPredicate(item, `${path}.items[${index}]`)\n ),\n }\n\n case \"not\":\n only(predicate, path, [\"op\", \"item\"], 'a \"not\" predicate')\n return { op, item: readPredicate(predicate.item, `${path}.item`) }\n\n case \"eq\":\n case \"neq\":\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\":\n case \"contains\":\n only(predicate, path, [\"op\", \"propertyId\", \"value\"], `an \"${op}\" predicate`)\n return {\n op,\n propertyId: text(predicate, \"propertyId\", path),\n value: present(predicate, \"value\", path),\n }\n\n case \"in\":\n only(predicate, path, [\"op\", \"propertyId\", \"values\"], 'an \"in\" predicate')\n return {\n op,\n propertyId: text(predicate, \"propertyId\", path),\n values: list(predicate.values, `${path}.values`),\n }\n\n case \"exists\":\n only(predicate, path, [\"op\", \"propertyId\", \"value\"], 'an \"exists\" predicate')\n return {\n op,\n propertyId: text(predicate, \"propertyId\", path),\n value: boolean(predicate, \"value\", path),\n }\n\n default:\n throw new QueryShapeError(\n `${path}.op`,\n `${JSON.stringify(op)} is not a predicate; use and, or, not, eq, neq, lt, lte, gt, gte, in, exists or contains.`\n )\n }\n}\n\nfunction sortFields(value: unknown, path: string): ObjectQuerySortField[] {\n return list(value, path).map((each, index) => {\n const at = `${path}[${index}]`\n const field = record(each, at)\n const kind = oneOf(field, \"kind\", at, [\"property\", \"relevance\"] as const)\n\n if (kind === \"relevance\") {\n only(field, at, [\"kind\", \"direction\"], \"a relevance sort\")\n return { kind, ...sortDirection(field, at) }\n }\n\n only(field, at, [\"kind\", \"propertyId\", \"direction\"], \"a property sort\")\n return { kind, propertyId: text(field, \"propertyId\", at), ...sortDirection(field, at) }\n })\n}\n\nfunction sortDirection(field: Record<string, unknown>, path: string) {\n return field.direction === undefined\n ? {}\n : { direction: oneOf(field, \"direction\", path, [\"asc\", \"desc\"] as const) }\n}\n\nfunction expansions(value: unknown, path: string): ObjectExpansion[] {\n return list(value, path).map((each, index) => {\n const at = `${path}[${index}]`\n const expansion = record(each, at)\n only(\n expansion,\n at,\n [\"linkId\", \"direction\", \"sourceObjectTypeId\", \"limit\", \"orderBy\", \"expand\", \"users\"],\n \"an expansion\"\n )\n\n return {\n linkId: text(expansion, \"linkId\", at),\n direction: direction(expansion, at),\n ...(expansion.sourceObjectTypeId === undefined\n ? {}\n : { sourceObjectTypeId: text(expansion, \"sourceObjectTypeId\", at) }),\n ...(expansion.limit === undefined ? {} : { limit: count(expansion, \"limit\", at) }),\n ...(expansion.orderBy === undefined\n ? {}\n : { orderBy: sortFields(expansion.orderBy, `${at}.orderBy`) }),\n ...(expansion.expand === undefined\n ? {}\n : { expand: expansions(expansion.expand, `${at}.expand`) }),\n ...(expansion.users === undefined ? {} : { users: texts(expansion.users, `${at}.users`) }),\n }\n })\n}\n\nfunction direction(value: Record<string, unknown>, path: string) {\n return oneOf(value, \"direction\", path, [\"outgoing\", \"incoming\"] as const)\n}\n\nfunction record(value: unknown, path: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new QueryShapeError(path, \"must be an object.\")\n }\n return value as Record<string, unknown>\n}\n\nfunction list(value: unknown, path: string): unknown[] {\n if (!Array.isArray(value)) throw new QueryShapeError(path, \"must be a list.\")\n return value\n}\n\n/** Refuses a key the shape does not have, such as one core resolves itself. */\nfunction only(\n value: Record<string, unknown>,\n path: string,\n keys: readonly string[],\n shape: string\n): void {\n const extra = Object.keys(value).find((key) => !keys.includes(key))\n if (extra !== undefined) {\n throw new QueryShapeError(`${path}.${extra}`, `is not a key of ${shape}.`)\n }\n}\n\nfunction present(value: Record<string, unknown>, key: string, path: string): unknown {\n if (!Object.hasOwn(value, key)) throw new QueryShapeError(`${path}.${key}`, \"is missing.\")\n return value[key]\n}\n\nfunction string(value: Record<string, unknown>, key: string, path: string): string {\n const found = value[key]\n if (typeof found !== \"string\") throw new QueryShapeError(`${path}.${key}`, \"must be text.\")\n return found\n}\n\n/** Text that is not empty, as an id is. */\nfunction text(value: Record<string, unknown>, key: string, path: string): string {\n const found = string(value, key, path)\n if (found.length === 0) throw new QueryShapeError(`${path}.${key}`, \"must not be empty.\")\n return found\n}\n\nfunction texts(value: unknown, path: string): string[] {\n return list(value, path).map((each, index) => {\n if (typeof each !== \"string\" || each.length === 0) {\n throw new QueryShapeError(`${path}[${index}]`, \"must be text that is not empty.\")\n }\n return each\n })\n}\n\nfunction boolean(value: Record<string, unknown>, key: string, path: string): boolean {\n const found = value[key]\n if (typeof found !== \"boolean\") {\n throw new QueryShapeError(`${path}.${key}`, \"must be true or false.\")\n }\n return found\n}\n\nfunction count(value: Record<string, unknown>, key: string, path: string): number {\n const found = value[key]\n if (typeof found !== \"number\" || !Number.isInteger(found) || found < 0) {\n throw new QueryShapeError(`${path}.${key}`, \"must be a whole number, 0 or more.\")\n }\n return found\n}\n\nfunction oneOf<const TValue extends string>(\n value: Record<string, unknown>,\n key: string,\n path: string,\n values: readonly TValue[]\n): TValue {\n const found = value[key]\n if (typeof found !== \"string\" || !(values as readonly string[]).includes(found)) {\n throw new QueryShapeError(\n `${path}.${key}`,\n `${JSON.stringify(found)} is not one of ${values.join(\", \")}.`\n )\n }\n return found as TValue\n}\n",
7
+ "import { type ArtifactAddress, type CellRange, parseSheetPart } from \"./address\"\nimport type { ArtifactKind } from \"./kinds\"\nimport type { ArtifactOutline } from \"./outline\"\n\n/** The version an address points into: its kind, its outline, and its file list. */\nexport interface ArtifactAddressTarget {\n readonly kind: ArtifactKind\n readonly outline: ArtifactOutline\n readonly files: readonly { readonly path: string }[]\n}\n\n/** What an address names inside its target. */\nexport type ResolvedArtifactPart =\n | { readonly type: \"artifact\" }\n | { readonly type: \"file\"; readonly path: string }\n | { readonly type: \"sheet\"; readonly sheet: string; readonly range?: CellRange }\n | { readonly type: \"chart\"; readonly chart: string }\n | { readonly type: \"section\"; readonly slug: string }\n | { readonly type: \"slide\"; readonly slide: number }\n | { readonly type: \"board\"; readonly id: string }\n | { readonly type: \"region\"; readonly id: string }\n\n/**\n * Finds what an address names in a version, against its outline and files. A problem says what is\n * missing and what the version has instead, so whoever wrote the address can fix it.\n */\nexport function resolveArtifactAddress(\n address: ArtifactAddress,\n target: ArtifactAddressTarget\n): { readonly part: ResolvedArtifactPart } | { readonly problem: string } {\n if (address.path !== undefined) {\n if (address.part !== undefined) return { problem: \"names both a file and a part of one\" }\n return target.files.some((file) => file.path === address.path)\n ? { part: { type: \"file\", path: address.path } }\n : { problem: `has no file '${address.path}'` }\n }\n if (address.part === undefined) return { part: { type: \"artifact\" } }\n\n const { outline } = target\n switch (outline.kind) {\n case \"sheet\": {\n const part = parseSheetPart(address.part)\n if (!part) {\n return {\n problem: `has no part '${address.part}': name a sheet, a range such as Summary!A1:D12, or chart=<name>`,\n }\n }\n if (part.type === \"chart\") {\n return outline.charts.includes(part.chart)\n ? { part }\n : { problem: `has no chart '${part.chart}'${listed(\"its charts\", outline.charts)}` }\n }\n const sheet = outline.sheets.find((candidate) => candidate.name === part.sheet)\n if (!sheet) {\n return {\n problem: `has no sheet '${part.sheet}'${listed(\n \"its sheets\",\n outline.sheets.map((candidate) => candidate.name)\n )}`,\n }\n }\n // Row 1 is the header row, so the last row is one past the data rows. A live sheet's rows\n // are each reader's: a range is as deep as they have rows.\n const rows = sheet.query === undefined ? sheet.rows : Number.POSITIVE_INFINITY\n if (part.range && (part.range.bottom > rows || part.range.right >= sheet.columns.length)) {\n return {\n problem: `has no range ${address.part.slice(address.part.lastIndexOf(\"!\") + 1)} in sheet '${sheet.name}', which has ${sheet.rows + 1} rows and ${sheet.columns.length} columns`,\n }\n }\n return { part }\n }\n case \"document\": {\n const heading = outline.headings.find((candidate) => candidate.slug === address.part)\n return heading\n ? { part: { type: \"section\", slug: heading.slug } }\n : {\n problem: `has no section '${address.part}'${listed(\n \"its sections\",\n outline.headings.map((candidate) => candidate.slug)\n )}`,\n }\n }\n case \"slides\": {\n const slide = /^[1-9]\\d*$/.test(address.part) ? Number(address.part) : Number.NaN\n return slide <= outline.slides.length\n ? { part: { type: \"slide\", slide } }\n : { problem: `has no slide '${address.part}': it has ${outline.slides.length} slides` }\n }\n case \"canvas\": {\n // A canvas names its boards and its sections, which are regions of it.\n const item = outline.items.find((candidate) => candidate.id === address.part)\n if (!item) {\n return {\n problem: `has no board or section '${address.part}'${listed(\n \"its boards and sections\",\n outline.items.map((candidate) => candidate.id)\n )}`,\n }\n }\n return { part: { type: item.type === \"board\" ? \"board\" : \"region\", id: item.id } }\n }\n case \"page\":\n case \"file\":\n return { problem: `is a ${target.kind}, which has no parts to name` }\n }\n}\n\nfunction listed(label: string, names: readonly string[]): string {\n if (names.length === 0) return \"\"\n const shown = names.slice(0, 8).map((name) => `'${name}'`)\n return `; ${label} are ${shown.join(\", \")}${names.length > shown.length ? \", …\" : \"\"}`\n}\n",
8
+ "/**\n * The colors an artifact gives what it marks, a sheet's tag or a canvas's note: the theme's\n * meanings, or one of its chart colors, so they follow the app's theme and dark mode.\n */\nexport const ARTIFACT_TONES = [\n \"neutral\",\n \"positive\",\n \"warning\",\n \"negative\",\n \"chart-1\",\n \"chart-2\",\n \"chart-3\",\n \"chart-4\",\n \"chart-5\",\n] as const\nexport type ArtifactTone = (typeof ARTIFACT_TONES)[number]\n\nexport function isArtifactTone(value: unknown): value is ArtifactTone {\n return (ARTIFACT_TONES as readonly unknown[]).includes(value)\n}\n",
9
+ "import { isArtifactAddress } from \"./address\"\nimport { ARTIFACT_LIMITS } from \"./limits\"\nimport { ARTIFACT_TONES, type ArtifactTone, isArtifactTone } from \"./tones\"\n\n/**\n * A canvas artifact is `canvas.json`, its items on an endless board, and the HTML files its boards\n * show beside it. Items draw in the order listed, sections behind everything else.\n */\nexport const CANVAS_FILE = \"canvas.json\"\n\nexport const CANVAS_ITEM_TYPES = [\n \"board\",\n \"section\",\n \"note\",\n \"text\",\n \"shape\",\n \"arrow\",\n \"embed\",\n] as const\nexport type CanvasItemType = (typeof CANVAS_ITEM_TYPES)[number]\n\nexport const CANVAS_SHAPES = [\"rect\", \"ellipse\", \"diamond\"] as const\nexport type CanvasShape = (typeof CANVAS_SHAPES)[number]\n\nexport const CANVAS_TEXT_SIZES = [\"s\", \"m\", \"l\", \"xl\"] as const\nexport type CanvasTextSize = (typeof CANVAS_TEXT_SIZES)[number]\n\n/** Where an item sits, from the canvas's origin, in pixels; and how large it is. */\ninterface Placed {\n readonly id: string\n readonly x: number\n readonly y: number\n}\ninterface Sized extends Placed {\n readonly w: number\n readonly h: number\n}\n\n/** An HTML file of the canvas, shown live as a page `w` by `h`: a screen, a mockup, a poster. */\nexport interface CanvasBoard extends Sized {\n readonly type: \"board\"\n readonly file: string\n readonly title?: string\n}\n\n/** A titled region drawn behind what it holds: a flow, a cluster of notes. */\nexport interface CanvasSection extends Sized {\n readonly type: \"section\"\n readonly title?: string\n}\n\n/** A sticky note of plain text; its height follows its text unless it is given one. */\nexport interface CanvasNote extends Placed {\n readonly type: \"note\"\n readonly w: number\n readonly h?: number\n readonly text: string\n readonly tone?: ArtifactTone\n}\n\n/** A label or a heading on the canvas, wrapped at `w` when given. */\nexport interface CanvasText extends Placed {\n readonly type: \"text\"\n readonly text: string\n readonly size: CanvasTextSize\n readonly w?: number\n}\n\n/** A rectangle, ellipse, or diamond, with text inside: for diagrams. */\nexport interface CanvasShapeItem extends Sized {\n readonly type: \"shape\"\n readonly shape: CanvasShape\n readonly text?: string\n readonly tone?: ArtifactTone\n}\n\n/** Another artifact, or a part of one, shown in place: a chart, a range, a slide, a page. */\nexport interface CanvasEmbed extends Sized {\n readonly type: \"embed\"\n readonly src: string\n readonly title?: string\n}\n\n/** One end of an arrow: an item, by its id, or a point on the canvas. */\nexport type CanvasEnd = string | { readonly x: number; readonly y: number }\n\n/** An arrow from one item, or point, to another. */\nexport interface CanvasArrow {\n readonly id: string\n readonly type: \"arrow\"\n readonly from: CanvasEnd\n readonly to: CanvasEnd\n readonly label?: string\n readonly dashed: boolean\n}\n\nexport type CanvasItem =\n | CanvasBoard\n | CanvasSection\n | CanvasNote\n | CanvasText\n | CanvasShapeItem\n | CanvasEmbed\n | CanvasArrow\n\n/** A canvas's items. It opens fitted to all of them. */\nexport interface Canvas {\n readonly items: readonly CanvasItem[]\n}\n\nclass CanvasError extends Error {}\n\n/**\n * Reads `canvas.json` into its full form, with defaults filled, or says what is wrong in words the\n * author can act on, naming the item and the key. Whether a board's file exists is checked against\n * the version's files.\n */\nexport function parseCanvas(\n text: string\n): { readonly canvas: Canvas } | { readonly error: string } {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n return { error: `${CANVAS_FILE} is not valid JSON.` }\n }\n try {\n return { canvas: readCanvas(value) }\n } catch (error) {\n if (error instanceof CanvasError) return { error: `${CANVAS_FILE}: ${error.message}` }\n throw error\n }\n}\n\nconst ITEM_ID = /^[a-z0-9][a-z0-9-]{0,39}$/\nconst TEXT_MAX = ARTIFACT_LIMITS.maxCanvasTextLength\nconst LABEL_MAX = ARTIFACT_LIMITS.maxCanvasLabelLength\n\nfunction readCanvas(value: unknown): Canvas {\n const input = record(value, \"the canvas\", [\"items\"])\n if (!Array.isArray(input.items) || input.items.length === 0) {\n throw new CanvasError('\"items\" must list at least one item.')\n }\n if (input.items.length > ARTIFACT_LIMITS.maxCanvasItems) {\n throw new CanvasError(\n `a canvas holds at most ${ARTIFACT_LIMITS.maxCanvasItems} items; this one has ${input.items.length}.`\n )\n }\n const items = input.items.map((item, index) => readItem(item, index))\n const ids = new Set<string>()\n for (const item of items) {\n if (ids.has(item.id)) throw new CanvasError(`two items have the id '${item.id}'.`)\n ids.add(item.id)\n }\n const boards = items.filter((item) => item.type === \"board\").length\n if (boards > ARTIFACT_LIMITS.maxCanvasBoards) {\n throw new CanvasError(\n `a canvas holds at most ${ARTIFACT_LIMITS.maxCanvasBoards} boards; this one has ${boards}.`\n )\n }\n for (const item of items) {\n if (item.type !== \"arrow\") continue\n for (const [key, end] of [\n [\"from\", item.from],\n [\"to\", item.to],\n ] as const) {\n if (typeof end !== \"string\") continue\n const target = items.find((candidate) => candidate.id === end)\n if (!target) {\n throw new CanvasError(\n `arrow '${item.id}' \"${key}\" names '${end}', which the canvas does not have.`\n )\n }\n if (target.type === \"arrow\") {\n throw new CanvasError(\n `arrow '${item.id}' \"${key}\" names arrow '${end}'; an arrow joins items, not arrows.`\n )\n }\n }\n if (item.from === item.to) {\n throw new CanvasError(`arrow '${item.id}' starts and ends at '${String(item.from)}'.`)\n }\n }\n return { items }\n}\n\nconst KEYS: Readonly<Record<CanvasItemType, readonly string[]>> = {\n board: [\"file\", \"x\", \"y\", \"w\", \"h\", \"title\"],\n section: [\"x\", \"y\", \"w\", \"h\", \"title\"],\n note: [\"x\", \"y\", \"w\", \"h\", \"text\", \"tone\"],\n text: [\"x\", \"y\", \"w\", \"text\", \"size\"],\n shape: [\"shape\", \"x\", \"y\", \"w\", \"h\", \"text\", \"tone\"],\n arrow: [\"from\", \"to\", \"label\", \"dashed\"],\n embed: [\"src\", \"x\", \"y\", \"w\", \"h\", \"title\"],\n}\n\nfunction readItem(value: unknown, index: number): CanvasItem {\n const loose = record(value, `item ${index + 1}`, null)\n if (typeof loose.id !== \"string\" || !ITEM_ID.test(loose.id)) {\n throw new CanvasError(\n `item ${index + 1} needs an \"id\" of lowercase letters, digits, and hyphens, such as \"pricing\".`\n )\n }\n const id = loose.id\n if (!(CANVAS_ITEM_TYPES as readonly unknown[]).includes(loose.type)) {\n throw new CanvasError(\n `item '${id}' has type ${JSON.stringify(loose.type)}; use one of ${CANVAS_ITEM_TYPES.join(\", \")}.`\n )\n }\n const type = loose.type as CanvasItemType\n const at = `${type} '${id}'`\n const input = record(value, at, [\"id\", \"type\", ...KEYS[type]])\n const place = () => ({ id, x: position(input.x, at, \"x\"), y: position(input.y, at, \"y\") })\n const size = (key: \"w\" | \"h\") => dimension(input[key], at, key)\n const title = () => optionalText(input.title, at, \"title\", LABEL_MAX)\n const tone = () => {\n if (input.tone === undefined) return {}\n if (!isArtifactTone(input.tone)) {\n throw new CanvasError(\n `${at} has the tone ${JSON.stringify(input.tone)}; use one of ${ARTIFACT_TONES.join(\", \")}.`\n )\n }\n return { tone: input.tone }\n }\n switch (type) {\n case \"board\": {\n if (typeof input.file !== \"string\" || !/\\.html?$/i.test(input.file)) {\n throw new CanvasError(\n `${at} needs a \"file\", the HTML it shows, such as \"boards/${id}.html\".`\n )\n }\n return { type, ...place(), w: size(\"w\"), h: size(\"h\"), file: input.file, ...title() }\n }\n case \"section\":\n return { type, ...place(), w: size(\"w\"), h: size(\"h\"), ...title() }\n case \"note\":\n return {\n type,\n ...place(),\n w: size(\"w\"),\n ...(input.h === undefined ? {} : { h: size(\"h\") }),\n text: requiredText(input.text, at, \"text\", TEXT_MAX),\n ...tone(),\n }\n case \"text\": {\n if (\n input.size !== undefined &&\n !(CANVAS_TEXT_SIZES as readonly unknown[]).includes(input.size)\n ) {\n throw new CanvasError(\n `${at} \"size\" is ${JSON.stringify(input.size)}; use one of ${CANVAS_TEXT_SIZES.join(\", \")}.`\n )\n }\n return {\n type,\n ...place(),\n text: requiredText(input.text, at, \"text\", TEXT_MAX),\n size: (input.size as CanvasTextSize | undefined) ?? \"m\",\n ...(input.w === undefined ? {} : { w: size(\"w\") }),\n }\n }\n case \"shape\": {\n if (!(CANVAS_SHAPES as readonly unknown[]).includes(input.shape)) {\n throw new CanvasError(\n `${at} \"shape\" is ${JSON.stringify(input.shape)}; use one of ${CANVAS_SHAPES.join(\", \")}.`\n )\n }\n return {\n type,\n ...place(),\n w: size(\"w\"),\n h: size(\"h\"),\n shape: input.shape as CanvasShape,\n ...optionalText(input.text, at, \"text\", LABEL_MAX, \"text\"),\n ...tone(),\n }\n }\n case \"embed\": {\n if (typeof input.src !== \"string\" || !isArtifactAddress(input.src)) {\n throw new CanvasError(\n `${at} needs a \"src\", another artifact's address, such as \"artifact:art_k3m9q2x7tp#chart=revenue\".`\n )\n }\n return { type, ...place(), w: size(\"w\"), h: size(\"h\"), src: input.src.trim(), ...title() }\n }\n case \"arrow\": {\n if (input.dashed !== undefined && typeof input.dashed !== \"boolean\") {\n throw new CanvasError(`${at} \"dashed\" must be true or false.`)\n }\n return {\n type,\n id,\n from: end(input.from, at, \"from\"),\n to: end(input.to, at, \"to\"),\n ...optionalText(input.label, at, \"label\", LABEL_MAX, \"label\"),\n dashed: input.dashed === true,\n }\n }\n }\n}\n\nfunction end(value: unknown, at: string, key: string): CanvasEnd {\n if (typeof value === \"string\" && value) return value\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n const point = record(value, `${at} \"${key}\"`, [\"x\", \"y\"])\n return { x: position(point.x, at, `${key}.x`), y: position(point.y, at, `${key}.y`) }\n }\n throw new CanvasError(\n `${at} needs \"${key}\": an item's id, or a point such as { \"x\": 0, \"y\": 0 }.`\n )\n}\n\nfunction position(value: unknown, at: string, key: string): number {\n const max = ARTIFACT_LIMITS.maxCanvasPosition\n if (typeof value !== \"number\" || !Number.isFinite(value) || Math.abs(value) > max) {\n throw new CanvasError(\n `${at} needs \"${key}\", a number of pixels within ±${max.toLocaleString(\"en-US\")}.`\n )\n }\n return value\n}\n\nfunction dimension(value: unknown, at: string, key: string): number {\n const { minCanvasItemSize: min, maxCanvasItemSize: max } = ARTIFACT_LIMITS\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < min || value > max) {\n throw new CanvasError(`${at} needs \"${key}\", a size of ${min} to ${max} pixels.`)\n }\n return value\n}\n\nfunction requiredText(value: unknown, at: string, key: string, max: number): string {\n if (typeof value !== \"string\" || !value.trim())\n throw new CanvasError(`${at} needs \"${key}\", its text.`)\n if (value.length > max)\n throw new CanvasError(`${at} \"${key}\" is ${value.length} characters; at most ${max}.`)\n return value.trim()\n}\n\nfunction optionalText(\n value: unknown,\n at: string,\n key: string,\n max: number,\n as: string = key\n): Record<string, string> {\n if (value === undefined) return {}\n if (typeof value !== \"string\" || value.length > max) {\n throw new CanvasError(`${at} \"${key}\" must be text of at most ${max} characters.`)\n }\n return value.trim() ? { [as]: value.trim() } : {}\n}\n\nfunction record(\n value: unknown,\n at: string,\n keys: readonly string[] | null\n): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new CanvasError(`${at} must be an object.`)\n }\n const input = value as Record<string, unknown>\n const unknownKey = keys && Object.keys(input).find((key) => !keys.includes(key))\n if (unknownKey) {\n throw new CanvasError(\n `${at} has '${unknownKey}'; it takes ${keys.map((key) => `\"${key}\"`).join(\", \")}.`\n )\n }\n return input\n}\n",
10
+ "/**\n * What a version contains, read from its files when it is published. Addresses resolve against\n * it, and previews and hover cards show it without opening the files.\n */\nexport type ArtifactOutline =\n | DocumentOutline\n | SheetOutline\n | SlidesOutline\n | PageOutline\n | CanvasOutline\n | FileOutline\n\nexport interface DocumentOutline {\n readonly kind: \"document\"\n readonly headings: readonly DocumentHeading[]\n}\n\nexport interface DocumentHeading {\n readonly depth: number\n readonly text: string\n /** What `#part` names in an address to this section. */\n readonly slug: string\n}\n\nexport interface SheetOutline {\n readonly kind: \"sheet\"\n readonly sheets: readonly SheetSummary[]\n /** The names of the charts declared in the workbook. */\n readonly charts: readonly string[]\n}\n\nexport interface SheetSummary {\n readonly name: string\n /** The rows of its CSV; none for a live sheet, whose rows are each reader's. */\n readonly rows: number\n readonly columns: readonly string[]\n /** A live sheet's query, whose rows it shows. */\n readonly query?: string\n}\n\nexport interface SlidesOutline {\n readonly kind: \"slides\"\n /** One entry per slide, in order; the title is the slide's first heading. */\n readonly slides: readonly { readonly title?: string }[]\n}\n\nexport interface PageOutline {\n readonly kind: \"page\"\n /** The page's `<title>`, else its first heading. */\n readonly title?: string\n}\n\nexport interface CanvasOutline {\n readonly kind: \"canvas\"\n /** The boards and sections an address can name, by id, in the canvas's order. */\n readonly items: readonly CanvasOutlineItem[]\n}\n\nexport type CanvasOutlineItem =\n | {\n readonly id: string\n readonly type: \"board\"\n readonly title?: string\n /** The HTML file it shows, and its size: what its frame serves, and the shape it embeds at. */\n readonly file: string\n readonly w: number\n readonly h: number\n }\n | { readonly id: string; readonly type: \"section\"; readonly title?: string }\n\nexport interface FileOutline {\n readonly kind: \"file\"\n readonly mediaType: string\n}\n\n/**\n * Turns a document's heading texts, in order, into their section slugs: lowercase, punctuation\n * dropped, spaces as hyphens, and `-1`, `-2` after a repeat. Publishing and the renderer both name\n * sections with it, so an address to a section finds the heading the reader sees.\n */\nexport function createHeadingSlugger(): (text: string) => string {\n const used = new Set<string>()\n return (text) => {\n const base =\n text\n .trim()\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s_-]/gu, \"\")\n .replace(/\\s+/g, \"-\") || \"section\"\n let slug = base\n for (let repeat = 1; used.has(slug); repeat += 1) slug = `${base}-${repeat}`\n used.add(slug)\n return slug\n }\n}\n",
11
+ "/**\n * The one CSV reader for sheets, used when a sheet is published and when it is shown, so both read\n * the same cells. RFC 4180: fields split on commas (or tabs); a quoted field may hold separators,\n * line breaks, and doubled quotes; lines end in CRLF, LF, or CR; a leading byte-order mark is not\n * part of the text; blank lines are skipped. Rows come back as they were written, some shorter or\n * longer than the header: the reader of the table decides what that means.\n */\nexport interface CsvTable {\n readonly header: readonly string[]\n readonly rows: readonly (readonly string[])[]\n}\n\nexport class CsvParseError extends Error {\n constructor(\n message: string,\n /** The line, from 1, where the record that could not be read starts. */\n readonly line: number\n ) {\n super(message)\n this.name = \"CsvParseError\"\n }\n}\n\nexport function parseCsv(\n text: string,\n options: { readonly delimiter?: \",\" | \"\\t\" } = {}\n): CsvTable {\n const delimiter = options.delimiter ?? \",\"\n const source = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text\n const records: string[][] = []\n let record: string[] = []\n let field = \"\"\n // Inside a quoted field; and whether the current record had one, so `\"\"` alone is a record.\n let quoted = false\n let quotedSeen = false\n let line = 1\n let recordLine = 1\n let index = 0\n\n const endField = () => {\n record.push(field)\n field = \"\"\n }\n const endRecord = () => {\n endField()\n // A line with nothing on it is not a record.\n if (!(record.length === 1 && record[0] === \"\" && !quotedSeen)) records.push(record)\n record = []\n quotedSeen = false\n }\n\n while (index < source.length) {\n const char = source[index]\n if (quoted) {\n if (char === '\"') {\n if (source[index + 1] === '\"') {\n field += '\"'\n index += 2\n continue\n }\n quoted = false\n index += 1\n const next = source[index]\n if (next !== undefined && next !== delimiter && next !== \"\\n\" && next !== \"\\r\") {\n throw new CsvParseError(\n `A quoted field on line ${line} goes on after its closing quote; quote the whole field and double the quotes inside it.`,\n recordLine\n )\n }\n continue\n }\n if (char === \"\\n\" || (char === \"\\r\" && source[index + 1] !== \"\\n\")) line += 1\n field += char\n index += 1\n continue\n }\n if (char === '\"' && field === \"\") {\n quoted = true\n quotedSeen = true\n index += 1\n continue\n }\n if (char === delimiter) {\n endField()\n index += 1\n continue\n }\n if (char === \"\\r\" || char === \"\\n\") {\n endRecord()\n index += char === \"\\r\" && source[index + 1] === \"\\n\" ? 2 : 1\n line += 1\n recordLine = line\n continue\n }\n field += char\n index += 1\n }\n if (quoted) {\n throw new CsvParseError(\n `A quoted field that starts on line ${recordLine} is never closed.`,\n recordLine\n )\n }\n if (field !== \"\" || record.length > 0 || quotedSeen) endRecord()\n\n const [header, ...rows] = records\n return { header: header ?? [], rows }\n}\n\n/**\n * A table as CSV, the inverse of {@link parseCsv}: a field holding a comma, a quote, or a line\n * break is quoted, its quotes doubled; lines end in CRLF, as RFC 4180 writes them.\n */\nexport function formatCsv(header: readonly string[], rows: readonly (readonly string[])[]): string {\n const field = (value: string) =>\n /[\",\\r\\n]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value\n return [header, ...rows].map((row) => `${row.map(field).join(\",\")}\\r\\n`).join(\"\")\n}\n",
12
+ "/**\n * A computed column's formula, as an Excel table writes one: `([@Revenue]-[@Cost])/[@Revenue]`.\n * `[@Name]` is this row's value in a column, `[Name]` the whole column (only inside an aggregate),\n * and a name holding brackets or other special characters is bracketed again: `[@[Lead (weeks)]]`.\n * In a name, `'` escapes the next character, as in Excel.\n */\nexport type FormulaNode =\n | { readonly kind: \"number\"; readonly value: number }\n | { readonly kind: \"text\"; readonly value: string }\n | { readonly kind: \"boolean\"; readonly value: boolean }\n /** This row's value in a column. */\n | { readonly kind: \"ref\"; readonly column: string }\n /** Every value of a column. */\n | { readonly kind: \"columnRef\"; readonly column: string }\n | { readonly kind: \"unary\"; readonly op: \"-\" | \"+\"; readonly operand: FormulaNode }\n | {\n readonly kind: \"binary\"\n readonly op: FormulaOperator\n readonly left: FormulaNode\n readonly right: FormulaNode\n }\n | { readonly kind: \"call\"; readonly name: string; readonly args: readonly FormulaNode[] }\n\nexport type FormulaOperator =\n | \"+\"\n | \"-\"\n | \"*\"\n | \"/\"\n | \"^\"\n | \"&\"\n | \"=\"\n | \"<>\"\n | \"<\"\n | \"<=\"\n | \">\"\n | \">=\"\n\n/** A formula that does not parse, with what is wrong where, from the first character as 1. */\nexport class FormulaSyntaxError extends Error {\n constructor(\n message: string,\n readonly position: number\n ) {\n super(message)\n this.name = \"FormulaSyntaxError\"\n }\n}\n\ntype Token =\n | { readonly kind: \"number\"; readonly value: number; readonly at: number }\n | { readonly kind: \"text\"; readonly value: string; readonly at: number }\n | { readonly kind: \"name\"; readonly value: string; readonly at: number }\n | { readonly kind: \"ref\"; readonly column: string; readonly row: boolean; readonly at: number }\n | { readonly kind: \"op\"; readonly value: string; readonly at: number }\n | { readonly kind: \"end\"; readonly at: number }\n\nconst OPERATORS = [\"<>\", \"<=\", \">=\", \"+\", \"-\", \"*\", \"/\", \"^\", \"&\", \"=\", \"<\", \">\", \"(\", \")\", \",\"]\n\nfunction tokens(source: string): Token[] {\n const list: Token[] = []\n let index = 0\n const fail = (message: string, at = index): never => {\n throw new FormulaSyntaxError(`${message} at character ${at + 1}.`, at + 1)\n }\n /** A column's name up to its closing bracket, `'` escaping the next character. */\n const name = (): string => {\n let value = \"\"\n while (index < source.length && source[index] !== \"]\") {\n if (source[index] === \"[\") fail(\"A column's name holds '[': escape it as '[\")\n if (source[index] === \"'\") index += 1\n value += source[index] ?? \"\"\n index += 1\n }\n if (source[index] !== \"]\") fail(\"A column reference is never closed with ']'\")\n index += 1\n return value.trim()\n }\n while (index < source.length) {\n const char = source[index] as string\n const at = index\n if (/\\s/.test(char)) {\n index += 1\n continue\n }\n if (/[0-9.]/.test(char)) {\n const match = /^(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?/i.exec(source.slice(index))\n if (!match) fail(\"A number is not written right\")\n index += (match as RegExpExecArray)[0].length\n list.push({ kind: \"number\", value: Number((match as RegExpExecArray)[0]), at })\n continue\n }\n if (char === '\"') {\n let value = \"\"\n index += 1\n for (;;) {\n if (index >= source.length) fail(\"A text in quotes is never closed\", at)\n if (source[index] === '\"') {\n if (source[index + 1] === '\"') {\n value += '\"'\n index += 2\n continue\n }\n index += 1\n break\n }\n value += source[index]\n index += 1\n }\n list.push({ kind: \"text\", value, at })\n continue\n }\n if (char === \"[\") {\n index += 1\n const row = source[index] === \"@\"\n if (row) index += 1\n let column: string\n if (source[index] === \"[\") {\n index += 1\n column = name()\n if (source[index] !== \"]\") fail(\"A bracketed column name needs its outer ']'\")\n index += 1\n } else {\n column = name()\n }\n if (!column) fail(\"A column reference names no column\", at)\n list.push({ kind: \"ref\", column, row, at })\n continue\n }\n if (/[A-Za-z_]/.test(char)) {\n const match = /^[A-Za-z_][A-Za-z0-9_.]*/.exec(source.slice(index)) as RegExpExecArray\n index += match[0].length\n list.push({ kind: \"name\", value: match[0].toUpperCase(), at })\n continue\n }\n const operator = OPERATORS.find((candidate) => source.startsWith(candidate, index))\n if (!operator) fail(`'${char}' is not part of a formula`)\n index += (operator as string).length\n list.push({ kind: \"op\", value: operator as string, at })\n }\n list.push({ kind: \"end\", at: source.length })\n return list\n}\n\n/** How tightly each operator binds its operands; all bind leftward, `^` too: `2^3^2` is 64. */\nconst BINDING: Readonly<Record<string, number>> = {\n \"=\": 10,\n \"<>\": 10,\n \"<\": 10,\n \"<=\": 10,\n \">\": 10,\n \">=\": 10,\n \"&\": 20,\n \"+\": 30,\n \"-\": 30,\n \"*\": 40,\n \"/\": 40,\n \"^\": 50,\n}\n/** A sign binds tighter than `^`: `-2^2` is 4, as Excel reads it. */\nconst PREFIX = 60\n\n/**\n * Parses a formula, with or without its leading `=`. Throws a {@link FormulaSyntaxError} that\n * says what is wrong and where.\n */\nexport function parseFormula(text: string): FormulaNode {\n const source = text.trim().replace(/^=/, \"\")\n const list = tokens(source)\n let position = 0\n const peek = () => list[position] as Token\n const next = () => list[position++] as Token\n const fail = (message: string, token: Token): never => {\n throw new FormulaSyntaxError(`${message} at character ${token.at + 1}.`, token.at + 1)\n }\n const expect = (value: string) => {\n const token = next()\n if (token.kind !== \"op\" || token.value !== value) {\n fail(`Expected '${value}'`, token)\n }\n }\n\n const expression = (binding: number): FormulaNode => {\n let left = operand()\n for (;;) {\n const token = peek()\n if (token.kind !== \"op\") break\n const power = BINDING[token.value]\n if (power === undefined || power <= binding) break\n next()\n const right = expression(power)\n left = { kind: \"binary\", op: token.value as FormulaOperator, left, right }\n }\n return left\n }\n\n const operand = (): FormulaNode => {\n const token = next()\n switch (token.kind) {\n case \"number\":\n return { kind: \"number\", value: token.value }\n case \"text\":\n return { kind: \"text\", value: token.value }\n case \"ref\":\n return token.row\n ? { kind: \"ref\", column: token.column }\n : { kind: \"columnRef\", column: token.column }\n case \"name\": {\n if (token.value === \"TRUE\" || token.value === \"FALSE\") {\n return { kind: \"boolean\", value: token.value === \"TRUE\" }\n }\n if (peek().kind !== \"op\" || (peek() as { value: string }).value !== \"(\") {\n return fail(\n `'${token.value}' is not a function call or a reference; a column is written [@Name]`,\n token\n )\n }\n next()\n const args: FormulaNode[] = []\n if (!(peek().kind === \"op\" && (peek() as { value: string }).value === \")\")) {\n for (;;) {\n args.push(expression(0))\n const separator = peek()\n if (separator.kind === \"op\" && separator.value === \",\") {\n next()\n continue\n }\n break\n }\n }\n expect(\")\")\n return { kind: \"call\", name: token.value, args }\n }\n case \"op\":\n if (token.value === \"(\") {\n const inner = expression(0)\n expect(\")\")\n return inner\n }\n if (token.value === \"-\" || token.value === \"+\") {\n return { kind: \"unary\", op: token.value, operand: expression(PREFIX) }\n }\n return fail(`'${token.value}' can't start a value`, token)\n case \"end\":\n return fail(\"The formula ends where a value is expected\", token)\n }\n }\n\n const tree = expression(0)\n const rest = peek()\n if (rest.kind !== \"end\") fail(\"The formula goes on after a complete value\", rest)\n return tree\n}\n\n/** The columns a formula reads, by row or whole. */\nexport function formulaDependencies(node: FormulaNode): Set<string> {\n const columns = new Set<string>()\n visitReferences(node, (reference) => columns.add(reference.column))\n return columns\n}\n\n/**\n * The columns a formula reads in its own row, `[@Revenue]`, apart from those it reads whole,\n * `[Revenue]` in `SUM([Revenue])`: a value of the second depends on every row's.\n */\nexport function formulaReferences(node: FormulaNode): {\n readonly row: Set<string>\n readonly whole: Set<string>\n} {\n const row = new Set<string>()\n const whole = new Set<string>()\n visitReferences(node, (reference) =>\n (reference.kind === \"ref\" ? row : whole).add(reference.column)\n )\n return { row, whole }\n}\n\ntype FormulaReference = Extract<FormulaNode, { readonly kind: \"ref\" | \"columnRef\" }>\n\nfunction visitReferences(node: FormulaNode, found: (reference: FormulaReference) => void): void {\n const visit = (current: FormulaNode) => {\n switch (current.kind) {\n case \"ref\":\n case \"columnRef\":\n found(current)\n return\n case \"unary\":\n visit(current.operand)\n return\n case \"binary\":\n visit(current.left)\n visit(current.right)\n return\n case \"call\":\n for (const arg of current.args) visit(arg)\n return\n default:\n return\n }\n }\n visit(node)\n}\n\n/**\n * A formula with every reference to a column renamed, `[@Revenue]` and `[Revenue]` alike, and\n * nothing else changed: text in quotes is left as it is, and the new name is bracketed again when\n * it holds characters a plain reference can't.\n */\nexport function renameColumnReferences(formula: string, from: string, to: string): string {\n let result = \"\"\n let index = 0\n while (index < formula.length) {\n const char = formula[index] as string\n if (char === '\"') {\n // A text in quotes, its quotes doubled, as the parser reads one.\n let end = index + 1\n while (end < formula.length) {\n if (formula[end] === '\"' && formula[end + 1] === '\"') end += 2\n else if (formula[end] === '\"') break\n else end += 1\n }\n result += formula.slice(index, end + 1)\n index = end + 1\n continue\n }\n if (char !== \"[\") {\n result += char\n index += 1\n continue\n }\n const start = index\n index += 1\n const row = formula[index] === \"@\"\n if (row) index += 1\n const bracketed = formula[index] === \"[\"\n if (bracketed) index += 1\n let name = \"\"\n while (index < formula.length && formula[index] !== \"]\") {\n if (formula[index] === \"'\") index += 1\n name += formula[index] ?? \"\"\n index += 1\n }\n index += bracketed ? 2 : 1\n result +=\n name.trim() === from\n ? columnReference(to, row)\n : formula.slice(start, Math.min(index, formula.length))\n }\n return result\n}\n\n/** A reference to a column: this row's value, or the whole column. */\nfunction columnReference(name: string, row: boolean): string {\n const escaped = name.replace(/['[\\]#@]/g, \"'$&\")\n const plain = /^[A-Za-z0-9_ ]+$/.test(name) && name === name.trim()\n const inner = plain ? escaped : `[${escaped}]`\n return row ? `[@${inner}]` : `[${inner}]`\n}\n",
13
+ "import { FormulaSyntaxError, parseFormula } from \"./formula/parser\"\nimport { ARTIFACT_LIMITS } from \"./limits\"\nimport { isArtifactQueryName } from \"./queries\"\nimport { ARTIFACT_TONES, type ArtifactTone, isArtifactTone } from \"./tones\"\n\n/**\n * A sheet artifact is `workbook.json` and one CSV per sheet under `sheets/`. The CSV holds the\n * values; the workbook holds what CSV can't: sheet order, column types and formats, frozen rows\n * and columns, widths, descriptions and totals, computed columns' formulas, and charts drawn from\n * the sheets. A live sheet has no CSV: its rows are one of the version's queries', as each reader\n * reads them.\n */\nexport const WORKBOOK_FILE = \"workbook.json\"\n\nexport const SHEET_COLUMN_TYPES = [\n \"text\",\n \"number\",\n \"currency\",\n \"percent\",\n \"date\",\n \"link\",\n \"image\",\n \"boolean\",\n \"tag\",\n] as const\nexport type SheetColumnType = (typeof SHEET_COLUMN_TYPES)[number]\n\n/** Column types whose cells are numbers, so a chart can plot them and a range can sum them. */\nexport const NUMERIC_COLUMN_TYPES: readonly SheetColumnType[] = [\"number\", \"currency\", \"percent\"]\n\n/**\n * How a numeric column's cells are shaded by value, across the column: a bar in the cell, a\n * shade from light to dark, or two colors either side of zero.\n */\nexport const SHEET_HIGHLIGHTS = [\"bars\", \"scale\", \"diverging\"] as const\nexport type SheetHighlight = (typeof SHEET_HIGHLIGHTS)[number]\n\n/** What a sheet's totals row shows under a column, over the rows the reader sees. */\nexport const SHEET_TOTALS = [\"sum\", \"average\", \"min\", \"max\", \"count\"] as const\nexport type SheetTotal = (typeof SHEET_TOTALS)[number]\n\nexport const SHEET_CHART_TYPES = [\"bar\", \"line\", \"area\", \"pie\", \"scatter\"] as const\nexport type SheetChartType = (typeof SHEET_CHART_TYPES)[number]\n\n/** How a chart summarizes rows that share an x value: one point or slice for each value. */\nexport const SHEET_CHART_AGGREGATES = [\"sum\", \"average\", \"count\"] as const\nexport type SheetChartAggregate = (typeof SHEET_CHART_AGGREGATES)[number]\n\nexport interface SheetColumnFormat {\n readonly type: SheetColumnType\n /** An ISO 4217 code, for a currency column. */\n readonly currency?: string\n /** Digits after the decimal point, for numbers, currencies, and percents. */\n readonly decimals?: number\n /** `1.2M` for `1,204,330`, for numbers and currencies. */\n readonly compact?: boolean\n /** A sign on positive values too, `+3.2%`, for numbers, currencies, and percents. */\n readonly signed?: boolean\n /** A tag column's colors by value; a value not named is neutral. */\n readonly tones?: Readonly<Record<string, ArtifactTone>>\n /** How a numeric column's cells are shaded by value. */\n readonly highlight?: SheetHighlight\n /** The formula that computes the column's every value, as an Excel table's column does. */\n readonly formula?: string\n}\n\nexport interface WorkbookSheet {\n readonly name: string\n /** Rows that stay in view as the sheet scrolls, the header row included. */\n readonly frozenRows: number\n /** Columns that stay in view as the sheet scrolls sideways. */\n readonly frozenColumns: number\n /** Formats by column name; a column not named here is text. */\n readonly columns: Readonly<Record<string, SheetColumnFormat>>\n /** Widths in pixels by column name. */\n readonly widths: Readonly<Record<string, number>>\n /** What a column means, shown on its header, by column name. */\n readonly descriptions: Readonly<Record<string, string>>\n /** A totals row pinned under the rows: what each named column totals to. */\n readonly totals: Readonly<Record<string, SheetTotal>>\n /** Where a live sheet's rows and columns come from; a sheet without it holds its CSV's. */\n readonly live?: LiveSheetSource\n}\n\n/**\n * A live sheet's query and columns. Its columns are exactly those its workbook lists, in order,\n * each showing a property of the rows or computed by a formula. A column whose type is its\n * property's has no format in `columns` until the property's type is known: `liveSheetColumns`\n * reads it then.\n */\nexport interface LiveSheetSource {\n /** The query whose rows the sheet shows: `queries/<name>.json` in the version. */\n readonly query: string\n readonly columns: readonly LiveSheetColumnSource[]\n}\n\nexport interface LiveSheetColumnSource {\n readonly name: string\n /**\n * The property the column shows: a property id of the rows, or `<linkId>.<propertyId>` of a\n * link the query expands. A computed column has none.\n */\n readonly from?: string\n /** The column's format as written, when it gives no type: its property's type is its type. */\n readonly untyped?: Readonly<Record<string, unknown>>\n}\n\nexport interface WorkbookChart {\n /** What `#chart=<name>` names in an address; lowercase letters, digits, and hyphens. */\n readonly name: string\n readonly type: SheetChartType\n readonly sheet: string\n /** The column along the x axis, or a pie's slice labels. */\n readonly x: string\n /**\n * The plotted columns: one series each, or a pie's one value column. Empty for a chart that\n * counts rows.\n */\n readonly y: readonly string[]\n /** A bar chart's columns drawn as lines over its bars. */\n readonly line: readonly string[]\n /** Rows summarized by their x value, in the order the values first appear. */\n readonly aggregate?: SheetChartAggregate\n readonly title?: string\n /** Stack a bar or area chart's series. */\n readonly stacked: boolean\n}\n\nexport interface Workbook {\n readonly sheets: readonly WorkbookSheet[]\n readonly charts: readonly WorkbookChart[]\n}\n\n/** Where a sheet's values are, in the artifact. */\nexport function sheetFilePath(sheetName: string): string {\n return `sheets/${sheetName}.csv`\n}\n\n/**\n * Reads `workbook.json` into its full form: `\"Revenue\": \"currency\"` becomes\n * `{ type: \"currency\" }`, a single `y` becomes a list, and defaults are filled. Returns what is\n * wrong in words the author can act on. Whether the columns exist is checked against the CSVs, and\n * a live sheet's against its query.\n */\nexport function parseWorkbook(\n text: string\n): { readonly workbook: Workbook } | { readonly error: string } {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n return { error: `${WORKBOOK_FILE} is not valid JSON.` }\n }\n try {\n return { workbook: readWorkbook(value) }\n } catch (error) {\n if (error instanceof WorkbookError) return { error: `${WORKBOOK_FILE}: ${error.message}` }\n throw error\n }\n}\n\n/** A number as a sheet stores it: plain digits, an optional sign, decimals, and exponent. */\nexport function parseSheetNumber(value: string): number | undefined {\n const trimmed = value.trim()\n if (!/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(trimmed)) return undefined\n const number = Number(trimmed)\n return Number.isFinite(number) ? number : undefined\n}\n\n/** A date as a sheet stores it: `YYYY-MM-DD`, optionally with an ISO 8601 time. */\nexport function parseSheetDate(value: string): Date | undefined {\n const trimmed = value.trim()\n if (!/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[-+]\\d{2}:\\d{2})?)?$/.test(trimmed)) {\n return undefined\n }\n const date = new Date(trimmed.length === 10 ? `${trimmed}T00:00:00Z` : trimmed)\n return Number.isNaN(date.getTime()) ? undefined : date\n}\n\nclass WorkbookError extends Error {}\n\nconst SHEET_NAME_MAX = 60\nconst DESCRIPTION_MAX = 300\nconst TONES_MAX = 20\nconst TAG_MAX = 60\nconst FORMULA_MAX = 500\nconst COMPUTED_MAX = 20\nconst CHART_NAME = /^[a-z0-9][a-z0-9-]{0,39}$/\nconst CONTROL = /[\\u0000-\\u001f\\u007f]/\n\nfunction readWorkbook(value: unknown): Workbook {\n const input = record(value, \"the workbook\", [\"sheets\", \"charts\"])\n if (!Array.isArray(input.sheets) || input.sheets.length === 0) {\n throw new WorkbookError('\"sheets\" must list at least one sheet.')\n }\n if (input.sheets.length > ARTIFACT_LIMITS.maxSheets) {\n throw new WorkbookError(\n `a workbook holds at most ${ARTIFACT_LIMITS.maxSheets} sheets; this one has ${input.sheets.length}.`\n )\n }\n const sheets = input.sheets.map((sheet, index) => readSheet(sheet, index))\n const names = new Set<string>()\n for (const sheet of sheets) {\n const key = sheet.name.toLowerCase()\n if (names.has(key)) throw new WorkbookError(`two sheets are named '${sheet.name}'.`)\n names.add(key)\n }\n\n const chartsInput = input.charts ?? []\n if (!Array.isArray(chartsInput)) throw new WorkbookError('\"charts\" must be a list.')\n if (chartsInput.length > ARTIFACT_LIMITS.maxCharts) {\n throw new WorkbookError(\n `a workbook holds at most ${ARTIFACT_LIMITS.maxCharts} charts; this one has ${chartsInput.length}.`\n )\n }\n const charts = chartsInput.map((chart, index) => readChart(chart, index, sheets))\n const chartNames = new Set<string>()\n for (const chart of charts) {\n if (chartNames.has(chart.name)) throw new WorkbookError(`two charts are named '${chart.name}'.`)\n chartNames.add(chart.name)\n }\n return { sheets, charts }\n}\n\nfunction readSheet(value: unknown, index: number): WorkbookSheet {\n const at = `sheet ${index + 1}`\n const input = record(value, at, [\n \"name\",\n \"frozenRows\",\n \"frozenColumns\",\n \"columns\",\n \"widths\",\n \"descriptions\",\n \"totals\",\n \"query\",\n ])\n const name = typeof input.name === \"string\" ? input.name.trim() : \"\"\n if (\n !name ||\n name.length > SHEET_NAME_MAX ||\n CONTROL.test(name) ||\n /[/\\\\]/.test(name) ||\n name === \".\" ||\n name === \"..\"\n ) {\n throw new WorkbookError(\n `${at} needs a \"name\" of at most ${SHEET_NAME_MAX} characters without / or \\\\; its values go in sheets/<name>.csv.`\n )\n }\n const sheetAt = `sheet '${name}'`\n const live = input.query === undefined ? undefined : readLiveSheet(input, sheetAt)\n const columns: Record<string, SheetColumnFormat> = {}\n for (const [column, format] of Object.entries(\n record(input.columns ?? {}, `${sheetAt} \"columns\"`, null)\n )) {\n const at = `${sheetAt} column '${column}'`\n if (!live) {\n columns[column] = readColumnFormat(format, at)\n continue\n }\n\n // A live column's `from` is its source, not its format; without a type, its property's is.\n const { from: _from, ...written } = format as Record<string, unknown>\n if (written.type !== undefined || written.formula !== undefined) {\n columns[column] = readColumnFormat(written, at)\n }\n }\n const computed = Object.values(columns).filter((format) => format.formula).length\n if (computed > COMPUTED_MAX) {\n throw new WorkbookError(\n `${sheetAt} computes ${computed} columns; a sheet computes at most ${COMPUTED_MAX}.`\n )\n }\n const widths: Record<string, number> = {}\n for (const [column, width] of Object.entries(\n record(input.widths ?? {}, `${sheetAt} \"widths\"`, null)\n )) {\n if (typeof width !== \"number\" || !Number.isInteger(width) || width < 40 || width > 800) {\n throw new WorkbookError(\n `${sheetAt} gives column '${column}' a width of ${String(width)}; use 40 to 800 pixels.`\n )\n }\n widths[column] = width\n }\n const descriptions: Record<string, string> = {}\n for (const [column, description] of Object.entries(\n record(input.descriptions ?? {}, `${sheetAt} \"descriptions\"`, null)\n )) {\n if (\n typeof description !== \"string\" ||\n !description.trim() ||\n description.length > DESCRIPTION_MAX\n ) {\n throw new WorkbookError(\n `${sheetAt} describes column '${column}' with ${JSON.stringify(description)}; a description is text of at most ${DESCRIPTION_MAX} characters.`\n )\n }\n descriptions[column] = description.trim()\n }\n const totals: Record<string, SheetTotal> = {}\n for (const [column, total] of Object.entries(\n record(input.totals ?? {}, `${sheetAt} \"totals\"`, null)\n )) {\n if (!(SHEET_TOTALS as readonly unknown[]).includes(total)) {\n throw new WorkbookError(\n `${sheetAt} totals column '${column}' with ${JSON.stringify(total)}; use one of ${SHEET_TOTALS.join(\", \")}.`\n )\n }\n // A live column typed by its property is checked once its property's type is known, and one\n // the sheet does not list once its columns are.\n const deferred = live !== undefined && columns[column] === undefined\n const problem = deferred\n ? null\n : sheetTotalProblem(sheetAt, column, total as SheetTotal, columns[column]?.type ?? \"text\")\n if (problem) throw new WorkbookError(problem)\n totals[column] = total as SheetTotal\n }\n return {\n name,\n frozenRows: integer(input.frozenRows, 1, 0, 10, `${sheetAt} \"frozenRows\"`),\n frozenColumns: integer(input.frozenColumns, 0, 0, 5, `${sheetAt} \"frozenColumns\"`),\n columns,\n widths,\n descriptions,\n totals,\n ...(live ? { live } : {}),\n }\n}\n\n/** Why a column can't have its total, or null: only a numeric column has more than a count. */\nexport function sheetTotalProblem(\n sheetAt: string,\n column: string,\n total: SheetTotal,\n type: SheetColumnType\n): string | null {\n if (total === \"count\" || NUMERIC_COLUMN_TYPES.includes(type)) return null\n return `${sheetAt} totals column '${column}' with \"${total}\", but it is ${type}; only a number, currency, or percent column has a ${total}. Use \"count\", or give it a numeric type in \"columns\".`\n}\n\n/** A JSON object puts a name such as `2024` before the others, whatever order it was written in. */\nconst INDEX_NAME = /^(0|[1-9]\\d{0,8})$/\n\n/**\n * A live sheet's query and columns. Each column shows a property, `from`, or is computed, in the\n * order `columns` lists them, so a name JSON would move is refused.\n */\nfunction readLiveSheet(input: Record<string, unknown>, sheetAt: string): LiveSheetSource {\n if (typeof input.query !== \"string\" || !isArtifactQueryName(input.query)) {\n throw new WorkbookError(\n `${sheetAt} \"query\" must name one of the version's queries, as queries/<name>.json names it: lowercase letters, digits and hyphens.`\n )\n }\n\n const entries = Object.entries(record(input.columns ?? {}, `${sheetAt} \"columns\"`, null))\n if (entries.length === 0) {\n throw new WorkbookError(\n `${sheetAt} reads query '${input.query}': list its columns in \"columns\", each with the property it shows in \"from\".`\n )\n }\n\n const columns = entries.map(([name, value]): LiveSheetColumnSource => {\n const at = `${sheetAt} column '${name}'`\n if (INDEX_NAME.test(name)) {\n throw new WorkbookError(\n `${at}: a live sheet's columns come in the order \"columns\" lists them, and JSON puts a name of digits first. Name it with a letter, such as \"FY${name}\".`\n )\n }\n\n if (typeof value === \"string\") {\n throw new WorkbookError(\n `${at} is ${JSON.stringify(value)}; a live sheet's column is an object, such as { \"from\": \"amount\", \"type\": \"${value}\" }.`\n )\n }\n const column = record(value, at, [\n \"from\",\n \"type\",\n \"currency\",\n \"decimals\",\n \"compact\",\n \"signed\",\n \"tones\",\n \"highlight\",\n \"formula\",\n ])\n if (column.from === undefined && column.formula === undefined) {\n throw new WorkbookError(\n `${at} shows nothing: give it \"from\", the property it shows, or a \"formula\".`\n )\n }\n if (column.from !== undefined && column.formula !== undefined) {\n throw new WorkbookError(\n `${at} has both \"from\" and \"formula\": a column shows a property or computes, not both.`\n )\n }\n if (column.from === undefined) return { name }\n\n const from = column.from\n const segments = typeof from === \"string\" ? from.split(\".\") : []\n if (segments.length === 0 || segments.some((segment) => !segment)) {\n throw new WorkbookError(\n `${at} \"from\" must name a property of the rows, such as \"amount\", or of a link the query expands, such as \"customer.name\".`\n )\n }\n if (segments.length > 2) {\n throw new WorkbookError(\n `${at} \"from\" is ${JSON.stringify(from)}; a column reads a property of the rows or of one link the query expands, such as \"customer.name\".`\n )\n }\n\n const { from: _from, ...untyped } = column\n return { name, from: from as string, ...(column.type === undefined ? { untyped } : {}) }\n })\n\n return { query: input.query, columns }\n}\n\n/**\n * A column's format as `columns` writes it, for a column whose type `type` gives when the format\n * names none: a live column's property's. Returns what is wrong in the words parsing uses.\n */\nexport function readSheetColumnFormat(\n value: Readonly<Record<string, unknown>>,\n at: string,\n type: SheetColumnType\n): { readonly format: SheetColumnFormat } | { readonly error: string } {\n try {\n return { format: readColumnFormat({ type, ...value }, at) }\n } catch (error) {\n if (error instanceof WorkbookError) return { error: `${WORKBOOK_FILE}: ${error.message}` }\n throw error\n }\n}\n\nfunction readColumnFormat(value: unknown, at: string): SheetColumnFormat {\n if (typeof value === \"string\") return { type: columnType(value, at) }\n const input = record(value, at, [\n \"type\",\n \"currency\",\n \"decimals\",\n \"compact\",\n \"signed\",\n \"tones\",\n \"highlight\",\n \"formula\",\n ])\n const type = columnType(input.type, at)\n if (input.currency !== undefined) {\n if (type !== \"currency\")\n throw new WorkbookError(`${at} sets \"currency\" but is not a currency column.`)\n if (typeof input.currency !== \"string\" || !/^[A-Z]{3}$/.test(input.currency)) {\n throw new WorkbookError(`${at} \"currency\" must be an ISO 4217 code such as \"USD\".`)\n }\n }\n if (input.decimals !== undefined && ![\"number\", \"currency\", \"percent\"].includes(type)) {\n throw new WorkbookError(\n `${at} sets \"decimals\" but is not a number, currency, or percent column.`\n )\n }\n for (const [key, types, named] of [\n [\"compact\", [\"number\", \"currency\"], \"number or currency\"],\n [\"signed\", [\"number\", \"currency\", \"percent\"], \"number, currency, or percent\"],\n ] as const) {\n if (input[key] === undefined) continue\n if (typeof input[key] !== \"boolean\") {\n throw new WorkbookError(`${at} \"${key}\" must be true or false.`)\n }\n if (!(types as readonly string[]).includes(type)) {\n throw new WorkbookError(`${at} sets \"${key}\" but is not a ${named} column.`)\n }\n }\n let tones: Record<string, ArtifactTone> | undefined\n if (input.tones !== undefined) {\n if (type !== \"tag\") throw new WorkbookError(`${at} sets \"tones\" but is not a tag column.`)\n tones = {}\n const entries = Object.entries(record(input.tones, `${at} \"tones\"`, null))\n if (entries.length > TONES_MAX) {\n throw new WorkbookError(\n `${at} \"tones\" names ${entries.length} values; it takes at most ${TONES_MAX}.`\n )\n }\n for (const [tag, tone] of entries) {\n if (!tag.trim() || tag.length > TAG_MAX) {\n throw new WorkbookError(\n `${at} \"tones\" names a value of ${tag.length} characters; a tag is 1 to ${TAG_MAX}.`\n )\n }\n if (!isArtifactTone(tone)) {\n throw new WorkbookError(\n `${at} gives '${tag}' the tone ${JSON.stringify(tone)}; use one of ${ARTIFACT_TONES.join(\", \")}.`\n )\n }\n tones[tag] = tone as ArtifactTone\n }\n }\n if (input.highlight !== undefined) {\n if (!(SHEET_HIGHLIGHTS as readonly unknown[]).includes(input.highlight)) {\n throw new WorkbookError(\n `${at} \"highlight\" is ${JSON.stringify(input.highlight)}; use one of ${SHEET_HIGHLIGHTS.join(\", \")}.`\n )\n }\n if (!NUMERIC_COLUMN_TYPES.includes(type)) {\n throw new WorkbookError(\n `${at} sets \"highlight\" but is not a number, currency, or percent column.`\n )\n }\n }\n let formula: string | undefined\n if (input.formula !== undefined) {\n if (typeof input.formula !== \"string\" || !input.formula.trim()) {\n throw new WorkbookError(`${at} \"formula\" must be text, such as \"[@Revenue]-[@Cost]\".`)\n }\n if (input.formula.length > FORMULA_MAX) {\n throw new WorkbookError(\n `${at} \"formula\" is ${input.formula.length} characters; a formula is at most ${FORMULA_MAX}.`\n )\n }\n if (type === \"link\" || type === \"image\") {\n throw new WorkbookError(`${at} is a ${type} column, which a formula can't compute.`)\n }\n formula = input.formula.trim().replace(/^=/, \"\")\n try {\n parseFormula(formula)\n } catch (error) {\n if (error instanceof FormulaSyntaxError) {\n throw new WorkbookError(`${at} \"formula\" does not read: ${error.message}`)\n }\n throw error\n }\n }\n return {\n type,\n ...(typeof input.currency === \"string\" ? { currency: input.currency } : {}),\n ...(formula ? { formula } : {}),\n ...(input.compact === true ? { compact: true } : {}),\n ...(input.signed === true ? { signed: true } : {}),\n ...(tones ? { tones } : {}),\n ...(input.highlight === undefined ? {} : { highlight: input.highlight as SheetHighlight }),\n ...(input.decimals === undefined\n ? {}\n : { decimals: integer(input.decimals, 0, 0, 6, `${at} \"decimals\"`) }),\n }\n}\n\nfunction columnType(value: unknown, at: string): SheetColumnType {\n if (typeof value === \"string\" && (SHEET_COLUMN_TYPES as readonly string[]).includes(value)) {\n return value as SheetColumnType\n }\n throw new WorkbookError(\n `${at} has type ${JSON.stringify(value)}; use one of ${SHEET_COLUMN_TYPES.join(\", \")}.`\n )\n}\n\nfunction readChart(value: unknown, index: number, sheets: readonly WorkbookSheet[]): WorkbookChart {\n const input = record(value, `chart ${index + 1}`, [\n \"name\",\n \"type\",\n \"sheet\",\n \"x\",\n \"y\",\n \"line\",\n \"aggregate\",\n \"title\",\n \"stacked\",\n ])\n if (typeof input.name !== \"string\" || !CHART_NAME.test(input.name)) {\n throw new WorkbookError(\n `chart ${index + 1} needs a \"name\" of lowercase letters, digits, and hyphens, such as \"revenue\".`\n )\n }\n const at = `chart '${input.name}'`\n if (!(SHEET_CHART_TYPES as readonly unknown[]).includes(input.type)) {\n throw new WorkbookError(\n `${at} has type ${JSON.stringify(input.type)}; use one of ${SHEET_CHART_TYPES.join(\", \")}.`\n )\n }\n const type = input.type as SheetChartType\n if (typeof input.sheet !== \"string\" || !sheets.some((sheet) => sheet.name === input.sheet)) {\n throw new WorkbookError(\n `${at} names sheet ${JSON.stringify(input.sheet)}, which the workbook does not have.`\n )\n }\n if (typeof input.x !== \"string\" || !input.x) throw new WorkbookError(`${at} needs an \"x\" column.`)\n if (\n input.aggregate !== undefined &&\n !(SHEET_CHART_AGGREGATES as readonly unknown[]).includes(input.aggregate)\n ) {\n throw new WorkbookError(\n `${at} \"aggregate\" is ${JSON.stringify(input.aggregate)}; use one of ${SHEET_CHART_AGGREGATES.join(\", \")}.`\n )\n }\n const aggregate = input.aggregate as SheetChartAggregate | undefined\n if (aggregate && type === \"scatter\") {\n throw new WorkbookError(\n `${at} is a scatter chart, which plots every row; leave out \"aggregate\".`\n )\n }\n const columns = (key: \"y\" | \"line\") => {\n const value = input[key]\n const list = typeof value === \"string\" ? [value] : (value ?? [])\n if (!Array.isArray(list) || !list.every((column) => typeof column === \"string\" && column)) {\n throw new WorkbookError(`${at} \"${key}\" must be a column, or a list of them.`)\n }\n return list as string[]\n }\n const y = columns(\"y\")\n const line = columns(\"line\")\n // Counting rows plots how many there are for each x value: there is no column to plot.\n if (aggregate === \"count\") {\n if (y.length > 0 || line.length > 0) {\n throw new WorkbookError(`${at} counts rows, which needs no \"y\"; leave it out.`)\n }\n } else if (y.length === 0) {\n throw new WorkbookError(`${at} needs a \"y\" column, or a list of them.`)\n }\n if (line.length > 0 && type !== \"bar\") {\n throw new WorkbookError(\n `${at} is a ${type} chart; only a bar chart draws \"line\" columns over its bars.`\n )\n }\n if (y.length + line.length > ARTIFACT_LIMITS.maxChartSeries) {\n throw new WorkbookError(\n `${at} plots ${y.length + line.length} columns; a chart reads well with at most ${ARTIFACT_LIMITS.maxChartSeries}. Split it, or chart the ones that matter.`\n )\n }\n if (type === \"pie\" && aggregate !== \"count\" && y.length !== 1)\n throw new WorkbookError(`${at} is a pie: give it one \"y\" column.`)\n if (input.stacked !== undefined && typeof input.stacked !== \"boolean\") {\n throw new WorkbookError(`${at} \"stacked\" must be true or false.`)\n }\n if (input.stacked === true && type !== \"bar\" && type !== \"area\") {\n throw new WorkbookError(`${at} is a ${type} chart; only bar and area charts stack.`)\n }\n if (input.title !== undefined && (typeof input.title !== \"string\" || input.title.length > 120)) {\n throw new WorkbookError(`${at} \"title\" must be text of at most 120 characters.`)\n }\n return {\n name: input.name,\n type,\n sheet: input.sheet,\n x: input.x,\n y,\n line,\n ...(aggregate ? { aggregate } : {}),\n ...(typeof input.title === \"string\" && input.title.trim() ? { title: input.title.trim() } : {}),\n stacked: input.stacked === true,\n }\n}\n\nfunction record(\n value: unknown,\n at: string,\n keys: readonly string[] | null\n): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new WorkbookError(`${at} must be an object.`)\n }\n const input = value as Record<string, unknown>\n const unknownKey = keys && Object.keys(input).find((key) => !keys.includes(key))\n if (unknownKey) {\n throw new WorkbookError(\n `${at} has '${unknownKey}'; it takes ${keys.map((key) => `\"${key}\"`).join(\", \")}.`\n )\n }\n return input\n}\n\nfunction integer(value: unknown, fallback: number, min: number, max: number, at: string): number {\n if (value === undefined) return fallback\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < min || value > max) {\n throw new WorkbookError(`${at} must be a whole number from ${min} to ${max}.`)\n }\n return value\n}\n",
14
+ "import type { FormulaNode } from \"./parser\"\n\n/**\n * What a formula yields, as far as its operands say: a date is a number of days that reads as a\n * date, and `any` is a value whose kind depends on the row, such as an IF's two kinds of branch.\n */\nexport type FormulaType = \"number\" | \"date\" | \"text\" | \"boolean\" | \"any\"\n\n/** Every function a formula may call, with how many arguments it takes. */\nexport const FORMULA_FUNCTIONS: Readonly<\n Record<string, { readonly min: number; readonly max: number }>\n> = {\n IF: { min: 2, max: 3 },\n IFERROR: { min: 2, max: 2 },\n AND: { min: 1, max: 30 },\n OR: { min: 1, max: 30 },\n NOT: { min: 1, max: 1 },\n ISBLANK: { min: 1, max: 1 },\n ROUND: { min: 2, max: 2 },\n ABS: { min: 1, max: 1 },\n MIN: { min: 1, max: 30 },\n MAX: { min: 1, max: 30 },\n SUM: { min: 1, max: 30 },\n AVERAGE: { min: 1, max: 30 },\n COUNT: { min: 1, max: 30 },\n LEN: { min: 1, max: 1 },\n LOWER: { min: 1, max: 1 },\n UPPER: { min: 1, max: 1 },\n CONCAT: { min: 1, max: 30 },\n YEAR: { min: 1, max: 1 },\n MONTH: { min: 1, max: 1 },\n DAYS: { min: 2, max: 2 },\n}\n\n/** The functions that read a whole column, `[Name]`, and reduce it to one value. */\nexport const AGGREGATE_FUNCTIONS: ReadonlySet<string> = new Set([\n \"SUM\",\n \"AVERAGE\",\n \"MIN\",\n \"MAX\",\n \"COUNT\",\n])\n\n/**\n * Checks a formula against the columns its sheet has, each by what its values are: what it yields,\n * or what is wrong with it, in words an author can act on. Text where a number is needed is\n * refused here rather than computed to `#VALUE!` in every row.\n */\nexport function checkFormula(\n node: FormulaNode,\n columns: ReadonlyMap<string, FormulaType>\n): { readonly type: FormulaType } | { readonly error: string } {\n try {\n return { type: typeOf(node, columns, false) }\n } catch (error) {\n if (error instanceof FormulaCheckError) return { error: error.message }\n throw error\n }\n}\n\nclass FormulaCheckError extends Error {}\n\nconst numeric = (type: FormulaType) => type !== \"text\"\n\nfunction typeOf(\n node: FormulaNode,\n columns: ReadonlyMap<string, FormulaType>,\n inAggregate: boolean\n): FormulaType {\n switch (node.kind) {\n case \"number\":\n return \"number\"\n case \"text\":\n return \"text\"\n case \"boolean\":\n return \"boolean\"\n case \"ref\":\n case \"columnRef\": {\n const type = columns.get(node.column)\n if (type === undefined) {\n throw new FormulaCheckError(\n `it reads column '${node.column}', which the sheet does not have`\n )\n }\n if (node.kind === \"columnRef\" && !inAggregate) {\n throw new FormulaCheckError(\n `[${node.column}] is the whole column, which only ${[...AGGREGATE_FUNCTIONS].join(\", \")} take; this row's value is [@${node.column}]`\n )\n }\n return type\n }\n case \"unary\": {\n const type = typeOf(node.operand, columns, false)\n if (!numeric(type)) throw new FormulaCheckError(`'${node.op}' needs a number, not text`)\n return \"number\"\n }\n case \"binary\": {\n const left = typeOf(node.left, columns, false)\n const right = typeOf(node.right, columns, false)\n switch (node.op) {\n case \"&\":\n return \"text\"\n case \"=\":\n case \"<>\":\n case \"<\":\n case \"<=\":\n case \">\":\n case \">=\":\n return \"boolean\"\n default: {\n if (!numeric(left) || !numeric(right)) {\n throw new FormulaCheckError(`'${node.op}' needs numbers on both sides, not text`)\n }\n // A date and a number of days make a date; two dates make the days between them.\n if (node.op === \"+\" && (left === \"date\") !== (right === \"date\")) return \"date\"\n if (node.op === \"-\" && left === \"date\" && right !== \"date\") return \"date\"\n return \"number\"\n }\n }\n }\n case \"call\": {\n const shape = FORMULA_FUNCTIONS[node.name]\n if (!shape) {\n throw new FormulaCheckError(\n `${node.name} is not a function a sheet computes; use one of ${Object.keys(FORMULA_FUNCTIONS).join(\", \")}`\n )\n }\n if (node.args.length < shape.min || node.args.length > shape.max) {\n const count =\n shape.min === shape.max\n ? `${shape.min}`\n : shape.max === 30\n ? `at least ${shape.min}`\n : `${shape.min} or ${shape.max}`\n throw new FormulaCheckError(\n `${node.name} takes ${count} ${shape.max === 1 ? \"argument\" : \"arguments\"}, not ${node.args.length}`\n )\n }\n const aggregate = AGGREGATE_FUNCTIONS.has(node.name)\n const args = node.args.map((arg) => typeOf(arg, columns, aggregate))\n switch (node.name) {\n case \"IF\": {\n const [, then = \"boolean\", otherwise = \"boolean\"] = args\n return then === otherwise ? then : \"any\"\n }\n case \"IFERROR\": {\n const [value = \"any\", fallback = \"any\"] = args\n return value === fallback ? value : \"any\"\n }\n case \"AND\":\n case \"OR\":\n case \"NOT\":\n case \"ISBLANK\":\n return \"boolean\"\n case \"LOWER\":\n case \"UPPER\":\n case \"CONCAT\":\n return \"text\"\n default:\n for (const [index, type] of args.entries()) {\n if (node.name !== \"LEN\" && !aggregate && !numeric(type)) {\n throw new FormulaCheckError(\n `${node.name}'s argument ${index + 1} needs a number, not text`\n )\n }\n }\n return \"number\"\n }\n }\n }\n}\n",
15
+ "import { AGGREGATE_FUNCTIONS } from \"./check\"\nimport type { FormulaNode } from \"./parser\"\n\n/** What a cell computes to when it can't: a division by zero, or a value of the wrong kind. */\nexport const FORMULA_ERRORS = [\"#DIV/0!\", \"#VALUE!\"] as const\nexport type FormulaErrorCode = (typeof FORMULA_ERRORS)[number]\n\n/**\n * A value as a formula sees it: a number (a date is its day count, as in Excel), text, a boolean,\n * a blank, or an error that passes through everything but IFERROR.\n */\nexport type FormulaValue = number | string | boolean | null | { readonly error: FormulaErrorCode }\n\n/** The values a formula reads: this row's in a column, or a whole column's. */\nexport interface FormulaScope {\n readonly cell: (column: string) => FormulaValue\n readonly column: (column: string) => readonly FormulaValue[]\n}\n\nconst isError = (value: FormulaValue): value is { readonly error: FormulaErrorCode } =>\n typeof value === \"object\" && value !== null\nconst fault = (error: FormulaErrorCode) => ({ error }) as const\n\n/**\n * Evaluates a formula for one row, with Excel's rules: a blank reads as 0 in arithmetic and as\n * empty text in `&`; booleans count as 1 and 0; text that reads as a number is one; text compares\n * without regard to case, and number < text < boolean across kinds. An aggregate over whole\n * columns is the same for every row, so `memo` keeps it once computed.\n */\nexport function evaluateFormula(\n node: FormulaNode,\n scope: FormulaScope,\n memo: Map<FormulaNode, FormulaValue> = new Map()\n): FormulaValue {\n const value = (current: FormulaNode): FormulaValue => {\n switch (current.kind) {\n case \"number\":\n case \"text\":\n case \"boolean\":\n return current.value\n case \"ref\":\n return scope.cell(current.column)\n case \"columnRef\":\n // The checker allows a whole column only inside an aggregate, which reads it itself.\n return fault(\"#VALUE!\")\n case \"unary\": {\n const operand = number(value(current.operand))\n if (isError(operand)) return operand\n return current.op === \"-\" ? -operand : operand\n }\n case \"binary\":\n return binary(current.op, value(current.left), value(current.right))\n case \"call\": {\n const constant = AGGREGATE_FUNCTIONS.has(current.name) && current.args.every(isConstant)\n if (constant && memo.has(current)) return memo.get(current) as FormulaValue\n const result = call(current.name, current.args, value, scope)\n if (constant) memo.set(current, result)\n return result\n }\n }\n }\n return value(node)\n}\n\n/** A literal, or a whole column: the same in every row. */\nfunction isConstant(node: FormulaNode): boolean {\n return node.kind === \"columnRef\" || node.kind === \"number\" || node.kind === \"text\"\n}\n\nfunction number(value: FormulaValue): number | { readonly error: FormulaErrorCode } {\n if (isError(value)) return value\n if (value === null) return 0\n if (typeof value === \"boolean\") return value ? 1 : 0\n if (typeof value === \"number\") return value\n const trimmed = value.trim()\n const parsed = trimmed ? Number(trimmed) : Number.NaN\n return /^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(trimmed) && Number.isFinite(parsed)\n ? parsed\n : fault(\"#VALUE!\")\n}\n\n/** A value as text: a number as Excel's General format writes it, a boolean as TRUE or FALSE. */\nexport function formulaText(value: Exclude<FormulaValue, { error: unknown }>): string {\n if (value === null) return \"\"\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\"\n if (typeof value === \"number\") return String(Number(value.toPrecision(15)))\n return value\n}\n\nfunction truth(value: FormulaValue): boolean | { readonly error: FormulaErrorCode } {\n if (isError(value)) return value\n if (value === null) return false\n if (typeof value === \"boolean\") return value\n if (typeof value === \"number\") return value !== 0\n const word = value.trim().toUpperCase()\n return word === \"TRUE\" ? true : word === \"FALSE\" ? false : fault(\"#VALUE!\")\n}\n\nconst finite = (result: number) => (Number.isFinite(result) ? result : fault(\"#VALUE!\"))\n\nfunction binary(\n op: Extract<FormulaNode, { kind: \"binary\" }>[\"op\"],\n left: FormulaValue,\n right: FormulaValue\n): FormulaValue {\n if (isError(left)) return left\n if (isError(right)) return right\n if (op === \"&\") return formulaText(left) + formulaText(right)\n if (op === \"=\" || op === \"<>\" || op === \"<\" || op === \"<=\" || op === \">\" || op === \">=\") {\n const order = compare(left, right)\n return {\n \"=\": order === 0,\n \"<>\": order !== 0,\n \"<\": order < 0,\n \"<=\": order <= 0,\n \">\": order > 0,\n \">=\": order >= 0,\n }[op]\n }\n const a = number(left)\n const b = number(right)\n if (isError(a)) return a\n if (isError(b)) return b\n switch (op) {\n case \"+\":\n return finite(a + b)\n case \"-\":\n return finite(a - b)\n case \"*\":\n return finite(a * b)\n case \"/\":\n return b === 0 ? fault(\"#DIV/0!\") : finite(a / b)\n case \"^\":\n return a === 0 && b < 0 ? fault(\"#DIV/0!\") : finite(a ** b)\n }\n}\n\n/** Excel's order: a blank takes the other side's kind, then number < text < boolean. */\nfunction compare(\n left: Exclude<FormulaValue, { error: unknown }>,\n right: Exclude<FormulaValue, { error: unknown }>\n): number {\n const blank = (other: typeof left) =>\n typeof other === \"number\" ? 0 : typeof other === \"boolean\" ? false : \"\"\n const a = left === null ? blank(right) : left\n const b = right === null ? blank(left) : right\n const rank = (value: typeof a) =>\n typeof value === \"number\" ? 0 : typeof value === \"string\" ? 1 : 2\n if (rank(a) !== rank(b)) return rank(a) - rank(b)\n if (typeof a === \"string\" && typeof b === \"string\") {\n const x = a.toLowerCase()\n const y = b.toLowerCase()\n return x < y ? -1 : x > y ? 1 : 0\n }\n return Number(a) - Number(b)\n}\n\n/** Days from Excel's day zero, 1899-12-30, to 1970-01-01. */\nconst EPOCH_SERIAL = 25569\nconst DAY_MS = 86_400_000\n\n/** A date as Excel's day count. */\nexport function dateSerial(date: Date): number {\n return date.getTime() / DAY_MS + EPOCH_SERIAL\n}\n\n/** A day count as the date it is: `2026-09-30`, or with its time when it has one. */\nexport function serialDate(serial: number): string {\n const date = new Date(Math.round((serial - EPOCH_SERIAL) * DAY_MS))\n const iso = date.toISOString()\n return Number.isInteger(serial) ? iso.slice(0, 10) : `${iso.slice(0, 19)}Z`\n}\n\nfunction call(\n name: string,\n args: readonly FormulaNode[],\n value: (node: FormulaNode) => FormulaValue,\n scope: FormulaScope\n): FormulaValue {\n const at = (index: number) => value(args[index] as FormulaNode)\n switch (name) {\n case \"IF\": {\n const condition = truth(at(0))\n if (isError(condition)) return condition\n if (condition) return at(1)\n return args.length > 2 ? at(2) : false\n }\n case \"IFERROR\": {\n const result = at(0)\n return isError(result) ? at(1) : result\n }\n case \"AND\":\n case \"OR\": {\n const values = args.map((_, index) => at(index)).filter((entry) => entry !== null)\n if (values.length === 0) return fault(\"#VALUE!\")\n let result = name === \"AND\"\n for (const entry of values) {\n const flag = truth(entry)\n if (isError(flag)) return flag\n result = name === \"AND\" ? result && flag : result || flag\n }\n return result\n }\n case \"NOT\": {\n const flag = truth(at(0))\n return isError(flag) ? flag : !flag\n }\n case \"ISBLANK\":\n return at(0) === null\n case \"ROUND\": {\n const x = number(at(0))\n const digits = number(at(1))\n if (isError(x)) return x\n if (isError(digits)) return digits\n // Half away from zero, as Excel rounds, past the float error of the scaled value.\n const scale = 10 ** Math.trunc(digits)\n return (Math.sign(x) * Math.round(Number((Math.abs(x) * scale).toPrecision(15)))) / scale\n }\n case \"ABS\": {\n const x = number(at(0))\n return isError(x) ? x : Math.abs(x)\n }\n case \"LEN\":\n case \"LOWER\":\n case \"UPPER\": {\n const text = at(0)\n if (isError(text)) return text\n const written = formulaText(text)\n return name === \"LEN\"\n ? written.length\n : name === \"LOWER\"\n ? written.toLowerCase()\n : written.toUpperCase()\n }\n case \"CONCAT\": {\n let text = \"\"\n for (const index of args.keys()) {\n const part = at(index)\n if (isError(part)) return part\n text += formulaText(part)\n }\n return text\n }\n case \"YEAR\":\n case \"MONTH\": {\n const serial = number(at(0))\n if (isError(serial)) return serial\n if (serial < 0) return fault(\"#VALUE!\")\n const date = new Date((Math.floor(serial) - EPOCH_SERIAL) * DAY_MS)\n return name === \"YEAR\" ? date.getUTCFullYear() : date.getUTCMonth() + 1\n }\n case \"DAYS\": {\n const end = number(at(0))\n const start = number(at(1))\n if (isError(end)) return end\n if (isError(start)) return start\n return Math.floor(end) - Math.floor(start)\n }\n default: {\n // SUM, AVERAGE, MIN, MAX, COUNT: the numbers among their arguments, whole columns included;\n // text, booleans, and blanks are passed over, as a range's are in Excel.\n const numbers: number[] = []\n for (const [index, arg] of args.entries()) {\n const values = arg.kind === \"columnRef\" ? scope.column(arg.column) : [at(index)]\n for (const entry of values) {\n if (isError(entry)) return entry\n if (typeof entry === \"number\") numbers.push(entry)\n }\n }\n switch (name) {\n case \"COUNT\":\n return numbers.length\n case \"SUM\":\n return numbers.reduce((sum, entry) => sum + entry, 0)\n case \"AVERAGE\":\n return numbers.length === 0\n ? fault(\"#DIV/0!\")\n : numbers.reduce((sum, entry) => sum + entry, 0) / numbers.length\n case \"MIN\":\n return numbers.length === 0 ? 0 : numbers.reduce((min, entry) => Math.min(min, entry))\n case \"MAX\":\n return numbers.length === 0 ? 0 : numbers.reduce((max, entry) => Math.max(max, entry))\n default:\n return fault(\"#VALUE!\")\n }\n }\n }\n}\n",
16
+ "import type { CsvTable } from \"../csv\"\nimport {\n NUMERIC_COLUMN_TYPES,\n parseSheetDate,\n parseSheetNumber,\n type SheetColumnType,\n type WorkbookSheet,\n} from \"../workbook\"\nimport type { FormulaType } from \"./check\"\nimport {\n dateSerial,\n evaluateFormula,\n type FormulaErrorCode,\n type FormulaValue,\n formulaText,\n serialDate,\n} from \"./evaluate\"\nimport { type FormulaNode, formulaDependencies, parseFormula } from \"./parser\"\n\nexport {\n AGGREGATE_FUNCTIONS,\n checkFormula,\n FORMULA_FUNCTIONS,\n type FormulaType,\n} from \"./check\"\nexport {\n FORMULA_ERRORS,\n type FormulaErrorCode,\n type FormulaValue,\n} from \"./evaluate\"\nexport {\n type FormulaNode,\n type FormulaOperator,\n FormulaSyntaxError,\n formulaDependencies,\n formulaReferences,\n parseFormula,\n renameColumnReferences,\n} from \"./parser\"\n\n/** What a column's values are, as a formula reads them. */\nexport function columnFormulaType(type: SheetColumnType): FormulaType {\n if (NUMERIC_COLUMN_TYPES.includes(type)) return \"number\"\n if (type === \"date\" || type === \"boolean\") return type\n return \"text\"\n}\n\n/**\n * Whether what a formula yields can fill a column of a type: numbers in a number, currency, or\n * percent column, dates in a date column, booleans in a boolean one, anything in text or a tag.\n * A value whose kind depends on the row fits anywhere, and is `#VALUE!` where it doesn't.\n */\nexport function formulaFitsColumn(result: FormulaType, type: SheetColumnType): boolean {\n if (result === \"any\" || type === \"text\" || type === \"tag\") return true\n if (NUMERIC_COLUMN_TYPES.includes(type)) return result === \"number\"\n if (type === \"date\") return result === \"date\"\n if (type === \"boolean\") return result === \"boolean\"\n return false\n}\n\n/** Computed columns that read each other in a ring, so none can be computed first. */\nexport class FormulaCycleError extends Error {\n constructor(readonly columns: readonly string[]) {\n super(`columns ${columns.map((column) => `'${column}'`).join(\" → \")} compute from each other`)\n this.name = \"FormulaCycleError\"\n }\n}\n\n/** Where a computed column computes to an error: how many rows, and the first. */\nexport interface ComputedColumnErrors {\n readonly count: number\n /** The first row, as the data row's index from 0. */\n readonly firstRow: number\n readonly code: FormulaErrorCode\n}\n\n/**\n * A sheet's table with its computed columns filled in, each in an order that computes what it\n * reads first, its values written as the column's type stores them. Throws a\n * {@link FormulaCycleError} for columns that read each other; publishing has refused those, and\n * every formula that doesn't parse or check.\n */\nexport function evaluateComputedColumns(\n sheet: Pick<WorkbookSheet, \"columns\">,\n table: CsvTable\n): { readonly table: CsvTable; readonly errors: ReadonlyMap<string, ComputedColumnErrors> } {\n const computed = table.header.filter((name) => sheet.columns[name]?.formula !== undefined)\n if (computed.length === 0) return { table, errors: new Map() }\n const formulas = new Map(\n computed.map((name) => [name, parseFormula(sheet.columns[name]?.formula ?? \"\")])\n )\n const indexOf = new Map(table.header.map((name, index) => [name, index]))\n const typeOf = (name: string) => sheet.columns[name]?.type ?? \"text\"\n\n // Each column's values as a formula reads them, read once and filled as columns compute.\n const values = new Map<string, FormulaValue[]>()\n const columnValues = (name: string): FormulaValue[] => {\n let column = values.get(name)\n if (!column) {\n const index = indexOf.get(name) ?? -1\n const type = typeOf(name)\n column = table.rows.map((row) => readCell(row[index] ?? \"\", type))\n values.set(name, column)\n }\n return column\n }\n\n const rows = table.rows.map((row) => {\n const copy = [...row]\n while (copy.length < table.header.length) copy.push(\"\")\n return copy\n })\n const errors = new Map<string, ComputedColumnErrors>()\n for (const name of computeOrder(formulas)) {\n const formula = formulas.get(name) as FormulaNode\n const index = indexOf.get(name) as number\n const type = typeOf(name)\n const results: FormulaValue[] = []\n const memo = new Map<FormulaNode, FormulaValue>()\n for (const [rowIndex, row] of rows.entries()) {\n const result = evaluateFormula(\n formula,\n {\n cell: (column) => columnValues(column)[rowIndex] ?? null,\n column: (column) => columnValues(column),\n },\n memo\n )\n const cell = writeCell(result, type)\n results.push(typeof cell === \"object\" ? cell : result)\n row[index] = typeof cell === \"object\" ? cell.error : cell\n if (typeof cell === \"object\") {\n const known = errors.get(name)\n errors.set(name, {\n count: (known?.count ?? 0) + 1,\n firstRow: known?.firstRow ?? rowIndex,\n code: known?.code ?? cell.error,\n })\n }\n }\n values.set(name, results)\n }\n return { table: { header: table.header, rows }, errors }\n}\n\n/** The order to compute in: each column after those it reads. */\nfunction computeOrder(formulas: ReadonlyMap<string, FormulaNode>): string[] {\n const order: string[] = []\n const state = new Map<string, \"visiting\" | \"done\">()\n const visit = (name: string, path: string[]) => {\n if (state.get(name) === \"done\") return\n if (state.get(name) === \"visiting\") {\n throw new FormulaCycleError([...path.slice(path.indexOf(name)), name])\n }\n state.set(name, \"visiting\")\n for (const dependency of formulaDependencies(formulas.get(name) as FormulaNode)) {\n if (formulas.has(dependency)) visit(dependency, [...path, name])\n }\n state.set(name, \"done\")\n order.push(name)\n }\n for (const name of formulas.keys()) visit(name, [])\n return order\n}\n\n/** A stored cell as a formula reads it: a blank, its type's value, or its text as written. */\nfunction readCell(raw: string, type: SheetColumnType): FormulaValue {\n if (!raw.trim()) return null\n if (NUMERIC_COLUMN_TYPES.includes(type)) return parseSheetNumber(raw) ?? raw\n if (type === \"date\") {\n const date = parseSheetDate(raw)\n return date ? dateSerial(date) : raw\n }\n if (type === \"boolean\") {\n const word = raw.trim().toLowerCase()\n return word === \"true\" ? true : word === \"false\" ? false : raw\n }\n return raw\n}\n\n/** A computed value as its column stores it, or the error it is where it doesn't fit. */\nfunction writeCell(\n value: FormulaValue,\n type: SheetColumnType\n): string | { readonly error: FormulaErrorCode } {\n if (typeof value === \"object\" && value !== null) return value\n if (value === null) return \"\"\n if (type === \"text\" || type === \"tag\") return formulaText(value)\n if (NUMERIC_COLUMN_TYPES.includes(type)) {\n return typeof value === \"number\" ? formulaText(value) : { error: \"#VALUE!\" }\n }\n if (type === \"date\") {\n return typeof value === \"number\" ? serialDate(value) : { error: \"#VALUE!\" }\n }\n if (type === \"boolean\") {\n return typeof value === \"boolean\" ? String(value) : { error: \"#VALUE!\" }\n }\n return { error: \"#VALUE!\" }\n}\n",
17
+ "import type { CsvTable } from \"./csv\"\nimport { formulaReferences, parseFormula } from \"./formula/parser\"\nimport type { ArtifactQueryProperty, ArtifactQuerySchema } from \"./queries\"\nimport {\n NUMERIC_COLUMN_TYPES,\n readSheetColumnFormat,\n type SheetColumnFormat,\n type SheetColumnType,\n type SheetTotal,\n sheetTotalProblem,\n WORKBOOK_FILE,\n type WorkbookSheet,\n} from \"./workbook\"\n\n/**\n * A live sheet laid out against what its query's rows hold: publishing checks it as its author\n * sees the rows, and the viewer draws it as each reader does.\n */\nexport interface LiveSheetLayout {\n /**\n * The sheet with a format for every column, as a CSV sheet's workbook gives them: what the\n * publish rules, the grid and the charts read.\n */\n readonly sheet: WorkbookSheet\n /** Each column, in order, with what it shows. */\n readonly columns: readonly LiveSheetColumn[]\n /** The first column that does not lay out, in the words publishing refuses it with; or null. */\n readonly problem: string | null\n}\n\nexport interface LiveSheetColumn {\n readonly name: string\n /** The property the column shows, of the rows or of what `linkId` reaches; none when computed. */\n readonly from?: { readonly linkId?: string; readonly propertyId: string }\n /** Whether the rows hold no such property for this reader: every cell of it is locked. */\n readonly missing: boolean\n}\n\n/** What a row of a query's result holds, as core reads it and as the API serializes it. */\nexport interface LiveSheetRow {\n readonly properties: Readonly<Record<string, unknown>>\n /** The properties left out because the reader is not cleared for them. */\n readonly redactions?: Readonly<Record<string, unknown>>\n readonly links?: Readonly<Record<string, LiveSheetRow | readonly LiveSheetRow[] | null>>\n}\n\n/** A live sheet's rows as a sheet's CSV would hold them, and the cells the reader may not see. */\nexport interface LiveSheetTable {\n /** Each cell as a CSV cell holds its value, computed columns empty. */\n readonly table: CsvTable\n /**\n * By row, the columns of the cells the reader may not see: drawn locked, never as empty. A\n * computed cell that reads a locked one is locked too.\n */\n readonly locked: ReadonlyMap<number, ReadonlySet<number>>\n}\n\n/**\n * The column type a property's values take in a sheet: numbers, dates, true or false, an enum's\n * values as tags, and anything else as text. The ontology names no money or ratio, so a number is\n * a number; a column that wants a currency says so.\n */\nexport function sheetColumnType(property: ArtifactQueryProperty): SheetColumnType {\n switch (property.type) {\n case \"integer\":\n case \"double\":\n case \"decimal\":\n return \"number\"\n case \"boolean\":\n return \"boolean\"\n case \"date\":\n case \"timestamp\":\n return \"date\"\n case \"enum\":\n return property.valueType === \"integer\" ? \"number\" : \"tag\"\n default:\n return \"text\"\n }\n}\n\n/**\n * Lays a live sheet out against its query's schema: each column's property, and its type, its\n * property's unless the workbook gives one. A column whose property the schema lacks shows locked\n * cells, and `problem` names the first that does not lay out.\n */\nexport function liveSheetColumns(\n sheet: WorkbookSheet,\n schema: ArtifactQuerySchema\n): LiveSheetLayout {\n const live = sheet.live\n if (!live) throw new Error(`[Sixb] Sheet '${sheet.name}' is not a live sheet.`)\n\n let problem: string | null = null\n const formats: Record<string, SheetColumnFormat> = {}\n const totals: Record<string, SheetTotal> = { ...sheet.totals }\n\n const columns = live.columns.map((source): LiveSheetColumn => {\n const columnAt = `sheet '${sheet.name}' column '${source.name}'`\n const at = `${WORKBOOK_FILE} ${columnAt}`\n const written = sheet.columns[source.name]\n\n if (source.from === undefined) {\n if (written) formats[source.name] = written\n return { name: source.name, missing: false }\n }\n\n const [first = \"\", second] = source.from.split(\".\")\n const from =\n second === undefined ? { propertyId: first } : { linkId: first, propertyId: second }\n const found = resolveProperty(schema, live.query, from)\n if (\"problem\" in found) problem ??= `${at} \"from\": ${found.problem}`\n\n const inferred = \"property\" in found ? sheetColumnType(found.property) : undefined\n const format = layColumn(columnAt, source.from, written, source.untyped, inferred)\n if (format.problem) problem ??= format.problem\n formats[source.name] = format.format\n\n const total = totals[source.name]\n const totalProblem =\n total && source.untyped\n ? sheetTotalProblem(\n `${WORKBOOK_FILE} sheet '${sheet.name}'`,\n source.name,\n total,\n format.format.type\n )\n : null\n if (totalProblem) {\n problem ??= totalProblem\n delete totals[source.name]\n }\n\n return { name: source.name, from, missing: !(\"property\" in found) }\n })\n\n return { sheet: { ...sheet, columns: formats, totals }, columns, problem }\n}\n\nfunction resolveProperty(\n schema: ArtifactQuerySchema,\n query: string,\n from: NonNullable<LiveSheetColumn[\"from\"]>\n): { readonly property: ArtifactQueryProperty } | { readonly problem: string } {\n const { linkId, propertyId } = from\n\n if (linkId === undefined) {\n const property = schema.properties[propertyId]\n return property\n ? { property }\n : {\n problem: `query '${query}' returns no property '${propertyId}'${known(schema.properties)}.`,\n }\n }\n\n const link = schema.links[linkId]\n if (!link) {\n return {\n problem: `query '${query}' does not expand link '${linkId}': add it to the query's \"expand\" node, or show a property of the rows.`,\n }\n }\n\n const property = link.properties[propertyId]\n return property\n ? { property }\n : { problem: `link '${linkId}' reaches no property '${propertyId}'${known(link.properties)}.` }\n}\n\nfunction known(properties: Readonly<Record<string, unknown>>): string {\n const ids = Object.keys(properties)\n return ids.length > 0 ? `; it has ${ids.join(\", \")}` : \"\"\n}\n\n/** A column's format: the one the workbook gives, checked against its property, or its property's. */\nfunction layColumn(\n columnAt: string,\n from: string,\n written: SheetColumnFormat | undefined,\n untyped: Readonly<Record<string, unknown>> | undefined,\n inferred: SheetColumnType | undefined\n): { readonly format: SheetColumnFormat; readonly problem?: string } {\n if (written) {\n if (inferred === undefined || fits(written.type, inferred)) return { format: written }\n return {\n format: written,\n problem: `${WORKBOOK_FILE} ${columnAt} is ${written.type}, but '${from}' holds ${HOLDS[inferred]}: leave out \"type\" to show it as its property is, or show another property.`,\n }\n }\n\n const type = inferred ?? \"text\"\n const read = readSheetColumnFormat(untyped ?? {}, columnAt, type)\n return \"format\" in read ? read : { format: { type }, problem: read.error }\n}\n\nconst HOLDS: Readonly<Record<SheetColumnType, string>> = {\n text: \"text\",\n tag: \"text\",\n number: \"numbers\",\n currency: \"numbers\",\n percent: \"numbers\",\n date: \"dates\",\n boolean: \"true or false\",\n link: \"text\",\n image: \"text\",\n}\n\n/** Whether a column of `type` reads every value of a property whose own type is `inferred`. */\nfunction fits(type: SheetColumnType, inferred: SheetColumnType): boolean {\n if (NUMERIC_COLUMN_TYPES.includes(type)) return inferred === \"number\"\n if (type === \"date\" || type === \"boolean\") return inferred === type\n return true\n}\n\n/**\n * A query's rows as a live sheet shows them: each column's value written as a CSV cell holds it,\n * so the grid, the charts and the downloads read them as they read a CSV sheet's. A value the\n * reader is not cleared for is a locked cell, as is every cell of a column the reader's rows do\n * not hold.\n */\nexport function liveSheetTable(\n layout: LiveSheetLayout,\n rows: readonly LiveSheetRow[]\n): LiveSheetTable {\n const { columns } = layout\n const locked = new Map<number, Set<number>>()\n const lock = (row: number, column: number) => {\n const cells = locked.get(row) ?? new Set<number>()\n cells.add(column)\n locked.set(row, cells)\n }\n\n const tableRows = rows.map((row, rowIndex) =>\n columns.map((column, columnIndex) => {\n if (!column.from) return \"\"\n if (column.missing) {\n lock(rowIndex, columnIndex)\n return \"\"\n }\n\n const cell = readCell(row, column.from)\n if (cell.locked) lock(rowIndex, columnIndex)\n return cell.locked ? \"\" : cell.text\n })\n )\n\n lockComputed(layout, rows.length, locked)\n return { table: { header: columns.map((column) => column.name), rows: tableRows }, locked }\n}\n\nfunction readCell(\n row: LiveSheetRow,\n from: NonNullable<LiveSheetColumn[\"from\"]>\n): { readonly text: string; readonly locked: boolean } {\n const { linkId, propertyId } = from\n if (linkId === undefined) return propertyCell(row, propertyId)\n\n const linked = row.links?.[linkId]\n if (!linked) return { text: \"\", locked: false }\n if (!isRowList(linked)) return propertyCell(linked, propertyId)\n\n // A link that reaches several objects shows each one's value; one the reader may not see locks it.\n const values = linked.map((each) => propertyCell(each, propertyId))\n return {\n text: values\n .map((value) => value.text)\n .filter(Boolean)\n .join(\", \"),\n locked: values.some((value) => value.locked),\n }\n}\n\nfunction isRowList(\n value: LiveSheetRow | readonly LiveSheetRow[]\n): value is readonly LiveSheetRow[] {\n return Array.isArray(value)\n}\n\nfunction propertyCell(row: LiveSheetRow, propertyId: string) {\n if (row.redactions && Object.hasOwn(row.redactions, propertyId)) {\n return { text: \"\", locked: true }\n }\n return { text: cellText(row.properties[propertyId]), locked: false }\n}\n\n/** A value as a CSV cell holds it, which `parseSheetNumber` and `parseSheetDate` read back. */\nfunction cellText(value: unknown): string {\n if (value === null || value === undefined) return \"\"\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value)\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\"\n if (value instanceof Date) return value.toISOString()\n if (Array.isArray(value)) return value.map(cellText).filter(Boolean).join(\", \")\n return JSON.stringify(value)\n}\n\n/**\n * Locks each computed cell that reads a locked one, through as many computed columns as read each\n * other: a formula over a value the reader may not see would show what it computes without it. A\n * formula that reads a column whole, as `SUM([Amount])` does, reads every row's value: one locked\n * cell in that column locks it on every row.\n */\nfunction lockComputed(\n layout: LiveSheetLayout,\n rowCount: number,\n locked: Map<number, Set<number>>\n): void {\n const indexOf = new Map(layout.columns.map((column, index) => [column.name, index]))\n const indexes = (names: ReadonlySet<string>) =>\n [...names].map((name) => indexOf.get(name)).filter((read) => read !== undefined)\n\n const computed = layout.columns.flatMap((column, index) => {\n const formula = column.from ? undefined : layout.sheet.columns[column.name]?.formula\n if (!formula) return []\n\n const { row, whole } = formulaReferences(parseFormula(formula))\n return [{ index, row: indexes(row), whole: indexes(whole) }]\n })\n if (computed.length === 0) return\n\n for (let changed = true; changed; ) {\n changed = false\n\n const anywhere = new Set<number>()\n for (const cells of locked.values()) for (const column of cells) anywhere.add(column)\n\n for (const { index, whole } of computed) {\n if (!whole.some((read) => anywhere.has(read))) continue\n\n for (let row = 0; row < rowCount; row += 1) {\n const cells = locked.get(row) ?? new Set<number>()\n if (cells.has(index)) continue\n cells.add(index)\n locked.set(row, cells)\n changed = true\n }\n }\n\n for (const cells of locked.values()) {\n for (const { index, row } of computed) {\n if (cells.has(index) || !row.some((read) => cells.has(read))) continue\n cells.add(index)\n changed = true\n }\n }\n }\n}\n",
18
+ "import type { CsvTable } from \"./csv\"\nimport {\n checkFormula,\n columnFormulaType,\n evaluateComputedColumns,\n FormulaCycleError,\n FormulaSyntaxError,\n formulaFitsColumn,\n parseFormula,\n} from \"./formula\"\nimport { ARTIFACT_LIMITS } from \"./limits\"\nimport {\n NUMERIC_COLUMN_TYPES,\n sheetFilePath,\n WORKBOOK_FILE,\n type Workbook,\n type WorkbookSheet,\n} from \"./workbook\"\n\n/**\n * Whether a sheet's workbook and tables keep the rules publishing holds them to, whatever their\n * cells hold: columns named once, every column the workbook names in its table, formulas that\n * compute their columns, and charts that plot what they can draw. Returns the first rule broken,\n * in the words publishing refuses the version with, or null. A sheet without a table here is not\n * checked, nor a chart on it, so an editor can check only the sheet it changed.\n */\nexport function checkSheet(\n workbook: Workbook,\n tables: ReadonlyMap<string, CsvTable>\n): string | null {\n for (const sheet of workbook.sheets) {\n const table = tables.get(sheet.name)\n if (!table) continue\n\n const problem = sheetColumnsProblem(sheet, table) ?? sheetFormulasProblem(sheet, table)\n if (problem) return problem\n }\n\n return sheetChartsProblem(workbook, tables)\n}\n\n/**\n * A table's header and size against its sheet: named, unique, and holding what the sheet names. A\n * live sheet's header is the columns its workbook lists.\n */\nexport function sheetColumnsProblem(sheet: WorkbookSheet, table: CsvTable): string | null {\n const path = sheetFilePath(sheet.name)\n const source = sheet.live ? `${WORKBOOK_FILE} sheet '${sheet.name}' \"columns\"` : `'${path}'`\n const { header, rows } = table\n\n if (header.length === 0) return `'${path}' is empty: its first line names the columns.`\n if (header.length > ARTIFACT_LIMITS.maxSheetColumns) {\n return `${source} has ${header.length} columns; a sheet holds at most ${ARTIFACT_LIMITS.maxSheetColumns}.`\n }\n\n const seen = new Set<string>()\n for (const [index, name] of header.entries()) {\n if (!name.trim())\n return `${source} column ${index + 1} has no name${sheet.live ? \"\" : \" in the header row\"}.`\n if (seen.has(name)) return `${source} has two columns named '${name}'.`\n seen.add(name)\n }\n\n if (rows.length > ARTIFACT_LIMITS.maxSheetRows) {\n return `'${path}' has ${rows.length} rows; a sheet holds at most ${ARTIFACT_LIMITS.maxSheetRows}.`\n }\n for (const [index, row] of rows.entries()) {\n if (row.length > header.length) {\n return `'${path}' row ${index + 2} has ${row.length} fields; the header names ${header.length} columns.`\n }\n }\n\n for (const column of [\n ...Object.keys(sheet.columns),\n ...Object.keys(sheet.widths),\n ...Object.keys(sheet.descriptions),\n ...Object.keys(sheet.totals),\n ]) {\n if (!seen.has(column)) {\n return `${WORKBOOK_FILE} sheet '${sheet.name}' names column '${column}', which ${sheet.live ? 'its \"columns\" does not list' : `'${path}' does not have`}.`\n }\n }\n\n return null\n}\n\n/**\n * Each computed column's formula against the columns it reads: it reads, its result fits the\n * column, and no columns compute from each other.\n */\nexport function sheetFormulasProblem(sheet: WorkbookSheet, table: CsvTable): string | null {\n const at = (column: string) => `${WORKBOOK_FILE} sheet '${sheet.name}' column '${column}'`\n const types = new Map(\n table.header.map((name) => [name, columnFormulaType(sheet.columns[name]?.type ?? \"text\")])\n )\n\n for (const [column, format] of Object.entries(sheet.columns)) {\n if (!format.formula) continue\n\n let node: ReturnType<typeof parseFormula>\n try {\n node = parseFormula(format.formula)\n } catch (error) {\n if (error instanceof FormulaSyntaxError) {\n return `${at(column)} \"formula\" does not read: ${error.message}`\n }\n throw error\n }\n\n const checked = checkFormula(node, types)\n if (\"error\" in checked) return `${at(column)} \"formula\": ${checked.error}.`\n if (!formulaFitsColumn(checked.type, format.type)) {\n return `${at(column)} \"formula\" computes ${checked.type === \"date\" ? \"a date\" : checked.type === \"boolean\" ? \"true or false\" : checked.type === \"text\" ? \"text\" : \"a number\"}, which a ${format.type} column can't show: change its type, or the formula.`\n }\n }\n\n // Over no rows, the columns only find the order they compute in: a ring of them throws.\n try {\n evaluateComputedColumns(sheet, { header: table.header, rows: [] })\n } catch (error) {\n if (error instanceof FormulaCycleError) {\n return `${WORKBOOK_FILE} sheet '${sheet.name}': ${error.message}, so none can be computed first.`\n }\n throw error\n }\n\n return null\n}\n\n/**\n * Each chart against its sheet: the columns it plots exist and are numbers, its right axis reads\n * one kind, and a pie has few enough slices to tell apart.\n */\nexport function sheetChartsProblem(\n workbook: Workbook,\n tables: ReadonlyMap<string, CsvTable>\n): string | null {\n for (const chart of workbook.charts) {\n const sheet = workbook.sheets.find((candidate) => candidate.name === chart.sheet)\n const table = tables.get(chart.sheet)\n if (!sheet || !table) continue\n\n const plotted = [...chart.y, ...chart.line]\n for (const column of [chart.x, ...plotted]) {\n if (!table.header.includes(column)) {\n return `${WORKBOOK_FILE} chart '${chart.name}' plots column '${column}', which sheet '${chart.sheet}' does not have.`\n }\n }\n\n // A scatter places each row by its x, so x is a number too.\n for (const column of chart.type === \"scatter\" ? [chart.x, ...plotted] : plotted) {\n const type = sheet.columns[column]?.type ?? \"text\"\n if (!NUMERIC_COLUMN_TYPES.includes(type)) {\n return `${WORKBOOK_FILE} chart '${chart.name}' plots column '${column}', which is ${type}; give it a number, currency, or percent type in \"columns\".`\n }\n }\n\n // Lines of another kind than the bars read on one right axis, which reads one kind.\n const barType = sheet.columns[chart.y[0] ?? \"\"]?.type\n const rightTypes = new Set(\n chart.line.map((column) => sheet.columns[column]?.type).filter((type) => type !== barType)\n )\n if (rightTypes.size > 1) {\n return `${WORKBOOK_FILE} chart '${chart.name}' draws lines of ${[...rightTypes].join(\" and \")} over ${barType ?? \"its\"} bars; the right axis reads one kind. Chart the others separately.`\n }\n\n if (chart.type === \"pie\") {\n // A pie's slices are its rows, or its x values when it summarizes them.\n const index = table.header.indexOf(chart.x)\n const slices = chart.aggregate\n ? new Set(table.rows.map((row) => (row[index] ?? \"\").trim())).size\n : table.rows.length\n if (slices > ARTIFACT_LIMITS.maxPieSlices) {\n return `${WORKBOOK_FILE} chart '${chart.name}' is a pie with ${slices} slices; a pie reads well with at most ${ARTIFACT_LIMITS.maxPieSlices}. Use a bar chart instead.`\n }\n }\n }\n\n return null\n}\n"
19
+ ],
20
+ "mappings": "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",
21
+ "debugId": "B716461C2DF6F0DA64756E2164756E21",
22
+ "names": []
23
+ }
@@ -30,6 +30,68 @@ function canonicalMediaType2(value) {
30
30
  }
31
31
  return canonical;
32
32
  }
33
+ function sniffFileMediaType2(bytes) {
34
+ if (startsWith(bytes, [137, 80, 78, 71, 13, 10, 26, 10]))
35
+ return "image/png";
36
+ if (startsWith(bytes, [255, 216, 255]))
37
+ return "image/jpeg";
38
+ if (asciiAt(bytes, 0, "GIF87a") || asciiAt(bytes, 0, "GIF89a"))
39
+ return "image/gif";
40
+ if (asciiAt(bytes, 0, "RIFF") && asciiAt(bytes, 8, "WEBP"))
41
+ return "image/webp";
42
+ if (asciiAt(bytes, 0, "%PDF-"))
43
+ return "application/pdf";
44
+ return;
45
+ }
46
+ function inferFileMediaType2(fileName, bytes) {
47
+ const sniffed = bytes === undefined ? undefined : sniffFileMediaType2(bytes);
48
+ if (sniffed)
49
+ return sniffed;
50
+ const dot = fileName.lastIndexOf(".");
51
+ const extension = dot < 0 ? "" : fileName.slice(dot).toLowerCase();
52
+ return EXTENSION_MEDIA_TYPES[extension] ?? "application/octet-stream";
53
+ }
54
+ var EXTENSION_MEDIA_TYPES = {
55
+ ".bmp": "image/bmp",
56
+ ".css": "text/css",
57
+ ".csv": "text/csv",
58
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
59
+ ".gif": "image/gif",
60
+ ".htm": "text/html",
61
+ ".html": "text/html",
62
+ ".jpeg": "image/jpeg",
63
+ ".jpg": "image/jpeg",
64
+ ".js": "application/javascript",
65
+ ".json": "application/json",
66
+ ".jsonl": "application/x-ndjson",
67
+ ".markdown": "text/markdown",
68
+ ".md": "text/markdown",
69
+ ".mjs": "application/javascript",
70
+ ".pdf": "application/pdf",
71
+ ".png": "image/png",
72
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
73
+ ".svg": "image/svg+xml",
74
+ ".tsv": "text/tab-separated-values",
75
+ ".txt": "text/plain",
76
+ ".webp": "image/webp",
77
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
78
+ ".xml": "application/xml",
79
+ ".yaml": "application/yaml",
80
+ ".yml": "application/yaml",
81
+ ".zip": "application/zip"
82
+ };
83
+ function startsWith(bytes, signature) {
84
+ return signature.every((byte, index) => bytes[index] === byte);
85
+ }
86
+ function asciiAt(bytes, offset, value) {
87
+ if (bytes.byteLength < offset + value.length)
88
+ return false;
89
+ for (let index = 0;index < value.length; index += 1) {
90
+ if (bytes[offset + index] !== value.charCodeAt(index))
91
+ return false;
92
+ }
93
+ return true;
94
+ }
33
95
 
34
96
  // src/blob-storage/validation.ts
35
97
  function isBlobDigest2(value) {
@@ -50,6 +112,6 @@ function supportsRangeRead2(storage) {
50
112
  return typeof candidate.openRange === "function";
51
113
  }
52
114
 
53
- export { blobDigestHex2, blobIdFromDigest2, canonicalMediaType2, isBlobDigest2, isFileRef2, isValidFileRef, supportsDirectUpload2, supportsRangeRead2 };
115
+ export { blobDigestHex2, blobIdFromDigest2, canonicalMediaType2, sniffFileMediaType2, inferFileMediaType2, isBlobDigest2, isFileRef2, isValidFileRef, supportsDirectUpload2, supportsRangeRead2 };
54
116
 
55
- //# debugId=91CB77087AB7E2E164756E2164756E21
117
+ //# debugId=04A3170175DBD12C64756E2164756E21