@elaraai/e3-ui 1.0.97 → 1.0.98

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 (304) hide show
  1. package/dist/src/allocation/index.d.ts +258 -7
  2. package/dist/src/allocation/index.d.ts.map +1 -1
  3. package/dist/src/allocation/index.js +30 -1
  4. package/dist/src/allocation/index.js.map +1 -1
  5. package/dist/src/allocation/types.d.ts +41 -0
  6. package/dist/src/allocation/types.d.ts.map +1 -1
  7. package/dist/src/allocation/types.js +35 -0
  8. package/dist/src/allocation/types.js.map +1 -1
  9. package/dist/src/bind/data-indexed.d.ts +31 -4
  10. package/dist/src/bind/data-indexed.d.ts.map +1 -1
  11. package/dist/src/bind/data-indexed.js +54 -10
  12. package/dist/src/bind/data-indexed.js.map +1 -1
  13. package/dist/src/calendar/index.d.ts +540 -14
  14. package/dist/src/calendar/index.d.ts.map +1 -1
  15. package/dist/src/calendar/index.js +43 -7
  16. package/dist/src/calendar/index.js.map +1 -1
  17. package/dist/src/calendar/paged.d.ts +89 -0
  18. package/dist/src/calendar/paged.d.ts.map +1 -0
  19. package/dist/src/calendar/paged.js +148 -0
  20. package/dist/src/calendar/paged.js.map +1 -0
  21. package/dist/src/flowchart/payload.d.ts +156 -0
  22. package/dist/src/flowchart/payload.d.ts.map +1 -1
  23. package/dist/src/flowchart/window.d.ts +12 -0
  24. package/dist/src/flowchart/window.d.ts.map +1 -1
  25. package/dist/src/index.d.ts +11 -2
  26. package/dist/src/index.d.ts.map +1 -1
  27. package/dist/src/index.js +19 -0
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/internal.d.ts +11 -5
  30. package/dist/src/internal.d.ts.map +1 -1
  31. package/dist/src/internal.js +28 -7
  32. package/dist/src/internal.js.map +1 -1
  33. package/dist/src/plan/builders.d.ts +12 -8
  34. package/dist/src/plan/builders.d.ts.map +1 -1
  35. package/dist/src/plan/builders.js +12 -8
  36. package/dist/src/plan/builders.js.map +1 -1
  37. package/dist/src/plan/event-rows.d.ts +228 -156
  38. package/dist/src/plan/event-rows.d.ts.map +1 -1
  39. package/dist/src/plan/event-rows.js +239 -54
  40. package/dist/src/plan/event-rows.js.map +1 -1
  41. package/dist/src/plan/index.d.ts +5 -0
  42. package/dist/src/plan/index.d.ts.map +1 -1
  43. package/dist/src/plan/index.js +3 -0
  44. package/dist/src/plan/index.js.map +1 -1
  45. package/dist/src/plan/ir.d.ts +70 -0
  46. package/dist/src/plan/ir.d.ts.map +1 -1
  47. package/dist/src/plan/ordered-source.d.ts +2038 -1
  48. package/dist/src/plan/ordered-source.d.ts.map +1 -1
  49. package/dist/src/plan/ordered-source.js +19 -11
  50. package/dist/src/plan/ordered-source.js.map +1 -1
  51. package/dist/src/plan/plan.d.ts +513 -32
  52. package/dist/src/plan/plan.d.ts.map +1 -1
  53. package/dist/src/plan/plan.js +119 -32
  54. package/dist/src/plan/plan.js.map +1 -1
  55. package/dist/src/plan/root.d.ts +4 -2
  56. package/dist/src/plan/root.d.ts.map +1 -1
  57. package/dist/src/plan/root.js +6 -4
  58. package/dist/src/plan/root.js.map +1 -1
  59. package/dist/src/plan/series.d.ts +13 -0
  60. package/dist/src/plan/series.d.ts.map +1 -1
  61. package/dist/src/plan/series.js +61 -7
  62. package/dist/src/plan/series.js.map +1 -1
  63. package/dist/src/plan/types.d.ts +14 -0
  64. package/dist/src/plan/types.d.ts.map +1 -1
  65. package/dist/src/plan/types.js +8 -0
  66. package/dist/src/plan/types.js.map +1 -1
  67. package/dist/src/roster/index.d.ts +608 -20
  68. package/dist/src/roster/index.d.ts.map +1 -1
  69. package/dist/src/roster/index.js +103 -29
  70. package/dist/src/roster/index.js.map +1 -1
  71. package/dist/src/roster/library.d.ts +12 -2
  72. package/dist/src/roster/library.d.ts.map +1 -1
  73. package/dist/src/roster/library.js +8 -0
  74. package/dist/src/roster/library.js.map +1 -1
  75. package/dist/src/roster/lists.d.ts +59 -12
  76. package/dist/src/roster/lists.d.ts.map +1 -1
  77. package/dist/src/roster/lists.js +51 -58
  78. package/dist/src/roster/lists.js.map +1 -1
  79. package/dist/src/roster/times.d.ts +402 -0
  80. package/dist/src/roster/times.d.ts.map +1 -1
  81. package/dist/src/roster/types.d.ts +913 -1
  82. package/dist/src/roster/types.d.ts.map +1 -1
  83. package/dist/src/roster/types.js +43 -3
  84. package/dist/src/roster/types.js.map +1 -1
  85. package/dist/src/schedule/cell-checks.d.ts +85 -0
  86. package/dist/src/schedule/cell-checks.d.ts.map +1 -0
  87. package/dist/src/schedule/cell-checks.js +211 -0
  88. package/dist/src/schedule/cell-checks.js.map +1 -0
  89. package/dist/src/schedule/events.d.ts +42 -10
  90. package/dist/src/schedule/events.d.ts.map +1 -1
  91. package/dist/src/schedule/events.js +349 -155
  92. package/dist/src/schedule/events.js.map +1 -1
  93. package/dist/src/schedule/fields.d.ts +134 -0
  94. package/dist/src/schedule/fields.d.ts.map +1 -0
  95. package/dist/src/schedule/fields.js +207 -0
  96. package/dist/src/schedule/fields.js.map +1 -0
  97. package/dist/src/schedule/library.d.ts +11 -3
  98. package/dist/src/schedule/library.d.ts.map +1 -1
  99. package/dist/src/schedule/library.js +9 -6
  100. package/dist/src/schedule/library.js.map +1 -1
  101. package/dist/src/schedule/optimise.d.ts +124 -0
  102. package/dist/src/schedule/optimise.d.ts.map +1 -0
  103. package/dist/src/schedule/optimise.js +140 -0
  104. package/dist/src/schedule/optimise.js.map +1 -0
  105. package/dist/src/schedule/pages.d.ts +76 -0
  106. package/dist/src/schedule/pages.d.ts.map +1 -0
  107. package/dist/src/schedule/pages.js +86 -0
  108. package/dist/src/schedule/pages.js.map +1 -0
  109. package/dist/src/schedule/record-window.d.ts +119 -6
  110. package/dist/src/schedule/record-window.d.ts.map +1 -1
  111. package/dist/src/schedule/record-window.js +139 -60
  112. package/dist/src/schedule/record-window.js.map +1 -1
  113. package/dist/src/schedule/resources.d.ts +8 -4
  114. package/dist/src/schedule/resources.d.ts.map +1 -1
  115. package/dist/src/schedule/resources.js +35 -15
  116. package/dist/src/schedule/resources.js.map +1 -1
  117. package/dist/src/schedule/session.d.ts +14 -0
  118. package/dist/src/schedule/session.d.ts.map +1 -1
  119. package/dist/src/schedule/session.js +29 -17
  120. package/dist/src/schedule/session.js.map +1 -1
  121. package/dist/src/schedule/types.d.ts +426 -36
  122. package/dist/src/schedule/types.d.ts.map +1 -1
  123. package/dist/src/schedule/types.js +63 -17
  124. package/dist/src/schedule/types.js.map +1 -1
  125. package/dist/src/schedule/window.d.ts +30 -9
  126. package/dist/src/schedule/window.d.ts.map +1 -1
  127. package/dist/src/schedule/window.js +101 -49
  128. package/dist/src/schedule/window.js.map +1 -1
  129. package/dist/src/schematic/index.d.ts +277 -0
  130. package/dist/src/schematic/index.d.ts.map +1 -0
  131. package/dist/src/schematic/index.js +206 -0
  132. package/dist/src/schematic/index.js.map +1 -0
  133. package/dist/src/schematic/kinds.d.ts +501 -0
  134. package/dist/src/schematic/kinds.d.ts.map +1 -0
  135. package/dist/src/schematic/kinds.js +1027 -0
  136. package/dist/src/schematic/kinds.js.map +1 -0
  137. package/dist/src/schematic/layers.d.ts +74 -0
  138. package/dist/src/schematic/layers.d.ts.map +1 -0
  139. package/dist/src/schematic/layers.js +99 -0
  140. package/dist/src/schematic/layers.js.map +1 -0
  141. package/dist/src/schematic/library.d.ts +202 -0
  142. package/dist/src/schematic/library.d.ts.map +1 -0
  143. package/dist/src/schematic/library.js +244 -0
  144. package/dist/src/schematic/library.js.map +1 -0
  145. package/dist/src/schematic/payload.d.ts +8360 -0
  146. package/dist/src/schematic/payload.d.ts.map +1 -0
  147. package/dist/src/schematic/payload.js +446 -0
  148. package/dist/src/schematic/payload.js.map +1 -0
  149. package/dist/src/schematic/schematic.d.ts +27 -0
  150. package/dist/src/schematic/schematic.d.ts.map +1 -0
  151. package/dist/src/schematic/schematic.js +17 -0
  152. package/dist/src/schematic/schematic.js.map +1 -0
  153. package/dist/src/schematic/shapes.d.ts +150 -0
  154. package/dist/src/schematic/shapes.d.ts.map +1 -0
  155. package/dist/src/schematic/shapes.js +171 -0
  156. package/dist/src/schematic/shapes.js.map +1 -0
  157. package/dist/src/schematic/templates.d.ts +96 -0
  158. package/dist/src/schematic/templates.d.ts.map +1 -0
  159. package/dist/src/schematic/templates.js +91 -0
  160. package/dist/src/schematic/templates.js.map +1 -0
  161. package/dist/src/schematic/types.d.ts +5766 -0
  162. package/dist/src/schematic/types.d.ts.map +1 -0
  163. package/dist/src/schematic/types.js +688 -0
  164. package/dist/src/schematic/types.js.map +1 -0
  165. package/dist/src/schematic/window.d.ts +212 -0
  166. package/dist/src/schematic/window.d.ts.map +1 -0
  167. package/dist/src/schematic/window.js +337 -0
  168. package/dist/src/schematic/window.js.map +1 -0
  169. package/dist/src/sheet/editing-bridge.d.ts +4 -2
  170. package/dist/src/sheet/editing-bridge.d.ts.map +1 -1
  171. package/dist/src/sheet/editing-bridge.js +8 -2
  172. package/dist/src/sheet/editing-bridge.js.map +1 -1
  173. package/dist/src/sheet/editing-types.d.ts +9 -5
  174. package/dist/src/sheet/editing-types.d.ts.map +1 -1
  175. package/dist/src/sheet/editing-types.js +9 -5
  176. package/dist/src/sheet/editing-types.js.map +1 -1
  177. package/dist/src/sheet/index.d.ts +18 -8
  178. package/dist/src/sheet/index.d.ts.map +1 -1
  179. package/dist/src/sheet/index.js +15 -7
  180. package/dist/src/sheet/index.js.map +1 -1
  181. package/dist/src/sheet/optimise.d.ts +69 -0
  182. package/dist/src/sheet/optimise.d.ts.map +1 -0
  183. package/dist/src/sheet/optimise.js +81 -0
  184. package/dist/src/sheet/optimise.js.map +1 -0
  185. package/dist/src/sheet/registers.d.ts +5 -5
  186. package/dist/src/sheet/registers.js +5 -5
  187. package/dist/src/sheet/root.d.ts +2 -0
  188. package/dist/src/sheet/root.d.ts.map +1 -1
  189. package/dist/src/sheet/root.js +2 -2
  190. package/dist/src/sheet/root.js.map +1 -1
  191. package/dist/src/sheet/sheet.d.ts +753 -573
  192. package/dist/src/sheet/sheet.d.ts.map +1 -1
  193. package/dist/src/sheet/sheet.js +45 -13
  194. package/dist/src/sheet/sheet.js.map +1 -1
  195. package/dist/src/sheet/types.d.ts +92 -12
  196. package/dist/src/sheet/types.d.ts.map +1 -1
  197. package/dist/src/sheet/types.js +4 -8
  198. package/dist/src/sheet/types.js.map +1 -1
  199. package/dist/src/utils/keyed-rows.d.ts +41 -0
  200. package/dist/src/utils/keyed-rows.d.ts.map +1 -0
  201. package/dist/src/utils/keyed-rows.js +64 -0
  202. package/dist/src/utils/keyed-rows.js.map +1 -0
  203. package/dist/src/utils/optimise.d.ts +79 -0
  204. package/dist/src/utils/optimise.d.ts.map +1 -0
  205. package/dist/src/utils/optimise.js +46 -0
  206. package/dist/src/utils/optimise.js.map +1 -0
  207. package/dist/test/allocation/allocation.examples.d.ts +6 -18
  208. package/dist/test/allocation/allocation.examples.d.ts.map +1 -1
  209. package/dist/test/allocation/allocation.examples.js +3 -3
  210. package/dist/test/allocation/allocation.examples.js.map +1 -1
  211. package/dist/test/allocation/optimise.examples.d.ts +109 -0
  212. package/dist/test/allocation/optimise.examples.d.ts.map +1 -0
  213. package/dist/test/allocation/optimise.examples.js +223 -0
  214. package/dist/test/allocation/optimise.examples.js.map +1 -0
  215. package/dist/test/bind/data/data.examples.d.ts +540 -36
  216. package/dist/test/bind/data/data.examples.d.ts.map +1 -1
  217. package/dist/test/bind/data/data.examples.js +66 -2
  218. package/dist/test/bind/data/data.examples.js.map +1 -1
  219. package/dist/test/bind/record/record.examples.d.ts +1 -3
  220. package/dist/test/bind/record/record.examples.d.ts.map +1 -1
  221. package/dist/test/calendar/calendar-records.examples.d.ts.map +1 -1
  222. package/dist/test/calendar/calendar-records.examples.js +3 -3
  223. package/dist/test/calendar/calendar-records.examples.js.map +1 -1
  224. package/dist/test/calendar/calendar-windows.examples.d.ts +9 -0
  225. package/dist/test/calendar/calendar-windows.examples.d.ts.map +1 -0
  226. package/dist/test/calendar/calendar-windows.examples.js +111 -0
  227. package/dist/test/calendar/calendar-windows.examples.js.map +1 -0
  228. package/dist/test/calendar/calendar.examples.d.ts +7 -21
  229. package/dist/test/calendar/calendar.examples.d.ts.map +1 -1
  230. package/dist/test/calendar/calendar.examples.js +7 -7
  231. package/dist/test/calendar/calendar.examples.js.map +1 -1
  232. package/dist/test/calendar/optimise.examples.d.ts +132 -0
  233. package/dist/test/calendar/optimise.examples.d.ts.map +1 -0
  234. package/dist/test/calendar/optimise.examples.js +75 -0
  235. package/dist/test/calendar/optimise.examples.js.map +1 -0
  236. package/dist/test/examples-package.d.ts +46 -10
  237. package/dist/test/examples-package.d.ts.map +1 -1
  238. package/dist/test/examples-package.js +142 -32
  239. package/dist/test/examples-package.js.map +1 -1
  240. package/dist/test/flowchart/flowchart.examples.d.ts +10 -30
  241. package/dist/test/flowchart/flowchart.examples.d.ts.map +1 -1
  242. package/dist/test/plan/optimise.examples.d.ts +207 -0
  243. package/dist/test/plan/optimise.examples.d.ts.map +1 -0
  244. package/dist/test/plan/optimise.examples.js +98 -0
  245. package/dist/test/plan/optimise.examples.js.map +1 -0
  246. package/dist/test/plan/plan-events.examples.d.ts +8 -24
  247. package/dist/test/plan/plan-events.examples.d.ts.map +1 -1
  248. package/dist/test/plan/plan-events.examples.js +3 -3
  249. package/dist/test/plan/plan-events.examples.js.map +1 -1
  250. package/dist/test/plan/plan-records.examples.d.ts +200 -19
  251. package/dist/test/plan/plan-records.examples.d.ts.map +1 -1
  252. package/dist/test/plan/plan-records.examples.js +125 -28
  253. package/dist/test/plan/plan-records.examples.js.map +1 -1
  254. package/dist/test/plan/plan-windows.examples.d.ts +853 -36
  255. package/dist/test/plan/plan-windows.examples.d.ts.map +1 -1
  256. package/dist/test/plan/plan-windows.examples.js +166 -29
  257. package/dist/test/plan/plan-windows.examples.js.map +1 -1
  258. package/dist/test/plan/plan.examples.d.ts +7 -21
  259. package/dist/test/plan/plan.examples.d.ts.map +1 -1
  260. package/dist/test/plan/plan.examples.js +11 -9
  261. package/dist/test/plan/plan.examples.js.map +1 -1
  262. package/dist/test/roster/domain.examples.d.ts +804 -0
  263. package/dist/test/roster/domain.examples.d.ts.map +1 -1
  264. package/dist/test/roster/domain.examples.js +3 -3
  265. package/dist/test/roster/domain.examples.js.map +1 -1
  266. package/dist/test/roster/optimise.examples.d.ts +485 -0
  267. package/dist/test/roster/optimise.examples.d.ts.map +1 -0
  268. package/dist/test/roster/optimise.examples.js +155 -0
  269. package/dist/test/roster/optimise.examples.js.map +1 -0
  270. package/dist/test/roster/roster-records.examples.d.ts +6 -18
  271. package/dist/test/roster/roster-records.examples.d.ts.map +1 -1
  272. package/dist/test/roster/roster-records.examples.js +1 -1
  273. package/dist/test/roster/roster-records.examples.js.map +1 -1
  274. package/dist/test/roster/roster.examples.d.ts +3391 -21
  275. package/dist/test/roster/roster.examples.d.ts.map +1 -1
  276. package/dist/test/roster/roster.examples.js +54 -7
  277. package/dist/test/roster/roster.examples.js.map +1 -1
  278. package/dist/test/roster/warehouse.d.ts +150 -7
  279. package/dist/test/roster/warehouse.d.ts.map +1 -1
  280. package/dist/test/roster/warehouse.js +36 -11
  281. package/dist/test/roster/warehouse.js.map +1 -1
  282. package/dist/test/schedule/schedule.examples.d.ts +1 -3
  283. package/dist/test/schedule/schedule.examples.d.ts.map +1 -1
  284. package/dist/test/schematic/schematic-records.examples.d.ts +444 -0
  285. package/dist/test/schematic/schematic-records.examples.d.ts.map +1 -0
  286. package/dist/test/schematic/schematic-records.examples.js +205 -0
  287. package/dist/test/schematic/schematic-records.examples.js.map +1 -0
  288. package/dist/test/schematic/schematic.examples.d.ts +2289 -0
  289. package/dist/test/schematic/schematic.examples.d.ts.map +1 -0
  290. package/dist/test/schematic/schematic.examples.js +453 -0
  291. package/dist/test/schematic/schematic.examples.js.map +1 -0
  292. package/dist/test/sheet/optimise.examples.d.ts +177 -0
  293. package/dist/test/sheet/optimise.examples.d.ts.map +1 -0
  294. package/dist/test/sheet/optimise.examples.js +75 -0
  295. package/dist/test/sheet/optimise.examples.js.map +1 -0
  296. package/dist/test/sheet/sheet-records.examples.d.ts +95 -204
  297. package/dist/test/sheet/sheet-records.examples.d.ts.map +1 -1
  298. package/dist/test/sheet/sheet-records.examples.js +42 -17
  299. package/dist/test/sheet/sheet-records.examples.js.map +1 -1
  300. package/dist/test/sheet/sheet.examples.d.ts +17 -33
  301. package/dist/test/sheet/sheet.examples.d.ts.map +1 -1
  302. package/dist/test/sheet/sheet.examples.js +18 -15
  303. package/dist/test/sheet/sheet.examples.js.map +1 -1
  304. package/package.json +11 -11
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * A row's fields, read by name (#1367, #1386): the field types an option may
7
+ * name, a field read as an East expression, and a field holding the key of a
8
+ * keyed entity of a builder — one of Schedule's resources, one of the
9
+ * Schematic's items — by one kind's key, or a kind per case. Such a field is
10
+ * read as a reference to the entity, its kind's slot and its key, and written
11
+ * back from one.
12
+ *
13
+ * Schedule's event kinds (`events.ts`, a resource field) and the Schematic's
14
+ * links (a link's ends) check and read such a field through these, each
15
+ * naming the option and what the keys are of in its own words.
16
+ *
17
+ * A row's fields are written by name too ({@link fieldSetters}): a setter for
18
+ * every field at any depth, which an inspector's edit of a Schedule kind's
19
+ * field writes through, and an author's card dropped on a Schematic entity
20
+ * (#1390).
21
+ *
22
+ * @packageDocumentation
23
+ */
24
+ import { BlobType, East, OptionType, StringType, isTypeEqual, none, some, variant, } from "@elaraai/east";
25
+ import { ScheduleResourceRefType } from "./types.js";
26
+ import { optionOf, typeText } from "./window.js";
27
+ /**
28
+ * A field of a struct as an East expression, by name.
29
+ *
30
+ * @param row - The struct, as an East expression
31
+ * @param name - The field's name
32
+ * @returns The field
33
+ */
34
+ export function fieldOf(row, name) {
35
+ return row[name];
36
+ }
37
+ /**
38
+ * A setter for every field of a row, at any depth: what an inspector's edit of
39
+ * one field writes through — a Schedule kind's `field` gesture — and an
40
+ * author's card's patch dropped on a Schematic entity, a field at a time
41
+ * (#1390). Each takes the field's value as bytes at the field's type, and
42
+ * rebuilds the structs down its path from the leaf up, every other field as it
43
+ * was.
44
+ *
45
+ * @param rowType - The row type
46
+ * @returns Each field's setter: a field, then the fields of a struct it holds, in the row's order
47
+ */
48
+ export function fieldSetters(rowType) {
49
+ const setters = [];
50
+ const setterOf = (prefix, name, type) => East.function([rowType, BlobType], rowType, (_$, row, bytes) => {
51
+ const value = bytes.decodeBeast(type, "v2");
52
+ // The structs down the path, each with the field below it replaced, rebuilt from the leaf up.
53
+ const chain = [];
54
+ let at = row;
55
+ let struct = rowType;
56
+ for (const step of prefix) {
57
+ chain.push({ struct, field: step, at });
58
+ at = fieldOf(at, step);
59
+ struct = struct.fields[step];
60
+ }
61
+ const leaf = struct;
62
+ const leafAt = at;
63
+ let next = East.value(Object.fromEntries(Object.keys(leaf.fields).map((f) => [f, f === name ? value : fieldOf(leafAt, f)])), leaf);
64
+ for (let i = chain.length - 1; i >= 0; i--) {
65
+ const link = chain[i];
66
+ const inner = next;
67
+ next = East.value(Object.fromEntries(Object.keys(link.struct.fields).map((f) => [f, f === link.field ? inner : fieldOf(link.at, f)])), link.struct);
68
+ }
69
+ return next;
70
+ });
71
+ const collect = (struct, prefix) => {
72
+ for (const [name, type] of Object.entries(struct.fields)) {
73
+ setters.push({ path: [...prefix, name], set: setterOf(prefix, name, type) });
74
+ if (type.type === "Struct")
75
+ collect(type, [...prefix, name]);
76
+ }
77
+ };
78
+ collect(rowType, []);
79
+ return setters;
80
+ }
81
+ /**
82
+ * A variant's cases, when every one of them holds a String.
83
+ *
84
+ * @param type - The type
85
+ * @returns Its cases, in order; `undefined` for a type that is no such variant, or an Option
86
+ */
87
+ export function stringCases(type) {
88
+ if (type.type !== "Variant" || optionOf(type) !== undefined)
89
+ return undefined;
90
+ const cases = Object.entries(type.cases);
91
+ return cases.length > 0 && cases.every(([, t]) => isTypeEqual(t, StringType)) ? cases.map(([c]) => c) : undefined;
92
+ }
93
+ /**
94
+ * Checks a key field (see {@link KeyField}).
95
+ *
96
+ * @param field - The field's name
97
+ * @param type - The field's type
98
+ * @param of - What its option's `of` names: a slot, or a slot per case
99
+ * @param words - How the refusals name it
100
+ * @returns The field, checked
101
+ * @throws {Error} Naming the option: a String field whose `of` names no slot;
102
+ * a variant whose `of` does not name a slot for each of its cases, or names
103
+ * one slot twice; a field holding neither a String nor a variant of String
104
+ * cases, nor an Option of either
105
+ */
106
+ export function checkKeyField(field, type, of, words) {
107
+ const { where, prop, noun } = words;
108
+ const inner = optionOf(type) ?? type;
109
+ const optional = optionOf(type) !== undefined;
110
+ const cases = stringCases(inner);
111
+ if (isTypeEqual(inner, StringType)) {
112
+ if (typeof of !== "string" || of === "") {
113
+ throw new Error(`${where}: \`${prop}.of\` names the ${noun} slot "${field}" holds keys of — a String field holds one kind's keys`);
114
+ }
115
+ return { field, shape: "key", of, optional };
116
+ }
117
+ if (cases !== undefined) {
118
+ if (typeof of !== "object" || of === null) {
119
+ throw new Error(`${where}: "${field}" is a variant — \`${prop}.of\` names a ${noun} slot per case: { ${cases.map((c) => `${c}: "…"`).join(", ")} }`);
120
+ }
121
+ const slots = of;
122
+ const named = Object.keys(slots);
123
+ if (named.length !== cases.length || !named.every((c) => cases.includes(c))) {
124
+ throw new Error(`${where}: \`${prop}.of\` names a ${noun} slot for each of "${field}"'s cases (${cases.join(", ")}) — and it names ${named.join(", ") || "none"}`);
125
+ }
126
+ const kinds = Object.values(slots);
127
+ if (new Set(kinds).size !== kinds.length) {
128
+ throw new Error(`${where}: \`${prop}.of\` names each ${noun} slot once — a case per kind of ${noun} — and it names ${kinds.join(", ")}`);
129
+ }
130
+ return { field, shape: "cases", of: slots, cases, optional, variant: inner };
131
+ }
132
+ throw new Error(`${where}: \`${prop}.field\` names a field holding a ${noun}'s key — a String, a variant of String cases, or an Option of either — and "${field}" holds ${typeText(type)}`);
133
+ }
134
+ /**
135
+ * The slots a key field's keys are of, in order.
136
+ *
137
+ * @param field - The field, checked
138
+ * @returns Its one slot, or a slot per case
139
+ */
140
+ export function keyFieldSlots(field) {
141
+ return field.shape === "key" ? [field.of] : Object.values(field.of);
142
+ }
143
+ /** A reference to a keyed entity, as an Option: none for an Option field holding none. */
144
+ const RefOption = OptionType(ScheduleResourceRefType);
145
+ /**
146
+ * Reads a key field as a reference to the entity it names: its kind's slot
147
+ * and its key — `none` for an Option field holding none, or for a row of a
148
+ * builder whose kind has no such field.
149
+ *
150
+ * @param field - The field, checked; `undefined`, the kind has none
151
+ * @param rowType - The row type
152
+ * @returns `(row)` → the reference, if any
153
+ */
154
+ export function keyFieldRef(field, rowType) {
155
+ return East.function([rowType], RefOption, (_$, row) => {
156
+ if (field === undefined)
157
+ return East.value(none, RefOption);
158
+ const value = fieldOf(row, field.field);
159
+ if (field.shape === "key") {
160
+ const kind = field.of;
161
+ const ref = (key) => East.value(some(East.value({ kind, key }, ScheduleResourceRefType)), RefOption);
162
+ return field.optional
163
+ ? value.match({ none: (_$2) => East.value(none, RefOption), some: (_$2, key) => ref(key) })
164
+ : ref(value);
165
+ }
166
+ const of = field.of;
167
+ const byCase = (v) => v.match(Object.fromEntries(field.cases.map((c) => [c, (_$2, key) => East.value(some(East.value({ kind: of[c], key }, ScheduleResourceRefType)), RefOption)])));
168
+ return field.optional
169
+ ? value.match({ none: (_$2) => East.value(none, RefOption), some: (_$2, v) => byCase(v) })
170
+ : byCase(value);
171
+ });
172
+ }
173
+ /**
174
+ * The value a key field takes for a reference: `none` where the field
175
+ * refuses it — a reference to a kind it does not hold keys of, or no
176
+ * reference for a field that must hold one.
177
+ *
178
+ * @param field - The field, checked
179
+ * @param valueType - The field's type
180
+ * @returns `(ref)` → the field's value, if it takes the reference
181
+ */
182
+ export function keyFieldValue(field, valueType) {
183
+ return East.function([RefOption], OptionType(valueType), ($, ref) => {
184
+ const result = $.let(East.value(none, OptionType(valueType)), OptionType(valueType));
185
+ $.match(ref, {
186
+ none: ($2) => {
187
+ if (field.optional)
188
+ $2.assign(result, East.value(some(East.value(none, valueType)), OptionType(valueType)));
189
+ },
190
+ some: ($2, r) => {
191
+ if (field.shape === "key") {
192
+ const key = field.optional ? East.value(some(r.key), valueType) : r.key;
193
+ $2.if(East.equal(r.kind, field.of), ($3) => { $3.assign(result, East.value(some(key), OptionType(valueType))); });
194
+ }
195
+ else {
196
+ for (const c of field.cases) {
197
+ const caseValue = East.value(variant(c, r.key), field.variant);
198
+ const held = field.optional ? East.value(some(caseValue), valueType) : caseValue;
199
+ $2.if(East.equal(r.kind, field.of[c]), ($3) => { $3.assign(result, East.value(some(held), OptionType(valueType))); });
200
+ }
201
+ }
202
+ },
203
+ });
204
+ return result;
205
+ });
206
+ }
207
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/schedule/fields.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,13 @@ export interface ScheduleLibraryTabConfig<K extends EastType, R extends EastType
58
58
  */
59
59
  source?: string;
60
60
  }
61
+ /** How an author's tab's refusals name what its cards land on, by builder. */
62
+ export interface ScheduleTabWords {
63
+ /** One kind its cards land on, as a refusal names it (`event kind`). */
64
+ readonly kind: string;
65
+ /** The patch a drop is built with (`Schedule.patch`). */
66
+ readonly patch: string;
67
+ }
61
68
  /** An author's declared tab, before its accessors are reified. */
62
69
  export interface ScheduleTabDeclaration {
63
70
  /** Identifies an author-defined tab. */
@@ -68,13 +75,14 @@ export interface ScheduleTabDeclaration {
68
75
  readonly config: ScheduleLibraryTabConfig<EastType, EastType>;
69
76
  }
70
77
  /**
71
- * Resolves author cards and checks the patch type against the event kinds.
78
+ * Resolves author cards and checks the patch type against the kinds its cards land on.
72
79
  * @param tab - The declared tab
73
- * @param events - Event kinds by slot
80
+ * @param events - The kinds a card may land on, by slot: a Schedule builder's event kinds, a Schematic's kinds
74
81
  * @param owner - The builder's name for diagnostics
75
82
  * @param sources - The builder's Slice sources, which the tab's `source` must be one of
83
+ * @param words - How the refusals name those kinds and the patch a drop is built with; a Schedule builder's by default
76
84
  * @returns The closed author tab
77
85
  * @throws {Error} When rows are not keyed, a drop matches zero or several kinds, or the tab names a source the slice lacks
78
86
  */
79
- export declare function buildScheduleTab(tab: ScheduleTabDeclaration, events: readonly (readonly [string, ScheduleEventKind<EastType, EastType>])[], owner: string, sources: readonly string[]): ExprType<typeof ScheduleAuthorTabType>;
87
+ export declare function buildScheduleTab(tab: ScheduleTabDeclaration, events: readonly (readonly [string, Pick<ScheduleEventKind<EastType, EastType>, "rowType">])[], owner: string, sources: readonly string[], words?: ScheduleTabWords): ExprType<typeof ScheduleAuthorTabType>;
80
88
  //# sourceMappingURL=library.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../../src/schedule/library.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sEAAsE;AACtE,OAAO,EACH,SAAS,EAAwB,UAAU,EAAE,UAAU,EAAE,UAAU,EACnE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAqB,KAAK,kBAAkB,EAC3E,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKrD,gEAAgE;AAChE,eAAO,MAAM,uBAAuB;;;;;;;;;EAMlC,CAAC;AAEH,yDAAyD;AACzD,MAAM,MAAM,uBAAuB,GAAG,OAAO,uBAAuB,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAEhC,CAAC;AAEH,kEAAkE;AAClE,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ;IAC3G,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC9E,uDAAuD;IACvD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1F,2CAA2C;IAC3C,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/E,2HAA2H;IAC3H,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACnC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EACtJ,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,qBAAqB,CAAC,CA4EtE"}
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../../src/schedule/library.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sEAAsE;AACtE,OAAO,EACH,SAAS,EAAwB,UAAU,EAAE,UAAU,EAAE,UAAU,EACnE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAqB,KAAK,kBAAkB,EAC3E,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKrD,gEAAgE;AAChE,eAAO,MAAM,uBAAuB;;;;;;;;;EAMlC,CAAC;AAEH,yDAAyD;AACzD,MAAM,MAAM,uBAAuB,GAAG,OAAO,uBAAuB,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAEhC,CAAC;AAEH,kEAAkE;AAClE,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ;IAC3G,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC9E,uDAAuD;IACvD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1F,2CAA2C;IAC3C,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/E,2HAA2H;IAC3H,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAKD,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACnC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EACxJ,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,GAAE,gBAAiC,GAAG,QAAQ,CAAC,OAAO,qBAAqB,CAAC,CA4E/H"}
@@ -22,16 +22,19 @@ export const ScheduleLibraryCardType = StructType({
22
22
  export const ScheduleAuthorTabType = StructType({
23
23
  name: StringType, icon: OptionType(StringType), drop: OptionType(StringType), cards: ArrayType(ScheduleLibraryCardType), source: OptionType(StringType),
24
24
  });
25
+ /** The words of a Schedule builder's tab: its cards land on event kinds, their drops built with `Schedule.patch`. */
26
+ const SCHEDULE_WORDS = { kind: "event kind", patch: "Schedule.patch" };
25
27
  /**
26
- * Resolves author cards and checks the patch type against the event kinds.
28
+ * Resolves author cards and checks the patch type against the kinds its cards land on.
27
29
  * @param tab - The declared tab
28
- * @param events - Event kinds by slot
30
+ * @param events - The kinds a card may land on, by slot: a Schedule builder's event kinds, a Schematic's kinds
29
31
  * @param owner - The builder's name for diagnostics
30
32
  * @param sources - The builder's Slice sources, which the tab's `source` must be one of
33
+ * @param words - How the refusals name those kinds and the patch a drop is built with; a Schedule builder's by default
31
34
  * @returns The closed author tab
32
35
  * @throws {Error} When rows are not keyed, a drop matches zero or several kinds, or the tab names a source the slice lacks
33
36
  */
34
- export function buildScheduleTab(tab, events, owner, sources) {
37
+ export function buildScheduleTab(tab, events, owner, sources, words = SCHEDULE_WORDS) {
35
38
  const cfg = tab.config;
36
39
  const named = tabSource(owner, cfg.name, cfg.source, sources);
37
40
  const where = owner + ': the "' + cfg.name + '" tab';
@@ -53,11 +56,11 @@ export function buildScheduleTab(tab, events, owner, sources) {
53
56
  && isTypeEqual(patchType, SchedulePatchTypeFor(kind.rowType)));
54
57
  if (takers.length === 0) {
55
58
  const kinds = events.map(([slot]) => slot).join(", ");
56
- throw new Error(`${where}'s \`drop\` returns a patch over no event kind's row type — build it with Schedule.patch(RowType, { … }) ` +
57
- `over the row type of the kind its cards land on (${kinds === "" ? "this " + owner + " has no event kinds" : kinds})`);
59
+ throw new Error(`${where}'s \`drop\` returns a patch over no ${words.kind}'s row type — build it with ${words.patch}(RowType, { … }) ` +
60
+ `over the row type of the kind its cards land on (${kinds === "" ? "this " + owner + " has no " + words.kind + "s" : kinds})`);
58
61
  }
59
62
  if (takers.length > 1) {
60
- throw new Error(`${where}'s \`drop\` returns a patch over a row type ${takers.length} event kinds share ` +
63
+ throw new Error(`${where}'s \`drop\` returns a patch over a row type ${takers.length} ${words.kind}s share ` +
61
64
  `(${takers.map(([slot]) => slot).join(", ")}) — a card lands on one kind, so give each kind a row type of its own`);
62
65
  }
63
66
  lands = takers[0][0];
@@ -1 +1 @@
1
- {"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/schedule/library.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/schedule/library.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The optimiser's request and answer over a builder's event kinds (#1409,
7
+ * `Optimise Spec.md` §5.1): what a Calendar's and a Plan's `optimise` asks and
8
+ * answers — the window in view, the run number, every event kind's rows in the
9
+ * window and its backlog by slot and by key, and every resource kind's rows as
10
+ * context; the answer the events, complete. The types are constructors over
11
+ * the kinds' rows by slot: the same kinds give the same East type, which the
12
+ * tag holds the bound function to.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import { DateTimeType, DictType, IntegerType, StringType, StructType, type EastType, type ExprType } from "@elaraai/east";
17
+ import { FuncBindingType } from "../bind/func.js";
18
+ /**
19
+ * The kinds' rows by slot, as an app writes them: each slot's row type, for a
20
+ * kind whose record is keyed by String, or its record type `DictType(K, R)`,
21
+ * for one keyed otherwise.
22
+ */
23
+ export type ScheduleOptimiseRows = Readonly<Record<string, EastType>>;
24
+ /**
25
+ * The kinds' records by slot, as the East types the rows given make them: a
26
+ * row type's slot a String-keyed record of it, a Dict type's slot the record
27
+ * as it is.
28
+ *
29
+ * @typeParam Rows - The kinds' rows by slot
30
+ */
31
+ export type ScheduleOptimiseRecordsOf<Rows extends ScheduleOptimiseRows> = StructType<{
32
+ [S in keyof Rows & string]: Rows[S] extends DictType<infer K, infer V> ? DictType<K, V> : DictType<StringType, Rows[S]>;
33
+ }>;
34
+ /** The kinds' records by slot on the wire: `{ [slot]: DictType(K, R) }`, the slots in name order. */
35
+ export type ScheduleOptimiseRecordsType = ScheduleOptimiseRecordsOf<ScheduleOptimiseRows>;
36
+ /**
37
+ * An optimiser's request over event kinds `E` and resource kinds `S` — what
38
+ * {@link ScheduleOptimiseRequestTypeFor} constructs.
39
+ *
40
+ * @typeParam E - The event kinds' rows by slot
41
+ * @typeParam S - The resource kinds' rows by slot
42
+ */
43
+ export type ScheduleOptimiseRequestType<E extends ScheduleOptimiseRows = ScheduleOptimiseRows, S extends ScheduleOptimiseRows = ScheduleOptimiseRows> = StructType<{
44
+ from: DateTimeType;
45
+ to: DateTimeType;
46
+ run: IntegerType;
47
+ events: ScheduleOptimiseRecordsOf<E>;
48
+ resources: ScheduleOptimiseRecordsOf<S>;
49
+ }>;
50
+ /**
51
+ * An optimiser's answer over event kinds `E` — what
52
+ * {@link ScheduleOptimiseResultTypeFor} constructs.
53
+ *
54
+ * @typeParam E - The event kinds' rows by slot
55
+ */
56
+ export type ScheduleOptimiseResultType<E extends ScheduleOptimiseRows = ScheduleOptimiseRows> = StructType<{
57
+ events: ScheduleOptimiseRecordsOf<E>;
58
+ }>;
59
+ /**
60
+ * One request to the app's optimiser (#1409): the window in view and the
61
+ * kinds' rows, as drafted, for the optimiser to schedule or improve — the
62
+ * Elara eye's one call.
63
+ *
64
+ * @typeParam E - The event kinds' rows by slot
65
+ * @typeParam S - The resource kinds' rows by slot
66
+ * @param events - The event kinds' rows by slot: each slot's row type (a String-keyed kind's), or its record type `DictType(K, R)`
67
+ * @param resources - The resource kinds' rows by slot, the same way; none by default
68
+ * @returns `StructType({ from, to, run, events, resources })`
69
+ *
70
+ * @property from - The window's start
71
+ * @property to - The window's end, exclusive
72
+ * @property run - The run's number, from 1 per builder per browser
73
+ * @property events - Each event kind's rows by slot, by key: the kind's rows in the window and its backlog's, the app's own rows as the session holds them — the base with every unapplied draft in place, every row whatever the rail shows
74
+ * @property resources - Each resource kind's rows by slot, by key, as context
75
+ */
76
+ export declare function ScheduleOptimiseRequestTypeFor<E extends ScheduleOptimiseRows, S extends ScheduleOptimiseRows = Record<never, never>>(events: E, resources?: S): ScheduleOptimiseRequestType<E, S>;
77
+ /**
78
+ * The app's optimiser's answer (#1409): every event kind's rows, complete, by
79
+ * slot and by key. The builder diffs it against the request by key — a key the
80
+ * request did not hold is an event added, one it held with another row an
81
+ * event changed, one missing an event removed — and records the diff as one
82
+ * step of its history.
83
+ *
84
+ * @typeParam E - The event kinds' rows by slot
85
+ * @param events - The event kinds' rows by slot, as the request took them
86
+ * @returns `StructType({ events })`
87
+ *
88
+ * @property events - Each event kind's rows by slot, by key, complete; a new event's key the optimiser's own
89
+ */
90
+ export declare function ScheduleOptimiseResultTypeFor<E extends ScheduleOptimiseRows>(events: E): ScheduleOptimiseResultType<E>;
91
+ /** A kind's key and row types: what `Schedule.events` and `Schedule.resources` hold of their records. */
92
+ interface ScheduleKeyed {
93
+ /** The kind's key type. */
94
+ readonly keyType: EastType;
95
+ /** The kind's row type. */
96
+ readonly rowType: EastType;
97
+ }
98
+ /**
99
+ * The kinds' records by slot, from the kinds themselves: what a builder's
100
+ * request and answer are built over, and the renderer builds a run's request
101
+ * type from.
102
+ *
103
+ * @param kinds - The kinds, by slot
104
+ * @returns Each slot's record type, `DictType(K, R)`
105
+ * @internal
106
+ */
107
+ export declare function scheduleOptimiseRows(kinds: readonly (readonly [string, ScheduleKeyed])[]): ScheduleOptimiseRows;
108
+ /**
109
+ * A Calendar's or a Plan's `optimise` binding, checked (#1409): `Func.bind` of
110
+ * an `e3.function` from `OptimiseRequest(E, S)` to `OptimiseResult(E)` over the
111
+ * builder's kinds' rows by slot.
112
+ *
113
+ * @param builder - The builder, as the refusals name it
114
+ * @param optimise - What the app passed as `optimise`
115
+ * @param events - The event kinds, by slot
116
+ * @param resources - The resource kinds, by slot
117
+ * @returns The binding's descriptor, which names the function
118
+ * @throws {Error} When it is not a `Func.bind` handle, or its function asks or answers another type, naming it — one bound
119
+ * over the same slots' other rows naming both
120
+ * @internal
121
+ */
122
+ export declare function scheduleOptimiseBinding(builder: "Calendar" | "Plan", optimise: unknown, events: readonly (readonly [string, ScheduleKeyed])[], resources: readonly (readonly [string, ScheduleKeyed])[]): ExprType<typeof FuncBindingType>;
123
+ export {};
124
+ //# sourceMappingURL=optimise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimise.d.ts","sourceRoot":"","sources":["../../../src/schedule/optimise.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAA0B,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAClJ,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,CAAC,IAAI,SAAS,oBAAoB,IAAI,UAAU,CAAC;KACjF,CAAC,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CAC1H,CAAC,CAAC;AAEH,qGAAqG;AACrG,MAAM,MAAM,2BAA2B,GAAG,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;AAE1F;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,oBAAoB,GAAG,oBAAoB,EAAE,CAAC,SAAS,oBAAoB,GAAG,oBAAoB,IAAI,UAAU,CAAC;IAC/J,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;IAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;CACzI,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,oBAAoB,GAAG,oBAAoB,IAAI,UAAU,CAAC;IAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,CAAC;AAkBrJ;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,SAAS,oBAAoB,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAChI,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,GACzB,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,CAInC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,oBAAoB,EAAE,MAAM,EAAE,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAEtH;AAED,yGAAyG;AACzG,UAAU,aAAa;IACnB,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,oBAAoB,CAE/G;AAcD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACnC,OAAO,EAAE,UAAU,GAAG,MAAM,EAC5B,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,EACrD,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,GACzD,QAAQ,CAAC,OAAO,eAAe,CAAC,CA0BlC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The optimiser's request and answer over a builder's event kinds (#1409,
7
+ * `Optimise Spec.md` §5.1): what a Calendar's and a Plan's `optimise` asks and
8
+ * answers — the window in view, the run number, every event kind's rows in the
9
+ * window and its backlog by slot and by key, and every resource kind's rows as
10
+ * context; the answer the events, complete. The types are constructors over
11
+ * the kinds' rows by slot: the same kinds give the same East type, which the
12
+ * tag holds the bound function to.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import { DateTimeType, DictType, IntegerType, StringType, StructType, isTypeEqual, printType } from "@elaraai/east";
17
+ import { FuncBindingType } from "../bind/func.js";
18
+ import { optimiseBinding } from "../utils/optimise.js";
19
+ /**
20
+ * The kinds' records by slot: each a `Dict` of the kind's rows by its key — a
21
+ * row type given stands for a String-keyed kind's record, a Dict type for the
22
+ * kind's record as it is — the slots in name order, so the same kinds give the
23
+ * same type however they are listed.
24
+ *
25
+ * @param rows - The kinds' rows by slot
26
+ * @returns The records by slot
27
+ */
28
+ function recordsOf(rows) {
29
+ return StructType(Object.fromEntries(Object.keys(rows).sort().map((slot) => {
30
+ const given = rows[slot];
31
+ return [slot, given.type === "Dict" ? given : DictType(StringType, given)];
32
+ })));
33
+ }
34
+ /**
35
+ * One request to the app's optimiser (#1409): the window in view and the
36
+ * kinds' rows, as drafted, for the optimiser to schedule or improve — the
37
+ * Elara eye's one call.
38
+ *
39
+ * @typeParam E - The event kinds' rows by slot
40
+ * @typeParam S - The resource kinds' rows by slot
41
+ * @param events - The event kinds' rows by slot: each slot's row type (a String-keyed kind's), or its record type `DictType(K, R)`
42
+ * @param resources - The resource kinds' rows by slot, the same way; none by default
43
+ * @returns `StructType({ from, to, run, events, resources })`
44
+ *
45
+ * @property from - The window's start
46
+ * @property to - The window's end, exclusive
47
+ * @property run - The run's number, from 1 per builder per browser
48
+ * @property events - Each event kind's rows by slot, by key: the kind's rows in the window and its backlog's, the app's own rows as the session holds them — the base with every unapplied draft in place, every row whatever the rail shows
49
+ * @property resources - Each resource kind's rows by slot, by key, as context
50
+ */
51
+ export function ScheduleOptimiseRequestTypeFor(events, resources) {
52
+ return StructType({
53
+ from: DateTimeType, to: DateTimeType, run: IntegerType, events: recordsOf(events), resources: recordsOf(resources ?? {}),
54
+ });
55
+ }
56
+ /**
57
+ * The app's optimiser's answer (#1409): every event kind's rows, complete, by
58
+ * slot and by key. The builder diffs it against the request by key — a key the
59
+ * request did not hold is an event added, one it held with another row an
60
+ * event changed, one missing an event removed — and records the diff as one
61
+ * step of its history.
62
+ *
63
+ * @typeParam E - The event kinds' rows by slot
64
+ * @param events - The event kinds' rows by slot, as the request took them
65
+ * @returns `StructType({ events })`
66
+ *
67
+ * @property events - Each event kind's rows by slot, by key, complete; a new event's key the optimiser's own
68
+ */
69
+ export function ScheduleOptimiseResultTypeFor(events) {
70
+ return StructType({ events: recordsOf(events) });
71
+ }
72
+ /**
73
+ * The kinds' records by slot, from the kinds themselves: what a builder's
74
+ * request and answer are built over, and the renderer builds a run's request
75
+ * type from.
76
+ *
77
+ * @param kinds - The kinds, by slot
78
+ * @returns Each slot's record type, `DictType(K, R)`
79
+ * @internal
80
+ */
81
+ export function scheduleOptimiseRows(kinds) {
82
+ return Object.fromEntries(kinds.map(([slot, kind]) => [slot, DictType(kind.keyType, kind.rowType)]));
83
+ }
84
+ /**
85
+ * The kinds' rows by slot, printed as an app writes them: a String-keyed
86
+ * kind's row type, another kind's record type.
87
+ *
88
+ * @param records - The records by slot
89
+ * @returns `{ job: .Struct […], … }`
90
+ */
91
+ function printRows(records) {
92
+ const fields = records.fields;
93
+ return `{ ${Object.entries(fields).map(([slot, record]) => `${slot}: ${printType(record.key.type === "String" ? record.value : record)}`).join(", ")} }`;
94
+ }
95
+ /**
96
+ * A Calendar's or a Plan's `optimise` binding, checked (#1409): `Func.bind` of
97
+ * an `e3.function` from `OptimiseRequest(E, S)` to `OptimiseResult(E)` over the
98
+ * builder's kinds' rows by slot.
99
+ *
100
+ * @param builder - The builder, as the refusals name it
101
+ * @param optimise - What the app passed as `optimise`
102
+ * @param events - The event kinds, by slot
103
+ * @param resources - The resource kinds, by slot
104
+ * @returns The binding's descriptor, which names the function
105
+ * @throws {Error} When it is not a `Func.bind` handle, or its function asks or answers another type, naming it — one bound
106
+ * over the same slots' other rows naming both
107
+ * @internal
108
+ */
109
+ export function scheduleOptimiseBinding(builder, optimise, events, resources) {
110
+ const eventRows = scheduleOptimiseRows(events);
111
+ const resourceRows = scheduleOptimiseRows(resources);
112
+ const request = ScheduleOptimiseRequestTypeFor(eventRows, resourceRows);
113
+ const result = ScheduleOptimiseResultTypeFor(eventRows);
114
+ const slotsOf = (s) => Object.keys(s.fields).sort().join("\u0000");
115
+ const records = (s) => Object.values(s.fields).every((f) => f.type === "Dict");
116
+ return optimiseBinding(optimise, {
117
+ builder, request, result,
118
+ signature: `from ${builder}.Types.OptimiseRequest(E, S) to ${builder}.Types.OptimiseResult(E), E the event kinds' row types by slot and S the resource kinds'`,
119
+ names: { request: `${builder}.Types.OptimiseRequest`, result: `${builder}.Types.OptimiseResult` },
120
+ rows: { request: `${printRows(request.fields.events)}, ${printRows(request.fields.resources)}`, result: printRows(result.fields.events) },
121
+ noun: { theirs: "event rows", ours: "the kinds' rows" }, of: "the kinds' row types by slot",
122
+ otherRows: (asked) => {
123
+ // A request of this shape over other rows: the same slots, each a record, another row type in one of them.
124
+ if (asked.type !== "Struct")
125
+ return undefined;
126
+ const theirEvents = asked.fields["events"], theirResources = asked.fields["resources"];
127
+ if (theirEvents?.type !== "Struct" || theirResources?.type !== "Struct")
128
+ return undefined;
129
+ if (slotsOf(theirEvents) !== slotsOf(request.fields.events) || slotsOf(theirResources) !== slotsOf(request.fields.resources))
130
+ return undefined;
131
+ if (!records(theirEvents) || !records(theirResources))
132
+ return undefined;
133
+ const rebuilt = ScheduleOptimiseRequestTypeFor(theirEvents.fields, theirResources.fields);
134
+ return isTypeEqual(asked, rebuilt)
135
+ ? `${printRows(theirEvents)}, ${printRows(theirResources)}`
136
+ : undefined;
137
+ },
138
+ });
139
+ }
140
+ //# sourceMappingURL=optimise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimise.js","sourceRoot":"","sources":["../../../src/schedule/optimise.ts"],"names":[],"mappings":"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"}