@tidegap/cli 0.0.0-stage → 0.18.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 (96) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +125 -2
  3. package/dist/commands/env-file.d.ts +53 -0
  4. package/dist/commands/env-file.d.ts.map +1 -0
  5. package/dist/commands/env-file.js +127 -0
  6. package/dist/commands/env-file.js.map +1 -0
  7. package/dist/commands/install.d.ts +84 -0
  8. package/dist/commands/install.d.ts.map +1 -0
  9. package/dist/commands/install.js +299 -0
  10. package/dist/commands/install.js.map +1 -0
  11. package/dist/commands/queue.d.ts +139 -0
  12. package/dist/commands/queue.d.ts.map +1 -0
  13. package/dist/commands/queue.js +491 -0
  14. package/dist/commands/queue.js.map +1 -0
  15. package/dist/commands/receipts.d.ts +15 -0
  16. package/dist/commands/receipts.d.ts.map +1 -0
  17. package/dist/commands/receipts.js +70 -0
  18. package/dist/commands/receipts.js.map +1 -0
  19. package/dist/commands/register-wake.d.ts +21 -0
  20. package/dist/commands/register-wake.d.ts.map +1 -0
  21. package/dist/commands/register-wake.js +76 -0
  22. package/dist/commands/register-wake.js.map +1 -0
  23. package/dist/commands/stats.d.ts +31 -0
  24. package/dist/commands/stats.d.ts.map +1 -0
  25. package/dist/commands/stats.js +165 -0
  26. package/dist/commands/stats.js.map +1 -0
  27. package/dist/commands/tick.d.ts +73 -0
  28. package/dist/commands/tick.d.ts.map +1 -0
  29. package/dist/commands/tick.js +294 -0
  30. package/dist/commands/tick.js.map +1 -0
  31. package/dist/commands/ui.d.ts +25 -0
  32. package/dist/commands/ui.d.ts.map +1 -0
  33. package/dist/commands/ui.js +83 -0
  34. package/dist/commands/ui.js.map +1 -0
  35. package/dist/commands/verify.d.ts +32 -0
  36. package/dist/commands/verify.d.ts.map +1 -0
  37. package/dist/commands/verify.js +135 -0
  38. package/dist/commands/verify.js.map +1 -0
  39. package/dist/env.d.ts +55 -0
  40. package/dist/env.d.ts.map +1 -0
  41. package/dist/env.js +90 -0
  42. package/dist/env.js.map +1 -0
  43. package/dist/index.d.ts +31 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +351 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/platform/index.d.ts +30 -0
  48. package/dist/platform/index.d.ts.map +1 -0
  49. package/dist/platform/index.js +66 -0
  50. package/dist/platform/index.js.map +1 -0
  51. package/dist/platform/linux.d.ts +81 -0
  52. package/dist/platform/linux.d.ts.map +1 -0
  53. package/dist/platform/linux.js +158 -0
  54. package/dist/platform/linux.js.map +1 -0
  55. package/dist/platform/macos.d.ts +69 -0
  56. package/dist/platform/macos.d.ts.map +1 -0
  57. package/dist/platform/macos.js +151 -0
  58. package/dist/platform/macos.js.map +1 -0
  59. package/dist/platform/windows.d.ts +31 -0
  60. package/dist/platform/windows.d.ts.map +1 -0
  61. package/dist/platform/windows.js +58 -0
  62. package/dist/platform/windows.js.map +1 -0
  63. package/dist/ui/api.d.ts +59 -0
  64. package/dist/ui/api.d.ts.map +1 -0
  65. package/dist/ui/api.js +459 -0
  66. package/dist/ui/api.js.map +1 -0
  67. package/dist/ui/dispatcher.d.ts +84 -0
  68. package/dist/ui/dispatcher.d.ts.map +1 -0
  69. package/dist/ui/dispatcher.js +150 -0
  70. package/dist/ui/dispatcher.js.map +1 -0
  71. package/dist/ui/events.d.ts +27 -0
  72. package/dist/ui/events.d.ts.map +1 -0
  73. package/dist/ui/events.js +85 -0
  74. package/dist/ui/events.js.map +1 -0
  75. package/dist/ui/server.d.ts +69 -0
  76. package/dist/ui/server.d.ts.map +1 -0
  77. package/dist/ui/server.js +258 -0
  78. package/dist/ui/server.js.map +1 -0
  79. package/package.json +54 -3
  80. package/ui/agenda.js +256 -0
  81. package/ui/api.js +111 -0
  82. package/ui/app.css +707 -0
  83. package/ui/app.js +597 -0
  84. package/ui/detail.js +431 -0
  85. package/ui/dialog.js +279 -0
  86. package/ui/dnd.js +131 -0
  87. package/ui/dom.js +255 -0
  88. package/ui/index.html +37 -0
  89. package/ui/journal.js +207 -0
  90. package/ui/keys.js +92 -0
  91. package/ui/row.js +153 -0
  92. package/ui/state.js +412 -0
  93. package/ui/timeline.js +202 -0
  94. package/ui/toast.js +69 -0
  95. package/ui/tokens.css +106 -0
  96. package/ui/views.js +31 -0
package/dist/index.js ADDED
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `tidegap` — CLI entry point.
4
+ *
5
+ * tidegap tick drain due tasks (one-shot or --daemon)
6
+ * tidegap install write launchd plist or print systemd/schtasks templates
7
+ * tidegap queue list print queued/scheduled/running/completed tasks
8
+ * tidegap queue cancel | reschedule | run-now | reply change a task (the
9
+ * next tick runs it; these commands never dispatch)
10
+ * tidegap receipts list print carbon receipts for completed tasks
11
+ * tidegap stats local-only personal-impact summary
12
+ * tidegap register-wake schedule a macOS wake event 30s before a task
13
+ * tidegap ui local task page (timeline, inbox, detail, actions) on 127.0.0.1
14
+ */
15
+ import { createRequire } from "node:module";
16
+ import { basename } from "node:path";
17
+ import { stripControlChars } from "@tidegap/core";
18
+ import { Command } from "commander";
19
+ import { runInstall } from "./commands/install.js";
20
+ import { runQueueCancel, runQueueList, runQueueReply, runQueueReschedule, runQueueRunNow, runQueueShow, runQueueUnread, } from "./commands/queue.js";
21
+ import { runReceiptsList } from "./commands/receipts.js";
22
+ import { runRegisterWake } from "./commands/register-wake.js";
23
+ import { runStats } from "./commands/stats.js";
24
+ import { runTick } from "./commands/tick.js";
25
+ import { runUi } from "./commands/ui.js";
26
+ import { runVerify } from "./commands/verify.js";
27
+ /**
28
+ * CLI version — read from this package's own `package.json` so there is
29
+ * a single source of truth and `tidegap --version` never drifts from the
30
+ * published version. `createRequire` resolves relative to this module,
31
+ * so it works from both `src` (tests) and `dist` (published bin).
32
+ */
33
+ export function readCliVersion() {
34
+ try {
35
+ const require = createRequire(import.meta.url);
36
+ const pkg = require("../package.json");
37
+ return pkg.version ?? "0.0.0";
38
+ }
39
+ catch {
40
+ return "0.0.0";
41
+ }
42
+ }
43
+ const CLI_VERSION = readCliVersion();
44
+ export function buildProgram() {
45
+ const program = new Command();
46
+ program
47
+ .name("tidegap")
48
+ .description("CLI for Tidegap — carbon-aware scheduler tick + install")
49
+ .version(CLI_VERSION);
50
+ program
51
+ .command("tick")
52
+ .description("Drain due provider-call tasks")
53
+ .option("--db <path>", "SQLite queue path", undefined)
54
+ .option("--once", "Run a single drain pass (default)")
55
+ .option("--daemon", "Loop forever, draining every --interval seconds")
56
+ .option("--interval <sec>", "Daemon interval seconds", (v) => parseInt(v, 10), 60)
57
+ .option("--region <code>", "Default region for hydrated tasks", undefined)
58
+ .option("--no-notify", "Do not post an OS notification per finished task")
59
+ .action(async (opts) => {
60
+ const code = await runTick({
61
+ notify: opts.notify !== false,
62
+ db: opts.db,
63
+ once: opts.once === true,
64
+ daemon: opts.daemon === true,
65
+ interval: opts.interval,
66
+ region: opts.region,
67
+ });
68
+ process.exit(code);
69
+ });
70
+ const install = program
71
+ .command("install")
72
+ .description("Wire up the OS-level cron tick")
73
+ .option("--laptop", "Laptop mode: launchd plist + pmset wake registration helper")
74
+ .option("--server", "Server mode: launchd plist only, no wake events")
75
+ .action(async (opts) => {
76
+ let mode;
77
+ if (opts.laptop)
78
+ mode = "laptop";
79
+ if (opts.server)
80
+ mode = "server";
81
+ if (!mode) {
82
+ install.help({ error: true });
83
+ process.exit(2);
84
+ return;
85
+ }
86
+ const result = await runInstall({ mode });
87
+ // eslint-disable-next-line no-console
88
+ console.log(result.nextSteps);
89
+ });
90
+ const queue = program
91
+ .command("queue")
92
+ .description("Inspect and change the queue");
93
+ queue
94
+ .command("list")
95
+ .description("List queued / scheduled / running / completed tasks")
96
+ .option("--db <path>", "SQLite queue path", undefined)
97
+ .option("--status <status>", "Filter by status", undefined)
98
+ .option("--kind <kind>", "Filter by deadline kind: absolute | quota_reset", undefined)
99
+ .option("--unread", "Only completed or failed tasks nobody has viewed yet")
100
+ .option("--json", "Emit JSON instead of the table")
101
+ .option("--hook", "Claude Code SessionStart mode: one unread-count line or nothing; always exits 0")
102
+ .option("--series <id>", "Only the occurrences of this repeating series, oldest first")
103
+ .action(async (opts) => {
104
+ if (opts.hook === true) {
105
+ const res = await runQueueList({ db: opts.db, hook: true });
106
+ // eslint-disable-next-line no-console
107
+ if (res.rendered)
108
+ console.log(res.rendered);
109
+ return;
110
+ }
111
+ try {
112
+ const res = await runQueueList({
113
+ db: opts.db,
114
+ status: opts.status,
115
+ kind: opts.kind,
116
+ unread: opts.unread === true,
117
+ json: opts.json === true,
118
+ series: opts.series,
119
+ });
120
+ // eslint-disable-next-line no-console
121
+ console.log(res.rendered);
122
+ }
123
+ catch (err) {
124
+ // eslint-disable-next-line no-console
125
+ console.error(err.message);
126
+ process.exit(1);
127
+ }
128
+ });
129
+ queue
130
+ .command("show <task-id>")
131
+ .description("Show one task: prompt, result, receipt; marks a finished task read")
132
+ .option("--db <path>", "SQLite queue path", undefined)
133
+ .option("--raw", "Include the raw vendor payload")
134
+ .option("--json", "Emit JSON (the record plus its message history)")
135
+ .option("--no-mark-read", "Do not mark the task read (for scripts)")
136
+ .action(async (taskId, opts) => {
137
+ try {
138
+ const res = await runQueueShow(taskId, {
139
+ db: opts.db,
140
+ raw: opts.raw === true,
141
+ json: opts.json === true,
142
+ markRead: opts.markRead !== false,
143
+ });
144
+ // eslint-disable-next-line no-console
145
+ console.log(res.rendered);
146
+ }
147
+ catch (err) {
148
+ // eslint-disable-next-line no-console
149
+ console.error(err.message);
150
+ process.exit(1);
151
+ }
152
+ });
153
+ queue
154
+ .command("unread <task-id>")
155
+ .description("Mark a task unread again, so it shows in the inbox")
156
+ .option("--db <path>", "SQLite queue path", undefined)
157
+ .action(async (taskId, opts) => {
158
+ try {
159
+ // eslint-disable-next-line no-console
160
+ console.log(await runQueueUnread(taskId, { db: opts.db }));
161
+ }
162
+ catch (err) {
163
+ // eslint-disable-next-line no-console
164
+ console.error(err.message);
165
+ process.exit(1);
166
+ }
167
+ });
168
+ /** Run one write command: print its result, or the core's refusal and exit 1. */
169
+ const write = async (fn) => {
170
+ try {
171
+ // eslint-disable-next-line no-console
172
+ console.log(await fn());
173
+ }
174
+ catch (err) {
175
+ // eslint-disable-next-line no-console
176
+ console.error(stripControlChars(err.message));
177
+ process.exit(1);
178
+ }
179
+ };
180
+ queue
181
+ .command("cancel <task-id>")
182
+ .description("Cancel a pending task; a repeating task skips this occurrence")
183
+ .option("--db <path>", "SQLite queue path", undefined)
184
+ .option("--series", "Also end the task's repeating series")
185
+ .action((taskId, opts) => write(() => runQueueCancel(taskId, { db: opts.db, series: opts.series === true })));
186
+ queue
187
+ .command("reschedule <task-id>")
188
+ .description("Move a queued or scheduled task: a new deadline, an exact time, or a local day")
189
+ .option("--db <path>", "SQLite queue path", undefined)
190
+ .option("--by <when>", "New deadline: a duration (30m, 2h, 3d, 1w) or an ISO-8601 time")
191
+ .option("--at <when>", "Run at exactly this time (duration or ISO-8601)")
192
+ .option("--day <yyyy-mm-dd>", "Run on this local day, at its cleanest forecast hour")
193
+ .action((taskId, opts) => write(() => runQueueReschedule(taskId, opts)));
194
+ queue
195
+ .command("run-now <task-id>")
196
+ .description("Mark a queued or scheduled task due now; the next tick runs it")
197
+ .option("--db <path>", "SQLite queue path", undefined)
198
+ .action((taskId, opts) => write(() => runQueueRunNow(taskId, { db: opts.db })));
199
+ queue
200
+ .command("reply <task-id> <text>")
201
+ .description("Continue a completed task: queue a new task with its conversation plus this text")
202
+ .option("--db <path>", "SQLite queue path", undefined)
203
+ .option("--by <when>", "Deadline for the reply (default 1h)")
204
+ .action((taskId, text, opts) => write(() => runQueueReply(taskId, text, { db: opts.db, by: opts.by })));
205
+ const receipts = program
206
+ .command("receipts")
207
+ .description("Inspect carbon receipts");
208
+ receipts
209
+ .command("list")
210
+ .description("List receipts for completed tasks")
211
+ .option("--db <path>", "SQLite queue path", undefined)
212
+ .option("--since <iso>", "Only receipts at or after this ISO-8601 time")
213
+ .action(async (opts) => {
214
+ try {
215
+ const res = await runReceiptsList({ db: opts.db, since: opts.since });
216
+ // eslint-disable-next-line no-console
217
+ console.log(res.rendered);
218
+ }
219
+ catch (err) {
220
+ // eslint-disable-next-line no-console
221
+ console.error(err.message);
222
+ process.exit(1);
223
+ }
224
+ });
225
+ program
226
+ .command("stats")
227
+ .description("Show local-only personal-impact stats from the queue ledger")
228
+ .option("--db <path>", "SQLite queue path", undefined)
229
+ .option("--json", "Emit JSON instead of the human-readable table")
230
+ .action(async (opts) => {
231
+ try {
232
+ const res = await runStats({ db: opts.db, json: opts.json === true });
233
+ // eslint-disable-next-line no-console
234
+ console.log(res.rendered);
235
+ }
236
+ catch (err) {
237
+ // eslint-disable-next-line no-console
238
+ console.error(err.message);
239
+ process.exit(1);
240
+ }
241
+ });
242
+ program
243
+ .command("verify [task-id]")
244
+ .description("Verify the Ed25519 signature on a carbon receipt — from the ledger by task_id, or from a JSON file via --file")
245
+ .option("--db <path>", "SQLite queue path", undefined)
246
+ .option("--file <path>", "Path to a receipt JSON file (alternative to task_id)", undefined)
247
+ .option("--trusted-public-key <b64>", "Pin the expected signer's public key (base64); fail if the receipt was signed by anyone else", undefined)
248
+ .option("--json", "Emit JSON instead of the human-readable summary")
249
+ .action(async (taskId, opts) => {
250
+ try {
251
+ const res = await runVerify({
252
+ taskId,
253
+ db: opts.db,
254
+ file: opts.file,
255
+ trustedPublicKey: opts.trustedPublicKey,
256
+ json: opts.json === true,
257
+ });
258
+ // eslint-disable-next-line no-console
259
+ console.log(res.rendered);
260
+ process.exit(res.exitCode);
261
+ }
262
+ catch (err) {
263
+ // eslint-disable-next-line no-console
264
+ console.error(err.message);
265
+ process.exit(4);
266
+ }
267
+ });
268
+ program
269
+ .command("register-wake <task-id>")
270
+ .description("Schedule a macOS wake event 30s before a task's window")
271
+ .option("--db <path>", "SQLite queue path", undefined)
272
+ .option("--dry-run", "Print the pmset command without running it")
273
+ .action(async (taskId, opts) => {
274
+ try {
275
+ const res = await runRegisterWake({
276
+ taskId,
277
+ db: opts.db,
278
+ dryRun: opts.dryRun === true,
279
+ });
280
+ // eslint-disable-next-line no-console
281
+ console.log(res.message);
282
+ process.exit(res.ok ? 0 : 1);
283
+ }
284
+ catch (err) {
285
+ // eslint-disable-next-line no-console
286
+ console.error(err.message);
287
+ process.exit(1);
288
+ }
289
+ });
290
+ program
291
+ .command("ui")
292
+ .description("Open the local task page: timeline, inbox, task detail, actions (127.0.0.1 only; never dispatches)")
293
+ .option("--db <path>", "SQLite queue path", undefined)
294
+ .option("--port <port>", "Port on 127.0.0.1 (default: a free port)", (v) => parseInt(v, 10), 0)
295
+ .option("--region <code>", "Region for the forecast curve", undefined)
296
+ .option("--no-open", "Print the URL without opening a browser")
297
+ .action(async (opts) => {
298
+ try {
299
+ const code = await runUi({
300
+ db: opts.db,
301
+ port: opts.port,
302
+ region: opts.region,
303
+ open: opts.open !== false,
304
+ });
305
+ process.exit(code);
306
+ }
307
+ catch (err) {
308
+ // eslint-disable-next-line no-console
309
+ console.error(err.message);
310
+ process.exit(1);
311
+ }
312
+ });
313
+ return program;
314
+ }
315
+ const isDirect = (() => {
316
+ try {
317
+ const argv1 = process.argv[1];
318
+ if (!argv1)
319
+ return false;
320
+ return import.meta.url.endsWith(argv1) || import.meta.url.includes("/cli/dist/index.js");
321
+ }
322
+ catch {
323
+ return false;
324
+ }
325
+ })();
326
+ /**
327
+ * The deprecation line for the 0.18 `ebb` bin alias, or `undefined` when the
328
+ * program was started under any other name. npm links both bins to this file,
329
+ * so the name the user typed is the basename of `argv[1]`. The alias goes
330
+ * away in 0.19.
331
+ */
332
+ export function binAliasDeprecation(argv1) {
333
+ if (!argv1)
334
+ return undefined;
335
+ const name = basename(argv1).replace(/\.(c|m)?js$/, "");
336
+ if (name !== "ebb")
337
+ return undefined;
338
+ return "tidegap: the `ebb` command is now `tidegap`; the `ebb` alias is removed in 0.19.";
339
+ }
340
+ if (isDirect) {
341
+ const deprecation = binAliasDeprecation(process.argv[1]);
342
+ // eslint-disable-next-line no-console
343
+ if (deprecation)
344
+ console.error(deprecation);
345
+ buildProgram().parseAsync(process.argv).catch((err) => {
346
+ // eslint-disable-next-line no-console
347
+ console.error(err);
348
+ process.exit(1);
349
+ });
350
+ }
351
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Platform-aware loader. Returns the right submodule for the current OS.
3
+ * The submodules expose the same shape (`caffeinateWhilePending`,
4
+ * `pmsetScheduleWake`, etc.); only macOS is fully wired in v0.4.
5
+ */
6
+ import * as linux from "./linux.js";
7
+ import * as macos from "./macos.js";
8
+ import * as windows from "./windows.js";
9
+ export type PlatformName = "macos" | "linux" | "windows";
10
+ export declare function currentPlatform(): PlatformName;
11
+ export declare function getPlatform(name?: PlatformName): {
12
+ name: PlatformName;
13
+ caffeinateWhilePending: typeof macos.caffeinateWhilePending;
14
+ pmsetScheduleWake: typeof macos.pmsetScheduleWake;
15
+ };
16
+ export { macos, linux, windows };
17
+ /** Whether a tick daemon (`tidegap install`) is set up on this machine. */
18
+ export type DaemonStatus = "installed" | "not_installed" | "unknown";
19
+ /**
20
+ * Probe for the unit file `tidegap install` writes: the macOS LaunchAgent plist
21
+ * or the Linux systemd user timer. Windows reports `unknown`, because there
22
+ * `tidegap install` only prints a schtasks command and nothing on disk shows
23
+ * whether the user ran it.
24
+ */
25
+ export declare function daemonStatus(opts?: {
26
+ platform?: NodeJS.Platform;
27
+ home?: string;
28
+ exists?: (path: string) => boolean;
29
+ }): DaemonStatus;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD,wBAAgB,eAAe,IAAI,YAAY,CAI9C;AAED,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG;IAChD,IAAI,EAAE,YAAY,CAAC;IACnB,sBAAsB,EAAE,OAAO,KAAK,CAAC,sBAAsB,CAAC;IAC5D,iBAAiB,EAAE,OAAO,KAAK,CAAC,iBAAiB,CAAC;CACnD,CAqBA;AAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAEjC,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;AAErE;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,GAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/B,GACL,YAAY,CAgBd"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Platform-aware loader. Returns the right submodule for the current OS.
3
+ * The submodules expose the same shape (`caffeinateWhilePending`,
4
+ * `pmsetScheduleWake`, etc.); only macOS is fully wired in v0.4.
5
+ */
6
+ import { existsSync } from "node:fs";
7
+ import { homedir } from "node:os";
8
+ import { join } from "node:path";
9
+ import * as linux from "./linux.js";
10
+ import * as macos from "./macos.js";
11
+ import * as windows from "./windows.js";
12
+ export function currentPlatform() {
13
+ if (process.platform === "darwin")
14
+ return "macos";
15
+ if (process.platform === "win32")
16
+ return "windows";
17
+ return "linux";
18
+ }
19
+ export function getPlatform(name) {
20
+ const resolved = name ?? currentPlatform();
21
+ if (resolved === "macos") {
22
+ return {
23
+ name: "macos",
24
+ caffeinateWhilePending: macos.caffeinateWhilePending,
25
+ pmsetScheduleWake: macos.pmsetScheduleWake,
26
+ };
27
+ }
28
+ if (resolved === "windows") {
29
+ return {
30
+ name: "windows",
31
+ caffeinateWhilePending: windows.caffeinateWhilePending,
32
+ pmsetScheduleWake: windows.pmsetScheduleWake,
33
+ };
34
+ }
35
+ return {
36
+ name: "linux",
37
+ caffeinateWhilePending: linux.caffeinateWhilePending,
38
+ pmsetScheduleWake: linux.pmsetScheduleWake,
39
+ };
40
+ }
41
+ export { macos, linux, windows };
42
+ /**
43
+ * Probe for the unit file `tidegap install` writes: the macOS LaunchAgent plist
44
+ * or the Linux systemd user timer. Windows reports `unknown`, because there
45
+ * `tidegap install` only prints a schtasks command and nothing on disk shows
46
+ * whether the user ran it.
47
+ */
48
+ export function daemonStatus(opts = {}) {
49
+ const platform = opts.platform ?? process.platform;
50
+ const home = opts.home ?? homedir();
51
+ const exists = opts.exists ?? existsSync;
52
+ // The 0.17 unit counts too: it keeps ticking the same ledger until removed.
53
+ if (platform === "darwin") {
54
+ const agents = join(home, "Library", "LaunchAgents");
55
+ return [macos.LAUNCHD_LABEL, macos.LEGACY_LAUNCHD_LABEL].some((l) => exists(join(agents, `${l}.plist`)))
56
+ ? "installed"
57
+ : "not_installed";
58
+ }
59
+ if (platform === "win32")
60
+ return "unknown";
61
+ const units = join(home, ".config", "systemd", "user");
62
+ return [linux.SYSTEMD_UNIT, linux.LEGACY_SYSTEMD_UNIT].some((u) => exists(join(units, `${u}.timer`)))
63
+ ? "installed"
64
+ : "not_installed";
65
+ }
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAIxC,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAmB;IAK7C,MAAM,QAAQ,GAAG,IAAI,IAAI,eAAe,EAAE,CAAC;IAC3C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE,OAAO;YACb,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;YACpD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;SAC3C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;YACtD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;SAC7C,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;KAC3C,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAKjC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,OAII,EAAE;IAEN,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,4EAA4E;IAC5E,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,eAAe,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnG,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,eAAe,CAAC;AACtB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Linux platform helpers — `systemd-inhibit`, `rtcwake`, and
3
+ * user-systemd unit-file generation.
4
+ *
5
+ * Like the macOS module, these wrap shell-outs and string-templating.
6
+ * The only side-effects are spawning subprocesses; nothing here writes
7
+ * a file. The `install` command places the unit files on disk.
8
+ */
9
+ /**
10
+ * Spawn `systemd-inhibit --what=idle` so the system stays awake.
11
+ * Returns a kill() function. If `systemd-inhibit` is not available,
12
+ * the returned kill() is a no-op.
13
+ *
14
+ * Note: many Linux desktops will honour this; headless servers may
15
+ * have no idle-sleep policy at all, in which case the inhibit is a
16
+ * functional no-op.
17
+ */
18
+ export declare function caffeinateWhilePending(durationSec: number): Promise<() => void>;
19
+ /**
20
+ * Build the exact `rtcwake -m no -t <epoch-seconds>` command for a
21
+ * given date. `-m no` tells rtcwake to *only* arm the RTC alarm without
22
+ * suspending the machine itself.
23
+ */
24
+ export declare function rtcwakeCommand(at: Date): string;
25
+ /**
26
+ * Run `rtcwake -m no -t <epoch>`. Needs CAP_SYS_TIME / root. If we are
27
+ * euid 0 we run it directly; otherwise we try `sudo -n` (non-interactive
28
+ * — succeeds only if a sudoers rule pre-authorizes it without a password)
29
+ * and, on failure, hand the caller a non-ok result so it can print the
30
+ * exact sudoers one-liner.
31
+ */
32
+ export declare function rtcwakeScheduleWake(at: Date): Promise<{
33
+ command: string;
34
+ ok: boolean;
35
+ stderr: string;
36
+ }>;
37
+ /**
38
+ * Compatibility alias for the cross-platform `getPlatform` shim so
39
+ * callers can keep using one name regardless of OS.
40
+ */
41
+ export declare const pmsetScheduleWake: typeof rtcwakeScheduleWake;
42
+ /** Base name of the systemd user units (`.service` and `.timer`). */
43
+ export declare const SYSTEMD_UNIT = "tidegap-tick";
44
+ /** The 0.17 unit name, detected so `tidegap install` can print its cleanup. */
45
+ export declare const LEGACY_SYSTEMD_UNIT = "ebb-tick";
46
+ export interface SystemdServiceOptions {
47
+ dbPath: string;
48
+ /**
49
+ * The argv[0..n] that invoke `tidegap`, resolved at install time. For a
50
+ * pinned node install this is `[process.execPath, realpath(argv[1])]`
51
+ * — the exact interpreter plus the real dist entry — immune to a bare
52
+ * service PATH and `#!/usr/bin/env node` shebangs. Falls back to
53
+ * `ebbBinaryPath` (single element) if omitted.
54
+ */
55
+ launcher?: string[];
56
+ /** Legacy single-binary launcher. Prefer `launcher`. */
57
+ ebbBinaryPath?: string;
58
+ /** Absolute path to write stdout/stderr logs. Defaults to ~/.tidegap/logs/tick.log. */
59
+ logPath?: string;
60
+ /** Optional env vars added as `Environment=KEY=VAL` lines. */
61
+ env?: Record<string, string>;
62
+ }
63
+ /**
64
+ * Render the `tidegap-tick.service` unit file. `Type=oneshot` because the
65
+ * service runs `tidegap tick --once` and exits; the companion timer is
66
+ * responsible for cadence. `EnvironmentFile=` references a user-owned
67
+ * env file (belt-and-braces: `tidegap tick` also loads it directly), so
68
+ * secrets never land in the service unit itself.
69
+ */
70
+ export declare function systemdService(opts: SystemdServiceOptions): string;
71
+ export interface SystemdTimerOptions {
72
+ tickIntervalSec: number;
73
+ }
74
+ /**
75
+ * Render the `tidegap-tick.timer` unit file. Uses `OnUnitActiveSec=<n>s`
76
+ * so the cadence matches the launchd `StartInterval` — fires every N
77
+ * seconds regardless of wall-clock alignment. `OnBootSec=30s` covers
78
+ * the case where the user-session starts before the network does.
79
+ */
80
+ export declare function systemdTimer(opts: SystemdTimerOptions): string;
81
+ //# sourceMappingURL=linux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux.d.ts","sourceRoot":"","sources":["../../src/platform/linux.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,IAAI,CAAC,CA8BrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,IAAI,GAAG,MAAM,CAG/C;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,IAAI,GACP,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB3D;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,4BAAsB,CAAC;AAErD,qEAAqE;AACrE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CA6BlE;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAa9D"}