@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,6 +1,6 @@
1
1
  import { A as sql, C as or, S as notInArray, _ as isNull$1, b as lte, c as asc, d as eq, f as gt, g as isNotNull, h as inArray, l as desc, m as ilike, o as count, p as gte, u as and, v as like, x as ne, y as lt } from "../_libs/drizzle-orm+postgres.mjs";
2
- import { $ as getProtocol, A as defu, H as getBaseURL, I as ensureTeam, J as getHost, K as getEnvVar, L as env, Nt as normalizePathname, Ot as loginGateEnabled, Q as getOrigin, U as getBooleanEnvVar, Wt as resolveBaseURL, Xt as teamIdForUser, _ as capitalizeFirstLetter, a as BetterAuthError, f as ValidationError$1, gt as kAPIErrorHeaderSymbol, ht as isTest, k as db, l as ENV, lt as isProduction, m as betterFetch, mt as isTeamMember, n as APIError$1, nn as wildcardMatch, o as BetterCallError, ot as isDevelopment, r as BASE_ERROR_CODES, st as isDynamicBaseURLConfig, t as APIError, ut as isRequestLike, w as createDefu } from "./boot-BpqTI96x.mjs";
3
- import { C as withSpan, S as shouldPublishLog, _ as logger, a as __getBetterAuthGlobal, b as runWithTransaction, c as createRandomStringGenerator, d as getAuthTables, f as getBetterAuthVersion, g as initGetModelName, h as initGetFieldName, l as generateId$2, m as import_src, n as ATTR_HOOK_TYPE, o as createAdapterFactory, p as getCurrentAdapter, r as ATTR_OPERATION_ID, s as createLogger, t as ATTR_CONTEXT, u as getAsyncLocalStorage, v as queueAfterTransactionHook, x as safeJSONParse, y as runWithAdapter } from "./factory-D73dkxmb.mjs";
2
+ import { $t as teamIdForUser, G as getBooleanEnvVar, It as normalizePathname, J as getEnvVar, M as defu, R as ensureTeam, T as createDefu, W as getBaseURL, X as getHost, _t as isTeamMember, a as BetterAuthError, an as wildcardMatch, ct as isDevelopment, et as getOrigin, ft as isProduction, h as betterFetch, j as db, jt as loginGateEnabled, l as ENV, lt as isDynamicBaseURLConfig, n as APIError$1, o as BetterCallError, p as ValidationError$1, pt as isRequestLike, qt as resolveBaseURL, r as BASE_ERROR_CODES, t as APIError, tt as getProtocol, v as capitalizeFirstLetter, vt as isTest, yt as kAPIErrorHeaderSymbol, z as env } from "./boot-sM4t8RJu.mjs";
3
+ import { C as withSpan, S as shouldPublishLog, _ as logger, a as __getBetterAuthGlobal, b as runWithTransaction, c as createRandomStringGenerator, d as getAuthTables, f as getBetterAuthVersion, g as initGetModelName, h as initGetFieldName, l as generateId$2, m as import_src, n as ATTR_HOOK_TYPE, o as createAdapterFactory, p as getCurrentAdapter, r as ATTR_OPERATION_ID, s as createLogger, t as ATTR_CONTEXT, u as getAsyncLocalStorage, v as queueAfterTransactionHook, x as safeJSONParse, y as runWithAdapter } from "./factory-BQ_XiP23.mjs";
4
4
  import { randomBytes, scrypt } from "node:crypto";
5
5
  import fs from "node:fs";
6
6
  import path from "node:path";
@@ -1700,7 +1700,7 @@ var JOIN_TYPE_SQL = freeze({
1700
1700
  Using: "using"
1701
1701
  });
1702
1702
  //#endregion
1703
- //#region node_modules/.nitro/vite/services/ssr/assets/auth-C6uZpC6v.js
1703
+ //#region node_modules/.nitro/vite/services/ssr/assets/auth-BP81awUE.js
1704
1704
  /**
1705
1705
  * @internal
1706
1706
  */
@@ -15993,7 +15993,7 @@ var createKyselyAdapter = async (config) => {
15993
15993
  if ("getConnection" in db) dialect = new MysqlDialect(db);
15994
15994
  if ("connect" in db) dialect = new PostgresDialect({ pool: db });
15995
15995
  if ("fileControl" in db) {
15996
- const { BunSqliteDialect } = await import("./bun-sqlite-dialect-BW9W1_Ps-DlRsM3s1.mjs");
15996
+ const { BunSqliteDialect } = await import("./bun-sqlite-dialect-BW9W1_Ps-CZJuWL5Z.mjs");
15997
15997
  dialect = new BunSqliteDialect({ database: db });
15998
15998
  }
15999
15999
  if ("createSession" in db) {
@@ -16009,12 +16009,12 @@ var createKyselyAdapter = async (config) => {
16009
16009
  if (error !== null && typeof error === "object" && "code" in error && error.code !== "ERR_UNKNOWN_BUILTIN_MODULE") throw error;
16010
16010
  }
16011
16011
  if (DatabaseSync && db instanceof DatabaseSync) {
16012
- const { NodeSqliteDialect } = await import("./node-sqlite-dialect-01BHn7am.mjs");
16012
+ const { NodeSqliteDialect } = await import("./node-sqlite-dialect-BGlhyZkk.mjs");
16013
16013
  dialect = new NodeSqliteDialect({ database: db });
16014
16014
  }
16015
16015
  }
16016
16016
  if ("batch" in db && "exec" in db && "prepare" in db) {
16017
- const { D1SqliteDialect } = await import("./d1-sqlite-dialect-BLC8LXE6-Ct-4mGlC.mjs");
16017
+ const { D1SqliteDialect } = await import("./d1-sqlite-dialect-BLC8LXE6-C2PCtZfI.mjs");
16018
16018
  dialect = new D1SqliteDialect({ database: db });
16019
16019
  }
16020
16020
  return {
@@ -36526,7 +36526,7 @@ async function getBaseAdapter(options, handleDirectDatabase) {
36526
36526
  acc[key] = [];
36527
36527
  return acc;
36528
36528
  }, {});
36529
- const { memoryAdapter } = await import("./dist-lkoxB9C9.mjs");
36529
+ const { memoryAdapter } = await import("./dist-Z7v6ihws.mjs");
36530
36530
  adapter = memoryAdapter(memoryDB)(options);
36531
36531
  } else if (typeof options.database === "function") adapter = options.database(options);
36532
36532
  else adapter = await handleDirectDatabase(options);
@@ -36540,10 +36540,10 @@ async function getBaseAdapter(options, handleDirectDatabase) {
36540
36540
  }
36541
36541
  async function getAdapter(options) {
36542
36542
  return getBaseAdapter(options, async (opts) => {
36543
- const { createKyselyAdapter } = await import("./kysely-adapter-YDb9pnV-.mjs");
36543
+ const { createKyselyAdapter } = await import("./kysely-adapter-DjQPkqgJ.mjs");
36544
36544
  const { kysely, databaseType, transaction } = await createKyselyAdapter(opts);
36545
36545
  if (!kysely) throw new BetterAuthError("Failed to initialize database adapter");
36546
- const { kyselyAdapter } = await import("./kysely-adapter-YDb9pnV-.mjs");
36546
+ const { kyselyAdapter } = await import("./kysely-adapter-DjQPkqgJ.mjs");
36547
36547
  return kyselyAdapter(kysely, {
36548
36548
  type: databaseType || "sqlite",
36549
36549
  debugLogs: opts.database && "debugLogs" in opts.database ? opts.database.debugLogs : false,
@@ -0,0 +1,2 @@
1
+ import { U as getArtifactSync, Y as getGateway, q as getCliGateway } from "./boot-sM4t8RJu.mjs";
2
+ export { getArtifactSync, getCliGateway, getGateway };
@@ -12,7 +12,7 @@ import os from "node:os";
12
12
  import fs$1 from "node:fs/promises";
13
13
  import { lookup } from "node:dns/promises";
14
14
  import { isIP } from "node:net";
15
- //#region node_modules/.nitro/vite/services/ssr/assets/boot-BpqTI96x.js
15
+ //#region node_modules/.nitro/vite/services/ssr/assets/boot-sM4t8RJu.js
16
16
  var import_pino = /* @__PURE__ */ __toESM(require_pino());
17
17
  var import_pino_pretty = /* @__PURE__ */ __toESM(require_pino_pretty());
18
18
  function defineErrorCodes(codes) {
@@ -3996,6 +3996,45 @@ function machinePresence(online, lastSeen, now = Date.now()) {
3996
3996
  return "offline";
3997
3997
  }
3998
3998
  /**
3999
+ * Tiny semver comparison — just enough to decide "is the daemon older than the
4000
+ * latest published version?" for the web's update hint. No dependency; we only
4001
+ * need numeric-core ordering (major.minor.patch), and a pre-release is treated
4002
+ * as older than its release (a "0.9.0-rc.1" daemon is still behind "0.9.0").
4003
+ */
4004
+ /** Parse the leading numeric core `x.y.z` of a version, ignoring any pre-release
4005
+ * / build suffix. Returns null when it isn't a recognizable version. */
4006
+ function core(v) {
4007
+ const m = /^\s*v?(\d+)\.(\d+)\.(\d+)/.exec(v);
4008
+ if (!m) return null;
4009
+ return [
4010
+ Number(m[1]),
4011
+ Number(m[2]),
4012
+ Number(m[3])
4013
+ ];
4014
+ }
4015
+ /** Does `v` carry a pre-release suffix (e.g. "1.2.3-rc.1")? */
4016
+ function isPre(v) {
4017
+ return /^\s*v?\d+\.\d+\.\d+-/.test(v);
4018
+ }
4019
+ /**
4020
+ * `true` when `current` is strictly older than `latest`. Returns `false` on any
4021
+ * unparseable/equal/newer input — the hint is opt-in, so we only ever show it
4022
+ * when we can be confident the daemon is genuinely behind.
4023
+ */
4024
+ function isOutdated(current, latest) {
4025
+ if (!current || !latest) return false;
4026
+ const a = core(current);
4027
+ const b = core(latest);
4028
+ if (!a || !b) return false;
4029
+ for (let i = 0; i < 3; i++) {
4030
+ const ai = a[i];
4031
+ const bi = b[i];
4032
+ if (ai < bi) return true;
4033
+ if (ai > bi) return false;
4034
+ }
4035
+ return isPre(current) && !isPre(latest);
4036
+ }
4037
+ /**
3999
4038
  * Machine-route ingress: read + parse a JSON request body under a hard size cap.
4000
4039
  * The gateway's per-field wire caps (WIRE_TEXT_CAP etc.) clip individual strings
4001
4040
  * AFTER parse — without this, an unbounded `request.json()` still buffers an
@@ -5336,6 +5375,23 @@ async function schemaKeysInUse(loopId) {
5336
5375
  return [...keys];
5337
5376
  }
5338
5377
  /**
5378
+ * Lowest daemon package version this server may safely dispatch work to.
5379
+ *
5380
+ * Keep this as a coarse package-version gate: if a future server changes the
5381
+ * prompt/CLI/report protocol incompatibly, bump this constant to the matching
5382
+ * daemon release. Unknown versions are treated as incompatible because only
5383
+ * daemons that report a version can be known-safe for breaking protocol changes.
5384
+ */
5385
+ var MIN_DAEMON_VERSION = "2.0.1";
5386
+ function daemonNeedsUpdate(current, required = MIN_DAEMON_VERSION) {
5387
+ if (!current) return true;
5388
+ if (current === required) return false;
5389
+ return isOutdated(current, required);
5390
+ }
5391
+ function daemonUpgradeCommand() {
5392
+ return "npm install -g @kky42/pievo@latest && pievo daemon restart";
5393
+ }
5394
+ /**
5339
5395
  * Machine gateway - the run-lifecycle core of the HTTP surface the daemon talks
5340
5396
  * to (poll transport: short-poll while a run is in flight, opt-in server-held
5341
5397
  * long-poll while idle). Framework-agnostic like the rest of the gateway
@@ -5853,9 +5909,12 @@ var MachineGateway = class {
5853
5909
  code: "VALIDATION_ERROR"
5854
5910
  }
5855
5911
  };
5856
- const base = await this.poll(deviceToken, request.info, current ? [current.runId] : void 0, request.watchDigest, !current);
5912
+ const machineId = isDeviceTokenShape(deviceToken) ? machineIdFromToken(deviceToken) : "";
5913
+ const priorMachine = machineId ? await getMachine(machineId) : void 0;
5914
+ const reportedVersion = typeof request.info?.version === "string" ? clipText(request.info.version, 64) : priorMachine?.daemonVersion;
5915
+ const needsUpdate = daemonNeedsUpdate(reportedVersion);
5916
+ const base = await this.poll(deviceToken, request.info, current ? [current.runId] : void 0, request.watchDigest, !current && !needsUpdate);
5857
5917
  if (base.status !== 200) return base;
5858
- const machineId = machineIdFromToken(deviceToken);
5859
5918
  if ((await getMachine(machineId))?.daemonProtocol !== 2) await updateMachine(machineId, { daemonProtocol: 2 });
5860
5919
  const running = await runningRunForMachine(machineId);
5861
5920
  const body = base.body;
@@ -5864,6 +5923,11 @@ var MachineGateway = class {
5864
5923
  status: 200,
5865
5924
  body: {
5866
5925
  delivery: current ? null : body.deliveries[0] ?? null,
5926
+ ...needsUpdate ? { needsUpdate: {
5927
+ current: reportedVersion ?? null,
5928
+ required: MIN_DAEMON_VERSION,
5929
+ command: daemonUpgradeCommand()
5930
+ } } : {},
5867
5931
  ...cancelRunId ? { cancelRunId } : {},
5868
5932
  ...current && running && current.runId !== running.id ? { runConflict: {
5869
5933
  daemonRunId: current.runId,
@@ -9233,4 +9297,4 @@ async function getCliGateway() {
9233
9297
  return (await ensureServer()).cliGateway;
9234
9298
  }
9235
9299
  //#endregion
9236
- export { getProtocol as $, updateLoop as $t, defu as A, machineIdFromToken as At, getArtifactFile as B, removeTeamMemberGuarded as Bt, createChannel as C, listRuns as Ct, createMachine as D, logger as Dt, createInvite as E, listTeamsForUser as Et, ensureServer as F, pauseLoop as Ft, getCliGateway as G, safeRelPath as Gt, getBaseURL as H, requestDeleteLoop as Ht, ensureTeam as I, prevRunSnapshot as It, getHost as J, startLoop as Jt, getEnvVar as K, setTeamMemberRoleGuarded as Kt, env as L, readJsonBody as Lt, deleteInvite as M, mintDeviceToken as Mt, deleteMachine as N, normalizePathname as Nt, createTeam as O, loginGateEnabled as Ot, deleteTeamCascade as P, normalizeProviderSetting as Pt, getOrigin as Q, tryDeleteLoop as Qt, evolve_default as R, redeemInviteAtomic as Rt, countRuns as S, listPendingInvites as St, createFetch as T, listTeamMembers as Tt, getBooleanEnvVar as U, requestRunCancel as Ut, getArtifactSync as V, renameTeam as Vt, getChannel as W, resolveBaseURL as Wt, getLoop as X, teamIdForUser as Xt, getInvite as Y, stopLoop as Yt, getMachine as Z, toKebabCase as Zt, capitalizeFirstLetter as _, listArtifactsWithMeta as _t, BetterAuthError as a, hasRunningRun as at, coerceUi as b, listMachines as bt, CODING_AGENTS as c, isPersonalTeam as ct, SYNC_BODY_CAP as d, isSafeUrlScheme as dt, updateMachine as en, getRun as et, ValidationError$1 as f, isTaskEntry as ft, canEvolve as g, kAPIErrorHeaderSymbol as gt, buildFileEntries as h, isTest as ht, BLOB_CAP as i, hasPendingRun as it, deleteChannel as j, machinePresence as jt, db as k, loopsForMachine as kt, ENV as l, isProduction as lt, betterFetch as m, isTeamMember as mt, APIError$1 as n, wildcardMatch as nn, getTeam as nt, BetterCallError as o, isDevelopment as ot, addTeamMember as p, isTaskPath as pt, getGateway as q, sha256 as qt, BASE_ERROR_CODES as r, getTeamMember as rt, CHANNELS as s, isDynamicBaseURLConfig as st, APIError as t, userByEmail as tn, getRunSnapshot as tt, MACHINE_BODY_CAP as u, isRequestLike as ut, coerceCodingAgent as v, listChannels as vt, createDefu as w, listRunsBefore as wt, countLoopsForTeam as x, listMachinesForTeam as xt, coerceStateSchema as y, listLoops as yt, forceDeleteLoop as z, rememberConnectKey as zt };
9300
+ export { getMachine as $, teamIdForUser as $t, daemonNeedsUpdate as A, logger as At, evolve_default as B, readJsonBody as Bt, countRuns as C, listMachines as Ct, createInvite as D, listRunsBefore as Dt, createFetch as E, listRuns as Et, deleteMachine as F, mintDeviceToken as Ft, getBooleanEnvVar as G, requestDeleteLoop as Gt, getArtifactFile as H, rememberConnectKey as Ht, deleteTeamCascade as I, normalizePathname as It, getEnvVar as J, safeRelPath as Jt, getChannel as K, requestRunCancel as Kt, ensureServer as L, normalizeProviderSetting as Lt, defu as M, loopsForMachine as Mt, deleteChannel as N, machineIdFromToken as Nt, createMachine as O, listTeamMembers as Ot, deleteInvite as P, machinePresence as Pt, getLoop as Q, stopLoop as Qt, ensureTeam as R, pauseLoop as Rt, countLoopsForTeam as S, listLoops as St, createDefu as T, listPendingInvites as Tt, getArtifactSync as U, removeTeamMemberGuarded as Ut, forceDeleteLoop as V, redeemInviteAtomic as Vt, getBaseURL as W, renameTeam as Wt, getHost as X, sha256 as Xt, getGateway as Y, setTeamMemberRoleGuarded as Yt, getInvite as Z, startLoop as Zt, canEvolve as _, isTeamMember as _t, BetterAuthError as a, wildcardMatch as an, getTeamMember as at, coerceStateSchema as b, listArtifactsWithMeta as bt, CODING_AGENTS as c, isDevelopment as ct, MIN_DAEMON_VERSION as d, isPersonalTeam as dt, toKebabCase as en, getOrigin as et, SYNC_BODY_CAP as f, isProduction as ft, buildFileEntries as g, isTaskPath as gt, betterFetch as h, isTaskEntry as ht, BLOB_CAP as i, userByEmail as in, getTeam as it, db as j, loginGateEnabled as jt, createTeam as k, listTeamsForUser as kt, ENV as l, isDynamicBaseURLConfig as lt, addTeamMember as m, isSafeUrlScheme as mt, APIError$1 as n, updateLoop as nn, getRun as nt, BetterCallError as o, hasPendingRun as ot, ValidationError$1 as p, isRequestLike as pt, getCliGateway as q, resolveBaseURL as qt, BASE_ERROR_CODES as r, updateMachine as rn, getRunSnapshot as rt, CHANNELS as s, hasRunningRun as st, APIError as t, tryDeleteLoop as tn, getProtocol as tt, MACHINE_BODY_CAP as u, isOutdated as ut, capitalizeFirstLetter as v, isTest as vt, createChannel as w, listMachinesForTeam as wt, coerceUi as x, listChannels as xt, coerceCodingAgent as y, kAPIErrorHeaderSymbol as yt, env as z, prevRunSnapshot as zt };
@@ -1,6 +1,6 @@
1
- import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-C6uZpC6v.mjs";
1
+ import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-BP81awUE.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/bun-sqlite-dialect-BW9W1_Ps-DlRsM3s1.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/bun-sqlite-dialect-BW9W1_Ps-CZJuWL5Z.js
4
4
  var BunSqliteAdapter = class {
5
5
  get supportsCreateIfNotExists() {
6
6
  return true;
@@ -1,6 +1,6 @@
1
- import { a as SqliteQueryCompiler, i as SqliteAdapter } from "./auth-C6uZpC6v.mjs";
1
+ import { a as SqliteQueryCompiler, i as SqliteAdapter } from "./auth-BP81awUE.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/d1-sqlite-dialect-BLC8LXE6-Ct-4mGlC.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/d1-sqlite-dialect-BLC8LXE6-C2PCtZfI.js
4
4
  var D1SqliteAdapter = class extends SqliteAdapter {};
5
5
  var D1SqliteDriver = class {
6
6
  #config;
@@ -0,0 +1,2 @@
1
+ import { j as db } from "./boot-sM4t8RJu.mjs";
2
+ export { db };
@@ -1,5 +1,5 @@
1
- import { _ as logger, o as createAdapterFactory } from "./factory-D73dkxmb.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/dist-lkoxB9C9.js
1
+ import { _ as logger, o as createAdapterFactory } from "./factory-BQ_XiP23.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/dist-Z7v6ihws.js
3
3
  /**
4
4
  * Case-insensitive in-memory comparison helpers.
5
5
  * Used when evaluating where clauses in the memory adapter.
@@ -1,5 +1,5 @@
1
- import { K as getEnvVar, L as env, a as BetterAuthError } from "./boot-BpqTI96x.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/factory-D73dkxmb.js
1
+ import { J as getEnvVar, a as BetterAuthError, z as env } from "./boot-sM4t8RJu.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/factory-BQ_XiP23.js
3
3
  var __defProp = Object.defineProperty;
4
4
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
5
5
  var __exportAll = (all, no_symbols) => {
@@ -2,12 +2,12 @@ import { o as __toESM } from "../_runtime.mjs";
2
2
  import { g as require_jsx_runtime, h as require_react } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { l as btnPrimary } from "./ui-WGITbP6Z.mjs";
4
4
  import { d as useNavigate } from "../_libs/@tanstack/react-router+[...].mjs";
5
- import { i as PievoLogo, s as useSession } from "./LoopPlaybook-BxKPoWAp.mjs";
5
+ import { i as PievoLogo, s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
6
6
  import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
7
7
  import { c as redeemTeamInvite } from "./teamFns-D4I-0dEB.mjs";
8
- import { t as Route } from "./invite._token-D-KuiRD1.mjs";
9
- import { t as SignIn } from "./SignIn-C1duN7oy.mjs";
10
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-C80Kxhqw.js
8
+ import { t as Route } from "./invite._token-VKmyC9-R.mjs";
9
+ import { t as SignIn } from "./SignIn-D70NUJsN.mjs";
10
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-CRAl6-yK.js
11
11
  var import_react = /* @__PURE__ */ __toESM(require_react());
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
13
  /**
@@ -1,9 +1,9 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
2
  import { c as getAuthState } from "./loopApi-BfMnXaKT.mjs";
3
- import { a as authClient } from "./LoopPlaybook-BxKPoWAp.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-D-KuiRD1.js
3
+ import { a as authClient } from "./LoopPlaybook-BC9Dvnw2.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-VKmyC9-R.js
5
5
  var $$splitErrorComponentImporter = () => import("./invite._token-23daBIfe.mjs");
6
- var $$splitComponentImporter = () => import("./invite._token-C80Kxhqw.mjs");
6
+ var $$splitComponentImporter = () => import("./invite._token-CRAl6-yK.mjs");
7
7
  /**
8
8
  * Invite-link redeem (`/invite/<token>`, design §4 option B). The recipient opens
9
9
  * the link the owner shared; if signed out (under the gate) they hit the normal
@@ -1,2 +1,2 @@
1
- import { r as kyselyAdapter, t as createKyselyAdapter } from "./auth-C6uZpC6v.mjs";
1
+ import { r as kyselyAdapter, t as createKyselyAdapter } from "./auth-BP81awUE.mjs";
2
2
  export { createKyselyAdapter, kyselyAdapter };
@@ -0,0 +1,2 @@
1
+ import { At as logger } from "./boot-sM4t8RJu.mjs";
2
+ export { logger };
@@ -1,9 +1,9 @@
1
- import { $t as updateLoop, Et as listTeamsForUser, F as ensureServer, Ft as pauseLoop, Ht as requestDeleteLoop, Jt as startLoop, Pt as normalizeProviderSetting, Qt as tryDeleteLoop, Ut as requestRunCancel, W as getChannel, X as getLoop, Yt as stopLoop, Z as getMachine, at as hasRunningRun, b as coerceUi, et as getRun, g as canEvolve, jt as machinePresence, nt as getTeam, rt as getTeamMember, v as coerceCodingAgent, wt as listRunsBefore, y as coerceStateSchema, yt as listLoops, z as forceDeleteLoop } from "./boot-BpqTI96x.mjs";
1
+ import { $ as getMachine, Dt as listRunsBefore, Gt as requestDeleteLoop, K as getChannel, Kt as requestRunCancel, L as ensureServer, Lt as normalizeProviderSetting, Pt as machinePresence, Q as getLoop, Qt as stopLoop, Rt as pauseLoop, St as listLoops, V as forceDeleteLoop, Zt as startLoop, _ as canEvolve, at as getTeamMember, b as coerceStateSchema, it as getTeam, kt as listTeamsForUser, nn as updateLoop, nt as getRun, st as hasRunningRun, tn as tryDeleteLoop, x as coerceUi, y as coerceCodingAgent } from "./boot-sM4t8RJu.mjs";
2
2
  import { n as createServerFn } from "./ssr.mjs";
3
- import { i as toRunSummary, n as toJobDetail, r as toJobSummary } from "./adapters-C10CmWK4.mjs";
4
- import { canAccessLoop, requestScope } from "./auth-C6uZpC6v.mjs";
3
+ import { i as toRunSummary, n as toJobDetail, r as toJobSummary } from "./adapters-D0d1fBKK.mjs";
4
+ import { canAccessLoop, requestScope } from "./auth-BP81awUE.mjs";
5
5
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-BXHLHlt_.js
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-i7xdpokI.js
7
7
  var meta_default$6 = {
8
8
  name: "dependency-triage",
9
9
  label: "Dependency Triage",
@@ -135,7 +135,7 @@ var getAuthState_createServerFn_handler = createServerRpc({
135
135
  filename: "src/server/loopApi.ts"
136
136
  }, (opts) => getAuthState.__executeServer(opts));
137
137
  var getAuthState = createServerFn({ method: "GET" }).handler(getAuthState_createServerFn_handler, async () => {
138
- const { authEnabled } = await import("./auth-C6uZpC6v.mjs");
138
+ const { authEnabled } = await import("./auth-BP81awUE.mjs");
139
139
  return { enabled: authEnabled };
140
140
  });
141
141
  var getConfig_createServerFn_handler = createServerRpc({
@@ -244,7 +244,7 @@ var getArtifacts_createServerFn_handler = createServerRpc({
244
244
  var getArtifacts = createServerFn({ method: "GET" }).validator((d) => d).handler(getArtifacts_createServerFn_handler, async ({ data }) => {
245
245
  await backend();
246
246
  if (!await ownedLoop(data.loopId)) return [];
247
- const { listLoopArtifacts } = await import("./artifactFiles-uxLErS_7.mjs");
247
+ const { listLoopArtifacts } = await import("./artifactFiles-BfE1070_.mjs");
248
248
  return listLoopArtifacts(data.loopId);
249
249
  });
250
250
  var getArtifact_createServerFn_handler = createServerRpc({
@@ -255,7 +255,7 @@ var getArtifact_createServerFn_handler = createServerRpc({
255
255
  var getArtifact = createServerFn({ method: "GET" }).validator((d) => d).handler(getArtifact_createServerFn_handler, async ({ data }) => {
256
256
  await backend();
257
257
  if (!await ownedLoop(data.loopId)) return { error: "file not found" };
258
- const { readLoopArtifact } = await import("./artifactFiles-uxLErS_7.mjs");
258
+ const { readLoopArtifact } = await import("./artifactFiles-BfE1070_.mjs");
259
259
  return readLoopArtifact(data.loopId, data.path);
260
260
  });
261
261
  var getRunDiff_createServerFn_handler = createServerRpc({
@@ -274,7 +274,7 @@ var getRunDiff = createServerFn({ method: "GET" }).validator((d) => d).handler(g
274
274
  hasSnapshot: false,
275
275
  files: []
276
276
  };
277
- const { computeRunDiff } = await import("./runDiff-CyN5ZR5F.mjs");
277
+ const { computeRunDiff } = await import("./runDiff-SlGPjjNq.mjs");
278
278
  return computeRunDiff(data.runId);
279
279
  });
280
280
  var listTemplates_createServerFn_handler = createServerRpc({
@@ -389,7 +389,7 @@ var deleteJob = createServerFn({ method: "POST" }).validator((id) => id).handler
389
389
  if (!await requestDeleteLoop(id)) return { error: "not found" };
390
390
  if (unreachable && mayRetireAuthority) {
391
391
  if (!await forceDeleteLoop(id)) return { error: "delete failed; server data was not deleted" };
392
- const { logger } = await import("./logger-Dhuet6zm.mjs");
392
+ const { logger } = await import("./logger-CHoC5_kz.mjs");
393
393
  logger.child({ mod: "loop-lifecycle" }).warn({
394
394
  action: "unreachable-delete",
395
395
  loopId: id,
@@ -429,7 +429,7 @@ var forceDeleteJob = createServerFn({ method: "POST" }).validator((d) => d).hand
429
429
  }
430
430
  scheduler.removeLoop(data.id);
431
431
  if (!await forceDeleteLoop(data.id)) return { error: "force delete failed; server data was not deleted" };
432
- const { logger } = await import("./logger-Dhuet6zm.mjs");
432
+ const { logger } = await import("./logger-CHoC5_kz.mjs");
433
433
  logger.child({ mod: "loop-lifecycle" }).warn({
434
434
  action: "force-delete",
435
435
  loopId: data.id,
@@ -520,7 +520,7 @@ var mintClaim_createServerFn_handler = createServerRpc({
520
520
  }, (opts) => mintClaim.__executeServer(opts));
521
521
  var mintClaim = createServerFn({ method: "POST" }).validator((teamId) => teamId).handler(mintClaim_createServerFn_handler, async ({ data: teamId }) => {
522
522
  await backend();
523
- const { mintDeviceToken, rememberConnectKey } = await import("./tokens-DuV-D_RB.mjs");
523
+ const { mintDeviceToken, rememberConnectKey } = await import("./tokens-BCOvumer.mjs");
524
524
  const { userId, teamId: active } = await requestScope(teamId);
525
525
  const owner = userId ?? "shared";
526
526
  const token = mintDeviceToken();
@@ -1,18 +1,18 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
2
  import { g as require_jsx_runtime, h as require_react } from "../_libs/@base-ui/react+[...].mjs";
3
- import { c as CODING_AGENTS, ft as isTaskEntry, h as buildFileEntries } from "./boot-BpqTI96x.mjs";
3
+ import { c as CODING_AGENTS, g as buildFileEntries, ht as isTaskEntry } from "./boot-sM4t8RJu.mjs";
4
4
  import { A as sectionHeadCls, C as isCompleted, D as rel, M as tsShort, N as until, S as isClosed, _ as dur, b as humanBytes, c as btnDanger, d as btnQuiet, h as dotLabel, i as Pre, j as selectCls, k as runPulseStyle, l as btnPrimary, m as dotColor, n as Loading, o as btn, p as cronText, r as Pill, s as btnCost, t as ErrorBanner, v as fmt, w as labelCls, x as inputCls } from "./ui-WGITbP6Z.mjs";
5
5
  import { d as useNavigate, u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
6
6
  import { C as stopJob, S as startJob, a as evolveJob, b as requestEdit, d as getJobDetail, g as loadOlderRuns, i as deleteJob, s as getArtifacts, v as patchJob, x as runJob, y as pauseJob } from "./loopApi-BfMnXaKT.mjs";
7
7
  import { n as TaskFileView, r as ViewerHead, t as ArtifactBody } from "./artifactView-CYV1r48i.mjs";
8
8
  import { i as useFlash, n as FlashLine, r as LoadErrorCard, t as ConfirmBar } from "./actionUi-mDYOvJdB.mjs";
9
- import { s as useSession } from "./LoopPlaybook-BxKPoWAp.mjs";
9
+ import { s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
10
10
  import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
11
- import { t as SignIn } from "./SignIn-C1duN7oy.mjs";
11
+ import { t as SignIn } from "./SignIn-D70NUJsN.mjs";
12
12
  import { i as lifecycleDisplay, n as daemonStopSupport, r as deriveLoopLifecycle, t as DAEMON_UPGRADE_REQUIRED } from "./lifecycleUi-l3nx9i3T.mjs";
13
- import { a as listChannels, n as Timeline, s as mergeRuns, t as MachinesModal } from "./notifyFns-qZ6FYwAL.mjs";
14
- import { t as Route } from "./loops._loopId-BVPj6kiH.mjs";
15
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-DVG3dDvp.js
13
+ import { a as listChannels, n as Timeline, s as mergeRuns, t as MachinesModal } from "./notifyFns-DWotltSJ.mjs";
14
+ import { t as Route } from "./loops._loopId-jXSgPWG1.mjs";
15
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-DOPfN_Op.js
16
16
  var import_react = /* @__PURE__ */ __toESM(require_react());
17
17
  var import_jsx_runtime = require_jsx_runtime();
18
18
  /**
@@ -556,7 +556,7 @@ var EDIT_SEEDS = [
556
556
  seed: "Give this loop a goal, and finish it once the goal is met: "
557
557
  }
558
558
  ];
559
- var LoopView = (0, import_react.lazy)(() => import("./LoopView-B0AwFjwS.mjs").then((m) => ({ default: m.LoopView })));
559
+ var LoopView = (0, import_react.lazy)(() => import("./LoopView-Dom6Ad5G.mjs").then((m) => ({ default: m.LoopView })));
560
560
  /**
561
561
  * Loop detail PAGE body (`/loops/$loopId`) — the redesign of the former modal.
562
562
  * One scrolling page: a loop header (name / status / schedule / agent / machine +
@@ -1005,6 +1005,36 @@ function LoopDetailView({ id }) {
1005
1005
  })
1006
1006
  ]
1007
1007
  });
1008
+ const needsUpdateEl = detail.machine.needsUpdate && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1009
+ className: "mb-2.5 flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-control border border-warn/40 bg-warn/10 px-4 py-2.5",
1010
+ children: [
1011
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1012
+ className: "inline-flex items-center gap-2 text-meta font-medium text-primary",
1013
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1014
+ "aria-hidden": true,
1015
+ className: "size-2 rounded-full bg-warn"
1016
+ }), "Daemon update required"]
1017
+ }),
1018
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1019
+ className: "text-meta text-secondary",
1020
+ children: [
1021
+ "This server requires v",
1022
+ detail.machine.requiredDaemonVersion,
1023
+ "; ",
1024
+ detail.machine.name ? `“${detail.machine.name}”` : "the bound machine",
1025
+ " reports ",
1026
+ detail.machine.daemonVersion ? `v${detail.machine.daemonVersion}` : "an unknown version",
1027
+ ". Queued work will wait."
1028
+ ]
1029
+ }),
1030
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
1031
+ type: "button",
1032
+ onClick: () => setMachinesOpen(true),
1033
+ className: "ml-auto cursor-pointer text-meta font-medium text-interactive underline underline-offset-2 transition-colors hover:text-display",
1034
+ children: "Update daemon"
1035
+ })
1036
+ ]
1037
+ });
1008
1038
  const offlineEl = !online && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1009
1039
  className: "mb-2.5 flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-control border border-hairline bg-raised px-4 py-2.5",
1010
1040
  children: [
@@ -1198,6 +1228,7 @@ function LoopDetailView({ id }) {
1198
1228
  className: "mt-5 border-t border-hairline pt-4",
1199
1229
  children: [
1200
1230
  crossTeamEl,
1231
+ needsUpdateEl,
1201
1232
  offlineEl,
1202
1233
  actionErrEl,
1203
1234
  flashLine,
@@ -1,8 +1,8 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
2
  import { c as getAuthState } from "./loopApi-BfMnXaKT.mjs";
3
- import { a as authClient } from "./LoopPlaybook-BxKPoWAp.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-BVPj6kiH.js
5
- var $$splitComponentImporter = () => import("./loops._loopId-DVG3dDvp.mjs");
3
+ import { a as authClient } from "./LoopPlaybook-BC9Dvnw2.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-jXSgPWG1.js
5
+ var $$splitComponentImporter = () => import("./loops._loopId-DOPfN_Op.mjs");
6
6
  /**
7
7
  * Loop detail PAGE — `/loops/$loopId`. The dedicated page that replaced the old
8
8
  * dashboard modal: a loop header + action toolbar, the unified Files panel (task
@@ -1,8 +1,8 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
2
  import { c as getAuthState } from "./loopApi-BfMnXaKT.mjs";
3
- import { a as authClient } from "./LoopPlaybook-BxKPoWAp.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-DbEF9MQu.js
5
- var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-Db6cTcUT.mjs");
3
+ import { a as authClient } from "./LoopPlaybook-BC9Dvnw2.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-BhoM6DWj.js
5
+ var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-DiBP2rCe.mjs");
6
6
  /**
7
7
  * Run detail PAGE — `/loops/$loopId/runs/$runId`. A standalone page (the trailing
8
8
  * `_` on the `$loopId` segment opts it out of the loop page's component so the run
@@ -4,10 +4,10 @@ import { A as sectionHeadCls, _ as dur, a as StatusPill, b as humanBytes, c as b
4
4
  import { u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
5
5
  import { d as getJobDetail, f as getRunDiff, g as loadOlderRuns, w as stopRun } from "./loopApi-BfMnXaKT.mjs";
6
6
  import { r as LoadErrorCard } from "./actionUi-mDYOvJdB.mjs";
7
- import { s as useSession } from "./LoopPlaybook-BxKPoWAp.mjs";
8
- import { t as SignIn } from "./SignIn-C1duN7oy.mjs";
9
- import { t as Route } from "./loops._loopId_.runs._runId-DbEF9MQu.mjs";
10
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-Db6cTcUT.js
7
+ import { s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
8
+ import { t as SignIn } from "./SignIn-D70NUJsN.mjs";
9
+ import { t as Route } from "./loops._loopId_.runs._runId-BhoM6DWj.mjs";
10
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-DiBP2rCe.js
11
11
  var import_react = /* @__PURE__ */ __toESM(require_react());
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
13
  /**
@@ -1,6 +1,6 @@
1
- import { At as machineIdFromToken, D as createMachine$1, F as ensureServer, Mt as mintDeviceToken, N as deleteMachine$1, Z as getMachine, bt as listMachines$1, en as updateMachine, kt as loopsForMachine, qt as sha256, xt as listMachinesForTeam, zt as rememberConnectKey } from "./boot-BpqTI96x.mjs";
1
+ import { $ as getMachine, A as daemonNeedsUpdate, Ct as listMachines$1, F as deleteMachine$1, Ft as mintDeviceToken, Ht as rememberConnectKey, L as ensureServer, Mt as loopsForMachine, Nt as machineIdFromToken, O as createMachine$1, Xt as sha256, d as MIN_DAEMON_VERSION, rn as updateMachine, wt as listMachinesForTeam } from "./boot-sM4t8RJu.mjs";
2
2
  import { n as createServerFn } from "./ssr.mjs";
3
- import { requestScope } from "./auth-C6uZpC6v.mjs";
3
+ import { requestScope } from "./auth-BP81awUE.mjs";
4
4
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
5
5
  //#region node_modules/.nitro/vite/services/ssr/assets/machineScope-2h-fcKmG.js
6
6
  /**
@@ -28,7 +28,7 @@ function tokenVisibleTo(m, scope) {
28
28
  return !scope.enforce || m.userId === scope.userId;
29
29
  }
30
30
  //#endregion
31
- //#region node_modules/.nitro/vite/services/ssr/assets/machineFns-B1ZLIrOn.js
31
+ //#region node_modules/.nitro/vite/services/ssr/assets/machineFns-ChO1NM3C.js
32
32
  /**
33
33
  * Latest published @kky42/pievo version — a cached, fail-silent lookup of the
34
34
  * npm dist-tag `latest`, so the web can tell a user their daemon is outdated and
@@ -165,6 +165,8 @@ async function toSummary(m, scope) {
165
165
  daemonVersion: m.daemonVersion ?? null,
166
166
  daemonProtocol: m.daemonProtocol ?? null,
167
167
  latestDaemonVersion: latestDaemonVersion.get(),
168
+ needsUpdate: daemonNeedsUpdate(m.daemonVersion),
169
+ requiredDaemonVersion: MIN_DAEMON_VERSION,
168
170
  token: tokenVisibleTo(m, scope) ? m.token ?? null : null,
169
171
  loopCount: (await loopsForMachine(m.id)).length
170
172
  };
@@ -1,6 +1,6 @@
1
- import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-C6uZpC6v.mjs";
1
+ import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-BP81awUE.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-01BHn7am.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/node-sqlite-dialect-BGlhyZkk.js
4
4
  var NodeSqliteAdapter = class {
5
5
  get supportsCreateIfNotExists() {
6
6
  return true;
@@ -1,8 +1,8 @@
1
- import { C as createChannel$1, F as ensureServer, W as getChannel, j as deleteChannel$1, s as CHANNELS, vt as listChannels$1 } from "./boot-BpqTI96x.mjs";
1
+ import { K as getChannel, L as ensureServer, N as deleteChannel$1, s as CHANNELS, w as createChannel$1, xt as listChannels$1 } from "./boot-sM4t8RJu.mjs";
2
2
  import { n as createServerFn } from "./ssr.mjs";
3
- import { requestScope } from "./auth-C6uZpC6v.mjs";
3
+ import { requestScope } from "./auth-BP81awUE.mjs";
4
4
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-CM35mqF2.js
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-B1MSIzrT.js
6
6
  /**
7
7
  * Notification-channel server functions. Channels are per-team push targets a
8
8
  * loop can route its run messages to. Secrets (bot token / chat id) live in the