@monotykamary/localterm-server 1.22.0 → 1.23.1
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/automation-scheduler.d.ts.map +1 -1
- package/dist/automation-scheduler.js +5 -1
- package/dist/automation-scheduler.js.map +1 -1
- package/dist/automation-store.d.ts.map +1 -1
- package/dist/automation-store.js +27 -12
- package/dist/automation-store.js.map +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -3
- package/dist/constants.js.map +1 -1
- package/dist/folder-watch-manager.d.ts +33 -0
- package/dist/folder-watch-manager.d.ts.map +1 -0
- package/dist/folder-watch-manager.js +129 -0
- package/dist/folder-watch-manager.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -15
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +2 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/schemas.d.ts +541 -226
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +61 -15
- package/dist/schemas.js.map +1 -1
- package/dist/types.d.ts +4 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/compile-schedule.d.ts +2 -1
- package/dist/utils/compile-schedule.d.ts.map +1 -1
- package/dist/utils/compile-schedule.js +6 -0
- package/dist/utils/compile-schedule.js.map +1 -1
- package/dist/utils/compute-next-automation-run-at.d.ts.map +1 -1
- package/dist/utils/compute-next-automation-run-at.js +4 -1
- package/dist/utils/compute-next-automation-run-at.js.map +1 -1
- package/dist/utils/reconcile-downtime.d.ts.map +1 -1
- package/dist/utils/reconcile-downtime.js +4 -1
- package/dist/utils/reconcile-downtime.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-scheduler.d.ts","sourceRoot":"","sources":["../src/automation-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,UAAU,yBAAyB;IACjC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;CACnB;AAED,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IAKlE,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAA6B;gBAE9C,KAAK,EAAE,eAAe;IAInD,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,GAAG,GAAE,IAAiB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"automation-scheduler.d.ts","sourceRoot":"","sources":["../src/automation-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,UAAU,yBAAyB;IACjC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;CACnB;AAED,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IAKlE,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAA6B;gBAE9C,KAAK,EAAE,eAAe;IAInD,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,GAAG,GAAE,IAAiB,GAAG,IAAI;IA0BrC,OAAO,CAAC,gBAAgB;CAWzB"}
|
|
@@ -34,7 +34,11 @@ export class AutomationScheduler extends EventEmitter {
|
|
|
34
34
|
continue;
|
|
35
35
|
if (automation.lifecycle === "finished")
|
|
36
36
|
continue;
|
|
37
|
-
|
|
37
|
+
// Watch triggers are event-driven (FolderWatchManager owns them); the
|
|
38
|
+
// minute ticker only fires time-based schedules.
|
|
39
|
+
if (automation.trigger.kind !== "schedule")
|
|
40
|
+
continue;
|
|
41
|
+
const matched = compileScheduleAll(automation.trigger.schedule).some((expression) => {
|
|
38
42
|
const parsed = parseCronExpression(expression);
|
|
39
43
|
return parsed !== null && cronMatchesDate(parsed, now);
|
|
40
44
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-scheduler.js","sourceRoot":"","sources":["../src/automation-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,kCAAkC,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAOjE,MAAM,OAAO,mBAAoB,SAAQ,YAAuC;IAKjD;IAJrB,SAAS,GAA0B,IAAI,CAAC;IACxC,QAAQ,GAAG,KAAK,CAAC;IACR,6BAA6B,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3E,YAA6B,KAAsB;QACjD,KAAK,EAAE,CAAC;QADmB,UAAK,GAAL,KAAK,CAAiB;IAEnD,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO;QACrD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,MAAY,IAAI,IAAI,EAAE;QAC5B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,SAAS;YAClC,IAAI,UAAU,CAAC,SAAS,KAAK,UAAU;gBAAE,SAAS;YAClD,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"automation-scheduler.js","sourceRoot":"","sources":["../src/automation-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-store.d.ts","sourceRoot":"","sources":["../src/automation-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"automation-store.d.ts","sourceRoot":"","sources":["../src/automation-store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EAGnB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAmDpB,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,WAAW,CAAoB;gBAEV,QAAQ,EAAE,MAAM;IAI7C,IAAI,IAAI,UAAU,EAAE;IAIpB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIlC,IAAI,IAAI,MAAM;IAId,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU;IAsBhD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,UAAU,GAAG,IAAI;IA0BnE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS3B,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,UAAU,GAAG,IAAI;IAarE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,UAAU,GAAG,IAAI;IAiB5F,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiBhD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,UAAU,GAAG,IAAI;IAiB1D,OAAO,CAAC,IAAI;IAsCZ,OAAO,CAAC,OAAO;CAOhB"}
|
package/dist/automation-store.js
CHANGED
|
@@ -2,15 +2,16 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { AUTOMATION_RUN_HISTORY_CAP, AUTOMATIONS_FILE_VERSION } from "./constants.js";
|
|
5
|
-
import { automationsFileSchema, automationsFileV1Schema } from "./schemas.js";
|
|
6
|
-
import { normalizeScheduleInput } from "./utils/compile-schedule.js";
|
|
5
|
+
import { automationsFileSchema, automationsFileV1Schema, automationsFileV2Schema, } from "./schemas.js";
|
|
6
|
+
import { normalizeScheduleInput, normalizeTriggerInput } from "./utils/compile-schedule.js";
|
|
7
7
|
// A run is terminal once it has a definitive outcome; only those carry a
|
|
8
8
|
// finishedAt when migrated from a v1 lastRun.
|
|
9
9
|
const V1_TERMINAL_STATUSES = new Set(["completed", "failed", "missed"]);
|
|
10
|
-
// v1 stored a single `lastRun` and a raw cron string. Lift each into the
|
|
10
|
+
// v1 stored a single `lastRun` and a raw cron string. Lift each into the v3
|
|
11
11
|
// shape: recognize the cron as a friendly preset where provably lossless (else
|
|
12
|
-
// keep it as {kind:"cron"})
|
|
13
|
-
// never be spuriously "finished"), and fold
|
|
12
|
+
// keep it as {kind:"cron"}) and wrap it in a schedule trigger, seed runCount at
|
|
13
|
+
// 0 (so a migrated automation can never be spuriously "finished"), and fold
|
|
14
|
+
// lastRun into a one-entry history.
|
|
14
15
|
const migrateV1Automation = (v1) => {
|
|
15
16
|
const runs = v1.lastRun
|
|
16
17
|
? [
|
|
@@ -29,7 +30,7 @@ const migrateV1Automation = (v1) => {
|
|
|
29
30
|
return {
|
|
30
31
|
id: v1.id,
|
|
31
32
|
name: v1.name,
|
|
32
|
-
schedule: normalizeScheduleInput(v1.schedule),
|
|
33
|
+
trigger: { kind: "schedule", schedule: normalizeScheduleInput(v1.schedule) },
|
|
33
34
|
cwd: v1.cwd,
|
|
34
35
|
command: v1.command,
|
|
35
36
|
enabled: v1.enabled,
|
|
@@ -42,6 +43,12 @@ const migrateV1Automation = (v1) => {
|
|
|
42
43
|
updatedAt: v1.updatedAt,
|
|
43
44
|
};
|
|
44
45
|
};
|
|
46
|
+
// v2 stored the trigger as a bare top-level `schedule`. v3 wraps it in a
|
|
47
|
+
// schedule trigger; everything else carries over unchanged.
|
|
48
|
+
const migrateV2Automation = (v2) => {
|
|
49
|
+
const { schedule, ...rest } = v2;
|
|
50
|
+
return { ...rest, trigger: { kind: "schedule", schedule } };
|
|
51
|
+
};
|
|
45
52
|
export class AutomationStore {
|
|
46
53
|
filePath;
|
|
47
54
|
automations = [];
|
|
@@ -63,7 +70,7 @@ export class AutomationStore {
|
|
|
63
70
|
const automation = {
|
|
64
71
|
id: randomUUID(),
|
|
65
72
|
name: input.name,
|
|
66
|
-
|
|
73
|
+
trigger: normalizeTriggerInput(input.trigger),
|
|
67
74
|
cwd: input.cwd,
|
|
68
75
|
command: input.command,
|
|
69
76
|
enabled: input.enabled ?? true,
|
|
@@ -91,7 +98,7 @@ export class AutomationStore {
|
|
|
91
98
|
const updated = {
|
|
92
99
|
...current,
|
|
93
100
|
...(patch.name !== undefined ? { name: patch.name } : {}),
|
|
94
|
-
...(patch.
|
|
101
|
+
...(patch.trigger !== undefined ? { trigger: normalizeTriggerInput(patch.trigger) } : {}),
|
|
95
102
|
...(patch.cwd !== undefined ? { cwd: patch.cwd } : {}),
|
|
96
103
|
...(patch.command !== undefined ? { command: patch.command } : {}),
|
|
97
104
|
...(patch.enabled !== undefined ? { enabled: patch.enabled } : {}),
|
|
@@ -191,13 +198,21 @@ export class AutomationStore {
|
|
|
191
198
|
console.warn(`automations file invalid; starting with an empty list (${this.filePath})`);
|
|
192
199
|
return;
|
|
193
200
|
}
|
|
194
|
-
// Fast path: already
|
|
195
|
-
const
|
|
201
|
+
// Fast path: already v3.
|
|
202
|
+
const v3 = automationsFileSchema.safeParse(json);
|
|
203
|
+
if (v3.success) {
|
|
204
|
+
this.automations = v3.data.automations;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Migrate v2 -> v3 (wrap the bare schedule in a trigger), then persist so
|
|
208
|
+
// later loads hit the fast path.
|
|
209
|
+
const v2 = automationsFileV2Schema.safeParse(json);
|
|
196
210
|
if (v2.success) {
|
|
197
|
-
this.automations = v2.data.automations;
|
|
211
|
+
this.automations = v2.data.automations.map(migrateV2Automation);
|
|
212
|
+
this.persist();
|
|
198
213
|
return;
|
|
199
214
|
}
|
|
200
|
-
// Migrate v1 ->
|
|
215
|
+
// Migrate v1 -> v3 once, then persist so later loads hit the fast path.
|
|
201
216
|
const v1 = automationsFileV1Schema.safeParse(json);
|
|
202
217
|
if (v1.success) {
|
|
203
218
|
this.automations = v1.data.automations.map(migrateV1Automation);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-store.js","sourceRoot":"","sources":["../src/automation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,
|
|
1
|
+
{"version":3,"file":"automation-store.js","sourceRoot":"","sources":["../src/automation-store.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -62,7 +62,7 @@ export declare const MAX_AUTOMATIONS = 100;
|
|
|
62
62
|
export declare const MAX_AUTOMATION_NAME_LENGTH = 120;
|
|
63
63
|
export declare const MAX_AUTOMATION_COMMAND_LENGTH = 4096;
|
|
64
64
|
export declare const MAX_CRON_EXPRESSION_LENGTH = 256;
|
|
65
|
-
export declare const AUTOMATIONS_FILE_VERSION =
|
|
65
|
+
export declare const AUTOMATIONS_FILE_VERSION = 3;
|
|
66
66
|
export declare const AUTOMATION_RUN_LIMIT_MAX = 100000;
|
|
67
67
|
export declare const AUTOMATION_RUN_HISTORY_CAP = 50;
|
|
68
68
|
export declare const AUTOMATION_DOWNTIME_RECONCILE_CAP = 10;
|
|
@@ -72,6 +72,7 @@ export declare const AUTOMATION_RECONCILE_LOOKBACK_MS: number;
|
|
|
72
72
|
export declare const DAEMON_HEARTBEAT_FILE_VERSION = 1;
|
|
73
73
|
export declare const AUTOMATION_TICK_ALIGNMENT_DELAY_MS = 50;
|
|
74
74
|
export declare const AUTOMATION_PENDING_RUN_EXPIRY_MS: number;
|
|
75
|
+
export declare const AUTOMATION_WATCH_DEBOUNCE_MS = 500;
|
|
75
76
|
export declare const CRON_NEXT_OCCURRENCE_SCAN_LIMIT_DAYS = 1466;
|
|
76
77
|
export declare const MAX_AUTOMATION_EXIT_CODE_DIGITS = 4;
|
|
77
78
|
export declare const WS_READY_STATE_OPEN = 1;
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,YAAY,cAAc,CAAC;AACxC,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AACvD,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAEhD,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAC1C,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,eAAe,MAAM,CAAC;AAInC,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAAc,CAAC;AAK5D,eAAO,MAAM,gCAAgC,EAAE,SAAS,MAAM,EAK7D,CAAC;AACF,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAKrD,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,UAgB5B,CAAC;AAEF,eAAO,MAAM,eAAe,QAAY,CAAC;AACzC,eAAO,MAAM,gBAAgB,QAAkB,CAAC;AAChD,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,gBAAgB,QAAW,CAAC;AACzC,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAO1C,eAAO,MAAM,kCAAkC,QAAkB,CAAC;AAClE,eAAO,MAAM,kCAAkC,QAAkB,CAAC;AAClE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,+BAA+B,QAAmB,CAAC;AAUhE,eAAO,MAAM,wBAAwB,QAAW,CAAC;AAajD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAOxC,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAK/C,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AAE1C,eAAO,MAAM,cAAc,aAAoE,CAAC;AAEhG,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAM3C,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAI7C,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAGrD,eAAO,MAAM,mBAAmB,6CAA6C,CAAC;AAK9E,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,4BAA4B,QAAkB,CAAC;AAG5D,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAI3C,eAAO,MAAM,4BAA4B,QAAkB,CAAC;AAC5D,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAC1D,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAClD,eAAO,MAAM,0BAA0B,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.js
CHANGED
|
@@ -146,9 +146,11 @@ export const MAX_AUTOMATION_COMMAND_LENGTH = 4096;
|
|
|
146
146
|
export const MAX_CRON_EXPRESSION_LENGTH = 256;
|
|
147
147
|
// v1 stored a raw cron string + a single lastRun. v2 stores a structured
|
|
148
148
|
// schedule (with a derived cron computed on the fly), a run-count limit, a
|
|
149
|
-
// lifecycle, and a capped run-history array.
|
|
150
|
-
//
|
|
151
|
-
|
|
149
|
+
// lifecycle, and a capped run-history array. v3 wraps the schedule in a
|
|
150
|
+
// top-level `trigger` union so an automation can fire on a schedule OR when a
|
|
151
|
+
// folder changes. AutomationStore.load() migrates v1/v2 -> v3 in place on first
|
|
152
|
+
// boot so existing automations are never lost.
|
|
153
|
+
export const AUTOMATIONS_FILE_VERSION = 3;
|
|
152
154
|
// Largest "stop after N runs" budget. Generous — a limit is opt-in; the common
|
|
153
155
|
// case is "forever".
|
|
154
156
|
export const AUTOMATION_RUN_LIMIT_MAX = 100_000;
|
|
@@ -176,6 +178,11 @@ export const AUTOMATION_TICK_ALIGNMENT_DELAY_MS = 50;
|
|
|
176
178
|
// A launched run that no browser tab claims within this window is marked
|
|
177
179
|
// "missed" (browser closed, headless host, open() failed silently).
|
|
178
180
|
export const AUTOMATION_PENDING_RUN_EXPIRY_MS = 5 * 60 * 1000;
|
|
181
|
+
// Quiet period after the last filesystem event before a folder-watch trigger
|
|
182
|
+
// fires. Coalesces an event storm (one editor save emits several events; a
|
|
183
|
+
// build emits thousands) into a single run. Trailing-edge: the timer resets on
|
|
184
|
+
// every event and fires once the directory settles.
|
|
185
|
+
export const AUTOMATION_WATCH_DEBOUNCE_MS = 500;
|
|
179
186
|
// Covers schedules that only fire on Feb 29 (the rarest valid cron target).
|
|
180
187
|
export const CRON_NEXT_OCCURRENCE_SCAN_LIMIT_DAYS = 1466;
|
|
181
188
|
export const MAX_AUTOMATION_EXIT_CODE_DIGITS = 4;
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { Automation } from "./types.js";
|
|
3
|
+
interface FolderWatchManagerEvents {
|
|
4
|
+
due: [automation: Automation];
|
|
5
|
+
}
|
|
6
|
+
interface WatchHandle {
|
|
7
|
+
close: () => void;
|
|
8
|
+
unref?: () => void;
|
|
9
|
+
}
|
|
10
|
+
type WatchFn = (target: string, options: {
|
|
11
|
+
recursive: boolean;
|
|
12
|
+
}, listener: () => void) => WatchHandle;
|
|
13
|
+
interface FolderWatchManagerOptions {
|
|
14
|
+
debounceMs: number;
|
|
15
|
+
isRunInFlight: (automationId: string) => boolean;
|
|
16
|
+
getAutomation: (automationId: string) => Automation | null;
|
|
17
|
+
watch?: WatchFn;
|
|
18
|
+
}
|
|
19
|
+
export declare class FolderWatchManager extends EventEmitter<FolderWatchManagerEvents> {
|
|
20
|
+
private readonly options;
|
|
21
|
+
private readonly entries;
|
|
22
|
+
private readonly watch;
|
|
23
|
+
private disposed;
|
|
24
|
+
constructor(options: FolderWatchManagerOptions);
|
|
25
|
+
sync(automations: Automation[]): void;
|
|
26
|
+
dispose(): void;
|
|
27
|
+
private startEntry;
|
|
28
|
+
private onFsEvent;
|
|
29
|
+
private fire;
|
|
30
|
+
private stopEntry;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=folder-watch-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-watch-manager.d.ts","sourceRoot":"","sources":["../src/folder-watch-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,UAAU,wBAAwB;IAChC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;CAC/B;AAGD,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAID,KAAK,OAAO,GAAG,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,EAC/B,QAAQ,EAAE,MAAM,IAAI,KACjB,WAAW,CAAC;AAEjB,UAAU,yBAAyB;IAIjC,UAAU,EAAE,MAAM,CAAC;IAInB,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IAIjD,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC;IAG3D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAkBD,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,wBAAwB,CAAC;IAKhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAS;gBAEI,OAAO,EAAE,yBAAyB;IAS/D,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAoBrC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,SAAS;CAgBlB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
const signatureOf = (automation) => automation.trigger.kind === "watch"
|
|
4
|
+
? `${automation.trigger.recursive}:${automation.cwd}`
|
|
5
|
+
: automation.cwd;
|
|
6
|
+
// Event-driven folder triggers for automations: one native fs.watch per "watch"
|
|
7
|
+
// automation, on its cwd. No polling — mirrors GitDiffWatcher. A burst of events
|
|
8
|
+
// is coalesced by a trailing debounce, and a launch is suppressed while a prior
|
|
9
|
+
// run is still in-flight (at most one run per automation at a time).
|
|
10
|
+
export class FolderWatchManager extends EventEmitter {
|
|
11
|
+
options;
|
|
12
|
+
entries = new Map();
|
|
13
|
+
watch;
|
|
14
|
+
disposed = false;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super();
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.watch =
|
|
19
|
+
options.watch ??
|
|
20
|
+
((target, watchOptions, listener) => fs.watch(target, watchOptions, () => listener()));
|
|
21
|
+
}
|
|
22
|
+
// Reconcile the live watchers with the desired set (enabled + active + watch).
|
|
23
|
+
// Idempotent and cheap, so it can be called after any automation mutation.
|
|
24
|
+
sync(automations) {
|
|
25
|
+
if (this.disposed)
|
|
26
|
+
return;
|
|
27
|
+
const desired = new Map();
|
|
28
|
+
for (const automation of automations) {
|
|
29
|
+
if (!automation.enabled)
|
|
30
|
+
continue;
|
|
31
|
+
if (automation.lifecycle !== "active")
|
|
32
|
+
continue;
|
|
33
|
+
if (automation.trigger.kind !== "watch")
|
|
34
|
+
continue;
|
|
35
|
+
desired.set(automation.id, automation);
|
|
36
|
+
}
|
|
37
|
+
// Stop watchers that are no longer desired or whose target changed.
|
|
38
|
+
for (const [id, entry] of this.entries) {
|
|
39
|
+
const automation = desired.get(id);
|
|
40
|
+
if (!automation || signatureOf(automation) !== entry.signature)
|
|
41
|
+
this.stopEntry(id);
|
|
42
|
+
}
|
|
43
|
+
// Start watchers for newly-desired (or just-rebuilt) automations.
|
|
44
|
+
for (const [id, automation] of desired) {
|
|
45
|
+
if (!this.entries.has(id))
|
|
46
|
+
this.startEntry(automation);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
dispose() {
|
|
50
|
+
this.disposed = true;
|
|
51
|
+
for (const id of [...this.entries.keys()])
|
|
52
|
+
this.stopEntry(id);
|
|
53
|
+
this.removeAllListeners();
|
|
54
|
+
}
|
|
55
|
+
startEntry(automation) {
|
|
56
|
+
if (automation.trigger.kind !== "watch")
|
|
57
|
+
return;
|
|
58
|
+
const { recursive } = automation.trigger;
|
|
59
|
+
const entry = {
|
|
60
|
+
watchers: [],
|
|
61
|
+
signature: signatureOf(automation),
|
|
62
|
+
debounceTimer: null,
|
|
63
|
+
};
|
|
64
|
+
try {
|
|
65
|
+
const watcher = this.watch(automation.cwd, { recursive }, () => {
|
|
66
|
+
this.onFsEvent(automation.id);
|
|
67
|
+
});
|
|
68
|
+
// Don't keep the daemon alive on the watch alone (the http server does).
|
|
69
|
+
watcher.unref?.();
|
|
70
|
+
entry.watchers.push(watcher);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// cwd doesn't exist or isn't watchable right now — leave the entry empty;
|
|
74
|
+
// a later sync (after the directory is fixed) retries.
|
|
75
|
+
}
|
|
76
|
+
this.entries.set(automation.id, entry);
|
|
77
|
+
}
|
|
78
|
+
onFsEvent(automationId) {
|
|
79
|
+
if (this.disposed)
|
|
80
|
+
return;
|
|
81
|
+
const entry = this.entries.get(automationId);
|
|
82
|
+
if (!entry)
|
|
83
|
+
return;
|
|
84
|
+
if (entry.debounceTimer !== null)
|
|
85
|
+
clearTimeout(entry.debounceTimer);
|
|
86
|
+
entry.debounceTimer = setTimeout(() => {
|
|
87
|
+
entry.debounceTimer = null;
|
|
88
|
+
this.fire(automationId);
|
|
89
|
+
}, this.options.debounceMs);
|
|
90
|
+
entry.debounceTimer.unref?.();
|
|
91
|
+
}
|
|
92
|
+
fire(automationId) {
|
|
93
|
+
if (this.disposed)
|
|
94
|
+
return;
|
|
95
|
+
if (!this.entries.has(automationId))
|
|
96
|
+
return;
|
|
97
|
+
// No overlap: drop this change if a run is still in-flight. The next event
|
|
98
|
+
// after it settles re-arms, so writes made *during* the run are ignored.
|
|
99
|
+
if (this.options.isRunInFlight(automationId))
|
|
100
|
+
return;
|
|
101
|
+
// Re-read live state — the automation may have been disabled, hit its limit,
|
|
102
|
+
// or switched to a schedule while the debounce was pending.
|
|
103
|
+
const automation = this.options.getAutomation(automationId);
|
|
104
|
+
if (!automation || !automation.enabled || automation.lifecycle !== "active")
|
|
105
|
+
return;
|
|
106
|
+
if (automation.trigger.kind !== "watch")
|
|
107
|
+
return;
|
|
108
|
+
this.emit("due", automation);
|
|
109
|
+
}
|
|
110
|
+
stopEntry(automationId) {
|
|
111
|
+
const entry = this.entries.get(automationId);
|
|
112
|
+
if (!entry)
|
|
113
|
+
return;
|
|
114
|
+
if (entry.debounceTimer !== null) {
|
|
115
|
+
clearTimeout(entry.debounceTimer);
|
|
116
|
+
entry.debounceTimer = null;
|
|
117
|
+
}
|
|
118
|
+
for (const watcher of entry.watchers) {
|
|
119
|
+
try {
|
|
120
|
+
watcher.close();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
/* already closed */
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
this.entries.delete(automationId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=folder-watch-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-watch-manager.js","sourceRoot":"","sources":["../src/folder-watch-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AA0CvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAkBxD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,iBAAiB,CAAC;CACjD;AAED,2EAA2E;AAC3E,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,0EAA0E;IAC1E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AA+DD,eAAO,MAAM,YAAY,GAAU,UAAS,aAAkB,KAAG,OAAO,CAAC,aAAa,CAu1BrF,CAAC;AAEF,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,YAAY,EACV,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,8 +13,9 @@ import { CaffeinateController } from "./caffeinate-controller.js";
|
|
|
13
13
|
import { CaffeinateManager } from "./caffeinate-manager.js";
|
|
14
14
|
import { CaffeinatePreferencesStore } from "./caffeinate-preferences-store.js";
|
|
15
15
|
import { CdpClient } from "./cdp/cdp-client.js";
|
|
16
|
-
import { AUTOMATION_RECONCILE_MIN_DOWNTIME_MS, DEFAULT_HOST, DEFAULT_PORT, FRIENDLY_HOSTNAME, HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_CREATED, HTTP_STATUS_NOT_FOUND, MAX_AUTOMATIONS, MAX_CONCURRENT_SESSIONS, MS_PER_MINUTE, OUTPUT_BATCH_FLUSH_BYTES, OUTPUT_BATCH_WINDOW_MS, SERVER_STOP_GRACE_MS, WS_BACKPRESSURE_THRESHOLD_BYTES, WS_CLOSE_BACKPRESSURE, WS_CLOSE_CAPACITY_REACHED, WS_CLOSE_POLICY_VIOLATION, WS_HEARTBEAT_INTERVAL_MS, WS_HEARTBEAT_TIMEOUT_MS, WS_OUTBOUND_DRAIN_POLL_MS, WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES, WS_OUTBOUND_RESUME_LOW_WATER_BYTES, WS_READY_STATE_OPEN, } from "./constants.js";
|
|
16
|
+
import { AUTOMATION_RECONCILE_MIN_DOWNTIME_MS, AUTOMATION_WATCH_DEBOUNCE_MS, DEFAULT_HOST, DEFAULT_PORT, FRIENDLY_HOSTNAME, HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_CREATED, HTTP_STATUS_NOT_FOUND, MAX_AUTOMATIONS, MAX_CONCURRENT_SESSIONS, MS_PER_MINUTE, OUTPUT_BATCH_FLUSH_BYTES, OUTPUT_BATCH_WINDOW_MS, SERVER_STOP_GRACE_MS, WS_BACKPRESSURE_THRESHOLD_BYTES, WS_CLOSE_BACKPRESSURE, WS_CLOSE_CAPACITY_REACHED, WS_CLOSE_POLICY_VIOLATION, WS_HEARTBEAT_INTERVAL_MS, WS_HEARTBEAT_TIMEOUT_MS, WS_OUTBOUND_DRAIN_POLL_MS, WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES, WS_OUTBOUND_RESUME_LOW_WATER_BYTES, WS_READY_STATE_OPEN, } from "./constants.js";
|
|
17
17
|
import { ServerErrorException, serverError } from "./errors.js";
|
|
18
|
+
import { FolderWatchManager } from "./folder-watch-manager.js";
|
|
18
19
|
import { getGitDiff, getGitDiffFilePatch, getGitDiffFiles, getGitDiffSummary } from "./git-diff.js";
|
|
19
20
|
import { GitDiffWatcher } from "./git-diff-watcher.js";
|
|
20
21
|
import { HeartbeatStore } from "./heartbeat-store.js";
|
|
@@ -24,7 +25,7 @@ import { Session } from "./session.js";
|
|
|
24
25
|
import { createNetworkPolicyMiddleware, isAllowedSourceIp, isLoopbackHost } from "./security.js";
|
|
25
26
|
import { SessionRegistry } from "./session-registry.js";
|
|
26
27
|
import { resolveStaticAsset } from "./static-resolver.js";
|
|
27
|
-
import { compileSchedule, compileScheduleAll,
|
|
28
|
+
import { compileSchedule, compileScheduleAll, normalizeTriggerInput, } from "./utils/compile-schedule.js";
|
|
28
29
|
import { computeNextAutomationRunAt } from "./utils/compute-next-automation-run-at.js";
|
|
29
30
|
import { enumerateMissedOccurrences } from "./utils/reconcile-downtime.js";
|
|
30
31
|
const getRawBufferedAmount = (raw) => {
|
|
@@ -104,6 +105,18 @@ export const createServer = async (options = {}) => {
|
|
|
104
105
|
const automationStore = new AutomationStore(path.join(stateDirectory, "automations.json"));
|
|
105
106
|
const automationRunTracker = new AutomationRunTracker();
|
|
106
107
|
const automationScheduler = new AutomationScheduler(automationStore);
|
|
108
|
+
// Folder-watch triggers: one fs.watch per watch automation's cwd (no polling).
|
|
109
|
+
// isRunInFlight gates overlap (a launched/running latest run blocks a new
|
|
110
|
+
// launch); getAutomation re-reads live state when the debounce fires.
|
|
111
|
+
const folderWatchManager = new FolderWatchManager({
|
|
112
|
+
debounceMs: AUTOMATION_WATCH_DEBOUNCE_MS,
|
|
113
|
+
isRunInFlight: (automationId) => {
|
|
114
|
+
const status = automationStore.get(automationId)?.runs[0]?.status;
|
|
115
|
+
return status === "launched" || status === "running";
|
|
116
|
+
},
|
|
117
|
+
getAutomation: (automationId) => automationStore.get(automationId),
|
|
118
|
+
});
|
|
119
|
+
const syncFolderWatchers = () => folderWatchManager.sync(automationStore.list());
|
|
107
120
|
const heartbeatStore = new HeartbeatStore(path.join(stateDirectory, "daemon-heartbeat.json"));
|
|
108
121
|
const caffeinateController = options.caffeinateController ?? new CaffeinateController();
|
|
109
122
|
const caffeinatePreferencesStore = new CaffeinatePreferencesStore(path.join(stateDirectory, "caffeinate.json"));
|
|
@@ -162,7 +175,7 @@ export const createServer = async (options = {}) => {
|
|
|
162
175
|
const toAutomationWithNextRun = (automation, from) => ({
|
|
163
176
|
...automation,
|
|
164
177
|
nextRunAt: computeNextAutomationRunAt(automation, from),
|
|
165
|
-
cron: compileSchedule(automation.schedule),
|
|
178
|
+
cron: automation.trigger.kind === "schedule" ? compileSchedule(automation.trigger.schedule) : null,
|
|
166
179
|
lastRun: deriveLastRun(automation),
|
|
167
180
|
});
|
|
168
181
|
const listAutomationsWithNextRun = () => {
|
|
@@ -195,17 +208,17 @@ export const createServer = async (options = {}) => {
|
|
|
195
208
|
}
|
|
196
209
|
};
|
|
197
210
|
caffeinateManager.on("change", broadcastCaffeinate);
|
|
198
|
-
// Open a browser tab for a run and record it in history. Scheduled
|
|
199
|
-
// count toward the limit (and can finish the automation); manual
|
|
200
|
-
// never count and are allowed even on a finished/disabled automation.
|
|
211
|
+
// Open a browser tab for a run and record it in history. Scheduled and watch
|
|
212
|
+
// launches count toward the limit (and can finish the automation); manual
|
|
213
|
+
// launches never count and are allowed even on a finished/disabled automation.
|
|
201
214
|
const tryLaunch = (automation, trigger) => {
|
|
202
|
-
if (trigger
|
|
215
|
+
if (trigger !== "manual") {
|
|
203
216
|
const current = automationStore.get(automation.id);
|
|
204
217
|
if (!current || !current.enabled || current.lifecycle === "finished")
|
|
205
218
|
return null;
|
|
206
219
|
}
|
|
207
220
|
const run = automationRunTracker.create(automation);
|
|
208
|
-
const counts = trigger
|
|
221
|
+
const counts = trigger !== "manual";
|
|
209
222
|
automationStore.appendRun(automation.id, {
|
|
210
223
|
runId: run.runId,
|
|
211
224
|
scheduledFor: trigger === "schedule"
|
|
@@ -221,6 +234,9 @@ export const createServer = async (options = {}) => {
|
|
|
221
234
|
if (counts)
|
|
222
235
|
automationStore.incrementRunCount(automation.id);
|
|
223
236
|
broadcastAutomations();
|
|
237
|
+
// A watch automation that just reached its limit is now "finished"; stop
|
|
238
|
+
// watching its folder promptly instead of waiting for the next mutation.
|
|
239
|
+
syncFolderWatchers();
|
|
224
240
|
const runUrl = `http://${FRIENDLY_HOSTNAME}:${actualPort}/?run=${run.runId}`;
|
|
225
241
|
void tabController
|
|
226
242
|
.open(runUrl)
|
|
@@ -347,10 +363,13 @@ export const createServer = async (options = {}) => {
|
|
|
347
363
|
return undefined;
|
|
348
364
|
}
|
|
349
365
|
};
|
|
350
|
-
// A
|
|
351
|
-
//
|
|
352
|
-
const
|
|
353
|
-
const
|
|
366
|
+
// A trigger is valid iff a schedule trigger compiles to ≥1 parseable cron; a
|
|
367
|
+
// watch trigger is always valid (its watched cwd is validated separately).
|
|
368
|
+
const isValidTriggerInput = (trigger) => {
|
|
369
|
+
const normalized = normalizeTriggerInput(trigger);
|
|
370
|
+
if (normalized.kind === "watch")
|
|
371
|
+
return true;
|
|
372
|
+
const crons = compileScheduleAll(normalized.schedule);
|
|
354
373
|
return crons.length > 0 && crons.every((cron) => parseCronExpression(cron) !== null);
|
|
355
374
|
};
|
|
356
375
|
api.get("/automations", (context) => context.json({ automations: listAutomationsWithNextRun() }));
|
|
@@ -361,7 +380,7 @@ export const createServer = async (options = {}) => {
|
|
|
361
380
|
if (automationStore.size() >= MAX_AUTOMATIONS) {
|
|
362
381
|
return context.json({ error: "too_many_automations" }, HTTP_STATUS_BAD_REQUEST);
|
|
363
382
|
}
|
|
364
|
-
if (!
|
|
383
|
+
if (!isValidTriggerInput(parsed.data.trigger)) {
|
|
365
384
|
return context.json({ error: "invalid_schedule" }, HTTP_STATUS_BAD_REQUEST);
|
|
366
385
|
}
|
|
367
386
|
if (!resolveCwdQuery(parsed.data.cwd)) {
|
|
@@ -369,13 +388,14 @@ export const createServer = async (options = {}) => {
|
|
|
369
388
|
}
|
|
370
389
|
const automation = automationStore.create(parsed.data);
|
|
371
390
|
broadcastAutomations();
|
|
391
|
+
syncFolderWatchers();
|
|
372
392
|
return context.json({ automation: toAutomationWithNextRun(automation, new Date()) }, HTTP_STATUS_CREATED);
|
|
373
393
|
});
|
|
374
394
|
api.patch("/automations/:id", async (context) => {
|
|
375
395
|
const parsed = updateAutomationInputSchema.safeParse(await readJsonBody(context));
|
|
376
396
|
if (!parsed.success)
|
|
377
397
|
return context.json({ error: "invalid_body" }, HTTP_STATUS_BAD_REQUEST);
|
|
378
|
-
if (parsed.data.
|
|
398
|
+
if (parsed.data.trigger !== undefined && !isValidTriggerInput(parsed.data.trigger)) {
|
|
379
399
|
return context.json({ error: "invalid_schedule" }, HTTP_STATUS_BAD_REQUEST);
|
|
380
400
|
}
|
|
381
401
|
if (parsed.data.cwd !== undefined && !resolveCwdQuery(parsed.data.cwd)) {
|
|
@@ -393,6 +413,7 @@ export const createServer = async (options = {}) => {
|
|
|
393
413
|
if (!automation)
|
|
394
414
|
return context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND);
|
|
395
415
|
broadcastAutomations();
|
|
416
|
+
syncFolderWatchers();
|
|
396
417
|
return context.json({ automation: toAutomationWithNextRun(automation, new Date()) });
|
|
397
418
|
});
|
|
398
419
|
api.delete("/automations/:id", (context) => {
|
|
@@ -400,13 +421,14 @@ export const createServer = async (options = {}) => {
|
|
|
400
421
|
return context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND);
|
|
401
422
|
}
|
|
402
423
|
broadcastAutomations();
|
|
424
|
+
syncFolderWatchers();
|
|
403
425
|
return context.json({ ok: true });
|
|
404
426
|
});
|
|
405
427
|
api.post("/automations/:id/run", (context) => {
|
|
406
428
|
const automation = automationStore.get(context.req.param("id"));
|
|
407
429
|
if (!automation)
|
|
408
430
|
return context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND);
|
|
409
|
-
// tryLaunch only returns null for
|
|
431
|
+
// tryLaunch only returns null for non-manual triggers (the finished/disabled
|
|
410
432
|
// guard); a manual launch always succeeds. The guard satisfies the shared
|
|
411
433
|
// nullable return type before reading run.runId.
|
|
412
434
|
const run = tryLaunch(automation, "manual");
|
|
@@ -422,6 +444,8 @@ export const createServer = async (options = {}) => {
|
|
|
422
444
|
if (!automation)
|
|
423
445
|
return context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND);
|
|
424
446
|
broadcastAutomations();
|
|
447
|
+
// Reset re-enables + reactivates; a watch automation resumes watching.
|
|
448
|
+
syncFolderWatchers();
|
|
425
449
|
return context.json({ automation: toAutomationWithNextRun(automation, new Date()) });
|
|
426
450
|
});
|
|
427
451
|
api.notFound((context) => context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND));
|
|
@@ -797,6 +821,9 @@ export const createServer = async (options = {}) => {
|
|
|
797
821
|
automationScheduler.on("due", (automation) => {
|
|
798
822
|
tryLaunch(automation, "schedule");
|
|
799
823
|
});
|
|
824
|
+
folderWatchManager.on("due", (automation) => {
|
|
825
|
+
tryLaunch(automation, "watch");
|
|
826
|
+
});
|
|
800
827
|
automationScheduler.on("tick", (now) => {
|
|
801
828
|
// Liveness heartbeat for downtime detection on the next boot.
|
|
802
829
|
heartbeatStore.write(now.getTime());
|
|
@@ -817,6 +844,8 @@ export const createServer = async (options = {}) => {
|
|
|
817
844
|
});
|
|
818
845
|
reconcileOnStartup(Date.now());
|
|
819
846
|
automationScheduler.start();
|
|
847
|
+
// Arm folder-watch triggers for the automations loaded at boot.
|
|
848
|
+
syncFolderWatchers();
|
|
820
849
|
// Open the persistent CDP connection now, while the user is present at
|
|
821
850
|
// `start` to clear any one-time remote-debugging prompt. Fire-and-forget:
|
|
822
851
|
// failure just means runs fall back to the OS opener.
|
|
@@ -834,6 +863,7 @@ export const createServer = async (options = {}) => {
|
|
|
834
863
|
}
|
|
835
864
|
const stop = async () => {
|
|
836
865
|
automationScheduler.dispose();
|
|
866
|
+
folderWatchManager.dispose();
|
|
837
867
|
caffeinateManager.dispose();
|
|
838
868
|
cdpClient?.close();
|
|
839
869
|
registry.disposeAll();
|