@kky42/pievo-server 2.4.11 → 2.4.13

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 (86) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/SignIn-CDCdDD1a.js +1 -0
  3. package/.output/public/assets/{ui-s5IMg6RF.js → actionUi-D8m1FDHO.js} +1 -1
  4. package/.output/public/assets/app-PPhgN9iN.css +2 -0
  5. package/.output/public/assets/index-c0XPWXuz.js +10 -0
  6. package/.output/public/assets/loops._loopId-D7i_BGiE.js +67 -0
  7. package/.output/public/assets/loops._loopId_.runs._runId-CksSrEY7.js +3 -0
  8. package/.output/public/assets/{preload-helper-Bs7oCAsw.js → preload-helper-Zcmr31XG.js} +3 -3
  9. package/.output/public/assets/routes-79D939J4.js +1 -0
  10. package/.output/public/assets/routes-BYgl3Tmv.js +1 -0
  11. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  12. package/.output/server/_ssr/{MachinesModal-BhRw7oOx.mjs → MachinesModal-DBIP648Z.mjs} +18 -57
  13. package/.output/server/_ssr/{SignIn-BhoZIOUp.mjs → SignIn-Bp3uWaCQ.mjs} +3 -3
  14. package/.output/server/_ssr/{ui-DGz-q9MT.mjs → actionUi-C_WswNb1.mjs} +113 -2
  15. package/.output/server/_ssr/{artifactFiles-ChuJ4PzC.mjs → artifactFiles-BvVmixrs.mjs} +3 -3
  16. package/.output/server/_ssr/{artifactKind-DXumOv7c.mjs → artifactKind-DRCbYHZU.mjs} +6 -14
  17. package/.output/server/_ssr/artifacts-CzDJLaa6.mjs +2 -0
  18. package/.output/server/_ssr/{auth-LwPp_iim.mjs → auth-BV0MxVdo.mjs} +44 -124
  19. package/.output/server/_ssr/{SocialLinks-DVCLmql0.mjs → auth-client-RTpMpT4L.mjs} +143 -109
  20. package/.output/server/_ssr/boot-CsLXrLEa.mjs +2 -0
  21. package/.output/server/_ssr/{boot-BIxtZHU-.mjs → boot-U-CFI65B.mjs} +58 -331
  22. package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-CHMDkKqA.mjs → bun-sqlite-dialect-BW9W1_Ps-D9KUBJ-L.mjs} +2 -2
  23. package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-DYum6qky.mjs → d1-sqlite-dialect-BLC8LXE6-CVHRzH1n.mjs} +2 -2
  24. package/.output/server/_ssr/db-BTX-xORB.mjs +2 -0
  25. package/.output/server/_ssr/{dist-bWqs5sTy.mjs → dist-D7UDVZ5G.mjs} +2 -2
  26. package/.output/server/_ssr/{factory-pBwrjVTI.mjs → factory-DYFx1fg-.mjs} +2 -2
  27. package/.output/server/_ssr/{kysely-adapter-DMf5pFTf.mjs → kysely-adapter-CwdB7yBh.mjs} +1 -1
  28. package/.output/server/_ssr/logger-CwiKSMp6.mjs +2 -0
  29. package/.output/server/_ssr/{loopApi-Im6JSK0p.mjs → loopApi-C4nN0msL.mjs} +29 -90
  30. package/.output/server/_ssr/{loopProjection-DIpGR6rp.mjs → loopProjection-DMSNHux6.mjs} +2 -2
  31. package/.output/server/_ssr/{loops._loopId-B5iPseDG.mjs → loops._loopId-Q4pRYPip.mjs} +19 -45
  32. package/.output/server/_ssr/{loops._loopId_.runs._runId-DVtG0xYb.mjs → loops._loopId_.runs._runId-DNXVmCt5.mjs} +6 -13
  33. package/.output/server/_ssr/{loops._loopId_.runs._runId-BA-P6sGA.mjs → loops._loopId_.runs._runId-ty3AhkOi.mjs} +31 -23
  34. package/.output/server/_ssr/{machineFns-Bb9KNXun.mjs → machineFns-CkNms3zA.mjs} +41 -108
  35. package/.output/server/_ssr/{node-sqlite-dialect-Dho9YjXb.mjs → node-sqlite-dialect-B_g92oFK.mjs} +2 -2
  36. package/.output/server/_ssr/{router-DPz3uoUr.mjs → router-DCNZ2xLm.mjs} +26 -40
  37. package/.output/server/_ssr/routes-8JSF7bX_.mjs +27 -0
  38. package/.output/server/_ssr/{routes-FO0MFfYK.mjs → routes-B3fulW5I.mjs} +4 -9
  39. package/.output/server/_ssr/routes-BaanDO41.mjs +367 -0
  40. package/.output/server/_ssr/runDiff-D7CxAgYL.mjs +2 -0
  41. package/.output/server/_ssr/ssr.mjs +28 -88
  42. package/.output/server/_ssr/store-DSNbXxqz.mjs +2 -0
  43. package/.output/server/_ssr/tokens-DzUv7CCp.mjs +2 -0
  44. package/.output/server/_tanstack-start-manifest_v-DkmxsHDK.mjs +52 -0
  45. package/.output/server/drizzle/0002_remove_teams.sql +15 -0
  46. package/.output/server/drizzle/meta/_journal.json +7 -0
  47. package/.output/server/index.mjs +49 -98
  48. package/drizzle/0002_remove_teams.sql +15 -0
  49. package/drizzle/meta/_journal.json +7 -0
  50. package/package.json +2 -2
  51. package/.output/public/assets/MachinesModal-ByHejech.js +0 -1
  52. package/.output/public/assets/SignIn-Cf4HOpdF.js +0 -1
  53. package/.output/public/assets/actionUi-yYVvoOTn.js +0 -1
  54. package/.output/public/assets/app-IrlFuBXa.css +0 -2
  55. package/.output/public/assets/index-ia26HsP1.js +0 -10
  56. package/.output/public/assets/invite._token-B0EKVyrU.js +0 -1
  57. package/.output/public/assets/invite._token-tDfe3p0Z.js +0 -1
  58. package/.output/public/assets/lifecycleUi-C0DaC6NM.js +0 -1
  59. package/.output/public/assets/loops._loopId-CuYq_XgT.js +0 -67
  60. package/.output/public/assets/loops._loopId_.runs._runId-mOaF51Qu.js +0 -3
  61. package/.output/public/assets/routes-4N6mrQK_.js +0 -1
  62. package/.output/public/assets/routes-Dbl_3lt_.js +0 -1
  63. package/.output/public/assets/t._teamId-BVsl0EGm.js +0 -1
  64. package/.output/public/assets/t._teamId-CAUjvMZ6.js +0 -1
  65. package/.output/server/_ssr/DashboardView-BMHMrOfC.mjs +0 -842
  66. package/.output/server/_ssr/actionUi-Cf6DuEC2.mjs +0 -119
  67. package/.output/server/_ssr/artifacts-DOLHJHcd.mjs +0 -2
  68. package/.output/server/_ssr/boot-D8cj4uZj.mjs +0 -2
  69. package/.output/server/_ssr/db-BphSJs66.mjs +0 -2
  70. package/.output/server/_ssr/invite._token-CPSvdDox.mjs +0 -27
  71. package/.output/server/_ssr/invite._token-CRBsTSTZ.mjs +0 -84
  72. package/.output/server/_ssr/invite._token-CaTLt92a.mjs +0 -20
  73. package/.output/server/_ssr/lifecycleUi-DauKavgx.mjs +0 -50
  74. package/.output/server/_ssr/logger-EinA2J6y.mjs +0 -2
  75. package/.output/server/_ssr/routes-B9zD2h4Y.mjs +0 -26
  76. package/.output/server/_ssr/routes-BuILEmHs.mjs +0 -39
  77. package/.output/server/_ssr/runDiff-BLdot9mi.mjs +0 -2
  78. package/.output/server/_ssr/store-CFCp_ggC.mjs +0 -2
  79. package/.output/server/_ssr/t._teamId-1t5wOXrV.mjs +0 -43
  80. package/.output/server/_ssr/t._teamId-A37pQ8Vp.mjs +0 -32
  81. package/.output/server/_ssr/t._teamId-D1BTwhWf.mjs +0 -31
  82. package/.output/server/_ssr/teamCookie-B7hLOIie.mjs +0 -10
  83. package/.output/server/_ssr/teamFns-DfqtuBW2.mjs +0 -451
  84. package/.output/server/_ssr/teamFns-cI_tsiCv.mjs +0 -32
  85. package/.output/server/_ssr/tokens-CUz4LDLm.mjs +0 -2
  86. package/.output/server/_tanstack-start-manifest_v-CojB4Veh.mjs +0 -86
@@ -0,0 +1,367 @@
1
+ import { o as __toESM } from "../_runtime.mjs";
2
+ import { g as require_react, h as require_jsx_runtime, s as TooltipProvider } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { c as createFileRoute, d as useNavigate, f as useRouter, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
4
+ import { O as useSession, _ as listLoops, a as PievoLogo, f as getAuthState, i as OpenModeWarning, n as GITHUB_URL, p as getConfig, r as GitHubIcon, v as loadOlderRuns, w as signOut, y as mintConnectKey } from "./auth-client-RTpMpT4L.mjs";
5
+ import { f as btnSm } from "./actionUi-C_WswNb1.mjs";
6
+ import { c as mergeRuns, i as ModalHead, n as MachinesModal, o as daemonConnectCommand, r as Modal, s as listMachines, t as LoopOverview } from "./MachinesModal-DBIP648Z.mjs";
7
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-BaanDO41.js
8
+ var import_react = /* @__PURE__ */ __toESM(require_react());
9
+ var import_jsx_runtime = require_jsx_runtime();
10
+ function LoopCard({ loop, onOpen, onPickRun }) {
11
+ const en = loop.enabled;
12
+ const [older, setOlder] = (0, import_react.useState)([]);
13
+ const runs = (0, import_react.useMemo)(() => older.length ? mergeRuns(loop.runs ?? [], older) : loop.runs ?? [], [loop.runs, older]);
14
+ const newestRun = runs.at(-1);
15
+ const latestIncidentRun = newestRun?.reportIncident ? newestRun : void 0;
16
+ const loadMore = async () => {
17
+ const oldest = runs[0];
18
+ if (!oldest) return 0;
19
+ const more = await loadOlderRuns({ data: {
20
+ loopId: loop.id,
21
+ beforeTs: oldest.ts,
22
+ limit: 16
23
+ } });
24
+ if (more.length) setOlder((prev) => mergeRuns(prev, more));
25
+ return more.length;
26
+ };
27
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
28
+ onClick: () => onOpen(loop.id),
29
+ className: `mb-[18px] cursor-pointer rounded-card border border-hairline bg-surface px-[26px] pb-5 pt-[22px] shadow-card transition-colors hover:border-wire ${en || latestIncidentRun?.reportIncident || loop.pauseCause?.kind === "failure-streak" || loop.pauseCause?.kind === "blocked" ? "" : "opacity-60"}`,
30
+ style: { animation: "fadeIn .25s cubic-bezier(0.25,0.1,0.25,1) both" },
31
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoopOverview, {
32
+ loop,
33
+ runs,
34
+ onLoadMore: loadMore,
35
+ onPickRun: (run) => onPickRun(loop.id, run),
36
+ onOpen: () => onOpen(loop.id)
37
+ })
38
+ });
39
+ }
40
+ function ComposeModal({ open, onClose }) {
41
+ const [token, setToken] = (0, import_react.useState)(null);
42
+ const [config, setConfig] = (0, import_react.useState)(null);
43
+ const [copied, setCopied] = (0, import_react.useState)(false);
44
+ const [error, setError] = (0, import_react.useState)(null);
45
+ const [configError, setConfigError] = (0, import_react.useState)(false);
46
+ const origin = typeof window !== "undefined" ? window.location.origin : "";
47
+ const command = token && config ? daemonConnectCommand(origin, token, config.pievoCli, config.customCli) : "";
48
+ (0, import_react.useEffect)(() => {
49
+ if (!open) return;
50
+ setToken(null);
51
+ setConfig(null);
52
+ setCopied(false);
53
+ setError(null);
54
+ setConfigError(false);
55
+ }, [open]);
56
+ (0, import_react.useEffect)(() => {
57
+ if (!open) return;
58
+ let active = true;
59
+ getConfig().then((value) => {
60
+ if (active) setConfig(value);
61
+ }).catch(() => {
62
+ if (active) setConfigError(true);
63
+ });
64
+ mintConnectKey().then((result) => {
65
+ if (!active) return;
66
+ if ("token" in result) setToken(result.token);
67
+ else setError(result.error);
68
+ }).catch(() => {
69
+ if (active) setError("could not mint a connect key");
70
+ });
71
+ return () => {
72
+ active = false;
73
+ };
74
+ }, [open]);
75
+ async function copyCommand() {
76
+ try {
77
+ await navigator.clipboard.writeText(command);
78
+ setCopied(true);
79
+ setTimeout(() => setCopied(false), 1500);
80
+ } catch {
81
+ setError("could not copy - select the command and copy manually");
82
+ }
83
+ }
84
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Modal, {
85
+ open,
86
+ onClose,
87
+ children: [
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ModalHead, { title: "New loop" }),
89
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
90
+ className: "mt-6",
91
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Step, {
92
+ number: "1",
93
+ continued: true,
94
+ title: "Install and connect the daemon",
95
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
96
+ className: "mt-1.5 text-body leading-snug text-secondary",
97
+ children: "Run this command in your terminal. It connects the daemon and installs the Pievo skill."
98
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
99
+ className: "mt-3 flex min-w-0 items-start gap-2",
100
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
101
+ className: "min-w-0 flex-1 overflow-x-auto whitespace-pre-wrap break-all rounded-control bg-display p-4 font-mono text-label leading-relaxed text-paper",
102
+ children: command || (configError ? "Could not load the connection command. Close and try again." : token ? "Loading CLI configuration…" : "Minting a connect key…")
103
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
104
+ className: btnSm,
105
+ onClick: () => void copyCommand(),
106
+ disabled: !command,
107
+ children: copied ? "Copied ✓" : "Copy"
108
+ })]
109
+ })]
110
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Step, {
111
+ number: "2",
112
+ title: "Start a new session",
113
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
114
+ className: "mt-1.5 text-body leading-snug text-secondary",
115
+ children: "After the command finishes, start a new session in the project where the loop should run, then manually invoke the Pievo skill:"
116
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
117
+ className: "mt-3 space-y-2 rounded-control border border-hairline bg-raised p-4 text-body text-display",
118
+ children: [
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SkillCommand, {
120
+ agent: "Claude Code",
121
+ command: "/pievo Create a Pievo loop."
122
+ }),
123
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SkillCommand, {
124
+ agent: "Codex",
125
+ command: "$pievo Create a Pievo loop."
126
+ }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SkillCommand, {
128
+ agent: "Pi",
129
+ command: "/skill:pievo Create a Pievo loop."
130
+ })
131
+ ]
132
+ })]
133
+ })]
134
+ }),
135
+ error && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
136
+ className: "mt-4 text-body text-accent",
137
+ children: ["Error: ", error]
138
+ })
139
+ ]
140
+ });
141
+ }
142
+ function SkillCommand({ agent, command }) {
143
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
144
+ className: "flex flex-wrap items-baseline gap-x-3 gap-y-1",
145
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
146
+ className: "w-24 shrink-0 text-label font-medium text-secondary",
147
+ children: agent
148
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
149
+ className: "font-mono text-label font-medium text-display",
150
+ children: command
151
+ })]
152
+ });
153
+ }
154
+ function Step({ number, title, continued = false, children }) {
155
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
156
+ className: "flex gap-3.5",
157
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
158
+ className: "flex flex-col items-center",
159
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
160
+ className: "flex size-5 shrink-0 items-center justify-center rounded-full border border-display text-micro font-medium leading-none text-display",
161
+ children: number
162
+ }), continued && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mt-1 w-px flex-1 bg-hairline" })]
163
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
164
+ className: continued ? "min-w-0 flex-1 pb-7" : "min-w-0 flex-1",
165
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
166
+ className: "text-label font-semibold text-display",
167
+ children: title
168
+ }), children]
169
+ })]
170
+ });
171
+ }
172
+ /** Loops and machines change between polls. Authorization is derived server-side
173
+ * from the current session; clients do not send tenant identifiers. */
174
+ async function fetchLiveData() {
175
+ const [loops, machines] = await Promise.all([listLoops(), listMachines()]);
176
+ return {
177
+ loops,
178
+ machines
179
+ };
180
+ }
181
+ function DashboardView({ initial, mode }) {
182
+ const [live, setLive] = (0, import_react.useState)(null);
183
+ const { loops, machines } = live ?? initial;
184
+ const online = machines.filter((m) => m.online).length;
185
+ const navigate = useNavigate();
186
+ const router = useRouter();
187
+ const { data: session } = useSession();
188
+ const [signingOut, setSigningOut] = (0, import_react.useState)(false);
189
+ const [composeOpen, setComposeOpen] = (0, import_react.useState)(false);
190
+ const [machinesOpen, setMachinesOpen] = (0, import_react.useState)(false);
191
+ async function logout() {
192
+ setSigningOut(true);
193
+ try {
194
+ await signOut();
195
+ await navigate({ to: "/" });
196
+ await router.invalidate();
197
+ } finally {
198
+ setSigningOut(false);
199
+ }
200
+ }
201
+ const refetch = (0, import_react.useCallback)(async () => {
202
+ try {
203
+ setLive(await fetchLiveData());
204
+ } catch {}
205
+ }, []);
206
+ const openRef = (0, import_react.useRef)(false);
207
+ openRef.current = composeOpen || machinesOpen;
208
+ const anyRunning = loops.some((j) => j.running);
209
+ (0, import_react.useEffect)(() => {
210
+ const t = setInterval(() => {
211
+ if (!openRef.current) refetch();
212
+ }, anyRunning ? 3e3 : 1e4);
213
+ return () => clearInterval(t);
214
+ }, [refetch, anyRunning]);
215
+ const activeCount = loops.filter((loop) => loop.enabled && !loop.deleteRequestedAt).length;
216
+ const pausedCount = loops.filter((loop) => !loop.enabled && !loop.deleteRequestedAt).length;
217
+ const deletingCount = loops.filter((loop) => Boolean(loop.deleteRequestedAt)).length;
218
+ const lifecycleCounts = [
219
+ `${activeCount} active`,
220
+ `${pausedCount} paused`,
221
+ ...deletingCount ? [`${deletingCount} deleting`] : []
222
+ ].join(" · ");
223
+ const cardProps = () => ({
224
+ onOpen: (id) => void navigate({
225
+ to: "/loops/$loopId",
226
+ params: { loopId: id }
227
+ }),
228
+ onPickRun: (loopId, run) => void navigate({
229
+ to: "/loops/$loopId/runs/$runId",
230
+ params: {
231
+ loopId,
232
+ runId: run.id
233
+ }
234
+ })
235
+ });
236
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TooltipProvider, {
237
+ delay: 120,
238
+ children: [
239
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", {
240
+ className: "glass glass-bar sticky top-0 z-50",
241
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
242
+ className: "mx-auto flex max-w-[1180px] items-center gap-3 px-8 py-2.5",
243
+ children: [
244
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PievoLogo, { size: 30 }),
245
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
246
+ className: "text-[18px] font-semibold tracking-[-0.015em] text-display",
247
+ children: "Pievo"
248
+ }),
249
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1" }),
250
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
251
+ href: GITHUB_URL,
252
+ target: "_blank",
253
+ rel: "noreferrer",
254
+ "aria-label": "GitHub repository",
255
+ title: "GitHub",
256
+ className: headerIconBtn,
257
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GitHubIcon, { className: "size-[17px]" })
258
+ }),
259
+ mode === "auth" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
260
+ className: "flex items-center gap-2",
261
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
262
+ className: "max-w-48 truncate text-label text-secondary",
263
+ title: session?.user.email ?? session?.user.name ?? "Account",
264
+ children: session?.user.email ?? session?.user.name ?? "Account"
265
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
266
+ onClick: () => void logout(),
267
+ disabled: signingOut,
268
+ className: headerBtn,
269
+ children: signingOut ? "Signing out…" : "Sign out"
270
+ })]
271
+ }),
272
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
273
+ onClick: () => setMachinesOpen(true),
274
+ className: `${headerBtn} gap-1.5`,
275
+ children: [
276
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `inline-block size-1.5 rounded-full ${online ? "bg-rubik-green" : "bg-disabled"}` }),
277
+ online,
278
+ " ",
279
+ online === 1 ? "machine" : "machines",
280
+ " online"
281
+ ]
282
+ }),
283
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
284
+ onClick: () => setComposeOpen(true),
285
+ className: "inline-flex shrink-0 cursor-pointer items-center rounded-full bg-display px-3.5 py-1.5 text-meta font-medium text-paper transition-opacity hover:opacity-85",
286
+ children: "New Loop"
287
+ })
288
+ ]
289
+ })
290
+ }),
291
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("main", {
292
+ className: "mx-auto max-w-[1180px] px-8 pb-24",
293
+ children: [
294
+ mode === "open" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(OpenModeWarning, { className: "mt-6" }),
295
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
296
+ className: "pb-2 pt-14 text-center",
297
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
298
+ className: "font-pixel text-[clamp(28px,4.5vw,38px)] leading-[1.15] text-display",
299
+ children: "What should happen while you sleep?"
300
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
301
+ className: "mt-7",
302
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
303
+ onClick: () => setComposeOpen(true),
304
+ className: "inline-flex cursor-pointer items-center gap-1.5 rounded-full bg-display px-6 py-2.5 text-body font-medium text-paper transition-opacity hover:opacity-85",
305
+ children: ["Start a new loop ", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
306
+ "aria-hidden": true,
307
+ children: "→"
308
+ })]
309
+ })
310
+ })]
311
+ }),
312
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
313
+ className: "mb-5 mt-12 flex items-baseline gap-2.5",
314
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", {
315
+ className: "text-body font-semibold text-display",
316
+ children: "Loops"
317
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
318
+ className: "text-label text-secondary",
319
+ children: loops.length ? lifecycleCounts : ""
320
+ })]
321
+ }),
322
+ loops.length ? loops.map((j) => /* @__PURE__ */ (0, import_react.createElement)(LoopCard, {
323
+ loop: j,
324
+ ...cardProps(),
325
+ key: j.id
326
+ })) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
327
+ className: "py-16 text-center",
328
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
329
+ className: "text-[15px] text-secondary",
330
+ children: "No loops yet"
331
+ }), !loops.length && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
332
+ className: "mt-1.5 text-body text-disabled",
333
+ children: "Create a scheduled prompt for a connected machine."
334
+ })]
335
+ })
336
+ ]
337
+ }),
338
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ComposeModal, {
339
+ open: composeOpen,
340
+ onClose: () => setComposeOpen(false)
341
+ }),
342
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MachinesModal, {
343
+ open: machinesOpen,
344
+ onClose: () => setMachinesOpen(false)
345
+ })
346
+ ]
347
+ });
348
+ }
349
+ var headerBtn = "inline-flex shrink-0 cursor-pointer items-center rounded-full px-3 py-1.5 text-meta font-medium text-secondary transition-colors hover:bg-raised hover:text-display";
350
+ var headerIconBtn = "inline-flex shrink-0 cursor-pointer items-center rounded-full p-1.5 text-secondary transition-colors hover:bg-raised hover:text-display";
351
+ var $$splitErrorComponentImporter = () => import("./routes-B3fulW5I.mjs");
352
+ var $$splitComponentImporter = () => import("./routes-8JSF7bX_.mjs");
353
+ /** The dashboard route. Auth mode shows sign-in before loading owner-scoped data;
354
+ * open mode renders the server's shared administrative workspace. */
355
+ var Route = createFileRoute("/")({
356
+ ssr: false,
357
+ loader: async () => {
358
+ return {
359
+ auth: await getAuthState(),
360
+ initial: await fetchLiveData()
361
+ };
362
+ },
363
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
364
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent")
365
+ });
366
+ //#endregion
367
+ export { Route as n, DashboardView as t };
@@ -0,0 +1,2 @@
1
+ import { g as computeRunDiff } from "./boot-U-CFI65B.mjs";
2
+ export { computeRunDiff };
@@ -1,5 +1,5 @@
1
1
  import { r as __exportAll } from "../_runtime.mjs";
2
- import { i as __exportAll$1 } from "./factory-pBwrjVTI.mjs";
2
+ import { i as __exportAll$1 } from "./factory-DYFx1fg-.mjs";
3
3
  import { g as require_react, h as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
4
  import { a as RouterProvider, n as defineHandlerCallback, t as renderRouterToStream } from "../_libs/@tanstack/react-router+[...].mjs";
5
5
  import { PassThrough, Readable } from "node:stream";
@@ -746,7 +746,7 @@ var rootRouteId = "__root__";
746
746
  * @returns A Response augmented with router navigation options.
747
747
  * @link https://tanstack.com/router/latest/docs/framework/react/api/router/redirectFunction
748
748
  */
749
- function redirect$1(opts) {
749
+ function redirect(opts) {
750
750
  opts.statusCode = opts.statusCode || opts.code || 307;
751
751
  if (!opts._builtLocation && !opts.reloadDocument && typeof opts.href === "string") try {
752
752
  new URL(opts.href);
@@ -775,7 +775,7 @@ function isResolvedRedirect(obj) {
775
775
  /** Parse a serialized redirect object back into a redirect Response. */
776
776
  /** Parse a serialized redirect object back into a redirect Response. */
777
777
  function parseRedirect(obj) {
778
- if (obj !== null && typeof obj === "object" && obj.isSerializedRedirect) return redirect$1(obj);
778
+ if (obj !== null && typeof obj === "object" && obj.isSerializedRedirect) return redirect(obj);
779
779
  }
780
780
  /** Execute a location input rewrite if provided. */
781
781
  function executeRewriteInput(rewrite, url) {
@@ -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-CojB4Veh.mjs");
3421
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DkmxsHDK.mjs");
3422
3422
  const startManifest = tsrStartManifest();
3423
3423
  let routes = startManifest.routes;
3424
3424
  routes[rootRouteId];
@@ -3440,147 +3440,87 @@ async function getStartManifest(matchedRoutes) {
3440
3440
  var manifest = {
3441
3441
  "08565e35f6a3dd06ef25401de0343976c47f7ae319d3baed6320b56dd3718311": {
3442
3442
  functionName: "runLoop_createServerFn_handler",
3443
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3443
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3444
3444
  },
3445
3445
  "08c28b892712a1b491b120b74c7dcb81761988d31ccea60216d1807b73c1182c": {
3446
3446
  functionName: "getRunDiff_createServerFn_handler",
3447
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3448
- },
3449
- "0f279cfe81021a642289ce6e95622e7198aaeab4147880f85824a02ee9ebafcf": {
3450
- functionName: "createTeam_createServerFn_handler",
3451
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3452
- },
3453
- "0fe12e769203c42f432a927b9cbf13a967a0f9db567b61843598f734afb4f5c6": {
3454
- functionName: "listMyTeams_createServerFn_handler",
3455
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3447
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3456
3448
  },
3457
3449
  "169566e7637a22599b4eb32ee3775574e99677406922bbef7482a102036c33dd": {
3458
3450
  functionName: "machineStatus_createServerFn_handler",
3459
- importer: () => import("./machineFns-Bb9KNXun.mjs")
3451
+ importer: () => import("./machineFns-CkNms3zA.mjs")
3460
3452
  },
3461
3453
  "23e290b2b7483ceea6fe669024c35b12c2c4ddd76649f6fab21c958ceda02940": {
3462
3454
  functionName: "listLoops_createServerFn_handler",
3463
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3455
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3464
3456
  },
3465
3457
  "27d7eba0b6a2257949392fdd56057275a5c5366484ae01faf3b5897a225ecd83": {
3466
3458
  functionName: "finalizeMachine_createServerFn_handler",
3467
- importer: () => import("./machineFns-Bb9KNXun.mjs")
3468
- },
3469
- "284cb82b5e5cb37242d053b1b14449760d8334e9dadffc6dcbba11db2200a709": {
3470
- functionName: "addTeamMember_createServerFn_handler",
3471
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3472
- },
3473
- "4646f52fb09b83c9c9cef34836f3c9d03416423c879d9e5ceffcafd9a71ecba6": {
3474
- functionName: "mintClaim_createServerFn_handler",
3475
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3459
+ importer: () => import("./machineFns-CkNms3zA.mjs")
3476
3460
  },
3477
3461
  "5660ea82ea5ff2549e0ce2f8f070c54f3e9e24fee84d547601ef5d6ef49a4016": {
3478
3462
  functionName: "startLoop_createServerFn_handler",
3479
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3480
- },
3481
- "5721e01d84c20ffde19d2191648d76a7e5ede3bbb4f44efa59107a786947cf27": {
3482
- functionName: "renameTeam_createServerFn_handler",
3483
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3463
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3484
3464
  },
3485
3465
  "5e0d6b55f5629faac2f55a68661eeb82668b2be752192b16264ffb5cd1e6fabe": {
3486
3466
  functionName: "deleteLoop_createServerFn_handler",
3487
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3467
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3488
3468
  },
3489
3469
  "6850ba403da9dec5aff45794eb52636ca540ddec2d9e59f5c75ccbb852bfeacb": {
3490
3470
  functionName: "stopRun_createServerFn_handler",
3491
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3492
- },
3493
- "6f5fe23f6da1d4aecc198b6f71a041c0fe29cabb6ccad807bb3f16c23c5bd9cd": {
3494
- functionName: "redeemTeamInvite_createServerFn_handler",
3495
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3496
- },
3497
- "7cc22b3a0f6b1c4c73463c3401e981ad42caf6487b479b738ee5aeacb11710da": {
3498
- functionName: "canViewTeam_createServerFn_handler",
3499
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3471
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3500
3472
  },
3501
3473
  "85fdf73d4fee43aed762f93c5d47d33200fbff39e2d082647dc921f610d32698": {
3502
3474
  functionName: "loadOlderRuns_createServerFn_handler",
3503
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3504
- },
3505
- "94d1108f156fa2273cb78140852e9c3e368de0b8321db0de932a16567671716f": {
3506
- functionName: "listManagedTeams_createServerFn_handler",
3507
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3475
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3508
3476
  },
3509
3477
  "95b7483b333d7649e70c848319417e83c2af6a0327bbcda2d0e331f626dffe05": {
3510
3478
  functionName: "pauseLoop_createServerFn_handler",
3511
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3479
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3512
3480
  },
3513
3481
  "9befe6b8d67ccbbd7aa9b538bde2a161a9894761c8936761a9503fda1a88c0fc": {
3514
3482
  functionName: "patchLoop_createServerFn_handler",
3515
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3516
- },
3517
- "a3326ed8ecd726fbcc28a439bf0012983cbe387d5062e0155096ee5a558e313b": {
3518
- functionName: "removeTeamMember_createServerFn_handler",
3519
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3483
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3520
3484
  },
3521
3485
  "a6384dc7154d9930422d29396f5de64b3ac69c62ad3824bc4a22d745fc07b293": {
3522
3486
  functionName: "deleteMachine_createServerFn_handler",
3523
- importer: () => import("./machineFns-Bb9KNXun.mjs")
3487
+ importer: () => import("./machineFns-CkNms3zA.mjs")
3524
3488
  },
3525
3489
  "aa46310016bb8a58b273a648ffd498c87f1f450d12827e30110a3b83ba6a27d9": {
3526
3490
  functionName: "listMachines_createServerFn_handler",
3527
- importer: () => import("./machineFns-Bb9KNXun.mjs")
3491
+ importer: () => import("./machineFns-CkNms3zA.mjs")
3528
3492
  },
3529
3493
  "b050455aacc84dd2a2c9a45517826ad10f91d8f1545e87cc7015784cc7116a97": {
3530
3494
  functionName: "getLoopDetail_createServerFn_handler",
3531
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3495
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3532
3496
  },
3533
3497
  "b18bbec3d06dfc77714e1e527dfb9172fd7575a64a6c0d6e73ba6dc658dccf0d": {
3534
3498
  functionName: "getArtifacts_createServerFn_handler",
3535
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3499
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3536
3500
  },
3537
3501
  "b8119d5fe6ca1ed9f609702aa2133b5ac5337030c0bdcf92dc7eba889d6bd2e6": {
3538
3502
  functionName: "getAuthState_createServerFn_handler",
3539
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3540
- },
3541
- "b92e9a08eda2d217bf4028f90dbc6bf7d7e8d7c148ebb8a8330286b5935a3fa1": {
3542
- functionName: "revokeTeamInvite_createServerFn_handler",
3543
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3544
- },
3545
- "bbc1020c771335020ef51b326d74b1649966740f273913d32040fa2c3c9f5f0b": {
3546
- functionName: "createTeamInvite_createServerFn_handler",
3547
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3548
- },
3549
- "c3762cecd4a15f7eca064bca295255e942d7c3dce65f66f8593ae145fd7859a0": {
3550
- functionName: "setTeamMemberRole_createServerFn_handler",
3551
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3503
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3552
3504
  },
3553
3505
  "cbb6a1b09b309459bbba3dc3851ae85fc468658b3cda77e22b6c6f3e28b65af4": {
3554
3506
  functionName: "getConfig_createServerFn_handler",
3555
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3507
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3556
3508
  },
3557
- "d2372a81af17eb3a7e4c1407d6ef26a8a9522b66fd6a94858cb35c864b270d77": {
3558
- functionName: "deleteTeam_createServerFn_handler",
3559
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3560
- },
3561
- "dc0ec955d0d53a150a3e9a4673f98f3509cfb4bd411c512079ae4e94c561b70c": {
3562
- functionName: "getDefaultTeam_createServerFn_handler",
3563
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3509
+ "ce43dcb9366e7c8f7338a6ad28e4290b75a5ee3b13d0d2c9cb585020008f12c6": {
3510
+ functionName: "mintConnectKey_createServerFn_handler",
3511
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3564
3512
  },
3565
3513
  "e233a461e4526dec3cc4cbaa891a7c3621d5967ce7f32b4fb17e9fb645857b9a": {
3566
3514
  functionName: "stopLoop_createServerFn_handler",
3567
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3515
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3568
3516
  },
3569
3517
  "ed10d5fe79208e5e0e4e18e4a17b18d7f7db4dd16204c00c3ac90c4644668841": {
3570
3518
  functionName: "getArtifact_createServerFn_handler",
3571
- importer: () => import("./loopApi-Im6JSK0p.mjs")
3519
+ importer: () => import("./loopApi-C4nN0msL.mjs")
3572
3520
  },
3573
3521
  "ed679b4e1e05e903a5d4ba4a70d9b9d883991ab22ed59b4d2d69078941818415": {
3574
3522
  functionName: "createMachine_createServerFn_handler",
3575
- importer: () => import("./machineFns-Bb9KNXun.mjs")
3576
- },
3577
- "fc7a4775f418dde12f422ff9ca65d9e07428fb0dc35c9399592c0081467330bf": {
3578
- functionName: "getTeamDetail_createServerFn_handler",
3579
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3580
- },
3581
- "fe7cc1df829414194e9b0615b86584c8510369da18f4d8805ccd76468cadf2ff": {
3582
- functionName: "leaveTeam_createServerFn_handler",
3583
- importer: () => import("./teamFns-DfqtuBW2.mjs")
3523
+ importer: () => import("./machineFns-CkNms3zA.mjs")
3584
3524
  }
3585
3525
  };
3586
3526
  async function getServerFnById(id, access) {
@@ -5412,7 +5352,7 @@ var getBaseManifest = getProdBaseManifest;
5412
5352
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5413
5353
  async function loadEntries() {
5414
5354
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5415
- import("./router-DPz3uoUr.mjs"),
5355
+ import("./router-DCNZ2xLm.mjs"),
5416
5356
  import("./start-4ifArtKx.mjs"),
5417
5357
  import("./empty-plugin-adapters-DKUlnwwl.mjs")
5418
5358
  ]);
@@ -0,0 +1,2 @@
1
+ import { I as getLoop } from "./boot-U-CFI65B.mjs";
2
+ export { getLoop };
@@ -0,0 +1,2 @@
1
+ import { _t as rememberConnectKey, lt as mintDeviceToken } from "./boot-U-CFI65B.mjs";
2
+ export { mintDeviceToken, rememberConnectKey };
@@ -0,0 +1,52 @@
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-DkmxsHDK.js
2
+ var tsrStartManifest = () => ({ routes: {
3
+ __root__: {
4
+ filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/__root.tsx",
5
+ children: [
6
+ "/",
7
+ "/api/health",
8
+ "/api/ready",
9
+ "/loops/$loopId",
10
+ "/machine/report",
11
+ "/api/auth/$",
12
+ "/api/machine/cli",
13
+ "/api/machine/poll",
14
+ "/api/machine/status",
15
+ "/api/machine/sync",
16
+ "/api/artifact/$loopId/$",
17
+ "/api/machine/blob/$hash",
18
+ "/loops/$loopId_/runs/$runId"
19
+ ],
20
+ preloads: [
21
+ "/assets/index-c0XPWXuz.js",
22
+ "/assets/actionUi-D8m1FDHO.js",
23
+ "/assets/preload-helper-Zcmr31XG.js"
24
+ ],
25
+ scripts: [{ attrs: {
26
+ type: "module",
27
+ async: !0,
28
+ src: "/assets/index-c0XPWXuz.js"
29
+ } }]
30
+ },
31
+ "/": {
32
+ filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/index.tsx",
33
+ children: void 0,
34
+ preloads: [
35
+ "/assets/routes-79D939J4.js",
36
+ "/assets/routes-BYgl3Tmv.js",
37
+ "/assets/SignIn-CDCdDD1a.js"
38
+ ]
39
+ },
40
+ "/loops/$loopId": {
41
+ filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/loops.$loopId.tsx",
42
+ children: void 0,
43
+ preloads: ["/assets/loops._loopId-D7i_BGiE.js", "/assets/SignIn-CDCdDD1a.js"]
44
+ },
45
+ "/loops/$loopId_/runs/$runId": {
46
+ filePath: "/home/runner/work/pievo/pievo/packages/server/src/routes/loops.$loopId_.runs.$runId.tsx",
47
+ children: void 0,
48
+ preloads: ["/assets/loops._loopId_.runs._runId-CksSrEY7.js", "/assets/SignIn-CDCdDD1a.js"]
49
+ }
50
+ } });
51
+ //#endregion
52
+ export { tsrStartManifest };
@@ -0,0 +1,15 @@
1
+ DROP INDEX "machines_team_idx";
2
+ --> statement-breakpoint
3
+ DROP INDEX "loops_team_idx";
4
+ --> statement-breakpoint
5
+ ALTER TABLE "machines" DROP COLUMN "team_id";
6
+ --> statement-breakpoint
7
+ ALTER TABLE "loops" DROP COLUMN "team_id";
8
+ --> statement-breakpoint
9
+ ALTER TABLE "connect_keys" DROP COLUMN "team_id";
10
+ --> statement-breakpoint
11
+ DROP TABLE "team_invites";
12
+ --> statement-breakpoint
13
+ DROP TABLE "team_members";
14
+ --> statement-breakpoint
15
+ DROP TABLE "teams";