@kky42/pievo-server 2.4.13 → 2.4.14

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 (59) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{SignIn-CDCdDD1a.js → SignIn-CIFwnZtF.js} +1 -1
  3. package/.output/public/assets/{actionUi-D8m1FDHO.js → actionUi-5PtES4q0.js} +1 -1
  4. package/.output/public/assets/app-DvHMhs7S.css +2 -0
  5. package/.output/public/assets/index-CRX2pu0W.js +10 -0
  6. package/.output/public/assets/loops._loopId-BsuV-Rmf.js +67 -0
  7. package/.output/public/assets/{loops._loopId_.runs._runId-CksSrEY7.js → loops._loopId_.runs._runId-DpK_fzmZ.js} +2 -2
  8. package/.output/public/assets/{preload-helper-Zcmr31XG.js → preload-helper-sAZOZb3G.js} +2 -2
  9. package/.output/public/assets/{routes-79D939J4.js → routes-Dm_3J2aV.js} +1 -1
  10. package/.output/public/assets/{routes-BYgl3Tmv.js → routes-DxF_s3cD.js} +1 -1
  11. package/.output/server/_ssr/{MachinesModal-DBIP648Z.mjs → MachinesModal-BaEtzycr.mjs} +10 -4
  12. package/.output/server/_ssr/{SignIn-Bp3uWaCQ.mjs → SignIn-sHQaBQJC.mjs} +3 -3
  13. package/.output/server/_ssr/{actionUi-C_WswNb1.mjs → actionUi-5HOCZnom.mjs} +4 -4
  14. package/.output/server/_ssr/{artifactFiles-BvVmixrs.mjs → artifactFiles-DO43wwXA.mjs} +4 -3
  15. package/.output/server/_ssr/{artifactKind-DRCbYHZU.mjs → artifactKind-DwDr8IYc.mjs} +3 -3
  16. package/.output/server/_ssr/artifacts-Cd7Qx3Qp.mjs +2 -0
  17. package/.output/server/_ssr/{auth-BV0MxVdo.mjs → auth-0AamrwHo.mjs} +9 -9
  18. package/.output/server/_ssr/{auth-client-RTpMpT4L.mjs → auth-client-lSMb_Idt.mjs} +2 -2
  19. package/.output/server/_ssr/boot-C472kLwY.mjs +3947 -0
  20. package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-D9KUBJ-L.mjs → bun-sqlite-dialect-BW9W1_Ps-DLIXocA0.mjs} +2 -2
  21. package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-CVHRzH1n.mjs → d1-sqlite-dialect-BLC8LXE6-BoFMIPr_.mjs} +2 -2
  22. package/.output/server/_ssr/db-BzvMQ2kx.mjs +2 -0
  23. package/.output/server/_ssr/{dist-D7UDVZ5G.mjs → dist-ClzqkwxD.mjs} +2 -2
  24. package/.output/server/_ssr/{factory-DYFx1fg-.mjs → factory-ixUjZqJn.mjs} +2 -2
  25. package/.output/server/_ssr/{kysely-adapter-CwdB7yBh.mjs → kysely-adapter-DkZbmKgV.mjs} +1 -1
  26. package/.output/server/_ssr/logger-DDjsYB2X.mjs +2 -0
  27. package/.output/server/_ssr/{loopApi-C4nN0msL.mjs → loopApi-DT751TJA.mjs} +11 -10
  28. package/.output/server/_ssr/{loopProjection-DMSNHux6.mjs → loopProjection-qaD2I48a.mjs} +5 -2
  29. package/.output/server/_ssr/loopTags-CXx5UdGf.mjs +3356 -0
  30. package/.output/server/_ssr/{loops._loopId-Q4pRYPip.mjs → loops._loopId-CXgw2Rz1.mjs} +132 -8
  31. package/.output/server/_ssr/{loops._loopId_.runs._runId-DNXVmCt5.mjs → loops._loopId_.runs._runId-Dk94Z0Jq.mjs} +3 -3
  32. package/.output/server/_ssr/{loops._loopId_.runs._runId-ty3AhkOi.mjs → loops._loopId_.runs._runId-SASSqOfy.mjs} +5 -5
  33. package/.output/server/_ssr/{machineFns-CkNms3zA.mjs → machineFns-BSrIgn3f.mjs} +4 -3
  34. package/.output/server/_ssr/{node-sqlite-dialect-B_g92oFK.mjs → node-sqlite-dialect-BbUqnnYv.mjs} +2 -2
  35. package/.output/server/_ssr/{router-DCNZ2xLm.mjs → router-BlLlhfJe.mjs} +20 -20
  36. package/.output/server/_ssr/{routes-BaanDO41.mjs → routes-Cr-9yDEH.mjs} +160 -36
  37. package/.output/server/_ssr/{routes-B3fulW5I.mjs → routes-DRBS4Zi4.mjs} +2 -2
  38. package/.output/server/_ssr/{routes-8JSF7bX_.mjs → routes-DTBltabU.mjs} +5 -5
  39. package/.output/server/_ssr/ssr.mjs +24 -24
  40. package/.output/server/_ssr/store-vDZ9INSa.mjs +2 -0
  41. package/.output/server/_ssr/tokens-BHiCElYD.mjs +2 -0
  42. package/.output/server/{_tanstack-start-manifest_v-DkmxsHDK.mjs → _tanstack-start-manifest_v-DxLIQ0cc.mjs} +10 -10
  43. package/.output/server/drizzle/0003_add_loop_tags.sql +5 -0
  44. package/.output/server/drizzle/meta/_journal.json +7 -0
  45. package/.output/server/index.mjs +48 -48
  46. package/drizzle/0003_add_loop_tags.sql +5 -0
  47. package/drizzle/meta/_journal.json +7 -0
  48. package/package.json +1 -1
  49. package/.output/public/assets/app-PPhgN9iN.css +0 -2
  50. package/.output/public/assets/index-c0XPWXuz.js +0 -10
  51. package/.output/public/assets/loops._loopId-D7i_BGiE.js +0 -67
  52. package/.output/server/_ssr/artifacts-CzDJLaa6.mjs +0 -2
  53. package/.output/server/_ssr/boot-CsLXrLEa.mjs +0 -2
  54. package/.output/server/_ssr/boot-U-CFI65B.mjs +0 -7193
  55. package/.output/server/_ssr/db-BTX-xORB.mjs +0 -2
  56. package/.output/server/_ssr/logger-CwiKSMp6.mjs +0 -2
  57. package/.output/server/_ssr/runDiff-D7CxAgYL.mjs +0 -2
  58. package/.output/server/_ssr/store-DSNbXxqz.mjs +0 -2
  59. package/.output/server/_ssr/tokens-DzUv7CCp.mjs +0 -2
@@ -1,10 +1,10 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
2
  import { g as require_react, h as require_jsx_runtime, s as TooltipProvider } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { c as createFileRoute, d as useNavigate, f as useRouter, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
4
- import { O as useSession, _ as listLoops, a as PievoLogo, f as getAuthState, i as OpenModeWarning, n as GITHUB_URL, p as getConfig, r as GitHubIcon, v as loadOlderRuns, w as signOut, y as mintConnectKey } from "./auth-client-RTpMpT4L.mjs";
5
- import { f as btnSm } from "./actionUi-C_WswNb1.mjs";
6
- import { c as mergeRuns, i as ModalHead, n as MachinesModal, o as daemonConnectCommand, r as Modal, s as listMachines, t as LoopOverview } from "./MachinesModal-DBIP648Z.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-BaanDO41.js
4
+ import { O as useSession, _ as listLoops, a as PievoLogo, f as getAuthState, i as OpenModeWarning, n as GITHUB_URL, p as getConfig, r as GitHubIcon, v as loadOlderRuns, w as signOut, y as mintConnectKey } from "./auth-client-lSMb_Idt.mjs";
5
+ import { f as btnSm, y as focusRing } from "./actionUi-5HOCZnom.mjs";
6
+ import { c as mergeRuns, i as ModalHead, n as MachinesModal, o as daemonConnectCommand, r as Modal, s as listMachines, t as LoopOverview } from "./MachinesModal-BaEtzycr.mjs";
7
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-Cr-9yDEH.js
8
8
  var import_react = /* @__PURE__ */ __toESM(require_react());
9
9
  var import_jsx_runtime = require_jsx_runtime();
10
10
  function LoopCard({ loop, onOpen, onPickRun }) {
@@ -37,6 +37,43 @@ function LoopCard({ loop, onOpen, onPickRun }) {
37
37
  })
38
38
  });
39
39
  }
40
+ function LoopFilterBar({ options, selectedKey, onSelect }) {
41
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
42
+ className: "scrollbar-none -mx-1 overflow-x-auto px-1 pb-1",
43
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
44
+ role: "group",
45
+ "aria-label": "Loop filters",
46
+ className: "flex min-w-max items-center gap-1.5",
47
+ children: options.map((option) => {
48
+ const selected = option.key === selectedKey;
49
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
50
+ type: "button",
51
+ "aria-pressed": selected,
52
+ title: option.filter.kind === "tag" ? option.label : void 0,
53
+ onClick: (event) => {
54
+ event.currentTarget.scrollIntoView?.({
55
+ block: "nearest",
56
+ inline: "nearest"
57
+ });
58
+ onSelect(option.filter);
59
+ },
60
+ className: `inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-full border px-3 text-body font-medium transition-colors ${focusRing} ${selected ? "border-display bg-display text-paper" : "border-hairline bg-surface text-secondary hover:border-wire hover:bg-raised hover:text-primary"}`,
61
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
62
+ className: option.filter.kind === "tag" ? "max-w-44 truncate" : "",
63
+ children: option.label
64
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
65
+ className: selected ? "text-paper/70" : "text-disabled",
66
+ children: [
67
+ "(",
68
+ option.count,
69
+ ")"
70
+ ]
71
+ })]
72
+ }, option.key);
73
+ })
74
+ })
75
+ });
76
+ }
40
77
  function ComposeModal({ open, onClose }) {
41
78
  const [token, setToken] = (0, import_react.useState)(null);
42
79
  const [config, setConfig] = (0, import_react.useState)(null);
@@ -169,6 +206,60 @@ function Step({ number, title, continued = false, children }) {
169
206
  })]
170
207
  });
171
208
  }
209
+ function loopFilterKey(filter) {
210
+ return filter.kind === "tag" ? `tag:${filter.tag}` : filter.kind;
211
+ }
212
+ function loopFilterOptions(loops) {
213
+ const active = loops.filter((loop) => loop.enabled && !loop.deleteRequestedAt).length;
214
+ const paused = loops.filter((loop) => !loop.enabled && !loop.deleteRequestedAt).length;
215
+ const blocked = loops.filter((loop) => !loop.enabled && !loop.deleteRequestedAt && loop.pauseCause?.kind === "blocked").length;
216
+ const tagCounts = /* @__PURE__ */ new Map();
217
+ for (const loop of loops) for (const tag of new Set(loop.tags)) tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
218
+ return [
219
+ {
220
+ key: "all",
221
+ label: "All Loops",
222
+ count: loops.length,
223
+ filter: { kind: "all" }
224
+ },
225
+ {
226
+ key: "active",
227
+ label: "Active",
228
+ count: active,
229
+ filter: { kind: "active" }
230
+ },
231
+ {
232
+ key: "paused",
233
+ label: "Paused",
234
+ count: paused,
235
+ filter: { kind: "paused" }
236
+ },
237
+ {
238
+ key: "blocked",
239
+ label: "Blocked",
240
+ count: blocked,
241
+ filter: { kind: "blocked" }
242
+ },
243
+ ...[...tagCounts].sort(([a], [b]) => a.localeCompare(b, "en-US")).map(([tag, count]) => ({
244
+ key: `tag:${tag}`,
245
+ label: tag,
246
+ count,
247
+ filter: {
248
+ kind: "tag",
249
+ tag
250
+ }
251
+ }))
252
+ ];
253
+ }
254
+ function filterLoops(loops, filter) {
255
+ switch (filter.kind) {
256
+ case "all": return loops;
257
+ case "active": return loops.filter((loop) => loop.enabled && !loop.deleteRequestedAt);
258
+ case "paused": return loops.filter((loop) => !loop.enabled && !loop.deleteRequestedAt);
259
+ case "blocked": return loops.filter((loop) => !loop.enabled && !loop.deleteRequestedAt && loop.pauseCause?.kind === "blocked");
260
+ case "tag": return loops.filter((loop) => loop.tags.includes(filter.tag));
261
+ }
262
+ }
172
263
  /** Loops and machines change between polls. Authorization is derived server-side
173
264
  * from the current session; clients do not send tenant identifiers. */
174
265
  async function fetchLiveData() {
@@ -188,6 +279,7 @@ function DashboardView({ initial, mode }) {
188
279
  const [signingOut, setSigningOut] = (0, import_react.useState)(false);
189
280
  const [composeOpen, setComposeOpen] = (0, import_react.useState)(false);
190
281
  const [machinesOpen, setMachinesOpen] = (0, import_react.useState)(false);
282
+ const [filter, setFilter] = (0, import_react.useState)({ kind: "all" });
191
283
  async function logout() {
192
284
  setSigningOut(true);
193
285
  try {
@@ -212,14 +304,16 @@ function DashboardView({ initial, mode }) {
212
304
  }, anyRunning ? 3e3 : 1e4);
213
305
  return () => clearInterval(t);
214
306
  }, [refetch, anyRunning]);
215
- const activeCount = loops.filter((loop) => loop.enabled && !loop.deleteRequestedAt).length;
216
- const pausedCount = loops.filter((loop) => !loop.enabled && !loop.deleteRequestedAt).length;
217
- const deletingCount = loops.filter((loop) => Boolean(loop.deleteRequestedAt)).length;
218
- const lifecycleCounts = [
219
- `${activeCount} active`,
220
- `${pausedCount} paused`,
221
- ...deletingCount ? [`${deletingCount} deleting`] : []
222
- ].join(" · ");
307
+ const filterOptions = (0, import_react.useMemo)(() => loopFilterOptions(loops), [loops]);
308
+ const selectedFilterKey = loopFilterKey(filter);
309
+ const filteredLoops = (0, import_react.useMemo)(() => filterLoops(loops, filter), [loops, filter]);
310
+ (0, import_react.useEffect)(() => {
311
+ if (filter.kind === "tag" && !filterOptions.some((option) => option.key === selectedFilterKey)) setFilter({ kind: "all" });
312
+ }, [
313
+ filter,
314
+ filterOptions,
315
+ selectedFilterKey
316
+ ]);
223
317
  const cardProps = () => ({
224
318
  onOpen: (id) => void navigate({
225
319
  to: "/loops/$loopId",
@@ -239,11 +333,14 @@ function DashboardView({ initial, mode }) {
239
333
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", {
240
334
  className: "glass glass-bar sticky top-0 z-50",
241
335
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
242
- className: "mx-auto flex max-w-[1180px] items-center gap-3 px-8 py-2.5",
336
+ className: "mx-auto flex max-w-[1180px] items-center gap-2 px-4 py-2.5 sm:gap-3 sm:px-8",
243
337
  children: [
244
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PievoLogo, { size: 30 }),
245
338
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
246
- className: "text-[18px] font-semibold tracking-[-0.015em] text-display",
339
+ className: "shrink-0",
340
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PievoLogo, { size: 30 })
341
+ }),
342
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
343
+ className: `shrink-0 text-[18px] font-semibold tracking-[-0.015em] text-display ${mode === "auth" ? "hidden sm:inline" : ""}`,
247
344
  children: "Pievo"
248
345
  }),
249
346
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1" }),
@@ -253,13 +350,13 @@ function DashboardView({ initial, mode }) {
253
350
  rel: "noreferrer",
254
351
  "aria-label": "GitHub repository",
255
352
  title: "GitHub",
256
- className: headerIconBtn,
353
+ className: `${headerIconBtn} hidden sm:inline-flex`,
257
354
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GitHubIcon, { className: "size-[17px]" })
258
355
  }),
259
356
  mode === "auth" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
260
- className: "flex items-center gap-2",
357
+ className: "flex shrink-0 items-center gap-2",
261
358
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
262
- className: "max-w-48 truncate text-label text-secondary",
359
+ className: "hidden max-w-48 truncate text-label text-secondary md:inline",
263
360
  title: session?.user.email ?? session?.user.name ?? "Account",
264
361
  children: session?.user.email ?? session?.user.name ?? "Account"
265
362
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
@@ -271,13 +368,23 @@ function DashboardView({ initial, mode }) {
271
368
  }),
272
369
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
273
370
  onClick: () => setMachinesOpen(true),
274
- className: `${headerBtn} gap-1.5`,
371
+ "aria-label": `${online} ${online === 1 ? "machine" : "machines"} online`,
372
+ className: `${headerBtn} gap-1.5 px-2 sm:px-3`,
275
373
  children: [
276
374
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `inline-block size-1.5 rounded-full ${online ? "bg-rubik-green" : "bg-disabled"}` }),
277
- online,
278
- " ",
279
- online === 1 ? "machine" : "machines",
280
- " online"
375
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
376
+ className: "sm:hidden",
377
+ children: online
378
+ }),
379
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
380
+ className: "hidden sm:inline",
381
+ children: [
382
+ online,
383
+ " ",
384
+ online === 1 ? "machine" : "machines",
385
+ " online"
386
+ ]
387
+ })
281
388
  ]
282
389
  }),
283
390
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
@@ -310,25 +417,42 @@ function DashboardView({ initial, mode }) {
310
417
  })]
311
418
  }),
312
419
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
313
- className: "mb-5 mt-12 flex items-baseline gap-2.5",
314
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", {
315
- className: "text-body font-semibold text-display",
316
- children: "Loops"
317
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
318
- className: "text-label text-secondary",
319
- children: loops.length ? lifecycleCounts : ""
420
+ className: "mb-5 mt-12",
421
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoopFilterBar, {
422
+ options: filterOptions,
423
+ selectedKey: selectedFilterKey,
424
+ onSelect: setFilter
425
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
426
+ className: "sr-only",
427
+ "aria-live": "polite",
428
+ children: [
429
+ "Showing ",
430
+ filteredLoops.length,
431
+ " loops"
432
+ ]
320
433
  })]
321
434
  }),
322
- loops.length ? loops.map((j) => /* @__PURE__ */ (0, import_react.createElement)(LoopCard, {
435
+ filteredLoops.length ? filteredLoops.map((j) => /* @__PURE__ */ (0, import_react.createElement)(LoopCard, {
323
436
  loop: j,
324
437
  ...cardProps(),
325
438
  key: j.id
326
- })) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
439
+ })) : loops.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
440
+ className: "py-16 text-center",
441
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
442
+ className: "text-[15px] text-secondary",
443
+ children: "No loops match this filter"
444
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
445
+ type: "button",
446
+ onClick: () => setFilter({ kind: "all" }),
447
+ className: "mt-2 text-body font-medium text-interactive hover:underline",
448
+ children: "Show all loops"
449
+ })]
450
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
327
451
  className: "py-16 text-center",
328
452
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
329
453
  className: "text-[15px] text-secondary",
330
454
  children: "No loops yet"
331
- }), !loops.length && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
455
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
332
456
  className: "mt-1.5 text-body text-disabled",
333
457
  children: "Create a scheduled prompt for a connected machine."
334
458
  })]
@@ -347,9 +471,9 @@ function DashboardView({ initial, mode }) {
347
471
  });
348
472
  }
349
473
  var headerBtn = "inline-flex shrink-0 cursor-pointer items-center rounded-full px-3 py-1.5 text-meta font-medium text-secondary transition-colors hover:bg-raised hover:text-display";
350
- var headerIconBtn = "inline-flex shrink-0 cursor-pointer items-center rounded-full p-1.5 text-secondary transition-colors hover:bg-raised hover:text-display";
351
- var $$splitErrorComponentImporter = () => import("./routes-B3fulW5I.mjs");
352
- var $$splitComponentImporter = () => import("./routes-8JSF7bX_.mjs");
474
+ var headerIconBtn = "shrink-0 cursor-pointer items-center rounded-full p-1.5 text-secondary transition-colors hover:bg-raised hover:text-display";
475
+ var $$splitErrorComponentImporter = () => import("./routes-DRBS4Zi4.mjs");
476
+ var $$splitComponentImporter = () => import("./routes-DTBltabU.mjs");
353
477
  /** The dashboard route. Auth mode shows sign-in before loading owner-scoped data;
354
478
  * open mode renders the server's shared administrative workspace. */
355
479
  var Route = createFileRoute("/")({
@@ -1,7 +1,7 @@
1
1
  import { h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
2
  import { f as useRouter } from "../_libs/@tanstack/react-router+[...].mjs";
3
- import { i as LoadErrorCard } from "./actionUi-C_WswNb1.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-B3fulW5I.js
3
+ import { i as LoadErrorCard } from "./actionUi-5HOCZnom.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-DRBS4Zi4.js
5
5
  var import_jsx_runtime = require_jsx_runtime();
6
6
  /** The dashboard route. Auth mode shows sign-in before loading owner-scoped data;
7
7
  * open mode renders the server's shared administrative workspace. */
@@ -1,9 +1,9 @@
1
1
  import { h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
- import { O as useSession } from "./auth-client-RTpMpT4L.mjs";
3
- import { a as Loading } from "./actionUi-C_WswNb1.mjs";
4
- import { t as SignIn } from "./SignIn-Bp3uWaCQ.mjs";
5
- import { n as Route, t as DashboardView } from "./routes-BaanDO41.mjs";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-8JSF7bX_.js
2
+ import { O as useSession } from "./auth-client-lSMb_Idt.mjs";
3
+ import { a as Loading } from "./actionUi-5HOCZnom.mjs";
4
+ import { t as SignIn } from "./SignIn-sHQaBQJC.mjs";
5
+ import { n as Route, t as DashboardView } from "./routes-Cr-9yDEH.mjs";
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-DTBltabU.js
7
7
  var import_jsx_runtime = require_jsx_runtime();
8
8
  /** The dashboard route. Auth mode shows sign-in before loading owner-scoped data;
9
9
  * open mode renders the server's shared administrative workspace. */
@@ -1,5 +1,5 @@
1
1
  import { r as __exportAll } from "../_runtime.mjs";
2
- import { i as __exportAll$1 } from "./factory-DYFx1fg-.mjs";
2
+ import { i as __exportAll$1 } from "./factory-ixUjZqJn.mjs";
3
3
  import { g as require_react, h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
4
  import { a as RouterProvider, n as defineHandlerCallback, t as renderRouterToStream } from "../_libs/@tanstack/react-router+[...].mjs";
5
5
  import { PassThrough, Readable } from "node:stream";
@@ -3418,7 +3418,7 @@ var defaultSerovalPlugins = [
3418
3418
  * the dev styles URL for route-scoped CSS collection.
3419
3419
  */
3420
3420
  async function getStartManifest(matchedRoutes) {
3421
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DkmxsHDK.mjs");
3421
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DxLIQ0cc.mjs");
3422
3422
  const startManifest = tsrStartManifest();
3423
3423
  let routes = startManifest.routes;
3424
3424
  routes[rootRouteId];
@@ -3440,87 +3440,87 @@ async function getStartManifest(matchedRoutes) {
3440
3440
  var manifest = {
3441
3441
  "08565e35f6a3dd06ef25401de0343976c47f7ae319d3baed6320b56dd3718311": {
3442
3442
  functionName: "runLoop_createServerFn_handler",
3443
- importer: () => import("./loopApi-C4nN0msL.mjs")
3443
+ importer: () => import("./loopApi-DT751TJA.mjs")
3444
3444
  },
3445
3445
  "08c28b892712a1b491b120b74c7dcb81761988d31ccea60216d1807b73c1182c": {
3446
3446
  functionName: "getRunDiff_createServerFn_handler",
3447
- importer: () => import("./loopApi-C4nN0msL.mjs")
3447
+ importer: () => import("./loopApi-DT751TJA.mjs")
3448
3448
  },
3449
3449
  "169566e7637a22599b4eb32ee3775574e99677406922bbef7482a102036c33dd": {
3450
3450
  functionName: "machineStatus_createServerFn_handler",
3451
- importer: () => import("./machineFns-CkNms3zA.mjs")
3451
+ importer: () => import("./machineFns-BSrIgn3f.mjs")
3452
3452
  },
3453
3453
  "23e290b2b7483ceea6fe669024c35b12c2c4ddd76649f6fab21c958ceda02940": {
3454
3454
  functionName: "listLoops_createServerFn_handler",
3455
- importer: () => import("./loopApi-C4nN0msL.mjs")
3455
+ importer: () => import("./loopApi-DT751TJA.mjs")
3456
3456
  },
3457
3457
  "27d7eba0b6a2257949392fdd56057275a5c5366484ae01faf3b5897a225ecd83": {
3458
3458
  functionName: "finalizeMachine_createServerFn_handler",
3459
- importer: () => import("./machineFns-CkNms3zA.mjs")
3459
+ importer: () => import("./machineFns-BSrIgn3f.mjs")
3460
3460
  },
3461
3461
  "5660ea82ea5ff2549e0ce2f8f070c54f3e9e24fee84d547601ef5d6ef49a4016": {
3462
3462
  functionName: "startLoop_createServerFn_handler",
3463
- importer: () => import("./loopApi-C4nN0msL.mjs")
3463
+ importer: () => import("./loopApi-DT751TJA.mjs")
3464
3464
  },
3465
3465
  "5e0d6b55f5629faac2f55a68661eeb82668b2be752192b16264ffb5cd1e6fabe": {
3466
3466
  functionName: "deleteLoop_createServerFn_handler",
3467
- importer: () => import("./loopApi-C4nN0msL.mjs")
3467
+ importer: () => import("./loopApi-DT751TJA.mjs")
3468
3468
  },
3469
3469
  "6850ba403da9dec5aff45794eb52636ca540ddec2d9e59f5c75ccbb852bfeacb": {
3470
3470
  functionName: "stopRun_createServerFn_handler",
3471
- importer: () => import("./loopApi-C4nN0msL.mjs")
3471
+ importer: () => import("./loopApi-DT751TJA.mjs")
3472
3472
  },
3473
3473
  "85fdf73d4fee43aed762f93c5d47d33200fbff39e2d082647dc921f610d32698": {
3474
3474
  functionName: "loadOlderRuns_createServerFn_handler",
3475
- importer: () => import("./loopApi-C4nN0msL.mjs")
3475
+ importer: () => import("./loopApi-DT751TJA.mjs")
3476
3476
  },
3477
3477
  "95b7483b333d7649e70c848319417e83c2af6a0327bbcda2d0e331f626dffe05": {
3478
3478
  functionName: "pauseLoop_createServerFn_handler",
3479
- importer: () => import("./loopApi-C4nN0msL.mjs")
3479
+ importer: () => import("./loopApi-DT751TJA.mjs")
3480
3480
  },
3481
3481
  "9befe6b8d67ccbbd7aa9b538bde2a161a9894761c8936761a9503fda1a88c0fc": {
3482
3482
  functionName: "patchLoop_createServerFn_handler",
3483
- importer: () => import("./loopApi-C4nN0msL.mjs")
3483
+ importer: () => import("./loopApi-DT751TJA.mjs")
3484
3484
  },
3485
3485
  "a6384dc7154d9930422d29396f5de64b3ac69c62ad3824bc4a22d745fc07b293": {
3486
3486
  functionName: "deleteMachine_createServerFn_handler",
3487
- importer: () => import("./machineFns-CkNms3zA.mjs")
3487
+ importer: () => import("./machineFns-BSrIgn3f.mjs")
3488
3488
  },
3489
3489
  "aa46310016bb8a58b273a648ffd498c87f1f450d12827e30110a3b83ba6a27d9": {
3490
3490
  functionName: "listMachines_createServerFn_handler",
3491
- importer: () => import("./machineFns-CkNms3zA.mjs")
3491
+ importer: () => import("./machineFns-BSrIgn3f.mjs")
3492
3492
  },
3493
3493
  "b050455aacc84dd2a2c9a45517826ad10f91d8f1545e87cc7015784cc7116a97": {
3494
3494
  functionName: "getLoopDetail_createServerFn_handler",
3495
- importer: () => import("./loopApi-C4nN0msL.mjs")
3495
+ importer: () => import("./loopApi-DT751TJA.mjs")
3496
3496
  },
3497
3497
  "b18bbec3d06dfc77714e1e527dfb9172fd7575a64a6c0d6e73ba6dc658dccf0d": {
3498
3498
  functionName: "getArtifacts_createServerFn_handler",
3499
- importer: () => import("./loopApi-C4nN0msL.mjs")
3499
+ importer: () => import("./loopApi-DT751TJA.mjs")
3500
3500
  },
3501
3501
  "b8119d5fe6ca1ed9f609702aa2133b5ac5337030c0bdcf92dc7eba889d6bd2e6": {
3502
3502
  functionName: "getAuthState_createServerFn_handler",
3503
- importer: () => import("./loopApi-C4nN0msL.mjs")
3503
+ importer: () => import("./loopApi-DT751TJA.mjs")
3504
3504
  },
3505
3505
  "cbb6a1b09b309459bbba3dc3851ae85fc468658b3cda77e22b6c6f3e28b65af4": {
3506
3506
  functionName: "getConfig_createServerFn_handler",
3507
- importer: () => import("./loopApi-C4nN0msL.mjs")
3507
+ importer: () => import("./loopApi-DT751TJA.mjs")
3508
3508
  },
3509
3509
  "ce43dcb9366e7c8f7338a6ad28e4290b75a5ee3b13d0d2c9cb585020008f12c6": {
3510
3510
  functionName: "mintConnectKey_createServerFn_handler",
3511
- importer: () => import("./loopApi-C4nN0msL.mjs")
3511
+ importer: () => import("./loopApi-DT751TJA.mjs")
3512
3512
  },
3513
3513
  "e233a461e4526dec3cc4cbaa891a7c3621d5967ce7f32b4fb17e9fb645857b9a": {
3514
3514
  functionName: "stopLoop_createServerFn_handler",
3515
- importer: () => import("./loopApi-C4nN0msL.mjs")
3515
+ importer: () => import("./loopApi-DT751TJA.mjs")
3516
3516
  },
3517
3517
  "ed10d5fe79208e5e0e4e18e4a17b18d7f7db4dd16204c00c3ac90c4644668841": {
3518
3518
  functionName: "getArtifact_createServerFn_handler",
3519
- importer: () => import("./loopApi-C4nN0msL.mjs")
3519
+ importer: () => import("./loopApi-DT751TJA.mjs")
3520
3520
  },
3521
3521
  "ed679b4e1e05e903a5d4ba4a70d9b9d883991ab22ed59b4d2d69078941818415": {
3522
3522
  functionName: "createMachine_createServerFn_handler",
3523
- importer: () => import("./machineFns-CkNms3zA.mjs")
3523
+ importer: () => import("./machineFns-BSrIgn3f.mjs")
3524
3524
  }
3525
3525
  };
3526
3526
  async function getServerFnById(id, access) {
@@ -5352,7 +5352,7 @@ var getBaseManifest = getProdBaseManifest;
5352
5352
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5353
5353
  async function loadEntries() {
5354
5354
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5355
- import("./router-DCNZ2xLm.mjs"),
5355
+ import("./router-BlLlhfJe.mjs"),
5356
5356
  import("./start-4ifArtKx.mjs"),
5357
5357
  import("./empty-plugin-adapters-DKUlnwwl.mjs")
5358
5358
  ]);
@@ -0,0 +1,2 @@
1
+ import { $ as getLoop } from "./loopTags-CXx5UdGf.mjs";
2
+ export { getLoop };
@@ -0,0 +1,2 @@
1
+ import { Lt as mintDeviceToken, ln as rememberConnectKey } from "./loopTags-CXx5UdGf.mjs";
2
+ export { mintDeviceToken, rememberConnectKey };
@@ -1,4 +1,4 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-DkmxsHDK.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-DxLIQ0cc.js
2
2
  var tsrStartManifest = () => ({ routes: {
3
3
  __root__: {
4
4
  filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/__root.tsx",
@@ -18,34 +18,34 @@ var tsrStartManifest = () => ({ routes: {
18
18
  "/loops/$loopId_/runs/$runId"
19
19
  ],
20
20
  preloads: [
21
- "/assets/index-c0XPWXuz.js",
22
- "/assets/actionUi-D8m1FDHO.js",
23
- "/assets/preload-helper-Zcmr31XG.js"
21
+ "/assets/index-CRX2pu0W.js",
22
+ "/assets/actionUi-5PtES4q0.js",
23
+ "/assets/preload-helper-sAZOZb3G.js"
24
24
  ],
25
25
  scripts: [{ attrs: {
26
26
  type: "module",
27
27
  async: !0,
28
- src: "/assets/index-c0XPWXuz.js"
28
+ src: "/assets/index-CRX2pu0W.js"
29
29
  } }]
30
30
  },
31
31
  "/": {
32
32
  filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/index.tsx",
33
33
  children: void 0,
34
34
  preloads: [
35
- "/assets/routes-79D939J4.js",
36
- "/assets/routes-BYgl3Tmv.js",
37
- "/assets/SignIn-CDCdDD1a.js"
35
+ "/assets/routes-Dm_3J2aV.js",
36
+ "/assets/routes-DxF_s3cD.js",
37
+ "/assets/SignIn-CIFwnZtF.js"
38
38
  ]
39
39
  },
40
40
  "/loops/$loopId": {
41
41
  filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/loops.$loopId.tsx",
42
42
  children: void 0,
43
- preloads: ["/assets/loops._loopId-D7i_BGiE.js", "/assets/SignIn-CDCdDD1a.js"]
43
+ preloads: ["/assets/loops._loopId-BsuV-Rmf.js", "/assets/SignIn-CIFwnZtF.js"]
44
44
  },
45
45
  "/loops/$loopId_/runs/$runId": {
46
46
  filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/loops.$loopId_.runs.$runId.tsx",
47
47
  children: void 0,
48
- preloads: ["/assets/loops._loopId_.runs._runId-CksSrEY7.js", "/assets/SignIn-CDCdDD1a.js"]
48
+ preloads: ["/assets/loops._loopId_.runs._runId-DpK_fzmZ.js", "/assets/SignIn-CIFwnZtF.js"]
49
49
  }
50
50
  } });
51
51
  //#endregion
@@ -0,0 +1,5 @@
1
+ ALTER TABLE "loops" ADD COLUMN "tags" text[] DEFAULT ARRAY[]::text[] NOT NULL;
2
+ --> statement-breakpoint
3
+ ALTER TABLE "loops" ADD CONSTRAINT "loops_tags_count_check" CHECK (cardinality("loops"."tags") <= 4);
4
+ --> statement-breakpoint
5
+ ALTER TABLE "loops" ADD CONSTRAINT "loops_tags_reserved_check" CHECK (NOT ("loops"."tags" && ARRAY['all loops', 'active', 'paused', 'blocked']::text[]));
@@ -22,6 +22,13 @@
22
22
  "when": 1785146849044,
23
23
  "tag": "0002_remove_teams",
24
24
  "breakpoints": true
25
+ },
26
+ {
27
+ "idx": 3,
28
+ "version": "7",
29
+ "when": 1786301181156,
30
+ "tag": "0003_add_loop_tags",
31
+ "breakpoints": true
25
32
  }
26
33
  ]
27
34
  }