@kky42/pievo-server 2.4.9 → 2.4.10

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 (65) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{MachinesModal-wxHeRJsP.js → MachinesModal-ByHejech.js} +1 -1
  3. package/.output/public/assets/app-IrlFuBXa.css +2 -0
  4. package/.output/public/assets/{index-DXJGEV9d.js → index-ia26HsP1.js} +3 -3
  5. package/.output/public/assets/{invite._token-DgbAZ8tR.js → invite._token-tDfe3p0Z.js} +1 -1
  6. package/.output/public/assets/{loops._loopId-hqovx5nj.js → loops._loopId-CuYq_XgT.js} +3 -3
  7. package/.output/public/assets/{loops._loopId_.runs._runId-B233CSov.js → loops._loopId_.runs._runId-mOaF51Qu.js} +1 -1
  8. package/.output/public/assets/{routes-BcmIcHul.js → routes-Dbl_3lt_.js} +1 -1
  9. package/.output/public/assets/{t._teamId-CJOyBon9.js → t._teamId-BVsl0EGm.js} +1 -1
  10. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  11. package/.output/server/_ssr/{DashboardView-Dj-FImnr.mjs → DashboardView-BMHMrOfC.mjs} +6 -6
  12. package/.output/server/_ssr/{MachinesModal-C8UdXFwP.mjs → MachinesModal-BhRw7oOx.mjs} +8 -15
  13. package/.output/server/_ssr/{SignIn-kgyyAjxa.mjs → SignIn-BhoZIOUp.mjs} +3 -3
  14. package/.output/server/_ssr/{SocialLinks-ZYIMrv4W.mjs → SocialLinks-DVCLmql0.mjs} +2 -11
  15. package/.output/server/_ssr/{actionUi-DCNmrAjw.mjs → actionUi-Cf6DuEC2.mjs} +2 -2
  16. package/.output/server/_ssr/{artifactFiles-Dg7Csxw-.mjs → artifactFiles-ChuJ4PzC.mjs} +3 -4
  17. package/.output/server/_ssr/{artifactKind-Bex7n005.mjs → artifactKind-DXumOv7c.mjs} +3 -7
  18. package/.output/server/_ssr/{artifacts-CGJQi12P.mjs → artifacts-DOLHJHcd.mjs} +1 -1
  19. package/.output/server/_ssr/{auth-pONvN2Mo.mjs → auth-LwPp_iim.mjs} +9 -13
  20. package/.output/server/_ssr/{boot-DoRoAQuI.mjs → boot-BIxtZHU-.mjs} +61 -209
  21. package/.output/server/_ssr/{boot-DF8p07PC.mjs → boot-D8cj4uZj.mjs} +1 -1
  22. package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-fxdbbtvy.mjs → bun-sqlite-dialect-BW9W1_Ps-CHMDkKqA.mjs} +2 -2
  23. package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-CcOEyONf.mjs → d1-sqlite-dialect-BLC8LXE6-DYum6qky.mjs} +2 -2
  24. package/.output/server/_ssr/db-BphSJs66.mjs +2 -0
  25. package/.output/server/_ssr/{dist-ghpS-jzd.mjs → dist-bWqs5sTy.mjs} +2 -2
  26. package/.output/server/_ssr/{factory-D7WCUKnW.mjs → factory-pBwrjVTI.mjs} +2 -2
  27. package/.output/server/_ssr/{invite._token-hkOJXnJU.mjs → invite._token-CPSvdDox.mjs} +4 -4
  28. package/.output/server/_ssr/{invite._token-YSls7Te8.mjs → invite._token-CRBsTSTZ.mjs} +6 -6
  29. package/.output/server/_ssr/{invite._token-CGzJGIfm.mjs → invite._token-CaTLt92a.mjs} +2 -2
  30. package/.output/server/_ssr/{kysely-adapter-DD_FuS-x.mjs → kysely-adapter-DMf5pFTf.mjs} +1 -1
  31. package/.output/server/_ssr/{lifecycleUi-DOr6Af13.mjs → lifecycleUi-DauKavgx.mjs} +1 -2
  32. package/.output/server/_ssr/logger-EinA2J6y.mjs +2 -0
  33. package/.output/server/_ssr/{loopApi-Vb7RrshX.mjs → loopApi-Im6JSK0p.mjs} +10 -11
  34. package/.output/server/_ssr/{loopProjection-DfpYkHDU.mjs → loopProjection-DIpGR6rp.mjs} +2 -4
  35. package/.output/server/_ssr/{loops._loopId-BKUT85ip.mjs → loops._loopId-B5iPseDG.mjs} +13 -27
  36. package/.output/server/_ssr/{loops._loopId_.runs._runId-CBXFBNrN.mjs → loops._loopId_.runs._runId-BA-P6sGA.mjs} +6 -44
  37. package/.output/server/_ssr/{loops._loopId_.runs._runId-Bha29x1u.mjs → loops._loopId_.runs._runId-DVtG0xYb.mjs} +3 -3
  38. package/.output/server/_ssr/{machineFns-BFBPpfxd.mjs → machineFns-Bb9KNXun.mjs} +3 -5
  39. package/.output/server/_ssr/{node-sqlite-dialect-BDYK0mnk.mjs → node-sqlite-dialect-Dho9YjXb.mjs} +2 -2
  40. package/.output/server/_ssr/{router-DfegU72d.mjs → router-DPz3uoUr.mjs} +22 -30
  41. package/.output/server/_ssr/{routes-BwTvON37.mjs → routes-B9zD2h4Y.mjs} +5 -7
  42. package/.output/server/_ssr/{routes-Bx3C3K_H.mjs → routes-BuILEmHs.mjs} +5 -5
  43. package/.output/server/_ssr/{routes-D5GHah06.mjs → routes-FO0MFfYK.mjs} +2 -2
  44. package/.output/server/_ssr/runDiff-BLdot9mi.mjs +2 -0
  45. package/.output/server/_ssr/ssr.mjs +39 -39
  46. package/.output/server/_ssr/store-CFCp_ggC.mjs +2 -0
  47. package/.output/server/_ssr/{t._teamId-CpPl9_XU.mjs → t._teamId-1t5wOXrV.mjs} +5 -5
  48. package/.output/server/_ssr/{t._teamId-BFs1MfBR.mjs → t._teamId-A37pQ8Vp.mjs} +5 -5
  49. package/.output/server/_ssr/{t._teamId-CrZ7EkUL.mjs → t._teamId-D1BTwhWf.mjs} +2 -2
  50. package/.output/server/_ssr/{teamFns-BVjiPvv8.mjs → teamFns-DfqtuBW2.mjs} +3 -7
  51. package/.output/server/_ssr/{teamFns-3lItAtfc.mjs → teamFns-cI_tsiCv.mjs} +2 -3
  52. package/.output/server/_ssr/{tokens-DUsrVE9g.mjs → tokens-CUz4LDLm.mjs} +1 -1
  53. package/.output/server/_ssr/{ui-BEPYdOmJ.mjs → ui-DGz-q9MT.mjs} +1 -22
  54. package/.output/server/{_tanstack-start-manifest_v-qnHwyto-.mjs → _tanstack-start-manifest_v-CojB4Veh.mjs} +11 -11
  55. package/.output/server/drizzle/0001_add_pi_agent.sql +9 -0
  56. package/.output/server/drizzle/meta/_journal.json +7 -0
  57. package/.output/server/index.mjs +65 -65
  58. package/drizzle/0001_add_pi_agent.sql +9 -0
  59. package/drizzle/meta/_journal.json +7 -0
  60. package/package.json +1 -1
  61. package/.output/public/assets/app-CuZ0I3Mb.css +0 -2
  62. package/.output/server/_ssr/db-DS0gckHd.mjs +0 -2
  63. package/.output/server/_ssr/logger-BuIBg8Jv.mjs +0 -2
  64. package/.output/server/_ssr/runDiff-CcG2PgCn.mjs +0 -2
  65. package/.output/server/_ssr/store-yOJEt4It.mjs +0 -2
@@ -1,2 +1,2 @@
1
- import { I as getArtifactSync, V as getGateway, z as getCliGateway } from "./boot-DoRoAQuI.mjs";
1
+ import { I as getArtifactSync, V as getGateway, z as getCliGateway } from "./boot-BIxtZHU-.mjs";
2
2
  export { getArtifactSync, getCliGateway, getGateway };
@@ -1,6 +1,6 @@
1
- import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-pONvN2Mo.mjs";
1
+ import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-LwPp_iim.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-fxdbbtvy.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/bun-sqlite-dialect-BW9W1_Ps-CHMDkKqA.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-pONvN2Mo.mjs";
1
+ import { a as SqliteQueryCompiler, i as SqliteAdapter } from "./auth-LwPp_iim.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-CcOEyONf.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/d1-sqlite-dialect-BLC8LXE6-DYum6qky.js
4
4
  var D1SqliteAdapter = class extends SqliteAdapter {};
5
5
  var D1SqliteDriver = class {
6
6
  #config;
@@ -0,0 +1,2 @@
1
+ import { E as db } from "./boot-BIxtZHU-.mjs";
2
+ export { db };
@@ -1,5 +1,5 @@
1
- import { _ as logger, o as createAdapterFactory } from "./factory-D7WCUKnW.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/dist-ghpS-jzd.js
1
+ import { _ as logger, o as createAdapterFactory } from "./factory-pBwrjVTI.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/dist-bWqs5sTy.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 { B as getEnvVar, M as env, a as BetterAuthError } from "./boot-DoRoAQuI.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/factory-D7WCUKnW.js
1
+ import { B as getEnvVar, M as env, a as BetterAuthError } from "./boot-BIxtZHU-.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/factory-pBwrjVTI.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) => {
@@ -1,8 +1,8 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
- import { i as authClient, u as getAuthState } from "./SocialLinks-ZYIMrv4W.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-hkOJXnJU.js
4
- var $$splitErrorComponentImporter = () => import("./invite._token-CGzJGIfm.mjs");
5
- var $$splitComponentImporter = () => import("./invite._token-YSls7Te8.mjs");
2
+ import { i as authClient, u as getAuthState } from "./SocialLinks-DVCLmql0.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-CPSvdDox.js
4
+ var $$splitErrorComponentImporter = () => import("./invite._token-CaTLt92a.mjs");
5
+ var $$splitComponentImporter = () => import("./invite._token-CRBsTSTZ.mjs");
6
6
  /** Redeem a team invite after normal gated sign-in. Invites grant membership but
7
7
  * never bypass the login allowlist; open mode has no invite identity to redeem. */
8
8
  var Route = createFileRoute("/invite/$token")({
@@ -1,13 +1,13 @@
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
- import { s as btnPrimary } from "./ui-BEPYdOmJ.mjs";
4
3
  import { d as useNavigate } from "../_libs/@tanstack/react-router+[...].mjs";
5
- import { E as useSession, r as PievoLogo } from "./SocialLinks-ZYIMrv4W.mjs";
4
+ import { E as useSession, r as PievoLogo } from "./SocialLinks-DVCLmql0.mjs";
5
+ import { s as btnPrimary } from "./ui-DGz-q9MT.mjs";
6
6
  import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
7
- import { c as redeemTeamInvite } from "./teamFns-3lItAtfc.mjs";
8
- import { t as Route } from "./invite._token-hkOJXnJU.mjs";
9
- import { t as SignIn } from "./SignIn-kgyyAjxa.mjs";
10
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-YSls7Te8.js
7
+ import { c as redeemTeamInvite } from "./teamFns-cI_tsiCv.mjs";
8
+ import { t as Route } from "./invite._token-CPSvdDox.mjs";
9
+ import { t as SignIn } from "./SignIn-BhoZIOUp.mjs";
10
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-CRBsTSTZ.js
11
11
  var import_react = /* @__PURE__ */ __toESM(require_react());
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
13
  /** Redeem a team invite after normal gated sign-in. Invites grant membership but
@@ -1,7 +1,7 @@
1
1
  import { h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
- import { r as LoadErrorCard } from "./actionUi-DCNmrAjw.mjs";
3
2
  import { f as useRouter } from "../_libs/@tanstack/react-router+[...].mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-CGzJGIfm.js
3
+ import { r as LoadErrorCard } from "./actionUi-Cf6DuEC2.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-CaTLt92a.js
5
5
  var import_jsx_runtime = require_jsx_runtime();
6
6
  /** Redeem a team invite after normal gated sign-in. Invites grant membership but
7
7
  * never bypass the login allowlist; open mode has no invite identity to redeem. */
@@ -1,2 +1,2 @@
1
- import { r as kyselyAdapter, t as createKyselyAdapter } from "./auth-pONvN2Mo.mjs";
1
+ import { r as kyselyAdapter, t as createKyselyAdapter } from "./auth-LwPp_iim.mjs";
2
2
  export { createKyselyAdapter, kyselyAdapter };
@@ -1,6 +1,5 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/lifecycleUi-DOr6Af13.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/lifecycleUi-DauKavgx.js
2
2
  var DAEMON_UPGRADE_REQUIRED = "Daemon upgrade required to stop a running process. Run `npm install -g @kky42/pievo@latest`, then `pievo daemon restart`.";
3
- /** Derive product lifecycle state only from durable server facts. */
4
3
  function deriveLoopLifecycle(loop) {
5
4
  if (loop.deleteRequestedAt != null) return "deleting";
6
5
  const running = loop.runs.find((run) => run.phase === "running");
@@ -0,0 +1,2 @@
1
+ import { vt as logger } from "./boot-BIxtZHU-.mjs";
2
+ export { logger };
@@ -1,9 +1,9 @@
1
- import { $t as validateLoopEdit, A as ensureServer, Ft as requestRunCancel, G as getMachine, J as getRun, Kt as tryDeleteLoop, N as forceDeleteLoop, Pt as requestDeleteLoop, Q as hasRunningRun, Tt as pauseLoop$1, Ut as stopLoop$1, Vt as startLoop$1, W as getLoop, X as getTeamMember, Y as getTeam, _t as listTeamsForUser, dt as listMachines, ft as listMachinesForTeam, ht as listRunsBefore, qt as updateLoop, ut as listLoops$1, xt as machinePresence } from "./boot-DoRoAQuI.mjs";
2
- import { a as toRunSummaries, i as toLoopSummaries, r as toLoopDetail, t as sortLoopSummariesByRecentRun } from "./loopProjection-DfpYkHDU.mjs";
3
- import { canAccessLoop, requestScope } from "./auth-pONvN2Mo.mjs";
1
+ import { $t as validateLoopEdit, A as ensureServer, Ft as requestRunCancel, G as getMachine, J as getRun, Kt as tryDeleteLoop, N as forceDeleteLoop, Pt as requestDeleteLoop, Q as hasRunningRun, Tt as pauseLoop$1, Ut as stopLoop$1, Vt as startLoop$1, W as getLoop, X as getTeamMember, Y as getTeam, _t as listTeamsForUser, dt as listMachines, ft as listMachinesForTeam, ht as listRunsBefore, qt as updateLoop, ut as listLoops$1, xt as machinePresence } from "./boot-BIxtZHU-.mjs";
2
+ import { a as toRunSummaries, i as toLoopSummaries, r as toLoopDetail, t as sortLoopSummariesByRecentRun } from "./loopProjection-DIpGR6rp.mjs";
3
+ import { canAccessLoop, requestScope } from "./auth-LwPp_iim.mjs";
4
4
  import { n as createServerFn } from "./ssr.mjs";
5
5
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-Vb7RrshX.js
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-Im6JSK0p.js
7
7
  /**
8
8
  * Server functions backing the dashboard. They run server-side (createServerFn
9
9
  * → RPC) and call the IN-PROCESS scheduler + store directly — the scheduler
@@ -33,14 +33,13 @@ async function ownedLoop(id) {
33
33
  teamId: scope.teamId
34
34
  };
35
35
  }
36
- /** Whether the auth gate is active (a GitHub OAuth app is configured). */
37
36
  var getAuthState_createServerFn_handler = createServerRpc({
38
37
  id: "b8119d5fe6ca1ed9f609702aa2133b5ac5337030c0bdcf92dc7eba889d6bd2e6",
39
38
  name: "getAuthState",
40
39
  filename: "src/server/loopApi.ts"
41
40
  }, (opts) => getAuthState.__executeServer(opts));
42
41
  var getAuthState = createServerFn({ method: "GET" }).handler(getAuthState_createServerFn_handler, async () => {
43
- const { authEnabled } = await import("./auth-pONvN2Mo.mjs");
42
+ const { authEnabled } = await import("./auth-LwPp_iim.mjs");
44
43
  return { enabled: authEnabled };
45
44
  });
46
45
  var getConfig_createServerFn_handler = createServerRpc({
@@ -150,7 +149,7 @@ var getArtifacts_createServerFn_handler = createServerRpc({
150
149
  var getArtifacts = createServerFn({ method: "GET" }).validator((d) => d).handler(getArtifacts_createServerFn_handler, async ({ data }) => {
151
150
  await backend();
152
151
  if (!await ownedLoop(data.loopId)) return [];
153
- const { listLoopArtifacts } = await import("./artifactFiles-Dg7Csxw-.mjs");
152
+ const { listLoopArtifacts } = await import("./artifactFiles-ChuJ4PzC.mjs");
154
153
  return listLoopArtifacts(data.loopId);
155
154
  });
156
155
  var getArtifact_createServerFn_handler = createServerRpc({
@@ -161,7 +160,7 @@ var getArtifact_createServerFn_handler = createServerRpc({
161
160
  var getArtifact = createServerFn({ method: "GET" }).validator((d) => d).handler(getArtifact_createServerFn_handler, async ({ data }) => {
162
161
  await backend();
163
162
  if (!await ownedLoop(data.loopId)) return { error: "file not found" };
164
- const { readLoopArtifact } = await import("./artifactFiles-Dg7Csxw-.mjs");
163
+ const { readLoopArtifact } = await import("./artifactFiles-ChuJ4PzC.mjs");
165
164
  return readLoopArtifact(data.loopId, data.path);
166
165
  });
167
166
  var getRunDiff_createServerFn_handler = createServerRpc({
@@ -180,7 +179,7 @@ var getRunDiff = createServerFn({ method: "GET" }).validator((d) => d).handler(g
180
179
  hasSnapshot: false,
181
180
  files: []
182
181
  };
183
- const { computeRunDiff } = await import("./runDiff-CcG2PgCn.mjs");
182
+ const { computeRunDiff } = await import("./runDiff-BLdot9mi.mjs");
184
183
  return computeRunDiff(data.runId);
185
184
  });
186
185
  var patchLoop_createServerFn_handler = createServerRpc({
@@ -268,7 +267,7 @@ var deleteLoop = createServerFn({ method: "POST" }).validator((id) => id).handle
268
267
  if (!await requestDeleteLoop(id)) return { error: "not found" };
269
268
  if (unreachable && mayRetireAuthority) {
270
269
  if (!await forceDeleteLoop(id)) return { error: "delete failed; server data was not deleted" };
271
- const { logger } = await import("./logger-BuIBg8Jv.mjs");
270
+ const { logger } = await import("./logger-EinA2J6y.mjs");
272
271
  logger.child({ mod: "loop-lifecycle" }).warn({
273
272
  action: "unreachable-delete",
274
273
  loopId: id,
@@ -328,7 +327,7 @@ var mintClaim_createServerFn_handler = createServerRpc({
328
327
  }, (opts) => mintClaim.__executeServer(opts));
329
328
  var mintClaim = createServerFn({ method: "POST" }).validator((teamId) => teamId).handler(mintClaim_createServerFn_handler, async ({ data: teamId }) => {
330
329
  await backend();
331
- const { mintDeviceToken, rememberConnectKey } = await import("./tokens-DUsrVE9g.mjs");
330
+ const { mintDeviceToken, rememberConnectKey } = await import("./tokens-CUz4LDLm.mjs");
332
331
  const { userId, teamId: active } = await requestScope(teamId);
333
332
  const owner = userId ?? "shared";
334
333
  const token = mintDeviceToken();
@@ -1,6 +1,5 @@
1
- import { G as getMachine, Ht as statusDefinitionsFromLoop, Ot as recentLoopUsage, Q as hasRunningRun, Rt as scheduleFromLoop, T as daemonNeedsUpdate, Z as hasPendingRun, kt as reconciliationStatesForRuns, mt as listRuns, u as MIN_DAEMON_VERSION, xt as machinePresence, y as countRuns } from "./boot-DoRoAQuI.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/loopProjection-DfpYkHDU.js
3
- /** Canonical client projections for persisted loops and runs. */
1
+ import { G as getMachine, Ht as statusDefinitionsFromLoop, Ot as recentLoopUsage, Q as hasRunningRun, Rt as scheduleFromLoop, T as daemonNeedsUpdate, Z as hasPendingRun, kt as reconciliationStatesForRuns, mt as listRuns, u as MIN_DAEMON_VERSION, xt as machinePresence, y as countRuns } from "./boot-BIxtZHU-.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/loopProjection-DIpGR6rp.js
4
3
  var SUMMARY_RUNS = 18;
5
4
  var RECENT_USAGE_WINDOW_MS = 10080 * 60 * 1e3;
6
5
  /** Dashboard order: loops with runs first, most recent run first. The incoming
@@ -47,7 +46,6 @@ async function toRunSummaries(loopId, rows) {
47
46
  const states = await reconciliationStatesForRuns(loopId, rows.map((run) => run.id));
48
47
  return rows.map((run) => toRunSummary(run, states.get(run.id)));
49
48
  }
50
- /** One live artifact_files row → compact UI metadata. */
51
49
  function toArtifactSummary(row) {
52
50
  return {
53
51
  path: row.path,
@@ -1,18 +1,18 @@
1
1
  import { o as __toESM } from "../_runtime.mjs";
2
- import { s as CODING_AGENTS } from "./boot-DoRoAQuI.mjs";
2
+ import { s as CODING_AGENTS } from "./boot-BIxtZHU-.mjs";
3
3
  import { g as require_react, h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
- import { E as tsShort, S as runPulseStyle, T as selectCls, _ as inputCls, a as btn, b as rel, c as btnQuiet, d as dotLabel, g as humanBytes, m as fmt, n as Loading, o as btnDanger, p as dur, r as Pill, s as btnPrimary, t as ErrorBanner, u as dotColor, v as labelCls, w as sectionHeadCls } from "./ui-BEPYdOmJ.mjs";
5
- import { i as useFlash, n as FlashLine, r as LoadErrorCard, t as ConfirmBar } from "./actionUi-DCNmrAjw.mjs";
6
4
  import { d as useNavigate, u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
7
- import { C as startLoop, E as useSession, _ as loadOlderRuns, b as pauseLoop, c as getArtifact, l as getArtifacts, p as getLoopDetail, s as deleteLoop, w as stopLoop, x as runLoop, y as patchLoop } from "./SocialLinks-ZYIMrv4W.mjs";
5
+ import { C as startLoop, E as useSession, _ as loadOlderRuns, b as pauseLoop, c as getArtifact, l as getArtifacts, p as getLoopDetail, s as deleteLoop, w as stopLoop, x as runLoop, y as patchLoop } from "./SocialLinks-DVCLmql0.mjs";
6
+ import { E as tsShort, S as runPulseStyle, T as selectCls, _ as inputCls, a as btn, b as rel, c as btnQuiet, d as dotLabel, g as humanBytes, m as fmt, n as Loading, o as btnDanger, p as dur, r as Pill, s as btnPrimary, t as ErrorBanner, u as dotColor, v as labelCls, w as sectionHeadCls } from "./ui-DGz-q9MT.mjs";
8
7
  import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
9
- import { t as SignIn } from "./SignIn-kgyyAjxa.mjs";
10
- import { n as daemonStopSupport, r as deriveLoopLifecycle, t as DAEMON_UPGRADE_REQUIRED } from "./lifecycleUi-DOr6Af13.mjs";
11
- import { l as mergeRuns, n as MachinesModal, o as Timeline, t as LoopOverview } from "./MachinesModal-C8UdXFwP.mjs";
12
- import { n as artifactKind, t as Route } from "./artifactKind-Bex7n005.mjs";
8
+ import { t as SignIn } from "./SignIn-BhoZIOUp.mjs";
9
+ import { i as useFlash, n as FlashLine, r as LoadErrorCard, t as ConfirmBar } from "./actionUi-Cf6DuEC2.mjs";
10
+ import { n as daemonStopSupport, r as deriveLoopLifecycle, t as DAEMON_UPGRADE_REQUIRED } from "./lifecycleUi-DauKavgx.mjs";
11
+ import { l as mergeRuns, n as MachinesModal, o as Timeline, t as LoopOverview } from "./MachinesModal-BhRw7oOx.mjs";
12
+ import { n as artifactKind, t as Route } from "./artifactKind-DXumOv7c.mjs";
13
13
  import { t as purify } from "../_libs/dompurify.mjs";
14
14
  import { t as g } from "../_libs/marked.mjs";
15
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-BKUT85ip.js
15
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-B5iPseDG.js
16
16
  var import_react = /* @__PURE__ */ __toESM(require_react());
17
17
  var import_jsx_runtime = require_jsx_runtime();
18
18
  /** Download URL for one artifact. Each path segment is encoded independently so
@@ -21,7 +21,6 @@ function downloadHref(loopId, path) {
21
21
  const encodedPath = path.split("/").map(encodeURIComponent).join("/");
22
22
  return `/api/artifact/${encodeURIComponent(loopId)}/${encodedPath}`;
23
23
  }
24
- /** Hardened inline image URL for the same artifact bytes. */
25
24
  function inlineHref(loopId, path) {
26
25
  return `${downloadHref(loopId, path)}?view=inline`;
27
26
  }
@@ -74,14 +73,12 @@ var MD_SANITIZE = {
74
73
  "alt"
75
74
  ]
76
75
  };
77
- /** Markdown string → sanitized HTML string (safe for dangerouslySetInnerHTML). */
78
76
  function renderMarkdown(content) {
79
77
  return purify.sanitize(g.parse(content, {
80
78
  async: false,
81
79
  gfm: true
82
80
  }), MD_SANITIZE);
83
81
  }
84
- /** Render a Markdown artifact through the shared sanitized GFM pipeline. */
85
82
  function MarkdownView({ content }) {
86
83
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
87
84
  className: "artifact-markdown px-5 py-4",
@@ -106,7 +103,6 @@ function MarkdownView({ content }) {
106
103
  * Everything keeps a Download fallback; an oversize (metadata-only) artifact has
107
104
  * no synced bytes to render, so it says so rather than showing an empty pane.
108
105
  */
109
- /** A small monospace caption strip above a file's content (path · meta [· action]). */
110
106
  function ViewerHead({ path, meta, action }) {
111
107
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
112
108
  className: "sticky top-0 z-10 flex flex-wrap items-center gap-x-2 gap-y-1 border-b border-hairline bg-surface px-5 py-2.5",
@@ -126,7 +122,6 @@ function ViewerHead({ path, meta, action }) {
126
122
  ]
127
123
  });
128
124
  }
129
- /** The binary / oversize body - download affordance or the metadata-only note. */
130
125
  function BinaryNotice({ loopId, path, oversize }) {
131
126
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
132
127
  className: "px-5 py-8 text-body text-secondary",
@@ -145,8 +140,6 @@ function BinaryNotice({ loopId, path, oversize }) {
145
140
  ] })
146
141
  });
147
142
  }
148
- /** The viewer's action strip: a Preview/Source toggle (renderable types only)
149
- * plus an always-present Download. Sits just under the content head. */
150
143
  function ViewerActions({ loopId, path, mode, onMode, showToggle }) {
151
144
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
152
145
  className: "flex items-center gap-2 border-b border-hairline bg-surface px-5 py-1.5",
@@ -184,8 +177,6 @@ function HtmlPreview({ html }) {
184
177
  className: "h-[min(70vh,620px)] w-full border-0 bg-white"
185
178
  });
186
179
  }
187
- /** An image artifact, rendered from the hardened inline route (never inlined
188
- * into the app DOM). Falls back to a download prompt if the bytes won't load. */
189
180
  function ImageView({ loopId, file }) {
190
181
  const [failed, setFailed] = (0, import_react.useState)(false);
191
182
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -219,8 +210,6 @@ function ImageView({ loopId, file }) {
219
210
  })]
220
211
  });
221
212
  }
222
- /** A text-bearing artifact (html / markdown / plain text): fetch the bytes, then
223
- * render per its kind with a Preview/Source toggle (html + markdown) + download. */
224
213
  function TextArtifactView({ loopId, file, kind }) {
225
214
  const [loaded, setLoaded] = (0, import_react.useState)({ loading: true });
226
215
  const [mode, setMode] = (0, import_react.useState)("preview");
@@ -269,11 +258,6 @@ function TextArtifactView({ loopId, file, kind }) {
269
258
  })]
270
259
  });
271
260
  }
272
- /**
273
- * One artifact's content body, dispatched by display kind (see `artifactKind`).
274
- * Oversize → metadata-only note (no bytes); image → hardened <img>; other binary
275
- * → download; text-bearing → the fetch-and-render viewer.
276
- */
277
261
  function ArtifactBody({ loopId, file }) {
278
262
  const kind = artifactKind(file.path);
279
263
  if (file.oversize) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BinaryNotice, {
@@ -379,7 +363,8 @@ function LoopFilesPanel({ loopId, configuredPaths, running }) {
379
363
  }
380
364
  var AGENT_LABEL$1 = {
381
365
  "claude-code": "Claude Code",
382
- codex: "Codex"
366
+ codex: "Codex",
367
+ pi: "Pi"
383
368
  };
384
369
  var hintCls = "mt-1 text-caption leading-snug text-disabled";
385
370
  function initState(initial) {
@@ -684,7 +669,8 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial }, ref)
684
669
  });
685
670
  var AGENT_LABEL = {
686
671
  "claude-code": "Claude Code",
687
- codex: "Codex"
672
+ codex: "Codex",
673
+ pi: "Pi"
688
674
  };
689
675
  function LoopDetailView({ id }) {
690
676
  const navigate = useNavigate();
@@ -1,12 +1,12 @@
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
- import { S as runPulseStyle, a as btn, g as humanBytes, h as fnum, i as StatusPill, m as fmt, n as Loading, o as btnDanger, p as dur, r as Pill, w as sectionHeadCls } from "./ui-BEPYdOmJ.mjs";
4
- import { r as LoadErrorCard } from "./actionUi-DCNmrAjw.mjs";
5
3
  import { u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
6
- import { E as useSession, T as stopRun, _ as loadOlderRuns, m as getRunDiff, p as getLoopDetail } from "./SocialLinks-ZYIMrv4W.mjs";
7
- import { t as SignIn } from "./SignIn-kgyyAjxa.mjs";
8
- import { t as Route } from "./loops._loopId_.runs._runId-Bha29x1u.mjs";
9
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-CBXFBNrN.js
4
+ import { E as useSession, T as stopRun, _ as loadOlderRuns, m as getRunDiff, p as getLoopDetail } from "./SocialLinks-DVCLmql0.mjs";
5
+ import { S as runPulseStyle, a as btn, g as humanBytes, h as fnum, i as StatusPill, m as fmt, n as Loading, o as btnDanger, p as dur, r as Pill, w as sectionHeadCls } from "./ui-DGz-q9MT.mjs";
6
+ import { t as SignIn } from "./SignIn-BhoZIOUp.mjs";
7
+ import { r as LoadErrorCard } from "./actionUi-Cf6DuEC2.mjs";
8
+ import { t as Route } from "./loops._loopId_.runs._runId-DVtG0xYb.mjs";
9
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-BA-P6sGA.js
10
10
  var import_react = /* @__PURE__ */ __toESM(require_react());
11
11
  var import_jsx_runtime = require_jsx_runtime();
12
12
  /**
@@ -70,7 +70,6 @@ function parseUnifiedDiff(diff) {
70
70
  return classified;
71
71
  });
72
72
  }
73
- /** Counts of added/removed content lines — for a compact per-file "+N −M" tally. */
74
73
  function diffStat(lines) {
75
74
  let added = 0;
76
75
  let removed = 0;
@@ -81,7 +80,6 @@ function diffStat(lines) {
81
80
  removed
82
81
  };
83
82
  }
84
- /** Per-file status word + its ink (reused from the old Changes list). */
85
83
  var STATUS_LABEL = {
86
84
  added: "Added",
87
85
  modified: "Changed",
@@ -92,12 +90,10 @@ var STATUS_CLS = {
92
90
  modified: "text-secondary",
93
91
  removed: "text-accent"
94
92
  };
95
- /** Signed byte delta — "+1.8 KB", "−240 B", "" when unknown/zero. */
96
93
  function fmtDelta(n) {
97
94
  if (n == null || n === 0) return "";
98
95
  return `${n > 0 ? "+" : "−"}${humanBytes(n)}`;
99
96
  }
100
- /** A diff line's row classes — line-level tint + gutter ink per kind. */
101
97
  var LINE_CLS = {
102
98
  add: "bg-[color:var(--color-diff-add-bg)] text-primary",
103
99
  del: "bg-[color:var(--color-diff-del-bg)] text-primary",
@@ -112,13 +108,6 @@ var GUTTER_CLS = {
112
108
  meta: "text-disabled",
113
109
  context: "text-disabled"
114
110
  };
115
- /**
116
- * The colored diff body for one file. Each physical line becomes a row with a
117
- * `+`/`-`/` ` gutter and a line-level background tint (add=green, del=red, hunk
118
- * de-emphasized). Long lines DON'T wrap — the pane scrolls them horizontally
119
- * (`overflow-x-auto min-w-0`) so a wide line never widens the page. Height is
120
- * capped so a long diff scrolls inside its own box.
121
- */
122
111
  function DiffBody({ lines }) {
123
112
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
124
113
  className: "min-w-0 max-h-[420px] overflow-auto border-t border-hairline bg-raised font-mono text-label leading-[1.55]",
@@ -138,7 +127,6 @@ function DiffBody({ lines }) {
138
127
  })
139
128
  });
140
129
  }
141
- /** One file row header — status word, path, size delta, and binary/too-large markers. */
142
130
  function FileHead({ f, lines }) {
143
131
  const delta = fmtDelta(f.sizeDelta);
144
132
  const stat = lines ? diffStat(lines) : null;
@@ -182,15 +170,7 @@ function FileHead({ f, lines }) {
182
170
  ]
183
171
  });
184
172
  }
185
- /** Small enough to auto-open; larger diffs start collapsed. */
186
173
  var AUTO_OPEN_LINES = 40;
187
- /**
188
- * The Changes diff view — a list of changed files, each collapsible, its unified
189
- * diff rendered as colored add/remove/context lines. Files with no inline diff
190
- * (binary / oversize / too-large) render just the header row. Small diffs default
191
- * open, large ones collapsed. Built entirely from theme tokens — no external diff
192
- * library.
193
- */
194
174
  function DiffView({ files }) {
195
175
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
196
176
  className: "space-y-1.5",
@@ -221,9 +201,6 @@ function DiffView({ files }) {
221
201
  })
222
202
  });
223
203
  }
224
- /** A section card - mirrors the loop page's surface panels with a sentence-case
225
- * section heading. `min-w-0` so wide inner content (a wide diff line)
226
- * scrolls inside the card, never widens the page. */
227
204
  function Card({ label, count, children }) {
228
205
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
229
206
  className: "min-w-0 rounded-card border border-hairline bg-surface px-6 py-5 shadow-card",
@@ -240,7 +217,6 @@ function Card({ label, count, children }) {
240
217
  }), children]
241
218
  });
242
219
  }
243
- /** A stacked key/value field for the metadata rail - a small label over its value. */
244
220
  function Field({ k, children }) {
245
221
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
246
222
  className: "min-w-0",
@@ -257,8 +233,6 @@ function visibleTokenUsage(usage) {
257
233
  if (!usage || usage.inputTokens === void 0 && usage.outputTokens === void 0) return null;
258
234
  return (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0);
259
235
  }
260
- /** Per-run artifact diff vs the previous run, rendered as a colored diff
261
- * view. Lazy by runId; degrades to a calm fallback for runs with no snapshot. */
262
236
  function Changes({ run }) {
263
237
  const [data, setData] = (0, import_react.useState)(null);
264
238
  (0, import_react.useEffect)(() => {
@@ -342,18 +316,6 @@ function SessionId({ id }) {
342
316
  * (cursor paging via loadOlderRuns) before giving up — a safety bound so a bad
343
317
  * runId can't page the whole history. 64 × 100/page covers very deep histories. */
344
318
  var MAX_OLDER_PAGES = 64;
345
- /**
346
- * Run detail PAGE body — its own route (`/loops/$loopId/runs/$runId`). Resolves
347
- * the run by id from the loop's detail payload (reusing getLoopDetail, no new
348
- * backend); a run older than that latest window is located by paging backward
349
- * with the existing `loadOlderRuns` cursor fn. Self-polls while it's in flight.
350
- *
351
- * Layout mirrors the loop detail page: a header card (name / status pill / chips
352
- * + action toolbar), then a two-column main — the meaty content (Changes diff +
353
- * Execution trace + Report) in a wide `minmax(0,1fr)` column, the run metadata in
354
- * a capped right rail. `min-w-0` everywhere + panes that scroll their own wide
355
- * content keep the page free of horizontal scroll at any width.
356
- */
357
319
  function RunDetailView({ loopId, runId }) {
358
320
  const [detail, setDetail] = (0, import_react.useState)(null);
359
321
  const [olderRun, setOlderRun] = (0, import_react.useState)(null);
@@ -1,7 +1,7 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
- import { i as authClient, u as getAuthState } from "./SocialLinks-ZYIMrv4W.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-Bha29x1u.js
4
- var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-CBXFBNrN.mjs");
2
+ import { i as authClient, u as getAuthState } from "./SocialLinks-DVCLmql0.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-DVtG0xYb.js
4
+ var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-BA-P6sGA.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,8 +1,8 @@
1
- import { A as ensureServer, Bt as sha256, C as createMachine$1, G as getMachine, Jt as updateMachine, P as forceDeleteMachine, St as mintDeviceToken, T as daemonNeedsUpdate, X as getTeamMember, bt as machineIdFromToken, dt as listMachines$1, ft as listMachinesForTeam, jt as rememberConnectKey, u as MIN_DAEMON_VERSION, yt as loopsForMachine } from "./boot-DoRoAQuI.mjs";
2
- import { requestScope } from "./auth-pONvN2Mo.mjs";
1
+ import { A as ensureServer, Bt as sha256, C as createMachine$1, G as getMachine, Jt as updateMachine, P as forceDeleteMachine, St as mintDeviceToken, T as daemonNeedsUpdate, X as getTeamMember, bt as machineIdFromToken, dt as listMachines$1, ft as listMachinesForTeam, jt as rememberConnectKey, u as MIN_DAEMON_VERSION, yt as loopsForMachine } from "./boot-BIxtZHU-.mjs";
2
+ import { requestScope } from "./auth-LwPp_iim.mjs";
3
3
  import { n as createServerFn } from "./ssr.mjs";
4
4
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/machineFns-BFBPpfxd.js
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/machineFns-Bb9KNXun.js
6
6
  /**
7
7
  * Whether a machine is visible/actionable in the request scope. Mirrors
8
8
  * listMachines: open mode sees everything; otherwise the requester must own the
@@ -85,7 +85,6 @@ var LatestDaemonVersion = class {
85
85
  this.ttlMs = ttlMs;
86
86
  this.now = now;
87
87
  }
88
- /** Cached latest version, refreshing in the background when stale. Non-blocking. */
89
88
  get() {
90
89
  if (this.now() - this.fetchedAt >= this.ttlMs) this.refresh();
91
90
  return this.cached;
@@ -107,7 +106,6 @@ var LatestDaemonVersion = class {
107
106
  }
108
107
  }
109
108
  };
110
- /** Process-wide singleton the machine server fns read (fail-silent, cached). */
111
109
  var latestDaemonVersion = new LatestDaemonVersion();
112
110
  /**
113
111
  * Machine management server functions. Connect flow (two acts):
@@ -1,6 +1,6 @@
1
- import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-pONvN2Mo.mjs";
1
+ import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-LwPp_iim.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-BDYK0mnk.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/node-sqlite-dialect-Dho9YjXb.js
4
4
  var NodeSqliteAdapter = class {
5
5
  get supportsCreateIfNotExists() {
6
6
  return true;