@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.
- package/dist/app.d.ts +12 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js.map +1 -1
- package/dist/arranging.js +2 -2
- package/dist/arranging.js.map +1 -1
- package/dist/cli/check/index.d.ts +1 -0
- package/dist/cli/check/index.d.ts.map +1 -1
- package/dist/cli/check/index.js +1 -0
- package/dist/cli/check/index.js.map +1 -1
- package/dist/cli/check/workflows.d.ts +11 -0
- package/dist/cli/check/workflows.d.ts.map +1 -0
- package/dist/cli/check/workflows.js +20 -0
- package/dist/cli/check/workflows.js.map +1 -0
- package/dist/cli/check.d.ts.map +1 -1
- package/dist/cli/check.js +2 -1
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/describe.d.ts.map +1 -1
- package/dist/cli/describe.js +31 -1
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/document-schema.d.ts.map +1 -1
- package/dist/cli/document-schema.js +9 -0
- package/dist/cli/document-schema.js.map +1 -1
- package/dist/compose.d.ts +1 -1
- package/dist/compose.d.ts.map +1 -1
- package/dist/document/amount.d.ts +1 -1
- package/dist/document/amount.d.ts.map +1 -1
- package/dist/document/amount.js +2 -2
- package/dist/document/amount.js.map +1 -1
- package/dist/document/blocks.d.ts.map +1 -1
- package/dist/document/blocks.js +17 -1
- package/dist/document/blocks.js.map +1 -1
- package/dist/document/brand-check.d.ts.map +1 -1
- package/dist/document/brand-check.js +8 -2
- package/dist/document/brand-check.js.map +1 -1
- package/dist/document/compile-checked.d.ts.map +1 -1
- package/dist/document/compile-checked.js +4 -2
- package/dist/document/compile-checked.js.map +1 -1
- package/dist/document/compile.d.ts.map +1 -1
- package/dist/document/compile.js +48 -9
- package/dist/document/compile.js.map +1 -1
- package/dist/document/compiled.d.ts +14 -0
- package/dist/document/compiled.d.ts.map +1 -1
- package/dist/document/compiled.js +39 -4
- package/dist/document/compiled.js.map +1 -1
- package/dist/document/connection-findings.js +93 -21
- package/dist/document/connection-findings.js.map +1 -1
- package/dist/document/connection-spec.d.ts +54 -1
- package/dist/document/connection-spec.d.ts.map +1 -1
- package/dist/document/connection-spec.js +76 -8
- package/dist/document/connection-spec.js.map +1 -1
- package/dist/document/derives-findings.d.ts +4 -0
- package/dist/document/derives-findings.d.ts.map +1 -0
- package/dist/document/derives-findings.js +68 -0
- package/dist/document/derives-findings.js.map +1 -0
- package/dist/document/describe-forms.js +2 -2
- package/dist/document/describe-forms.js.map +1 -1
- package/dist/document/diff.d.ts +6 -0
- package/dist/document/diff.d.ts.map +1 -1
- package/dist/document/diff.js +43 -1
- package/dist/document/diff.js.map +1 -1
- package/dist/document/edit.d.ts +1 -1
- package/dist/document/edit.d.ts.map +1 -1
- package/dist/document/edit.js +264 -23
- package/dist/document/edit.js.map +1 -1
- package/dist/document/expr/evaluate.d.ts +7 -0
- package/dist/document/expr/evaluate.d.ts.map +1 -1
- package/dist/document/expr/evaluate.js +29 -2
- package/dist/document/expr/evaluate.js.map +1 -1
- package/dist/document/format-words.d.ts +1 -0
- package/dist/document/format-words.d.ts.map +1 -1
- package/dist/document/format-words.js +2 -2
- package/dist/document/format-words.js.map +1 -1
- package/dist/document/kept-in-step-with.d.ts +20 -0
- package/dist/document/kept-in-step-with.d.ts.map +1 -0
- package/dist/document/kept-in-step-with.js +38 -0
- package/dist/document/kept-in-step-with.js.map +1 -0
- package/dist/document/kept-in-step.d.ts.map +1 -1
- package/dist/document/kept-in-step.js +3 -1
- package/dist/document/kept-in-step.js.map +1 -1
- package/dist/document/money.d.ts +10 -2
- package/dist/document/money.d.ts.map +1 -1
- package/dist/document/money.js +14 -5
- package/dist/document/money.js.map +1 -1
- package/dist/document/policy-words.d.ts +2 -0
- package/dist/document/policy-words.d.ts.map +1 -1
- package/dist/document/policy-words.js +11 -1
- package/dist/document/policy-words.js.map +1 -1
- package/dist/document/schema.d.ts +46 -1
- package/dist/document/schema.d.ts.map +1 -1
- package/dist/document/schema.js +48 -8
- package/dist/document/schema.js.map +1 -1
- package/dist/document/template-parse.d.ts.map +1 -1
- package/dist/document/template-parse.js +7 -1
- package/dist/document/template-parse.js.map +1 -1
- package/dist/document/template.d.ts +2 -0
- package/dist/document/template.d.ts.map +1 -1
- package/dist/document/template.js +10 -1
- package/dist/document/template.js.map +1 -1
- package/dist/document/to-document.js +2 -2
- package/dist/document/to-document.js.map +1 -1
- package/dist/document/workflow-spec.d.ts +72 -0
- package/dist/document/workflow-spec.d.ts.map +1 -0
- package/dist/document/workflow-spec.js +45 -0
- package/dist/document/workflow-spec.js.map +1 -0
- package/dist/document.schema.json +883 -4
- package/dist/head.d.ts +81 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +123 -0
- package/dist/head.js.map +1 -0
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +2 -0
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/installation.d.ts +1 -1
- package/dist/job-findings.d.ts +5 -0
- package/dist/job-findings.d.ts.map +1 -1
- package/dist/job-findings.js +9 -3
- package/dist/job-findings.js.map +1 -1
- package/dist/keep-linked.d.ts +45 -0
- package/dist/keep-linked.d.ts.map +1 -0
- package/dist/keep-linked.js +188 -0
- package/dist/keep-linked.js.map +1 -0
- package/dist/mutations/derive-edits.js +2 -2
- package/dist/mutations/propose-changes.d.ts +24 -0
- package/dist/mutations/propose-changes.d.ts.map +1 -0
- package/dist/mutations/propose-changes.js +30 -0
- package/dist/mutations/propose-changes.js.map +1 -0
- package/dist/mutations/vote-suggestion.d.ts +30 -0
- package/dist/mutations/vote-suggestion.d.ts.map +1 -1
- package/dist/mutations/vote-suggestion.js +23 -0
- package/dist/mutations/vote-suggestion.js.map +1 -1
- package/dist/mutations/words.js +3 -3
- package/dist/ops/digest.d.ts +3 -1
- package/dist/ops/digest.d.ts.map +1 -1
- package/dist/ops/digest.js +7 -2
- package/dist/ops/digest.js.map +1 -1
- package/dist/ops/lineage.d.ts +19 -2
- package/dist/ops/lineage.d.ts.map +1 -1
- package/dist/ops/lineage.js +8 -4
- package/dist/ops/lineage.js.map +1 -1
- package/dist/ops/log.d.ts.map +1 -1
- package/dist/ops/log.js +13 -2
- package/dist/ops/log.js.map +1 -1
- package/dist/ops/suggestions.d.ts +47 -5
- package/dist/ops/suggestions.d.ts.map +1 -1
- package/dist/ops/suggestions.js +88 -13
- package/dist/ops/suggestions.js.map +1 -1
- package/dist/ops/tidying.d.ts.map +1 -1
- package/dist/ops/tidying.js +6 -1
- package/dist/ops/tidying.js.map +1 -1
- package/dist/ops/types.d.ts +28 -0
- package/dist/ops/types.d.ts.map +1 -1
- package/dist/ops/undo.d.ts.map +1 -1
- package/dist/ops/undo.js +17 -0
- package/dist/ops/undo.js.map +1 -1
- package/dist/permissions/policy.d.ts +7 -0
- package/dist/permissions/policy.d.ts.map +1 -1
- package/dist/permissions/policy.js +12 -0
- package/dist/permissions/policy.js.map +1 -1
- package/dist/permissions/types.d.ts +27 -0
- package/dist/permissions/types.d.ts.map +1 -1
- package/dist/permissions/types.js.map +1 -1
- package/dist/places.d.ts +10 -0
- package/dist/places.d.ts.map +1 -1
- package/dist/places.js +35 -1
- package/dist/places.js.map +1 -1
- package/dist/scene.d.ts +2 -0
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +2 -0
- package/dist/scene.js.map +1 -1
- package/dist/schema/amount-mark.d.ts +2 -0
- package/dist/schema/amount-mark.d.ts.map +1 -1
- package/dist/schema/amount-mark.js.map +1 -1
- package/dist/schema/amount-words.js +2 -2
- package/dist/schema/amount-words.js.map +1 -1
- package/dist/schema/choice-words.js +2 -2
- package/dist/schema/define-node.d.ts +8 -2
- package/dist/schema/define-node.d.ts.map +1 -1
- package/dist/schema/define-node.js +2 -2
- package/dist/schema/define-node.js.map +1 -1
- package/dist/schema/humanize.d.ts +17 -0
- package/dist/schema/humanize.d.ts.map +1 -1
- package/dist/schema/humanize.js +28 -1
- package/dist/schema/humanize.js.map +1 -1
- package/dist/schema/reading.d.ts +8 -0
- package/dist/schema/reading.d.ts.map +1 -1
- package/dist/schema/reading.js +16 -2
- package/dist/schema/reading.js.map +1 -1
- package/dist/schema/types.d.ts +8 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/value-words.js +2 -2
- package/dist/schema/value-words.js.map +1 -1
- package/dist/starting-document.d.ts +16 -3
- package/dist/starting-document.d.ts.map +1 -1
- package/dist/starting-document.js +32 -5
- package/dist/starting-document.js.map +1 -1
- package/dist/store.d.ts +47 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +176 -13
- package/dist/store.js.map +1 -1
- package/dist/sync/connection.d.ts +24 -5
- package/dist/sync/connection.d.ts.map +1 -1
- package/dist/sync/connection.js +168 -31
- package/dist/sync/connection.js.map +1 -1
- package/dist/sync/engine.d.ts +97 -0
- package/dist/sync/engine.d.ts.map +1 -1
- package/dist/sync/engine.js +159 -1
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/google-calendar.d.ts.map +1 -1
- package/dist/sync/google-calendar.js +18 -1
- package/dist/sync/google-calendar.js.map +1 -1
- package/dist/sync/guest-words.d.ts +9 -0
- package/dist/sync/guest-words.d.ts.map +1 -0
- package/dist/sync/guest-words.js +41 -0
- package/dist/sync/guest-words.js.map +1 -0
- package/dist/sync/index.d.ts +8 -5
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/notion-stub.d.ts +4 -1
- package/dist/sync/notion-stub.d.ts.map +1 -1
- package/dist/sync/notion-stub.js +40 -0
- package/dist/sync/notion-stub.js.map +1 -1
- package/dist/sync/notion.d.ts +44 -2
- package/dist/sync/notion.d.ts.map +1 -1
- package/dist/sync/notion.js +289 -143
- package/dist/sync/notion.js.map +1 -1
- package/dist/sync/status.d.ts +43 -0
- package/dist/sync/status.d.ts.map +1 -0
- package/dist/sync/status.js +46 -0
- package/dist/sync/status.js.map +1 -0
- package/dist/sync/types.d.ts +60 -0
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/types.js.map +1 -1
- package/dist/theme/marks.d.ts +12 -0
- package/dist/theme/marks.d.ts.map +1 -1
- package/dist/theme/marks.js +5 -0
- package/dist/theme/marks.js.map +1 -1
- package/dist/tidying.d.ts +53 -4
- package/dist/tidying.d.ts.map +1 -1
- package/dist/tidying.js +110 -8
- package/dist/tidying.js.map +1 -1
- package/dist/validate-graph.d.ts +2 -1
- package/dist/validate-graph.d.ts.map +1 -1
- package/dist/validate-graph.js +32 -1
- package/dist/validate-graph.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/words.d.ts +4 -1
- package/dist/words.d.ts.map +1 -1
- package/dist/words.js +4 -1
- package/dist/words.js.map +1 -1
- package/dist/workflow-shape.d.ts +223 -0
- package/dist/workflow-shape.d.ts.map +1 -0
- package/dist/workflow-shape.js +31 -0
- package/dist/workflow-shape.js.map +1 -0
- package/dist/workflows/findings.d.ts +13 -0
- package/dist/workflows/findings.d.ts.map +1 -0
- package/dist/workflows/findings.js +157 -0
- package/dist/workflows/findings.js.map +1 -0
- package/dist/workflows/generate-words.d.ts +12 -0
- package/dist/workflows/generate-words.d.ts.map +1 -0
- package/dist/workflows/generate-words.js +25 -0
- package/dist/workflows/generate-words.js.map +1 -0
- package/dist/workflows/generate.d.ts +59 -0
- package/dist/workflows/generate.d.ts.map +1 -0
- package/dist/workflows/generate.js +165 -0
- package/dist/workflows/generate.js.map +1 -0
- package/dist/workflows/judging.d.ts +17 -0
- package/dist/workflows/judging.d.ts.map +1 -0
- package/dist/workflows/judging.js +11 -0
- package/dist/workflows/judging.js.map +1 -0
- package/dist/workflows/next.d.ts +18 -0
- package/dist/workflows/next.d.ts.map +1 -0
- package/dist/workflows/next.js +75 -0
- package/dist/workflows/next.js.map +1 -0
- package/dist/workflows/on-the-map.d.ts +79 -0
- package/dist/workflows/on-the-map.d.ts.map +1 -0
- package/dist/workflows/on-the-map.js +96 -0
- package/dist/workflows/on-the-map.js.map +1 -0
- package/dist/workflows/policies.d.ts +39 -0
- package/dist/workflows/policies.d.ts.map +1 -0
- package/dist/workflows/policies.js +95 -0
- package/dist/workflows/policies.js.map +1 -0
- package/dist/workflows/resolve.d.ts +55 -0
- package/dist/workflows/resolve.d.ts.map +1 -0
- package/dist/workflows/resolve.js +57 -0
- package/dist/workflows/resolve.js.map +1 -0
- package/dist/workflows/schedule.d.ts +28 -0
- package/dist/workflows/schedule.d.ts.map +1 -0
- package/dist/workflows/schedule.js +160 -0
- package/dist/workflows/schedule.js.map +1 -0
- package/dist/workflows/step-act.d.ts +6 -0
- package/dist/workflows/step-act.d.ts.map +1 -0
- package/dist/workflows/step-act.js +79 -0
- package/dist/workflows/step-act.js.map +1 -0
- package/dist/workflows/step-agent.d.ts +4 -0
- package/dist/workflows/step-agent.d.ts.map +1 -0
- package/dist/workflows/step-agent.js +55 -0
- package/dist/workflows/step-agent.js.map +1 -0
- package/dist/workflows/step-archive.d.ts +8 -0
- package/dist/workflows/step-archive.d.ts.map +1 -0
- package/dist/workflows/step-archive.js +74 -0
- package/dist/workflows/step-archive.js.map +1 -0
- package/dist/workflows/step-classify.d.ts +25 -0
- package/dist/workflows/step-classify.d.ts.map +1 -0
- package/dist/workflows/step-classify.js +160 -0
- package/dist/workflows/step-classify.js.map +1 -0
- package/dist/workflows/step-generate.d.ts +7 -0
- package/dist/workflows/step-generate.d.ts.map +1 -0
- package/dist/workflows/step-generate.js +185 -0
- package/dist/workflows/step-generate.js.map +1 -0
- package/dist/workflows/steps.d.ts +75 -0
- package/dist/workflows/steps.d.ts.map +1 -0
- package/dist/workflows/steps.js +40 -0
- package/dist/workflows/steps.js.map +1 -0
- package/dist/workflows/triggered.d.ts +35 -0
- package/dist/workflows/triggered.d.ts.map +1 -0
- package/dist/workflows/triggered.js +69 -0
- package/dist/workflows/triggered.js.map +1 -0
- package/dist/workflows/values.d.ts +28 -0
- package/dist/workflows/values.d.ts.map +1 -0
- package/dist/workflows/values.js +75 -0
- package/dist/workflows/values.js.map +1 -0
- package/dist/workflows/words.d.ts +10 -0
- package/dist/workflows/words.d.ts.map +1 -0
- package/dist/workflows/words.js +30 -0
- package/dist/workflows/words.js.map +1 -0
- package/dist/workflows/world.d.ts +23 -0
- package/dist/workflows/world.d.ts.map +1 -0
- package/dist/workflows/world.js +50 -0
- package/dist/workflows/world.js.map +1 -0
- package/dist/workflows.d.ts +35 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +20 -0
- package/dist/workflows.js.map +1 -0
- 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 @@
|
|
|
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"}
|