@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
@@ -0,0 +1,491 @@
1
+ /**
2
+ * `tidegap queue list | show | unread` — inspect the ledger.
3
+ * `tidegap queue cancel | reschedule | run-now | reply` — change it (ui v2).
4
+ * Writes go through a `Scheduler` without adapters: they never dispatch;
5
+ * the dispatcher (`tidegap tick` or the OpenClaw loop) runs the task.
6
+ *
7
+ * We deliberately avoid a table-printing dependency. Columns are
8
+ * padded with String.prototype.padEnd to a fixed width.
9
+ *
10
+ * Every task string printed here (title, prompt, result, error, ids) is
11
+ * untrusted: it comes from prompts and model output. It goes through
12
+ * `stripControlChars` so it cannot carry terminal escape sequences.
13
+ */
14
+ import { buildDefaultGridFeed, deadlineKindLabel, displayTitle, LAST_TICK_META_KEY, loadQuotaResetConfig, resolveRegion, resumeCommand, Scheduler, stripControlChars, taskHistory, taskPrompt, taskResultText, TaskStore, } from "@tidegap/core";
15
+ import { existsSync } from "node:fs";
16
+ import { readEnvCredentials } from "../env.js";
17
+ import { loadEnvFileIntoProcess } from "./env-file.js";
18
+ import { defaultDbPath } from "./tick.js";
19
+ export const VALID_STATUSES = new Set([
20
+ "queued",
21
+ "scheduled",
22
+ "running",
23
+ // v0.12: task routed through a provider Batch API, awaiting results.
24
+ "submitted",
25
+ "completed",
26
+ "failed",
27
+ "cancelled",
28
+ ]);
29
+ export const VALID_KINDS = new Set(["absolute", "quota_reset"]);
30
+ /** One line of terminal-safe text. */
31
+ function safe(value) {
32
+ return stripControlChars(value);
33
+ }
34
+ /** Multi-line terminal-safe text (keeps newlines and tabs). */
35
+ function safeBlock(value) {
36
+ return stripControlChars(value, { multiline: true });
37
+ }
38
+ function fmtCol(value, width) {
39
+ const s = value === undefined || value === null ? "-" : safe(String(value));
40
+ const chars = Array.from(s);
41
+ return (chars.length > width ? chars.slice(0, width - 1).join("") + "…" : s).padEnd(width);
42
+ }
43
+ function kindCell(r) {
44
+ return r.deadlineKind === "quota_reset" ? `quota:${r.quotaProvider ?? "?"}` : "abs";
45
+ }
46
+ export function renderQueue(rows, opts = {}) {
47
+ const header = fmtCol("task_id", 38) +
48
+ fmtCol("status", 12) +
49
+ fmtCol("title", 34) +
50
+ fmtCol("deadline", 26) +
51
+ fmtCol("kind", 14) +
52
+ fmtCol("scheduled_for", 26) +
53
+ fmtCol("region", 16);
54
+ const sep = "-".repeat(header.length);
55
+ const lines = rows.map((r) => fmtCol(r.taskId, 38) +
56
+ fmtCol(r.status, 12) +
57
+ fmtCol(r.title, 34) +
58
+ fmtCol(r.deadline, 26) +
59
+ fmtCol(kindCell(r), 14) +
60
+ fmtCol(r.scheduledFor, 26) +
61
+ fmtCol(r.region, 16));
62
+ // When a ticker (`tidegap tick` or the OpenClaw loop) last ran: tells the user
63
+ // whether scheduled tasks are actually being dispatched.
64
+ const tick = `last tick: ${opts.lastTickAt ?? "never recorded"}`;
65
+ return [header, sep, ...lines, "", tick].join("\n");
66
+ }
67
+ /**
68
+ * The fields `queue list --json` and the `tidegap ui` list API print per task
69
+ * (no prompt, no result).
70
+ */
71
+ export function taskSummary(r) {
72
+ const { provider, model } = taskProviderModel(r);
73
+ return {
74
+ task_id: r.taskId,
75
+ title: r.title ?? null,
76
+ display_title: displayTitle(r) ?? r.taskId,
77
+ status: r.status,
78
+ origin_host: r.originHost ?? null,
79
+ deadline: r.deadline ?? null,
80
+ deadline_kind: r.deadlineKind ?? "absolute",
81
+ quota_provider: r.quotaProvider ?? null,
82
+ scheduled_for: r.scheduledFor ?? null,
83
+ completed_at: r.completedAt ?? null,
84
+ read_at: r.readAt ?? null,
85
+ region: r.region,
86
+ series_id: r.seriesId ?? null,
87
+ repeat: r.repeat ?? "none",
88
+ provider: provider ?? null,
89
+ model: model ?? null,
90
+ };
91
+ }
92
+ /**
93
+ * Provider and model of a task: what ran (receipt) when it finished, else
94
+ * what the stored body asks for. Closure tasks have neither.
95
+ */
96
+ export function taskProviderModel(r) {
97
+ if (r.receipt?.provider || r.receipt?.model) {
98
+ return { provider: r.receipt.provider, model: r.receipt.model };
99
+ }
100
+ if (!r.bodyJson)
101
+ return {};
102
+ try {
103
+ const spec = JSON.parse(r.bodyJson);
104
+ return {
105
+ provider: typeof spec.provider === "string" ? spec.provider : undefined,
106
+ model: typeof spec.model === "string" ? spec.model : undefined,
107
+ };
108
+ }
109
+ catch {
110
+ return {};
111
+ }
112
+ }
113
+ function buildFilter(opts) {
114
+ const filter = {};
115
+ if (opts.status) {
116
+ if (!VALID_STATUSES.has(opts.status)) {
117
+ throw new Error(`queue list: unknown status ${JSON.stringify(opts.status)}. Valid: ${[...VALID_STATUSES].join(", ")}`);
118
+ }
119
+ filter.status = opts.status;
120
+ }
121
+ if (opts.kind) {
122
+ if (!VALID_KINDS.has(opts.kind)) {
123
+ throw new Error(`queue list: unknown kind ${JSON.stringify(opts.kind)}. Valid: ${[...VALID_KINDS].join(", ")}`);
124
+ }
125
+ filter.deadlineKind = opts.kind;
126
+ }
127
+ if (opts.unread)
128
+ filter.unread = true;
129
+ if (opts.series)
130
+ filter.seriesId = opts.series;
131
+ return filter;
132
+ }
133
+ /**
134
+ * The Claude Code SessionStart line: `N unread Tidegap task(s), run `tidegap ui``,
135
+ * or "" when nothing is unread. It names no task text, so nothing from a
136
+ * prompt or a model reply reaches the session context.
137
+ */
138
+ export function renderHookLine(unreadCount) {
139
+ if (unreadCount <= 0)
140
+ return "";
141
+ const noun = unreadCount === 1 ? "task" : "tasks";
142
+ return stripControlChars(`${unreadCount} unread Tidegap ${noun}, run \`tidegap ui\` to read them.`);
143
+ }
144
+ function runQueueHook(opts) {
145
+ const dbPath = opts.db ?? defaultDbPath();
146
+ // Do not create a ledger just to report that it is empty.
147
+ if (dbPath !== ":memory:" && !existsSync(dbPath))
148
+ return { rows: [], rendered: "" };
149
+ let store;
150
+ try {
151
+ store = new TaskStore({ dbPath });
152
+ const rows = store.list({ unread: true });
153
+ return { rows, rendered: renderHookLine(rows.length) };
154
+ }
155
+ catch {
156
+ return { rows: [], rendered: "" };
157
+ }
158
+ finally {
159
+ try {
160
+ store?.close();
161
+ }
162
+ catch {
163
+ // ignore
164
+ }
165
+ }
166
+ }
167
+ export async function runQueueList(opts = {}) {
168
+ if (opts.hook)
169
+ return runQueueHook(opts);
170
+ const filter = buildFilter(opts);
171
+ const dbPath = opts.db ?? defaultDbPath();
172
+ const store = new TaskStore({ dbPath });
173
+ try {
174
+ // A series lists its occurrences oldest first (by occurrence number).
175
+ const rows = opts.series ? sortSeries(store.list(filter)) : store.list(filter);
176
+ const lastTickAt = store.getMeta(LAST_TICK_META_KEY);
177
+ const rendered = opts.json
178
+ ? JSON.stringify({ last_tick_at: lastTickAt ?? null, tasks: rows.map(taskSummary) }, null, 2)
179
+ : renderQueue(rows, { lastTickAt });
180
+ return { rows, rendered };
181
+ }
182
+ finally {
183
+ store.close();
184
+ }
185
+ }
186
+ export function rawPayload(record) {
187
+ const r = record.result;
188
+ return r && typeof r === "object" ? r.raw : undefined;
189
+ }
190
+ /** Render one task in text, the CLI twin of the `tidegap ui` detail view. */
191
+ export function renderTask(record, opts = {}) {
192
+ const lines = [];
193
+ const kv = (key, value) => {
194
+ if (value !== undefined && value !== "")
195
+ lines.push(`${key}: ${safe(String(value))}`);
196
+ };
197
+ kv("task_id", record.taskId);
198
+ kv("title", record.title);
199
+ kv("status", record.status);
200
+ if (record.originHost) {
201
+ kv("origin", `${record.originHost}${record.originCwd ? ` (${record.originCwd})` : ""}`);
202
+ }
203
+ kv("origin_session", record.originSessionId);
204
+ kv("resume", resumeCommand(record));
205
+ kv("parent", record.parentTaskId);
206
+ if (opts.children && opts.children.length > 0)
207
+ kv("children", opts.children.join(", "));
208
+ if (record.seriesId) {
209
+ kv("series", record.seriesId);
210
+ kv("repeat", record.repeat && record.repeat !== "none" ? record.repeat : "none (series ended)");
211
+ }
212
+ kv("read_at", record.readAt);
213
+ lines.push("");
214
+ kv("enqueued_at", record.enqueuedAt);
215
+ kv("scheduled_for", record.scheduledFor);
216
+ if (record.deadline) {
217
+ kv("deadline", `${record.deadline} (${deadlineKindLabel(record, opts.quota)})`);
218
+ }
219
+ kv("completed_at", record.completedAt);
220
+ kv("region", record.region);
221
+ const prompt = taskPrompt(record);
222
+ if (prompt !== undefined) {
223
+ lines.push("", "Prompt:", safeBlock(prompt));
224
+ }
225
+ // Prior turns only: the current user turn is the prompt and the reply is
226
+ // the result, both printed in their own blocks.
227
+ const history = taskHistory(record);
228
+ const hasReply = record.status === "completed" && taskResultText(record) !== undefined;
229
+ const prior = history.slice(0, Math.max(0, history.length - 1 - (hasReply ? 1 : 0)));
230
+ if (prior.length > 0) {
231
+ lines.push("", "History:");
232
+ for (const turn of prior)
233
+ lines.push(`[${turn.role}] ${safeBlock(turn.content)}`);
234
+ }
235
+ const text = taskResultText(record);
236
+ if (text !== undefined) {
237
+ lines.push("", "Result:", safeBlock(text));
238
+ }
239
+ else if (record.result !== undefined && record.status === "completed") {
240
+ lines.push("", "Result:", safeBlock(JSON.stringify(record.result, null, 2)));
241
+ }
242
+ if (record.error)
243
+ lines.push("", `error: ${safeBlock(record.error)}`);
244
+ const receipt = record.receipt;
245
+ if (receipt) {
246
+ lines.push("", "Receipt:");
247
+ const rk = (key, value) => {
248
+ if (value !== undefined)
249
+ lines.push(` ${key}: ${safe(String(value))}`);
250
+ };
251
+ rk("ran_at", receipt.ranAt);
252
+ if (receipt.provider || receipt.model) {
253
+ rk("model", `${receipt.provider ?? "?"}:${receipt.model ?? "?"}`);
254
+ }
255
+ rk("estimated_carbon_g", receipt.estimatedCarbonGCo2);
256
+ rk("actual_carbon_g", receipt.actualCarbonGCo2);
257
+ rk("intensity_g_co2_per_kwh", receipt.intensityGCo2PerKwh);
258
+ rk("grid_source", receipt.gridSource === "mock"
259
+ ? "mock (SYNTHETIC grid data, not a measurement)"
260
+ : receipt.gridSource);
261
+ rk("energy_source", receipt.energySource);
262
+ rk("signed", receipt.signature ? "yes" : "no");
263
+ }
264
+ const routing = receipt?.routing ?? record.routingDecision;
265
+ if (routing) {
266
+ lines.push("", "Routing:", ` chosen: ${safe(routing.chosen)}`, ` reasoning: ${safe(routing.reasoning)}`);
267
+ }
268
+ if (opts.raw) {
269
+ const raw = rawPayload(record);
270
+ lines.push("", "Raw payload:", raw === undefined ? "(none)" : safeBlock(JSON.stringify(raw, null, 2)));
271
+ }
272
+ return lines.join("\n");
273
+ }
274
+ /**
275
+ * `tidegap queue show <id>`: print one task. A completed or failed task is
276
+ * marked read unless `markRead` is false. Throws on an unknown id.
277
+ */
278
+ export async function runQueueShow(taskId, opts = {}) {
279
+ const dbPath = opts.db ?? defaultDbPath();
280
+ const store = new TaskStore({ dbPath });
281
+ try {
282
+ let record = store.get(taskId);
283
+ if (!record)
284
+ throw new Error(`queue show: no task with id ${JSON.stringify(taskId)}`);
285
+ if (opts.markRead !== false && store.markRead(taskId)) {
286
+ record = store.get(taskId) ?? record;
287
+ }
288
+ const quota = loadQuotaResetConfig(opts.config !== undefined ? { path: opts.config } : {});
289
+ if (opts.json) {
290
+ const { result, ...rest } = record;
291
+ const payload = {
292
+ ...rest,
293
+ result: opts.raw ? result : withoutRaw(result),
294
+ deadline_label: deadlineKindLabel(record, quota),
295
+ history: taskHistory(record),
296
+ };
297
+ return { record, rendered: JSON.stringify(payload, null, 2) };
298
+ }
299
+ const children = store
300
+ .list()
301
+ .filter((t) => t.parentTaskId === record.taskId)
302
+ .map((t) => t.taskId);
303
+ return { record, rendered: renderTask(record, { raw: opts.raw, quota, children }) };
304
+ }
305
+ finally {
306
+ store.close();
307
+ }
308
+ }
309
+ export function withoutRaw(result) {
310
+ if (!result || typeof result !== "object" || !("raw" in result))
311
+ return result;
312
+ const { raw: _raw, ...rest } = result;
313
+ return rest;
314
+ }
315
+ /**
316
+ * `tidegap queue unread <id>`: clear a task's read marker so it shows in the
317
+ * inbox again. Throws on an unknown id.
318
+ */
319
+ export async function runQueueUnread(taskId, opts = {}) {
320
+ const store = new TaskStore({ dbPath: opts.db ?? defaultDbPath() });
321
+ try {
322
+ if (!store.get(taskId)) {
323
+ throw new Error(`queue unread: no task with id ${JSON.stringify(taskId)}`);
324
+ }
325
+ return store.markUnread(taskId)
326
+ ? `${safe(taskId)}: marked unread`
327
+ : `${safe(taskId)}: already unread`;
328
+ }
329
+ finally {
330
+ store.close();
331
+ }
332
+ }
333
+ // ── Write commands (ui v2) ──────────────────────────────────────────────────
334
+ /** Occurrences of one series in order: the series id first, then `~2`, `~3`… */
335
+ export function sortSeries(rows) {
336
+ const n = (r) => {
337
+ const m = /~(\d+)$/.exec(r.taskId);
338
+ return m && r.seriesId && r.taskId.startsWith(`${r.seriesId}~`) ? Number(m[1]) : 1;
339
+ };
340
+ return [...rows].sort((a, b) => n(a) - n(b) || a.enqueuedAt.localeCompare(b.enqueuedAt));
341
+ }
342
+ /**
343
+ * The scheduler every write path uses (`tidegap queue` writes and `tidegap ui`): the
344
+ * ledger, the default grid feed and the quota config, and NO adapters, so a
345
+ * write can never dispatch a provider call. Signing is off for the same
346
+ * reason: no receipt is produced here.
347
+ */
348
+ export function actionScheduler(opts) {
349
+ let feed = opts.feed;
350
+ if (!feed) {
351
+ loadEnvFileIntoProcess();
352
+ feed = buildDefaultGridFeed(readEnvCredentials().grid);
353
+ }
354
+ return new Scheduler({
355
+ dbPath: opts.dbPath,
356
+ feed,
357
+ defaultRegion: resolveRegion(undefined, opts.region).region,
358
+ signing: false,
359
+ eager: false,
360
+ quotaConfig: () => loadQuotaResetConfig(),
361
+ });
362
+ }
363
+ /** `30m`, `2h`, `3d`, `1w` from now, or an ISO-8601 instant. */
364
+ export function parseWhen(value, now = new Date()) {
365
+ const m = /^(\d+)\s*(m|min|h|d|w)$/i.exec(value.trim());
366
+ if (m) {
367
+ const unit = { m: 60_000, min: 60_000, h: 3_600_000, d: 86_400_000, w: 604_800_000 }[m[2].toLowerCase()];
368
+ return new Date(now.getTime() + Number(m[1]) * unit);
369
+ }
370
+ const d = new Date(value);
371
+ if (Number.isNaN(d.getTime())) {
372
+ throw new Error(`not a duration (30m, 2h, 3d, 1w) or an ISO-8601 time: ${JSON.stringify(value)}`);
373
+ }
374
+ return d;
375
+ }
376
+ /** Bounds of a local calendar day `yyyy-mm-dd`, as instants (23 to 25 h with DST). */
377
+ export function localDayBounds(day) {
378
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(day.trim());
379
+ if (!m)
380
+ throw new Error(`--day must be yyyy-mm-dd, got ${JSON.stringify(day)}`);
381
+ const [y, mo, d] = [Number(m[1]), Number(m[2]) - 1, Number(m[3])];
382
+ const dayStart = new Date(y, mo, d, 0, 0, 0, 0);
383
+ const dayEnd = new Date(y, mo, d + 1, 0, 0, 0, 0);
384
+ if (dayStart.getMonth() !== mo || dayStart.getDate() !== d) {
385
+ throw new Error(`--day is not a calendar date: ${JSON.stringify(day)}`);
386
+ }
387
+ return { dayStart, dayEnd };
388
+ }
389
+ /** The one line after every write: when it runs and whether a ticker is alive. */
390
+ function nextTickLine(store) {
391
+ const last = store.getMeta(LAST_TICK_META_KEY);
392
+ return `runs on the next tick (last tick: ${last ?? "never recorded"})`;
393
+ }
394
+ function writeResult(scheduler, dbPath, record, head) {
395
+ const store = new TaskStore({ dbPath });
396
+ try {
397
+ const fresh = store.get(record.taskId) ?? record;
398
+ const lines = [
399
+ safe(head),
400
+ `status: ${safe(fresh.status)}`,
401
+ ...(fresh.scheduledFor ? [`scheduled_for: ${safe(fresh.scheduledFor)}`] : []),
402
+ ...(fresh.deadline ? [`deadline: ${safe(fresh.deadline)}`] : []),
403
+ ];
404
+ if (fresh.status === "scheduled" || fresh.status === "queued")
405
+ lines.push(nextTickLine(store));
406
+ return lines.join("\n");
407
+ }
408
+ finally {
409
+ store.close();
410
+ scheduler.shutdown();
411
+ }
412
+ }
413
+ /** `tidegap queue cancel <id> [--series]`. Throws (exit 1) on an unknown id. */
414
+ export async function runQueueCancel(taskId, opts = {}) {
415
+ const dbPath = opts.db ?? defaultDbPath();
416
+ const scheduler = actionScheduler({ ...opts, dbPath });
417
+ let rec;
418
+ try {
419
+ rec = scheduler.cancelTask(taskId, { series: opts.series === true });
420
+ }
421
+ catch (err) {
422
+ scheduler.shutdown();
423
+ throw err;
424
+ }
425
+ const ended = opts.series && rec.seriesId ? ` (series ${rec.seriesId} ended)` : "";
426
+ return writeResult(scheduler, dbPath, rec, `${taskId}: ${rec.status}${ended}`);
427
+ }
428
+ /** `tidegap queue run-now <id>`. Throws (exit 1) when the task cannot run now. */
429
+ export async function runQueueRunNow(taskId, opts = {}) {
430
+ const dbPath = opts.db ?? defaultDbPath();
431
+ const scheduler = actionScheduler({ ...opts, dbPath });
432
+ let rec;
433
+ try {
434
+ rec = scheduler.runNow(taskId);
435
+ }
436
+ catch (err) {
437
+ scheduler.shutdown();
438
+ throw err;
439
+ }
440
+ return writeResult(scheduler, dbPath, rec, `${taskId}: marked to run now`);
441
+ }
442
+ /**
443
+ * `tidegap queue reschedule <id> (--by <when> | --at <iso> | --day <yyyy-mm-dd>)`.
444
+ * Exactly one target. `--day` uses this machine's time zone for the bounds.
445
+ */
446
+ export async function runQueueReschedule(taskId, opts = {}) {
447
+ const given = [opts.by, opts.at, opts.day].filter((v) => v !== undefined);
448
+ if (given.length !== 1) {
449
+ throw new Error("queue reschedule: pass exactly one of --by, --at or --day");
450
+ }
451
+ const now = opts.now?.() ?? new Date();
452
+ let target;
453
+ if (opts.by !== undefined)
454
+ target = { deadline: parseWhen(opts.by, now) };
455
+ else if (opts.at !== undefined)
456
+ target = { at: parseWhen(opts.at, now) };
457
+ else
458
+ target = localDayBounds(opts.day);
459
+ const dbPath = opts.db ?? defaultDbPath();
460
+ const scheduler = actionScheduler({ ...opts, dbPath });
461
+ let rec;
462
+ try {
463
+ rec = await scheduler.rescheduleTask(taskId, target);
464
+ }
465
+ catch (err) {
466
+ scheduler.shutdown();
467
+ throw err;
468
+ }
469
+ return writeResult(scheduler, dbPath, rec, `${taskId}: rescheduled`);
470
+ }
471
+ /** `tidegap queue reply <id> <text> [--by <when>]`: a child task with the history. */
472
+ export async function runQueueReply(taskId, text, opts = {}) {
473
+ if (text.length === 0 || text.length > 32_000) {
474
+ throw new Error("queue reply: text must be 1 to 32000 characters");
475
+ }
476
+ const now = opts.now?.() ?? new Date();
477
+ const dbPath = opts.db ?? defaultDbPath();
478
+ const scheduler = actionScheduler({ ...opts, dbPath });
479
+ let child;
480
+ try {
481
+ child = await scheduler.replyToTask(taskId, text, {
482
+ ...(opts.by !== undefined ? { deadline: parseWhen(opts.by, now) } : {}),
483
+ });
484
+ }
485
+ catch (err) {
486
+ scheduler.shutdown();
487
+ throw err;
488
+ }
489
+ return writeResult(scheduler, dbPath, child, `reply queued as ${child.taskId} (parent ${taskId})`);
490
+ }
491
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `tidegap receipts list` — print carbon receipts for completed tasks.
3
+ */
4
+ import type { TaskRecord } from "@tidegap/core";
5
+ export interface ReceiptsListOptions {
6
+ db?: string;
7
+ since?: string;
8
+ }
9
+ export interface ReceiptsListResult {
10
+ rows: TaskRecord<unknown>[];
11
+ rendered: string;
12
+ }
13
+ export declare function renderReceipts(rows: TaskRecord<unknown>[]): string;
14
+ export declare function runReceiptsList(opts?: ReceiptsListOptions): Promise<ReceiptsListResult>;
15
+ //# sourceMappingURL=receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../src/commands/receipts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,CAwClE;AAED,wBAAsB,eAAe,CACnC,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAsB7B"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `tidegap receipts list` — print carbon receipts for completed tasks.
3
+ */
4
+ import { TaskStore } from "@tidegap/core";
5
+ import { defaultDbPath } from "./tick.js";
6
+ function fmtCol(value, width) {
7
+ const s = value === undefined || value === null ? "-" : String(value);
8
+ return (s.length > width ? s.slice(0, width - 1) + "…" : s).padEnd(width);
9
+ }
10
+ /** True when the receipt's carbon was derived from the synthetic curve. */
11
+ function isMock(rec) {
12
+ return rec?.gridSource === "mock";
13
+ }
14
+ export function renderReceipts(rows) {
15
+ const header = fmtCol("task_id", 38) +
16
+ fmtCol("ran_at", 26) +
17
+ fmtCol("region", 16) +
18
+ fmtCol("est_g_co2", 12) +
19
+ fmtCol("intensity", 12) +
20
+ fmtCol("grid_source", 16) +
21
+ fmtCol("energy_src", 12) +
22
+ fmtCol("duration_ms", 12);
23
+ const sep = "-".repeat(header.length);
24
+ const lines = rows.map((r) => {
25
+ const rec = r.receipt;
26
+ const mock = isMock(rec);
27
+ // Mark synthetic grid data loudly so no one mistakes it for real.
28
+ const gridSource = rec?.gridSource
29
+ ? mock
30
+ ? `mock(SYNTH)`
31
+ : rec.gridSource
32
+ : undefined;
33
+ return (fmtCol(r.taskId, 38) +
34
+ fmtCol(rec?.ranAt ?? r.completedAt, 26) +
35
+ fmtCol(rec?.region ?? r.region, 16) +
36
+ fmtCol(rec?.estimatedCarbonGCo2, 12) +
37
+ fmtCol(rec?.intensityGCo2PerKwh, 12) +
38
+ fmtCol(gridSource, 16) +
39
+ fmtCol(rec?.energySource, 12) +
40
+ fmtCol(rec?.durationMs, 12));
41
+ });
42
+ const out = [header, sep, ...lines];
43
+ if (rows.some((r) => isMock(r.receipt))) {
44
+ out.push("", "!! MOCK DATA: rows with grid_source=mock(SYNTH) used the synthetic", " fallback curve, not a real grid feed — their carbon is illustrative.");
45
+ }
46
+ return out.join("\n");
47
+ }
48
+ export async function runReceiptsList(opts = {}) {
49
+ const dbPath = opts.db ?? defaultDbPath();
50
+ const store = new TaskStore({ dbPath });
51
+ try {
52
+ const all = store.list({ status: "completed" });
53
+ let rows = all;
54
+ if (opts.since) {
55
+ const sinceMs = new Date(opts.since).getTime();
56
+ if (Number.isNaN(sinceMs)) {
57
+ throw new Error(`receipts list: --since ${JSON.stringify(opts.since)} is not a valid ISO-8601 timestamp`);
58
+ }
59
+ rows = rows.filter((r) => {
60
+ const t = r.receipt?.ranAt ?? r.completedAt;
61
+ return t ? new Date(t).getTime() >= sinceMs : false;
62
+ });
63
+ }
64
+ return { rows, rendered: renderReceipts(rows) };
65
+ }
66
+ finally {
67
+ store.close();
68
+ }
69
+ }
70
+ //# sourceMappingURL=receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/commands/receipts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `tidegap register-wake <task-id>` — schedule an RTC/pmset wake event 30s
3
+ * before the task's `scheduledFor`. macOS uses `pmset schedule wake`;
4
+ * Linux uses `rtcwake -m no -t <epoch>`.
5
+ */
6
+ import { type PlatformName } from "../platform/index.js";
7
+ export interface RegisterWakeOptions {
8
+ taskId: string;
9
+ db?: string;
10
+ platform?: PlatformName;
11
+ /** If true, only print the command — don't run pmset. */
12
+ dryRun?: boolean;
13
+ }
14
+ export interface RegisterWakeResult {
15
+ command: string;
16
+ ok: boolean;
17
+ stderr: string;
18
+ message: string;
19
+ }
20
+ export declare function runRegisterWake(opts: RegisterWakeOptions): Promise<RegisterWakeResult>;
21
+ //# sourceMappingURL=register-wake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-wake.d.ts","sourceRoot":"","sources":["../../src/commands/register-wake.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CA0D7B"}