@kky42/pievo-server 2.0.1 → 2.0.2

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 (58) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/app-DzFILlbu.css +2 -0
  3. package/.output/public/assets/{index-Dg07vo1l.js → index-BtvLZjhl.js} +4 -4
  4. package/.output/public/assets/{invite._token-DclJQM6f.js → invite._token-q54LLZ6A.js} +1 -1
  5. package/.output/public/assets/loops._loopId-BCK4oIRv.js +4 -0
  6. package/.output/public/assets/{loops._loopId_.runs._runId-Cz3Z0VE_.js → loops._loopId_.runs._runId-lGYlHXTN.js} +1 -1
  7. package/.output/public/assets/{notifyFns-BDwtMV1G.js → notifyFns-BneSItOi.js} +1 -1
  8. package/.output/public/assets/{routes-DPWJg52d.js → routes-D0zKR7gK.js} +1 -1
  9. package/.output/public/assets/{t._teamId-BW5yIkA-.js → t._teamId-Cn7cRGAh.js} +1 -1
  10. package/.output/server/_ssr/{DashboardView-DJlDpXxU.mjs → DashboardView-BhJBW7IL.mjs} +3 -3
  11. package/.output/server/_ssr/{LoopPlaybook-BxKPoWAp.mjs → LoopPlaybook-BC9Dvnw2.mjs} +2 -2
  12. package/.output/server/_ssr/{LoopView-B0AwFjwS.mjs → LoopView-Dom6Ad5G.mjs} +2 -2
  13. package/.output/server/_ssr/{SignIn-C1duN7oy.mjs → SignIn-D70NUJsN.mjs} +2 -2
  14. package/.output/server/_ssr/{adapters-C10CmWK4.mjs → adapters-D0d1fBKK.mjs} +6 -3
  15. package/.output/server/_ssr/{artifactFiles-uxLErS_7.mjs → artifactFiles-BfE1070_.mjs} +3 -3
  16. package/.output/server/_ssr/artifacts-CSGRJdSy.mjs +2 -0
  17. package/.output/server/_ssr/{auth-C6uZpC6v.mjs → auth-BP81awUE.mjs} +9 -9
  18. package/.output/server/_ssr/boot-pUGFIxSA.mjs +2 -0
  19. package/.output/server/_ssr/{boot-BpqTI96x.mjs → boot-sM4t8RJu.mjs} +68 -4
  20. package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-DlRsM3s1.mjs → bun-sqlite-dialect-BW9W1_Ps-CZJuWL5Z.mjs} +2 -2
  21. package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-Ct-4mGlC.mjs → d1-sqlite-dialect-BLC8LXE6-C2PCtZfI.mjs} +2 -2
  22. package/.output/server/_ssr/db-Cc6I8bWL.mjs +2 -0
  23. package/.output/server/_ssr/{dist-lkoxB9C9.mjs → dist-Z7v6ihws.mjs} +2 -2
  24. package/.output/server/_ssr/{factory-D73dkxmb.mjs → factory-BQ_XiP23.mjs} +2 -2
  25. package/.output/server/_ssr/{invite._token-C80Kxhqw.mjs → invite._token-CRAl6-yK.mjs} +4 -4
  26. package/.output/server/_ssr/{invite._token-D-KuiRD1.mjs → invite._token-VKmyC9-R.mjs} +3 -3
  27. package/.output/server/_ssr/{kysely-adapter-YDb9pnV-.mjs → kysely-adapter-DjQPkqgJ.mjs} +1 -1
  28. package/.output/server/_ssr/logger-CHoC5_kz.mjs +2 -0
  29. package/.output/server/_ssr/{loopApi-BXHLHlt_.mjs → loopApi-i7xdpokI.mjs} +11 -11
  30. package/.output/server/_ssr/{loops._loopId-DVG3dDvp.mjs → loops._loopId-DOPfN_Op.mjs} +38 -7
  31. package/.output/server/_ssr/{loops._loopId-BVPj6kiH.mjs → loops._loopId-jXSgPWG1.mjs} +3 -3
  32. package/.output/server/_ssr/{loops._loopId_.runs._runId-DbEF9MQu.mjs → loops._loopId_.runs._runId-BhoM6DWj.mjs} +3 -3
  33. package/.output/server/_ssr/{loops._loopId_.runs._runId-Db6cTcUT.mjs → loops._loopId_.runs._runId-DiBP2rCe.mjs} +4 -4
  34. package/.output/server/_ssr/{machineFns-B1ZLIrOn.mjs → machineFns-ChO1NM3C.mjs} +5 -3
  35. package/.output/server/_ssr/{node-sqlite-dialect-01BHn7am.mjs → node-sqlite-dialect-BGlhyZkk.mjs} +2 -2
  36. package/.output/server/_ssr/{notifyFns-CM35mqF2.mjs → notifyFns-B1MSIzrT.mjs} +3 -3
  37. package/.output/server/_ssr/{notifyFns-qZ6FYwAL.mjs → notifyFns-DWotltSJ.mjs} +31 -42
  38. package/.output/server/_ssr/{router-B8W3-k_h.mjs → router-BOHN4CWd.mjs} +27 -27
  39. package/.output/server/_ssr/{routes-hr1KuV9-.mjs → routes-BQjhKV-m.mjs} +5 -5
  40. package/.output/server/_ssr/{routes-BiAkIPos.mjs → routes-C2VJzARp.mjs} +4 -4
  41. package/.output/server/_ssr/{runDiff-CyN5ZR5F.mjs → runDiff-SlGPjjNq.mjs} +2 -2
  42. package/.output/server/_ssr/ssr.mjs +48 -48
  43. package/.output/server/_ssr/store-BjXC623Z.mjs +2 -0
  44. package/.output/server/_ssr/{t._teamId-CxuiffZZ.mjs → t._teamId-CRgNlDGk.mjs} +5 -5
  45. package/.output/server/_ssr/{t._teamId-B9E7Vgt3.mjs → t._teamId-o86wLJrg.mjs} +4 -4
  46. package/.output/server/_ssr/{teamFns-DKpLbIiB.mjs → teamFns-C3vnwAqv.mjs} +3 -3
  47. package/.output/server/_ssr/tokens-BCOvumer.mjs +2 -0
  48. package/.output/server/{_tanstack-start-manifest_v-ClkHkr-O.mjs → _tanstack-start-manifest_v-DYC0z7st.mjs} +11 -11
  49. package/.output/server/index.mjs +85 -85
  50. package/package.json +1 -1
  51. package/.output/public/assets/app-Cr02jQtI.css +0 -2
  52. package/.output/public/assets/loops._loopId-vRXeqe7u.js +0 -4
  53. package/.output/server/_ssr/artifacts-Dnvoxi-_.mjs +0 -2
  54. package/.output/server/_ssr/boot-C-47Ycr2.mjs +0 -2
  55. package/.output/server/_ssr/db-DB8pQ07M.mjs +0 -2
  56. package/.output/server/_ssr/logger-Dhuet6zm.mjs +0 -2
  57. package/.output/server/_ssr/store-DUMLJS0E.mjs +0 -2
  58. package/.output/server/_ssr/tokens-DuV-D_RB.mjs +0 -2
@@ -1,12 +1,12 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
2
  import { a as TooltipTrigger, g as require_jsx_runtime, h as require_react, i as TooltipPortal, n as TooltipPopup, o as TooltipRoot, r as TooltipPositioner } from "../_libs/@base-ui/react+[...].mjs";
3
- import { jt as machinePresence } from "./boot-BpqTI96x.mjs";
3
+ import { Pt as machinePresence, ut as isOutdated } from "./boot-sM4t8RJu.mjs";
4
4
  import { C as isCompleted, D as rel, N as until, O as runPulseAnim, P as useHydrated, _ as dur, c as btnDanger, g as dotOpacity, h as dotLabel, l as btnPrimary, m as dotColor, o as btn, t as ErrorBanner, v as fmt, w as labelCls, x as inputCls } from "./ui-WGITbP6Z.mjs";
5
5
  import { n as createServerFn } from "./ssr.mjs";
6
6
  import { l as getConfig, r as createSsrRpc } from "./loopApi-BfMnXaKT.mjs";
7
7
  import { n as ModalHead, r as ModalSection, t as Modal } from "./Modal-CfWC9R49.mjs";
8
8
  import { n as daemonStopSupport } from "./lifecycleUi-l3nx9i3T.mjs";
9
- //#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-qZ6FYwAL.js
9
+ //#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-DWotltSJ.js
10
10
  var import_react = /* @__PURE__ */ __toESM(require_react());
11
11
  var import_jsx_runtime = require_jsx_runtime();
12
12
  /**
@@ -199,45 +199,6 @@ function Timeline({ job, runs, total, onLoadMore, onPickRun }) {
199
199
  ]
200
200
  });
201
201
  }
202
- /**
203
- * Tiny semver comparison — just enough to decide "is the daemon older than the
204
- * latest published version?" for the web's update hint. No dependency; we only
205
- * need numeric-core ordering (major.minor.patch), and a pre-release is treated
206
- * as older than its release (a "0.9.0-rc.1" daemon is still behind "0.9.0").
207
- */
208
- /** Parse the leading numeric core `x.y.z` of a version, ignoring any pre-release
209
- * / build suffix. Returns null when it isn't a recognizable version. */
210
- function core(v) {
211
- const m = /^\s*v?(\d+)\.(\d+)\.(\d+)/.exec(v);
212
- if (!m) return null;
213
- return [
214
- Number(m[1]),
215
- Number(m[2]),
216
- Number(m[3])
217
- ];
218
- }
219
- /** Does `v` carry a pre-release suffix (e.g. "1.2.3-rc.1")? */
220
- function isPre(v) {
221
- return /^\s*v?\d+\.\d+\.\d+-/.test(v);
222
- }
223
- /**
224
- * `true` when `current` is strictly older than `latest`. Returns `false` on any
225
- * unparseable/equal/newer input — the hint is opt-in, so we only ever show it
226
- * when we can be confident the daemon is genuinely behind.
227
- */
228
- function isOutdated(current, latest) {
229
- if (!current || !latest) return false;
230
- const a = core(current);
231
- const b = core(latest);
232
- if (!a || !b) return false;
233
- for (let i = 0; i < 3; i++) {
234
- const ai = a[i];
235
- const bi = b[i];
236
- if (ai < bi) return true;
237
- if (ai > bi) return false;
238
- }
239
- return isPre(current) && !isPre(latest);
240
- }
241
202
  /** User-facing daemon commands. Public UX installs globally; PIEVO_CLI dev
242
203
  * overrides are invoked verbatim and never trigger a global npm install. */
243
204
  function daemonConnectCommand(origin, token, cli, customCli) {
@@ -519,7 +480,35 @@ function MachinesModal({ open, onClose, teamId }) {
519
480
  children: connectCmd(m.token, cliConfig.pievoCli, cliConfig.customCli)
520
481
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: connectCmd(m.token, cliConfig.pievoCli, cliConfig.customCli) })]
521
482
  })] }),
522
- isOutdated(m.daemonVersion, m.latestDaemonVersion) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
483
+ m.needsUpdate && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
484
+ className: "flex flex-col gap-1.5 rounded-control border border-warn/40 bg-warn/10 p-3",
485
+ children: [
486
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
487
+ className: "text-label font-medium text-primary",
488
+ children: "Daemon needs update before this server will dispatch runs."
489
+ }),
490
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
491
+ className: "text-label text-secondary",
492
+ children: [
493
+ "running ",
494
+ m.daemonVersion ? `v${m.daemonVersion}` : "unknown version",
495
+ " · required v",
496
+ m.requiredDaemonVersion
497
+ ]
498
+ }),
499
+ cliConfig ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
500
+ className: "flex items-start gap-2",
501
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
502
+ 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",
503
+ children: daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli)
504
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyButton, { text: daemonUpgradeCommand(cliConfig.pievoCli, cliConfig.customCli) })]
505
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
506
+ className: "text-label text-secondary",
507
+ children: configErr ? "Could not load the upgrade command. Close and try again." : "Loading upgrade command…"
508
+ })
509
+ ]
510
+ }),
511
+ !m.needsUpdate && isOutdated(m.daemonVersion, m.latestDaemonVersion) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
523
512
  className: "flex flex-col gap-1.5",
524
513
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
525
514
  className: "text-label text-secondary",
@@ -1,16 +1,16 @@
1
1
  import { A as sql } from "../_libs/drizzle-orm+postgres.mjs";
2
2
  import { g as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
- import { F as ensureServer, Lt as readJsonBody, R as evolve_default, u as MACHINE_BODY_CAP } from "./boot-BpqTI96x.mjs";
3
+ import { B as evolve_default, Bt as readJsonBody, L as ensureServer, u as MACHINE_BODY_CAP } from "./boot-sM4t8RJu.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
5
  import { n as imageMime } from "./artifactKind-BW0isV8L.mjs";
6
- import { t as Route$17 } from "./invite._token-D-KuiRD1.mjs";
7
- import { t as Route$18 } from "./loops._loopId-BVPj6kiH.mjs";
8
- import { t as Route$19 } from "./loops._loopId_.runs._runId-DbEF9MQu.mjs";
9
- import { t as Route$20 } from "./routes-BiAkIPos.mjs";
10
- import { t as Route$21 } from "./t._teamId-B9E7Vgt3.mjs";
11
- //#region node_modules/.nitro/vite/services/ssr/assets/router-B8W3-k_h.js
6
+ import { t as Route$17 } from "./invite._token-VKmyC9-R.mjs";
7
+ import { t as Route$18 } from "./loops._loopId-jXSgPWG1.mjs";
8
+ import { t as Route$19 } from "./loops._loopId_.runs._runId-BhoM6DWj.mjs";
9
+ import { t as Route$20 } from "./routes-C2VJzARp.mjs";
10
+ import { t as Route$21 } from "./t._teamId-o86wLJrg.mjs";
11
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-BOHN4CWd.js
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
- var app_default = "/assets/app-Cr02jQtI.css";
13
+ var app_default = "/assets/app-DzFILlbu.css";
14
14
  var Route$16 = createRootRoute({
15
15
  head: () => ({
16
16
  meta: [
@@ -176,7 +176,7 @@ var Route$15 = createFileRoute("/machine/report")({ server: { handlers: { POST:
176
176
  const parsed = await readJsonBody(request, MACHINE_BODY_CAP);
177
177
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
178
178
  const body = parsed.kind === "ok" && parsed.body && typeof parsed.body === "object" ? parsed.body : {};
179
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
179
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
180
180
  const r = await (await getGateway()).report(token, body);
181
181
  return Response.json(r.body, { status: r.status });
182
182
  } } } });
@@ -223,7 +223,7 @@ var Route$11 = createFileRoute("/agent-api/loop")({ server: { handlers: { POST:
223
223
  exitCode: 1
224
224
  }, { status: 413 });
225
225
  const body = parsed.kind === "ok" ? parsed.body : {};
226
- const { getCliGateway } = await import("./boot-C-47Ycr2.mjs");
226
+ const { getCliGateway } = await import("./boot-pUGFIxSA.mjs");
227
227
  const r = await (await getCliGateway()).agentApi(token, Array.isArray(body.argv) ? body.argv : []);
228
228
  return Response.json(r.body, { status: r.status });
229
229
  } } } });
@@ -242,11 +242,11 @@ var Route$10 = createFileRoute("/api/machine/sync")({ server: { handlers: { POST
242
242
  const auth = request.headers.get("authorization") ?? "";
243
243
  const token = auth.startsWith("Bearer ") ? auth.slice(7) : "";
244
244
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
245
- const { SYNC_BODY_CAP } = await import("./artifacts-Dnvoxi-_.mjs");
245
+ const { SYNC_BODY_CAP } = await import("./artifacts-CSGRJdSy.mjs");
246
246
  const parsed = await readJsonBody(request, SYNC_BODY_CAP);
247
247
  if (parsed.kind === "too-large") return Response.json({ error: "sync body too large" }, { status: 413 });
248
248
  if (parsed.kind === "invalid") return Response.json({ error: "invalid JSON" }, { status: 400 });
249
- const { getArtifactSync } = await import("./boot-C-47Ycr2.mjs");
249
+ const { getArtifactSync } = await import("./boot-pUGFIxSA.mjs");
250
250
  const r = await (await getArtifactSync()).sync(token, parsed.body);
251
251
  return Response.json(r.body, { status: r.status });
252
252
  } } } });
@@ -257,7 +257,7 @@ var Route$9 = createFileRoute("/api/machine/status")({ server: { handlers: { GET
257
257
  const limited = machineRouteLimit(request, token || void 0);
258
258
  if (limited) return limited;
259
259
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
260
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
260
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
261
261
  const r = await (await getGateway()).status(token);
262
262
  return Response.json(r.body, { status: r.status });
263
263
  } } } });
@@ -271,7 +271,7 @@ var Route$8 = createFileRoute("/api/machine/poll")({ server: { handlers: { POST:
271
271
  const parsed = await readJsonBody(request, MACHINE_BODY_CAP);
272
272
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
273
273
  const body = parsed.kind === "ok" ? parsed.body : {};
274
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
274
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
275
275
  const r = await (await getGateway()).pollV2Wait(token, {
276
276
  protocolVersion: body.protocolVersion,
277
277
  currentRun: body.currentRun,
@@ -300,7 +300,7 @@ var Route$7 = createFileRoute("/api/machine/loop")({ server: { handlers: {
300
300
  const parsed = await readJsonBody(request, MACHINE_BODY_CAP);
301
301
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
302
302
  const body = parsed.kind === "ok" ? parsed.body : {};
303
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
303
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
304
304
  const r = await (await getGateway()).createLoop(token, body);
305
305
  return Response.json(r.body, { status: r.status });
306
306
  },
@@ -309,7 +309,7 @@ var Route$7 = createFileRoute("/api/machine/loop")({ server: { handlers: {
309
309
  const limited = machineRouteLimit(request, token || void 0);
310
310
  if (limited) return limited;
311
311
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
312
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
312
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
313
313
  const r = await (await getGateway()).listLoops(token);
314
314
  return Response.json(r.body, { status: r.status });
315
315
  },
@@ -321,7 +321,7 @@ var Route$7 = createFileRoute("/api/machine/loop")({ server: { handlers: {
321
321
  const parsed = await readJsonBody(request, MACHINE_BODY_CAP);
322
322
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
323
323
  const body = parsed.kind === "ok" ? parsed.body : {};
324
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
324
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
325
325
  const r = await (await getGateway()).editLoop(token, body.id, body.patch ?? {}, body.dryRun === true);
326
326
  return Response.json(r.body, { status: r.status });
327
327
  }
@@ -337,7 +337,7 @@ var Route$6 = createFileRoute("/api/machine/log")({ server: { handlers: { GET: a
337
337
  const url = new URL(request.url);
338
338
  const loopId = url.searchParams.get("loopId") ?? "";
339
339
  const limit = url.searchParams.get("limit") ?? void 0;
340
- const { getGateway } = await import("./boot-C-47Ycr2.mjs");
340
+ const { getGateway } = await import("./boot-pUGFIxSA.mjs");
341
341
  const r = await (await getGateway()).loopLog(token, loopId, limit);
342
342
  return Response.json(r.body, { status: r.status });
343
343
  } } } });
@@ -360,7 +360,7 @@ var Route$5 = createFileRoute("/api/machine/cli")({ server: { handlers: { POST:
360
360
  const parsed = await readJsonBody(request, MACHINE_BODY_CAP);
361
361
  if (parsed.kind === "too-large") return Response.json({ error: "body too large" }, { status: 413 });
362
362
  const body = parsed.kind === "ok" ? parsed.body : {};
363
- const { getCliGateway } = await import("./boot-C-47Ycr2.mjs");
363
+ const { getCliGateway } = await import("./boot-pUGFIxSA.mjs");
364
364
  const r = await (await getCliGateway()).cli(token, Array.isArray(body.argv) ? body.argv : []);
365
365
  return Response.json(r.body, { status: r.status });
366
366
  } } } });
@@ -389,7 +389,7 @@ var Route$5 = createFileRoute("/api/machine/cli")({ server: { handlers: { POST:
389
389
  var PROBE_TIMEOUT_MS = 5e3;
390
390
  var Route$4 = createFileRoute("/api/health/db")({ server: { handlers: { GET: async () => {
391
391
  try {
392
- const { db } = await import("./db-DB8pQ07M.mjs");
392
+ const { db } = await import("./db-Cc6I8bWL.mjs");
393
393
  const ping = db.execute(sql`select 1`);
394
394
  const timeout = new Promise((_, reject) => {
395
395
  setTimeout(() => reject(/* @__PURE__ */ new Error(`db ping timed out after ${PROBE_TIMEOUT_MS}ms`)), PROBE_TIMEOUT_MS).unref?.();
@@ -409,8 +409,8 @@ var Route$4 = createFileRoute("/api/health/db")({ server: { handlers: { GET: asy
409
409
  } } } });
410
410
  /** Better Auth handler — GET/POST /api/auth/* (OAuth callbacks, session, sign-out). */
411
411
  var Route$3 = createFileRoute("/api/auth/$")({ server: { handlers: {
412
- GET: async ({ request }) => (await import("./auth-C6uZpC6v.mjs")).auth.handler(request),
413
- POST: async ({ request }) => (await import("./auth-C6uZpC6v.mjs")).auth.handler(request)
412
+ GET: async ({ request }) => (await import("./auth-BP81awUE.mjs")).auth.handler(request),
413
+ POST: async ({ request }) => (await import("./auth-BP81awUE.mjs")).auth.handler(request)
414
414
  } } });
415
415
  var REFERENCES = {
416
416
  "create.md": "# Create a loop\n\nThis machine is already connected — `pievo daemon start` on first capture (see `bootstrap.md`) or the daemon that's been running since. Decide what to build, author it, create it. Use the **pievo-cli** prefix the user pasted (default `pievo`) and, on the first-capture path, the **connect-key** from the capture snippet.\n\n## 1 · Decide what to build\n\nA loop only makes sense with a real task behind it. Read the session you're in and pick the starting point:\n\n- **The user already did a clear task this session**: turn that task into the loop, grounded in the real URLs, paths, commands, and thresholds from the session.\n- **The capture snippet carries a task description**: that description is the intent. Build exactly that loop, grounded in this project's real paths and commands, and confirm anything it leaves open.\n- **There's no task yet**: don't invent a loop. Inspect what this project is, propose a few concrete loops that would be useful FOR IT, and let the user pick.\n\nOnly continue once there's a real intent.\n\n## 2 · Settle cadence, output, and the finish line\n\nNever silently guess how often the loop runs or what each run produces: propose → confirm → build. Propose sensible defaults for this specific task, in one short message, and get a yes or adjustment before creating.\n\n- **Cadence.** Choose **cron** for wall-clock work (for example, every day at 9am your time, every hour, or Monday morning) or **continuous** when the next exec should become ready a fixed number of minutes after the previous exec ends. Continuous delay is at least 1 minute.\n- **Per-run output.** Propose the concrete artifact or message format, e.g. a short markdown summary in `report.md`, a dated markdown product, or a one-line status.\n- **Cheap checks**: if the loop needs a cheap deterministic check, put it in the task file SOP. The exec agent runs the check first; if nothing changed, it reports `no-change` and stops.\n- **Markdown products**: if runs write markdown products, choose a small fixed `type:` vocabulary up front and use flat front matter (`type:`, `title:`, `date:`) so dashboard primitives can index them.\n- **Finish line — only for goal-shaped tasks**: only goal-shaped tasks get a one-line checkable `goal`. Monitor/digest loops omit `goal` and run until paused.\n\n## 3 · Create the loop's folder and task file\n\nEvery loop gets its own folder under the project: `<project>/pievo/<slug>/`. Its task file lives there, and lightweight products land there too.\n\nThis folder is a synced content home, not a scratch workspace. Heavy work products — repo checkouts, git worktrees, `node_modules`, build output, caches — must live outside the loop folder. Write only finished reports/artifacts back into the loop folder.\n\nWrite `<project>/pievo/<slug>/README.md`:\n\n```markdown\n# <Loop name>\n\n## Spec\nWhat this loop checks or does and why, plus the concrete steps / commands / endpoints / files involved. State when to message the user vs. stay silent. If there is a cheap deterministic check, put it here as the first SOP step and say to report `no-change` when it finds no actionable change. If the loop writes markdown products, state the fixed front-matter vocabulary.\n\n## Current understanding\nThe baseline / known state / open issues seeded from this session; each run updates it.\n\n## Timeline\n<!-- one dated entry per run, appended below by the loop -->\n```\n\nKeep the absolute path to `README.md`; it goes in the config as `taskFile`.\n\n## 4 · Author the loop config\n\nA loop uses `scheduleMode: \"cron\" | \"continuous\"`. Cron fires at wall-clock occurrences. Continuous enqueues its next exec only after an exec ends (`done` or `error`) plus `continuousDelayMinutes`; canceled runs, paused/completed loops, and edit/evolve runs do not continue it.\n\nAuthor the config inline and pass it to `pievo new --json`:\n\n```json\n{\n \"name\": \"short human name\",\n \"cron\": \"m h dom mon dow\",\n \"scheduleMode\": \"cron\",\n \"continuousDelayMinutes\": 1,\n \"goal\": \"<one-line checkable finish line — omit for a monitor loop>\",\n \"workdir\": \"<absolute project dir>\",\n \"taskFile\": \"<absolute path to the task file above>\",\n \"model\": \"<optional coding-agent model id>\",\n \"reasoningEffort\": \"<optional provider effort value>\",\n \"stateSchema\": [{ \"key\": \"x\", \"label\": \"X\", \"unit\": \"\" }],\n \"ui\": \"<small dashboard HTML — optional>\",\n \"notify\": \"auto\"\n}\n```\n\nRules:\n\n- Include `taskFile`. There is no `task` field; the agent's standing brief is the task file.\n- Set `workdir` to the absolute project directory when the loop should run in that project.\n- `scheduleMode` defaults to `cron`. For continuous work set `scheduleMode: \"continuous\"` and choose `continuousDelayMinutes` (integer >= 1). Keep a valid `cron`; continuous ignores it but Pievo retains it so switching back restores the prior cadence.\n- `goal` makes the loop closed: each exec run judges it and calls `pievo finish` when met. Omit `goal` for a monitor/digest loop.\n- `model` and `reasoningEffort` are optional arbitrary strings. Include them only when the owner explicitly requests it.\n- `stateSchema` is optional; declare numeric per-run metrics to get a chart. The exec agent records values with `pievo report --state`.\n- `ui` is optional; include a day-one dashboard only when the product/metric shape is already settled.\n\n### Dashboard at create\n\nWhen the product shape is already known, author the initial `ui` now so the loop has a day-one dashboard. Use the primitives from `evolve.md` §3 and bind only declared metrics / documented product types.\n- `notify`: `auto` (only when there's something to say) | `always` | `never`.\n- Don't add `timezone`, `claim`, or auth fields — `pievo new` injects the timezone, connect-key claim, and device token.\n\n## 5 · Validate, then create\n\nPreview first:\n\n```bash\n<pievo-cli> new --json '<config>' --dry-run\n```\n\nCheck the classification matches your intent and the fire times look right. If you authored a `ui` and the preview warns that it was not applied, fix the HTML before creating.\n\nThen create for real:\n\n```bash\n<pievo-cli> new \\\n --json '<config>' \\\n --connect-key <connect-key> \\\n --agent claude-code\n```\n\n`pievo new` detects timezone, injects the claim, records the coding agent, authenticates, validates, and POSTs it. On success, tell the user the loop name + cadence and that the first run will come automatically shortly.\n",
@@ -468,12 +468,12 @@ var Route$1 = createFileRoute("/api/machine/blob/$hash")({ server: { handlers: {
468
468
  if (!token) return Response.json({ error: "missing device token" }, { status: 401 });
469
469
  const hash = safeDecode(new URL(request.url).pathname.split("/").pop() ?? "");
470
470
  if (hash === null) return Response.json({ error: "bad hash" }, { status: 400 });
471
- const { BLOB_CAP } = await import("./artifacts-Dnvoxi-_.mjs");
471
+ const { BLOB_CAP } = await import("./artifacts-CSGRJdSy.mjs");
472
472
  const declared = Number(request.headers.get("content-length") ?? "");
473
473
  if (Number.isFinite(declared) && declared > BLOB_CAP) return Response.json({ error: "blob exceeds size cap" }, { status: 413 });
474
474
  const buf = Buffer.from(await request.arrayBuffer());
475
475
  if (buf.length > BLOB_CAP) return Response.json({ error: "blob exceeds size cap" }, { status: 413 });
476
- const { getArtifactSync } = await import("./boot-C-47Ycr2.mjs");
476
+ const { getArtifactSync } = await import("./boot-pUGFIxSA.mjs");
477
477
  const r = await (await getArtifactSync()).putBlob(token, hash, buf);
478
478
  return Response.json(r.body, { status: r.status });
479
479
  } } } });
@@ -508,11 +508,11 @@ var Route = createFileRoute("/api/artifact/$loopId/$")({ server: { handlers: { G
508
508
  const segments = after.slice(slash + 1).split("/").map((s) => safeDecode(s));
509
509
  if (segments.some((s) => s === null)) return Response.json({ error: "bad path" }, { status: 400 });
510
510
  const relPath = segments.join("/");
511
- const loop = await (await import("./store-DUMLJS0E.mjs")).getLoop(loopId);
511
+ const loop = await (await import("./store-BjXC623Z.mjs")).getLoop(loopId);
512
512
  if (!loop) return Response.json({ error: "not found" }, { status: 404 });
513
- const { requestScope, canAccessLoop } = await import("./auth-C6uZpC6v.mjs");
513
+ const { requestScope, canAccessLoop } = await import("./auth-BP81awUE.mjs");
514
514
  if (!await canAccessLoop(loop.teamId, await requestScope())) return Response.json({ error: "not found" }, { status: 404 });
515
- const { readLoopArtifactBytes } = await import("./artifactFiles-uxLErS_7.mjs");
515
+ const { readLoopArtifactBytes } = await import("./artifactFiles-BfE1070_.mjs");
516
516
  const r = await readLoopArtifactBytes(loopId, relPath);
517
517
  if (r.status !== 200 || !r.bytes) return Response.json({ error: "not found" }, { status: r.status });
518
518
  const filename = (r.filename || "file").replace(/["\\\r\n]/g, "_");
@@ -1,9 +1,9 @@
1
1
  import { g as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
- import { s as useSession } from "./LoopPlaybook-BxKPoWAp.mjs";
3
- import { t as SignIn } from "./SignIn-C1duN7oy.mjs";
4
- import { t as DashboardView } from "./DashboardView-DJlDpXxU.mjs";
5
- import { t as Route } from "./routes-BiAkIPos.mjs";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-hr1KuV9-.js
2
+ import { s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
3
+ import { t as SignIn } from "./SignIn-D70NUJsN.mjs";
4
+ import { t as DashboardView } from "./DashboardView-BhJBW7IL.mjs";
5
+ import { t as Route } from "./routes-C2VJzARp.mjs";
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-BQjhKV-m.js
7
7
  var import_jsx_runtime = require_jsx_runtime();
8
8
  /**
9
9
  * The home route. Under the auth gate it is now a THIN redirect to the explicit
@@ -1,10 +1,10 @@
1
1
  import { c as createFileRoute, p as redirect, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
2
  import { c as getAuthState, h as listTemplates, u as getDefaultTeam } from "./loopApi-BfMnXaKT.mjs";
3
- import { a as authClient } from "./LoopPlaybook-BxKPoWAp.mjs";
4
- import { n as fetchLiveData } from "./DashboardView-DJlDpXxU.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-BiAkIPos.js
3
+ import { a as authClient } from "./LoopPlaybook-BC9Dvnw2.mjs";
4
+ import { n as fetchLiveData } from "./DashboardView-BhJBW7IL.mjs";
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-C2VJzARp.js
6
6
  var $$splitErrorComponentImporter = () => import("./routes-DjaTMZqZ.mjs");
7
- var $$splitComponentImporter = () => import("./routes-hr1KuV9-.mjs");
7
+ var $$splitComponentImporter = () => import("./routes-BQjhKV-m.mjs");
8
8
  /**
9
9
  * The home route. Under the auth gate it is now a THIN redirect to the explicit
10
10
  * team URL (`/t/<lastUsed|personal>`) so the dashboard's team lives in the path
@@ -1,6 +1,6 @@
1
- import { It as prevRunSnapshot, V as getArtifactSync, et as getRun, tt as getRunSnapshot } from "./boot-BpqTI96x.mjs";
1
+ import { U as getArtifactSync, nt as getRun, rt as getRunSnapshot, zt as prevRunSnapshot } from "./boot-sM4t8RJu.mjs";
2
2
  import { t as createTwoFilesPatch } from "../_libs/diff.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/runDiff-CyN5ZR5F.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/runDiff-SlGPjjNq.js
4
4
  /**
5
5
  * Per-run artifact diff (Phase 3). Computed lazily on the SERVER at read time
6
6
  * (no stored diffs): load run N's snapshot + the previous run's snapshot and diff
@@ -1,6 +1,6 @@
1
1
  import { r as __exportAll } from "../_runtime.mjs";
2
2
  import { g as require_jsx_runtime, h as require_react } from "../_libs/@base-ui/react+[...].mjs";
3
- import { i as __exportAll$1 } from "./factory-D73dkxmb.mjs";
3
+ import { i as __exportAll$1 } from "./factory-BQ_XiP23.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";
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -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-ClkHkr-O.mjs");
3421
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DYC0z7st.mjs");
3422
3422
  const startManifest = tsrStartManifest();
3423
3423
  let routes = startManifest.routes;
3424
3424
  routes[rootRouteId];
@@ -3440,183 +3440,183 @@ async function getStartManifest(matchedRoutes) {
3440
3440
  var manifest = {
3441
3441
  "0411aadd2c067b141180921284fb90f371fdeaf031baae51ae289b596e909da8": {
3442
3442
  functionName: "getJobDetail_createServerFn_handler",
3443
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3443
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3444
3444
  },
3445
3445
  "08c28b892712a1b491b120b74c7dcb81761988d31ccea60216d1807b73c1182c": {
3446
3446
  functionName: "getRunDiff_createServerFn_handler",
3447
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3447
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3448
3448
  },
3449
3449
  "0c9031f2f6a9ac0b1c60075833169755ef1815324918d1426c966ac8db563798": {
3450
3450
  functionName: "runJob_createServerFn_handler",
3451
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3451
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3452
3452
  },
3453
3453
  "0cb2218861830aae4338b814b3819e15100942beab970bc4c188f88b8cb6bc7e": {
3454
3454
  functionName: "forceDeleteJob_createServerFn_handler",
3455
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3455
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3456
3456
  },
3457
3457
  "0f279cfe81021a642289ce6e95622e7198aaeab4147880f85824a02ee9ebafcf": {
3458
3458
  functionName: "createTeam_createServerFn_handler",
3459
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3459
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3460
3460
  },
3461
3461
  "0fe12e769203c42f432a927b9cbf13a967a0f9db567b61843598f734afb4f5c6": {
3462
3462
  functionName: "listMyTeams_createServerFn_handler",
3463
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3463
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3464
3464
  },
3465
3465
  "169566e7637a22599b4eb32ee3775574e99677406922bbef7482a102036c33dd": {
3466
3466
  functionName: "machineStatus_createServerFn_handler",
3467
- importer: () => import("./machineFns-B1ZLIrOn.mjs")
3467
+ importer: () => import("./machineFns-ChO1NM3C.mjs")
3468
3468
  },
3469
3469
  "1d8c66fa6397951aa72c16551c8fa41a019fce841a5759eb7d67496ef5e0b250": {
3470
3470
  functionName: "requestEdit_createServerFn_handler",
3471
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3471
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3472
3472
  },
3473
3473
  "27d7eba0b6a2257949392fdd56057275a5c5366484ae01faf3b5897a225ecd83": {
3474
3474
  functionName: "finalizeMachine_createServerFn_handler",
3475
- importer: () => import("./machineFns-B1ZLIrOn.mjs")
3475
+ importer: () => import("./machineFns-ChO1NM3C.mjs")
3476
3476
  },
3477
3477
  "284cb82b5e5cb37242d053b1b14449760d8334e9dadffc6dcbba11db2200a709": {
3478
3478
  functionName: "addTeamMember_createServerFn_handler",
3479
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3479
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3480
3480
  },
3481
3481
  "3155d050a38c0e160018b462404acd048bfbed9e15166920b4bba09ed72ba817": {
3482
3482
  functionName: "listTemplates_createServerFn_handler",
3483
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3483
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3484
3484
  },
3485
3485
  "4646f52fb09b83c9c9cef34836f3c9d03416423c879d9e5ceffcafd9a71ecba6": {
3486
3486
  functionName: "mintClaim_createServerFn_handler",
3487
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3487
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3488
3488
  },
3489
3489
  "4b0db7d6c8f25383a3526598cb0c1881db6cf413e451e9478687c05666461347": {
3490
3490
  functionName: "claimStatus_createServerFn_handler",
3491
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3491
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3492
3492
  },
3493
3493
  "4c664fb177d6aae868b6baeab69348cff67d74d905cc6cf779c43cb37139b0aa": {
3494
3494
  functionName: "pauseJob_createServerFn_handler",
3495
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3495
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3496
3496
  },
3497
3497
  "5721e01d84c20ffde19d2191648d76a7e5ede3bbb4f44efa59107a786947cf27": {
3498
3498
  functionName: "renameTeam_createServerFn_handler",
3499
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3499
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3500
3500
  },
3501
3501
  "5a11dda4e2d3b0b097890c35ad7d447ff7245721b2ddc7f08787402446ef0919": {
3502
3502
  functionName: "listJobs_createServerFn_handler",
3503
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3503
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3504
3504
  },
3505
3505
  "606503961026f5ed240adadfdee20ac0af65ac9dbb67209257ff1fdb9c642324": {
3506
3506
  functionName: "patchJob_createServerFn_handler",
3507
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3507
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3508
3508
  },
3509
3509
  "6850ba403da9dec5aff45794eb52636ca540ddec2d9e59f5c75ccbb852bfeacb": {
3510
3510
  functionName: "stopRun_createServerFn_handler",
3511
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3511
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3512
3512
  },
3513
3513
  "6f5fe23f6da1d4aecc198b6f71a041c0fe29cabb6ccad807bb3f16c23c5bd9cd": {
3514
3514
  functionName: "redeemTeamInvite_createServerFn_handler",
3515
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3515
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3516
3516
  },
3517
3517
  "7732cf412e02d47d9ac3933f09510503ea08428df967d44267ba47bea10d4cc4": {
3518
3518
  functionName: "startJob_createServerFn_handler",
3519
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3519
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3520
3520
  },
3521
3521
  "7cc22b3a0f6b1c4c73463c3401e981ad42caf6487b479b738ee5aeacb11710da": {
3522
3522
  functionName: "canViewTeam_createServerFn_handler",
3523
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3523
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3524
3524
  },
3525
3525
  "85fdf73d4fee43aed762f93c5d47d33200fbff39e2d082647dc921f610d32698": {
3526
3526
  functionName: "loadOlderRuns_createServerFn_handler",
3527
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3527
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3528
3528
  },
3529
3529
  "8a11b8d76ad42203a4bf128db0b8e0f2d6c947300dbee7a51498418404f211cd": {
3530
3530
  functionName: "evolveJob_createServerFn_handler",
3531
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3531
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3532
3532
  },
3533
3533
  "934749369c5760593935c24bfa6f2041d3e82ea02fb7a13dfa7fd32940ac395d": {
3534
3534
  functionName: "stopJob_createServerFn_handler",
3535
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3535
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3536
3536
  },
3537
3537
  "94d1108f156fa2273cb78140852e9c3e368de0b8321db0de932a16567671716f": {
3538
3538
  functionName: "listManagedTeams_createServerFn_handler",
3539
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3539
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3540
3540
  },
3541
3541
  "9defc1b5d0f4316d61621e2c4614a70dc052ad6b7a3aa2ead00836f7d5cb5b4c": {
3542
3542
  functionName: "deleteChannel_createServerFn_handler",
3543
- importer: () => import("./notifyFns-CM35mqF2.mjs")
3543
+ importer: () => import("./notifyFns-B1MSIzrT.mjs")
3544
3544
  },
3545
3545
  "a3326ed8ecd726fbcc28a439bf0012983cbe387d5062e0155096ee5a558e313b": {
3546
3546
  functionName: "removeTeamMember_createServerFn_handler",
3547
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3547
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3548
3548
  },
3549
3549
  "a4e3ae06af7087a3dc291236cf6d5ad272e2f754884c1f948e75a18a4ebada93": {
3550
3550
  functionName: "testChannel_createServerFn_handler",
3551
- importer: () => import("./notifyFns-CM35mqF2.mjs")
3551
+ importer: () => import("./notifyFns-B1MSIzrT.mjs")
3552
3552
  },
3553
3553
  "a6384dc7154d9930422d29396f5de64b3ac69c62ad3824bc4a22d745fc07b293": {
3554
3554
  functionName: "deleteMachine_createServerFn_handler",
3555
- importer: () => import("./machineFns-B1ZLIrOn.mjs")
3555
+ importer: () => import("./machineFns-ChO1NM3C.mjs")
3556
3556
  },
3557
3557
  "aa46310016bb8a58b273a648ffd498c87f1f450d12827e30110a3b83ba6a27d9": {
3558
3558
  functionName: "listMachines_createServerFn_handler",
3559
- importer: () => import("./machineFns-B1ZLIrOn.mjs")
3559
+ importer: () => import("./machineFns-ChO1NM3C.mjs")
3560
3560
  },
3561
3561
  "b18bbec3d06dfc77714e1e527dfb9172fd7575a64a6c0d6e73ba6dc658dccf0d": {
3562
3562
  functionName: "getArtifacts_createServerFn_handler",
3563
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3563
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3564
3564
  },
3565
3565
  "b8119d5fe6ca1ed9f609702aa2133b5ac5337030c0bdcf92dc7eba889d6bd2e6": {
3566
3566
  functionName: "getAuthState_createServerFn_handler",
3567
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3567
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3568
3568
  },
3569
3569
  "b92e9a08eda2d217bf4028f90dbc6bf7d7e8d7c148ebb8a8330286b5935a3fa1": {
3570
3570
  functionName: "revokeTeamInvite_createServerFn_handler",
3571
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3571
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3572
3572
  },
3573
3573
  "bbc1020c771335020ef51b326d74b1649966740f273913d32040fa2c3c9f5f0b": {
3574
3574
  functionName: "createTeamInvite_createServerFn_handler",
3575
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3575
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3576
3576
  },
3577
3577
  "c3762cecd4a15f7eca064bca295255e942d7c3dce65f66f8593ae145fd7859a0": {
3578
3578
  functionName: "setTeamMemberRole_createServerFn_handler",
3579
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3579
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3580
3580
  },
3581
3581
  "c3ccf6ce71809a0cdaf481b15b5fdc5db3a453a508e5841a62034cb1915a7f92": {
3582
3582
  functionName: "deleteJob_createServerFn_handler",
3583
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3583
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3584
3584
  },
3585
3585
  "cbb6a1b09b309459bbba3dc3851ae85fc468658b3cda77e22b6c6f3e28b65af4": {
3586
3586
  functionName: "getConfig_createServerFn_handler",
3587
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3587
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3588
3588
  },
3589
3589
  "ced5641f28e3e64d3b8773ea4c875b78ee305bd08caba90a2207e86ef1ab3327": {
3590
3590
  functionName: "listChannels_createServerFn_handler",
3591
- importer: () => import("./notifyFns-CM35mqF2.mjs")
3591
+ importer: () => import("./notifyFns-B1MSIzrT.mjs")
3592
3592
  },
3593
3593
  "d2372a81af17eb3a7e4c1407d6ef26a8a9522b66fd6a94858cb35c864b270d77": {
3594
3594
  functionName: "deleteTeam_createServerFn_handler",
3595
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3595
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3596
3596
  },
3597
3597
  "d6cb1ea6f7fdaf940fbbe91d6b0898a0d5ac2308f8bc572dc3b856824a1f4581": {
3598
3598
  functionName: "createChannel_createServerFn_handler",
3599
- importer: () => import("./notifyFns-CM35mqF2.mjs")
3599
+ importer: () => import("./notifyFns-B1MSIzrT.mjs")
3600
3600
  },
3601
3601
  "dc0ec955d0d53a150a3e9a4673f98f3509cfb4bd411c512079ae4e94c561b70c": {
3602
3602
  functionName: "getDefaultTeam_createServerFn_handler",
3603
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3603
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3604
3604
  },
3605
3605
  "ed10d5fe79208e5e0e4e18e4a17b18d7f7db4dd16204c00c3ac90c4644668841": {
3606
3606
  functionName: "getArtifact_createServerFn_handler",
3607
- importer: () => import("./loopApi-BXHLHlt_.mjs")
3607
+ importer: () => import("./loopApi-i7xdpokI.mjs")
3608
3608
  },
3609
3609
  "ed679b4e1e05e903a5d4ba4a70d9b9d883991ab22ed59b4d2d69078941818415": {
3610
3610
  functionName: "createMachine_createServerFn_handler",
3611
- importer: () => import("./machineFns-B1ZLIrOn.mjs")
3611
+ importer: () => import("./machineFns-ChO1NM3C.mjs")
3612
3612
  },
3613
3613
  "fc7a4775f418dde12f422ff9ca65d9e07428fb0dc35c9399592c0081467330bf": {
3614
3614
  functionName: "getTeamDetail_createServerFn_handler",
3615
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3615
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3616
3616
  },
3617
3617
  "fe7cc1df829414194e9b0615b86584c8510369da18f4d8805ccd76468cadf2ff": {
3618
3618
  functionName: "leaveTeam_createServerFn_handler",
3619
- importer: () => import("./teamFns-DKpLbIiB.mjs")
3619
+ importer: () => import("./teamFns-C3vnwAqv.mjs")
3620
3620
  }
3621
3621
  };
3622
3622
  async function getServerFnById(id, access) {
@@ -5448,7 +5448,7 @@ var getBaseManifest = getProdBaseManifest;
5448
5448
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5449
5449
  async function loadEntries() {
5450
5450
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5451
- import("./router-B8W3-k_h.mjs"),
5451
+ import("./router-BOHN4CWd.mjs"),
5452
5452
  import("./start-4ifArtKx.mjs"),
5453
5453
  import("./empty-plugin-adapters-DKUlnwwl.mjs")
5454
5454
  ]);
@@ -0,0 +1,2 @@
1
+ import { Q as getLoop } from "./boot-sM4t8RJu.mjs";
2
+ export { getLoop };
@@ -1,9 +1,9 @@
1
1
  import { g as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
- import { s as useSession } from "./LoopPlaybook-BxKPoWAp.mjs";
3
- import { t as SignIn } from "./SignIn-C1duN7oy.mjs";
4
- import { t as DashboardView } from "./DashboardView-DJlDpXxU.mjs";
5
- import { t as Route } from "./t._teamId-B9E7Vgt3.mjs";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/t._teamId-CxuiffZZ.js
2
+ import { s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
3
+ import { t as SignIn } from "./SignIn-D70NUJsN.mjs";
4
+ import { t as DashboardView } from "./DashboardView-BhJBW7IL.mjs";
5
+ import { t as Route } from "./t._teamId-o86wLJrg.mjs";
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/t._teamId-CRgNlDGk.js
7
7
  var import_jsx_runtime = require_jsx_runtime();
8
8
  /**
9
9
  * The explicit-team dashboard (`/t/<teamId>`, Phase 2): the same dashboard scoped
@@ -1,10 +1,10 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
2
  import { c as getAuthState, h as listTemplates, t as canViewTeam } from "./loopApi-BfMnXaKT.mjs";
3
- import { a as authClient } from "./LoopPlaybook-BxKPoWAp.mjs";
4
- import { n as fetchLiveData } from "./DashboardView-DJlDpXxU.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/t._teamId-B9E7Vgt3.js
3
+ import { a as authClient } from "./LoopPlaybook-BC9Dvnw2.mjs";
4
+ import { n as fetchLiveData } from "./DashboardView-BhJBW7IL.mjs";
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/t._teamId-o86wLJrg.js
6
6
  var $$splitErrorComponentImporter = () => import("./t._teamId-D_vi_OuG.mjs");
7
- var $$splitComponentImporter = () => import("./t._teamId-CxuiffZZ.mjs");
7
+ var $$splitComponentImporter = () => import("./t._teamId-CRgNlDGk.mjs");
8
8
  /**
9
9
  * The explicit-team dashboard (`/t/<teamId>`, Phase 2): the same dashboard scoped
10
10
  * to the team in the PATH, so a view is bookmarkable and each browser tab keeps