@monotykamary/localterm-server 1.21.0 → 1.23.0

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 (55) hide show
  1. package/dist/automation-scheduler.d.ts.map +1 -1
  2. package/dist/automation-scheduler.js +5 -1
  3. package/dist/automation-scheduler.js.map +1 -1
  4. package/dist/automation-store.d.ts.map +1 -1
  5. package/dist/automation-store.js +29 -12
  6. package/dist/automation-store.js.map +1 -1
  7. package/dist/caffeinate-manager.d.ts +42 -0
  8. package/dist/caffeinate-manager.d.ts.map +1 -0
  9. package/dist/caffeinate-manager.js +158 -0
  10. package/dist/caffeinate-manager.js.map +1 -0
  11. package/dist/caffeinate-preferences-store.d.ts +13 -0
  12. package/dist/caffeinate-preferences-store.d.ts.map +1 -0
  13. package/dist/caffeinate-preferences-store.js +98 -0
  14. package/dist/caffeinate-preferences-store.js.map +1 -0
  15. package/dist/caffeinate-process-match.d.ts +10 -0
  16. package/dist/caffeinate-process-match.d.ts.map +1 -0
  17. package/dist/caffeinate-process-match.js +76 -0
  18. package/dist/caffeinate-process-match.js.map +1 -0
  19. package/dist/constants.d.ts +7 -1
  20. package/dist/constants.d.ts.map +1 -1
  21. package/dist/constants.js +27 -3
  22. package/dist/constants.js.map +1 -1
  23. package/dist/folder-watch-manager.d.ts +33 -0
  24. package/dist/folder-watch-manager.d.ts.map +1 -0
  25. package/dist/folder-watch-manager.js +129 -0
  26. package/dist/folder-watch-manager.js.map +1 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +83 -23
  30. package/dist/index.js.map +1 -1
  31. package/dist/protocol.d.ts +3 -3
  32. package/dist/protocol.d.ts.map +1 -1
  33. package/dist/protocol.js +2 -2
  34. package/dist/protocol.js.map +1 -1
  35. package/dist/schemas.d.ts +612 -185
  36. package/dist/schemas.d.ts.map +1 -1
  37. package/dist/schemas.js +112 -25
  38. package/dist/schemas.js.map +1 -1
  39. package/dist/session-registry.d.ts +1 -0
  40. package/dist/session-registry.d.ts.map +1 -1
  41. package/dist/session-registry.js +6 -0
  42. package/dist/session-registry.js.map +1 -1
  43. package/dist/types.d.ts +4 -1
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/utils/compile-schedule.d.ts +4 -1
  46. package/dist/utils/compile-schedule.d.ts.map +1 -1
  47. package/dist/utils/compile-schedule.js +14 -0
  48. package/dist/utils/compile-schedule.js.map +1 -1
  49. package/dist/utils/compute-next-automation-run-at.d.ts.map +1 -1
  50. package/dist/utils/compute-next-automation-run-at.js +4 -1
  51. package/dist/utils/compute-next-automation-run-at.js.map +1 -1
  52. package/dist/utils/reconcile-downtime.d.ts.map +1 -1
  53. package/dist/utils/reconcile-downtime.js +4 -1
  54. package/dist/utils/reconcile-downtime.js.map +1 -1
  55. 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;IAuBrC,OAAO,CAAC,gBAAgB;CAWzB"}
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
- const matched = compileScheduleAll(automation.schedule).some((expression) => {
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":"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"}
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":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EAEnB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA2CpB,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;IA8BZ,OAAO,CAAC,OAAO;CAOhB"}
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;IA4BnE,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"}
@@ -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 v2
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"}), seed runCount at 0 (so a migrated automation can
13
- // never be spuriously "finished"), and fold lastRun into a one-entry history.
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
- schedule: normalizeScheduleInput(input.schedule),
73
+ trigger: normalizeTriggerInput(input),
67
74
  cwd: input.cwd,
68
75
  command: input.command,
69
76
  enabled: input.enabled ?? true,
@@ -91,7 +98,9 @@ export class AutomationStore {
91
98
  const updated = {
92
99
  ...current,
93
100
  ...(patch.name !== undefined ? { name: patch.name } : {}),
94
- ...(patch.schedule !== undefined ? { schedule: normalizeScheduleInput(patch.schedule) } : {}),
101
+ ...(patch.trigger !== undefined || patch.schedule !== undefined
102
+ ? { trigger: normalizeTriggerInput(patch) }
103
+ : {}),
95
104
  ...(patch.cwd !== undefined ? { cwd: patch.cwd } : {}),
96
105
  ...(patch.command !== undefined ? { command: patch.command } : {}),
97
106
  ...(patch.enabled !== undefined ? { enabled: patch.enabled } : {}),
@@ -191,13 +200,21 @@ export class AutomationStore {
191
200
  console.warn(`automations file invalid; starting with an empty list (${this.filePath})`);
192
201
  return;
193
202
  }
194
- // Fast path: already v2.
195
- const v2 = automationsFileSchema.safeParse(json);
203
+ // Fast path: already v3.
204
+ const v3 = automationsFileSchema.safeParse(json);
205
+ if (v3.success) {
206
+ this.automations = v3.data.automations;
207
+ return;
208
+ }
209
+ // Migrate v2 -> v3 (wrap the bare schedule in a trigger), then persist so
210
+ // later loads hit the fast path.
211
+ const v2 = automationsFileV2Schema.safeParse(json);
196
212
  if (v2.success) {
197
- this.automations = v2.data.automations;
213
+ this.automations = v2.data.automations.map(migrateV2Automation);
214
+ this.persist();
198
215
  return;
199
216
  }
200
- // Migrate v1 -> v2 once, then persist so later loads hit the fast path.
217
+ // Migrate v1 -> v3 once, then persist so later loads hit the fast path.
201
218
  const v1 = automationsFileV1Schema.safeParse(json);
202
219
  if (v1.success) {
203
220
  this.automations = v1.data.automations.map(migrateV1Automation);
@@ -1 +1 @@
1
- {"version":3,"file":"automation-store.js","sourceRoot":"","sources":["../src/automation-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"automation-store.js","sourceRoot":"","sources":["../src/automation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { CaffeinateController } from "./caffeinate-controller.js";
3
+ import type { CaffeinatePreferencesStore } from "./caffeinate-preferences-store.js";
4
+ import { type SnapshotProcesses } from "./caffeinate-process-match.js";
5
+ import type { CaffeinateMode } from "./types.js";
6
+ export interface CaffeinateManagerOptions {
7
+ controller: CaffeinateController;
8
+ store: CaffeinatePreferencesStore;
9
+ listSessionPids: () => number[];
10
+ snapshotProcesses?: SnapshotProcesses;
11
+ defaultCommands?: readonly string[];
12
+ }
13
+ interface CaffeinateManagerEvents {
14
+ change: [];
15
+ }
16
+ export declare class CaffeinateManager extends EventEmitter<CaffeinateManagerEvents> {
17
+ private readonly controller;
18
+ private readonly store;
19
+ private readonly listSessionPids;
20
+ private readonly snapshotProcesses;
21
+ readonly defaultCommands: readonly string[];
22
+ private autoActive;
23
+ private pokeTimer;
24
+ private polling;
25
+ private pollQueued;
26
+ private disposed;
27
+ constructor(options: CaffeinateManagerOptions);
28
+ get supported(): boolean;
29
+ get active(): boolean;
30
+ get mode(): CaffeinateMode;
31
+ get commands(): string[];
32
+ setMode(mode: CaffeinateMode): void;
33
+ setCommands(commands: readonly string[]): void;
34
+ pokeAuto(): void;
35
+ pollNow(): Promise<void>;
36
+ dispose(): void;
37
+ private triggerSet;
38
+ private recompute;
39
+ private pollAuto;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=caffeinate-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-manager.d.ts","sourceRoot":"","sources":["../src/caffeinate-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AAKvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,oBAAoB,CAAC;IACjC,KAAK,EAAE,0BAA0B,CAAC;IAGlC,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAEhC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAEtC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,UAAU,uBAAuB;IAC/B,MAAM,EAAE,EAAE,CAAC;CACZ;AAeD,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,uBAAuB,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAE5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,wBAAwB;IAkB7C,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,IAAI,IAAI,cAAc,CAEzB;IAED,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAWnC,WAAW,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAY9C,QAAQ,IAAI,IAAI;IAYhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;YAMH,QAAQ;CAgCvB"}
@@ -0,0 +1,158 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { anySessionRunsTrigger, defaultSnapshotProcesses, } from "./caffeinate-process-match.js";
3
+ import { CAFFEINATE_AUTO_DEFAULT_COMMANDS, CAFFEINATE_AUTO_POKE_DEBOUNCE_MS, } from "./constants.js";
4
+ // Decides *when* the daemon's single keep-awake process runs, on top of the
5
+ // dumb CaffeinateController (which only knows start/stop). In "on" it is always
6
+ // active, in "off" never, and in "automatic" it tracks whether any recognized
7
+ // program is running in a localterm session — discovered by walking the `ps`
8
+ // process tree under each session's shell. Emits `change` whenever any
9
+ // broadcastable field (mode/active/commands) moves.
10
+ //
11
+ // Automatic detection is event-driven: it never polls on a timer. A `ps`
12
+ // snapshot is taken only in response to an event — a session's foreground
13
+ // process changing, a session connecting/disconnecting, or a mode/command
14
+ // change — via the debounced `pokeAuto`. (The foreground signal itself rides
15
+ // on node-pty's existing per-session foreground tracking, which powers the
16
+ // favicon and exists independently of keep-awake.)
17
+ export class CaffeinateManager extends EventEmitter {
18
+ controller;
19
+ store;
20
+ listSessionPids;
21
+ snapshotProcesses;
22
+ defaultCommands;
23
+ autoActive = false;
24
+ pokeTimer = null;
25
+ polling = false;
26
+ pollQueued = false;
27
+ disposed = false;
28
+ constructor(options) {
29
+ super();
30
+ this.controller = options.controller;
31
+ this.store = options.store;
32
+ this.listSessionPids = options.listSessionPids;
33
+ this.snapshotProcesses = options.snapshotProcesses ?? defaultSnapshotProcesses;
34
+ this.defaultCommands = options.defaultCommands ?? CAFFEINATE_AUTO_DEFAULT_COMMANDS;
35
+ // An unexpected death of the caffeinate process flips controller state; pass
36
+ // that through so every tab rebroadcasts the authoritative `active`.
37
+ this.controller.on("change", () => this.emit("change"));
38
+ this.recompute();
39
+ // One snapshot at startup in case a trigger is already running before any
40
+ // event arrives; from here on detection is purely event-driven.
41
+ if (this.mode === "automatic" && this.supported)
42
+ void this.pollAuto();
43
+ }
44
+ get supported() {
45
+ return this.controller.supported;
46
+ }
47
+ get active() {
48
+ return this.controller.active;
49
+ }
50
+ get mode() {
51
+ return this.store.getMode();
52
+ }
53
+ get commands() {
54
+ return this.store.getCommands();
55
+ }
56
+ setMode(mode) {
57
+ if (this.disposed)
58
+ return;
59
+ this.store.setMode(mode);
60
+ // Leaving automatic clears the cached detection so a later return to
61
+ // automatic re-derives it from scratch rather than trusting a stale flag.
62
+ if (mode !== "automatic")
63
+ this.autoActive = false;
64
+ this.recompute();
65
+ if (mode === "automatic" && this.supported)
66
+ void this.pollAuto();
67
+ this.emit("change");
68
+ }
69
+ setCommands(commands) {
70
+ if (this.disposed)
71
+ return;
72
+ this.store.setCommands(commands);
73
+ // The trigger set changed; re-derive automatic detection immediately.
74
+ if (this.mode === "automatic" && this.supported)
75
+ void this.pollAuto();
76
+ this.emit("change");
77
+ }
78
+ // Cheap, debounced nudge to re-check automatic detection in response to an
79
+ // event (a session's foreground process changing, or a session
80
+ // connecting/disconnecting). The debounce coalesces a burst of simultaneous
81
+ // events into a single `ps` snapshot — it fires once and does not repeat.
82
+ pokeAuto() {
83
+ if (this.disposed || this.mode !== "automatic" || !this.supported)
84
+ return;
85
+ if (this.pokeTimer !== null)
86
+ return;
87
+ this.pokeTimer = setTimeout(() => {
88
+ this.pokeTimer = null;
89
+ void this.pollAuto();
90
+ }, CAFFEINATE_AUTO_POKE_DEBOUNCE_MS);
91
+ this.pokeTimer.unref?.();
92
+ }
93
+ // Force an immediate automatic re-check and resolve when it settles. Used by
94
+ // tests; production code re-checks via the event-driven debounced pokeAuto.
95
+ pollNow() {
96
+ return this.pollAuto();
97
+ }
98
+ dispose() {
99
+ this.disposed = true;
100
+ if (this.pokeTimer !== null) {
101
+ clearTimeout(this.pokeTimer);
102
+ this.pokeTimer = null;
103
+ }
104
+ this.controller.dispose();
105
+ this.removeAllListeners();
106
+ }
107
+ // The effective keep-awake triggers: fixed defaults plus the user's customs,
108
+ // lowercased for case-insensitive matching.
109
+ triggerSet() {
110
+ const triggers = new Set();
111
+ for (const command of this.defaultCommands)
112
+ triggers.add(command.toLowerCase());
113
+ for (const command of this.store.getCommands())
114
+ triggers.add(command.toLowerCase());
115
+ return triggers;
116
+ }
117
+ recompute() {
118
+ const mode = this.mode;
119
+ const desired = mode === "on" || (mode === "automatic" && this.autoActive);
120
+ this.controller.setActive(desired);
121
+ }
122
+ async pollAuto() {
123
+ if (this.disposed || this.mode !== "automatic" || !this.supported)
124
+ return;
125
+ // Serialize: if a snapshot is already running, run exactly one more after it
126
+ // so the latest state always wins without piling up `ps` calls.
127
+ if (this.polling) {
128
+ this.pollQueued = true;
129
+ return;
130
+ }
131
+ this.polling = true;
132
+ try {
133
+ const pids = this.listSessionPids();
134
+ let next = false;
135
+ if (pids.length > 0) {
136
+ const snapshot = await this.snapshotProcesses();
137
+ next = anySessionRunsTrigger(pids, snapshot, this.triggerSet());
138
+ }
139
+ if (this.disposed || this.mode !== "automatic")
140
+ return;
141
+ if (next !== this.autoActive) {
142
+ this.autoActive = next;
143
+ this.recompute();
144
+ // controller emits `change` only when `active` actually flips; if the
145
+ // process state didn't change but detection did, no broadcast is needed
146
+ // since `active` is unchanged.
147
+ }
148
+ }
149
+ finally {
150
+ this.polling = false;
151
+ if (this.pollQueued && !this.disposed) {
152
+ this.pollQueued = false;
153
+ void this.pollAuto();
154
+ }
155
+ }
156
+ }
157
+ }
158
+ //# sourceMappingURL=caffeinate-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-manager.js","sourceRoot":"","sources":["../src/caffeinate-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CaffeinateMode } from "./types.js";
2
+ export declare class CaffeinatePreferencesStore {
3
+ private readonly filePath;
4
+ private preferences;
5
+ constructor(filePath: string);
6
+ getMode(): CaffeinateMode;
7
+ getCommands(): string[];
8
+ setMode(mode: CaffeinateMode): CaffeinateMode;
9
+ setCommands(commands: readonly string[]): string[];
10
+ private load;
11
+ private persist;
12
+ }
13
+ //# sourceMappingURL=caffeinate-preferences-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-preferences-store.d.ts","sourceRoot":"","sources":["../src/caffeinate-preferences-store.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoCjD,qBAAa,0BAA0B;IAGzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,WAAW,CAAqD;gBAE3C,QAAQ,EAAE,MAAM;IAI7C,OAAO,IAAI,cAAc;IAIzB,WAAW,IAAI,MAAM,EAAE;IAIvB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc;IAQ7C,WAAW,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE;IAMlD,OAAO,CAAC,IAAI;IAyBZ,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,98 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { CAFFEINATE_PREFERENCES_FILE_VERSION, MAX_CAFFEINATE_COMMAND_LENGTH, MAX_CAFFEINATE_COMMANDS, } from "./constants.js";
4
+ import { caffeinatePreferencesFileSchema } from "./schemas.js";
5
+ // Default to "automatic": keep-awake follows recognized programs out of the box
6
+ // (the behavior the user asked to make default), with no custom commands yet.
7
+ const DEFAULT_PREFERENCES = {
8
+ mode: "automatic",
9
+ commands: [],
10
+ };
11
+ // Trim, drop empties, cap length, dedupe case-insensitively (keeping the first
12
+ // spelling), and cap the count. The trigger match itself is case-insensitive,
13
+ // so "Claude" and "claude" are the same trigger.
14
+ const sanitizeCommands = (commands) => {
15
+ const seen = new Set();
16
+ const result = [];
17
+ for (const raw of commands) {
18
+ const trimmed = raw.trim();
19
+ if (!trimmed)
20
+ continue;
21
+ const capped = trimmed.slice(0, MAX_CAFFEINATE_COMMAND_LENGTH);
22
+ const key = capped.toLowerCase();
23
+ if (seen.has(key))
24
+ continue;
25
+ seen.add(key);
26
+ result.push(capped);
27
+ if (result.length >= MAX_CAFFEINATE_COMMANDS)
28
+ break;
29
+ }
30
+ return result;
31
+ };
32
+ // Owns the persisted keep-awake preferences (mode + custom automatic-mode
33
+ // trigger commands) in ~/.localterm/caffeinate.json. Mirrors AutomationStore's
34
+ // load/persist shape (zod-validated read, atomic tmp+rename write).
35
+ export class CaffeinatePreferencesStore {
36
+ filePath;
37
+ preferences = { ...DEFAULT_PREFERENCES };
38
+ constructor(filePath) {
39
+ this.filePath = filePath;
40
+ this.load();
41
+ }
42
+ getMode() {
43
+ return this.preferences.mode;
44
+ }
45
+ getCommands() {
46
+ return [...this.preferences.commands];
47
+ }
48
+ setMode(mode) {
49
+ if (mode !== this.preferences.mode) {
50
+ this.preferences = { ...this.preferences, mode };
51
+ this.persist();
52
+ }
53
+ return this.preferences.mode;
54
+ }
55
+ setCommands(commands) {
56
+ this.preferences = { ...this.preferences, commands: sanitizeCommands(commands) };
57
+ this.persist();
58
+ return [...this.preferences.commands];
59
+ }
60
+ load() {
61
+ let raw;
62
+ try {
63
+ raw = fs.readFileSync(this.filePath, "utf8");
64
+ }
65
+ catch {
66
+ return;
67
+ }
68
+ let json;
69
+ try {
70
+ json = JSON.parse(raw);
71
+ }
72
+ catch {
73
+ console.warn(`caffeinate preferences file invalid; using defaults (${this.filePath})`);
74
+ return;
75
+ }
76
+ const parsed = caffeinatePreferencesFileSchema.safeParse(json);
77
+ if (!parsed.success) {
78
+ console.warn(`caffeinate preferences file invalid; using defaults (${this.filePath})`);
79
+ return;
80
+ }
81
+ this.preferences = {
82
+ mode: parsed.data.mode,
83
+ commands: sanitizeCommands(parsed.data.commands),
84
+ };
85
+ }
86
+ persist() {
87
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
88
+ const payload = {
89
+ version: CAFFEINATE_PREFERENCES_FILE_VERSION,
90
+ mode: this.preferences.mode,
91
+ commands: this.preferences.commands,
92
+ };
93
+ const tmpPath = `${this.filePath}.tmp`;
94
+ fs.writeFileSync(tmpPath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
95
+ fs.renameSync(tmpPath, this.filePath);
96
+ }
97
+ }
98
+ //# sourceMappingURL=caffeinate-preferences-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-preferences-store.js","sourceRoot":"","sources":["../src/caffeinate-preferences-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface ProcessSnapshotEntry {
2
+ pid: number;
3
+ ppid: number;
4
+ command: string;
5
+ }
6
+ export type SnapshotProcesses = () => Promise<ProcessSnapshotEntry[]>;
7
+ export declare const commandMatchesTriggers: (command: string, triggers: ReadonlySet<string>) => boolean;
8
+ export declare const anySessionRunsTrigger: (sessionPids: readonly number[], snapshot: readonly ProcessSnapshotEntry[], triggers: ReadonlySet<string>) => boolean;
9
+ export declare const defaultSnapshotProcesses: SnapshotProcesses;
10
+ //# sourceMappingURL=caffeinate-process-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-process-match.d.ts","sourceRoot":"","sources":["../src/caffeinate-process-match.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAMtE,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,EAAE,UAAU,WAAW,CAAC,MAAM,CAAC,KAAG,OASvF,CAAC;AAKF,eAAO,MAAM,qBAAqB,GAChC,aAAa,SAAS,MAAM,EAAE,EAC9B,UAAU,SAAS,oBAAoB,EAAE,EACzC,UAAU,WAAW,CAAC,MAAM,CAAC,KAC5B,OAsBF,CAAC;AAQF,eAAO,MAAM,wBAAwB,EAAE,iBAwBnC,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { execFile } from "node:child_process";
2
+ // True when any whitespace-separated token of `command` has a basename equal
3
+ // (case-insensitively) to a trigger. Token-basename matching is what lets
4
+ // `node /opt/homebrew/bin/claude` count as `claude` while keeping short
5
+ // triggers like `pi` from matching substrings of unrelated paths.
6
+ export const commandMatchesTriggers = (command, triggers) => {
7
+ if (triggers.size === 0)
8
+ return false;
9
+ for (const token of command.split(/\s+/)) {
10
+ if (!token)
11
+ continue;
12
+ const slash = token.lastIndexOf("/");
13
+ const base = (slash === -1 ? token : token.slice(slash + 1)).toLowerCase();
14
+ if (base && triggers.has(base))
15
+ return true;
16
+ }
17
+ return false;
18
+ };
19
+ // Walk the process tree rooted at each session shell pid and report whether any
20
+ // descendant's command line matches a trigger. The shell pids themselves are
21
+ // roots (their command is just the shell) and never matched directly.
22
+ export const anySessionRunsTrigger = (sessionPids, snapshot, triggers) => {
23
+ if (sessionPids.length === 0 || triggers.size === 0)
24
+ return false;
25
+ const childrenByParent = new Map();
26
+ for (const entry of snapshot) {
27
+ const list = childrenByParent.get(entry.ppid);
28
+ if (list)
29
+ list.push(entry);
30
+ else
31
+ childrenByParent.set(entry.ppid, [entry]);
32
+ }
33
+ const visited = new Set(sessionPids);
34
+ const queue = [...sessionPids];
35
+ while (queue.length > 0) {
36
+ const pid = queue.shift();
37
+ const children = childrenByParent.get(pid);
38
+ if (!children)
39
+ continue;
40
+ for (const child of children) {
41
+ if (visited.has(child.pid))
42
+ continue;
43
+ visited.add(child.pid);
44
+ if (commandMatchesTriggers(child.command, triggers))
45
+ return true;
46
+ queue.push(child.pid);
47
+ }
48
+ }
49
+ return false;
50
+ };
51
+ const PS_LINE = /^\s*(\d+)\s+(\d+)\s+(.*)$/;
52
+ // Default snapshot: a single `ps` listing of every process with its pid, ppid,
53
+ // and full command line. The command may be truncated to terminal width, but
54
+ // only the leading binary token matters for matching, so trailing-arg loss is
55
+ // harmless. Resolves to [] on any failure (caffeinate just stays as-is).
56
+ export const defaultSnapshotProcesses = () => new Promise((resolve) => {
57
+ execFile("ps", ["-A", "-o", "pid=,ppid=,command="], { maxBuffer: 8 * 1024 * 1024 }, (error, stdout) => {
58
+ if (error) {
59
+ resolve([]);
60
+ return;
61
+ }
62
+ const entries = [];
63
+ for (const line of stdout.split("\n")) {
64
+ const match = PS_LINE.exec(line);
65
+ if (!match)
66
+ continue;
67
+ entries.push({
68
+ pid: Number(match[1]),
69
+ ppid: Number(match[2]),
70
+ command: match[3],
71
+ });
72
+ }
73
+ resolve(entries);
74
+ });
75
+ });
76
+ //# sourceMappingURL=caffeinate-process-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-process-match.js","sourceRoot":"","sources":["../src/caffeinate-process-match.ts"],"names":[],"mappings":"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"}