@tidegap/cli 0.0.0-stage → 0.19.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 (113) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +136 -2
  3. package/dist/commands/clients.d.ts +20 -0
  4. package/dist/commands/clients.d.ts.map +1 -0
  5. package/dist/commands/clients.js +36 -0
  6. package/dist/commands/clients.js.map +1 -0
  7. package/dist/commands/env-file.d.ts +54 -0
  8. package/dist/commands/env-file.d.ts.map +1 -0
  9. package/dist/commands/env-file.js +153 -0
  10. package/dist/commands/env-file.js.map +1 -0
  11. package/dist/commands/install.d.ts +83 -0
  12. package/dist/commands/install.d.ts.map +1 -0
  13. package/dist/commands/install.js +297 -0
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/queue.d.ts +139 -0
  16. package/dist/commands/queue.d.ts.map +1 -0
  17. package/dist/commands/queue.js +491 -0
  18. package/dist/commands/queue.js.map +1 -0
  19. package/dist/commands/receipts.d.ts +15 -0
  20. package/dist/commands/receipts.d.ts.map +1 -0
  21. package/dist/commands/receipts.js +70 -0
  22. package/dist/commands/receipts.js.map +1 -0
  23. package/dist/commands/register-wake.d.ts +21 -0
  24. package/dist/commands/register-wake.d.ts.map +1 -0
  25. package/dist/commands/register-wake.js +76 -0
  26. package/dist/commands/register-wake.js.map +1 -0
  27. package/dist/commands/stats.d.ts +31 -0
  28. package/dist/commands/stats.d.ts.map +1 -0
  29. package/dist/commands/stats.js +165 -0
  30. package/dist/commands/stats.js.map +1 -0
  31. package/dist/commands/tick.d.ts +73 -0
  32. package/dist/commands/tick.d.ts.map +1 -0
  33. package/dist/commands/tick.js +294 -0
  34. package/dist/commands/tick.js.map +1 -0
  35. package/dist/commands/ui.d.ts +33 -0
  36. package/dist/commands/ui.d.ts.map +1 -0
  37. package/dist/commands/ui.js +119 -0
  38. package/dist/commands/ui.js.map +1 -0
  39. package/dist/commands/verify.d.ts +32 -0
  40. package/dist/commands/verify.d.ts.map +1 -0
  41. package/dist/commands/verify.js +135 -0
  42. package/dist/commands/verify.js.map +1 -0
  43. package/dist/env.d.ts +57 -0
  44. package/dist/env.d.ts.map +1 -0
  45. package/dist/env.js +105 -0
  46. package/dist/env.js.map +1 -0
  47. package/dist/index.d.ts +25 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +366 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/platform/index.d.ts +30 -0
  52. package/dist/platform/index.d.ts.map +1 -0
  53. package/dist/platform/index.js +66 -0
  54. package/dist/platform/index.js.map +1 -0
  55. package/dist/platform/linux.d.ts +81 -0
  56. package/dist/platform/linux.d.ts.map +1 -0
  57. package/dist/platform/linux.js +158 -0
  58. package/dist/platform/linux.js.map +1 -0
  59. package/dist/platform/macos.d.ts +69 -0
  60. package/dist/platform/macos.d.ts.map +1 -0
  61. package/dist/platform/macos.js +151 -0
  62. package/dist/platform/macos.js.map +1 -0
  63. package/dist/platform/windows.d.ts +31 -0
  64. package/dist/platform/windows.d.ts.map +1 -0
  65. package/dist/platform/windows.js +58 -0
  66. package/dist/platform/windows.js.map +1 -0
  67. package/dist/ui/api.d.ts +66 -0
  68. package/dist/ui/api.d.ts.map +1 -0
  69. package/dist/ui/api.js +613 -0
  70. package/dist/ui/api.js.map +1 -0
  71. package/dist/ui/clients.d.ts +65 -0
  72. package/dist/ui/clients.d.ts.map +1 -0
  73. package/dist/ui/clients.js +179 -0
  74. package/dist/ui/clients.js.map +1 -0
  75. package/dist/ui/discovery.d.ts +25 -0
  76. package/dist/ui/discovery.d.ts.map +1 -0
  77. package/dist/ui/discovery.js +46 -0
  78. package/dist/ui/discovery.js.map +1 -0
  79. package/dist/ui/dispatcher.d.ts +84 -0
  80. package/dist/ui/dispatcher.d.ts.map +1 -0
  81. package/dist/ui/dispatcher.js +150 -0
  82. package/dist/ui/dispatcher.js.map +1 -0
  83. package/dist/ui/events.d.ts +27 -0
  84. package/dist/ui/events.d.ts.map +1 -0
  85. package/dist/ui/events.js +85 -0
  86. package/dist/ui/events.js.map +1 -0
  87. package/dist/ui/server.d.ts +84 -0
  88. package/dist/ui/server.d.ts.map +1 -0
  89. package/dist/ui/server.js +322 -0
  90. package/dist/ui/server.js.map +1 -0
  91. package/dist/ui/summary.d.ts +47 -0
  92. package/dist/ui/summary.d.ts.map +1 -0
  93. package/dist/ui/summary.js +120 -0
  94. package/dist/ui/summary.js.map +1 -0
  95. package/package.json +53 -3
  96. package/ui/agenda.js +256 -0
  97. package/ui/api.js +114 -0
  98. package/ui/app.css +713 -0
  99. package/ui/app.js +599 -0
  100. package/ui/clients.js +104 -0
  101. package/ui/detail.js +431 -0
  102. package/ui/dialog.js +284 -0
  103. package/ui/dnd.js +131 -0
  104. package/ui/dom.js +255 -0
  105. package/ui/index.html +38 -0
  106. package/ui/journal.js +207 -0
  107. package/ui/keys.js +92 -0
  108. package/ui/row.js +153 -0
  109. package/ui/state.js +412 -0
  110. package/ui/timeline.js +202 -0
  111. package/ui/toast.js +69 -0
  112. package/ui/tokens.css +108 -0
  113. package/ui/views.js +31 -0
package/dist/index.js ADDED
@@ -0,0 +1,366 @@
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
+ * tidegap clients add, list or revoke the tokens of the extension and Mac app
15
+ */
16
+ import { createRequire } from "node:module";
17
+ import { stripControlChars } from "@tidegap/core";
18
+ import { Command } from "commander";
19
+ import { runClientsAdd, runClientsList, runClientsRevoke } from "./commands/clients.js";
20
+ import { runInstall } from "./commands/install.js";
21
+ import { runQueueCancel, runQueueList, runQueueReply, runQueueReschedule, runQueueRunNow, runQueueShow, runQueueUnread, } from "./commands/queue.js";
22
+ import { runReceiptsList } from "./commands/receipts.js";
23
+ import { runRegisterWake } from "./commands/register-wake.js";
24
+ import { runStats } from "./commands/stats.js";
25
+ import { runTick } from "./commands/tick.js";
26
+ import { runUi } from "./commands/ui.js";
27
+ import { runVerify } from "./commands/verify.js";
28
+ /**
29
+ * CLI version — read from this package's own `package.json` so there is
30
+ * a single source of truth and `tidegap --version` never drifts from the
31
+ * published version. `createRequire` resolves relative to this module,
32
+ * so it works from both `src` (tests) and `dist` (published bin).
33
+ */
34
+ export function readCliVersion() {
35
+ try {
36
+ const require = createRequire(import.meta.url);
37
+ const pkg = require("../package.json");
38
+ return pkg.version ?? "0.0.0";
39
+ }
40
+ catch {
41
+ return "0.0.0";
42
+ }
43
+ }
44
+ const CLI_VERSION = readCliVersion();
45
+ export function buildProgram() {
46
+ const program = new Command();
47
+ program
48
+ .name("tidegap")
49
+ .description("CLI for Tidegap — carbon-aware scheduler tick + install")
50
+ .version(CLI_VERSION);
51
+ program
52
+ .command("tick")
53
+ .description("Drain due provider-call tasks")
54
+ .option("--db <path>", "SQLite queue path", undefined)
55
+ .option("--once", "Run a single drain pass (default)")
56
+ .option("--daemon", "Loop forever, draining every --interval seconds")
57
+ .option("--interval <sec>", "Daemon interval seconds", (v) => parseInt(v, 10), 60)
58
+ .option("--region <code>", "Default region for hydrated tasks", undefined)
59
+ .option("--no-notify", "Do not post an OS notification per finished task")
60
+ .action(async (opts) => {
61
+ const code = await runTick({
62
+ notify: opts.notify !== false,
63
+ db: opts.db,
64
+ once: opts.once === true,
65
+ daemon: opts.daemon === true,
66
+ interval: opts.interval,
67
+ region: opts.region,
68
+ });
69
+ process.exit(code);
70
+ });
71
+ const install = program
72
+ .command("install")
73
+ .description("Wire up the OS-level cron tick")
74
+ .option("--laptop", "Laptop mode: launchd plist + pmset wake registration helper")
75
+ .option("--server", "Server mode: launchd plist only, no wake events")
76
+ .action(async (opts) => {
77
+ let mode;
78
+ if (opts.laptop)
79
+ mode = "laptop";
80
+ if (opts.server)
81
+ mode = "server";
82
+ if (!mode) {
83
+ install.help({ error: true });
84
+ process.exit(2);
85
+ return;
86
+ }
87
+ const result = await runInstall({ mode });
88
+ // eslint-disable-next-line no-console
89
+ console.log(result.nextSteps);
90
+ });
91
+ const queue = program
92
+ .command("queue")
93
+ .description("Inspect and change the queue");
94
+ queue
95
+ .command("list")
96
+ .description("List queued / scheduled / running / completed tasks")
97
+ .option("--db <path>", "SQLite queue path", undefined)
98
+ .option("--status <status>", "Filter by status", undefined)
99
+ .option("--kind <kind>", "Filter by deadline kind: absolute | quota_reset", undefined)
100
+ .option("--unread", "Only completed or failed tasks nobody has viewed yet")
101
+ .option("--json", "Emit JSON instead of the table")
102
+ .option("--hook", "Claude Code SessionStart mode: one unread-count line or nothing; always exits 0")
103
+ .option("--series <id>", "Only the occurrences of this repeating series, oldest first")
104
+ .action(async (opts) => {
105
+ if (opts.hook === true) {
106
+ const res = await runQueueList({ db: opts.db, hook: true });
107
+ // eslint-disable-next-line no-console
108
+ if (res.rendered)
109
+ console.log(res.rendered);
110
+ return;
111
+ }
112
+ try {
113
+ const res = await runQueueList({
114
+ db: opts.db,
115
+ status: opts.status,
116
+ kind: opts.kind,
117
+ unread: opts.unread === true,
118
+ json: opts.json === true,
119
+ series: opts.series,
120
+ });
121
+ // eslint-disable-next-line no-console
122
+ console.log(res.rendered);
123
+ }
124
+ catch (err) {
125
+ // eslint-disable-next-line no-console
126
+ console.error(err.message);
127
+ process.exit(1);
128
+ }
129
+ });
130
+ queue
131
+ .command("show <task-id>")
132
+ .description("Show one task: prompt, result, receipt; marks a finished task read")
133
+ .option("--db <path>", "SQLite queue path", undefined)
134
+ .option("--raw", "Include the raw vendor payload")
135
+ .option("--json", "Emit JSON (the record plus its message history)")
136
+ .option("--no-mark-read", "Do not mark the task read (for scripts)")
137
+ .action(async (taskId, opts) => {
138
+ try {
139
+ const res = await runQueueShow(taskId, {
140
+ db: opts.db,
141
+ raw: opts.raw === true,
142
+ json: opts.json === true,
143
+ markRead: opts.markRead !== false,
144
+ });
145
+ // eslint-disable-next-line no-console
146
+ console.log(res.rendered);
147
+ }
148
+ catch (err) {
149
+ // eslint-disable-next-line no-console
150
+ console.error(err.message);
151
+ process.exit(1);
152
+ }
153
+ });
154
+ queue
155
+ .command("unread <task-id>")
156
+ .description("Mark a task unread again, so it shows in the inbox")
157
+ .option("--db <path>", "SQLite queue path", undefined)
158
+ .action(async (taskId, opts) => {
159
+ try {
160
+ // eslint-disable-next-line no-console
161
+ console.log(await runQueueUnread(taskId, { db: opts.db }));
162
+ }
163
+ catch (err) {
164
+ // eslint-disable-next-line no-console
165
+ console.error(err.message);
166
+ process.exit(1);
167
+ }
168
+ });
169
+ /** Run one write command: print its result, or the core's refusal and exit 1. */
170
+ const write = async (fn) => {
171
+ try {
172
+ // eslint-disable-next-line no-console
173
+ console.log(await fn());
174
+ }
175
+ catch (err) {
176
+ // eslint-disable-next-line no-console
177
+ console.error(stripControlChars(err.message));
178
+ process.exit(1);
179
+ }
180
+ };
181
+ queue
182
+ .command("cancel <task-id>")
183
+ .description("Cancel a pending task; a repeating task skips this occurrence")
184
+ .option("--db <path>", "SQLite queue path", undefined)
185
+ .option("--series", "Also end the task's repeating series")
186
+ .action((taskId, opts) => write(() => runQueueCancel(taskId, { db: opts.db, series: opts.series === true })));
187
+ queue
188
+ .command("reschedule <task-id>")
189
+ .description("Move a queued or scheduled task: a new deadline, an exact time, or a local day")
190
+ .option("--db <path>", "SQLite queue path", undefined)
191
+ .option("--by <when>", "New deadline: a duration (30m, 2h, 3d, 1w) or an ISO-8601 time")
192
+ .option("--at <when>", "Run at exactly this time (duration or ISO-8601)")
193
+ .option("--day <yyyy-mm-dd>", "Run on this local day, at its cleanest forecast hour")
194
+ .action((taskId, opts) => write(() => runQueueReschedule(taskId, opts)));
195
+ queue
196
+ .command("run-now <task-id>")
197
+ .description("Mark a queued or scheduled task due now; the next tick runs it")
198
+ .option("--db <path>", "SQLite queue path", undefined)
199
+ .action((taskId, opts) => write(() => runQueueRunNow(taskId, { db: opts.db })));
200
+ queue
201
+ .command("reply <task-id> <text>")
202
+ .description("Continue a completed task: queue a new task with its conversation plus this text")
203
+ .option("--db <path>", "SQLite queue path", undefined)
204
+ .option("--by <when>", "Deadline for the reply (default 1h)")
205
+ .action((taskId, text, opts) => write(() => runQueueReply(taskId, text, { db: opts.db, by: opts.by })));
206
+ const receipts = program
207
+ .command("receipts")
208
+ .description("Inspect carbon receipts");
209
+ receipts
210
+ .command("list")
211
+ .description("List receipts for completed tasks")
212
+ .option("--db <path>", "SQLite queue path", undefined)
213
+ .option("--since <iso>", "Only receipts at or after this ISO-8601 time")
214
+ .action(async (opts) => {
215
+ try {
216
+ const res = await runReceiptsList({ db: opts.db, since: opts.since });
217
+ // eslint-disable-next-line no-console
218
+ console.log(res.rendered);
219
+ }
220
+ catch (err) {
221
+ // eslint-disable-next-line no-console
222
+ console.error(err.message);
223
+ process.exit(1);
224
+ }
225
+ });
226
+ program
227
+ .command("stats")
228
+ .description("Show local-only personal-impact stats from the queue ledger")
229
+ .option("--db <path>", "SQLite queue path", undefined)
230
+ .option("--json", "Emit JSON instead of the human-readable table")
231
+ .action(async (opts) => {
232
+ try {
233
+ const res = await runStats({ db: opts.db, json: opts.json === true });
234
+ // eslint-disable-next-line no-console
235
+ console.log(res.rendered);
236
+ }
237
+ catch (err) {
238
+ // eslint-disable-next-line no-console
239
+ console.error(err.message);
240
+ process.exit(1);
241
+ }
242
+ });
243
+ program
244
+ .command("verify [task-id]")
245
+ .description("Verify the Ed25519 signature on a carbon receipt — from the ledger by task_id, or from a JSON file via --file")
246
+ .option("--db <path>", "SQLite queue path", undefined)
247
+ .option("--file <path>", "Path to a receipt JSON file (alternative to task_id)", undefined)
248
+ .option("--trusted-public-key <b64>", "Pin the expected signer's public key (base64); fail if the receipt was signed by anyone else", undefined)
249
+ .option("--json", "Emit JSON instead of the human-readable summary")
250
+ .action(async (taskId, opts) => {
251
+ try {
252
+ const res = await runVerify({
253
+ taskId,
254
+ db: opts.db,
255
+ file: opts.file,
256
+ trustedPublicKey: opts.trustedPublicKey,
257
+ json: opts.json === true,
258
+ });
259
+ // eslint-disable-next-line no-console
260
+ console.log(res.rendered);
261
+ process.exit(res.exitCode);
262
+ }
263
+ catch (err) {
264
+ // eslint-disable-next-line no-console
265
+ console.error(err.message);
266
+ process.exit(4);
267
+ }
268
+ });
269
+ program
270
+ .command("register-wake <task-id>")
271
+ .description("Schedule a macOS wake event 30s before a task's window")
272
+ .option("--db <path>", "SQLite queue path", undefined)
273
+ .option("--dry-run", "Print the pmset command without running it")
274
+ .action(async (taskId, opts) => {
275
+ try {
276
+ const res = await runRegisterWake({
277
+ taskId,
278
+ db: opts.db,
279
+ dryRun: opts.dryRun === true,
280
+ });
281
+ // eslint-disable-next-line no-console
282
+ console.log(res.message);
283
+ process.exit(res.ok ? 0 : 1);
284
+ }
285
+ catch (err) {
286
+ // eslint-disable-next-line no-console
287
+ console.error(err.message);
288
+ process.exit(1);
289
+ }
290
+ });
291
+ program
292
+ .command("ui")
293
+ .description("Open the local task page: timeline, inbox, task detail, actions (127.0.0.1 only; never dispatches)")
294
+ .option("--db <path>", "SQLite queue path", undefined)
295
+ .option("--port <port>", "Port on 127.0.0.1 (default: 47821, or a free port when it is taken; 0: any free port)", (v) => parseInt(v, 10))
296
+ .option("--region <code>", "Region for the forecast curve", undefined)
297
+ .option("--no-open", "Print the URL without opening a browser")
298
+ .action(async (opts) => {
299
+ try {
300
+ const code = await runUi({
301
+ db: opts.db,
302
+ port: opts.port,
303
+ region: opts.region,
304
+ open: opts.open !== false,
305
+ cliVersion: CLI_VERSION,
306
+ });
307
+ process.exit(code);
308
+ }
309
+ catch (err) {
310
+ // eslint-disable-next-line no-console
311
+ console.error(err.message);
312
+ process.exit(1);
313
+ }
314
+ });
315
+ /** Run one clients command: print its output, or the error and exit 1. */
316
+ const clientsCommand = (run) => {
317
+ try {
318
+ // eslint-disable-next-line no-console
319
+ console.log(run());
320
+ }
321
+ catch (err) {
322
+ // eslint-disable-next-line no-console
323
+ console.error(err.message);
324
+ process.exit(1);
325
+ }
326
+ };
327
+ const clients = program
328
+ .command("clients")
329
+ .description("Manage the long-lived tokens of the browser extension and the Mac app (tidegap ui)");
330
+ clients
331
+ .command("add")
332
+ .description("Mint a client token; it is printed once")
333
+ .requiredOption("--name <name>", "A name to recognise the client by")
334
+ .requiredOption("--kind <kind>", "extension | macos")
335
+ .option("--json", "Print {client_id, token} as JSON")
336
+ .action((opts) => clientsCommand(() => runClientsAdd({ name: opts.name, kind: opts.kind, json: opts.json === true })));
337
+ clients
338
+ .command("list")
339
+ .description("List client ids, kinds, names and creation times (never tokens)")
340
+ .option("--json", "Emit JSON")
341
+ .action((opts) => clientsCommand(() => runClientsList({ json: opts.json === true })));
342
+ clients
343
+ .command("revoke <id>")
344
+ .description("Remove a client; its token stops working at once")
345
+ .action((id) => clientsCommand(() => runClientsRevoke(id)));
346
+ return program;
347
+ }
348
+ const isDirect = (() => {
349
+ try {
350
+ const argv1 = process.argv[1];
351
+ if (!argv1)
352
+ return false;
353
+ return import.meta.url.endsWith(argv1) || import.meta.url.includes("/cli/dist/index.js");
354
+ }
355
+ catch {
356
+ return false;
357
+ }
358
+ })();
359
+ if (isDirect) {
360
+ buildProgram().parseAsync(process.argv).catch((err) => {
361
+ // eslint-disable-next-line no-console
362
+ console.error(err);
363
+ process.exit(1);
364
+ });
365
+ }
366
+ //# 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"}