@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,157 @@
1
+ import { error, warning } from "../document/findings.js";
2
+ import { WorkflowSpec } from "../document/workflow-spec.js";
3
+ import { conditionProblems } from "../job-findings.js";
4
+ import { MOST_WORKFLOWS } from "../workflow-shape.js";
5
+ import { followsFindings } from "./policies.js";
6
+ import { scheduleOf } from "./schedule.js";
7
+ import { STEP_KINDS, stepKindOf, stepShapes } from "./steps.js";
8
+ import { WORKFLOW_JUDGING } from "./judging.js";
9
+ import { resolveWorkflow, workflowReach } from "./resolve.js";
10
+ import { workflowWorldOfDocument } from "./world.js";
11
+ /*
12
+ * A DECLARATION'S WORKFLOWS, JUDGED (Roadmap f-jobs-declared), in one
13
+ * vocabulary for a document and a TypeScript app, each finding with the
14
+ * edit that fixes it where one can be written down. Codes:
15
+ *
16
+ * workflow-steps-empty a workflow with no step (error)
17
+ * workflow-schedule-invalid words or cron that do not read (error)
18
+ * workflow-connection-unknown `synced` names no connection (error)
19
+ * workflow-kind-unknown a kind no kind of the app is (error)
20
+ * workflow-field-unknown `changed` names a field the kind lacks (error)
21
+ * workflow-where-invalid a rule that does not read, or reads what is not there (error)
22
+ * workflow-act-unknown an act the app does not give (error)
23
+ * workflow-key-field-unknown a key that reads what the step does not have (error)
24
+ * workflow-agent-acts-empty a model's step that may propose nothing (error)
25
+ * workflow-sends-out-unasked `approve: "apply"` said of a step that writes to another system (warning)
26
+ * workflow-follows-unknown `follows` names no kind (error)
27
+ * workflow-shape anything else not shaped as a workflow (error)
28
+ */
29
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
30
+ const quoted = (names) => [...names].map((name) => `"${name}"`).join(", ") || "none";
31
+ /** What is wrong with a value's shape, as zod says it, at paths under the workflow. */
32
+ function shapeIssues(spec, value, prefix) {
33
+ const parsed = spec.safeParse(value);
34
+ if (parsed.success)
35
+ return [];
36
+ return parsed.error.issues.map((issue) => ({ path: [prefix, ...issue.path.map(String)].filter(Boolean).join("."), message: issue.keys ? `${issue.keys.map((k) => `"${k}"`).join(", ")} ${issue.keys.length === 1 ? "is" : "are"} not part of a workflow here` : issue.message }));
37
+ }
38
+ /** Every finding about one workflow. */
39
+ export function workflowFindingsOf(name, raw, world) {
40
+ const out = [];
41
+ const said = `The workflow “${name}”`;
42
+ if (!isRecord(raw))
43
+ return [{ code: "workflow-shape", severity: "error", path: "", message: `${said} is not a workflow: it is { title, when, steps }.`, fix: "Say its title, what starts it and its steps." }];
44
+ const steps = raw["steps"];
45
+ if (!Array.isArray(steps) || steps.length === 0) {
46
+ out.push({ code: "workflow-steps-empty", severity: "error", path: "steps", message: `${said} has no steps, so it would do nothing.`, fix: "Give it a step — run an act, or let a model propose — or remove it.", edits: [{ op: "remove-workflow", name }] });
47
+ }
48
+ // The shape of everything but the steps, then each step by its own kind's shape: a union's refusal names no kind.
49
+ const shaped = shapeIssues(WorkflowSpec, { ...raw, steps: [{ act: "x" }] }, "").filter((issue) => !issue.path.startsWith("steps"));
50
+ for (const issue of shaped)
51
+ out.push({ code: "workflow-shape", severity: "error", path: issue.path, message: `${said}: ${issue.message}.`, fix: "A workflow says title, when, status, approve and steps." });
52
+ const stepsOk = [];
53
+ (Array.isArray(steps) ? steps : []).forEach((step, index) => {
54
+ const kind = stepKindOf(step);
55
+ if (!kind) {
56
+ out.push({ code: "workflow-shape", severity: "error", path: `steps.${index}`, message: `Step ${index + 1} of “${name}” is no kind of step Graview runs.`, fix: `A step says one of ${quoted(Object.keys(STEP_KINDS))}.` });
57
+ return;
58
+ }
59
+ const issues = shapeIssues(kind.shape(stepShapes()), step, `steps.${index}`);
60
+ for (const issue of issues)
61
+ out.push({ code: "workflow-shape", severity: "error", path: issue.path, message: `Step ${index + 1} of “${name}”: ${issue.message}.`, fix: `${kind.title}: say only the keys that kind of step takes.` });
62
+ if (issues.length === 0)
63
+ stepsOk.push(step);
64
+ else
65
+ return;
66
+ out.push(...kind.findings(step, { world, workflow: name, index, said: `Step ${index + 1} of “${name}”`, declared: raw }));
67
+ });
68
+ if (shaped.length > 0)
69
+ return out;
70
+ const declared = raw;
71
+ declared.when.forEach((trigger, at) => {
72
+ const schedule = scheduleOf(trigger);
73
+ if (typeof schedule === "string")
74
+ out.push({ code: "workflow-schedule-invalid", severity: "error", path: `when.${at}.${"every" in trigger ? "every" : "cron"}`, message: `${said} cannot be run on its clock: ${schedule}.`, fix: 'Write it as "sunday 18:00", "day 03:00", "weekday 09:00", "month 1 09:00", "hour", or five-field cron.' });
75
+ if ("synced" in trigger && !world.connections.has(trigger.synced)) {
76
+ out.push({ code: "workflow-connection-unknown", severity: "error", path: `when.${at}.synced`, message: `${said} starts when “${trigger.synced}” finishes a pass, and the app has no connection called that.`, fix: world.connections.size > 0 ? `Name one of ${quoted(world.connections.keys())}.` : "The app declares no connection; declare one under connections, or start it another way." });
77
+ }
78
+ if ("made" in trigger || "changed" in trigger) {
79
+ const kindName = "made" in trigger ? trigger.made : trigger.changed;
80
+ const key = "made" in trigger ? "made" : "changed";
81
+ const kind = world.kinds.get(kindName);
82
+ if (!kind) {
83
+ out.push({ code: "workflow-kind-unknown", severity: "error", path: `when.${at}.${key}`, message: `${said} starts when a “${kindName}” record is ${key}, and “${kindName}” is not a kind of this app.`, fix: `Name one of its kinds: ${quoted(world.kinds.keys())}.` });
84
+ return;
85
+ }
86
+ if ("changed" in trigger) {
87
+ for (const field of trigger.fields ?? []) {
88
+ if (kind.fields[field] || kind.edges.has(field))
89
+ continue;
90
+ out.push({ code: "workflow-field-unknown", severity: "error", path: `when.${at}.fields`, message: `${said} starts when a ${kindName}'s “${field}” changes, and ${kindName} has no field or relation called that.`, fix: `Name one of ${quoted(Object.keys(kind.fields))}.` });
91
+ }
92
+ }
93
+ if (trigger.where !== undefined) {
94
+ for (const problem of conditionProblems(trigger.where, kindName, kind, world))
95
+ out.push({ code: "workflow-where-invalid", severity: "error", path: `when.${at}.where`, message: `${said} cannot tell which records start it: ${problem}.`, fix: `Write it in the rule language over the fields of "${kindName}".` });
96
+ }
97
+ }
98
+ });
99
+ out.push(...followsFindings(declared.follows, world));
100
+ // Said, not refused: a step that writes to another system unasked.
101
+ stepsOk.forEach((step, index) => {
102
+ const stated = step.approve ?? declared.approve;
103
+ if (stated !== "apply")
104
+ return;
105
+ const reach = workflowReach([step], world);
106
+ if (!reach.sendsOut)
107
+ return;
108
+ const through = [...world.connections].filter(([, connection]) => connection.writes && connection.kinds.some((kind) => reach.writes.includes(kind))).map(([name]) => name);
109
+ const own = step.approve !== undefined;
110
+ out.push({
111
+ code: "workflow-sends-out-unasked",
112
+ severity: "warning",
113
+ path: own ? `steps.${index}.approve` : "approve",
114
+ message: `Step ${index + 1} of “${name}” writes through ${quoted(through)} to another system without asking anybody first.`,
115
+ fix: 'Allowed. Say approve: "ask" to have a person approve each run first.',
116
+ edits: [{ op: "set-workflow", name, workflow: own ? { ...raw, steps: raw["steps"].map((one, i) => (i === index ? { ...one, approve: "ask" } : one)) } : { ...raw, approve: "ask" } }],
117
+ });
118
+ });
119
+ return out;
120
+ }
121
+ /** Every finding about an app's workflows, by name, at paths under `workflows`. */
122
+ export function workflowFindings(workflows, world) {
123
+ if (workflows === undefined)
124
+ return [];
125
+ if (!isRecord(workflows))
126
+ return [{ workflow: "", code: "workflow-shape", severity: "error", path: "", message: "workflows is the app's workflows by name.", fix: 'Write { "<name>": { title, when, steps } }.' }];
127
+ const out = [];
128
+ if (Object.keys(workflows).length > MOST_WORKFLOWS)
129
+ out.push({ workflow: "", code: "workflow-shape", severity: "error", path: "", message: `The app declares ${Object.keys(workflows).length} workflows; at most ${MOST_WORKFLOWS}.`, fix: "Fold some into others." });
130
+ for (const [name, raw] of Object.entries(workflows)) {
131
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(name))
132
+ out.push({ workflow: name, code: "workflow-shape", severity: "error", path: "", message: `“${name}” is not a workflow's name: kebab-case, like "next-weeks-events".`, fix: "Rename it in kebab-case." });
133
+ for (const finding of workflowFindingsOf(name, raw, world))
134
+ out.push({ ...finding, workflow: name });
135
+ }
136
+ return out;
137
+ }
138
+ /** A document's workflows, judged with its own sentences at its own paths (`workflows.<name>.steps.0.act`): what `compileDocument` and `graview check` say of them. */
139
+ export function documentWorkflowFindings(document) {
140
+ if (document.workflows === undefined)
141
+ return [];
142
+ return workflowFindings(document.workflows, workflowWorldOfDocument(document)).map((finding) => {
143
+ const path = ["workflows", finding.workflow, finding.path].filter(Boolean).join(".");
144
+ return finding.severity === "warning" ? warning(finding.code, path, finding.message, finding.fix, finding.edits) : error(finding.code, path, finding.message, finding.fix, finding.edits ? { edits: finding.edits } : undefined);
145
+ });
146
+ }
147
+ // An edit asks this checker when it is loaded (`./judging.ts`).
148
+ WORKFLOW_JUDGING.judge = (name, workflow, document) => {
149
+ const world = workflowWorldOfDocument(document);
150
+ const found = workflowFindingsOf(name, workflow, world);
151
+ const errors = found.filter((finding) => finding.severity === "error");
152
+ if (errors.length > 0)
153
+ return { errors, warnings: [], said: "" };
154
+ const resolved = resolveWorkflow(name, workflow, world);
155
+ return { errors: [], warnings: found.filter((finding) => finding.severity === "warning").map((finding) => finding.message), said: `${resolved.words.slice(0, resolved.words.lastIndexOf(":"))}, ${resolved.steps.length === 1 ? "one step" : `${resolved.steps.length} steps`}${resolved.status === "paused" ? ", paused" : ""}` };
156
+ };
157
+ //# sourceMappingURL=findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/workflows/findings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** A key when the step says none: one record per source and day. */
2
+ export declare const DEFAULT_GENERATE_KEY = "{source}:{date}";
3
+ /** The longest window a step makes records for, in days. */
4
+ export declare const MOST_WINDOW_DAYS = 366;
5
+ /** The most records one step wants in one run. */
6
+ export declare const MOST_GENERATED = 2000;
7
+ export declare const WINDOW_WORDS: RegExp;
8
+ /** What a window says in words, or why it cannot be read. */
9
+ export declare function windowWordsProblem(window: string): string | undefined;
10
+ /** The `$` names a generate step's values may give. */
11
+ export declare const GENERATE_REFS: readonly ["$date", "$source", "$subject", "$today", "$now"];
12
+ //# sourceMappingURL=generate-words.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-words.d.ts","sourceRoot":"","sources":["../../src/workflows/generate-words.ts"],"names":[],"mappings":"AAOA,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,kDAAkD;AAClD,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,YAAY,QAAkE,CAAC;AAE5F,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED,uDAAuD;AACvD,eAAO,MAAM,aAAa,6DAA8D,CAAC"}
@@ -0,0 +1,25 @@
1
+ /*
2
+ * A GENERATE STEP'S WORDS, apart from what it wants (`generate.ts`): its
3
+ * default key, the windows it reads, the `$` names its values give and its
4
+ * limits — what the checker holds a step to without bringing the runner's
5
+ * arithmetic onto every path `graview check` is on.
6
+ */
7
+ /** A key when the step says none: one record per source and day. */
8
+ export const DEFAULT_GENERATE_KEY = "{source}:{date}";
9
+ /** The longest window a step makes records for, in days. */
10
+ export const MOST_WINDOW_DAYS = 366;
11
+ /** The most records one step wants in one run. */
12
+ export const MOST_GENERATED = 2000;
13
+ export const WINDOW_WORDS = /^(?:today|tomorrow|this week|next week|next (\d{1,3}) days?)$/;
14
+ /** What a window says in words, or why it cannot be read. */
15
+ export function windowWordsProblem(window) {
16
+ const found = WINDOW_WORDS.exec(window.trim().toLowerCase());
17
+ if (!found)
18
+ return `"${window}" is not a window it can read: say "today", "tomorrow", "this week", "next week" or "next 7 days", or give { "from": …, "to": … }`;
19
+ if (found[1] !== undefined && (+found[1] < 1 || +found[1] > MOST_WINDOW_DAYS))
20
+ return `"${window}" is not between 1 and ${MOST_WINDOW_DAYS} days`;
21
+ return undefined;
22
+ }
23
+ /** The `$` names a generate step's values may give. */
24
+ export const GENERATE_REFS = ["$date", "$source", "$subject", "$today", "$now"];
25
+ //# sourceMappingURL=generate-words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-words.js","sourceRoot":"","sources":["../../src/workflows/generate-words.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,kDAAkD;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,MAAM,CAAC,MAAM,YAAY,GAAG,+DAA+D,CAAC;AAE5F,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,MAAM,mIAAmI,CAAC;IACjK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;QAAE,OAAO,IAAI,MAAM,0BAA0B,gBAAgB,OAAO,CAAC;IAClJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type Value } from "../document/expr/evaluate.js";
2
+ import type { Graph } from "../graph/graph.js";
3
+ import type { AnySchema } from "../schema/schema.js";
4
+ import type { GenerateStep, GenerateWindow } from "../workflow-shape.js";
5
+ /** The days a window covers, from and to (both included), on a day and the app's clock. A week starts on Monday. */
6
+ export declare function windowDays(window: GenerateWindow, at: {
7
+ readonly today: string;
8
+ readonly zone: string;
9
+ readonly evaluate?: (expr: string) => Value;
10
+ }): {
11
+ readonly from: string;
12
+ readonly to: string;
13
+ };
14
+ /** The days a record's date falls on between two days: a date, a date that repeats, or a set of weekdays. Each as the record says it (a moment keeps its time of day). */
15
+ export declare function datesIn(node: Readonly<Record<string, unknown>>, field: string, window: {
16
+ readonly from: string;
17
+ readonly to: string;
18
+ }, zone: string): string[];
19
+ /** One record a generate step wants. */
20
+ export interface WantedRecord {
21
+ /** The record it comes from, and its kind. */
22
+ readonly source: string;
23
+ readonly sourceKind: string;
24
+ /** The occurrence, as the source says it, and its day. */
25
+ readonly date: string;
26
+ readonly day: string;
27
+ /** The step's key, read on the source and the occurrence. */
28
+ readonly key: string;
29
+ /** The id the key gives what the step makes: the same key, the same record. */
30
+ readonly id: string;
31
+ /** Its fields, as `set` reads them. */
32
+ readonly values: Readonly<Record<string, unknown>>;
33
+ }
34
+ /** What a generate step wants for one run. */
35
+ export interface GenerateWants {
36
+ readonly from: string;
37
+ readonly to: string;
38
+ readonly wanted: readonly WantedRecord[];
39
+ /** What could not be read, by source record, in words. */
40
+ readonly problems: readonly {
41
+ readonly source?: string;
42
+ readonly why: string;
43
+ }[];
44
+ }
45
+ /** What a generate step reads a run with. */
46
+ export interface GenerateReading {
47
+ readonly graph: Graph<AnySchema>;
48
+ readonly schema: AnySchema;
49
+ /** The workflow's name: in every id the step makes. */
50
+ readonly workflow: string;
51
+ readonly now: number;
52
+ /** The run's day on the app's clock; read from `now` in `timeZone` when unsaid. */
53
+ readonly today?: string | undefined;
54
+ readonly timeZone?: string | undefined;
55
+ readonly locale?: string | undefined;
56
+ }
57
+ /** WHAT A GENERATE STEP WANTS, on the graph as it stands: every record, in day order. */
58
+ export declare function generateWants(step: GenerateStep, reading: GenerateReading): GenerateWants;
59
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/workflows/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAKjG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAiB,MAAM,sBAAsB,CAAC;AAaxF,oHAAoH;AACpH,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAyBrM;AAED,0KAA0K;AAC1K,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAa9J;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD;AAED,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClF;AAeD,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,CAiDzF"}
@@ -0,0 +1,165 @@
1
+ import { dayOfMoment, isoToday, ISO_DAY } from "../days.js";
2
+ import { evaluateExpr, NodeSet } from "../document/expr/evaluate.js";
3
+ import { parseExpr } from "../document/expr/parse.js";
4
+ import { shapesOfSchema } from "../document/rules.js";
5
+ import { startOfWeekOf } from "../document/expr/when.js";
6
+ import { isRepeat, occurrences, repeatKey, WEEKDAYS } from "../repeat.js";
7
+ import { weekdaysOf } from "../sync/recurrence.js";
8
+ import { addDays, weekdayOf } from "../wall-time.js";
9
+ import { keyedId } from "./values.js";
10
+ import { DEFAULT_GENERATE_KEY, MOST_GENERATED, MOST_WINDOW_DAYS, WINDOW_WORDS, windowWordsProblem } from "./generate-words.js";
11
+ /*
12
+ * WHAT A GENERATE STEP WANTS MADE (Roadmap f-job-generate-from-pattern),
13
+ * worked out and never kept: the days of its window, every day a source
14
+ * record's date falls on in them — a date, a date that repeats
15
+ * (`repeat.ts`: skipped days are not among them), a set of weekdays — and
16
+ * for each, the record it wants: its key, the id that key gives it, and
17
+ * its fields as `set` reads them on the source. Running it — making what
18
+ * is not there yet, changing what the source changed and leaving what a
19
+ * person changed — is `@graview/tools/workflows`'.
20
+ */
21
+ /** The days a window covers, from and to (both included), on a day and the app's clock. A week starts on Monday. */
22
+ export function windowDays(window, at) {
23
+ const { today } = at;
24
+ if (typeof window === "string") {
25
+ const said = window.trim().toLowerCase();
26
+ const problem = windowWordsProblem(said);
27
+ if (problem)
28
+ throw new Error(problem);
29
+ const monday = startOfWeekOf({ day: today }, "mon");
30
+ if (said === "today")
31
+ return { from: today, to: today };
32
+ if (said === "tomorrow")
33
+ return { from: addDays(today, 1), to: addDays(today, 1) };
34
+ if (said === "this week")
35
+ return { from: monday, to: addDays(monday, 6) };
36
+ if (said === "next week")
37
+ return { from: addDays(monday, 7), to: addDays(monday, 13) };
38
+ const days = Number(WINDOW_WORDS.exec(said)[1]);
39
+ return { from: today, to: addDays(today, days - 1) };
40
+ }
41
+ const day = (expr, end) => {
42
+ const value = at.evaluate ? at.evaluate(expr) : null;
43
+ const read = typeof value === "string" ? dayOfMoment(value, at.zone) : undefined;
44
+ if (!read)
45
+ throw new Error(`the window's ${end} (${expr}) is not a day`);
46
+ return read;
47
+ };
48
+ const from = day(window.from, "from");
49
+ const to = day(window.to, "to");
50
+ if (to < from)
51
+ throw new Error(`the window ends (${to}) before it begins (${from})`);
52
+ if (addDays(from, MOST_WINDOW_DAYS - 1) < to)
53
+ throw new Error(`the window is longer than ${MOST_WINDOW_DAYS} days`);
54
+ return { from, to };
55
+ }
56
+ /** The days a record's date falls on between two days: a date, a date that repeats, or a set of weekdays. Each as the record says it (a moment keeps its time of day). */
57
+ export function datesIn(node, field, window, zone) {
58
+ const value = node[field];
59
+ const repeat = node[repeatKey(field)];
60
+ if (typeof value === "string" && isRepeat(repeat))
61
+ return occurrences(value, repeat, { from: window.from, to: window.to });
62
+ if (typeof value === "string") {
63
+ const day = dayOfMoment(value, zone);
64
+ if (day)
65
+ return day >= window.from && day <= window.to ? [value] : [];
66
+ }
67
+ const weekdays = weekdaysOf(value);
68
+ if (weekdays.length === 0)
69
+ return [];
70
+ const out = [];
71
+ for (let day = window.from; day <= window.to; day = addDays(day, 1))
72
+ if (weekdays.includes(WEEKDAYS[weekdayOf(day)]))
73
+ out.push(day);
74
+ return out;
75
+ }
76
+ const asValue = (value) => (value instanceof NodeSet ? value.nodes.map((node) => node.id) : value !== null && typeof value === "object" && !Array.isArray(value) && typeof value.id === "string" ? value.id : value);
77
+ /** A key's `{field}` template read: `source`, `date` (the day), `kind`, or the source's own field. */
78
+ function keyOf(template, node, kind, day) {
79
+ return template.replace(/\{([^{}|\s]+)(?:\s*\|[^{}]*)?\}/g, (_all, name) => {
80
+ if (name === "source" || name === "id")
81
+ return node.id;
82
+ if (name === "date")
83
+ return day;
84
+ if (name === "kind")
85
+ return kind;
86
+ const value = node[name];
87
+ return value === undefined || value === null ? "" : typeof value === "string" ? value : JSON.stringify(value);
88
+ });
89
+ }
90
+ /** WHAT A GENERATE STEP WANTS, on the graph as it stands: every record, in day order. */
91
+ export function generateWants(step, reading) {
92
+ const zone = reading.timeZone ?? "UTC";
93
+ const today = reading.today ?? isoToday(zone, reading.now);
94
+ const now = new Date(reading.now).toISOString();
95
+ const kinds = shapesOfSchema(reading.schema);
96
+ const base = { graph: reading.graph, kinds, today, now, timeZone: zone, ...(reading.locale ? { locale: reading.locale } : {}) };
97
+ const parsed = new Map();
98
+ const parse = (source) => {
99
+ let expr = parsed.get(source);
100
+ if (!expr)
101
+ parsed.set(source, (expr = parseExpr(source)));
102
+ return expr;
103
+ };
104
+ const problems = [];
105
+ let window;
106
+ try {
107
+ window = windowDays(step.window, { today, zone, evaluate: (expr) => evaluateExpr(parse(expr), { ...base, subject: null }) });
108
+ }
109
+ catch (e) {
110
+ return { from: today, to: today, wanted: [], problems: [{ why: e instanceof Error ? e.message : String(e) }] };
111
+ }
112
+ const wanted = [];
113
+ const seen = new Set();
114
+ const template = step.key ?? DEFAULT_GENERATE_KEY;
115
+ for (const from of step.from) {
116
+ if (!reading.schema.tryDefinition(from.kind)) {
117
+ problems.push({ why: `"${from.kind}" is not a kind of this app` });
118
+ continue;
119
+ }
120
+ for (const node of reading.graph.nodesOfKind(from.kind)) {
121
+ try {
122
+ if (from.where !== undefined && evaluateExpr(parse(from.where), { ...base, subject: node }) !== true)
123
+ continue;
124
+ for (const date of datesIn(node, from.dates, window, zone)) {
125
+ const day = ISO_DAY.test(date) ? date : (dayOfMoment(date, zone) ?? date.slice(0, 10));
126
+ const key = keyOf(template, node, from.kind, day);
127
+ if (seen.has(key))
128
+ continue;
129
+ seen.add(key);
130
+ const values = {};
131
+ for (const [field, spec] of Object.entries(step.set ?? {}))
132
+ values[field] = valueOf(spec, { node, date, today, now, read: (expr) => evaluateExpr(parse(expr), { ...base, subject: node, bindings: { date, source: node.id } }) });
133
+ wanted.push({ source: node.id, sourceKind: from.kind, date, day, key, id: keyedId(step.generate, reading.workflow, key), values });
134
+ if (wanted.length >= MOST_GENERATED) {
135
+ problems.push({ why: `it wants more than ${MOST_GENERATED} records in one run; the rest wait for the next` });
136
+ return { ...window, wanted: sorted(wanted), problems };
137
+ }
138
+ }
139
+ }
140
+ catch (e) {
141
+ problems.push({ source: node.id, why: e instanceof Error ? e.message : String(e) });
142
+ }
143
+ }
144
+ }
145
+ return { ...window, wanted: sorted(wanted), problems };
146
+ }
147
+ const sorted = (wanted) => wanted.sort((a, b) => (a.date < b.date ? -1 : a.date > b.date ? 1 : a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
148
+ /** A value `set` gives, read on the source: `$date`, `$source`, `$today`, `$now`, `{ expr }`, or itself. */
149
+ function valueOf(spec, at) {
150
+ if (typeof spec === "string") {
151
+ if (spec === "$date")
152
+ return at.date;
153
+ if (spec === "$source" || spec === "$subject")
154
+ return at.node.id;
155
+ if (spec === "$today")
156
+ return at.today;
157
+ if (spec === "$now")
158
+ return at.now;
159
+ return spec;
160
+ }
161
+ if (spec !== null && typeof spec === "object" && !Array.isArray(spec))
162
+ return asValue(at.read(spec.expr));
163
+ return spec;
164
+ }
165
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/workflows/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** A workflow judged for an edit: what refuses it, what is said of it, and its line. */
2
+ export interface WorkflowJudged {
3
+ readonly errors: readonly {
4
+ readonly code: string;
5
+ readonly path: string;
6
+ readonly message: string;
7
+ readonly fix: string;
8
+ }[];
9
+ readonly warnings: readonly string[];
10
+ /** "Every day at 3 AM, one step": how the edit says it. */
11
+ readonly said: string;
12
+ }
13
+ export interface WorkflowJudging {
14
+ judge?: (name: string, workflow: unknown, document: unknown) => WorkflowJudged;
15
+ }
16
+ export declare const WORKFLOW_JUDGING: WorkflowJudging;
17
+ //# sourceMappingURL=judging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judging.d.ts","sourceRoot":"","sources":["../../src/workflows/judging.ts"],"names":[],"mappings":"AAUA,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7H,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,cAAc,CAAC;CAChF;AAED,eAAO,MAAM,gBAAgB,EAAE,eAAoI,CAAC"}
@@ -0,0 +1,11 @@
1
+ /*
2
+ * WHERE AN EDIT FINDS THE WORKFLOW CHECKER. `editDocument` is on a page,
3
+ * and the checker — the shapes of every step kind, the schedule reader, the
4
+ * rule reader — is not: it fills this slot as it loads
5
+ * (`./findings.ts`, which `@graview/core/check` and
6
+ * `@graview/core/workflows` both bring), and an edit asks it when it is
7
+ * there. Without it, an edit keeps a workflow that is shaped as one and
8
+ * leaves the rest to `graview check`. One slot per realm, as `VOTING` is.
9
+ */
10
+ export const WORKFLOW_JUDGING = (globalThis[Symbol.for("@graview/core:workflow-judging")] ??= {});
11
+ //# sourceMappingURL=judging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judging.js","sourceRoot":"","sources":["../../src/workflows/judging.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,MAAM,CAAC,MAAM,gBAAgB,GAAoB,CAAE,UAA0D,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type Schedule } from "./schedule.js";
2
+ /**
3
+ * WHEN A SCHEDULE NEXT RUNS, after a moment: on the wall clock of `zone`
4
+ * (the runtime's when unsaid), DST-correct. Undefined when it never does
5
+ * in the next five years ("month 31" in a schedule that only says February).
6
+ */
7
+ export declare function nextOf(schedule: Schedule, after: Date | number, zone?: string): Date | undefined;
8
+ /**
9
+ * WHEN A WORKFLOW NEXT RUNS ON ITS CLOCK, after a moment: the earliest of
10
+ * its `every` and `cron` triggers, on the wall clock of `zone` (the brand's
11
+ * `timeZone`). Undefined for one that is paused, has no clock, or whose
12
+ * schedules do not read.
13
+ */
14
+ export declare function nextRunAt(workflow: {
15
+ readonly when: readonly object[];
16
+ readonly status?: string;
17
+ }, after: Date | number, zone?: string): Date | undefined;
18
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/workflows/next.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiC1D;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAchG;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAUzJ"}
@@ -0,0 +1,75 @@
1
+ import { instantIn, wallIn } from "../days.js";
2
+ import { scheduleOf } from "./schedule.js";
3
+ /*
4
+ * WHEN A SCHEDULE NEXT RUNS, as arithmetic on the wall clock: apart from
5
+ * reading one (`./schedule.ts`), which the checker needs, so `graview
6
+ * check` and a host's worker carry none of this. On `@graview/core/workflows`.
7
+ */
8
+ const nextDay = (day) => new Date(Date.UTC(+day.slice(0, 4), +day.slice(5, 7) - 1, +day.slice(8, 10) + 1)).toISOString().slice(0, 10);
9
+ const weekdayOf = (day) => new Date(`${day}T00:00:00Z`).getUTCDay();
10
+ function dayRuns(schedule, day) {
11
+ if (!schedule.months.has(+day.slice(5, 7)))
12
+ return false;
13
+ const onDay = schedule.days.has(+day.slice(8, 10));
14
+ const onWeekday = schedule.weekdays.has(weekdayOf(day));
15
+ // Cron's rule: narrowed both ways, either runs it.
16
+ return schedule.daysSaid && schedule.weekdaysSaid ? onDay || onWeekday : onDay && onWeekday;
17
+ }
18
+ /** The instant a wall time on a day runs: a time the clock skips that day runs the moment the clock jumps past it. */
19
+ function runsAt(day, minutes, zone) {
20
+ const instant = instantIn(day, minutes, zone);
21
+ const there = wallIn(instant, zone);
22
+ if (there.day === day && there.minutes === minutes)
23
+ return instant;
24
+ // Skipped: the first instant on the wall at or after it.
25
+ for (let later = minutes + 1; later < minutes + 180 && later < 24 * 60; later++) {
26
+ const at = instantIn(day, later, zone);
27
+ const wall = wallIn(at, zone);
28
+ if (wall.day === day && wall.minutes === later)
29
+ return at;
30
+ }
31
+ return instant;
32
+ }
33
+ /**
34
+ * WHEN A SCHEDULE NEXT RUNS, after a moment: on the wall clock of `zone`
35
+ * (the runtime's when unsaid), DST-correct. Undefined when it never does
36
+ * in the next five years ("month 31" in a schedule that only says February).
37
+ */
38
+ export function nextOf(schedule, after, zone) {
39
+ const from = typeof after === "number" ? after : after.getTime();
40
+ const hours = [...schedule.hours].sort((a, b) => a - b);
41
+ const minutes = [...schedule.minutes].sort((a, b) => a - b);
42
+ let day = wallIn(from, zone).day;
43
+ for (let i = 0; i < 366 * 5; i++, day = nextDay(day)) {
44
+ if (!dayRuns(schedule, day))
45
+ continue;
46
+ for (const hour of hours)
47
+ for (const minute of minutes) {
48
+ const at = runsAt(day, hour * 60 + minute, zone);
49
+ if (at > from)
50
+ return new Date(at);
51
+ }
52
+ }
53
+ return undefined;
54
+ }
55
+ /**
56
+ * WHEN A WORKFLOW NEXT RUNS ON ITS CLOCK, after a moment: the earliest of
57
+ * its `every` and `cron` triggers, on the wall clock of `zone` (the brand's
58
+ * `timeZone`). Undefined for one that is paused, has no clock, or whose
59
+ * schedules do not read.
60
+ */
61
+ export function nextRunAt(workflow, after, zone) {
62
+ if (workflow.status === "paused")
63
+ return undefined;
64
+ let soonest;
65
+ for (const trigger of workflow.when) {
66
+ const schedule = scheduleOf(trigger);
67
+ if (schedule === undefined || typeof schedule === "string")
68
+ continue;
69
+ const next = nextOf(schedule, after, zone);
70
+ if (next && (!soonest || next < soonest))
71
+ soonest = next;
72
+ }
73
+ return soonest;
74
+ }
75
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/workflows/next.ts"],"names":[],"mappings":"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"}