@kky42/pievo-server 2.4.13 → 3.0.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 (89) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{actionUi-D8m1FDHO.js → actionUi-BZrLpgHT.js} +1 -1
  3. package/.output/public/assets/app-DXLuQNb9.css +2 -0
  4. package/.output/public/assets/index-Di_wpAtL.js +10 -0
  5. package/.output/public/assets/loops._loopId-X3ClNPMY.js +67 -0
  6. package/.output/public/assets/loops._loopId_.runs._runId-ByU2BSyF.js +3 -0
  7. package/.output/public/assets/preload-helper-hRTYB_ju.js +3 -0
  8. package/.output/public/assets/{routes-79D939J4.js → routes-BIOJZsig.js} +1 -1
  9. package/.output/public/assets/routes-K8D5uBiV.js +1 -0
  10. package/.output/server/_chunks/ssr-renderer.mjs +1 -1
  11. package/.output/server/_libs/{drizzle-orm+postgres.mjs → drizzle-orm.mjs} +93 -2218
  12. package/.output/server/_ssr/{MachinesModal-DBIP648Z.mjs → MachinesModal-CmVMec6B.mjs} +52 -46
  13. package/.output/server/_ssr/{actionUi-C_WswNb1.mjs → actionUi-DE-Pb2tv.mjs} +4 -5
  14. package/.output/server/_ssr/{artifactFiles-BvVmixrs.mjs → artifactFiles-Di1xDKvX.mjs} +5 -7
  15. package/.output/server/_ssr/{artifactKind-DRCbYHZU.mjs → artifactKind-DqpmtxDU.mjs} +3 -9
  16. package/.output/server/_ssr/{boot-U-CFI65B.mjs → boot-CYRi-wez.mjs} +531 -1976
  17. package/.output/server/_ssr/lifecycleUi-BsbUsi5K.mjs +106 -0
  18. package/.output/server/_ssr/{loopApi-C4nN0msL.mjs → loopApi-Bez1rHV0.mjs} +50 -65
  19. package/.output/server/_ssr/{loopProjection-DMSNHux6.mjs → loopProjection-esCjyZJg.mjs} +4 -20
  20. package/.output/server/_ssr/{loops._loopId-Q4pRYPip.mjs → loops._loopId-KUezNY69.mjs} +133 -24
  21. package/.output/server/_ssr/{loops._loopId_.runs._runId-DNXVmCt5.mjs → loops._loopId_.runs._runId-BFP9oMrp.mjs} +2 -7
  22. package/.output/server/_ssr/{loops._loopId_.runs._runId-ty3AhkOi.mjs → loops._loopId_.runs._runId-DOkUEesG.mjs} +18 -33
  23. package/.output/server/_ssr/{machineFns-CkNms3zA.mjs → machineFns-CniGcY8s.mjs} +13 -49
  24. package/.output/server/_ssr/networkAccess-CIlK3ION.mjs +30 -0
  25. package/.output/server/_ssr/router-BFIH2UAE.mjs +362 -0
  26. package/.output/server/_ssr/routes-BSVBANI3.mjs +12 -0
  27. package/.output/server/_ssr/{routes-BaanDO41.mjs → routes-DnE7XDe_.mjs} +242 -77
  28. package/.output/server/_ssr/{routes-B3fulW5I.mjs → routes-ngpX7h8D.mjs} +2 -4
  29. package/.output/server/_ssr/ssr.mjs +25 -34
  30. package/.output/server/_ssr/start-B5_9Z5W-.mjs +35 -0
  31. package/.output/server/{_tanstack-start-manifest_v-DkmxsHDK.mjs → _tanstack-start-manifest_v-DnwAupbZ.mjs} +8 -13
  32. package/.output/server/drizzle/0000_baseline.sql +6 -97
  33. package/.output/server/drizzle/meta/_journal.json +2 -16
  34. package/.output/server/index.mjs +43 -50
  35. package/drizzle/0000_baseline.sql +6 -97
  36. package/drizzle/meta/_journal.json +2 -16
  37. package/package.json +4 -8
  38. package/scripts/pievo-server.mjs +49 -47
  39. package/scripts/server-cli-lib.mjs +21 -12
  40. package/scripts/server-network.mjs +139 -0
  41. package/.output/public/assets/SignIn-CDCdDD1a.js +0 -1
  42. package/.output/public/assets/app-PPhgN9iN.css +0 -2
  43. package/.output/public/assets/index-c0XPWXuz.js +0 -10
  44. package/.output/public/assets/loops._loopId-D7i_BGiE.js +0 -67
  45. package/.output/public/assets/loops._loopId_.runs._runId-CksSrEY7.js +0 -3
  46. package/.output/public/assets/preload-helper-Zcmr31XG.js +0 -5
  47. package/.output/public/assets/routes-BYgl3Tmv.js +0 -1
  48. package/.output/server/_libs/@aws-crypto/crc32+[...].mjs +0 -419
  49. package/.output/server/_libs/@aws-sdk/checksums+[...].mjs +0 -10732
  50. package/.output/server/_libs/@aws-sdk/client-s3+[...].mjs +0 -9475
  51. package/.output/server/_libs/@aws-sdk/credential-provider-http+[...].mjs +0 -137
  52. package/.output/server/_libs/@aws-sdk/credential-provider-ini+[...].mjs +0 -440
  53. package/.output/server/_libs/@aws-sdk/credential-provider-process+[...].mjs +0 -62
  54. package/.output/server/_libs/@aws-sdk/credential-provider-sso+[...].mjs +0 -818
  55. package/.output/server/_libs/@aws-sdk/credential-provider-web-identity+[...].mjs +0 -59
  56. package/.output/server/_libs/@smithy/credential-provider-imds+[...].mjs +0 -342
  57. package/.output/server/_libs/aws-crypto__crc32c.mjs +0 -314
  58. package/.output/server/_libs/aws-sdk__nested-clients.mjs +0 -2671
  59. package/.output/server/_ssr/SignIn-Bp3uWaCQ.mjs +0 -53
  60. package/.output/server/_ssr/artifacts-CzDJLaa6.mjs +0 -2
  61. package/.output/server/_ssr/auth-BV0MxVdo.mjs +0 -38355
  62. package/.output/server/_ssr/auth-client-RTpMpT4L.mjs +0 -1070
  63. package/.output/server/_ssr/boot-CsLXrLEa.mjs +0 -2
  64. package/.output/server/_ssr/bun-sqlite-dialect-BW9W1_Ps-D9KUBJ-L.mjs +0 -162
  65. package/.output/server/_ssr/core-RrmWoKne.mjs +0 -5
  66. package/.output/server/_ssr/d1-sqlite-dialect-BLC8LXE6-CVHRzH1n.mjs +0 -112
  67. package/.output/server/_ssr/db-BTX-xORB.mjs +0 -2
  68. package/.output/server/_ssr/dist-D7UDVZ5G.mjs +0 -342
  69. package/.output/server/_ssr/factory-DYFx1fg-.mjs +0 -6903
  70. package/.output/server/_ssr/kysely-adapter-CwdB7yBh.mjs +0 -2
  71. package/.output/server/_ssr/kysely-migration-tables-JkVUjPF_-bPAX9LR_.mjs +0 -19
  72. package/.output/server/_ssr/logger-CwiKSMp6.mjs +0 -2
  73. package/.output/server/_ssr/node-sqlite-dialect-B_g92oFK.mjs +0 -162
  74. package/.output/server/_ssr/router-DCNZ2xLm.mjs +0 -543
  75. package/.output/server/_ssr/routes-8JSF7bX_.mjs +0 -27
  76. package/.output/server/_ssr/runDiff-D7CxAgYL.mjs +0 -2
  77. package/.output/server/_ssr/start-4ifArtKx.mjs +0 -4
  78. package/.output/server/_ssr/store-DSNbXxqz.mjs +0 -2
  79. package/.output/server/_ssr/tokens-DzUv7CCp.mjs +0 -2
  80. package/.output/server/drizzle/0001_add_pi_agent.sql +0 -9
  81. package/.output/server/drizzle/0002_remove_teams.sql +0 -15
  82. package/.output/server/node_modules/tslib/modules/index.js +0 -70
  83. package/.output/server/node_modules/tslib/modules/package.json +0 -3
  84. package/.output/server/node_modules/tslib/package.json +0 -47
  85. package/.output/server/node_modules/tslib/tslib.js +0 -484
  86. package/.output/server/package.json +0 -9
  87. package/drizzle/0001_add_pi_agent.sql +0 -9
  88. package/drizzle/0002_remove_teams.sql +0 -15
  89. package/scripts/prestart.mjs +0 -66
@@ -1,26 +1,21 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
- import { G as isOutdated, ct as machinePresence } from "./boot-U-CFI65B.mjs";
2
+ import { D as isOutdated, I as machinePresence } from "./boot-CYRi-wez.mjs";
3
3
  import { a as DialogClose, c as TooltipPopup, d as TooltipTrigger, f as TooltipRoot, g as require_react, h as require_jsx_runtime, i as DialogPopup, l as TooltipPositioner, n as DialogRoot, o as DialogBackdrop, r as DialogPortal, t as DialogTitle, u as TooltipPortal } from "../_libs/@base-ui/react+[...].mjs";
4
- import { n as createServerFn } from "./ssr.mjs";
5
- import { g as lifecyclePresentation, o as createSsrRpc, p as getConfig, s as daemonStopSupport } from "./auth-client-RTpMpT4L.mjs";
6
- import { A as until, C as rel, D as sectionHeadCls, E as scheduleText, M as useHydrated, S as lastRunOf, _ as fmt, b as inputCls, c as btn, g as dur, h as dotOpacity, l as btnDanger, m as dotLabel, n as ErrorBanner, o as Pill, p as dotColor, t as ConfirmBar, u as btnPrimary, v as fnum, w as runPulseAnim, x as labelCls } from "./actionUi-C_WswNb1.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/MachinesModal-DBIP648Z.js
4
+ import { r as createServerFn } from "./ssr.mjs";
5
+ import { c as getConfig, d as lifecyclePresentation, n as createSsrRpc, r as daemonStopSupport } from "./lifecycleUi-BsbUsi5K.mjs";
6
+ import { C as lastRunOf, D as scheduleText, N as useHydrated, O as sectionHeadCls, S as labelCls, T as runPulseAnim, _ as fmt, c as btn, g as dur, h as dotOpacity, j as until, l as btnDanger, m as dotLabel, n as ErrorBanner, o as Pill, p as dotColor, t as ConfirmBar, u as btnPrimary, v as fnum, w as rel, x as inputCls } from "./actionUi-DE-Pb2tv.mjs";
7
+ //#region node_modules/.nitro/vite/services/ssr/assets/MachinesModal-CmVMec6B.js
8
8
  var import_react = /* @__PURE__ */ __toESM(require_react());
9
9
  var import_jsx_runtime = require_jsx_runtime();
10
10
  /**
11
- * Machine-management server functions. In auth mode, the signed-in user is the
12
- * sole human authorization boundary. Open mode intentionally shares all machine
13
- * administration, including reconnect tokens.
11
+ * Machine-management server functions. Pievo is single-user: anyone who can
12
+ * reach the dashboard administers every machine, including reconnect tokens.
14
13
  */
15
- /** Missing and out-of-scope machines both resolve to undefined. */
16
14
  var listMachines = createServerFn({ method: "GET" }).handler(createSsrRpc("aa46310016bb8a58b273a648ffd498c87f1f450d12827e30110a3b83ba6a27d9"));
17
15
  var createMachine = createServerFn({ method: "POST" }).handler(createSsrRpc("ed679b4e1e05e903a5d4ba4a70d9b9d883991ab22ed59b4d2d69078941818415"));
18
16
  var machineStatus = createServerFn({ method: "GET" }).validator((id) => id).handler(createSsrRpc("169566e7637a22599b4eb32ee3775574e99677406922bbef7482a102036c33dd"));
19
17
  var finalizeMachine = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("27d7eba0b6a2257949392fdd56057275a5c5366484ae01faf3b5897a225ecd83"));
20
- /**
21
- * Delete server-owned machine data without touching local project files. The
22
- * store rechecks ownership under the deletion lock in auth mode.
23
- */
18
+ /** Delete server-owned machine data without touching local project files. */
24
19
  var deleteMachine = createServerFn({ method: "POST" }).validator((id) => id).handler(createSsrRpc("a6384dc7154d9930422d29396f5de64b3ac69c62ad3824bc4a22d745fc07b293"));
25
20
  /** Merge two chronological (oldest-first) run lists, dedup by id (the first
26
21
  * occurrence wins, so pass the fresher list first), re-sorted by ts ascending.
@@ -259,6 +254,12 @@ function LoopOverview({ loop, runs, onLoadMore, onPickRun, onOpen, extraPill })
259
254
  tone: "outline",
260
255
  children: AGENT_LABEL[loop.agent]
261
256
  }),
257
+ loop.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pill, {
258
+ tone: "neutral",
259
+ title: tag,
260
+ className: "max-w-44 truncate",
261
+ children: tag
262
+ }, tag)),
262
263
  extraPill,
263
264
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
264
265
  className: "ml-auto min-w-0",
@@ -339,12 +340,24 @@ function daemonConnectCommand(origin, token, cli, customCli) {
339
340
  const start = `${cli} daemon connect --server-url ${origin} --connect-key ${token}`;
340
341
  return customCli ? start : `npm install -g @kky42/pievo@latest && ${start}`;
341
342
  }
343
+ /** The server URL other devices should use. A dashboard opened on the server
344
+ * itself sees a loopback origin, which no other device can reach, so prefer the
345
+ * launcher-published network URL there. */
346
+ function connectServerUrl(origin, publicUrl) {
347
+ if (!publicUrl) return origin;
348
+ try {
349
+ const host = new URL(origin).hostname;
350
+ return host === "localhost" || host === "[::1]" || host.startsWith("127.") ? publicUrl : origin;
351
+ } catch {
352
+ return publicUrl;
353
+ }
354
+ }
342
355
  function daemonUpgradeCommand(cli, customCli) {
343
356
  const restart = `${cli} daemon restart`;
344
357
  return customCli ? restart : `npm install -g @kky42/pievo@latest && ${restart}`;
345
358
  }
346
- function connectCmd(token, cli, customCli) {
347
- return daemonConnectCommand(typeof window !== "undefined" ? window.location.origin : "http://127.0.0.1:3000", token, cli, customCli);
359
+ function connectCmd(token, config) {
360
+ return daemonConnectCommand(connectServerUrl(typeof window !== "undefined" ? window.location.origin : "http://127.0.0.1:3000", config.publicUrl), token, config.pievoCli, config.customCli);
348
361
  }
349
362
  function CopyButton({ text }) {
350
363
  const [done, setDone] = (0, import_react.useState)(false);
@@ -358,6 +371,19 @@ function CopyButton({ text }) {
358
371
  children: done ? "Copied ✓" : "Copy"
359
372
  });
360
373
  }
374
+ function UpgradeCommand({ cliConfig, configErr }) {
375
+ const command = cliConfig ? daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli) : null;
376
+ return command ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
377
+ className: "flex items-start gap-2",
378
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
379
+ className: "flex-1 overflow-x-auto whitespace-pre-wrap break-all rounded-control bg-display p-3 font-mono text-caption leading-relaxed text-paper",
380
+ children: command
381
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: command })]
382
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
383
+ className: "text-label text-secondary",
384
+ children: configErr ? "Could not load the upgrade command. Close and try again." : "Loading upgrade command…"
385
+ });
386
+ }
361
387
  function machineOrder(a, b) {
362
388
  return a.name.localeCompare(b.name, void 0, {
363
389
  numeric: true,
@@ -436,10 +462,6 @@ function MachinesModal({ open, onClose }) {
436
462
  setDelErr(null);
437
463
  try {
438
464
  const r = await createMachine();
439
- if ("error" in r) {
440
- setDelErr(r.error);
441
- return;
442
- }
443
465
  setStatus(null);
444
466
  setName("");
445
467
  setPending(r);
@@ -493,8 +515,8 @@ function MachinesModal({ open, onClose }) {
493
515
  className: "mt-2 flex items-start gap-2",
494
516
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
495
517
  className: "flex-1 overflow-x-auto whitespace-pre-wrap break-all rounded-control bg-display p-4 font-mono text-label leading-relaxed text-paper",
496
- children: connectCmd(pending.token, cliConfig.pievoCli, cliConfig.customCli)
497
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: connectCmd(pending.token, cliConfig.pievoCli, cliConfig.customCli) })]
518
+ children: connectCmd(pending.token, cliConfig)
519
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: connectCmd(pending.token, cliConfig) })]
498
520
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
499
521
  className: "mt-2 text-body text-secondary",
500
522
  children: configErr ? "Could not load the connection command. Close and try again." : "Loading connection command…"
@@ -632,10 +654,6 @@ function MachinesModal({ open, onClose }) {
632
654
  className: "text-label text-accent",
633
655
  children: "Daemon upgrade required to stop a running process"
634
656
  }),
635
- !m.online && !m.token && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
636
- className: "text-label text-secondary",
637
- children: "Reconnect command available from the machine owner's account."
638
- }),
639
657
  !m.online && m.token && !cliConfig && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
640
658
  className: "text-label text-secondary",
641
659
  children: configErr ? "Could not load the reconnect command. Close and try again." : "Loading reconnect command…"
@@ -647,8 +665,8 @@ function MachinesModal({ open, onClose }) {
647
665
  className: "mt-2 flex items-start gap-2",
648
666
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
649
667
  className: "flex-1 overflow-x-auto whitespace-pre-wrap break-all rounded-control bg-display p-3 font-mono text-caption leading-relaxed text-paper",
650
- children: connectCmd(m.token, cliConfig.pievoCli, cliConfig.customCli)
651
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: connectCmd(m.token, cliConfig.pievoCli, cliConfig.customCli) })]
668
+ children: connectCmd(m.token, cliConfig)
669
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: connectCmd(m.token, cliConfig) })]
652
670
  })] }),
653
671
  m.needsUpdate && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
654
672
  className: "flex flex-col gap-1.5 rounded-control border border-warn/40 bg-warn/10 p-3",
@@ -666,15 +684,9 @@ function MachinesModal({ open, onClose }) {
666
684
  m.requiredDaemonVersion
667
685
  ]
668
686
  }),
669
- cliConfig ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
670
- className: "flex items-start gap-2",
671
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
672
- className: "flex-1 overflow-x-auto whitespace-pre-wrap break-all rounded-control bg-display p-3 font-mono text-caption leading-relaxed text-paper",
673
- children: daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli)
674
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli) })]
675
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
676
- className: "text-label text-secondary",
677
- children: configErr ? "Could not load the upgrade command. Close and try again." : "Loading upgrade command…"
687
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UpgradeCommand, {
688
+ cliConfig,
689
+ configErr
678
690
  })
679
691
  ]
680
692
  }),
@@ -689,15 +701,9 @@ function MachinesModal({ open, onClose }) {
689
701
  m.latestDaemonVersion,
690
702
  ")"
691
703
  ]
692
- }), cliConfig ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
693
- className: "flex items-start gap-2",
694
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
695
- className: "flex-1 overflow-x-auto whitespace-pre-wrap break-all rounded-control bg-display p-3 font-mono text-caption leading-relaxed text-paper",
696
- children: daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli)
697
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli) })]
698
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
699
- className: "text-label text-secondary",
700
- children: configErr ? "Could not load the upgrade command. Close and try again." : "Loading upgrade command…"
704
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UpgradeCommand, {
705
+ cliConfig,
706
+ configErr
701
707
  })]
702
708
  })
703
709
  ]
@@ -717,4 +723,4 @@ function MachinesModal({ open, onClose }) {
717
723
  });
718
724
  }
719
725
  //#endregion
720
- export { Timeline as a, mergeRuns as c, ModalHead as i, MachinesModal as n, daemonConnectCommand as o, Modal as r, listMachines as s, LoopOverview as t };
726
+ export { Timeline as a, listMachines as c, ModalHead as i, mergeRuns as l, MachinesModal as n, connectServerUrl as o, Modal as r, daemonConnectCommand as s, LoopOverview as t };
@@ -1,6 +1,6 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
2
  import { g as require_react, h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/actionUi-C_WswNb1.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/actionUi-DE-Pb2tv.js
4
4
  var import_react = /* @__PURE__ */ __toESM(require_react());
5
5
  var import_jsx_runtime = require_jsx_runtime();
6
6
  var fmt = (t) => t ? new Date(t).toLocaleString() : "—";
@@ -169,7 +169,6 @@ var btn = `${btnBase} border border-wire bg-surface text-primary hover:bg-raised
169
169
  var btnPrimary = `${btnBase} border border-display bg-display text-paper hover:opacity-85`;
170
170
  var btnDanger = `${btnBase} border border-transparent bg-rubik-red text-white hover:opacity-85`;
171
171
  var btnSm = `inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-full border border-wire bg-surface px-3 py-1 text-label font-medium text-primary transition-colors duration-150 hover:bg-raised disabled:cursor-default disabled:opacity-40 ${focusRing}`;
172
- `${focusRing}`;
173
172
  var btnQuiet = "inline-flex cursor-pointer items-center gap-1.5 border-none bg-transparent p-0 text-meta font-medium text-secondary transition-colors hover:text-display";
174
173
  var sectionHeadCls = "text-label font-semibold text-secondary";
175
174
  var labelCls = "mb-1.5 mt-3 block text-label font-medium text-secondary";
@@ -213,10 +212,10 @@ var PILL_TONES = {
213
212
  accent: "bg-accent-soft text-accent",
214
213
  warn: "bg-warn-soft text-warn"
215
214
  };
216
- function Pill({ tone = "neutral", dot, title, children }) {
215
+ function Pill({ tone = "neutral", dot, title, className = "", children }) {
217
216
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
218
217
  title,
219
- className: `inline-flex h-[22px] items-center gap-1.5 rounded-full px-2.5 text-caption font-medium ${PILL_TONES[tone]}`,
218
+ className: `inline-flex h-[22px] items-center gap-1.5 rounded-full px-2.5 text-caption font-medium ${PILL_TONES[tone]} ${className}`,
220
219
  children: [dot && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
221
220
  className: "size-1.5 rounded-full",
222
221
  style: dot === "pulse" ? runPulseStyle : { background: "var(--color-rubik-green)" }
@@ -354,4 +353,4 @@ function useFlash() {
354
353
  return [flash, setFlash];
355
354
  }
356
355
  //#endregion
357
- export { until as A, rel as C, sectionHeadCls as D, scheduleText as E, useHydrated as M, selectCls as O, lastRunOf as S, runPulseStyle as T, fmt as _, Loading as a, inputCls as b, btn as c, btnQuiet as d, btnSm as f, dur as g, dotOpacity as h, LoadErrorCard as i, useFlash as j, tsShort as k, btnDanger as l, dotLabel as m, ErrorBanner as n, Pill as o, dotColor as p, FlashLine as r, StatusPill as s, ConfirmBar as t, btnPrimary as u, fnum as v, runPulseAnim as w, labelCls as x, humanBytes as y };
356
+ export { tsShort as A, lastRunOf as C, scheduleText as D, runPulseStyle as E, useFlash as M, useHydrated as N, sectionHeadCls as O, labelCls as S, runPulseAnim as T, fmt as _, Loading as a, humanBytes as b, btn as c, btnQuiet as d, btnSm as f, dur as g, dotOpacity as h, LoadErrorCard as i, until as j, selectCls as k, btnDanger as l, dotLabel as m, ErrorBanner as n, Pill as o, dotColor as p, FlashLine as r, StatusPill as s, ConfirmBar as t, btnPrimary as u, fnum as v, rel as w, inputCls as x, focusRing as y };
@@ -1,15 +1,13 @@
1
- import { O as getArtifactFile, Z as listArtifacts, k as getArtifactSync, xt as safeRelPath } from "./boot-U-CFI65B.mjs";
2
- import { n as toArtifactSummary } from "./loopProjection-DMSNHux6.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/artifactFiles-BvVmixrs.js
1
+ import { O as listArtifacts, U as safeRelPath, l as getArtifactSync, x as getArtifactFile } from "./boot-CYRi-wez.mjs";
2
+ import { n as toArtifactSummary } from "./loopProjection-esCjyZJg.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/artifactFiles-Di1xDKvX.js
4
4
  /**
5
5
  * Server-side reads over a loop's current exact artifacts. Pure helpers
6
6
  * (no request/session context) so they're shared by the lazy server fns
7
7
  * (`getArtifacts` / `getArtifact` in loopApi) AND the download route, and are
8
- * directly unit-testable against an injected blob store — authorization is the
9
- * caller's loop (the server fn via `ownedLoop`, the route via `canAccessLoop`).
8
+ * directly unit-testable against an injected blob store.
10
9
  *
11
- * The bytes live in the gateway's BlobStore (local by default, R2 when configured);
12
- * here we only read them — never write — so the feature is strictly read-only and
10
+ * The bytes live in the gateway's local BlobStore; here we only read them — never write — so the feature is strictly read-only and
13
11
  * the server's zero-exec invariant holds (it decodes text, never interprets it).
14
12
  */
15
13
  async function listLoopArtifacts(loopId) {
@@ -1,19 +1,13 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
- import { f as getAuthState } from "./auth-client-RTpMpT4L.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/artifactKind-DRCbYHZU.js
4
- var $$splitComponentImporter = () => import("./loops._loopId-Q4pRYPip.mjs");
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/artifactKind-DqpmtxDU.js
3
+ var $$splitComponentImporter = () => import("./loops._loopId-KUezNY69.mjs");
5
4
  /**
6
5
  * Loop detail page — `/loops/$loopId`: a loop header and action toolbar, the
7
6
  * exact artifact Files panel, and the runs timeline. The view owns its own
8
- * data + self-poll (ssr:false so the session cookie rides along with its fetches,
9
- * like the dashboard loader). Run rows link on to `/loops/$loopId/runs/$runId`.
10
- *
11
- * Auth-gated exactly like the dashboard (`/`): Better Auth's session hook keeps a
12
- * logged-out or expired deep link from mounting the ownership-scoped data view.
7
+ * data + self-poll. Run rows link on to `/loops/$loopId/runs/$runId`.
13
8
  */
14
9
  var Route = createFileRoute("/loops/$loopId")({
15
10
  ssr: false,
16
- loader: async () => ({ auth: await getAuthState() }),
17
11
  component: lazyRouteComponent($$splitComponentImporter, "component")
18
12
  });
19
13
  /** Extension → MIME for the image types we serve inline. This is an ALLOWLIST: