@fdcn/sourcefed 0.3.6 → 0.3.8

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 (52) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-X3BZSHKZ.js → chunk-5JL3UV72.js} +1328 -399
  3. package/dist/cli.js +9888 -8063
  4. package/dist/daemon.js +1194 -263
  5. package/dist/data/core/SKILL.md +9 -4
  6. package/dist/data/core/references/commands.md +6 -1
  7. package/dist/data/sourcefed/SKILL.md +3 -2
  8. package/dist/guidance.md +6 -2
  9. package/dist/mcp.js +6 -2
  10. package/dist/opencode.js +263 -122
  11. package/dist/pi.js +161 -39
  12. package/dist/tui-compiled.mjs +306 -166
  13. package/dist.dts/adapters/opencode/bridge.d.ts +66 -22
  14. package/dist.dts/adapters/opencode/subscriptions.d.ts +46 -0
  15. package/dist.dts/adapters/opencode/tool-result.d.ts +2 -1
  16. package/dist.dts/adapters/opencode/tools/monitor_create.d.ts +19 -2
  17. package/dist.dts/adapters/opencode/tools/monitor_list.d.ts +3 -2
  18. package/dist.dts/adapters/opencode/tools/monitor_start.d.ts +3 -2
  19. package/dist.dts/adapters/opencode/tools/monitor_status.d.ts +3 -2
  20. package/dist.dts/adapters/opencode/tools/monitor_stop.d.ts +3 -2
  21. package/dist.dts/adapters/pi/src/dialog.d.ts +1 -2
  22. package/dist.dts/adapters/pi/src/monitors-dialog.d.ts +32 -0
  23. package/dist.dts/packages/core/src/types/monitor-create-input.d.ts +4 -0
  24. package/dist.dts/packages/daemon/src/event-stream.d.ts +26 -0
  25. package/dist.dts/packages/daemon/src/registry.d.ts +2 -0
  26. package/dist.dts/packages/daemon/src/stream-lifecycle.test.d.ts +1 -0
  27. package/dist.dts/packages/daemon/src/types/client.d.ts +3 -1
  28. package/dist.dts/packages/daemon/src/types/daemon.d.ts +4 -0
  29. package/dist.dts/packages/daemon/src/utils/index.d.ts +0 -1
  30. package/dist.dts/providers/yab/src/index.d.ts +2 -0
  31. package/dist.dts/providers/yab/src/monitor.d.ts +14 -0
  32. package/dist.dts/providers/yab/src/poll/index.d.ts +2 -0
  33. package/dist.dts/providers/yab/src/poll/monitor.d.ts +3 -0
  34. package/dist.dts/providers/yab/src/poll/utils/feed-events.d.ts +5 -0
  35. package/dist.dts/providers/yab/src/poll/utils/index.d.ts +4 -0
  36. package/dist.dts/providers/yab/src/poll/utils/parse-feed.d.ts +3 -0
  37. package/dist.dts/providers/yab/src/poll/utils/poll-yab.d.ts +7 -0
  38. package/dist.dts/providers/yab/src/poll/utils/yab-mcp.d.ts +10 -0
  39. package/dist.dts/providers/yab/src/schema.d.ts +12 -0
  40. package/dist.dts/providers/yab/src/types/cursor.d.ts +4 -0
  41. package/dist.dts/providers/yab/src/types/event.d.ts +8 -0
  42. package/dist.dts/providers/yab/src/types/feed-entry.d.ts +8 -0
  43. package/dist.dts/providers/yab/src/types/index.d.ts +5 -0
  44. package/dist.dts/providers/yab/src/types/page.d.ts +6 -0
  45. package/dist.dts/providers/yab/src/types/source-record.d.ts +7 -0
  46. package/dist.dts/providers/yab/src/yab.test.d.ts +1 -0
  47. package/package.json +1 -1
  48. package/dist.dts/packages/daemon/src/utils/forward.d.ts +0 -32
  49. package/dist.dts/packages/daemon/src/utils/gate.d.ts +0 -33
  50. package/dist.dts/packages/daemon/src/utils/request-router.d.ts +0 -11
  51. /package/dist.dts/{packages/daemon/src/forward.test.d.ts → adapters/opencode/lifecycle.test.d.ts} +0 -0
  52. /package/dist.dts/{packages/daemon/src/gate.test.d.ts → adapters/pi/src/monitors-dialog.test.d.ts} +0 -0
@@ -7,7 +7,7 @@ import { insertNode as _$insertNode2 } from "opentui:runtime-module:%40opentui%2
7
7
  import { setProp as _$setProp2 } from "opentui:runtime-module:%40opentui%2Fsolid";
8
8
  import { createElement as _$createElement2 } from "opentui:runtime-module:%40opentui%2Fsolid";
9
9
  import { createComponent as _$createComponent2 } from "opentui:runtime-module:%40opentui%2Fsolid";
10
- import { createMemo as createMemo2, Show as Show2 } from "opentui:runtime-module:solid-js";
10
+ import { createMemo as createMemo2, createSignal as createSignal2, Show as Show2 } from "opentui:runtime-module:solid-js";
11
11
  import { connectDaemonClient as connectDaemonClient2, defaultDaemonUrl as defaultDaemonUrl2 } from "@fdcn/sourcefed/daemon";
12
12
 
13
13
  // .tui-build/tui/sidebar.mjs
@@ -158,6 +158,64 @@ var sourcefedTui = (ctx) => {
158
158
  const route = ctx.ui.router.current();
159
159
  return route.type === "session" ? route.sessionID : void 0;
160
160
  };
161
+ const monitorTarget = (id2) => ({
162
+ target: {
163
+ kind: "opencode-session",
164
+ id: id2
165
+ }
166
+ });
167
+ const listMonitors = async (sessionID) => {
168
+ const result = await (await getClient()).request("monitor.list", monitorTarget(sessionID));
169
+ return result?.monitors ?? [];
170
+ };
171
+ const runAction = async (sessionID, action, id2) => {
172
+ const result = await (await getClient()).request(`monitor.${action}`, {
173
+ ...monitorTarget(sessionID),
174
+ id: id2
175
+ });
176
+ if (result?.ok === false) throw new Error(result.error ?? `monitor ${action} failed`);
177
+ };
178
+ const showMonitors = async (sessionID, focusIndex = 0) => {
179
+ const monitors = await listMonitors(sessionID);
180
+ ctx.ui.dialog.set({
181
+ size: "large"
182
+ });
183
+ ctx.ui.dialog.show(() => _$createComponent2(MonitorDialog, {
184
+ ctx,
185
+ monitors,
186
+ focusIndex,
187
+ toggle: async (monitor) => {
188
+ await runAction(sessionID, monitor.enabled ? "stop" : "start", monitor.id);
189
+ return listMonitors(sessionID);
190
+ },
191
+ remove: (monitor, index) => void confirmRemove(sessionID, monitor, index)
192
+ }));
193
+ };
194
+ const confirmRemove = async (sessionID, monitor, index) => {
195
+ try {
196
+ const confirmed = await ctx.ui.dialog.confirm({
197
+ title: "Delete monitor",
198
+ message: `Delete ${monitor.describe}? It stops watching and its record is removed.`,
199
+ label: {
200
+ confirm: "Delete",
201
+ cancel: "Cancel"
202
+ }
203
+ });
204
+ if (confirmed) {
205
+ await runAction(sessionID, "remove", monitor.id);
206
+ ctx.ui.toast.show({
207
+ variant: "success",
208
+ message: `Deleted ${monitor.name}`
209
+ });
210
+ }
211
+ await showMonitors(sessionID, index);
212
+ } catch (error) {
213
+ ctx.ui.toast.show({
214
+ variant: "error",
215
+ message: `Sourcefed: ${errorMessage(error)}`
216
+ });
217
+ }
218
+ };
161
219
  const disposeSlot = ctx.ui.slot({
162
220
  append: "sidebar.content",
163
221
  render: ({
@@ -172,7 +230,8 @@ var sourcefedTui = (ctx) => {
172
230
  render: () => _$createComponent2(KeymapRegistration, {
173
231
  ctx,
174
232
  currentSessionID,
175
- getClient
233
+ getClient,
234
+ showMonitors
176
235
  })
177
236
  });
178
237
  return () => {
@@ -185,14 +244,15 @@ function KeymapRegistration(props) {
185
244
  const {
186
245
  ctx,
187
246
  currentSessionID,
188
- getClient
247
+ getClient,
248
+ showMonitors
189
249
  } = props;
190
250
  ctx.keymap.layer(() => ({
191
251
  mode: "global",
192
252
  commands: [{
193
253
  id: "sourcefed",
194
254
  title: "Sourcefed monitors",
195
- description: "Show monitors for the current OpenCode session",
255
+ description: "Show, stop, start, or delete monitors for the current OpenCode session",
196
256
  slash: {
197
257
  name: "sourcefed"
198
258
  },
@@ -206,25 +266,11 @@ function KeymapRegistration(props) {
206
266
  return;
207
267
  }
208
268
  try {
209
- const daemon = await getClient();
210
- const result = await daemon.request("monitor.list", {
211
- target: {
212
- kind: "opencode-session",
213
- id: id2
214
- }
215
- });
216
- const monitors = result?.monitors ?? [];
217
- ctx.ui.dialog.set({
218
- size: "large"
219
- });
220
- ctx.ui.dialog.show(() => _$createComponent2(MonitorDialog, {
221
- ctx,
222
- monitors
223
- }));
269
+ await showMonitors(id2);
224
270
  } catch (error) {
225
271
  ctx.ui.toast.show({
226
272
  variant: "error",
227
- message: `Sourcefed daemon unavailable: ${error instanceof Error ? error.message : String(error)}`
273
+ message: `Sourcefed daemon unavailable: ${errorMessage(error)}`
228
274
  });
229
275
  }
230
276
  }
@@ -263,7 +309,7 @@ function KeymapRegistration(props) {
263
309
  } catch (error) {
264
310
  ctx.ui.toast.show({
265
311
  variant: "error",
266
- message: `Sourcefed daemon unavailable: ${error instanceof Error ? error.message : String(error)}`
312
+ message: `Sourcefed daemon unavailable: ${errorMessage(error)}`
267
313
  });
268
314
  }
269
315
  }
@@ -271,13 +317,62 @@ function KeymapRegistration(props) {
271
317
  }));
272
318
  return null;
273
319
  }
320
+ var DIALOG_LAYER_PRIORITY = 100;
274
321
  function MonitorDialog(props) {
275
322
  const palette = createMemo2(() => tone(props.ctx.theme));
276
- const active = props.monitors.filter((monitor) => monitor.enabled);
323
+ const [monitors, setMonitors] = createSignal2(props.monitors);
324
+ const [selected, setSelected] = createSignal2(clampIndex(props.focusIndex, props.monitors.length));
325
+ const [busy, setBusy] = createSignal2();
326
+ const [error, setError] = createSignal2();
327
+ const active = createMemo2(() => monitors().filter((monitor) => monitor.enabled).length);
277
328
  const maxListRows = Math.max(6, Math.floor(props.ctx.renderer.height * 0.45));
329
+ const move = (delta) => setSelected((index) => clampIndex(index + delta, monitors().length));
330
+ const current = () => busy() ? void 0 : monitors()[selected()];
331
+ const toggle = async (monitor) => {
332
+ setError(void 0);
333
+ setBusy(`${monitor.enabled ? "Stopping" : "Starting"} ${monitor.name}\u2026`);
334
+ try {
335
+ const next = await props.toggle(monitor);
336
+ setMonitors(next);
337
+ const kept = next.findIndex((candidate) => candidate.id === monitor.id);
338
+ setSelected(clampIndex(kept >= 0 ? kept : selected(), next.length));
339
+ } catch (failure) {
340
+ setError(errorMessage(failure));
341
+ } finally {
342
+ setBusy(void 0);
343
+ }
344
+ };
345
+ props.ctx.keymap.layer(() => ({
346
+ mode: "global",
347
+ priority: DIALOG_LAYER_PRIORITY,
348
+ commands: [{
349
+ title: "Previous monitor",
350
+ bind: "up",
351
+ run: () => move(-1)
352
+ }, {
353
+ title: "Next monitor",
354
+ bind: "down",
355
+ run: () => move(1)
356
+ }, {
357
+ title: "Stop or start monitor",
358
+ bind: "s",
359
+ run: () => {
360
+ const monitor = current();
361
+ if (monitor) void toggle(monitor);
362
+ }
363
+ }, {
364
+ title: "Delete monitor",
365
+ bind: "d",
366
+ run: () => {
367
+ const monitor = current();
368
+ if (monitor) props.remove(monitor, selected());
369
+ }
370
+ }]
371
+ }));
278
372
  return (() => {
279
- var _el$ = _$createElement2("box"), _el$2 = _$createElement2("box"), _el$3 = _$createElement2("text"), _el$4 = _$createTextNode2(`Sourcefed monitors (`), _el$5 = _$createTextNode2(`)`), _el$6 = _$createElement2("box"), _el$7 = _$createElement2("text");
373
+ var _el$ = _$createElement2("box"), _el$2 = _$createElement2("box"), _el$3 = _$createElement2("text"), _el$4 = _$createTextNode2(`Sourcefed monitors (`), _el$5 = _$createTextNode2(` active)`), _el$6 = _$createElement2("box"), _el$7 = _$createElement2("text"), _el$10 = _$createElement2("text");
280
374
  _$insertNode2(_el$, _el$2);
375
+ _$insertNode2(_el$, _el$10);
281
376
  _$setProp2(_el$, "flexDirection", "column");
282
377
  _$setProp2(_el$, "width", "100%");
283
378
  _$setProp2(_el$, "paddingX", 2);
@@ -291,45 +386,62 @@ function MonitorDialog(props) {
291
386
  _$insertNode2(_el$3, _el$4);
292
387
  _$insertNode2(_el$3, _el$5);
293
388
  _$setProp2(_el$3, "attributes", 1);
294
- _$insert2(_el$3, () => active.length, _el$5);
389
+ _$insert2(_el$3, active, _el$5);
295
390
  _$setProp2(_el$6, "flexGrow", 1);
296
391
  _$insertNode2(_el$7, _$createTextNode2(`esc`));
297
392
  _$insert2(_el$, _$createComponent2(Show2, {
298
393
  get when() {
299
- return active.length === 0;
394
+ return monitors().length > 0;
300
395
  },
301
396
  get fallback() {
302
397
  return (() => {
303
- var _el$1 = _$createElement2("scrollbox"), _el$10 = _$createElement2("box");
304
- _$insertNode2(_el$1, _el$10);
305
- _$setProp2(_el$1, "maxHeight", maxListRows);
306
- _$setProp2(_el$1, "scrollY", true);
307
- _$setProp2(_el$10, "flexDirection", "column");
308
- _$setProp2(_el$10, "width", "100%");
309
- _$insert2(_el$10, () => active.map((monitor) => _$createComponent2(MonitorCard, {
310
- monitor,
311
- get tone() {
312
- return palette();
313
- }
314
- })));
315
- return _el$1;
398
+ var _el$11 = _$createElement2("text");
399
+ _$insertNode2(_el$11, _$createTextNode2(`No monitors`));
400
+ _$effect2((_$p) => _$setProp2(_el$11, "fg", palette().textMuted, _$p));
401
+ return _el$11;
316
402
  })();
317
403
  },
318
404
  get children() {
319
- var _el$9 = _$createElement2("text");
320
- _$insertNode2(_el$9, _$createTextNode2(`No active monitors`));
321
- _$effect2((_$p) => _$setProp2(_el$9, "fg", palette().textMuted, _$p));
405
+ var _el$9 = _$createElement2("scrollbox"), _el$0 = _$createElement2("box");
406
+ _$insertNode2(_el$9, _el$0);
407
+ _$setProp2(_el$9, "maxHeight", maxListRows);
408
+ _$setProp2(_el$9, "scrollY", true);
409
+ _$setProp2(_el$0, "flexDirection", "column");
410
+ _$setProp2(_el$0, "width", "100%");
411
+ _$insert2(_el$0, () => monitors().map((monitor, index) => _$createComponent2(MonitorCard, {
412
+ monitor,
413
+ get tone() {
414
+ return palette();
415
+ },
416
+ get selected() {
417
+ return index === selected();
418
+ }
419
+ })));
322
420
  return _el$9;
323
421
  }
324
- }), null);
422
+ }), _el$10);
423
+ _$insert2(_el$, _$createComponent2(Show2, {
424
+ get when() {
425
+ return error();
426
+ },
427
+ get children() {
428
+ var _el$1 = _$createElement2("text");
429
+ _$insert2(_el$1, error);
430
+ _$effect2((_$p) => _$setProp2(_el$1, "fg", palette().error, _$p));
431
+ return _el$1;
432
+ }
433
+ }), _el$10);
434
+ _$insert2(_el$10, () => busy() ?? "\u2191\u2193 select \xB7 s stop/start \xB7 d delete \xB7 esc close");
325
435
  _$effect2((_p$) => {
326
- var _v$ = palette().text, _v$2 = palette().textMuted;
436
+ var _v$ = palette().text, _v$2 = palette().textMuted, _v$3 = palette().textMuted;
327
437
  _v$ !== _p$.e && (_p$.e = _$setProp2(_el$3, "fg", _v$, _p$.e));
328
438
  _v$2 !== _p$.t && (_p$.t = _$setProp2(_el$7, "fg", _v$2, _p$.t));
439
+ _v$3 !== _p$.a && (_p$.a = _$setProp2(_el$10, "fg", _v$3, _p$.a));
329
440
  return _p$;
330
441
  }, {
331
442
  e: void 0,
332
- t: void 0
443
+ t: void 0,
444
+ a: void 0
333
445
  });
334
446
  return _el$;
335
447
  })();
@@ -337,66 +449,94 @@ function MonitorDialog(props) {
337
449
  function MonitorCard(props) {
338
450
  const monitor = props.monitor;
339
451
  const palette = props.tone;
340
- const status = monitor.unresponsive ? palette.error : monitor.enabled ? palette.success : palette.textMuted;
452
+ const status = !monitor.enabled ? palette.textMuted : monitor.unresponsive ? palette.error : palette.success;
341
453
  const statusLabel = !monitor.enabled ? "stopped" : monitor.unresponsive ? "recovering connection" : "healthy";
342
454
  const rows = [["Delivery", monitor.delivery], ["Poll interval", `${monitor.pollIntervalSec}s`], ["Created", formatTime(monitor.createdAt)], ["Updated", formatTime(monitor.updatedAt)], ["Last poll", formatTime(monitor.lastPolledAt)], ["Webhook heartbeat", formatTime(monitor.webhookHeartbeatAt)]];
343
455
  return (() => {
344
- var _el$11 = _$createElement2("box"), _el$12 = _$createElement2("box"), _el$13 = _$createElement2("text"), _el$15 = _$createElement2("text"), _el$16 = _$createTextNode2(` `), _el$17 = _$createTextNode2(` `), _el$18 = _$createElement2("text"), _el$19 = _$createTextNode2(` [`), _el$20 = _$createTextNode2(`]`);
345
- _$insertNode2(_el$11, _el$12);
346
- _$setProp2(_el$11, "flexDirection", "column");
347
- _$setProp2(_el$11, "width", "100%");
348
- _$setProp2(_el$11, "minWidth", 0);
349
- _$setProp2(_el$11, "marginBottom", 1);
350
- _$insertNode2(_el$12, _el$13);
351
- _$insertNode2(_el$12, _el$15);
352
- _$insertNode2(_el$12, _el$18);
353
- _$setProp2(_el$12, "flexDirection", "row");
354
- _$setProp2(_el$12, "width", "100%");
355
- _$setProp2(_el$12, "minWidth", 0);
356
- _$insertNode2(_el$13, _$createTextNode2(`\u25CF`));
357
- _$setProp2(_el$13, "fg", status);
456
+ var _el$13 = _$createElement2("box"), _el$14 = _$createElement2("box"), _el$15 = _$createElement2("box"), _el$16 = _$createElement2("text"), _el$17 = _$createElement2("text"), _el$19 = _$createElement2("text"), _el$20 = _$createTextNode2(` `), _el$21 = _$createTextNode2(` `), _el$22 = _$createElement2("text"), _el$23 = _$createTextNode2(` [`), _el$24 = _$createTextNode2(`]`);
457
+ _$insertNode2(_el$13, _el$14);
458
+ _$setProp2(_el$13, "flexDirection", "column");
459
+ _$setProp2(_el$13, "width", "100%");
460
+ _$setProp2(_el$13, "minWidth", 0);
461
+ _$insertNode2(_el$14, _el$15);
462
+ _$insertNode2(_el$14, _el$17);
463
+ _$insertNode2(_el$14, _el$19);
464
+ _$insertNode2(_el$14, _el$22);
465
+ _$setProp2(_el$14, "flexDirection", "row");
466
+ _$setProp2(_el$14, "width", "100%");
467
+ _$setProp2(_el$14, "minWidth", 0);
358
468
  _$insertNode2(_el$15, _el$16);
359
- _$insertNode2(_el$15, _el$17);
360
- _$insert2(_el$15, () => monitor.icon, _el$17);
361
- _$insert2(_el$15, () => monitor.describe, null);
362
- _$insertNode2(_el$18, _el$19);
363
- _$insertNode2(_el$18, _el$20);
364
- _$setProp2(_el$18, "fg", status);
365
- _$setProp2(_el$18, "flexGrow", 1);
366
- _$setProp2(_el$18, "flexShrink", 1);
367
- _$setProp2(_el$18, "minWidth", 0);
368
- _$setProp2(_el$18, "truncate", true);
369
- _$insert2(_el$18, statusLabel, _el$20);
370
- _$insert2(_el$11, () => rows.map(([label, value]) => (() => {
371
- var _el$21 = _$createElement2("box"), _el$22 = _$createElement2("text"), _el$23 = _$createTextNode2(`: `), _el$24 = _$createElement2("text");
372
- _$insertNode2(_el$21, _el$22);
373
- _$insertNode2(_el$21, _el$24);
374
- _$setProp2(_el$21, "flexDirection", "row");
375
- _$setProp2(_el$21, "width", "100%");
376
- _$setProp2(_el$21, "minWidth", 0);
377
- _$insertNode2(_el$22, _el$23);
378
- _$setProp2(_el$22, "flexShrink", 0);
379
- _$insert2(_el$22, label, _el$23);
380
- _$setProp2(_el$24, "flexGrow", 1);
381
- _$setProp2(_el$24, "flexShrink", 1);
382
- _$setProp2(_el$24, "minWidth", 0);
383
- _$setProp2(_el$24, "truncate", true);
384
- _$insert2(_el$24, value);
385
- _$effect2((_p$) => {
386
- var _v$3 = palette.textMuted, _v$4 = palette.text;
387
- _v$3 !== _p$.e && (_p$.e = _$setProp2(_el$22, "fg", _v$3, _p$.e));
388
- _v$4 !== _p$.t && (_p$.t = _$setProp2(_el$24, "fg", _v$4, _p$.t));
389
- return _p$;
390
- }, {
391
- e: void 0,
392
- t: void 0
393
- });
394
- return _el$21;
395
- })()), null);
396
- _$effect2((_$p) => _$setProp2(_el$15, "fg", palette.text, _$p));
397
- return _el$11;
469
+ _$setProp2(_el$15, "width", 2);
470
+ _$setProp2(_el$15, "flexShrink", 0);
471
+ _$insert2(_el$16, () => props.selected ? "\u203A" : "");
472
+ _$insertNode2(_el$17, _$createTextNode2(`\u25CF`));
473
+ _$setProp2(_el$17, "fg", status);
474
+ _$insertNode2(_el$19, _el$20);
475
+ _$insertNode2(_el$19, _el$21);
476
+ _$insert2(_el$19, () => monitor.icon, _el$21);
477
+ _$insert2(_el$19, () => monitor.describe, null);
478
+ _$insertNode2(_el$22, _el$23);
479
+ _$insertNode2(_el$22, _el$24);
480
+ _$setProp2(_el$22, "fg", status);
481
+ _$setProp2(_el$22, "flexGrow", 1);
482
+ _$setProp2(_el$22, "flexShrink", 1);
483
+ _$setProp2(_el$22, "minWidth", 0);
484
+ _$setProp2(_el$22, "truncate", true);
485
+ _$insert2(_el$22, statusLabel, _el$24);
486
+ _$insert2(_el$13, _$createComponent2(Show2, {
487
+ get when() {
488
+ return props.selected;
489
+ },
490
+ get children() {
491
+ return rows.map(([label, value]) => (() => {
492
+ var _el$25 = _$createElement2("box"), _el$26 = _$createElement2("text"), _el$27 = _$createTextNode2(`: `), _el$28 = _$createElement2("text");
493
+ _$insertNode2(_el$25, _el$26);
494
+ _$insertNode2(_el$25, _el$28);
495
+ _$setProp2(_el$25, "flexDirection", "row");
496
+ _$setProp2(_el$25, "width", "100%");
497
+ _$setProp2(_el$25, "minWidth", 0);
498
+ _$setProp2(_el$25, "paddingLeft", 4);
499
+ _$insertNode2(_el$26, _el$27);
500
+ _$setProp2(_el$26, "flexShrink", 0);
501
+ _$insert2(_el$26, label, _el$27);
502
+ _$setProp2(_el$28, "flexGrow", 1);
503
+ _$setProp2(_el$28, "flexShrink", 1);
504
+ _$setProp2(_el$28, "minWidth", 0);
505
+ _$setProp2(_el$28, "truncate", true);
506
+ _$insert2(_el$28, value);
507
+ _$effect2((_p$) => {
508
+ var _v$7 = palette.textMuted, _v$8 = palette.text;
509
+ _v$7 !== _p$.e && (_p$.e = _$setProp2(_el$26, "fg", _v$7, _p$.e));
510
+ _v$8 !== _p$.t && (_p$.t = _$setProp2(_el$28, "fg", _v$8, _p$.t));
511
+ return _p$;
512
+ }, {
513
+ e: void 0,
514
+ t: void 0
515
+ });
516
+ return _el$25;
517
+ })());
518
+ }
519
+ }), null);
520
+ _$effect2((_p$) => {
521
+ var _v$4 = props.selected ? 1 : 0, _v$5 = palette.accent, _v$6 = palette.text;
522
+ _v$4 !== _p$.e && (_p$.e = _$setProp2(_el$13, "marginBottom", _v$4, _p$.e));
523
+ _v$5 !== _p$.t && (_p$.t = _$setProp2(_el$16, "fg", _v$5, _p$.t));
524
+ _v$6 !== _p$.a && (_p$.a = _$setProp2(_el$19, "fg", _v$6, _p$.a));
525
+ return _p$;
526
+ }, {
527
+ e: void 0,
528
+ t: void 0,
529
+ a: void 0
530
+ });
531
+ return _el$13;
398
532
  })();
399
533
  }
534
+ function clampIndex(index, length) {
535
+ return Math.min(Math.max(index, 0), Math.max(length - 1, 0));
536
+ }
537
+ function errorMessage(error) {
538
+ return error instanceof Error ? error.message : String(error);
539
+ }
400
540
  function formatTime(value) {
401
541
  if (!value) return "never";
402
542
  const date = new Date(value);
@@ -407,107 +547,107 @@ function LogsDialog(props) {
407
547
  const palette = createMemo2(() => tone(props.ctx.theme));
408
548
  const maxListRows = Math.max(6, Math.floor(props.ctx.renderer.height * 0.45));
409
549
  return (() => {
410
- var _el$25 = _$createElement2("box"), _el$26 = _$createElement2("box"), _el$27 = _$createElement2("text"), _el$28 = _$createTextNode2(`Sourcefed notifications (`), _el$29 = _$createTextNode2(`)`), _el$30 = _$createElement2("box"), _el$31 = _$createElement2("text");
411
- _$insertNode2(_el$25, _el$26);
412
- _$setProp2(_el$25, "flexDirection", "column");
413
- _$setProp2(_el$25, "width", "100%");
414
- _$setProp2(_el$25, "paddingX", 2);
415
- _$setProp2(_el$25, "paddingY", 1);
416
- _$insertNode2(_el$26, _el$27);
417
- _$insertNode2(_el$26, _el$30);
418
- _$insertNode2(_el$26, _el$31);
419
- _$setProp2(_el$26, "flexDirection", "row");
420
- _$setProp2(_el$26, "width", "100%");
421
- _$setProp2(_el$26, "minWidth", 0);
422
- _$insertNode2(_el$27, _el$28);
423
- _$insertNode2(_el$27, _el$29);
424
- _$setProp2(_el$27, "attributes", 1);
425
- _$insert2(_el$27, () => props.logs.length, _el$29);
426
- _$setProp2(_el$30, "flexGrow", 1);
427
- _$insertNode2(_el$31, _$createTextNode2(`esc`));
428
- _$insert2(_el$25, _$createComponent2(Show2, {
550
+ var _el$29 = _$createElement2("box"), _el$30 = _$createElement2("box"), _el$31 = _$createElement2("text"), _el$32 = _$createTextNode2(`Sourcefed notifications (`), _el$33 = _$createTextNode2(`)`), _el$34 = _$createElement2("box"), _el$35 = _$createElement2("text");
551
+ _$insertNode2(_el$29, _el$30);
552
+ _$setProp2(_el$29, "flexDirection", "column");
553
+ _$setProp2(_el$29, "width", "100%");
554
+ _$setProp2(_el$29, "paddingX", 2);
555
+ _$setProp2(_el$29, "paddingY", 1);
556
+ _$insertNode2(_el$30, _el$31);
557
+ _$insertNode2(_el$30, _el$34);
558
+ _$insertNode2(_el$30, _el$35);
559
+ _$setProp2(_el$30, "flexDirection", "row");
560
+ _$setProp2(_el$30, "width", "100%");
561
+ _$setProp2(_el$30, "minWidth", 0);
562
+ _$insertNode2(_el$31, _el$32);
563
+ _$insertNode2(_el$31, _el$33);
564
+ _$setProp2(_el$31, "attributes", 1);
565
+ _$insert2(_el$31, () => props.logs.length, _el$33);
566
+ _$setProp2(_el$34, "flexGrow", 1);
567
+ _$insertNode2(_el$35, _$createTextNode2(`esc`));
568
+ _$insert2(_el$29, _$createComponent2(Show2, {
429
569
  get when() {
430
570
  return props.logs.length > 0;
431
571
  },
432
572
  get fallback() {
433
573
  return (() => {
434
- var _el$35 = _$createElement2("text");
435
- _$insertNode2(_el$35, _$createTextNode2(`No notifications sent yet`));
436
- _$effect2((_$p) => _$setProp2(_el$35, "fg", palette().textMuted, _$p));
437
- return _el$35;
574
+ var _el$39 = _$createElement2("text");
575
+ _$insertNode2(_el$39, _$createTextNode2(`No notifications sent yet`));
576
+ _$effect2((_$p) => _$setProp2(_el$39, "fg", palette().textMuted, _$p));
577
+ return _el$39;
438
578
  })();
439
579
  },
440
580
  get children() {
441
- var _el$33 = _$createElement2("scrollbox"), _el$34 = _$createElement2("box");
442
- _$insertNode2(_el$33, _el$34);
443
- _$setProp2(_el$33, "maxHeight", maxListRows);
444
- _$setProp2(_el$33, "scrollY", true);
445
- _$setProp2(_el$33, "stickyScroll", true);
446
- _$setProp2(_el$33, "stickyStart", "bottom");
447
- _$setProp2(_el$34, "flexDirection", "column");
448
- _$setProp2(_el$34, "width", "100%");
449
- _$insert2(_el$34, () => props.logs.map((entry) => (() => {
450
- var _el$37 = _$createElement2("box"), _el$38 = _$createElement2("box"), _el$39 = _$createElement2("text"), _el$40 = _$createElement2("text"), _el$41 = _$createTextNode2(` `), _el$42 = _$createElement2("text"), _el$43 = _$createTextNode2(` `), _el$44 = _$createTextNode2(` `);
451
- _$insertNode2(_el$37, _el$38);
452
- _$setProp2(_el$37, "flexDirection", "column");
453
- _$setProp2(_el$37, "width", "100%");
454
- _$insertNode2(_el$38, _el$39);
455
- _$insertNode2(_el$38, _el$40);
456
- _$insertNode2(_el$38, _el$42);
457
- _$setProp2(_el$38, "flexDirection", "row");
458
- _$setProp2(_el$38, "width", "100%");
459
- _$setProp2(_el$38, "minWidth", 0);
460
- _$insert2(_el$39, () => entry.actionable ? "\u25B6" : "\xB7");
461
- _$insertNode2(_el$40, _el$41);
462
- _$setProp2(_el$40, "flexShrink", 0);
463
- _$setProp2(_el$40, "minWidth", 0);
464
- _$insert2(_el$40, () => entry.icon, null);
581
+ var _el$37 = _$createElement2("scrollbox"), _el$38 = _$createElement2("box");
582
+ _$insertNode2(_el$37, _el$38);
583
+ _$setProp2(_el$37, "maxHeight", maxListRows);
584
+ _$setProp2(_el$37, "scrollY", true);
585
+ _$setProp2(_el$37, "stickyScroll", true);
586
+ _$setProp2(_el$37, "stickyStart", "bottom");
587
+ _$setProp2(_el$38, "flexDirection", "column");
588
+ _$setProp2(_el$38, "width", "100%");
589
+ _$insert2(_el$38, () => props.logs.map((entry) => (() => {
590
+ var _el$41 = _$createElement2("box"), _el$42 = _$createElement2("box"), _el$43 = _$createElement2("text"), _el$44 = _$createElement2("text"), _el$45 = _$createTextNode2(` `), _el$46 = _$createElement2("text"), _el$47 = _$createTextNode2(` `), _el$48 = _$createTextNode2(` `);
591
+ _$insertNode2(_el$41, _el$42);
592
+ _$setProp2(_el$41, "flexDirection", "column");
593
+ _$setProp2(_el$41, "width", "100%");
465
594
  _$insertNode2(_el$42, _el$43);
466
595
  _$insertNode2(_el$42, _el$44);
467
- _$setProp2(_el$42, "flexGrow", 1);
468
- _$setProp2(_el$42, "flexShrink", 1);
596
+ _$insertNode2(_el$42, _el$46);
597
+ _$setProp2(_el$42, "flexDirection", "row");
598
+ _$setProp2(_el$42, "width", "100%");
469
599
  _$setProp2(_el$42, "minWidth", 0);
470
- _$setProp2(_el$42, "truncate", true);
471
- _$insert2(_el$42, () => new Date(entry.at).toLocaleString(), _el$44);
472
- _$insert2(_el$42, () => entry.summary, null);
473
- _$insert2(_el$37, _$createComponent2(Show2, {
600
+ _$insert2(_el$43, () => entry.actionable ? "\u25B6" : "\xB7");
601
+ _$insertNode2(_el$44, _el$45);
602
+ _$setProp2(_el$44, "flexShrink", 0);
603
+ _$setProp2(_el$44, "minWidth", 0);
604
+ _$insert2(_el$44, () => entry.icon, null);
605
+ _$insertNode2(_el$46, _el$47);
606
+ _$insertNode2(_el$46, _el$48);
607
+ _$setProp2(_el$46, "flexGrow", 1);
608
+ _$setProp2(_el$46, "flexShrink", 1);
609
+ _$setProp2(_el$46, "minWidth", 0);
610
+ _$setProp2(_el$46, "truncate", true);
611
+ _$insert2(_el$46, () => new Date(entry.at).toLocaleString(), _el$48);
612
+ _$insert2(_el$46, () => entry.summary, null);
613
+ _$insert2(_el$41, _$createComponent2(Show2, {
474
614
  get when() {
475
615
  return entry.body;
476
616
  },
477
617
  get children() {
478
- var _el$45 = _$createElement2("text"), _el$46 = _$createTextNode2(` `);
479
- _$insertNode2(_el$45, _el$46);
480
- _$insert2(_el$45, () => entry.body, null);
481
- _$effect2((_$p) => _$setProp2(_el$45, "fg", palette().textMuted, _$p));
482
- return _el$45;
618
+ var _el$49 = _$createElement2("text"), _el$50 = _$createTextNode2(` `);
619
+ _$insertNode2(_el$49, _el$50);
620
+ _$insert2(_el$49, () => entry.body, null);
621
+ _$effect2((_$p) => _$setProp2(_el$49, "fg", palette().textMuted, _$p));
622
+ return _el$49;
483
623
  }
484
624
  }), null);
485
625
  _$effect2((_p$) => {
486
- var _v$7 = entry.actionable ? palette().warning : palette().textMuted, _v$8 = palette().text, _v$9 = palette().text;
487
- _v$7 !== _p$.e && (_p$.e = _$setProp2(_el$39, "fg", _v$7, _p$.e));
488
- _v$8 !== _p$.t && (_p$.t = _$setProp2(_el$40, "fg", _v$8, _p$.t));
489
- _v$9 !== _p$.a && (_p$.a = _$setProp2(_el$42, "fg", _v$9, _p$.a));
626
+ var _v$1 = entry.actionable ? palette().warning : palette().textMuted, _v$10 = palette().text, _v$11 = palette().text;
627
+ _v$1 !== _p$.e && (_p$.e = _$setProp2(_el$43, "fg", _v$1, _p$.e));
628
+ _v$10 !== _p$.t && (_p$.t = _$setProp2(_el$44, "fg", _v$10, _p$.t));
629
+ _v$11 !== _p$.a && (_p$.a = _$setProp2(_el$46, "fg", _v$11, _p$.a));
490
630
  return _p$;
491
631
  }, {
492
632
  e: void 0,
493
633
  t: void 0,
494
634
  a: void 0
495
635
  });
496
- return _el$37;
636
+ return _el$41;
497
637
  })()));
498
- return _el$33;
638
+ return _el$37;
499
639
  }
500
640
  }), null);
501
641
  _$effect2((_p$) => {
502
- var _v$5 = palette().text, _v$6 = palette().textMuted;
503
- _v$5 !== _p$.e && (_p$.e = _$setProp2(_el$27, "fg", _v$5, _p$.e));
504
- _v$6 !== _p$.t && (_p$.t = _$setProp2(_el$31, "fg", _v$6, _p$.t));
642
+ var _v$9 = palette().text, _v$0 = palette().textMuted;
643
+ _v$9 !== _p$.e && (_p$.e = _$setProp2(_el$31, "fg", _v$9, _p$.e));
644
+ _v$0 !== _p$.t && (_p$.t = _$setProp2(_el$35, "fg", _v$0, _p$.t));
505
645
  return _p$;
506
646
  }, {
507
647
  e: void 0,
508
648
  t: void 0
509
649
  });
510
- return _el$25;
650
+ return _el$29;
511
651
  })();
512
652
  }
513
653