@graview/core 0.1.61 → 0.1.63

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 (464) hide show
  1. package/README.md +13 -1
  2. package/dist/app-places.d.ts.map +1 -1
  3. package/dist/app-places.js +2 -2
  4. package/dist/app-places.js.map +1 -1
  5. package/dist/app.d.ts +22 -0
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js.map +1 -1
  8. package/dist/arranging.js +2 -2
  9. package/dist/arranging.js.map +1 -1
  10. package/dist/capabilities.js +1 -1
  11. package/dist/capabilities.js.map +1 -1
  12. package/dist/cli/check/hidden-reads.d.ts.map +1 -1
  13. package/dist/cli/check/hidden-reads.js +26 -0
  14. package/dist/cli/check/hidden-reads.js.map +1 -1
  15. package/dist/cli/check/index.d.ts +2 -0
  16. package/dist/cli/check/index.d.ts.map +1 -1
  17. package/dist/cli/check/index.js +2 -0
  18. package/dist/cli/check/index.js.map +1 -1
  19. package/dist/cli/check/tidying.d.ts +14 -0
  20. package/dist/cli/check/tidying.d.ts.map +1 -0
  21. package/dist/cli/check/tidying.js +24 -0
  22. package/dist/cli/check/tidying.js.map +1 -0
  23. package/dist/cli/check/workflows.d.ts +11 -0
  24. package/dist/cli/check/workflows.d.ts.map +1 -0
  25. package/dist/cli/check/workflows.js +20 -0
  26. package/dist/cli/check/workflows.js.map +1 -0
  27. package/dist/cli/check.d.ts.map +1 -1
  28. package/dist/cli/check.js +3 -1
  29. package/dist/cli/check.js.map +1 -1
  30. package/dist/cli/describe.d.ts.map +1 -1
  31. package/dist/cli/describe.js +45 -2
  32. package/dist/cli/describe.js.map +1 -1
  33. package/dist/cli/document-schema.d.ts.map +1 -1
  34. package/dist/cli/document-schema.js +15 -2
  35. package/dist/cli/document-schema.js.map +1 -1
  36. package/dist/cli/index.js +1 -1
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/compose.d.ts +11 -3
  39. package/dist/compose.d.ts.map +1 -1
  40. package/dist/compose.js +12 -2
  41. package/dist/compose.js.map +1 -1
  42. package/dist/css/sanitize.d.ts +125 -0
  43. package/dist/css/sanitize.d.ts.map +1 -0
  44. package/dist/css/sanitize.js +989 -0
  45. package/dist/css/sanitize.js.map +1 -0
  46. package/dist/css/tables.d.ts +55 -0
  47. package/dist/css/tables.d.ts.map +1 -0
  48. package/dist/css/tables.js +137 -0
  49. package/dist/css/tables.js.map +1 -0
  50. package/dist/css.d.ts +20 -0
  51. package/dist/css.d.ts.map +1 -0
  52. package/dist/css.js +19 -0
  53. package/dist/css.js.map +1 -0
  54. package/dist/days.d.ts +15 -0
  55. package/dist/days.d.ts.map +1 -1
  56. package/dist/days.js +21 -0
  57. package/dist/days.js.map +1 -1
  58. package/dist/describe.d.ts +1 -1
  59. package/dist/describe.d.ts.map +1 -1
  60. package/dist/document/act-findings.d.ts.map +1 -1
  61. package/dist/document/act-findings.js +80 -1
  62. package/dist/document/act-findings.js.map +1 -1
  63. package/dist/document/amount.d.ts +1 -1
  64. package/dist/document/amount.d.ts.map +1 -1
  65. package/dist/document/amount.js +2 -2
  66. package/dist/document/amount.js.map +1 -1
  67. package/dist/document/blocks.d.ts.map +1 -1
  68. package/dist/document/blocks.js +17 -1
  69. package/dist/document/blocks.js.map +1 -1
  70. package/dist/document/brand-check.d.ts +15 -1
  71. package/dist/document/brand-check.d.ts.map +1 -1
  72. package/dist/document/brand-check.js +80 -0
  73. package/dist/document/brand-check.js.map +1 -1
  74. package/dist/document/brand.d.ts.map +1 -1
  75. package/dist/document/brand.js +2 -0
  76. package/dist/document/brand.js.map +1 -1
  77. package/dist/document/compile-checked.d.ts.map +1 -1
  78. package/dist/document/compile-checked.js +5 -2
  79. package/dist/document/compile-checked.js.map +1 -1
  80. package/dist/document/compile.d.ts.map +1 -1
  81. package/dist/document/compile.js +96 -16
  82. package/dist/document/compile.js.map +1 -1
  83. package/dist/document/compiled.d.ts +32 -3
  84. package/dist/document/compiled.d.ts.map +1 -1
  85. package/dist/document/compiled.js +123 -12
  86. package/dist/document/compiled.js.map +1 -1
  87. package/dist/document/connection-findings.js +165 -22
  88. package/dist/document/connection-findings.js.map +1 -1
  89. package/dist/document/connection-spec.d.ts +38 -1
  90. package/dist/document/connection-spec.d.ts.map +1 -1
  91. package/dist/document/connection-spec.js +71 -7
  92. package/dist/document/connection-spec.js.map +1 -1
  93. package/dist/document/covers.d.ts +48 -0
  94. package/dist/document/covers.d.ts.map +1 -0
  95. package/dist/document/covers.js +90 -0
  96. package/dist/document/covers.js.map +1 -0
  97. package/dist/document/derives-findings.d.ts +4 -0
  98. package/dist/document/derives-findings.d.ts.map +1 -0
  99. package/dist/document/derives-findings.js +68 -0
  100. package/dist/document/derives-findings.js.map +1 -0
  101. package/dist/document/describe-forms.js +2 -2
  102. package/dist/document/describe-forms.js.map +1 -1
  103. package/dist/document/describe-place.d.ts +3 -0
  104. package/dist/document/describe-place.d.ts.map +1 -1
  105. package/dist/document/describe-place.js +11 -0
  106. package/dist/document/describe-place.js.map +1 -1
  107. package/dist/document/described.d.ts +28 -0
  108. package/dist/document/described.d.ts.map +1 -1
  109. package/dist/document/diff.d.ts +6 -0
  110. package/dist/document/diff.d.ts.map +1 -1
  111. package/dist/document/diff.js +53 -2
  112. package/dist/document/diff.js.map +1 -1
  113. package/dist/document/edit.d.ts +1 -1
  114. package/dist/document/edit.d.ts.map +1 -1
  115. package/dist/document/edit.js +366 -29
  116. package/dist/document/edit.js.map +1 -1
  117. package/dist/document/expr/evaluate.d.ts +17 -1
  118. package/dist/document/expr/evaluate.d.ts.map +1 -1
  119. package/dist/document/expr/evaluate.js +110 -2
  120. package/dist/document/expr/evaluate.js.map +1 -1
  121. package/dist/document/expr/index.d.ts +1 -0
  122. package/dist/document/expr/index.d.ts.map +1 -1
  123. package/dist/document/expr/index.js +2 -0
  124. package/dist/document/expr/index.js.map +1 -1
  125. package/dist/document/expr/typing.d.ts +24 -0
  126. package/dist/document/expr/typing.d.ts.map +1 -0
  127. package/dist/document/expr/typing.js +219 -0
  128. package/dist/document/expr/typing.js.map +1 -0
  129. package/dist/document/expr/when.d.ts +52 -0
  130. package/dist/document/expr/when.d.ts.map +1 -0
  131. package/dist/document/expr/when.js +215 -0
  132. package/dist/document/expr/when.js.map +1 -0
  133. package/dist/document/expr-type-findings.d.ts +5 -0
  134. package/dist/document/expr-type-findings.d.ts.map +1 -0
  135. package/dist/document/expr-type-findings.js +90 -0
  136. package/dist/document/expr-type-findings.js.map +1 -0
  137. package/dist/document/format-words.d.ts +1 -0
  138. package/dist/document/format-words.d.ts.map +1 -1
  139. package/dist/document/format-words.js +2 -2
  140. package/dist/document/format-words.js.map +1 -1
  141. package/dist/document/index.d.ts +6 -3
  142. package/dist/document/index.d.ts.map +1 -1
  143. package/dist/document/index.js +5 -2
  144. package/dist/document/index.js.map +1 -1
  145. package/dist/document/kept-in-step-with.d.ts +20 -0
  146. package/dist/document/kept-in-step-with.d.ts.map +1 -0
  147. package/dist/document/kept-in-step-with.js +38 -0
  148. package/dist/document/kept-in-step-with.js.map +1 -0
  149. package/dist/document/kept-in-step.d.ts.map +1 -1
  150. package/dist/document/kept-in-step.js +3 -1
  151. package/dist/document/kept-in-step.js.map +1 -1
  152. package/dist/document/linked-findings.js +1 -1
  153. package/dist/document/linked-findings.js.map +1 -1
  154. package/dist/document/money.d.ts +10 -2
  155. package/dist/document/money.d.ts.map +1 -1
  156. package/dist/document/money.js +14 -5
  157. package/dist/document/money.js.map +1 -1
  158. package/dist/document/policy-words.d.ts +2 -0
  159. package/dist/document/policy-words.d.ts.map +1 -1
  160. package/dist/document/policy-words.js +11 -1
  161. package/dist/document/policy-words.js.map +1 -1
  162. package/dist/document/rule-line.d.ts +7 -3
  163. package/dist/document/rule-line.d.ts.map +1 -1
  164. package/dist/document/rule-line.js +17 -2
  165. package/dist/document/rule-line.js.map +1 -1
  166. package/dist/document/rule-reads.d.ts.map +1 -1
  167. package/dist/document/rule-reads.js +3 -1
  168. package/dist/document/rule-reads.js.map +1 -1
  169. package/dist/document/rules.d.ts +30 -0
  170. package/dist/document/rules.d.ts.map +1 -1
  171. package/dist/document/rules.js +74 -0
  172. package/dist/document/rules.js.map +1 -1
  173. package/dist/document/schema.d.ts +110 -2
  174. package/dist/document/schema.d.ts.map +1 -1
  175. package/dist/document/schema.js +125 -10
  176. package/dist/document/schema.js.map +1 -1
  177. package/dist/document/template-parse.d.ts.map +1 -1
  178. package/dist/document/template-parse.js +7 -1
  179. package/dist/document/template-parse.js.map +1 -1
  180. package/dist/document/template.d.ts +2 -0
  181. package/dist/document/template.d.ts.map +1 -1
  182. package/dist/document/template.js +10 -1
  183. package/dist/document/template.js.map +1 -1
  184. package/dist/document/to-document.d.ts.map +1 -1
  185. package/dist/document/to-document.js +5 -3
  186. package/dist/document/to-document.js.map +1 -1
  187. package/dist/document/workflow-spec.d.ts +72 -0
  188. package/dist/document/workflow-spec.d.ts.map +1 -0
  189. package/dist/document/workflow-spec.js +45 -0
  190. package/dist/document/workflow-spec.js.map +1 -0
  191. package/dist/document.schema.json +1143 -50
  192. package/dist/history.d.ts.map +1 -1
  193. package/dist/history.js +2 -0
  194. package/dist/history.js.map +1 -1
  195. package/dist/index.d.ts +11 -8
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +8 -5
  198. package/dist/index.js.map +1 -1
  199. package/dist/installation.d.ts +1 -1
  200. package/dist/invariants/types.d.ts +7 -2
  201. package/dist/invariants/types.d.ts.map +1 -1
  202. package/dist/job-findings.d.ts +5 -0
  203. package/dist/job-findings.d.ts.map +1 -1
  204. package/dist/job-findings.js +9 -3
  205. package/dist/job-findings.js.map +1 -1
  206. package/dist/keep-linked.d.ts +45 -0
  207. package/dist/keep-linked.d.ts.map +1 -0
  208. package/dist/keep-linked.js +188 -0
  209. package/dist/keep-linked.js.map +1 -0
  210. package/dist/lines.d.ts.map +1 -1
  211. package/dist/lines.js +6 -2
  212. package/dist/lines.js.map +1 -1
  213. package/dist/mutations/derive-edits.js +2 -2
  214. package/dist/mutations/propose-changes.d.ts +24 -0
  215. package/dist/mutations/propose-changes.d.ts.map +1 -0
  216. package/dist/mutations/propose-changes.js +30 -0
  217. package/dist/mutations/propose-changes.js.map +1 -0
  218. package/dist/mutations/types.d.ts +9 -0
  219. package/dist/mutations/types.d.ts.map +1 -1
  220. package/dist/mutations/vote-suggestion.d.ts +97 -0
  221. package/dist/mutations/vote-suggestion.d.ts.map +1 -0
  222. package/dist/mutations/vote-suggestion.js +59 -0
  223. package/dist/mutations/vote-suggestion.js.map +1 -0
  224. package/dist/mutations/words.js +3 -3
  225. package/dist/navigate.d.ts +7 -3
  226. package/dist/navigate.d.ts.map +1 -1
  227. package/dist/navigate.js +7 -3
  228. package/dist/navigate.js.map +1 -1
  229. package/dist/ops/digest.d.ts +3 -1
  230. package/dist/ops/digest.d.ts.map +1 -1
  231. package/dist/ops/digest.js +7 -2
  232. package/dist/ops/digest.js.map +1 -1
  233. package/dist/ops/lineage.d.ts +29 -2
  234. package/dist/ops/lineage.d.ts.map +1 -1
  235. package/dist/ops/lineage.js +12 -4
  236. package/dist/ops/lineage.js.map +1 -1
  237. package/dist/ops/log.d.ts.map +1 -1
  238. package/dist/ops/log.js +13 -2
  239. package/dist/ops/log.js.map +1 -1
  240. package/dist/ops/suggestions.d.ts +75 -1
  241. package/dist/ops/suggestions.d.ts.map +1 -1
  242. package/dist/ops/suggestions.js +123 -6
  243. package/dist/ops/suggestions.js.map +1 -1
  244. package/dist/ops/tidying.d.ts.map +1 -1
  245. package/dist/ops/tidying.js +6 -1
  246. package/dist/ops/tidying.js.map +1 -1
  247. package/dist/ops/types.d.ts +41 -0
  248. package/dist/ops/types.d.ts.map +1 -1
  249. package/dist/ops/types.js.map +1 -1
  250. package/dist/ops/undo.d.ts.map +1 -1
  251. package/dist/ops/undo.js +17 -0
  252. package/dist/ops/undo.js.map +1 -1
  253. package/dist/permissions/policy.d.ts +7 -0
  254. package/dist/permissions/policy.d.ts.map +1 -1
  255. package/dist/permissions/policy.js +12 -0
  256. package/dist/permissions/policy.js.map +1 -1
  257. package/dist/permissions/types.d.ts +27 -0
  258. package/dist/permissions/types.d.ts.map +1 -1
  259. package/dist/permissions/types.js.map +1 -1
  260. package/dist/place-names.d.ts +42 -0
  261. package/dist/place-names.d.ts.map +1 -0
  262. package/dist/place-names.js +43 -0
  263. package/dist/place-names.js.map +1 -0
  264. package/dist/places.d.ts +12 -0
  265. package/dist/places.d.ts.map +1 -1
  266. package/dist/places.js +37 -1
  267. package/dist/places.js.map +1 -1
  268. package/dist/scene.d.ts +2 -0
  269. package/dist/scene.d.ts.map +1 -1
  270. package/dist/scene.js +2 -0
  271. package/dist/scene.js.map +1 -1
  272. package/dist/schema/amount-mark.d.ts +2 -0
  273. package/dist/schema/amount-mark.d.ts.map +1 -1
  274. package/dist/schema/amount-mark.js.map +1 -1
  275. package/dist/schema/amount-words.js +2 -2
  276. package/dist/schema/amount-words.js.map +1 -1
  277. package/dist/schema/choice-words.js +2 -2
  278. package/dist/schema/define-node.d.ts +8 -2
  279. package/dist/schema/define-node.d.ts.map +1 -1
  280. package/dist/schema/define-node.js +2 -2
  281. package/dist/schema/define-node.js.map +1 -1
  282. package/dist/schema/humanize.d.ts +17 -0
  283. package/dist/schema/humanize.d.ts.map +1 -1
  284. package/dist/schema/humanize.js +28 -1
  285. package/dist/schema/humanize.js.map +1 -1
  286. package/dist/schema/reading.d.ts +8 -0
  287. package/dist/schema/reading.d.ts.map +1 -1
  288. package/dist/schema/reading.js +16 -2
  289. package/dist/schema/reading.js.map +1 -1
  290. package/dist/schema/types.d.ts +8 -0
  291. package/dist/schema/types.d.ts.map +1 -1
  292. package/dist/schema/value-words.js +2 -2
  293. package/dist/schema/value-words.js.map +1 -1
  294. package/dist/starting-document.d.ts +47 -2
  295. package/dist/starting-document.d.ts.map +1 -1
  296. package/dist/starting-document.js +66 -8
  297. package/dist/starting-document.js.map +1 -1
  298. package/dist/store.d.ts +75 -1
  299. package/dist/store.d.ts.map +1 -1
  300. package/dist/store.js +305 -29
  301. package/dist/store.js.map +1 -1
  302. package/dist/sync/connection.d.ts +35 -6
  303. package/dist/sync/connection.d.ts.map +1 -1
  304. package/dist/sync/connection.js +252 -47
  305. package/dist/sync/connection.js.map +1 -1
  306. package/dist/sync/engine.d.ts +83 -0
  307. package/dist/sync/engine.d.ts.map +1 -1
  308. package/dist/sync/engine.js +157 -4
  309. package/dist/sync/engine.js.map +1 -1
  310. package/dist/sync/google-calendar.d.ts +8 -0
  311. package/dist/sync/google-calendar.d.ts.map +1 -1
  312. package/dist/sync/google-calendar.js +30 -3
  313. package/dist/sync/google-calendar.js.map +1 -1
  314. package/dist/sync/guest-words.d.ts +9 -0
  315. package/dist/sync/guest-words.d.ts.map +1 -0
  316. package/dist/sync/guest-words.js +41 -0
  317. package/dist/sync/guest-words.js.map +1 -0
  318. package/dist/sync/guests.d.ts +44 -0
  319. package/dist/sync/guests.d.ts.map +1 -0
  320. package/dist/sync/guests.js +57 -0
  321. package/dist/sync/guests.js.map +1 -0
  322. package/dist/sync/index.d.ts +8 -5
  323. package/dist/sync/index.d.ts.map +1 -1
  324. package/dist/sync/index.js +2 -0
  325. package/dist/sync/index.js.map +1 -1
  326. package/dist/sync/notion-stub.d.ts +4 -1
  327. package/dist/sync/notion-stub.d.ts.map +1 -1
  328. package/dist/sync/notion-stub.js +40 -0
  329. package/dist/sync/notion-stub.js.map +1 -1
  330. package/dist/sync/notion.d.ts +43 -2
  331. package/dist/sync/notion.d.ts.map +1 -1
  332. package/dist/sync/notion.js +274 -140
  333. package/dist/sync/notion.js.map +1 -1
  334. package/dist/sync/status.d.ts +43 -0
  335. package/dist/sync/status.d.ts.map +1 -0
  336. package/dist/sync/status.js +45 -0
  337. package/dist/sync/status.js.map +1 -0
  338. package/dist/sync/types.d.ts +64 -0
  339. package/dist/sync/types.d.ts.map +1 -1
  340. package/dist/sync/types.js.map +1 -1
  341. package/dist/testing.js +1 -1
  342. package/dist/testing.js.map +1 -1
  343. package/dist/theme/contrast.d.ts +2 -0
  344. package/dist/theme/contrast.d.ts.map +1 -1
  345. package/dist/theme/contrast.js +4 -0
  346. package/dist/theme/contrast.js.map +1 -1
  347. package/dist/theme/ground.d.ts +1 -2
  348. package/dist/theme/ground.d.ts.map +1 -1
  349. package/dist/theme/ground.js +2 -5
  350. package/dist/theme/ground.js.map +1 -1
  351. package/dist/theme/marks.d.ts +14 -2
  352. package/dist/theme/marks.d.ts.map +1 -1
  353. package/dist/theme/marks.js +20 -3
  354. package/dist/theme/marks.js.map +1 -1
  355. package/dist/theme/types.d.ts +22 -0
  356. package/dist/theme/types.d.ts.map +1 -1
  357. package/dist/theme/types.js.map +1 -1
  358. package/dist/tidying.d.ts +79 -4
  359. package/dist/tidying.d.ts.map +1 -1
  360. package/dist/tidying.js +216 -9
  361. package/dist/tidying.js.map +1 -1
  362. package/dist/trait-vocabulary.d.ts +17 -0
  363. package/dist/trait-vocabulary.d.ts.map +1 -0
  364. package/dist/trait-vocabulary.js +16 -0
  365. package/dist/trait-vocabulary.js.map +1 -0
  366. package/dist/traits.d.ts +14 -7
  367. package/dist/traits.d.ts.map +1 -1
  368. package/dist/traits.js +33 -12
  369. package/dist/traits.js.map +1 -1
  370. package/dist/validate-graph.d.ts +2 -1
  371. package/dist/validate-graph.d.ts.map +1 -1
  372. package/dist/validate-graph.js +32 -1
  373. package/dist/validate-graph.js.map +1 -1
  374. package/dist/version.d.ts +1 -1
  375. package/dist/version.js +1 -1
  376. package/dist/words.d.ts +4 -1
  377. package/dist/words.d.ts.map +1 -1
  378. package/dist/words.js +4 -1
  379. package/dist/words.js.map +1 -1
  380. package/dist/workflow-shape.d.ts +217 -0
  381. package/dist/workflow-shape.d.ts.map +1 -0
  382. package/dist/workflow-shape.js +31 -0
  383. package/dist/workflow-shape.js.map +1 -0
  384. package/dist/workflows/findings.d.ts +13 -0
  385. package/dist/workflows/findings.d.ts.map +1 -0
  386. package/dist/workflows/findings.js +157 -0
  387. package/dist/workflows/findings.js.map +1 -0
  388. package/dist/workflows/generate-words.d.ts +12 -0
  389. package/dist/workflows/generate-words.d.ts.map +1 -0
  390. package/dist/workflows/generate-words.js +25 -0
  391. package/dist/workflows/generate-words.js.map +1 -0
  392. package/dist/workflows/generate.d.ts +59 -0
  393. package/dist/workflows/generate.d.ts.map +1 -0
  394. package/dist/workflows/generate.js +165 -0
  395. package/dist/workflows/generate.js.map +1 -0
  396. package/dist/workflows/judging.d.ts +17 -0
  397. package/dist/workflows/judging.d.ts.map +1 -0
  398. package/dist/workflows/judging.js +11 -0
  399. package/dist/workflows/judging.js.map +1 -0
  400. package/dist/workflows/next.d.ts +18 -0
  401. package/dist/workflows/next.d.ts.map +1 -0
  402. package/dist/workflows/next.js +75 -0
  403. package/dist/workflows/next.js.map +1 -0
  404. package/dist/workflows/on-the-map.d.ts +70 -0
  405. package/dist/workflows/on-the-map.d.ts.map +1 -0
  406. package/dist/workflows/on-the-map.js +94 -0
  407. package/dist/workflows/on-the-map.js.map +1 -0
  408. package/dist/workflows/policies.d.ts +39 -0
  409. package/dist/workflows/policies.d.ts.map +1 -0
  410. package/dist/workflows/policies.js +95 -0
  411. package/dist/workflows/policies.js.map +1 -0
  412. package/dist/workflows/resolve.d.ts +55 -0
  413. package/dist/workflows/resolve.d.ts.map +1 -0
  414. package/dist/workflows/resolve.js +57 -0
  415. package/dist/workflows/resolve.js.map +1 -0
  416. package/dist/workflows/schedule.d.ts +28 -0
  417. package/dist/workflows/schedule.d.ts.map +1 -0
  418. package/dist/workflows/schedule.js +160 -0
  419. package/dist/workflows/schedule.js.map +1 -0
  420. package/dist/workflows/step-act.d.ts +6 -0
  421. package/dist/workflows/step-act.d.ts.map +1 -0
  422. package/dist/workflows/step-act.js +79 -0
  423. package/dist/workflows/step-act.js.map +1 -0
  424. package/dist/workflows/step-agent.d.ts +4 -0
  425. package/dist/workflows/step-agent.d.ts.map +1 -0
  426. package/dist/workflows/step-agent.js +55 -0
  427. package/dist/workflows/step-agent.js.map +1 -0
  428. package/dist/workflows/step-archive.d.ts +8 -0
  429. package/dist/workflows/step-archive.d.ts.map +1 -0
  430. package/dist/workflows/step-archive.js +74 -0
  431. package/dist/workflows/step-archive.js.map +1 -0
  432. package/dist/workflows/step-classify.d.ts +23 -0
  433. package/dist/workflows/step-classify.d.ts.map +1 -0
  434. package/dist/workflows/step-classify.js +143 -0
  435. package/dist/workflows/step-classify.js.map +1 -0
  436. package/dist/workflows/step-generate.d.ts +7 -0
  437. package/dist/workflows/step-generate.d.ts.map +1 -0
  438. package/dist/workflows/step-generate.js +185 -0
  439. package/dist/workflows/step-generate.js.map +1 -0
  440. package/dist/workflows/steps.d.ts +75 -0
  441. package/dist/workflows/steps.d.ts.map +1 -0
  442. package/dist/workflows/steps.js +40 -0
  443. package/dist/workflows/steps.js.map +1 -0
  444. package/dist/workflows/triggered.d.ts +22 -0
  445. package/dist/workflows/triggered.d.ts.map +1 -0
  446. package/dist/workflows/triggered.js +52 -0
  447. package/dist/workflows/triggered.js.map +1 -0
  448. package/dist/workflows/values.d.ts +28 -0
  449. package/dist/workflows/values.d.ts.map +1 -0
  450. package/dist/workflows/values.js +75 -0
  451. package/dist/workflows/values.js.map +1 -0
  452. package/dist/workflows/words.d.ts +10 -0
  453. package/dist/workflows/words.d.ts.map +1 -0
  454. package/dist/workflows/words.js +30 -0
  455. package/dist/workflows/words.js.map +1 -0
  456. package/dist/workflows/world.d.ts +23 -0
  457. package/dist/workflows/world.d.ts.map +1 -0
  458. package/dist/workflows/world.js +50 -0
  459. package/dist/workflows/world.js.map +1 -0
  460. package/dist/workflows.d.ts +35 -0
  461. package/dist/workflows.d.ts.map +1 -0
  462. package/dist/workflows.js +20 -0
  463. package/dist/workflows.js.map +1 -0
  464. package/package.json +18 -2
@@ -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"}
@@ -0,0 +1,160 @@
1
+ /*
2
+ * WHEN A WORKFLOW RUNS ON A CLOCK (Roadmap f-jobs-declared): words a person
3
+ * writes — "day 03:00", "weekday 09:00", "sunday 18:00", "month 1 09:00",
4
+ * "hour" — or five-field cron, both read as the same table of minutes,
5
+ * hours, days of the month, months and weekdays, and both on the wall clock
6
+ * of the app's time zone (the brand's `timeZone`). DST is the wall clock's:
7
+ * "sunday 18:00" is 6 PM on the Sunday the clocks spring forward too. A time
8
+ * the clock skips that day (02:30, the night it springs forward) runs the
9
+ * moment the clock jumps past it (03:00); a time it says twice (01:30, the
10
+ * night it falls back) runs once.
11
+ */
12
+ const WEEKDAYS = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];
13
+ const MONTHS = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
14
+ const range = (from, to) => new Set(Array.from({ length: to - from + 1 }, (_, i) => from + i));
15
+ /** What the words a schedule takes are, said when one cannot be read. */
16
+ export 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"';
17
+ /** A time of day: "18:00", "6:30", "6pm", "6:30 pm"; minutes after midnight, or undefined. */
18
+ function timeOf(said) {
19
+ const found = /^(\d{1,2})(?::(\d{2}))?\s*(am|pm)?$/.exec(said.trim().toLowerCase());
20
+ if (!found)
21
+ return undefined;
22
+ let hour = Number(found[1]);
23
+ const minute = found[2] === undefined ? 0 : Number(found[2]);
24
+ if (found[3]) {
25
+ if (hour < 1 || hour > 12)
26
+ return undefined;
27
+ hour = (hour % 12) + (found[3] === "pm" ? 12 : 0);
28
+ }
29
+ else if (found[2] === undefined)
30
+ return undefined;
31
+ return hour > 23 || minute > 59 ? undefined : hour * 60 + minute;
32
+ }
33
+ /** A schedule in words, or a sentence saying what could not be read. */
34
+ export function scheduleOfWords(words) {
35
+ const said = words.trim().toLowerCase().replace(/^every\s+/, "").replace(/\s+at\s+/, " ");
36
+ const all = { minutes: new Set([0]), hours: range(0, 23), days: range(1, 31), months: range(1, 12), weekdays: range(0, 6), daysSaid: false, weekdaysSaid: false };
37
+ if (said === "hour")
38
+ return all;
39
+ const [first = "", ...rest] = said.split(/\s+/);
40
+ const at = (tail) => {
41
+ if (tail.length === 0)
42
+ return 0;
43
+ const time = timeOf(tail.join(" "));
44
+ return time === undefined ? `"${tail.join(" ")}" is not a time of day; write it as "18:00" or "6 pm"` : time;
45
+ };
46
+ const daily = (time) => ({ ...all, minutes: new Set([time % 60]), hours: new Set([Math.floor(time / 60)]) });
47
+ if (first === "day") {
48
+ const time = at(rest);
49
+ return typeof time === "string" ? time : daily(time);
50
+ }
51
+ if (first === "weekday") {
52
+ const time = at(rest);
53
+ return typeof time === "string" ? time : { ...daily(time), weekdays: range(1, 5), weekdaysSaid: true };
54
+ }
55
+ const weekday = WEEKDAYS.findIndex((day) => first === day || first === `${day}s` || (first.length >= 3 && day.startsWith(first)));
56
+ if (weekday >= 0) {
57
+ const time = at(rest);
58
+ return typeof time === "string" ? time : { ...daily(time), weekdays: new Set([weekday]), weekdaysSaid: true };
59
+ }
60
+ if (first === "month") {
61
+ const day = Number(/^(\d{1,2})(?:st|nd|rd|th)?$/.exec(rest[0] ?? "")?.[1]);
62
+ if (!(day >= 1 && day <= 31))
63
+ return `"month" takes the day of the month it runs on, 1 to 31, like "month 1 09:00"`;
64
+ const time = at(rest.slice(1));
65
+ return typeof time === "string" ? time : { ...daily(time), days: new Set([day]), daysSaid: true };
66
+ }
67
+ return `"${words}" is not a schedule Graview reads; it reads ${SCHEDULE_WORDS}`;
68
+ }
69
+ /** One cron field, or a sentence. */
70
+ function cronField(field, min, max, names = [], what = "field") {
71
+ const out = new Set();
72
+ const valueOf = (said) => {
73
+ const named = names.findIndex((name) => said.toLowerCase().startsWith(name.slice(0, 3)) && said.length >= 3);
74
+ if (named >= 0)
75
+ return named + (min === 1 ? 1 : 0);
76
+ return /^\d+$/.test(said) ? Number(said) : undefined;
77
+ };
78
+ for (const part of field.split(",")) {
79
+ const [span = "", stepSaid] = part.split("/");
80
+ const step = stepSaid === undefined ? 1 : Number(stepSaid);
81
+ if (!Number.isInteger(step) || step < 1)
82
+ return `the ${what} "${field}" has a step that is not a whole number`;
83
+ let from;
84
+ let to;
85
+ if (span === "*")
86
+ (from = min), (to = max);
87
+ else if (span.includes("-")) {
88
+ const [a = "", b = ""] = span.split("-");
89
+ (from = valueOf(a)), (to = valueOf(b));
90
+ }
91
+ else {
92
+ from = valueOf(span);
93
+ to = stepSaid === undefined ? from : max;
94
+ }
95
+ // Sunday as 7, as cron lets it be said.
96
+ const top = what === "weekday" ? 7 : max;
97
+ if (from === undefined || to === undefined || from < min || to > top || from > to)
98
+ return `the ${what} "${field}" is not ${min}–${max}`;
99
+ for (let value = from; value <= to; value += step)
100
+ out.add(what === "weekday" ? value % 7 : value);
101
+ }
102
+ return out;
103
+ }
104
+ /** A schedule in five-field cron, or a sentence saying what could not be read. */
105
+ export function scheduleOfCron(cron) {
106
+ const fields = cron.trim().split(/\s+/);
107
+ if (fields.length !== 5)
108
+ return `"${cron}" has ${fields.length} field${fields.length === 1 ? "" : "s"}; cron here is five: minute, hour, day of the month, month, weekday ("0 18 * * 0")`;
109
+ const minutes = cronField(fields[0], 0, 59, [], "minute");
110
+ const hours = cronField(fields[1], 0, 23, [], "hour");
111
+ const days = cronField(fields[2], 1, 31, [], "day of the month");
112
+ const months = cronField(fields[3], 1, 12, MONTHS, "month");
113
+ const weekdays = cronField(fields[4], 0, 6, WEEKDAYS, "weekday");
114
+ for (const one of [minutes, hours, days, months, weekdays])
115
+ if (typeof one === "string")
116
+ return `"${cron}" does not read: ${one}`;
117
+ return { minutes: minutes, hours: hours, days: days, months: months, weekdays: weekdays, daysSaid: fields[2] !== "*", weekdaysSaid: fields[4] !== "*" };
118
+ }
119
+ /** A clock trigger's schedule, or a sentence; undefined for a trigger that is no clock. */
120
+ export function scheduleOf(trigger) {
121
+ if (typeof trigger.every === "string")
122
+ return scheduleOfWords(trigger.every);
123
+ if (typeof trigger.cron === "string")
124
+ return scheduleOfCron(trigger.cron);
125
+ return undefined;
126
+ }
127
+ const twelve = (minutes) => {
128
+ const hour = Math.floor(minutes / 60);
129
+ const minute = minutes % 60;
130
+ return `${hour % 12 === 0 ? 12 : hour % 12}${minute === 0 ? "" : `:${String(minute).padStart(2, "0")}`} ${hour < 12 ? "AM" : "PM"}`;
131
+ };
132
+ const ordinal = (n) => `${n}${n % 100 >= 11 && n % 100 <= 13 ? "th" : ["th", "st", "nd", "rd"][n % 10] ?? "th"}`;
133
+ const capital = (said) => said.charAt(0).toUpperCase() + said.slice(1);
134
+ /** A clock trigger as a person reads it: "Every Sunday at 6 PM", "Every hour", "On the 1st of each month at 9 AM". */
135
+ export function scheduleWords(trigger) {
136
+ const schedule = scheduleOf(trigger);
137
+ const raw = trigger.every ?? trigger.cron ?? "";
138
+ if (schedule === undefined || typeof schedule === "string")
139
+ return `On the schedule “${raw}”`;
140
+ const one = (set) => (set.size === 1 ? [...set][0] : undefined);
141
+ const hour = one(schedule.hours);
142
+ const minute = one(schedule.minutes);
143
+ const allMonths = schedule.months.size === 12;
144
+ if (hour === undefined || minute === undefined || !allMonths) {
145
+ if (schedule.hours.size === 24 && minute !== undefined && !schedule.daysSaid && !schedule.weekdaysSaid && allMonths)
146
+ return minute === 0 ? "Every hour" : `Every hour at ${minute} past`;
147
+ return `On the schedule “${raw}”`;
148
+ }
149
+ const time = `at ${twelve(hour * 60 + minute)}`;
150
+ if (!schedule.daysSaid && !schedule.weekdaysSaid)
151
+ return `Every day ${time}`;
152
+ if (!schedule.daysSaid && schedule.weekdays.size === 5 && [1, 2, 3, 4, 5].every((d) => schedule.weekdays.has(d)))
153
+ return `Every weekday ${time}`;
154
+ if (!schedule.daysSaid)
155
+ return `Every ${[...schedule.weekdays].sort().map((d) => capital(WEEKDAYS[d])).join(" and ")} ${time}`;
156
+ if (!schedule.weekdaysSaid && schedule.days.size === 1)
157
+ return `On the ${ordinal([...schedule.days][0])} of each month ${time}`;
158
+ return `On the schedule “${raw}”`;
159
+ }
160
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/workflows/schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ActStep } from "../workflow-shape.js";
2
+ import type { StepKind } from "./steps.js";
3
+ /** The names a key's `{field}` template reads. */
4
+ export declare const keyFields: (key: string) => string[];
5
+ export declare const actStep: StepKind<ActStep>;
6
+ //# sourceMappingURL=step-act.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-act.d.ts","sourceRoot":"","sources":["../../src/workflows/step-act.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAa,QAAQ,EAA+B,MAAM,YAAY,CAAC;AAcnF,kDAAkD;AAClD,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,KAAG,MAAM,EAAqF,CAAC;AAGpI,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,CA6DrC,CAAC"}
@@ -0,0 +1,79 @@
1
+ import * as z from "../schema/zod.js";
2
+ import { conditionProblems } from "../job-findings.js";
3
+ import { nearestAct } from "../mutations/act-spelling.js";
4
+ /*
5
+ * RUN AN ACT (Roadmap f-job-step-types): once, or once per record `over`
6
+ * picks. The act is one the app gives — declared or derived — and what
7
+ * `{ expr }` values read is the record the step is over. `key` is the
8
+ * stable key of what it makes, a `{field}` template read on that record
9
+ * and the step's arguments: a rerun with the same key changes the record
10
+ * it made last time (`@graview/tools/workflows`).
11
+ */
12
+ const quoted = (names) => [...names].map((name) => `"${name}"`).join(", ") || "none";
13
+ /** The names a key's `{field}` template reads. */
14
+ export const keyFields = (key) => [...key.matchAll(/\{([^{}|\s]+)(?:\s*\|[^{}]*)?\}/g)].map((found) => found[1]);
15
+ export const actStep = {
16
+ key: "act",
17
+ title: "Run an act",
18
+ shape: (s) => z.strictObject({
19
+ act: s.name("act"),
20
+ over: z.optional(z.strictObject({ kind: s.name("kind"), where: z.optional(s.expression), limit: z.optional(z.number().check(z.int(), z.minimum(1), z.maximum(10_000))) })),
21
+ args: z.optional(z.record(z.string(), s.value)),
22
+ key: z.optional(s.str(1, 300)),
23
+ approve: z.optional(s.approve),
24
+ }),
25
+ findings(step, check) {
26
+ const { world, said, index } = check;
27
+ const out = [];
28
+ const at = `steps.${index}`;
29
+ if (!world.acts.includes(step.act)) {
30
+ const near = nearestAct(step.act, world.acts);
31
+ const steps = check.declared["steps"] ?? [];
32
+ out.push({
33
+ code: "workflow-act-unknown",
34
+ severity: "error",
35
+ path: `${at}.act`,
36
+ message: `${said} runs "${step.act}", which is not an act of this app.`,
37
+ fix: near ? `Did you mean "${near}"?` : "Name one of the app's acts, declared or derived (add-…, edit-<kind>, archive-<kind>).",
38
+ ...(near ? { edits: [{ op: "set-workflow", name: check.workflow, workflow: { ...check.declared, steps: steps.map((one, i) => (i === index ? { ...one, act: near } : one)) } }] } : {}),
39
+ });
40
+ }
41
+ if (step.over) {
42
+ const kind = world.kinds.get(step.over.kind);
43
+ if (!kind)
44
+ out.push({ code: "workflow-kind-unknown", severity: "error", path: `${at}.over.kind`, message: `${said} runs over "${step.over.kind}" records, and "${step.over.kind}" is not a kind of this app.`, fix: `Name one of its kinds: ${quoted(world.kinds.keys())}.` });
45
+ else if (step.over.where !== undefined) {
46
+ for (const problem of conditionProblems(step.over.where, step.over.kind, kind, world)) {
47
+ out.push({ code: "workflow-where-invalid", severity: "error", path: `${at}.over.where`, message: `${said} cannot pick its records: ${problem}.`, fix: `Write it in the rule language over the fields of "${step.over.kind}" (${quoted(Object.keys(kind.fields))}) and its relations.` });
48
+ }
49
+ }
50
+ }
51
+ if (step.key !== undefined) {
52
+ const kind = step.over ? world.kinds.get(step.over.kind) : undefined;
53
+ const readable = new Set(["id", "label", ...Object.keys(step.args ?? {}), ...(kind ? [...Object.keys(kind.fields), ...kind.computed] : [])]);
54
+ const fields = keyFields(step.key);
55
+ if (fields.length === 0)
56
+ out.push({ code: "workflow-key-field-unknown", severity: "error", path: `${at}.key`, message: `${said}'s key "${step.key}" reads no field, so every run would make the same one record.`, fix: `Say what tells two apart in braces, like "{id}" or "{id}:{date}".` });
57
+ for (const field of fields) {
58
+ if (readable.has(field) || (step.over && !kind))
59
+ continue;
60
+ out.push({
61
+ code: "workflow-key-field-unknown",
62
+ severity: "error",
63
+ path: `${at}.key`,
64
+ message: `${said}'s key reads "{${field}}", and ${step.over ? `"${step.over.kind}" has no field called that and the step hands the act no argument called that` : "the step hands the act no argument called that"}.`,
65
+ fix: `Read one of ${quoted(readable)}.`,
66
+ });
67
+ }
68
+ }
69
+ return out;
70
+ },
71
+ words(step, noun) {
72
+ const over = step.over ? ` for each ${noun(step.over.kind)}${step.over.where ? ` where ${step.over.where}` : ""}${step.over.limit ? ` (at most ${step.over.limit})` : ""}` : "";
73
+ return `Run “${step.act}”${over}`;
74
+ },
75
+ touches(step, world) {
76
+ return { reads: step.over ? [step.over.kind] : [], writes: [...new Set([...(world.actOn(step.act) ?? []), ...(world.actMakes(step.act) ?? [])])] };
77
+ },
78
+ };
79
+ //# sourceMappingURL=step-act.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-act.js","sourceRoot":"","sources":["../../src/workflows/step-act.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AgentStep } from "../workflow-shape.js";
2
+ import type { StepKind } from "./steps.js";
3
+ export declare const agentStep: StepKind<AgentStep>;
4
+ //# sourceMappingURL=step-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-agent.d.ts","sourceRoot":"","sources":["../../src/workflows/step-agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAa,QAAQ,EAA+B,MAAM,YAAY,CAAC;AAanF,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,SAAS,CA2CzC,CAAC"}
@@ -0,0 +1,55 @@
1
+ import * as z from "../schema/zod.js";
2
+ /*
3
+ * LET A MODEL PROPOSE (Roadmap f-job-step-types): an instruction in words,
4
+ * the kinds whose records it is shown and the acts it may propose — never
5
+ * any other. Built on dreaming's runner in `@graview/tools/workflows`: what
6
+ * it proposes is applied, suggested or let go by `approve` and how sure it
7
+ * is. With no model lent, the step is skipped and the run says so.
8
+ */
9
+ const quoted = (names) => [...names].map((name) => `"${name}"`).join(", ") || "none";
10
+ export const agentStep = {
11
+ key: "agent",
12
+ title: "Let a model propose",
13
+ shape: (s) => z.strictObject({
14
+ agent: s.str(1, 2000),
15
+ reads: z.array(s.name("kind")).check(z.maxLength(40)),
16
+ acts: z.array(s.str(1, 120)).check(z.maxLength(60)),
17
+ model: z.optional(s.str(1, 120)),
18
+ budget: z.optional(z.strictObject({ calls: z.optional(z.number().check(z.int(), z.minimum(1), z.maximum(1000))), tokens: z.optional(z.number().check(z.int(), z.minimum(1), z.maximum(10_000_000))) })),
19
+ approve: z.optional(s.approve),
20
+ }),
21
+ findings(step, check) {
22
+ const { world, said, index } = check;
23
+ const at = `steps.${index}`;
24
+ const out = [];
25
+ step.reads.forEach((kind, i) => {
26
+ if (!world.kinds.has(kind))
27
+ out.push({ code: "workflow-kind-unknown", severity: "error", path: `${at}.reads.${i}`, message: `${said} reads "${kind}" records, and "${kind}" is not a kind of this app.`, fix: `Name one of its kinds: ${quoted(world.kinds.keys())}.` });
28
+ });
29
+ if (step.acts.length === 0) {
30
+ const over = world.acts.filter((act) => (world.actOn(act) ?? []).some((kind) => step.reads.includes(kind)));
31
+ const steps = check.declared["steps"] ?? [];
32
+ out.push({
33
+ code: "workflow-agent-acts-empty",
34
+ severity: "error",
35
+ path: `${at}.acts`,
36
+ message: `${said} lets a model propose, and names no act it may propose — so it could do nothing.`,
37
+ fix: over.length > 0 ? `Name the acts it may propose, like ${quoted(over.slice(0, 4))}.` : "Name the acts it may propose.",
38
+ ...(over.length > 0 ? { edits: [{ op: "set-workflow", name: check.workflow, workflow: { ...check.declared, steps: steps.map((one, i) => (i === index ? { ...one, acts: over.slice(0, 4) } : one)) } }] } : {}),
39
+ });
40
+ }
41
+ step.acts.forEach((act, i) => {
42
+ if (!world.acts.includes(act))
43
+ out.push({ code: "workflow-act-unknown", severity: "error", path: `${at}.acts.${i}`, message: `${said} lets a model propose "${act}", which is not an act of this app.`, fix: "Name one of the app's acts, declared or derived." });
44
+ });
45
+ return out;
46
+ },
47
+ words(step, noun) {
48
+ const reads = step.reads.length > 0 ? ` reading ${step.reads.map(noun).join(", ")}` : "";
49
+ return `Ask a model to ${step.agent.replace(/^./, (first) => first.toLowerCase()).replace(/[.!]$/, "")}${reads}, proposing ${step.acts.map((act) => `“${act}”`).join(", ") || "nothing"}`;
50
+ },
51
+ touches(step, world) {
52
+ return { reads: [...step.reads], writes: [...new Set(step.acts.flatMap((act) => [...(world.actOn(act) ?? []), ...(world.actMakes(act) ?? [])]))] };
53
+ },
54
+ };
55
+ //# sourceMappingURL=step-agent.js.map