@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,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-agent.js","sourceRoot":"","sources":["../../src/workflows/step-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ArchiveStep } from "../workflow-shape.js";
2
+ import type { StepKind } from "./steps.js";
3
+ /** How long `after` asks a record to have stood, in milliseconds, or undefined when its words do not read. */
4
+ export declare function afterMs(after: string): number | undefined;
5
+ /** `after` said: "3 days after it last changed", "7 days after its date". */
6
+ export declare function afterWords(after: ArchiveStep["after"]): string;
7
+ export declare const archiveStep: StepKind<ArchiveStep>;
8
+ //# sourceMappingURL=step-archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-archive.d.ts","sourceRoot":"","sources":["../../src/workflows/step-archive.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAuB,QAAQ,EAA+B,MAAM,YAAY,CAAC;AAoB7F,8GAA8G;AAC9G,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKzD;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,MAAM,CAI9D;AAED,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,WAAW,CAwC7C,CAAC"}
@@ -0,0 +1,74 @@
1
+ import * as z from "../schema/zod.js";
2
+ import { conditionProblems } from "../job-findings.js";
3
+ /*
4
+ * SET ASIDE WHAT IS DONE WITH (Roadmap f-retention-rules): the records of
5
+ * one kind a rule holds of, once they have stood so long — "archive
6
+ * grocery lists where status == 'done' after 3 days". Archived, never
7
+ * removed (FR-173): each keeps its fields, its links and its history, and
8
+ * "Bring it back" undoes it. Deterministic, so it spends no model. The
9
+ * run holds it to what people said — a record left alone, a kind the app
10
+ * says is never tidied — and never sets aside again a record a person
11
+ * brought back from one of this workflow's archives
12
+ * (`@graview/tools/workflows`).
13
+ */
14
+ const quoted = (names) => [...names].map((name) => `"${name}"`).join(", ") || "none";
15
+ /** How long, in words: "3 days", "1 day", "2 weeks", "12 hours". */
16
+ const AFTER = /^\s*(\d{1,4})\s*(hour|hours|day|days|week|weeks)\s*$/i;
17
+ /** How long `after` asks a record to have stood, in milliseconds, or undefined when its words do not read. */
18
+ export function afterMs(after) {
19
+ const found = AFTER.exec(after);
20
+ if (!found)
21
+ return undefined;
22
+ const unit = found[2].toLowerCase().replace(/s$/, "");
23
+ return Number(found[1]) * (unit === "hour" ? 3_600_000 : unit === "day" ? 86_400_000 : 7 * 86_400_000);
24
+ }
25
+ /** `after` said: "3 days after it last changed", "7 days after its date". */
26
+ export function afterWords(after) {
27
+ if (after === undefined)
28
+ return "";
29
+ if (typeof after === "string")
30
+ return ` ${after.trim()} after it last changed`;
31
+ return ` ${after.days} ${after.days === 1 ? "day" : "days"} after its ${after.field.replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase()}`;
32
+ }
33
+ export const archiveStep = {
34
+ key: "archive",
35
+ title: "Archive what is done with",
36
+ shape: (s) => z.strictObject({
37
+ archive: s.name("kind"),
38
+ where: z.optional(s.expression),
39
+ after: z.optional(z.union([s.str(1, 40), z.strictObject({ field: s.str(1, 120), days: z.number().check(z.int(), z.minimum(0), z.maximum(36_500)) })])),
40
+ approve: z.optional(s.approve),
41
+ }),
42
+ findings(step, check) {
43
+ const { world, said, index } = check;
44
+ const at = `steps.${index}`;
45
+ const out = [];
46
+ const kind = world.kinds.get(step.archive);
47
+ if (!kind) {
48
+ out.push({ code: "workflow-kind-unknown", severity: "error", path: `${at}.archive`, message: `${said} archives "${step.archive}" records, and "${step.archive}" is not a kind of this app.`, fix: `Name one of its kinds: ${quoted(world.kinds.keys())}.` });
49
+ return out;
50
+ }
51
+ if (!world.acts.includes(`archive-${step.archive}`)) {
52
+ out.push({ code: "workflow-archive-never", severity: "error", path: `${at}.archive`, message: `${said} archives ${world.noun(step.archive)} records, and the app says they are never archived.`, fix: `Take "archives: false" off "${step.archive}", or let this step go.` });
53
+ }
54
+ if (step.where !== undefined) {
55
+ for (const problem of conditionProblems(step.where, step.archive, kind, world)) {
56
+ out.push({ code: "workflow-where-invalid", severity: "error", path: `${at}.where`, message: `${said} cannot pick its records: ${problem}.`, fix: `Write it in the rule language over the fields of "${step.archive}" (${quoted(Object.keys(kind.fields))}) and its relations.` });
57
+ }
58
+ }
59
+ if (typeof step.after === "string" && afterMs(step.after) === undefined) {
60
+ out.push({ code: "workflow-archive-after-invalid", severity: "error", path: `${at}.after`, message: `${said} waits "${step.after}", which does not read as how long.`, fix: `Say it as a number and hours, days or weeks — "3 days" — or as { "field": "<a date field>", "days": 3 }.` });
61
+ }
62
+ else if (typeof step.after === "object" && !kind.fields[step.after.field]) {
63
+ out.push({ code: "workflow-archive-after-invalid", severity: "error", path: `${at}.after.field`, message: `${said} counts from "${step.after.field}", and "${step.archive}" has no field called that.`, fix: `Count from one of its fields: ${quoted(Object.keys(kind.fields))}.` });
64
+ }
65
+ return out;
66
+ },
67
+ words(step, noun) {
68
+ return `Archive ${noun(step.archive)} records${step.where ? ` where ${step.where}` : ""}${afterWords(step.after)}`;
69
+ },
70
+ touches(step, _world) {
71
+ return { reads: [step.archive], writes: [step.archive] };
72
+ },
73
+ };
74
+ //# sourceMappingURL=step-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-archive.js","sourceRoot":"","sources":["../../src/workflows/step-archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ClassifyFloorRule, ClassifyStep } from "../workflow-shape.js";
2
+ import type { KindNoun, StepKind } from "./steps.js";
3
+ /** Whether a step's changes wait for a person: always, unless the step says its own `approve` — and an option in `confirm` always. */
4
+ export declare const classifyAsks: (step: ClassifyStep, option: string) => boolean;
5
+ /** Whether a judgment is sure enough to be set without asking: it reaches its option's `applyAt`, and the option is not one `confirm` names. */
6
+ export declare const classifyApplies: (step: ClassifyStep, option: string, confidence: number) => boolean;
7
+ /** How many links a text holds: http, https and www addresses. */
8
+ export declare const linksIn: (text: string) => number;
9
+ /** A floor rule's verdict on a record: the option, and why, in words a person reads. */
10
+ export interface FloorReading {
11
+ readonly option: string;
12
+ readonly basis: string;
13
+ }
14
+ /**
15
+ * THE FLOOR: the first option, in the order the step says them, whose rule
16
+ * holds of a record — its text (every string field, joined) holds at least
17
+ * `links` links, or one of `words` as a whole word in any case, or its
18
+ * `expr` holds (`holds(option)`, the rule language read by the caller).
19
+ * Undefined when none holds: the record is left for a person.
20
+ */
21
+ export declare function floorLabel(floor: Readonly<Record<string, ClassifyFloorRule>> | undefined, text: string, holds?: (option: string) => boolean): FloorReading | undefined;
22
+ /** One line: "Label each feedback's category as spam, rude or good-to-show; archive spam at 90% sure (asks before good-to-show)". */
23
+ export declare function classifyWords(step: ClassifyStep, noun: KindNoun, options?: readonly string[]): string;
24
+ export declare const classifyStep: StepKind<ClassifyStep>;
25
+ //# sourceMappingURL=step-classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-classify.d.ts","sourceRoot":"","sources":["../../src/workflows/step-classify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAa,QAAQ,EAA+B,MAAM,YAAY,CAAC;AA2B7F,sIAAsI;AACtI,eAAO,MAAM,YAAY,GAAI,MAAM,YAAY,EAAE,QAAQ,MAAM,KAAG,OAAwG,CAAC;AAE3K,gJAAgJ;AAChJ,eAAO,MAAM,eAAe,GAAI,MAAM,YAAY,EAAE,QAAQ,MAAM,EAAE,YAAY,MAAM,KAAG,OAGxF,CAAC;AAIF,kEAAkE;AAClE,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAAuC,CAAC;AAI/E,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAqB,GAAG,YAAY,GAAG,SAAS,CAWnL;AAKD,qIAAqI;AACrI,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOrG;AAED,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,YAAY,CAuF/C,CAAC"}