@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/ui/api.js ADDED
@@ -0,0 +1,613 @@
1
+ /**
2
+ * JSON API handlers for `tidegap ui`. Reads go through the `TaskStore`. Writes
3
+ * (ui v2) go through `ctx.scheduler`, a `Scheduler` built with NO adapters:
4
+ * cancel, reschedule, run now and reply only write the ledger, with a
5
+ * compare-and-set, and the dispatcher (`tidegap tick` or the OpenClaw loop)
6
+ * runs the task. Nothing here dispatches a provider call. A refused action
7
+ * returns 409 with the core's one-line rule, never a stack or a path.
8
+ *
9
+ * Task strings are untrusted (prompts and model output). They leave here as
10
+ * JSON values; the page renders them with `textContent` only.
11
+ */
12
+ import { CarbonBudgetExceededError, DEFAULT_MODEL_BY_PROVIDER, deadlineKindLabel, InvalidDeadlineError, LAST_TICK_META_KEY, nextQuotaReset, resolveQuotaDeadline, resumeCommand, TaskActionError, taskActions, taskHistory, taskPrompt, taskResultText, } from "@tidegap/core";
13
+ import { rawPayload, sortSeries, taskSummary, VALID_KINDS, VALID_STATUSES, withoutRaw, } from "../commands/queue.js";
14
+ import { CLIENT_KINDS, ClientRegistryError, cleanClientName, isClientKind } from "./clients.js";
15
+ import { buildSummary } from "./summary.js";
16
+ /** Longest reply text, in characters. */
17
+ export const REPLY_MAX_CHARS = 32_000;
18
+ /**
19
+ * How each POST route treats its body (KTD9). `json`: the route reads a
20
+ * JSON object (Content-Type application/json required). `none`: no body.
21
+ */
22
+ export function postBodyKind(pathname) {
23
+ const route = pathname.split("/").filter(Boolean).slice(1);
24
+ if (route.length === 2 && route[0] === "dispatcher" && route[1] === "start")
25
+ return "none";
26
+ if (route.length === 1 && route[0] === "tasks")
27
+ return "json";
28
+ if (route.length === 1 && route[0] === "clients")
29
+ return "json";
30
+ if (route.length === 3 && route[0] === "clients" && route[2] === "revoke")
31
+ return "none";
32
+ if (route.length !== 3 || route[0] !== "tasks")
33
+ return undefined;
34
+ if (route[2] === "cancel" || route[2] === "reschedule" || route[2] === "reply")
35
+ return "json";
36
+ if (route[2] === "read" || route[2] === "unread" || route[2] === "run-now")
37
+ return "none";
38
+ return undefined;
39
+ }
40
+ /** Most hours of forecast one request returns. */
41
+ export const MAX_FORECAST_HOURS = 72;
42
+ /**
43
+ * How long one forecast answer is reused. The page asks on every change
44
+ * event; without a cache each one would spend the grid provider's quota,
45
+ * which the tick needs for scheduling.
46
+ */
47
+ export const FORECAST_CACHE_MS = 10 * 60_000;
48
+ const forecastCache = new WeakMap();
49
+ const REGION_RE = /^[A-Za-z0-9_-]{1,64}$/;
50
+ function error(status, message) {
51
+ return { status, body: { error: message } };
52
+ }
53
+ function listSummary(r) {
54
+ return {
55
+ ...taskSummary(r),
56
+ parent_task_id: r.parentTaskId ?? null,
57
+ estimated_carbon_g: r.estimatedCarbonGCo2 ?? null,
58
+ // What the task cost (receipt) or is expected to cost (schedule time).
59
+ carbon_g: r.receipt?.actualCarbonGCo2 ?? r.estimatedCarbonGCo2 ?? null,
60
+ intensity_g_per_kwh: r.receipt?.intensityGCo2PerKwh ?? null,
61
+ actions: taskActions(r),
62
+ };
63
+ }
64
+ const MAX_LIST_LIMIT = 1000;
65
+ function listTasks(ctx, params) {
66
+ const statuses = (params.get("status") ?? "")
67
+ .split(",")
68
+ .map((s) => s.trim())
69
+ .filter(Boolean);
70
+ for (const s of statuses) {
71
+ if (!VALID_STATUSES.has(s))
72
+ return error(400, `unknown status ${s}`);
73
+ }
74
+ const kind = params.get("kind") ?? undefined;
75
+ if (kind !== undefined && !VALID_KINDS.has(kind)) {
76
+ return error(400, `unknown kind ${kind}`);
77
+ }
78
+ const unread = params.get("unread") === "1" || params.get("unread") === "true";
79
+ const series = params.get("series") ?? undefined;
80
+ const rawLimit = params.get("limit");
81
+ const limit = rawLimit === null ? undefined : Number(rawLimit);
82
+ if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > MAX_LIST_LIMIT)) {
83
+ return error(400, `limit must be an integer from 1 to ${MAX_LIST_LIMIT}`);
84
+ }
85
+ const base = {
86
+ ...(kind ? { deadlineKind: kind } : {}),
87
+ ...(unread ? { unread: true } : {}),
88
+ ...(series ? { seriesId: series } : {}),
89
+ };
90
+ let rows = statuses.length === 0
91
+ ? ctx.store.list(base)
92
+ : statuses.flatMap((status) => ctx.store.list({ ...base, status: status }));
93
+ if (series)
94
+ rows = sortSeries(rows);
95
+ // `limit` keeps the newest rows by enqueue time; the order stays as listed.
96
+ if (limit !== undefined && rows.length > limit) {
97
+ const keep = new Set([...rows]
98
+ .sort((a, b) => b.enqueuedAt.localeCompare(a.enqueuedAt))
99
+ .slice(0, limit)
100
+ .map((r) => r.taskId));
101
+ rows = rows.filter((r) => keep.has(r.taskId));
102
+ }
103
+ return {
104
+ status: 200,
105
+ body: {
106
+ last_tick_at: ctx.store.getMeta(LAST_TICK_META_KEY) ?? null,
107
+ tasks: rows.map(listSummary),
108
+ },
109
+ };
110
+ }
111
+ function taskDetail(ctx, taskId) {
112
+ const r = ctx.store.get(taskId);
113
+ if (!r)
114
+ return error(404, "task not found");
115
+ const quota = ctx.quota();
116
+ const schedule = r.deadlineKind === "quota_reset" ? quota[r.quotaProvider ?? ""] : undefined;
117
+ return {
118
+ status: 200,
119
+ body: {
120
+ ...listSummary(r),
121
+ enqueued_at: r.enqueuedAt,
122
+ origin_cwd: r.originCwd ?? null,
123
+ origin_session_id: r.originSessionId ?? null,
124
+ resume_command: resumeCommand(r) ?? null,
125
+ parent: parentSummary(ctx, r),
126
+ children: ctx.store
127
+ .list()
128
+ .filter((c) => c.parentTaskId === r.taskId)
129
+ .map(listSummary),
130
+ series: r.seriesId ? seriesInfo(ctx, r.seriesId) : null,
131
+ deadline_label: deadlineKindLabel(r, quota),
132
+ quota_margin_h: schedule?.marginH ?? null,
133
+ prompt: taskPrompt(r) ?? null,
134
+ history: taskHistory(r),
135
+ result_text: taskResultText(r) ?? null,
136
+ result: withoutRaw(r.result) ?? null,
137
+ error: r.error ?? null,
138
+ receipt: r.receipt ?? null,
139
+ routing: r.receipt?.routing ?? r.routingDecision ?? null,
140
+ raw: rawPayload(r) ?? null,
141
+ },
142
+ };
143
+ }
144
+ function parentSummary(ctx, r) {
145
+ if (!r.parentTaskId)
146
+ return null;
147
+ const p = ctx.store.get(r.parentTaskId);
148
+ return p ? listSummary(p) : { task_id: r.parentTaskId, missing: true };
149
+ }
150
+ const DAY_MS = 86_400_000;
151
+ /**
152
+ * Up to `count` deadlines after `fromMs` for a series rule: whole periods
153
+ * for daily/weekly; the label's next resets minus margin for quota_reset
154
+ * (+7 days without a config). Empty for an ended series.
155
+ */
156
+ function projectDeadlines(rule, fromMs, label, quota, count) {
157
+ const out = [];
158
+ const schedule = rule === "quota_reset" && label ? quota[label] : undefined;
159
+ let t = fromMs;
160
+ for (let i = 0; i < count; i++) {
161
+ if (rule === "daily")
162
+ t += DAY_MS;
163
+ else if (rule === "weekly")
164
+ t += 7 * DAY_MS;
165
+ else if (rule === "quota_reset") {
166
+ t = schedule ? resolveQuotaDeadline(schedule, new Date(t + 60_000)).deadline.getTime() : t + 7 * DAY_MS;
167
+ }
168
+ else
169
+ break;
170
+ out.push(new Date(t).toISOString());
171
+ }
172
+ return out;
173
+ }
174
+ function seriesInfo(ctx, seriesId) {
175
+ const rows = sortSeries(ctx.store.list({ seriesId }));
176
+ if (rows.length === 0)
177
+ return null;
178
+ const last = rows[rows.length - 1];
179
+ const rule = last.repeat ?? "none";
180
+ const label = [...rows].reverse().find((r) => r.quotaProvider)?.quotaProvider;
181
+ const lastDeadline = last.deadline ? Date.parse(last.deadline) : Number.NaN;
182
+ return {
183
+ series_id: seriesId,
184
+ repeat: rule,
185
+ ended: rule === "none",
186
+ occurrences: rows.length,
187
+ next_deadlines: Number.isFinite(lastDeadline)
188
+ ? projectDeadlines(rule, lastDeadline, label, ctx.quota(), 8)
189
+ : [],
190
+ };
191
+ }
192
+ function seriesDetail(ctx, seriesId) {
193
+ const info = seriesInfo(ctx, seriesId);
194
+ if (!info)
195
+ return error(404, "series not found");
196
+ return {
197
+ status: 200,
198
+ body: {
199
+ ...info,
200
+ occurrences: sortSeries(ctx.store.list({ seriesId })).map(listSummary),
201
+ },
202
+ };
203
+ }
204
+ function onlyKeys(body, allowed) {
205
+ const extra = Object.keys(body).filter((k) => !allowed.includes(k));
206
+ return extra.length > 0 ? `unknown field ${extra[0]}` : undefined;
207
+ }
208
+ /** An ISO instant from the body, or the 400 message when it is not one. */
209
+ function instant(value, name) {
210
+ if (typeof value !== "string" || value.length === 0 || value.length > 64) {
211
+ return `${name} must be an ISO-8601 string`;
212
+ }
213
+ const d = new Date(value);
214
+ return Number.isNaN(d.getTime()) ? `${name} is not an ISO-8601 instant` : d;
215
+ }
216
+ /**
217
+ * Run one write through the action scheduler: 404 for an unknown task,
218
+ * 409 with the core's rule when the task's state or input refuses it, 500
219
+ * with a generic body for any other error.
220
+ */
221
+ async function act(ctx, taskId, run, status = 200) {
222
+ if (!ctx.scheduler)
223
+ return error(405, "this server is read-only");
224
+ if (!ctx.store.get(taskId))
225
+ return error(404, "task not found");
226
+ let out;
227
+ try {
228
+ out = await run(ctx.scheduler);
229
+ }
230
+ catch (err) {
231
+ // Only a refusal carries a rule safe to show; anything else is internal
232
+ // and gets a generic body (no exception text, no path).
233
+ if (err instanceof TaskActionError || err instanceof InvalidDeadlineError) {
234
+ return error(409, oneLine(err));
235
+ }
236
+ return error(500, "action failed");
237
+ }
238
+ const fresh = ctx.store.get(out.taskId) ?? out;
239
+ const changed = out.taskId === taskId ? [taskId] : [taskId, out.taskId];
240
+ return { status, body: listSummary(fresh), changedIds: changed };
241
+ }
242
+ /** The core's message on one line, without anything after a newline. */
243
+ function oneLine(err) {
244
+ const msg = err instanceof Error ? err.message : String(err);
245
+ return msg.split("\n")[0].slice(0, 300);
246
+ }
247
+ function cancelAction(ctx, taskId, body) {
248
+ const bad = onlyKeys(body, ["series"]);
249
+ if (bad)
250
+ return error(400, bad);
251
+ if (body.series !== undefined && typeof body.series !== "boolean") {
252
+ return error(400, "series must be a boolean");
253
+ }
254
+ return act(ctx, taskId, (s) => {
255
+ // The core cancel is idempotent; the API reports a finished task as a
256
+ // refused action (409), so a second click says what happened.
257
+ const current = ctx.store.get(taskId);
258
+ if (!taskActions(current).cancel) {
259
+ throw new TaskActionError(`cancel: task ${taskId} is ${current.status}; only pending tasks can be cancelled`);
260
+ }
261
+ return s.cancelTask(taskId, { series: body.series === true });
262
+ });
263
+ }
264
+ function rescheduleAction(ctx, taskId, body) {
265
+ const bad = onlyKeys(body, ["deadline", "at", "day_start", "day_end"]);
266
+ if (bad)
267
+ return error(400, bad);
268
+ const has = (k) => body[k] !== undefined;
269
+ const shapes = [has("deadline"), has("at"), has("day_start") || has("day_end")].filter(Boolean);
270
+ if (shapes.length !== 1) {
271
+ return error(400, "pass exactly one of {deadline}, {at} or {day_start, day_end}");
272
+ }
273
+ const now = (ctx.now?.() ?? new Date()).getTime();
274
+ let target;
275
+ if (has("deadline") || has("at")) {
276
+ const key = has("deadline") ? "deadline" : "at";
277
+ const d = instant(body[key], key);
278
+ if (typeof d === "string")
279
+ return error(400, d);
280
+ if (d.getTime() < now - 5_000)
281
+ return error(400, `${key} is in the past`);
282
+ target = key === "deadline" ? { deadline: d } : { at: d };
283
+ }
284
+ else {
285
+ const start = instant(body.day_start, "day_start");
286
+ if (typeof start === "string")
287
+ return error(400, start);
288
+ const end = instant(body.day_end, "day_end");
289
+ if (typeof end === "string")
290
+ return error(400, end);
291
+ const span = end.getTime() - start.getTime();
292
+ if (span < 3_600_000 || span > 25 * 3_600_000)
293
+ return error(400, "a day must span 1 to 25 hours");
294
+ if (end.getTime() < now)
295
+ return error(400, "day_end is in the past");
296
+ target = { dayStart: start, dayEnd: end };
297
+ }
298
+ return act(ctx, taskId, (s) => s.rescheduleTask(taskId, target));
299
+ }
300
+ function replyAction(ctx, taskId, body) {
301
+ const bad = onlyKeys(body, ["text", "deadline"]);
302
+ if (bad)
303
+ return error(400, bad);
304
+ if (typeof body.text !== "string" || body.text.trim().length === 0 || body.text.length > REPLY_MAX_CHARS) {
305
+ return error(400, `text must be 1 to ${REPLY_MAX_CHARS} characters`);
306
+ }
307
+ let deadline;
308
+ if (body.deadline !== undefined) {
309
+ const d = instant(body.deadline, "deadline");
310
+ if (typeof d === "string")
311
+ return error(400, d);
312
+ deadline = d;
313
+ }
314
+ const text = body.text;
315
+ return act(ctx, taskId, (s) => s.replyToTask(taskId, text, deadline ? { deadline } : {}), 201);
316
+ }
317
+ /** Longest quick-add title and model id, in characters. */
318
+ export const QUICK_ADD_TITLE_MAX = 200;
319
+ const QUICK_ADD_PROVIDERS = ["anthropic", "openai", "gemini", "ollama"];
320
+ const DAY_DEFAULT_MS = 24 * 3_600_000;
321
+ /**
322
+ * `POST /api/tasks` (native clients KTD7): queue a provider call from a
323
+ * prompt. It goes through the adapter-less scheduler, so it is scheduled,
324
+ * never dispatched; the tick runs it.
325
+ */
326
+ async function quickAdd(ctx, body) {
327
+ if (!ctx.scheduler)
328
+ return error(404, "not found");
329
+ const bad = onlyKeys(body, ["prompt", "deadline", "title", "provider", "model"]);
330
+ if (bad)
331
+ return error(400, bad);
332
+ if (typeof body.prompt !== "string" || body.prompt.trim().length === 0 || body.prompt.length > REPLY_MAX_CHARS) {
333
+ return error(400, `prompt must be 1 to ${REPLY_MAX_CHARS} characters`);
334
+ }
335
+ const now = (ctx.now?.() ?? new Date()).getTime();
336
+ let deadline = new Date(now + DAY_DEFAULT_MS);
337
+ if (body.deadline !== undefined) {
338
+ const d = instant(body.deadline, "deadline");
339
+ if (typeof d === "string")
340
+ return error(400, d);
341
+ if (d.getTime() <= now)
342
+ return error(400, "deadline is in the past");
343
+ deadline = d;
344
+ }
345
+ if (body.title !== undefined && (typeof body.title !== "string" || body.title.length > QUICK_ADD_TITLE_MAX)) {
346
+ return error(400, `title must be a string of at most ${QUICK_ADD_TITLE_MAX} characters`);
347
+ }
348
+ const provider = body.provider ?? "anthropic";
349
+ if (!QUICK_ADD_PROVIDERS.includes(provider)) {
350
+ return error(400, `provider must be one of ${QUICK_ADD_PROVIDERS.join(", ")}`);
351
+ }
352
+ if (body.model !== undefined && (typeof body.model !== "string" || body.model.length === 0 || body.model.length > QUICK_ADD_TITLE_MAX)) {
353
+ return error(400, `model must be 1 to ${QUICK_ADD_TITLE_MAX} characters`);
354
+ }
355
+ // Same default as the MCP server: TIDEGAP_DEFAULT_MODEL is an Anthropic
356
+ // override only, so a task never carries another vendor's model id.
357
+ const model = body.model ??
358
+ (provider === "anthropic" ? ctx.defaultModel ?? DEFAULT_MODEL_BY_PROVIDER.anthropic : DEFAULT_MODEL_BY_PROVIDER[provider]);
359
+ let rec;
360
+ try {
361
+ rec = await ctx.scheduler.enqueueProviderCall({ type: "provider_call", provider: provider, model, prompt: body.prompt }, { deadline, ...(typeof body.title === "string" && body.title.trim() ? { title: body.title.trim() } : {}) });
362
+ }
363
+ catch (err) {
364
+ if (err instanceof InvalidDeadlineError || err instanceof CarbonBudgetExceededError)
365
+ return error(409, oneLine(err));
366
+ return error(500, "could not queue the task");
367
+ }
368
+ const fresh = ctx.store.get(rec.taskId) ?? rec;
369
+ return { status: 201, body: listSummary(fresh), changedIds: [rec.taskId] };
370
+ }
371
+ function startDispatcher(ctx) {
372
+ if (!ctx.dispatcher)
373
+ return error(404, "not found");
374
+ try {
375
+ const res = ctx.dispatcher.start();
376
+ if (!res.ok && res.reason === "ui_child") {
377
+ return { status: 409, body: { error: "a dispatcher started from this page is running", ...res.meta } };
378
+ }
379
+ if (!res.ok) {
380
+ return {
381
+ status: 409,
382
+ body: { error: "a dispatcher is already ticking this ledger", last_tick_at: res.last_tick_at },
383
+ };
384
+ }
385
+ return { status: 201, body: res.meta };
386
+ }
387
+ catch {
388
+ // The spawn error can name paths; the page needs only the fact.
389
+ return error(500, "could not start the dispatcher");
390
+ }
391
+ }
392
+ function setRead(ctx, taskId, read) {
393
+ const r = ctx.store.get(taskId);
394
+ if (!r)
395
+ return error(404, "task not found");
396
+ if (r.status !== "completed" && r.status !== "failed") {
397
+ return error(409, "only a completed or failed task has a read marker");
398
+ }
399
+ if (read)
400
+ ctx.store.markRead(taskId, ctx.now?.() ?? new Date());
401
+ else
402
+ ctx.store.markUnread(taskId);
403
+ return { status: 204, changedIds: [taskId] };
404
+ }
405
+ /**
406
+ * One forecast per region and hour count, reused for FORECAST_CACHE_MS by
407
+ * `/api/forecast` and `/api/summary` alike. Throws when the feed fails.
408
+ */
409
+ async function cachedForecast(ctx, region, hours) {
410
+ const now = (ctx.now?.() ?? new Date()).getTime();
411
+ let cache = forecastCache.get(ctx);
412
+ if (!cache)
413
+ forecastCache.set(ctx, (cache = new Map()));
414
+ const key = `${region}|${hours}`;
415
+ const hit = cache.get(key);
416
+ if (hit && now - hit.at < FORECAST_CACHE_MS)
417
+ return hit.body;
418
+ const f = await ctx.feed.fetchForecast(region, hours);
419
+ for (const [k, v] of cache)
420
+ if (now - v.at >= FORECAST_CACHE_MS)
421
+ cache.delete(k);
422
+ const body = {
423
+ region: f.region,
424
+ source: f.source,
425
+ generated_at: f.generatedAt,
426
+ points: f.entries.slice(0, hours).map((e) => ({
427
+ t: e.datetime,
428
+ g: e.carbonIntensityGCo2PerKwh,
429
+ band: e.band,
430
+ })),
431
+ };
432
+ cache.set(key, { at: now, body });
433
+ return body;
434
+ }
435
+ async function forecast(ctx, params) {
436
+ const region = params.get("region") || ctx.defaultRegion;
437
+ if (!REGION_RE.test(region))
438
+ return error(400, "invalid region");
439
+ const rawHours = Number(params.get("hours") ?? 24);
440
+ const hours = Math.min(MAX_FORECAST_HOURS, Math.max(1, Number.isFinite(rawHours) ? Math.ceil(rawHours) : 24));
441
+ try {
442
+ return { status: 200, body: await cachedForecast(ctx, region, hours) };
443
+ }
444
+ catch {
445
+ // The provider error can name a URL or key; the page needs only the fact.
446
+ return error(502, "forecast unavailable");
447
+ }
448
+ }
449
+ /** `GET /api/summary[?since=<iso>]` (native clients KTD5). */
450
+ async function summary(ctx, params) {
451
+ let since;
452
+ const rawSince = params.get("since");
453
+ if (rawSince !== null) {
454
+ const d = instant(rawSince, "since");
455
+ if (typeof d === "string")
456
+ return error(400, d);
457
+ since = d;
458
+ }
459
+ let points;
460
+ try {
461
+ points = (await cachedForecast(ctx, ctx.defaultRegion, 24)).points;
462
+ }
463
+ catch {
464
+ // A feed failure is a field in the answer, never a 5xx.
465
+ points = null;
466
+ }
467
+ const now = ctx.now?.() ?? new Date();
468
+ return {
469
+ status: 200,
470
+ body: buildSummary({ store: ctx.store, region: ctx.defaultRegion, now, points, ...(since ? { since } : {}) }),
471
+ };
472
+ }
473
+ function status(ctx) {
474
+ const now = ctx.now?.() ?? new Date();
475
+ const quota = ctx.quota();
476
+ return {
477
+ status: 200,
478
+ body: {
479
+ daemon: ctx.daemonStatus(),
480
+ db_path: ctx.dbPath,
481
+ default_region: ctx.defaultRegion,
482
+ last_tick_at: ctx.store.getMeta(LAST_TICK_META_KEY) ?? null,
483
+ dispatcher: ctx.dispatcher?.state() ?? null,
484
+ quota: Object.entries(quota).map(([label, s]) => ({
485
+ label,
486
+ next_reset: nextQuotaReset(s, now).toISOString(),
487
+ margin_h: s.marginH,
488
+ })),
489
+ },
490
+ };
491
+ }
492
+ // ── Connected apps (native clients, page token only) ─────────────────────
493
+ function clientsList(ctx) {
494
+ if (!ctx.clients)
495
+ return error(404, "not found");
496
+ try {
497
+ return { status: 200, body: { clients: ctx.clients.list() } };
498
+ }
499
+ catch {
500
+ // Fixed body: a registry error names the file path. The CLI shows it.
501
+ return error(500, "client registry unavailable");
502
+ }
503
+ }
504
+ function clientsAdd(ctx, body) {
505
+ if (!ctx.clients)
506
+ return error(404, "not found");
507
+ const bad = onlyKeys(body, ["name", "kind"]);
508
+ if (bad)
509
+ return error(400, bad);
510
+ // Input errors are 400 with their rule; a registry failure is a fixed 500.
511
+ const name = cleanClientName(body.name);
512
+ if (name instanceof ClientRegistryError)
513
+ return error(400, name.message);
514
+ const kind = body.kind ?? "extension";
515
+ if (!isClientKind(kind))
516
+ return error(400, `kind must be one of ${CLIENT_KINDS.join(", ")}`);
517
+ try {
518
+ const { client, token } = ctx.clients.add({ name, kind }, ctx.now?.());
519
+ return { status: 201, body: { client, token } };
520
+ }
521
+ catch {
522
+ return error(500, "could not add the client");
523
+ }
524
+ }
525
+ function clientsRevoke(ctx, id) {
526
+ if (!ctx.clients)
527
+ return error(404, "not found");
528
+ try {
529
+ return ctx.clients.revoke(id) ? { status: 200, body: { revoked: id } } : error(404, "client not found");
530
+ }
531
+ catch {
532
+ return error(500, "could not revoke the client");
533
+ }
534
+ }
535
+ /**
536
+ * Route one authenticated `/api/*` request (SSE is handled by the server).
537
+ * Returns 404 for an unknown path and 405 for a wrong method.
538
+ */
539
+ export async function handleApi(ctx, method, pathname, params,
540
+ /** Parsed JSON object of a body route (the server checked type and size). */
541
+ body = {}) {
542
+ const parts = pathname.split("/").filter(Boolean); // ["api", ...]
543
+ const route = parts.slice(1);
544
+ const get = method === "GET";
545
+ if (route.length === 1 && route[0] === "tasks") {
546
+ return get ? listTasks(ctx, params) : method === "POST" ? quickAdd(ctx, body) : error(405, "method not allowed");
547
+ }
548
+ if (route.length === 1 && route[0] === "forecast")
549
+ return get ? forecast(ctx, params) : error(405, "method not allowed");
550
+ if (route.length === 1 && route[0] === "status")
551
+ return get ? status(ctx) : error(405, "method not allowed");
552
+ if (route.length === 1 && route[0] === "summary")
553
+ return get ? summary(ctx, params) : error(405, "method not allowed");
554
+ if (route.length === 2 && route[0] === "dispatcher" && route[1] === "start") {
555
+ return method === "POST" ? startDispatcher(ctx) : error(405, "method not allowed");
556
+ }
557
+ if (route.length === 1 && route[0] === "clients") {
558
+ return get ? clientsList(ctx) : method === "POST" ? clientsAdd(ctx, body) : error(405, "method not allowed");
559
+ }
560
+ if (route.length === 3 && route[0] === "clients" && route[2] === "revoke") {
561
+ if (method !== "POST")
562
+ return error(405, "method not allowed");
563
+ let id;
564
+ try {
565
+ id = decodeURIComponent(route[1]);
566
+ }
567
+ catch {
568
+ return error(400, "bad client id");
569
+ }
570
+ return clientsRevoke(ctx, id);
571
+ }
572
+ if (route.length === 2 && route[0] === "series") {
573
+ if (!get)
574
+ return error(405, "method not allowed");
575
+ let seriesId;
576
+ try {
577
+ seriesId = decodeURIComponent(route[1]);
578
+ }
579
+ catch {
580
+ return error(400, "bad series id");
581
+ }
582
+ return seriesDetail(ctx, seriesId);
583
+ }
584
+ if (route[0] === "tasks" && route.length >= 2) {
585
+ let taskId;
586
+ try {
587
+ taskId = decodeURIComponent(route[1]);
588
+ }
589
+ catch {
590
+ return error(400, "bad task id");
591
+ }
592
+ if (route.length === 2)
593
+ return get ? taskDetail(ctx, taskId) : error(405, "method not allowed");
594
+ if (route.length === 3 && (route[2] === "read" || route[2] === "unread")) {
595
+ return method === "POST" ? setRead(ctx, taskId, route[2] === "read") : error(405, "method not allowed");
596
+ }
597
+ if (route.length === 3) {
598
+ const post = method === "POST";
599
+ switch (route[2]) {
600
+ case "cancel":
601
+ return post ? cancelAction(ctx, taskId, body) : error(405, "method not allowed");
602
+ case "reschedule":
603
+ return post ? rescheduleAction(ctx, taskId, body) : error(405, "method not allowed");
604
+ case "reply":
605
+ return post ? replyAction(ctx, taskId, body) : error(405, "method not allowed");
606
+ case "run-now":
607
+ return post ? act(ctx, taskId, (s) => s.runNow(taskId)) : error(405, "method not allowed");
608
+ }
609
+ }
610
+ }
611
+ return error(404, "not found");
612
+ }
613
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"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"}