@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,15 +1,15 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
- import { s as CODING_AGENTS } from "./boot-U-CFI65B.mjs";
2
+ import { Nn as validateLoopTags, s as CODING_AGENTS } from "./loopTags-CXx5UdGf.mjs";
3
3
  import { g as require_react, h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
4
  import { d as useNavigate, u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
5
- import { E as stopLoop, O as useSession, S as runLoop, T as startLoop, b as patchLoop, c as deleteLoop, d as getArtifacts, i as OpenModeWarning, l as deriveLoopLifecycle, m as getLoopDetail, s as daemonStopSupport, t as DAEMON_UPGRADE_REQUIRED, u as getArtifact, v as loadOlderRuns, x as pauseLoop } from "./auth-client-RTpMpT4L.mjs";
6
- import { C as rel, D as sectionHeadCls, O as selectCls, T as runPulseStyle, _ as fmt, a as Loading, b as inputCls, c as btn, d as btnQuiet, g as dur, i as LoadErrorCard, j as useFlash, k as tsShort, l as btnDanger, m as dotLabel, n as ErrorBanner, p as dotColor, r as FlashLine, t as ConfirmBar, u as btnPrimary, x as labelCls, y as humanBytes } from "./actionUi-C_WswNb1.mjs";
7
- import { a as Timeline, c as mergeRuns, n as MachinesModal, t as LoopOverview } from "./MachinesModal-DBIP648Z.mjs";
8
- import { n as artifactKind, t as Route } from "./artifactKind-DRCbYHZU.mjs";
9
- import { t as SignIn } from "./SignIn-Bp3uWaCQ.mjs";
5
+ import { E as stopLoop, O as useSession, S as runLoop, T as startLoop, b as patchLoop, c as deleteLoop, d as getArtifacts, i as OpenModeWarning, l as deriveLoopLifecycle, m as getLoopDetail, s as daemonStopSupport, t as DAEMON_UPGRADE_REQUIRED, u as getArtifact, v as loadOlderRuns, x as pauseLoop } from "./auth-client-lSMb_Idt.mjs";
6
+ import { A as tsShort, E as runPulseStyle, M as useFlash, O as sectionHeadCls, S as labelCls, _ as fmt, a as Loading, b as humanBytes, c as btn, d as btnQuiet, g as dur, i as LoadErrorCard, k as selectCls, l as btnDanger, m as dotLabel, n as ErrorBanner, p as dotColor, r as FlashLine, t as ConfirmBar, u as btnPrimary, w as rel, x as inputCls, y as focusRing } from "./actionUi-5HOCZnom.mjs";
7
+ import { a as Timeline, c as mergeRuns, n as MachinesModal, t as LoopOverview } from "./MachinesModal-BaEtzycr.mjs";
8
+ import { n as artifactKind, t as Route } from "./artifactKind-DwDr8IYc.mjs";
9
+ import { t as SignIn } from "./SignIn-sHQaBQJC.mjs";
10
10
  import { t as purify } from "../_libs/dompurify.mjs";
11
11
  import { t as g } from "../_libs/marked.mjs";
12
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-Q4pRYPip.js
12
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-CXgw2Rz1.js
13
13
  var import_react = /* @__PURE__ */ __toESM(require_react());
14
14
  var import_jsx_runtime = require_jsx_runtime();
15
15
  /** Download URL for one artifact. Each path segment is encoded independently so
@@ -368,6 +368,8 @@ function initState(initial) {
368
368
  const schedule = initial?.schedule;
369
369
  return {
370
370
  name: initial?.name ?? "",
371
+ tags: initial?.tags ?? [],
372
+ tagDraft: "",
371
373
  mode: schedule?.mode ?? "cron",
372
374
  cron: schedule?.mode === "cron" ? schedule.cron : "0 */3 * * *",
373
375
  timezone: schedule?.mode === "cron" ? schedule.timezone : Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC",
@@ -447,10 +449,37 @@ function TextArea({ label, value, onChange, rows = 4, mono, hint }) {
447
449
  var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial }, ref) {
448
450
  const [form, setForm] = (0, import_react.useState)(() => initState(initial));
449
451
  const [error, setError] = (0, import_react.useState)(null);
452
+ const [tagError, setTagError] = (0, import_react.useState)(null);
453
+ const tagsLabelId = (0, import_react.useId)();
454
+ const tagsHintId = (0, import_react.useId)();
455
+ const tagsErrorId = (0, import_react.useId)();
456
+ const tagGroupRef = (0, import_react.useRef)(null);
457
+ const tagInputRef = (0, import_react.useRef)(null);
450
458
  const set = (key, value) => setForm((current) => ({
451
459
  ...current,
452
460
  [key]: value
453
461
  }));
462
+ const commitTagDraft = () => {
463
+ const additions = form.tagDraft.trim() ? [form.tagDraft] : [];
464
+ if (!additions.length) {
465
+ set("tagDraft", "");
466
+ return;
467
+ }
468
+ const result = validateLoopTags([...form.tags, ...additions]);
469
+ if (!result.ok) {
470
+ setTagError(result.detail);
471
+ return;
472
+ }
473
+ setForm((current) => ({
474
+ ...current,
475
+ tags: result.value,
476
+ tagDraft: ""
477
+ }));
478
+ setTagError(null);
479
+ if (result.value.length === 4) requestAnimationFrame(() => {
480
+ if (document.activeElement === document.body) tagGroupRef.current?.focus();
481
+ });
482
+ };
454
483
  (0, import_react.useImperativeHandle)(ref, () => ({ read() {
455
484
  const missing = [
456
485
  ["Name", form.name],
@@ -464,6 +493,12 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial }, ref)
464
493
  setError(`${missing[0]} is required.`);
465
494
  return null;
466
495
  }
496
+ const tagResult = validateLoopTags([...form.tags, ...form.tagDraft.trim() ? [form.tagDraft] : []]);
497
+ if (!tagResult.ok) {
498
+ setTagError(tagResult.detail);
499
+ setError(null);
500
+ return null;
501
+ }
467
502
  const delayMinutes = Number(form.delayMinutes);
468
503
  if (form.mode === "continuous" && (!Number.isInteger(delayMinutes) || delayMinutes < 1)) {
469
504
  setError("Continuous delay must be an integer of at least 1 minute.");
@@ -479,8 +514,10 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial }, ref)
479
514
  delayMinutes
480
515
  };
481
516
  setError(null);
517
+ setTagError(null);
482
518
  return {
483
519
  name: form.name.trim(),
520
+ tags: tagResult.value,
484
521
  schedule,
485
522
  workdir: form.workdir.trim(),
486
523
  agent: form.agent,
@@ -506,6 +543,79 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial }, ref)
506
543
  value: form.name,
507
544
  onChange: (value) => set("name", value)
508
545
  }),
546
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
547
+ className: "min-w-0",
548
+ children: [
549
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
550
+ id: tagsLabelId,
551
+ className: labelCls,
552
+ children: "Tags"
553
+ }),
554
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
555
+ ref: tagGroupRef,
556
+ role: "group",
557
+ tabIndex: -1,
558
+ "aria-labelledby": tagsLabelId,
559
+ "aria-describedby": `${tagsHintId}${tagError ? ` ${tagsErrorId}` : ""}`,
560
+ "aria-invalid": tagError ? "true" : void 0,
561
+ className: "flex min-h-10 flex-wrap items-center gap-1.5 rounded-control border border-wire bg-surface px-2.5 py-1.5 outline-none transition-shadow focus-within:border-transparent focus-within:shadow-focus",
562
+ children: [form.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
563
+ className: "inline-flex h-6 max-w-full items-center gap-1 rounded-full bg-raised px-2.5 text-caption font-medium text-secondary",
564
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
565
+ className: "max-w-52 truncate",
566
+ title: tag,
567
+ children: tag
568
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
569
+ type: "button",
570
+ "aria-label": `Remove tag ${tag}`,
571
+ onClick: () => {
572
+ set("tags", form.tags.filter((value) => value !== tag));
573
+ setTagError(null);
574
+ requestAnimationFrame(() => (tagInputRef.current ?? tagGroupRef.current)?.focus());
575
+ },
576
+ className: `-mr-1 inline-flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-full text-disabled transition-colors hover:bg-surface hover:text-primary ${focusRing}`,
577
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
578
+ "aria-hidden": true,
579
+ children: "×"
580
+ })
581
+ })]
582
+ }, tag)), form.tags.length < 4 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
583
+ ref: tagInputRef,
584
+ "aria-label": "Add tag",
585
+ value: form.tagDraft,
586
+ placeholder: form.tags.length ? "Add another…" : "Add a tag…",
587
+ onChange: (event) => {
588
+ set("tagDraft", event.target.value);
589
+ setTagError(null);
590
+ },
591
+ onKeyDown: (event) => {
592
+ if (event.nativeEvent.isComposing) return;
593
+ if (event.key === "Enter") {
594
+ event.preventDefault();
595
+ commitTagDraft();
596
+ } else if (event.key === "Backspace" && !form.tagDraft && form.tags.length) set("tags", form.tags.slice(0, -1));
597
+ },
598
+ onBlur: commitTagDraft,
599
+ className: "h-6 min-w-28 flex-1 bg-transparent px-1 text-sm text-primary outline-none placeholder:text-disabled"
600
+ })]
601
+ }),
602
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
603
+ id: tagsHintId,
604
+ className: hintCls,
605
+ children: [
606
+ "Up to ",
607
+ 4,
608
+ ". Press Enter to add."
609
+ ]
610
+ }),
611
+ tagError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
612
+ id: tagsErrorId,
613
+ role: "alert",
614
+ className: "mt-1 text-caption text-accent",
615
+ children: tagError
616
+ })
617
+ ]
618
+ }),
509
619
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
510
620
  className: "min-w-0",
511
621
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", {
@@ -971,6 +1081,20 @@ function LoopDetailView({ id }) {
971
1081
  children: configurationScheduleText
972
1082
  })
973
1083
  }),
1084
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Config, {
1085
+ label: "Tags",
1086
+ children: loop.tags.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
1087
+ className: "flex flex-wrap gap-1.5",
1088
+ children: loop.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1089
+ className: "inline-flex h-[22px] max-w-52 items-center truncate rounded-full bg-raised px-2.5 text-caption font-medium text-secondary",
1090
+ title: tag,
1091
+ children: tag
1092
+ }, tag))
1093
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1094
+ className: "text-disabled",
1095
+ children: "None"
1096
+ })
1097
+ }),
974
1098
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Config, {
975
1099
  label: "Working directory",
976
1100
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
@@ -1082,7 +1206,7 @@ function EditHead({ name, onBack }) {
1082
1206
  }),
1083
1207
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
1084
1208
  className: "mt-1.5 text-meta text-secondary",
1085
- children: "Edit the stored schedule, execution settings, prompt, status definitions, and exact artifact paths."
1209
+ children: "Edit tags, schedule, execution settings, prompt, status definitions, and exact artifact paths."
1086
1210
  })
1087
1211
  ] });
1088
1212
  }
@@ -1,7 +1,7 @@
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/loops._loopId_.runs._runId-DNXVmCt5.js
4
- var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-ty3AhkOi.mjs");
2
+ import { f as getAuthState } from "./auth-client-lSMb_Idt.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-Dk94Z0Jq.js
4
+ var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-SASSqOfy.mjs");
5
5
  /**
6
6
  * Run detail PAGE — `/loops/$loopId/runs/$runId`. A standalone page (the trailing
7
7
  * `_` on the `$loopId` segment opts it out of the loop page's component so the run
@@ -1,11 +1,11 @@
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
3
  import { u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
4
- import { D as stopRun, O as useSession, h as getRunDiff, i as OpenModeWarning, m as getLoopDetail, v as loadOlderRuns } from "./auth-client-RTpMpT4L.mjs";
5
- import { D as sectionHeadCls, T as runPulseStyle, _ as fmt, a as Loading, c as btn, g as dur, i as LoadErrorCard, l as btnDanger, o as Pill, s as StatusPill, v as fnum, y as humanBytes } from "./actionUi-C_WswNb1.mjs";
6
- import { t as SignIn } from "./SignIn-Bp3uWaCQ.mjs";
7
- import { t as Route } from "./loops._loopId_.runs._runId-DNXVmCt5.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-ty3AhkOi.js
4
+ import { D as stopRun, O as useSession, h as getRunDiff, i as OpenModeWarning, m as getLoopDetail, v as loadOlderRuns } from "./auth-client-lSMb_Idt.mjs";
5
+ import { E as runPulseStyle, O as sectionHeadCls, _ as fmt, a as Loading, b as humanBytes, c as btn, g as dur, i as LoadErrorCard, l as btnDanger, o as Pill, s as StatusPill, v as fnum } from "./actionUi-5HOCZnom.mjs";
6
+ import { t as SignIn } from "./SignIn-sHQaBQJC.mjs";
7
+ import { t as Route } from "./loops._loopId_.runs._runId-Dk94Z0Jq.mjs";
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-SASSqOfy.js
9
9
  var import_react = /* @__PURE__ */ __toESM(require_react());
10
10
  var import_jsx_runtime = require_jsx_runtime();
11
11
  /**
@@ -1,8 +1,9 @@
1
- import { At as updateMachine, Ct as sha256, D as forceDeleteMachine, L as getMachine, b as createMachine$1, et as listMachines$1, lt as mintDeviceToken, ot as loopsForMachine, st as machineIdFromToken, tt as listMachinesForUser, u as MIN_DAEMON_VERSION, w as ensureServer, x as daemonNeedsUpdate } from "./boot-U-CFI65B.mjs";
2
- import { requestScope } from "./auth-BV0MxVdo.mjs";
1
+ import { Et as listMachinesForUser, G as forceDeleteMachine, Lt as mintDeviceToken, Nt as loopsForMachine, Pt as machineIdFromToken, Sn as sha256, Tt as listMachines$1, et as getMachine, j as createMachine$1, jn as updateMachine } from "./loopTags-CXx5UdGf.mjs";
2
+ import { a as daemonNeedsUpdate, n as MIN_DAEMON_VERSION, o as ensureServer } from "./boot-C472kLwY.mjs";
3
+ import { requestScope } from "./auth-0AamrwHo.mjs";
3
4
  import { n as createServerFn } from "./ssr.mjs";
4
5
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/machineFns-CkNms3zA.js
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/machineFns-BSrIgn3f.js
6
7
  /** Open mode sees every machine; auth mode sees only the signed-in owner's rows. */
7
8
  function machineInScope(machine, scope) {
8
9
  return !scope.enforce || !!scope.userId && machine.userId === scope.userId;
@@ -1,6 +1,6 @@
1
- import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-BV0MxVdo.mjs";
1
+ import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-0AamrwHo.mjs";
2
2
  import { n as DEFAULT_MIGRATION_TABLE, t as DEFAULT_MIGRATION_LOCK_TABLE } from "./kysely-migration-tables-JkVUjPF_-bPAX9LR_.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/node-sqlite-dialect-B_g92oFK.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/node-sqlite-dialect-BbUqnnYv.js
4
4
  var NodeSqliteAdapter = class {
5
5
  get supportsCreateIfNotExists() {
6
6
  return true;
@@ -1,13 +1,13 @@
1
1
  import { j as sql } from "../_libs/drizzle-orm+postgres.mjs";
2
- import { Mt as validPollCurrentRun, Nt as validPollWireId, d as POLL_HTTP_BODY_FIELDS, jt as validOptionalPollString, l as MACHINE_BODY_CAP, mt as readJsonBody, pt as readByteBody, w as ensureServer } from "./boot-U-CFI65B.mjs";
2
+ import { c as readByteBody, f as validOptionalPollString, l as readJsonBody, m as validPollWireId, o as ensureServer, p as validPollCurrentRun, r as POLL_HTTP_BODY_FIELDS, t as MACHINE_BODY_CAP } from "./boot-C472kLwY.mjs";
3
3
  import { h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
4
  import { c as createFileRoute, i as HeadContent, l as createRootRoute, o as createRouter, r as Scripts } from "../_libs/@tanstack/react-router+[...].mjs";
5
- import { r as imageMime, t as Route$12 } from "./artifactKind-DRCbYHZU.mjs";
6
- import { t as Route$13 } from "./loops._loopId_.runs._runId-DNXVmCt5.mjs";
7
- import { n as Route$14 } from "./routes-BaanDO41.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/router-DCNZ2xLm.js
5
+ import { r as imageMime, t as Route$12 } from "./artifactKind-DwDr8IYc.mjs";
6
+ import { t as Route$13 } from "./loops._loopId_.runs._runId-Dk94Z0Jq.mjs";
7
+ import { n as Route$14 } from "./routes-Cr-9yDEH.mjs";
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-BlLlhfJe.js
9
9
  var import_jsx_runtime = require_jsx_runtime();
10
- var app_default = "/assets/app-PPhgN9iN.css";
10
+ var app_default = "/assets/app-DvHMhs7S.css";
11
11
  var Route$11 = createRootRoute({
12
12
  head: () => ({
13
13
  meta: [
@@ -167,7 +167,7 @@ var Route$10 = createFileRoute("/machine/report")({ server: { handlers: { POST:
167
167
  const parsed = await readJsonBody(request, MACHINE_BODY_CAP);
168
168
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
169
169
  const body = parsed.kind === "ok" && parsed.body && typeof parsed.body === "object" ? parsed.body : {};
170
- const { getGateway } = await import("./boot-CsLXrLEa.mjs");
170
+ const { getGateway } = await import("./boot-C472kLwY.mjs").then((n) => n.i).then((n) => n.t);
171
171
  const r = await (await getGateway()).report(token, body);
172
172
  return Response.json(r.body, { status: r.status });
173
173
  } } } });
@@ -207,13 +207,13 @@ var Route$7 = createFileRoute("/api/machine/sync")({ server: { handlers: { POST:
207
207
  const auth = request.headers.get("authorization") ?? "";
208
208
  const token = auth.startsWith("Bearer ") ? auth.slice(7) : "";
209
209
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
210
- const { SYNC_BODY_CAP, parseArtifactSyncBody } = await import("./artifacts-CzDJLaa6.mjs");
210
+ const { SYNC_BODY_CAP, parseArtifactSyncBody } = await import("./artifacts-Cd7Qx3Qp.mjs");
211
211
  const parsed = await readJsonBody(request, SYNC_BODY_CAP);
212
212
  if (parsed.kind === "too-large") return Response.json({ error: "sync body too large" }, { status: 413 });
213
213
  if (parsed.kind === "invalid") return Response.json({ error: "invalid JSON" }, { status: 400 });
214
214
  const body = parseArtifactSyncBody(parsed.body);
215
215
  if (!body) return Response.json({ error: "invalid sync body" }, { status: 400 });
216
- const { getArtifactSync } = await import("./boot-CsLXrLEa.mjs");
216
+ const { getArtifactSync } = await import("./boot-C472kLwY.mjs").then((n) => n.i).then((n) => n.t);
217
217
  const r = await (await getArtifactSync()).sync(token, body);
218
218
  return Response.json(r.body, { status: r.status });
219
219
  } } } });
@@ -223,7 +223,7 @@ var Route$6 = createFileRoute("/api/machine/status")({ server: { handlers: { GET
223
223
  const limited = machineRouteLimit(request, token || void 0);
224
224
  if (limited) return limited;
225
225
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
226
- const { getGateway } = await import("./boot-CsLXrLEa.mjs");
226
+ const { getGateway } = await import("./boot-C472kLwY.mjs").then((n) => n.i).then((n) => n.t);
227
227
  const r = await (await getGateway()).status(token);
228
228
  return Response.json(r.body, { status: r.status });
229
229
  } } } });
@@ -265,7 +265,7 @@ var Route$5 = createFileRoute("/api/machine/poll")({ server: { handlers: { POST:
265
265
  if (parsed.kind !== "ok") return Response.json({ error: "invalid JSON body" }, { status: 400 });
266
266
  const body = parsePollBody(parsed.body);
267
267
  if (!body) return Response.json({ error: "unknown or invalid poll body fields" }, { status: 400 });
268
- const { getGateway } = await import("./boot-CsLXrLEa.mjs");
268
+ const { getGateway } = await import("./boot-C472kLwY.mjs").then((n) => n.i).then((n) => n.t);
269
269
  const r = await (await getGateway()).pollV4Wait(token, gatewayPollRequest(body));
270
270
  return Response.json(r.body, { status: r.status });
271
271
  } } } });
@@ -292,7 +292,7 @@ var Route$4 = createFileRoute("/api/machine/cli")({ server: { handlers: { POST:
292
292
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
293
293
  const body = parsed.kind === "ok" ? parseCliBody(parsed.body) : null;
294
294
  if (!body) return Response.json({ error: "body must be exactly {argv:string[]}" }, { status: 400 });
295
- const { getCliGateway } = await import("./boot-CsLXrLEa.mjs");
295
+ const { getCliGateway } = await import("./boot-C472kLwY.mjs").then((n) => n.i).then((n) => n.t);
296
296
  const r = await (await getCliGateway()).cli(token, body.argv);
297
297
  return Response.json(r.body, { status: r.status });
298
298
  } } } });
@@ -321,7 +321,7 @@ var Route$4 = createFileRoute("/api/machine/cli")({ server: { handlers: { POST:
321
321
  var PROBE_TIMEOUT_MS = 5e3;
322
322
  var Route$3 = createFileRoute("/api/health/db")({ server: { handlers: { GET: async () => {
323
323
  try {
324
- const { db } = await import("./db-BTX-xORB.mjs");
324
+ const { db } = await import("./db-BzvMQ2kx.mjs");
325
325
  const ping = db.execute(sql`select 1`);
326
326
  const timeout = new Promise((_, reject) => {
327
327
  setTimeout(() => reject(/* @__PURE__ */ new Error(`db ping timed out after ${PROBE_TIMEOUT_MS}ms`)), PROBE_TIMEOUT_MS).unref?.();
@@ -340,8 +340,8 @@ var Route$3 = createFileRoute("/api/health/db")({ server: { handlers: { GET: asy
340
340
  }
341
341
  } } } });
342
342
  var Route$2 = createFileRoute("/api/auth/$")({ server: { handlers: {
343
- GET: async ({ request }) => (await import("./auth-BV0MxVdo.mjs")).auth.handler(request),
344
- POST: async ({ request }) => (await import("./auth-BV0MxVdo.mjs")).auth.handler(request)
343
+ GET: async ({ request }) => (await import("./auth-0AamrwHo.mjs")).auth.handler(request),
344
+ POST: async ({ request }) => (await import("./auth-0AamrwHo.mjs")).auth.handler(request)
345
345
  } } });
346
346
  /**
347
347
  * `decodeURIComponent` that returns null on malformed percent-encoding instead
@@ -375,12 +375,12 @@ var Route$1 = createFileRoute("/api/machine/blob/$hash")({ server: { handlers: {
375
375
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
376
376
  const hash = safeDecode(new URL(request.url).pathname.split("/").pop() ?? "");
377
377
  if (hash === null) return Response.json({ error: "bad hash" }, { status: 400 });
378
- const { BLOB_CAP } = await import("./artifacts-CzDJLaa6.mjs");
378
+ const { BLOB_CAP } = await import("./artifacts-Cd7Qx3Qp.mjs");
379
379
  const body = await readByteBody(request, BLOB_CAP);
380
380
  if (body.kind === "too-large") return Response.json({ error: "blob exceeds size cap" }, { status: 413 });
381
381
  if (body.kind === "invalid") return Response.json({ error: "could not read blob body" }, { status: 400 });
382
382
  const buf = Buffer.from(body.bytes.buffer, body.bytes.byteOffset, body.bytes.byteLength);
383
- const { getArtifactSync } = await import("./boot-CsLXrLEa.mjs");
383
+ const { getArtifactSync } = await import("./boot-C472kLwY.mjs").then((n) => n.i).then((n) => n.t);
384
384
  const r = await (await getArtifactSync()).putBlob(token, hash, buf);
385
385
  return Response.json(r.body, { status: r.status });
386
386
  } } } });
@@ -415,11 +415,11 @@ var Route = createFileRoute("/api/artifact/$loopId/$")({ server: { handlers: { G
415
415
  const segments = after.slice(slash + 1).split("/").map((s) => safeDecode(s));
416
416
  if (segments.some((s) => s === null)) return Response.json({ error: "bad path" }, { status: 400 });
417
417
  const relPath = segments.join("/");
418
- const loop = await (await import("./store-DSNbXxqz.mjs")).getLoop(loopId);
418
+ const loop = await (await import("./store-vDZ9INSa.mjs")).getLoop(loopId);
419
419
  if (!loop) return Response.json({ error: "not found" }, { status: 404 });
420
- const { requestScope, canAccessLoop } = await import("./auth-BV0MxVdo.mjs");
420
+ const { requestScope, canAccessLoop } = await import("./auth-0AamrwHo.mjs");
421
421
  if (!canAccessLoop(loop.userId, await requestScope())) return Response.json({ error: "not found" }, { status: 404 });
422
- const { readLoopArtifactBytes } = await import("./artifactFiles-BvVmixrs.mjs");
422
+ const { readLoopArtifactBytes } = await import("./artifactFiles-DO43wwXA.mjs");
423
423
  const r = await readLoopArtifactBytes(loopId, relPath);
424
424
  if (r.status !== 200 || !r.bytes) return Response.json({ error: "not found" }, { status: r.status });
425
425
  const filename = (r.filename || "file").replace(/["\\\r\n]/g, "_");