@graview/core 0.1.62 → 0.1.64

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 (340) hide show
  1. package/dist/app.d.ts +12 -0
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js.map +1 -1
  4. package/dist/arranging.js +2 -2
  5. package/dist/arranging.js.map +1 -1
  6. package/dist/cli/check/index.d.ts +1 -0
  7. package/dist/cli/check/index.d.ts.map +1 -1
  8. package/dist/cli/check/index.js +1 -0
  9. package/dist/cli/check/index.js.map +1 -1
  10. package/dist/cli/check/workflows.d.ts +11 -0
  11. package/dist/cli/check/workflows.d.ts.map +1 -0
  12. package/dist/cli/check/workflows.js +20 -0
  13. package/dist/cli/check/workflows.js.map +1 -0
  14. package/dist/cli/check.d.ts.map +1 -1
  15. package/dist/cli/check.js +2 -1
  16. package/dist/cli/check.js.map +1 -1
  17. package/dist/cli/describe.d.ts.map +1 -1
  18. package/dist/cli/describe.js +31 -1
  19. package/dist/cli/describe.js.map +1 -1
  20. package/dist/cli/document-schema.d.ts.map +1 -1
  21. package/dist/cli/document-schema.js +9 -0
  22. package/dist/cli/document-schema.js.map +1 -1
  23. package/dist/compose.d.ts +1 -1
  24. package/dist/compose.d.ts.map +1 -1
  25. package/dist/document/amount.d.ts +1 -1
  26. package/dist/document/amount.d.ts.map +1 -1
  27. package/dist/document/amount.js +2 -2
  28. package/dist/document/amount.js.map +1 -1
  29. package/dist/document/blocks.d.ts.map +1 -1
  30. package/dist/document/blocks.js +17 -1
  31. package/dist/document/blocks.js.map +1 -1
  32. package/dist/document/brand-check.d.ts.map +1 -1
  33. package/dist/document/brand-check.js +8 -2
  34. package/dist/document/brand-check.js.map +1 -1
  35. package/dist/document/compile-checked.d.ts.map +1 -1
  36. package/dist/document/compile-checked.js +4 -2
  37. package/dist/document/compile-checked.js.map +1 -1
  38. package/dist/document/compile.d.ts.map +1 -1
  39. package/dist/document/compile.js +48 -9
  40. package/dist/document/compile.js.map +1 -1
  41. package/dist/document/compiled.d.ts +14 -0
  42. package/dist/document/compiled.d.ts.map +1 -1
  43. package/dist/document/compiled.js +39 -4
  44. package/dist/document/compiled.js.map +1 -1
  45. package/dist/document/connection-findings.js +93 -21
  46. package/dist/document/connection-findings.js.map +1 -1
  47. package/dist/document/connection-spec.d.ts +54 -1
  48. package/dist/document/connection-spec.d.ts.map +1 -1
  49. package/dist/document/connection-spec.js +76 -8
  50. package/dist/document/connection-spec.js.map +1 -1
  51. package/dist/document/derives-findings.d.ts +4 -0
  52. package/dist/document/derives-findings.d.ts.map +1 -0
  53. package/dist/document/derives-findings.js +68 -0
  54. package/dist/document/derives-findings.js.map +1 -0
  55. package/dist/document/describe-forms.js +2 -2
  56. package/dist/document/describe-forms.js.map +1 -1
  57. package/dist/document/diff.d.ts +6 -0
  58. package/dist/document/diff.d.ts.map +1 -1
  59. package/dist/document/diff.js +43 -1
  60. package/dist/document/diff.js.map +1 -1
  61. package/dist/document/edit.d.ts +1 -1
  62. package/dist/document/edit.d.ts.map +1 -1
  63. package/dist/document/edit.js +264 -23
  64. package/dist/document/edit.js.map +1 -1
  65. package/dist/document/expr/evaluate.d.ts +7 -0
  66. package/dist/document/expr/evaluate.d.ts.map +1 -1
  67. package/dist/document/expr/evaluate.js +29 -2
  68. package/dist/document/expr/evaluate.js.map +1 -1
  69. package/dist/document/format-words.d.ts +1 -0
  70. package/dist/document/format-words.d.ts.map +1 -1
  71. package/dist/document/format-words.js +2 -2
  72. package/dist/document/format-words.js.map +1 -1
  73. package/dist/document/kept-in-step-with.d.ts +20 -0
  74. package/dist/document/kept-in-step-with.d.ts.map +1 -0
  75. package/dist/document/kept-in-step-with.js +38 -0
  76. package/dist/document/kept-in-step-with.js.map +1 -0
  77. package/dist/document/kept-in-step.d.ts.map +1 -1
  78. package/dist/document/kept-in-step.js +3 -1
  79. package/dist/document/kept-in-step.js.map +1 -1
  80. package/dist/document/money.d.ts +10 -2
  81. package/dist/document/money.d.ts.map +1 -1
  82. package/dist/document/money.js +14 -5
  83. package/dist/document/money.js.map +1 -1
  84. package/dist/document/policy-words.d.ts +2 -0
  85. package/dist/document/policy-words.d.ts.map +1 -1
  86. package/dist/document/policy-words.js +11 -1
  87. package/dist/document/policy-words.js.map +1 -1
  88. package/dist/document/schema.d.ts +46 -1
  89. package/dist/document/schema.d.ts.map +1 -1
  90. package/dist/document/schema.js +48 -8
  91. package/dist/document/schema.js.map +1 -1
  92. package/dist/document/template-parse.d.ts.map +1 -1
  93. package/dist/document/template-parse.js +7 -1
  94. package/dist/document/template-parse.js.map +1 -1
  95. package/dist/document/template.d.ts +2 -0
  96. package/dist/document/template.d.ts.map +1 -1
  97. package/dist/document/template.js +10 -1
  98. package/dist/document/template.js.map +1 -1
  99. package/dist/document/to-document.js +2 -2
  100. package/dist/document/to-document.js.map +1 -1
  101. package/dist/document/workflow-spec.d.ts +72 -0
  102. package/dist/document/workflow-spec.d.ts.map +1 -0
  103. package/dist/document/workflow-spec.js +45 -0
  104. package/dist/document/workflow-spec.js.map +1 -0
  105. package/dist/document.schema.json +883 -4
  106. package/dist/head.d.ts +81 -0
  107. package/dist/head.d.ts.map +1 -0
  108. package/dist/head.js +123 -0
  109. package/dist/head.js.map +1 -0
  110. package/dist/history.d.ts.map +1 -1
  111. package/dist/history.js +2 -0
  112. package/dist/history.js.map +1 -1
  113. package/dist/index.d.ts +7 -5
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +4 -3
  116. package/dist/index.js.map +1 -1
  117. package/dist/installation.d.ts +1 -1
  118. package/dist/job-findings.d.ts +5 -0
  119. package/dist/job-findings.d.ts.map +1 -1
  120. package/dist/job-findings.js +9 -3
  121. package/dist/job-findings.js.map +1 -1
  122. package/dist/keep-linked.d.ts +45 -0
  123. package/dist/keep-linked.d.ts.map +1 -0
  124. package/dist/keep-linked.js +188 -0
  125. package/dist/keep-linked.js.map +1 -0
  126. package/dist/mutations/derive-edits.js +2 -2
  127. package/dist/mutations/propose-changes.d.ts +24 -0
  128. package/dist/mutations/propose-changes.d.ts.map +1 -0
  129. package/dist/mutations/propose-changes.js +30 -0
  130. package/dist/mutations/propose-changes.js.map +1 -0
  131. package/dist/mutations/vote-suggestion.d.ts +30 -0
  132. package/dist/mutations/vote-suggestion.d.ts.map +1 -1
  133. package/dist/mutations/vote-suggestion.js +23 -0
  134. package/dist/mutations/vote-suggestion.js.map +1 -1
  135. package/dist/mutations/words.js +3 -3
  136. package/dist/ops/digest.d.ts +3 -1
  137. package/dist/ops/digest.d.ts.map +1 -1
  138. package/dist/ops/digest.js +7 -2
  139. package/dist/ops/digest.js.map +1 -1
  140. package/dist/ops/lineage.d.ts +19 -2
  141. package/dist/ops/lineage.d.ts.map +1 -1
  142. package/dist/ops/lineage.js +8 -4
  143. package/dist/ops/lineage.js.map +1 -1
  144. package/dist/ops/log.d.ts.map +1 -1
  145. package/dist/ops/log.js +13 -2
  146. package/dist/ops/log.js.map +1 -1
  147. package/dist/ops/suggestions.d.ts +47 -5
  148. package/dist/ops/suggestions.d.ts.map +1 -1
  149. package/dist/ops/suggestions.js +88 -13
  150. package/dist/ops/suggestions.js.map +1 -1
  151. package/dist/ops/tidying.d.ts.map +1 -1
  152. package/dist/ops/tidying.js +6 -1
  153. package/dist/ops/tidying.js.map +1 -1
  154. package/dist/ops/types.d.ts +28 -0
  155. package/dist/ops/types.d.ts.map +1 -1
  156. package/dist/ops/undo.d.ts.map +1 -1
  157. package/dist/ops/undo.js +17 -0
  158. package/dist/ops/undo.js.map +1 -1
  159. package/dist/permissions/policy.d.ts +7 -0
  160. package/dist/permissions/policy.d.ts.map +1 -1
  161. package/dist/permissions/policy.js +12 -0
  162. package/dist/permissions/policy.js.map +1 -1
  163. package/dist/permissions/types.d.ts +27 -0
  164. package/dist/permissions/types.d.ts.map +1 -1
  165. package/dist/permissions/types.js.map +1 -1
  166. package/dist/places.d.ts +10 -0
  167. package/dist/places.d.ts.map +1 -1
  168. package/dist/places.js +35 -1
  169. package/dist/places.js.map +1 -1
  170. package/dist/scene.d.ts +2 -0
  171. package/dist/scene.d.ts.map +1 -1
  172. package/dist/scene.js +2 -0
  173. package/dist/scene.js.map +1 -1
  174. package/dist/schema/amount-mark.d.ts +2 -0
  175. package/dist/schema/amount-mark.d.ts.map +1 -1
  176. package/dist/schema/amount-mark.js.map +1 -1
  177. package/dist/schema/amount-words.js +2 -2
  178. package/dist/schema/amount-words.js.map +1 -1
  179. package/dist/schema/choice-words.js +2 -2
  180. package/dist/schema/define-node.d.ts +8 -2
  181. package/dist/schema/define-node.d.ts.map +1 -1
  182. package/dist/schema/define-node.js +2 -2
  183. package/dist/schema/define-node.js.map +1 -1
  184. package/dist/schema/humanize.d.ts +17 -0
  185. package/dist/schema/humanize.d.ts.map +1 -1
  186. package/dist/schema/humanize.js +28 -1
  187. package/dist/schema/humanize.js.map +1 -1
  188. package/dist/schema/reading.d.ts +8 -0
  189. package/dist/schema/reading.d.ts.map +1 -1
  190. package/dist/schema/reading.js +16 -2
  191. package/dist/schema/reading.js.map +1 -1
  192. package/dist/schema/types.d.ts +8 -0
  193. package/dist/schema/types.d.ts.map +1 -1
  194. package/dist/schema/value-words.js +2 -2
  195. package/dist/schema/value-words.js.map +1 -1
  196. package/dist/starting-document.d.ts +16 -3
  197. package/dist/starting-document.d.ts.map +1 -1
  198. package/dist/starting-document.js +32 -5
  199. package/dist/starting-document.js.map +1 -1
  200. package/dist/store.d.ts +47 -2
  201. package/dist/store.d.ts.map +1 -1
  202. package/dist/store.js +176 -13
  203. package/dist/store.js.map +1 -1
  204. package/dist/sync/connection.d.ts +24 -5
  205. package/dist/sync/connection.d.ts.map +1 -1
  206. package/dist/sync/connection.js +168 -31
  207. package/dist/sync/connection.js.map +1 -1
  208. package/dist/sync/engine.d.ts +97 -0
  209. package/dist/sync/engine.d.ts.map +1 -1
  210. package/dist/sync/engine.js +159 -1
  211. package/dist/sync/engine.js.map +1 -1
  212. package/dist/sync/google-calendar.d.ts.map +1 -1
  213. package/dist/sync/google-calendar.js +18 -1
  214. package/dist/sync/google-calendar.js.map +1 -1
  215. package/dist/sync/guest-words.d.ts +9 -0
  216. package/dist/sync/guest-words.d.ts.map +1 -0
  217. package/dist/sync/guest-words.js +41 -0
  218. package/dist/sync/guest-words.js.map +1 -0
  219. package/dist/sync/index.d.ts +8 -5
  220. package/dist/sync/index.d.ts.map +1 -1
  221. package/dist/sync/index.js +2 -0
  222. package/dist/sync/index.js.map +1 -1
  223. package/dist/sync/notion-stub.d.ts +4 -1
  224. package/dist/sync/notion-stub.d.ts.map +1 -1
  225. package/dist/sync/notion-stub.js +40 -0
  226. package/dist/sync/notion-stub.js.map +1 -1
  227. package/dist/sync/notion.d.ts +44 -2
  228. package/dist/sync/notion.d.ts.map +1 -1
  229. package/dist/sync/notion.js +289 -143
  230. package/dist/sync/notion.js.map +1 -1
  231. package/dist/sync/status.d.ts +43 -0
  232. package/dist/sync/status.d.ts.map +1 -0
  233. package/dist/sync/status.js +46 -0
  234. package/dist/sync/status.js.map +1 -0
  235. package/dist/sync/types.d.ts +60 -0
  236. package/dist/sync/types.d.ts.map +1 -1
  237. package/dist/sync/types.js.map +1 -1
  238. package/dist/theme/marks.d.ts +12 -0
  239. package/dist/theme/marks.d.ts.map +1 -1
  240. package/dist/theme/marks.js +5 -0
  241. package/dist/theme/marks.js.map +1 -1
  242. package/dist/tidying.d.ts +53 -4
  243. package/dist/tidying.d.ts.map +1 -1
  244. package/dist/tidying.js +110 -8
  245. package/dist/tidying.js.map +1 -1
  246. package/dist/validate-graph.d.ts +2 -1
  247. package/dist/validate-graph.d.ts.map +1 -1
  248. package/dist/validate-graph.js +32 -1
  249. package/dist/validate-graph.js.map +1 -1
  250. package/dist/version.d.ts +1 -1
  251. package/dist/version.js +1 -1
  252. package/dist/words.d.ts +4 -1
  253. package/dist/words.d.ts.map +1 -1
  254. package/dist/words.js +4 -1
  255. package/dist/words.js.map +1 -1
  256. package/dist/workflow-shape.d.ts +223 -0
  257. package/dist/workflow-shape.d.ts.map +1 -0
  258. package/dist/workflow-shape.js +31 -0
  259. package/dist/workflow-shape.js.map +1 -0
  260. package/dist/workflows/findings.d.ts +13 -0
  261. package/dist/workflows/findings.d.ts.map +1 -0
  262. package/dist/workflows/findings.js +157 -0
  263. package/dist/workflows/findings.js.map +1 -0
  264. package/dist/workflows/generate-words.d.ts +12 -0
  265. package/dist/workflows/generate-words.d.ts.map +1 -0
  266. package/dist/workflows/generate-words.js +25 -0
  267. package/dist/workflows/generate-words.js.map +1 -0
  268. package/dist/workflows/generate.d.ts +59 -0
  269. package/dist/workflows/generate.d.ts.map +1 -0
  270. package/dist/workflows/generate.js +165 -0
  271. package/dist/workflows/generate.js.map +1 -0
  272. package/dist/workflows/judging.d.ts +17 -0
  273. package/dist/workflows/judging.d.ts.map +1 -0
  274. package/dist/workflows/judging.js +11 -0
  275. package/dist/workflows/judging.js.map +1 -0
  276. package/dist/workflows/next.d.ts +18 -0
  277. package/dist/workflows/next.d.ts.map +1 -0
  278. package/dist/workflows/next.js +75 -0
  279. package/dist/workflows/next.js.map +1 -0
  280. package/dist/workflows/on-the-map.d.ts +79 -0
  281. package/dist/workflows/on-the-map.d.ts.map +1 -0
  282. package/dist/workflows/on-the-map.js +96 -0
  283. package/dist/workflows/on-the-map.js.map +1 -0
  284. package/dist/workflows/policies.d.ts +39 -0
  285. package/dist/workflows/policies.d.ts.map +1 -0
  286. package/dist/workflows/policies.js +95 -0
  287. package/dist/workflows/policies.js.map +1 -0
  288. package/dist/workflows/resolve.d.ts +55 -0
  289. package/dist/workflows/resolve.d.ts.map +1 -0
  290. package/dist/workflows/resolve.js +57 -0
  291. package/dist/workflows/resolve.js.map +1 -0
  292. package/dist/workflows/schedule.d.ts +28 -0
  293. package/dist/workflows/schedule.d.ts.map +1 -0
  294. package/dist/workflows/schedule.js +160 -0
  295. package/dist/workflows/schedule.js.map +1 -0
  296. package/dist/workflows/step-act.d.ts +6 -0
  297. package/dist/workflows/step-act.d.ts.map +1 -0
  298. package/dist/workflows/step-act.js +79 -0
  299. package/dist/workflows/step-act.js.map +1 -0
  300. package/dist/workflows/step-agent.d.ts +4 -0
  301. package/dist/workflows/step-agent.d.ts.map +1 -0
  302. package/dist/workflows/step-agent.js +55 -0
  303. package/dist/workflows/step-agent.js.map +1 -0
  304. package/dist/workflows/step-archive.d.ts +8 -0
  305. package/dist/workflows/step-archive.d.ts.map +1 -0
  306. package/dist/workflows/step-archive.js +74 -0
  307. package/dist/workflows/step-archive.js.map +1 -0
  308. package/dist/workflows/step-classify.d.ts +25 -0
  309. package/dist/workflows/step-classify.d.ts.map +1 -0
  310. package/dist/workflows/step-classify.js +160 -0
  311. package/dist/workflows/step-classify.js.map +1 -0
  312. package/dist/workflows/step-generate.d.ts +7 -0
  313. package/dist/workflows/step-generate.d.ts.map +1 -0
  314. package/dist/workflows/step-generate.js +185 -0
  315. package/dist/workflows/step-generate.js.map +1 -0
  316. package/dist/workflows/steps.d.ts +75 -0
  317. package/dist/workflows/steps.d.ts.map +1 -0
  318. package/dist/workflows/steps.js +40 -0
  319. package/dist/workflows/steps.js.map +1 -0
  320. package/dist/workflows/triggered.d.ts +35 -0
  321. package/dist/workflows/triggered.d.ts.map +1 -0
  322. package/dist/workflows/triggered.js +69 -0
  323. package/dist/workflows/triggered.js.map +1 -0
  324. package/dist/workflows/values.d.ts +28 -0
  325. package/dist/workflows/values.d.ts.map +1 -0
  326. package/dist/workflows/values.js +75 -0
  327. package/dist/workflows/values.js.map +1 -0
  328. package/dist/workflows/words.d.ts +10 -0
  329. package/dist/workflows/words.d.ts.map +1 -0
  330. package/dist/workflows/words.js +30 -0
  331. package/dist/workflows/words.js.map +1 -0
  332. package/dist/workflows/world.d.ts +23 -0
  333. package/dist/workflows/world.d.ts.map +1 -0
  334. package/dist/workflows/world.js +50 -0
  335. package/dist/workflows/world.js.map +1 -0
  336. package/dist/workflows.d.ts +35 -0
  337. package/dist/workflows.d.ts.map +1 -0
  338. package/dist/workflows.js +20 -0
  339. package/dist/workflows.js.map +1 -0
  340. package/package.json +12 -2
@@ -0,0 +1,79 @@
1
+ import type { GraviewApp } from "../app.js";
2
+ import type { AppWorkflows } from "../workflow-shape.js";
3
+ import type { AnySchema } from "../schema/schema.js";
4
+ /** A workflow as the Scene draws it: its name, title and status, and the kinds it reads and writes. */
5
+ export interface MapWorkflow {
6
+ readonly name: string;
7
+ readonly title: string;
8
+ readonly status: "active" | "paused";
9
+ /** Kinds its steps read, and what starts it on a change, in the order they say them. */
10
+ readonly reads: readonly string[];
11
+ /** Kinds its steps may write. */
12
+ readonly writes: readonly string[];
13
+ }
14
+ /** An act as the map reads it: the kinds it acts on and the kinds it makes. */
15
+ export interface MapAct {
16
+ readonly name: string;
17
+ readonly subject?: {
18
+ readonly kinds: readonly string[] | "*";
19
+ } | undefined;
20
+ readonly creates?: readonly string[] | undefined;
21
+ }
22
+ /**
23
+ * Every workflow the app declares (`declaredWorkflows(app)`, or a
24
+ * compiled app's document's `workflows`), as the Scene draws it, in
25
+ * declared order, given every act the app has (`store.allMutations()`: the derived
26
+ * ones too). Dreaming, built in and at work on every district, is not drawn.
27
+ */
28
+ export declare function workflowsOnTheMap<S extends AnySchema>(app: Pick<GraviewApp<S>, "schema">, workflows: AppWorkflows | undefined, acts: readonly MapAct[]): readonly MapWorkflow[];
29
+ /** A plot as a spot is found beside it: its corner cell and its side, in lattice cells. */
30
+ export interface SpotPlot {
31
+ readonly col: number;
32
+ readonly row: number;
33
+ readonly side: number;
34
+ }
35
+ /** Where a workflow stands on the lattice: the kind it stands beside, and the point, in lattice cells. */
36
+ export interface WorkflowSpot {
37
+ readonly name: string;
38
+ /** The district it stands beside: the first kind it writes that is on the map, else the first it reads. */
39
+ readonly beside: string;
40
+ readonly col: number;
41
+ readonly row: number;
42
+ }
43
+ /**
44
+ * WHERE EACH WORKFLOW STANDS: in the street along the right edge of the
45
+ * district it writes first — a cell out from the curb, down the edge, a
46
+ * cell apart for a second and a third beside the same district — so it
47
+ * reads as at work on that district and never stands on any district's
48
+ * ground. One that touches no kind on the map is not placed.
49
+ */
50
+ export declare function workflowSpots(workflows: readonly MapWorkflow[], plots: ReadonlyMap<string, SpotPlot>): readonly WorkflowSpot[];
51
+ /** How many records a run made, changed, set aside or suggested: the ids, or only how many there were. */
52
+ export type RunCount = number | readonly string[];
53
+ /**
54
+ * A run as `lastRunWords` reads it: `WorkflowRun` from
55
+ * `@graview/tools/workflows`, or any record with these. Each of `made`,
56
+ * `changed`, `archived` and `suggested` is the ids or a count; a host that
57
+ * keeps only counts sends the numbers, and the words are the same.
58
+ */
59
+ export interface RunSaid {
60
+ readonly finished: string;
61
+ readonly outcome: "ok" | "nothing-new" | "partial" | "held" | "failed";
62
+ readonly dry: boolean;
63
+ readonly made: RunCount;
64
+ readonly changed: RunCount;
65
+ readonly archived: RunCount;
66
+ readonly suggested: RunCount;
67
+ }
68
+ /** How many a count says: the number, or how many ids it holds. Anything else is none. */
69
+ export declare const runCount: (count: RunCount | undefined) => number;
70
+ /** "just now", "5 minutes ago", "2 hours ago", "yesterday", "3 days ago": how long before `now` a moment was. */
71
+ export declare function agoWords(at: string | number | Date, now?: string | number | Date): string;
72
+ /**
73
+ * HOW THE LAST RUN WENT, in words a person reads under a workflow on the
74
+ * map: "Last ran 2 hours ago: made 28, changed 3", "Last ran yesterday:
75
+ * nothing new", "Last ran 5 minutes ago, as a dry run: would make 4",
76
+ * "Last ran 3 days ago and failed". With no run, "Has not run yet".
77
+ */
78
+ export declare function lastRunWords(run: RunSaid | undefined, now?: string | number | Date): string;
79
+ //# sourceMappingURL=on-the-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-the-map.d.ts","sourceRoot":"","sources":["../../src/workflows/on-the-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { subjectKindsOf } from "../mutations/derive-edits.js";
2
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3
+ const strings = (value) => (typeof value === "string" ? [value] : Array.isArray(value) ? value.filter((one) => typeof one === "string") : []);
4
+ /**
5
+ * Every workflow the app declares (`declaredWorkflows(app)`, or a
6
+ * compiled app's document's `workflows`), as the Scene draws it, in
7
+ * declared order, given every act the app has (`store.allMutations()`: the derived
8
+ * ones too). Dreaming, built in and at work on every district, is not drawn.
9
+ */
10
+ export function workflowsOnTheMap(app, workflows, acts) {
11
+ const declared = Object.entries(workflows ?? {});
12
+ if (declared.length === 0)
13
+ return [];
14
+ const kinds = new Set(app.schema.kinds);
15
+ const byName = new Map(acts.map((act) => [act.name, act]));
16
+ const actKinds = (name) => {
17
+ const act = byName.get(name);
18
+ return act ? [...subjectKindsOf(app.schema, act), ...(act.creates ?? [])] : [];
19
+ };
20
+ return declared.map(([name, workflow]) => {
21
+ const reads = [];
22
+ const writes = [];
23
+ // What starts it on a change reads that kind: a workflow run when a grocery list is made is wired to grocery lists.
24
+ for (const trigger of (workflow.when ?? []))
25
+ reads.push(...strings(trigger["made"]), ...strings(trigger["changed"]));
26
+ for (const step of (workflow.steps ?? [])) {
27
+ const over = isRecord(step["over"]) ? strings(step["over"]["kind"]) : [];
28
+ const from = Array.isArray(step["from"]) ? step["from"].flatMap((source) => (isRecord(source) ? strings(source["kind"]) : [])) : [];
29
+ reads.push(...over, ...strings(step["reads"]), ...from, ...strings(step["archive"]), ...strings(step["classify"]));
30
+ writes.push(...[...strings(step["act"]), ...strings(step["acts"])].flatMap(actKinds), ...strings(step["generate"]), ...strings(step["archive"]), ...strings(step["classify"]));
31
+ }
32
+ const known = (list) => [...new Set(list)].filter((kind) => kinds.has(kind));
33
+ return { name, title: workflow.title, status: workflow.status === "paused" ? "paused" : "active", reads: known(reads), writes: known(writes) };
34
+ });
35
+ }
36
+ /**
37
+ * WHERE EACH WORKFLOW STANDS: in the street along the right edge of the
38
+ * district it writes first — a cell out from the curb, down the edge, a
39
+ * cell apart for a second and a third beside the same district — so it
40
+ * reads as at work on that district and never stands on any district's
41
+ * ground. One that touches no kind on the map is not placed.
42
+ */
43
+ export function workflowSpots(workflows, plots) {
44
+ const taken = new Map();
45
+ const out = [];
46
+ for (const workflow of workflows) {
47
+ const beside = [...workflow.writes, ...workflow.reads].find((kind) => plots.has(kind));
48
+ if (beside === undefined)
49
+ continue;
50
+ const plot = plots.get(beside);
51
+ const k = taken.get(beside) ?? 0;
52
+ taken.set(beside, k + 1);
53
+ out.push({ name: workflow.name, beside, col: plot.col + plot.side + 1, row: plot.row + 0.5 + k });
54
+ }
55
+ return out;
56
+ }
57
+ /** How many a count says: the number, or how many ids it holds. Anything else is none. */
58
+ export const runCount = (count) => (typeof count === "number" ? (Number.isFinite(count) && count > 0 ? Math.floor(count) : 0) : Array.isArray(count) ? count.length : 0);
59
+ /** "just now", "5 minutes ago", "2 hours ago", "yesterday", "3 days ago": how long before `now` a moment was. */
60
+ export function agoWords(at, now = Date.now()) {
61
+ const minutes = Math.floor((new Date(now).getTime() - new Date(at).getTime()) / 60_000);
62
+ if (!Number.isFinite(minutes) || minutes < 1)
63
+ return "just now";
64
+ if (minutes < 60)
65
+ return minutes === 1 ? "a minute ago" : `${minutes} minutes ago`;
66
+ const hours = Math.floor(minutes / 60);
67
+ if (hours < 24)
68
+ return hours === 1 ? "an hour ago" : `${hours} hours ago`;
69
+ const days = Math.floor(hours / 24);
70
+ return days === 1 ? "yesterday" : `${days} days ago`;
71
+ }
72
+ /**
73
+ * HOW THE LAST RUN WENT, in words a person reads under a workflow on the
74
+ * map: "Last ran 2 hours ago: made 28, changed 3", "Last ran yesterday:
75
+ * nothing new", "Last ran 5 minutes ago, as a dry run: would make 4",
76
+ * "Last ran 3 days ago and failed". With no run, "Has not run yet".
77
+ */
78
+ export function lastRunWords(run, now = Date.now()) {
79
+ if (!run)
80
+ return "Has not run yet";
81
+ const when = `Last ran ${agoWords(run.finished, now)}`;
82
+ if (run.outcome === "failed")
83
+ return `${when} and failed`;
84
+ if (run.outcome === "held")
85
+ return `${when}: held back`;
86
+ const counts = [
87
+ [runCount(run.made), run.dry ? "would make" : "made"],
88
+ [runCount(run.changed), run.dry ? "would change" : "changed"],
89
+ [runCount(run.archived), run.dry ? "would set aside" : "set aside"],
90
+ [runCount(run.suggested), run.dry ? "would suggest" : "suggested"],
91
+ ];
92
+ const said = counts.filter(([count]) => count > 0).map(([count, verb]) => `${verb} ${count}`);
93
+ const what = said.length > 0 ? said.join(", ") : "nothing new";
94
+ return `${when}${run.dry ? ", as a dry run" : ""}: ${what}${run.outcome === "partial" ? " (part of it did not run)" : ""}`;
95
+ }
96
+ //# sourceMappingURL=on-the-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-the-map.js","sourceRoot":"","sources":["../../src/workflows/on-the-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { AnyGraphNode, GraphReader } from "../graph/types.js";
2
+ import type { AnySchema } from "../schema/schema.js";
3
+ import type { WorkflowFinding } from "./steps.js";
4
+ import type { WorkflowWorld } from "./world.js";
5
+ /** One rule a workflow follows: the record it is, its words, its place, and what it applies to. */
6
+ export interface WorkflowPolicy {
7
+ readonly id: string;
8
+ readonly label: string;
9
+ /** The rule, verbatim. */
10
+ readonly action: string;
11
+ readonly order?: number;
12
+ /** A kind's name or a rule-language condition; absent, every record. */
13
+ readonly appliesTo?: string;
14
+ }
15
+ /**
16
+ * THE RULES THAT STAND, IN ORDER: the live records of `follows` whose
17
+ * status does not retire them, by `order` (those with none last), then by
18
+ * label. Nothing when the workflow follows nothing or the kind is not the app's.
19
+ */
20
+ export declare function policiesOf(graph: Pick<GraphReader, "getNode"> & {
21
+ nodesOfKind(kind: string): readonly AnyGraphNode[];
22
+ }, schema: AnySchema, follows: string | undefined): WorkflowPolicy[];
23
+ /**
24
+ * WHETHER A RULE APPLIES TO A RECORD: one that says nothing of what it
25
+ * applies to applies to every record; one that names a kind (its name, or
26
+ * its plural) to that kind's; anything else is read as a condition in the
27
+ * rule language with the record as its subject — a mistake applies to nothing.
28
+ */
29
+ export declare function policyApplies(policy: WorkflowPolicy, record: AnyGraphNode, graph: GraphReader, schema: AnySchema, today?: string): boolean;
30
+ /** Whether a rule says to keep what it applies to: its words begin "keep", "never archive" or "do not archive". */
31
+ export declare const keeps: (policy: WorkflowPolicy) => boolean;
32
+ /**
33
+ * THE RULES, AS AN AGENT STEP IS HANDED THEM: verbatim, numbered in order,
34
+ * under a line that says they are the app's own — or "" when none stand.
35
+ */
36
+ export declare function policyInstruction(policies: readonly WorkflowPolicy[]): string;
37
+ /** What the checker says of `follows`: a kind the app has, or a finding with the fix. */
38
+ export declare function followsFindings(follows: string | undefined, world: WorkflowWorld): WorkflowFinding[];
39
+ //# sourceMappingURL=policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../src/workflows/policies.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyBhD,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAYD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG;IAAE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAAA;CAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,EAAE,CAqBzL;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAe1I;AAED,mHAAmH;AACnH,eAAO,MAAM,KAAK,GAAI,QAAQ,cAAc,KAAG,OAAyF,CAAC;AAEzI;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAI7E;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,eAAe,EAAE,CAYpG"}
@@ -0,0 +1,95 @@
1
+ import { shapesFor } from "../document/computed-values.js";
2
+ import { evaluateExpr, ExprEvalError, NodeSet } from "../document/expr/evaluate.js";
3
+ import { ExprSyntaxError, parseExpr } from "../document/expr/parse.js";
4
+ import { labelOf, nounOf, pluralOf } from "../schema/define-node.js";
5
+ const ACTION = ["action", "rule", "instruction", "text"];
6
+ const ORDER = ["order", "rank", "priority"];
7
+ const APPLIES = ["appliesTo", "applies-to", "applies_to", "scope"];
8
+ const RETIRED = /^(retired|off|inactive|paused|draft|archived|disabled)$/i;
9
+ const first = (node, names) => names.map((name) => node[name]).find((value) => value !== undefined && value !== null && value !== "");
10
+ /** Whether a policy record stands: not retired by its status, nor `active: false`. */
11
+ const stands = (node) => node["active"] !== false && !(typeof node["status"] === "string" && RETIRED.test(node["status"].trim()));
12
+ /**
13
+ * THE RULES THAT STAND, IN ORDER: the live records of `follows` whose
14
+ * status does not retire them, by `order` (those with none last), then by
15
+ * label. Nothing when the workflow follows nothing or the kind is not the app's.
16
+ */
17
+ export function policiesOf(graph, schema, follows) {
18
+ if (follows === undefined || !schema.tryDefinition(follows))
19
+ return [];
20
+ const definition = schema.tryDefinition(follows);
21
+ return graph
22
+ .nodesOfKind(follows)
23
+ .filter((node) => stands(node))
24
+ .map((node) => {
25
+ const fields = node;
26
+ const label = labelOf(definition, node);
27
+ const action = first(fields, ACTION);
28
+ const order = first(fields, ORDER);
29
+ const applies = first(fields, APPLIES);
30
+ return {
31
+ id: node.id,
32
+ label,
33
+ action: typeof action === "string" ? action.trim() : label,
34
+ ...(typeof order === "number" && Number.isFinite(order) ? { order } : {}),
35
+ ...(typeof applies === "string" && applies.trim() !== "" ? { appliesTo: applies.trim() } : {}),
36
+ };
37
+ })
38
+ .sort((a, b) => (a.order ?? Infinity) - (b.order ?? Infinity) || a.label.localeCompare(b.label));
39
+ }
40
+ /**
41
+ * WHETHER A RULE APPLIES TO A RECORD: one that says nothing of what it
42
+ * applies to applies to every record; one that names a kind (its name, or
43
+ * its plural) to that kind's; anything else is read as a condition in the
44
+ * rule language with the record as its subject — a mistake applies to nothing.
45
+ */
46
+ export function policyApplies(policy, record, graph, schema, today) {
47
+ const said = policy.appliesTo;
48
+ if (said === undefined)
49
+ return true;
50
+ const words = said.toLowerCase();
51
+ if (schema.tryDefinition(said))
52
+ return said === record.kind;
53
+ const names = (kind) => [pluralOf(schema, kind).toLowerCase(), nounOf(schema.tryDefinition(kind), kind).toLowerCase()];
54
+ if (names(record.kind).includes(words))
55
+ return true;
56
+ if (schema.definitions.some((one) => names(one.kind).includes(words)))
57
+ return false;
58
+ try {
59
+ const value = evaluateExpr(parseExpr(said), { graph, subject: record, kinds: shapesFor(schema), ...(today ? { today } : {}) });
60
+ return value instanceof NodeSet ? value.nodes.length > 0 : Array.isArray(value) ? value.length > 0 : value === true;
61
+ }
62
+ catch (error) {
63
+ if (error instanceof ExprEvalError || error instanceof ExprSyntaxError)
64
+ return false;
65
+ throw error;
66
+ }
67
+ }
68
+ /** Whether a rule says to keep what it applies to: its words begin "keep", "never archive" or "do not archive". */
69
+ export const keeps = (policy) => /^(keep|never archive|do not archive|don['’]t archive)\b/i.test(policy.action);
70
+ /**
71
+ * THE RULES, AS AN AGENT STEP IS HANDED THEM: verbatim, numbered in order,
72
+ * under a line that says they are the app's own — or "" when none stand.
73
+ */
74
+ export function policyInstruction(policies) {
75
+ if (policies.length === 0)
76
+ return "";
77
+ const lines = policies.map((policy, at) => `${at + 1}. ${policy.action === policy.label ? policy.action : `${policy.label}: ${policy.action}`}${policy.appliesTo ? ` (applies to ${policy.appliesTo})` : ""}`);
78
+ return `\n\nFollow these rules, which the app's own people keep, in order; an earlier one wins:\n${lines.join("\n")}`;
79
+ }
80
+ /** What the checker says of `follows`: a kind the app has, or a finding with the fix. */
81
+ export function followsFindings(follows, world) {
82
+ if (follows === undefined || world.kinds.has(follows))
83
+ return [];
84
+ const kinds = [...world.kinds.keys()];
85
+ return [
86
+ {
87
+ code: "workflow-follows-unknown",
88
+ severity: "error",
89
+ path: "follows",
90
+ message: `The workflow follows the rules kept as "${follows}" records, and "${follows}" is not a kind of this app.`,
91
+ fix: `Name the kind its rules are kept as: ${kinds.map((kind) => `"${kind}"`).join(", ") || "none"}.`,
92
+ },
93
+ ];
94
+ }
95
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/workflows/policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { GraviewApp } from "../app.js";
2
+ import type { AnySchema } from "../schema/schema.js";
3
+ import type { Author } from "../ops/types.js";
4
+ import type { AppWorkflows, WorkflowApproval, WorkflowDeclaration, WorkflowStep, WorkflowTrigger } from "../workflow-shape.js";
5
+ import { type WorkflowWorld } from "./world.js";
6
+ /** A workflow as `workflowsOf` resolves it. */
7
+ export interface ResolvedWorkflow {
8
+ readonly name: string;
9
+ readonly title: string;
10
+ readonly when: readonly WorkflowTrigger[];
11
+ readonly status: "active" | "paused";
12
+ /** What its changes become when a step says nothing of its own. */
13
+ readonly approve: WorkflowApproval;
14
+ readonly steps: readonly WorkflowStep[];
15
+ /** "Every Sunday at 6 PM: fill out next week's events". */
16
+ readonly words: string;
17
+ /** The kinds its steps read and may write. */
18
+ readonly reads: readonly string[];
19
+ readonly writes: readonly string[];
20
+ /** Whether a step writes to another system through a connection: what makes "ask" the default. */
21
+ readonly sendsOut: boolean;
22
+ /** Dreaming: the framework's, not the declaration's. */
23
+ readonly builtIn?: true;
24
+ }
25
+ /** The built-in workflow's name. */
26
+ export declare const DREAMING = "dreaming";
27
+ /** The automated author a workflow runs as: `workflow:<name>`, named by its title. */
28
+ export declare const workflowAuthor: (workflow: {
29
+ readonly name: string;
30
+ readonly title: string;
31
+ }) => Author;
32
+ /** What a workflow's steps read and write, and whether one writes through a connection. */
33
+ export declare function workflowReach(steps: readonly WorkflowStep[], world: WorkflowWorld): {
34
+ reads: string[];
35
+ writes: string[];
36
+ sendsOut: boolean;
37
+ };
38
+ /** One declared workflow, resolved against what the app may name. */
39
+ export declare function resolveWorkflow(name: string, declared: WorkflowDeclaration, world: WorkflowWorld): ResolvedWorkflow;
40
+ /**
41
+ * AN APP'S WORKFLOWS AS DECLARED: `defineApp({ workflows })`'s, or the
42
+ * document's an app was compiled from (`documentOf`) — read there rather
43
+ * than copied onto the compiled app, so a page that draws the app carries
44
+ * none of them.
45
+ */
46
+ export declare const declaredWorkflows: (app: object) => AppWorkflows | undefined;
47
+ /** Dreaming, as a workflow: every night at three, suggesting what it is not sure of. */
48
+ export declare const dreamingWorkflow: () => ResolvedWorkflow;
49
+ /**
50
+ * AN APP'S WORKFLOWS, RESOLVED, in the order declared, with dreaming last
51
+ * (`builtIn: true`) unless the app declares a workflow of that name or the
52
+ * actor has nothing it may tidy.
53
+ */
54
+ export declare function workflowsOf<S extends AnySchema>(app: GraviewApp<S>): ResolvedWorkflow[];
55
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/workflows/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE/H,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAcpE,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;CACzB;AAED,oCAAoC;AACpC,eAAO,MAAM,QAAQ,aAAa,CAAC;AAEnC,sFAAsF;AACtF,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,MAAsG,CAAC;AAEpM,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAU5I;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAInH;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,YAAY,GAAG,SAAwH,CAAC;AAKxL,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,QAAO,gBAGnC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAOvF"}
@@ -0,0 +1,57 @@
1
+ import { documentOf } from "../document/remembered.js";
2
+ import { stepKindOf } from "./steps.js";
3
+ import { workflowWorldOfApp } from "./world.js";
4
+ import { workflowWords } from "./words.js";
5
+ /** The built-in workflow's name. */
6
+ export const DREAMING = "dreaming";
7
+ /** The automated author a workflow runs as: `workflow:<name>`, named by its title. */
8
+ export const workflowAuthor = (workflow) => ({ kind: "system", id: `workflow:${workflow.name}`, name: workflow.title, automated: true });
9
+ /** What a workflow's steps read and write, and whether one writes through a connection. */
10
+ export function workflowReach(steps, world) {
11
+ const reads = new Set();
12
+ const writes = new Set();
13
+ for (const step of steps) {
14
+ const touched = stepKindOf(step)?.touches(step, world);
15
+ for (const kind of touched?.reads ?? [])
16
+ reads.add(kind);
17
+ for (const kind of touched?.writes ?? [])
18
+ writes.add(kind);
19
+ }
20
+ const sent = [...world.connections.values()].some((connection) => connection.writes && connection.kinds.some((kind) => writes.has(kind)));
21
+ return { reads: [...reads], writes: [...writes], sendsOut: sent };
22
+ }
23
+ /** One declared workflow, resolved against what the app may name. */
24
+ export function resolveWorkflow(name, declared, world) {
25
+ const reach = workflowReach(declared.steps ?? [], world);
26
+ const resolved = { name, title: declared.title, when: declared.when ?? [], status: declared.status ?? "active", approve: declared.approve ?? (reach.sendsOut ? "ask" : "apply"), steps: declared.steps ?? [] };
27
+ return { ...resolved, words: workflowWords(resolved, world.noun), ...reach };
28
+ }
29
+ /**
30
+ * AN APP'S WORKFLOWS AS DECLARED: `defineApp({ workflows })`'s, or the
31
+ * document's an app was compiled from (`documentOf`) — read there rather
32
+ * than copied onto the compiled app, so a page that draws the app carries
33
+ * none of them.
34
+ */
35
+ export const declaredWorkflows = (app) => app.workflows ?? documentOf(app)?.workflows;
36
+ /** Whether the app's own actor has anything it may tidy: some kind that does not say `tidying: "never"`. */
37
+ const actorTidies = (schema) => schema.kinds.some((kind) => schema.tryDefinition(kind)?.tidying !== "never");
38
+ /** Dreaming, as a workflow: every night at three, suggesting what it is not sure of. */
39
+ export const dreamingWorkflow = () => {
40
+ const workflow = { name: DREAMING, title: "Tidy the app overnight", when: [{ every: "day 03:00" }], status: "active", approve: "suggest", steps: [] };
41
+ return { ...workflow, words: workflowWords(workflow), reads: [], writes: [], sendsOut: false, builtIn: true };
42
+ };
43
+ /**
44
+ * AN APP'S WORKFLOWS, RESOLVED, in the order declared, with dreaming last
45
+ * (`builtIn: true`) unless the app declares a workflow of that name or the
46
+ * actor has nothing it may tidy.
47
+ */
48
+ export function workflowsOf(app) {
49
+ const workflows = declaredWorkflows(app);
50
+ const declared = Object.entries(workflows ?? {});
51
+ const world = declared.length > 0 ? workflowWorldOfApp(app) : undefined;
52
+ const out = declared.map(([name, workflow]) => resolveWorkflow(name, workflow, world));
53
+ if (!workflows?.[DREAMING] && actorTidies(app.schema))
54
+ out.push(dreamingWorkflow());
55
+ return out;
56
+ }
57
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/workflows/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** A schedule as a table: which minutes, hours, days of the month, months (1–12) and weekdays (0 Sunday – 6). */
2
+ export interface Schedule {
3
+ readonly minutes: ReadonlySet<number>;
4
+ readonly hours: ReadonlySet<number>;
5
+ readonly days: ReadonlySet<number>;
6
+ readonly months: ReadonlySet<number>;
7
+ readonly weekdays: ReadonlySet<number>;
8
+ /** Whether days and weekdays were each narrowed: cron runs on either, when both are. */
9
+ readonly daysSaid: boolean;
10
+ readonly weekdaysSaid: boolean;
11
+ }
12
+ /** What the words a schedule takes are, said when one cannot be read. */
13
+ export declare const SCHEDULE_WORDS = "\"hour\", \"day\", \"day 03:00\", \"weekday 09:00\", \"sunday 18:00\" (any weekday), \"month 1 09:00\", or five-field cron like \"0 18 * * 0\"";
14
+ /** A schedule in words, or a sentence saying what could not be read. */
15
+ export declare function scheduleOfWords(words: string): Schedule | string;
16
+ /** A schedule in five-field cron, or a sentence saying what could not be read. */
17
+ export declare function scheduleOfCron(cron: string): Schedule | string;
18
+ /** A clock trigger's schedule, or a sentence; undefined for a trigger that is no clock. */
19
+ export declare function scheduleOf(trigger: {
20
+ readonly every?: string;
21
+ readonly cron?: string;
22
+ }): Schedule | string | undefined;
23
+ /** A clock trigger as a person reads it: "Every Sunday at 6 PM", "Every hour", "On the 1st of each month at 9 AM". */
24
+ export declare function scheduleWords(trigger: {
25
+ readonly every?: string;
26
+ readonly cron?: string;
27
+ }): string;
28
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/workflows/schedule.ts"],"names":[],"mappings":"AAaA,iHAAiH;AACjH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAMD,yEAAyE;AACzE,eAAO,MAAM,cAAc,mJAAqI,CAAC;AAejK,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CA+BhE;AAgCD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAU9D;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAItH;AAUD,sHAAsH;AACtH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkBlG"}