@kky42/pievo-server 2.0.2 → 2.0.4

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 (90) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{LoopView-XXW59HAV.js → LoopView-Pbp2YtUu.js} +3 -3
  3. package/.output/public/assets/{Modal-BnCPgN_k.js → Modal-B3xpEtcf.js} +1 -1
  4. package/.output/public/assets/{SignIn-BAoOONQ9.js → SignIn-9vsaKv_p.js} +1 -1
  5. package/.output/public/assets/{actionUi-Dxe9cHAc.js → actionUi-DDDfD0WX.js} +1 -1
  6. package/.output/public/assets/app-CStTBRt2.css +2 -0
  7. package/.output/public/assets/{artifactView-DekEs5ME.js → artifactView-BV-yQVrj.js} +1 -1
  8. package/.output/public/assets/index-49hAH0gP.js +12 -0
  9. package/.output/public/assets/{invite._token-BAqaXvte.js → invite._token-C3t4JfAY.js} +1 -1
  10. package/.output/public/assets/{invite._token-q54LLZ6A.js → invite._token-C891oGkK.js} +1 -1
  11. package/.output/public/assets/lifecycleUi-C3k2MlX8.js +1 -0
  12. package/.output/public/assets/{loopApi-5s2-kCnu.js → loopApi-C_Dtw-nL.js} +1 -1
  13. package/.output/public/assets/loops._loopId-DD4fKGMu.js +4 -0
  14. package/.output/public/assets/{loops._loopId_.runs._runId-lGYlHXTN.js → loops._loopId_.runs._runId-DoPcCQy7.js} +2 -2
  15. package/.output/public/assets/notifyFns-BaukhLAg.js +1 -0
  16. package/.output/public/assets/{preload-helper-ycaoAemE.js → preload-helper--VCqDT5m.js} +2 -2
  17. package/.output/public/assets/{routes-D0zKR7gK.js → routes-BS4N7Lnf.js} +1 -1
  18. package/.output/public/assets/{routes-C7Pw5lGn.js → routes-DsdcURfk.js} +1 -1
  19. package/.output/public/assets/{t._teamId-CCgajlMS.js → t._teamId-C9uEyAh_.js} +1 -1
  20. package/.output/public/assets/{t._teamId-Cn7cRGAh.js → t._teamId-DSYlMX_v.js} +1 -1
  21. package/.output/public/assets/ui-Gb1413-F.js +1 -0
  22. package/.output/server/_ssr/{DashboardView-BhJBW7IL.mjs → DashboardView-CQdjYy03.mjs} +36 -111
  23. package/.output/server/_ssr/{LoopPlaybook-BC9Dvnw2.mjs → LoopPlaybook-C86vJIjZ.mjs} +9 -9
  24. package/.output/server/_ssr/{LoopView-Dom6Ad5G.mjs → LoopView-cDyjmf1B.mjs} +16 -16
  25. package/.output/server/_ssr/{Modal-CfWC9R49.mjs → Modal-Bc_5TYGr.mjs} +2 -2
  26. package/.output/server/_ssr/{SignIn-D70NUJsN.mjs → SignIn-BQQiD3Ss.mjs} +3 -3
  27. package/.output/server/_ssr/{actionUi-mDYOvJdB.mjs → actionUi-BKF6xI3d.mjs} +2 -2
  28. package/.output/server/_ssr/{adapters-D0d1fBKK.mjs → adapters-N4-yQ1vK.mjs} +4 -8
  29. package/.output/server/_ssr/{artifactFiles-BfE1070_.mjs → artifactFiles-Dl1EaUtJ.mjs} +3 -3
  30. package/.output/server/_ssr/{artifactView-CYV1r48i.mjs → artifactView-DX4P3Krh.mjs} +2 -2
  31. package/.output/server/_ssr/artifacts-DzWJrBxK.mjs +2 -0
  32. package/.output/server/_ssr/{auth-BP81awUE.mjs → auth-CbAfO4Ne.mjs} +9 -9
  33. package/.output/server/_ssr/{boot-sM4t8RJu.mjs → boot-BZ-YyUiD.mjs} +1397 -626
  34. package/.output/server/_ssr/{boot-pUGFIxSA.mjs → boot-BigKgB8p.mjs} +1 -1
  35. package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-CZJuWL5Z.mjs → bun-sqlite-dialect-BW9W1_Ps-B67XLJZt.mjs} +2 -2
  36. package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-C2PCtZfI.mjs → d1-sqlite-dialect-BLC8LXE6-nff_yHzH.mjs} +2 -2
  37. package/.output/server/_ssr/db-BF8vSovA.mjs +2 -0
  38. package/.output/server/_ssr/{dist-Z7v6ihws.mjs → dist-BGjVt6NE.mjs} +2 -2
  39. package/.output/server/_ssr/{factory-BQ_XiP23.mjs → factory-DNeo3vVt.mjs} +2 -2
  40. package/.output/server/_ssr/{invite._token-CRAl6-yK.mjs → invite._token-Bipap1cl.mjs} +6 -6
  41. package/.output/server/_ssr/{invite._token-23daBIfe.mjs → invite._token-BlbVjz-o.mjs} +2 -2
  42. package/.output/server/_ssr/{invite._token-VKmyC9-R.mjs → invite._token-z3PzCMzb.mjs} +5 -5
  43. package/.output/server/_ssr/{kysely-adapter-DjQPkqgJ.mjs → kysely-adapter-C1ww7PKr.mjs} +1 -1
  44. package/.output/server/_ssr/{lifecycleUi-l3nx9i3T.mjs → lifecycleUi-5jMhxINb.mjs} +1 -3
  45. package/.output/server/_ssr/logger-C7aewtve.mjs +2 -0
  46. package/.output/server/_ssr/{loopApi-BfMnXaKT.mjs → loopApi-7MTSs6hy.mjs} +5 -5
  47. package/.output/server/_ssr/{loopApi-i7xdpokI.mjs → loopApi-JzGGZZp2.mjs} +31 -25
  48. package/.output/server/_ssr/{loops._loopId-jXSgPWG1.mjs → loops._loopId-CJxQ0EG4.mjs} +4 -4
  49. package/.output/server/_ssr/{loops._loopId-DOPfN_Op.mjs → loops._loopId-DFkyTJR3.mjs} +106 -132
  50. package/.output/server/_ssr/{loops._loopId_.runs._runId-DiBP2rCe.mjs → loops._loopId_.runs._runId-DkG-ZCD1.mjs} +10 -17
  51. package/.output/server/_ssr/{loops._loopId_.runs._runId-BhoM6DWj.mjs → loops._loopId_.runs._runId-lTigSOmT.mjs} +4 -4
  52. package/.output/server/_ssr/{machineFns-ChO1NM3C.mjs → machineFns-Dda8-rBY.mjs} +3 -3
  53. package/.output/server/_ssr/{node-sqlite-dialect-BGlhyZkk.mjs → node-sqlite-dialect-BS2OAFJh.mjs} +2 -2
  54. package/.output/server/_ssr/{notifyFns-DWotltSJ.mjs → notifyFns-C6eyIFZE.mjs} +7 -8
  55. package/.output/server/_ssr/{notifyFns-B1MSIzrT.mjs → notifyFns-C9N0QLe3.mjs} +3 -3
  56. package/.output/server/_ssr/{router-BOHN4CWd.mjs → router-DIfoLu1r.mjs} +30 -30
  57. package/.output/server/_ssr/{routes-DjaTMZqZ.mjs → routes-Bx0bRxt9.mjs} +2 -2
  58. package/.output/server/_ssr/{routes-BQjhKV-m.mjs → routes-DYJB0rKC.mjs} +5 -5
  59. package/.output/server/_ssr/{routes-C2VJzARp.mjs → routes-bWgX0tRE.mjs} +6 -6
  60. package/.output/server/_ssr/runDiff-B9t7ouYj.mjs +2 -0
  61. package/.output/server/_ssr/ssr.mjs +51 -51
  62. package/.output/server/_ssr/store-Dw4LiFjE.mjs +2 -0
  63. package/.output/server/_ssr/{t._teamId-o86wLJrg.mjs → t._teamId-B_ieXBNF.mjs} +6 -6
  64. package/.output/server/_ssr/{t._teamId-CRgNlDGk.mjs → t._teamId-C_KZZ4Xh.mjs} +5 -5
  65. package/.output/server/_ssr/{t._teamId-D_vi_OuG.mjs → t._teamId-D9nCEa2h.mjs} +2 -2
  66. package/.output/server/_ssr/{teamFns-D4I-0dEB.mjs → teamFns-BBIbatdZ.mjs} +2 -2
  67. package/.output/server/_ssr/{teamFns-C3vnwAqv.mjs → teamFns-O3ZmtZL2.mjs} +3 -3
  68. package/.output/server/_ssr/tokens-DI_pklQB.mjs +2 -0
  69. package/.output/server/_ssr/{ui-WGITbP6Z.mjs → ui-B6mE5-5v.mjs} +7 -23
  70. package/.output/server/{_tanstack-start-manifest_v-DYC0z7st.mjs → _tanstack-start-manifest_v-DKnfwHZr.mjs} +28 -28
  71. package/.output/server/drizzle/0014_luxuriant_scrambler.sql +5 -0
  72. package/.output/server/drizzle/0015_run_history_foundation.sql +43 -0
  73. package/.output/server/drizzle/meta/_journal.json +14 -0
  74. package/.output/server/index.mjs +106 -106
  75. package/drizzle/0014_luxuriant_scrambler.sql +5 -0
  76. package/drizzle/0015_run_history_foundation.sql +43 -0
  77. package/drizzle/meta/_journal.json +14 -0
  78. package/package.json +1 -1
  79. package/.output/public/assets/app-DzFILlbu.css +0 -2
  80. package/.output/public/assets/index-BtvLZjhl.js +0 -12
  81. package/.output/public/assets/lifecycleUi-B8Je9exd.js +0 -1
  82. package/.output/public/assets/loops._loopId-BCK4oIRv.js +0 -4
  83. package/.output/public/assets/notifyFns-BneSItOi.js +0 -1
  84. package/.output/public/assets/ui-RFP3R3lU.js +0 -1
  85. package/.output/server/_ssr/artifacts-CSGRJdSy.mjs +0 -2
  86. package/.output/server/_ssr/db-Cc6I8bWL.mjs +0 -2
  87. package/.output/server/_ssr/logger-CHoC5_kz.mjs +0 -2
  88. package/.output/server/_ssr/runDiff-SlGPjjNq.mjs +0 -113
  89. package/.output/server/_ssr/store-BjXC623Z.mjs +0 -2
  90. package/.output/server/_ssr/tokens-BCOvumer.mjs +0 -2
@@ -1,2 +1,2 @@
1
- import { U as getArtifactSync, Y as getGateway, q as getCliGateway } from "./boot-sM4t8RJu.mjs";
1
+ import { U as getArtifactSync, Y as getGateway, q as getCliGateway } from "./boot-BZ-YyUiD.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-BP81awUE.mjs";
1
+ import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-CbAfO4Ne.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-CZJuWL5Z.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/bun-sqlite-dialect-BW9W1_Ps-B67XLJZt.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-BP81awUE.mjs";
1
+ import { a as SqliteQueryCompiler, i as SqliteAdapter } from "./auth-CbAfO4Ne.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-C2PCtZfI.js
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/d1-sqlite-dialect-BLC8LXE6-nff_yHzH.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-BZ-YyUiD.mjs";
2
+ export { db };
@@ -1,5 +1,5 @@
1
- import { _ as logger, o as createAdapterFactory } from "./factory-BQ_XiP23.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/dist-Z7v6ihws.js
1
+ import { _ as logger, o as createAdapterFactory } from "./factory-DNeo3vVt.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/dist-BGjVt6NE.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 { 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
1
+ import { J as getEnvVar, a as BetterAuthError, z as env } from "./boot-BZ-YyUiD.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/factory-DNeo3vVt.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,13 +1,13 @@
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 { l as btnPrimary } from "./ui-WGITbP6Z.mjs";
3
+ import { l as btnPrimary } from "./ui-B6mE5-5v.mjs";
4
4
  import { d as useNavigate } from "../_libs/@tanstack/react-router+[...].mjs";
5
- import { i as PievoLogo, s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
5
+ import { i as PievoLogo, s as useSession } from "./LoopPlaybook-C86vJIjZ.mjs";
6
6
  import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
7
- import { c as redeemTeamInvite } from "./teamFns-D4I-0dEB.mjs";
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
7
+ import { c as redeemTeamInvite } from "./teamFns-BBIbatdZ.mjs";
8
+ import { t as Route } from "./invite._token-z3PzCMzb.mjs";
9
+ import { t as SignIn } from "./SignIn-BQQiD3Ss.mjs";
10
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-Bipap1cl.js
11
11
  var import_react = /* @__PURE__ */ __toESM(require_react());
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
13
  /**
@@ -1,7 +1,7 @@
1
1
  import { g as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
2
  import { f as useRouter } from "../_libs/@tanstack/react-router+[...].mjs";
3
- import { r as LoadErrorCard } from "./actionUi-mDYOvJdB.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-23daBIfe.js
3
+ import { r as LoadErrorCard } from "./actionUi-BKF6xI3d.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-BlbVjz-o.js
5
5
  var import_jsx_runtime = require_jsx_runtime();
6
6
  /**
7
7
  * Invite-link redeem (`/invite/<token>`, design §4 option B). The recipient opens
@@ -1,9 +1,9 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
- import { c as getAuthState } from "./loopApi-BfMnXaKT.mjs";
3
- import { a as authClient } from "./LoopPlaybook-BC9Dvnw2.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-VKmyC9-R.js
5
- var $$splitErrorComponentImporter = () => import("./invite._token-23daBIfe.mjs");
6
- var $$splitComponentImporter = () => import("./invite._token-CRAl6-yK.mjs");
2
+ import { c as getAuthState } from "./loopApi-7MTSs6hy.mjs";
3
+ import { a as authClient } from "./LoopPlaybook-C86vJIjZ.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/invite._token-z3PzCMzb.js
5
+ var $$splitErrorComponentImporter = () => import("./invite._token-BlbVjz-o.mjs");
6
+ var $$splitComponentImporter = () => import("./invite._token-Bipap1cl.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-BP81awUE.mjs";
1
+ import { r as kyselyAdapter, t as createKyselyAdapter } from "./auth-CbAfO4Ne.mjs";
2
2
  export { createKyselyAdapter, kyselyAdapter };
@@ -1,9 +1,8 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/lifecycleUi-l3nx9i3T.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/lifecycleUi-5jMhxINb.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
3
  /** Derive product lifecycle state only from durable server facts. */
4
4
  function deriveLoopLifecycle(job) {
5
5
  if (job.deleteRequestedAt != null) return "deleting";
6
- if (job.completedAt != null) return "completed";
7
6
  const running = job.runs.find((run) => run.running);
8
7
  if (!job.enabled && running?.cancelRequested) return "stopping";
9
8
  if (!job.enabled && (job.running || running)) return "paused-finishing";
@@ -26,7 +25,6 @@ function lifecycleDisplay(detail) {
26
25
  if (running && detail.machine.daemonProtocol !== 2) return DAEMON_UPGRADE_REQUIRED;
27
26
  if (state === "stopping" && running && !detail.machine.online) return `Stopping · waiting for ${detail.machine.name || "machine"}`;
28
27
  switch (state) {
29
- case "completed": return "Completed";
30
28
  case "deleting": return "Deleting";
31
29
  case "stopping": return "Stopping";
32
30
  case "paused-finishing": return detail.summary.pauseCause?.kind === "blocked" ? "Paused — blocked · current run finishing" : detail.summary.pauseCause?.kind === "owner" ? "Paused by owner · current run finishing" : "Paused · current run finishing";
@@ -0,0 +1,2 @@
1
+ import { kt as logger } from "./boot-BZ-YyUiD.mjs";
2
+ export { logger };
@@ -1,5 +1,5 @@
1
1
  import { n as createServerFn, r as getServerFnById, t as TSS_SERVER_FUNCTION } from "./ssr.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-BfMnXaKT.js
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-7MTSs6hy.js
3
3
  var createSsrRpc = (functionId) => {
4
4
  const url = "/_serverFn/" + functionId;
5
5
  const serverFnMeta = { id: functionId };
@@ -86,9 +86,9 @@ var deleteJob = createServerFn({ method: "POST" }).validator((id) => id).handler
86
86
  createServerFn({ method: "POST" }).validator((d) => d).handler(createSsrRpc("0cb2218861830aae4338b814b3819e15100942beab970bc4c188f88b8cb6bc7e"));
87
87
  var runJob = createServerFn({ method: "POST" }).validator((id) => id).handler(createSsrRpc("0c9031f2f6a9ac0b1c60075833169755ef1815324918d1426c966ac8db563798"));
88
88
  var evolveJob = createServerFn({ method: "POST" }).validator((id) => id).handler(createSsrRpc("8a11b8d76ad42203a4bf128db0b8e0f2d6c947300dbee7a51498418404f211cd"));
89
- /** Agent-First edit: durably queue an owner instruction. A pending edit is
90
- * updated in place; an edit already running gets one follow-up. */
91
- var requestEdit = createServerFn({ method: "POST" }).validator((d) => d).handler(createSsrRpc("1d8c66fa6397951aa72c16551c8fa41a019fce841a5759eb7d67496ef5e0b250"));
89
+ /** Agent-first steer: durably queue an owner instruction. A pending steer is
90
+ * updated in place; a steer already running gets one follow-up. */
91
+ var requestSteer = createServerFn({ method: "POST" }).validator((d) => d).handler(createSsrRpc("38b831a8de4883e3d877f2169eaebde5864a2f256b1c5c790fa669702968cff9"));
92
92
  /** Dedicated Stop-run operation. Pending work cancels immediately; running work
93
93
  * records intent and stays Running until the daemon reports its actual result. */
94
94
  var stopRun = createServerFn({ method: "POST" }).validator((id) => id).handler(createSsrRpc("6850ba403da9dec5aff45794eb52636ca540ddec2d9e59f5c75ccbb852bfeacb"));
@@ -102,4 +102,4 @@ var mintClaim = createServerFn({ method: "POST" }).validator((teamId) => teamId)
102
102
  /** Poll a claim while the New-loop dialog waits for Claude Code to create the loop. */
103
103
  var claimStatus = createServerFn({ method: "GET" }).validator((token) => token).handler(createSsrRpc("4b0db7d6c8f25383a3526598cb0c1881db6cf413e451e9478687c05666461347"));
104
104
  //#endregion
105
- export { stopJob as C, startJob as S, mintClaim as _, evolveJob as a, requestEdit as b, getAuthState as c, getJobDetail as d, getRunDiff as f, loadOlderRuns as g, listTemplates as h, deleteJob as i, getConfig as l, listMyTeams as m, claimStatus as n, getArtifact as o, listJobs as p, createSsrRpc as r, getArtifacts as s, canViewTeam as t, getDefaultTeam as u, patchJob as v, stopRun as w, runJob as x, pauseJob as y };
105
+ export { stopJob as C, startJob as S, mintClaim as _, evolveJob as a, requestSteer as b, getAuthState as c, getJobDetail as d, getRunDiff as f, loadOlderRuns as g, listTemplates as h, deleteJob as i, getConfig as l, listMyTeams as m, claimStatus as n, getArtifact as o, listJobs as p, createSsrRpc as r, getArtifacts as s, canViewTeam as t, getDefaultTeam as u, patchJob as v, stopRun as w, runJob as x, pauseJob as y };
@@ -1,9 +1,9 @@
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";
1
+ import { $ as getMachine, $t as tryDeleteLoop, Et as listRunsBefore, It as normalizeProviderSetting, K as getChannel, L as ensureServer, Lt as pauseLoop, Nt as machinePresence, Ot as listTeamsForUser, Q as getLoop, Ut as requestDeleteLoop, V as forceDeleteLoop, Wt as requestRunCancel, Xt as stopLoop, Yt as startLoop, _ as canEvolve, b as coerceUi, en as updateLoop, in as validateSteerInstruction, it as getTeamMember, nt as getRun, ot as hasRunningRun, rn as validateSchema, rt as getTeam, xt as listLoops, y as coerceCodingAgent } from "./boot-BZ-YyUiD.mjs";
2
2
  import { n as createServerFn } from "./ssr.mjs";
3
- import { i as toRunSummary, n as toJobDetail, r as toJobSummary } from "./adapters-D0d1fBKK.mjs";
4
- import { canAccessLoop, requestScope } from "./auth-BP81awUE.mjs";
3
+ import { i as toRunSummary, n as toJobDetail, r as toJobSummary } from "./adapters-N4-yQ1vK.mjs";
4
+ import { canAccessLoop, requestScope } from "./auth-CbAfO4Ne.mjs";
5
5
  import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-i7xdpokI.js
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/loopApi-JzGGZZp2.js
7
7
  var meta_default$6 = {
8
8
  name: "dependency-triage",
9
9
  label: "Dependency Triage",
@@ -25,8 +25,8 @@ var meta_default$4 = {
25
25
  var meta_default$3 = {
26
26
  name: "follow-up-tracker",
27
27
  label: "Follow-up Tracker",
28
- desc: "A closed loop that watches what happens after something you just shipped and finishes itself once the outcome is confirmed. Works best pasted right after finishing the task you want tracked.",
29
- description: "Look at what was just built or shipped in this session and set up a loop that tracks its aftermath. Before creating anything, verify a concrete way to observe the outcome exists on this machine - logs, metrics or MCP tools, a URL to check, or gh - and run it once as a smoke test; if nothing can actually be observed, say so and do not create a blind loop. Define a concrete finish condition and create the loop closed, with that condition as its goal. Propose a cadence that fits the thing being tracked (a few runs per day is a common default) and confirm it with me. On each run, observe through the verified path, report what you find (and a metric when one is natural), and finish the loop only when the condition is genuinely met; if things regress, report that plainly. Set up a modest dashboard at creation: an embed of the latest report, plus a metric chart when a metric was defined."
28
+ desc: "A continuous loop that watches what happens after something you just shipped and surfaces regressions against a standing objective. Works best pasted right after finishing the task you want tracked.",
29
+ description: "Look at what was just built or shipped in this session and set up a loop that tracks its aftermath. Before creating anything, verify a concrete way to observe the outcome exists on this machine - logs, metrics or MCP tools, a URL to check, or gh - and run it once as a smoke test; if nothing can actually be observed, say so and do not create a blind loop. Define a concrete standing objective. Propose a cadence that fits the thing being tracked (a few runs per day is a common default) and confirm it with me. On each run, observe through the verified path, report what you find (and every declared metric), and keep watching after the target is met so regressions remain visible; the owner decides when to pause or delete the loop. Set up a modest dashboard at creation: an embed of the latest report, plus a metric chart when a metric was defined."
30
30
  };
31
31
  var meta_default$2 = {
32
32
  name: "housekeeper",
@@ -49,7 +49,7 @@ var meta_default = {
49
49
  var thumb_default$6 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of the loop's dashboard: the merged / deferred / blocked triage\n kanban over the open-dependency-PR count easing down. Colors ride the\n app's CSS variables. -->\n <rect x=\"10\" y=\"8\" width=\"36\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-green, #009b48)\"/>\n <rect x=\"10.5\" y=\"16.5\" width=\"35\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"15\" y=\"21\" width=\"20\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <path d=\"M37 23l2 2 3.5-4\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"10.5\" y=\"36.5\" width=\"35\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"15\" y=\"41\" width=\"24\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"15\" y=\"46\" width=\"14\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"54\" y=\"8\" width=\"36\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-yellow, #ffd500)\"/>\n <rect x=\"54.5\" y=\"16.5\" width=\"35\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"59\" y=\"21\" width=\"22\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"59\" y=\"26\" width=\"12\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"98\" y=\"8\" width=\"36\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-red, #b71234)\"/>\n <rect x=\"98.5\" y=\"16.5\" width=\"35\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"103\" y=\"21\" width=\"18\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <circle cx=\"127\" cy=\"24\" r=\"2.5\" stroke=\"var(--color-rubik-red, #b71234)\" stroke-width=\"1.4\"/>\n <path d=\"M125.3 22.3l3.4 3.4\" stroke=\"var(--color-rubik-red, #b71234)\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <rect x=\"54\" y=\"42\" width=\"24\" height=\"7\" rx=\"3.5\" fill=\"var(--color-interactive-soft, rgba(0,70,173,0.08))\"/>\n <path d=\"M60 47.5v-4m0 0l-1.7 1.7M60 43.5l1.7 1.7\" stroke=\"var(--color-rubik-blue, #0046ad)\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"65\" y=\"44.5\" width=\"10\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-rubik-blue, #0046ad)\" opacity=\"0.5\"/>\n <path d=\"M12 74h122\" stroke=\"var(--color-hairline, #e3e5ea)\" stroke-width=\"1.2\"/>\n <path d=\"M12 60 36 63 60 61 84 67 108 66 132 70\" stroke=\"var(--color-rubik-blue, #0046ad)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"12\" y=\"55\" width=\"20\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n</svg>\n";
50
50
  var thumb_default$5 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of the loop's dashboard: a doc page with stale lines caught and\n corrected, beside the drift count trending to zero. Colors ride the\n app's CSS variables. -->\n <rect x=\"10.5\" y=\"8.5\" width=\"61\" height=\"63\" rx=\"5\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"17\" y=\"15\" width=\"30\" height=\"3\" rx=\"1.5\" fill=\"var(--color-wire, #cfd3db)\"/>\n <g fill=\"var(--color-hairline, #e3e5ea)\">\n <rect x=\"17\" y=\"25\" width=\"48\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"17\" y=\"31\" width=\"40\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"17\" y=\"49\" width=\"48\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"17\" y=\"61\" width=\"28\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <rect x=\"17\" y=\"37\" width=\"44\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-rubik-orange, #ff5800)\" opacity=\"0.45\"/>\n <path d=\"M15 38.25h48\" stroke=\"var(--color-rubik-orange, #ff5800)\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"17\" y=\"43\" width=\"38\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <path d=\"M58 43.5l2 2 3.5-4\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"17\" y=\"55\" width=\"34\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-rubik-orange, #ff5800)\" opacity=\"0.45\"/>\n <path d=\"M15 56.25h40\" stroke=\"var(--color-rubik-orange, #ff5800)\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"80\" y=\"12\" width=\"24\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-orange, #ff5800)\"/>\n <path d=\"M80 66h54\" stroke=\"var(--color-hairline, #e3e5ea)\" stroke-width=\"1.2\"/>\n <path d=\"M81 26 92 33 103 31 114 45 125 56 133 64\" stroke=\"var(--color-rubik-orange, #ff5800)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"133\" cy=\"64\" r=\"3\" fill=\"var(--color-rubik-green, #009b48)\"/>\n</svg>\n";
51
51
  var thumb_default$4 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of the loop's mechanics: a production log pane with an incident\n traced to a verified fix PR, and the actionable-error count falling.\n Colors ride the app's CSS variables. -->\n <rect x=\"10.5\" y=\"8.5\" width=\"62\" height=\"63\" rx=\"5\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"17\" y=\"15\" width=\"26\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-red, #b71234)\"/>\n <g fill=\"var(--color-hairline, #e3e5ea)\">\n <rect x=\"24\" y=\"26\" width=\"40\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"24\" y=\"50\" width=\"42\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"24\" y=\"62\" width=\"30\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <circle cx=\"19.5\" cy=\"27.25\" r=\"1.5\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"15\" y=\"34.5\" width=\"53\" height=\"9\" rx=\"3\" fill=\"var(--color-rubik-red, #b71234)\" opacity=\"0.08\"/>\n <circle cx=\"19.5\" cy=\"39\" r=\"2\" fill=\"var(--color-rubik-red, #b71234)\"/>\n <rect x=\"24\" y=\"37.75\" width=\"38\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <circle cx=\"19.5\" cy=\"51.25\" r=\"1.5\" fill=\"var(--color-wire, #cfd3db)\"/>\n <circle cx=\"19.5\" cy=\"63.25\" r=\"1.5\" fill=\"var(--color-wire, #cfd3db)\"/>\n <path d=\"M72 39h16\" stroke=\"var(--color-wire, #cfd3db)\" stroke-width=\"1.2\" stroke-dasharray=\"3 3\"/>\n <rect x=\"90.5\" y=\"28.5\" width=\"43\" height=\"21\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"96\" y=\"34\" width=\"22\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"96\" y=\"40\" width=\"14\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n <circle cx=\"125\" cy=\"39\" r=\"5.5\" fill=\"var(--color-success-soft, rgba(0,155,72,0.1))\"/>\n <path d=\"M122.5 39l1.8 1.8 3.2-3.6\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"90\" y=\"12\" width=\"20\" height=\"3\" rx=\"1.5\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n <path d=\"M90 68h44\" stroke=\"var(--color-hairline, #e3e5ea)\" stroke-width=\"1.2\"/>\n <path d=\"M91 56 100 59 109 57 118 63 127 65 133 66.5\" stroke=\"var(--color-rubik-red, #b71234)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"133\" cy=\"66.5\" r=\"2.5\" fill=\"var(--color-rubik-green, #009b48)\"/>\n</svg>\n";
52
- var thumb_default$3 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of a closed loop driving toward its goal: a goal chip, observed\n checkpoints ticking off, and the finish. Colors ride the app's CSS variables. -->\n <rect x=\"10\" y=\"8\" width=\"62\" height=\"11\" rx=\"5.5\" fill=\"var(--color-success-soft, rgba(0,155,72,0.1))\"/>\n <circle cx=\"18\" cy=\"13.5\" r=\"2\" fill=\"var(--color-rubik-green, #009b48)\"/>\n <rect x=\"24\" y=\"12.5\" width=\"40\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-rubik-green, #009b48)\" opacity=\"0.55\"/>\n <g stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"17\" cy=\"31\" r=\"4.5\" fill=\"none\"/>\n <path d=\"M15 31l1.6 1.6 2.8-3\"/>\n <circle cx=\"17\" cy=\"46\" r=\"4.5\" fill=\"none\"/>\n <path d=\"M15 46l1.6 1.6 2.8-3\"/>\n </g>\n <circle cx=\"17\" cy=\"61\" r=\"4.5\" stroke=\"var(--color-wire, #cfd3db)\" stroke-width=\"1.5\" fill=\"none\"/>\n <g fill=\"var(--color-wire, #cfd3db)\">\n <rect x=\"28\" y=\"29.5\" width=\"52\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"44.5\" width=\"44\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <g fill=\"var(--color-hairline, #e3e5ea)\">\n <rect x=\"28\" y=\"35\" width=\"34\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"50\" width=\"28\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"59.5\" width=\"48\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"65\" width=\"20\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <path d=\"M96 40h14\" stroke=\"var(--color-wire, #cfd3db)\" stroke-width=\"1.2\" stroke-dasharray=\"3 3\"/>\n <circle cx=\"121\" cy=\"40\" r=\"9\" fill=\"var(--color-success-soft, rgba(0,155,72,0.1))\"/>\n <path d=\"M116.5 40l3 3 5.5-6\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n";
52
+ var thumb_default$3 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of an ongoing loop tracking a standing objective through observed\n checkpoints. Colors ride the app's CSS variables. -->\n <rect x=\"10\" y=\"8\" width=\"62\" height=\"11\" rx=\"5.5\" fill=\"var(--color-success-soft, rgba(0,155,72,0.1))\"/>\n <circle cx=\"18\" cy=\"13.5\" r=\"2\" fill=\"var(--color-rubik-green, #009b48)\"/>\n <rect x=\"24\" y=\"12.5\" width=\"40\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-rubik-green, #009b48)\" opacity=\"0.55\"/>\n <g stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"17\" cy=\"31\" r=\"4.5\" fill=\"none\"/>\n <path d=\"M15 31l1.6 1.6 2.8-3\"/>\n <circle cx=\"17\" cy=\"46\" r=\"4.5\" fill=\"none\"/>\n <path d=\"M15 46l1.6 1.6 2.8-3\"/>\n </g>\n <circle cx=\"17\" cy=\"61\" r=\"4.5\" stroke=\"var(--color-wire, #cfd3db)\" stroke-width=\"1.5\" fill=\"none\"/>\n <g fill=\"var(--color-wire, #cfd3db)\">\n <rect x=\"28\" y=\"29.5\" width=\"52\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"44.5\" width=\"44\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <g fill=\"var(--color-hairline, #e3e5ea)\">\n <rect x=\"28\" y=\"35\" width=\"34\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"50\" width=\"28\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"59.5\" width=\"48\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"28\" y=\"65\" width=\"20\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <path d=\"M96 40h14\" stroke=\"var(--color-wire, #cfd3db)\" stroke-width=\"1.2\" stroke-dasharray=\"3 3\"/>\n <circle cx=\"121\" cy=\"40\" r=\"9\" fill=\"var(--color-success-soft, rgba(0,155,72,0.1))\"/>\n <path d=\"M116.5 40l3 3 5.5-6\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n";
53
53
  var thumb_default$2 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of the loop's mechanics: one proven deletion kept only because the\n checks stay green, a deferred candidate parked, and cleanups landing\n over time. Colors ride the app's CSS variables. -->\n <rect x=\"10.5\" y=\"8.5\" width=\"80\" height=\"63\" rx=\"5\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"17\" y=\"15\" width=\"34\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-yellow, #ffd500)\"/>\n <g fill=\"var(--color-hairline, #e3e5ea)\">\n <rect x=\"17\" y=\"25\" width=\"60\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"17\" y=\"43\" width=\"64\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"17\" y=\"61\" width=\"42\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n <rect x=\"15\" y=\"31.5\" width=\"70\" height=\"8\" rx=\"3\" fill=\"var(--color-rubik-red, #b71234)\" opacity=\"0.08\"/>\n <rect x=\"19\" y=\"34.25\" width=\"3.5\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-rubik-red, #b71234)\"/>\n <rect x=\"26\" y=\"34.25\" width=\"46\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <path d=\"M26 35.5h46\" stroke=\"var(--color-rubik-red, #b71234)\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <circle cx=\"20.5\" cy=\"53.25\" r=\"2\" fill=\"var(--color-rubik-yellow, #ffd500)\"/>\n <rect x=\"26\" y=\"52\" width=\"38\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"68\" y=\"50\" width=\"14\" height=\"6\" rx=\"3\" fill=\"var(--color-interactive-soft, rgba(0,70,173,0.08))\"/>\n <circle cx=\"113\" cy=\"22\" r=\"9\" fill=\"var(--color-success-soft, rgba(0,155,72,0.1))\"/>\n <path d=\"M108.5 22l3 3 5.5-6\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <g fill=\"var(--color-rubik-green, #009b48)\">\n <rect x=\"99\" y=\"60\" width=\"6\" height=\"8\" rx=\"1.5\" opacity=\"0.35\"/>\n <rect x=\"108\" y=\"55\" width=\"6\" height=\"13\" rx=\"1.5\" opacity=\"0.55\"/>\n <rect x=\"117\" y=\"50\" width=\"6\" height=\"18\" rx=\"1.5\" opacity=\"0.75\"/>\n <rect x=\"126\" y=\"44\" width=\"6\" height=\"24\" rx=\"1.5\"/>\n </g>\n</svg>\n";
54
54
  var thumb_default$1 = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of the loop's dashboard: a calendar of dated reports beside the\n newest report. Colors ride the app's CSS variables. -->\n <rect x=\"10\" y=\"10\" width=\"16\" height=\"3\" rx=\"1.5\" fill=\"var(--color-wire, #cfd3db)\"/>\n <g stroke=\"var(--color-hairline, #e3e5ea)\" fill=\"var(--color-surface, #fff)\">\n <rect x=\"10.5\" y=\"18.5\" width=\"15\" height=\"13\" rx=\"3\"/><rect x=\"29.5\" y=\"18.5\" width=\"15\" height=\"13\" rx=\"3\"/><rect x=\"48.5\" y=\"18.5\" width=\"15\" height=\"13\" rx=\"3\"/>\n <rect x=\"10.5\" y=\"35.5\" width=\"15\" height=\"13\" rx=\"3\"/><rect x=\"29.5\" y=\"35.5\" width=\"15\" height=\"13\" rx=\"3\"/><rect x=\"48.5\" y=\"35.5\" width=\"15\" height=\"13\" rx=\"3\"/>\n <rect x=\"10.5\" y=\"52.5\" width=\"15\" height=\"13\" rx=\"3\"/><rect x=\"29.5\" y=\"52.5\" width=\"15\" height=\"13\" rx=\"3\"/><rect x=\"48.5\" y=\"52.5\" width=\"15\" height=\"13\" rx=\"3\"/>\n </g>\n <g fill=\"var(--color-rubik-blue, #0046ad)\">\n <circle cx=\"18\" cy=\"25\" r=\"2\"/><circle cx=\"37\" cy=\"25\" r=\"2\"/><circle cx=\"56\" cy=\"25\" r=\"2\"/>\n <circle cx=\"18\" cy=\"42\" r=\"2\"/><circle cx=\"37\" cy=\"42\" r=\"2\"/>\n </g>\n <rect x=\"72.5\" y=\"10.5\" width=\"61\" height=\"59\" rx=\"5\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"79\" y=\"18\" width=\"28\" height=\"3\" rx=\"1.5\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"112\" y=\"17\" width=\"16\" height=\"5\" rx=\"2.5\" fill=\"var(--color-interactive-soft, rgba(0,70,173,0.08))\"/>\n <g fill=\"var(--color-hairline, #e3e5ea)\">\n <rect x=\"79\" y=\"28\" width=\"48\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"79\" y=\"34\" width=\"42\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"79\" y=\"40\" width=\"48\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"79\" y=\"46\" width=\"34\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"79\" y=\"56\" width=\"44\" height=\"2.5\" rx=\"1.25\"/>\n <rect x=\"79\" y=\"62\" width=\"26\" height=\"2.5\" rx=\"1.25\"/>\n </g>\n</svg>\n";
55
55
  var thumb_default = "<svg viewBox=\"0 0 144 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <!-- Mock of the loop's dashboard: a PR kanban (open -> merged) over the\n health-score trend. Colors ride the app's CSS variables. -->\n <rect x=\"10\" y=\"8\" width=\"58\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-yellow, #ffd500)\"/>\n <rect x=\"10.5\" y=\"16.5\" width=\"57\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"16\" y=\"21\" width=\"30\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"16\" y=\"26\" width=\"20\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"10.5\" y=\"36.5\" width=\"57\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"16\" y=\"41\" width=\"36\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <rect x=\"16\" y=\"46\" width=\"24\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"76\" y=\"8\" width=\"58\" height=\"3\" rx=\"1.5\" fill=\"var(--color-rubik-green, #009b48)\"/>\n <rect x=\"76.5\" y=\"16.5\" width=\"57\" height=\"15\" rx=\"4\" fill=\"var(--color-surface, #fff)\" stroke=\"var(--color-hairline, #e3e5ea)\"/>\n <rect x=\"82\" y=\"21\" width=\"28\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-wire, #cfd3db)\"/>\n <path d=\"M122 23.5l2.5 2.5 4.5-5\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M12 70 38 68 64 61 90 63 116 55 132 51\" stroke=\"var(--color-rubik-green, #009b48)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"12\" y=\"59\" width=\"22\" height=\"2.5\" rx=\"1.25\" fill=\"var(--color-hairline, #e3e5ea)\"/>\n</svg>\n";
@@ -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-BP81awUE.mjs");
138
+ const { authEnabled } = await import("./auth-CbAfO4Ne.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-BfE1070_.mjs");
247
+ const { listLoopArtifacts } = await import("./artifactFiles-Dl1EaUtJ.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-BfE1070_.mjs");
258
+ const { readLoopArtifact } = await import("./artifactFiles-Dl1EaUtJ.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-SlGPjjNq.mjs");
277
+ const { computeRunDiff } = await import("./runDiff-B9t7ouYj.mjs");
278
278
  return computeRunDiff(data.runId);
279
279
  });
280
280
  var listTemplates_createServerFn_handler = createServerRpc({
@@ -300,6 +300,13 @@ var patchJob = createServerFn({ method: "POST" }).validator((d) => d).handler(pa
300
300
  if (p.continuousDelayMinutes !== void 0 && (!Number.isInteger(p.continuousDelayMinutes) || p.continuousDelayMinutes < 1)) return { error: "continuousDelayMinutes must be an integer >= 1" };
301
301
  if (p.channelId && enforce && (await getChannel(p.channelId))?.teamId !== owned.loop.teamId) return { error: "channel not found" };
302
302
  const agent = coerceCodingAgent(p.agent);
303
+ let metricSchema;
304
+ if (p.metricSchema !== void 0) if (p.metricSchema === null) metricSchema = null;
305
+ else {
306
+ const validated = await validateSchema(data.id, p.metricSchema);
307
+ if (!validated.ok) return { error: validated.detail };
308
+ metricSchema = validated.value;
309
+ }
303
310
  const loop = await updateLoop(data.id, {
304
311
  ...p.name !== void 0 ? { name: p.name.trim() || null } : {},
305
312
  ...p.cron !== void 0 ? { cron: p.cron } : {},
@@ -311,7 +318,7 @@ var patchJob = createServerFn({ method: "POST" }).validator((d) => d).handler(pa
311
318
  ...agent ? { agent } : {},
312
319
  ...p.goal !== void 0 ? { goal: p.goal?.trim() || null } : {},
313
320
  ...p.taskFile !== void 0 ? { taskFile: p.taskFile.trim() || null } : {},
314
- ...p.stateSchema !== void 0 ? { stateSchema: coerceStateSchema(p.stateSchema) ?? null } : {},
321
+ ...p.metricSchema !== void 0 ? { metricSchema: metricSchema ?? null } : {},
315
322
  ...p.ui !== void 0 ? { ui: coerceUi(p.ui) ?? null } : {},
316
323
  ...p.exec?.workdir !== void 0 ? { workdir: p.exec.workdir.trim() || null } : {},
317
324
  ...p.exec?.model !== void 0 ? { model: normalizeProviderSetting(p.exec.model) } : {},
@@ -345,7 +352,6 @@ var startJob = createServerFn({ method: "POST" }).validator((id) => id).handler(
345
352
  const owned = await ownedLoop(id);
346
353
  if (!owned) return { error: "not found" };
347
354
  if (owned.loop.deleteRequestedAt) return { error: "loop is being deleted" };
348
- if (owned.loop.completedAt) return { error: "completed loops must be reopened" };
349
355
  const loop = await startLoop(id);
350
356
  if (!loop) return { error: "not found" };
351
357
  scheduler.addLoop(loop);
@@ -389,7 +395,7 @@ var deleteJob = createServerFn({ method: "POST" }).validator((id) => id).handler
389
395
  if (!await requestDeleteLoop(id)) return { error: "not found" };
390
396
  if (unreachable && mayRetireAuthority) {
391
397
  if (!await forceDeleteLoop(id)) return { error: "delete failed; server data was not deleted" };
392
- const { logger } = await import("./logger-CHoC5_kz.mjs");
398
+ const { logger } = await import("./logger-C7aewtve.mjs");
393
399
  logger.child({ mod: "loop-lifecycle" }).warn({
394
400
  action: "unreachable-delete",
395
401
  loopId: id,
@@ -429,7 +435,7 @@ var forceDeleteJob = createServerFn({ method: "POST" }).validator((d) => d).hand
429
435
  }
430
436
  scheduler.removeLoop(data.id);
431
437
  if (!await forceDeleteLoop(data.id)) return { error: "force delete failed; server data was not deleted" };
432
- const { logger } = await import("./logger-CHoC5_kz.mjs");
438
+ const { logger } = await import("./logger-C7aewtve.mjs");
433
439
  logger.child({ mod: "loop-lifecycle" }).warn({
434
440
  action: "force-delete",
435
441
  loopId: data.id,
@@ -477,17 +483,17 @@ var evolveJob = createServerFn({ method: "POST" }).validator((id) => id).handler
477
483
  coalesced: queued.state === "coalesced"
478
484
  };
479
485
  });
480
- var requestEdit_createServerFn_handler = createServerRpc({
481
- id: "1d8c66fa6397951aa72c16551c8fa41a019fce841a5759eb7d67496ef5e0b250",
482
- name: "requestEdit",
486
+ var requestSteer_createServerFn_handler = createServerRpc({
487
+ id: "38b831a8de4883e3d877f2169eaebde5864a2f256b1c5c790fa669702968cff9",
488
+ name: "requestSteer",
483
489
  filename: "src/server/loopApi.ts"
484
- }, (opts) => requestEdit.__executeServer(opts));
485
- var requestEdit = createServerFn({ method: "POST" }).validator((d) => d).handler(requestEdit_createServerFn_handler, async ({ data }) => {
490
+ }, (opts) => requestSteer.__executeServer(opts));
491
+ var requestSteer = createServerFn({ method: "POST" }).validator((d) => d).handler(requestSteer_createServerFn_handler, async ({ data }) => {
486
492
  const { scheduler } = await backend();
487
493
  if (!await ownedLoop(data.id)) return { error: "not found" };
488
- const instruction = data.instruction.trim();
489
- if (!instruction) return { error: "describe what to change" };
490
- const queued = await scheduler.requestEdit(data.id, instruction);
494
+ const instruction = validateSteerInstruction(data.instruction);
495
+ if (!instruction.ok) return { error: instruction.detail };
496
+ const queued = await scheduler.requestSteer(data.id, instruction.value);
491
497
  if (!("run" in queued)) return { error: queued.reason };
492
498
  return {
493
499
  ok: true,
@@ -520,7 +526,7 @@ var mintClaim_createServerFn_handler = createServerRpc({
520
526
  }, (opts) => mintClaim.__executeServer(opts));
521
527
  var mintClaim = createServerFn({ method: "POST" }).validator((teamId) => teamId).handler(mintClaim_createServerFn_handler, async ({ data: teamId }) => {
522
528
  await backend();
523
- const { mintDeviceToken, rememberConnectKey } = await import("./tokens-BCOvumer.mjs");
529
+ const { mintDeviceToken, rememberConnectKey } = await import("./tokens-DI_pklQB.mjs");
524
530
  const { userId, teamId: active } = await requestScope(teamId);
525
531
  const owner = userId ?? "shared";
526
532
  const token = mintDeviceToken();
@@ -545,4 +551,4 @@ var claimStatus = createServerFn({ method: "GET" }).validator((token) => token).
545
551
  } : { done: false };
546
552
  });
547
553
  //#endregion
548
- export { canViewTeam_createServerFn_handler, claimStatus_createServerFn_handler, deleteJob_createServerFn_handler, evolveJob_createServerFn_handler, forceDeleteJob_createServerFn_handler, getArtifact_createServerFn_handler, getArtifacts_createServerFn_handler, getAuthState_createServerFn_handler, getConfig_createServerFn_handler, getDefaultTeam_createServerFn_handler, getJobDetail_createServerFn_handler, getRunDiff_createServerFn_handler, listJobs_createServerFn_handler, listMyTeams_createServerFn_handler, listTemplates_createServerFn_handler, loadOlderRuns_createServerFn_handler, mintClaim_createServerFn_handler, patchJob_createServerFn_handler, pauseJob_createServerFn_handler, requestEdit_createServerFn_handler, runJob_createServerFn_handler, startJob_createServerFn_handler, stopJob_createServerFn_handler, stopRun_createServerFn_handler };
554
+ export { canViewTeam_createServerFn_handler, claimStatus_createServerFn_handler, deleteJob_createServerFn_handler, evolveJob_createServerFn_handler, forceDeleteJob_createServerFn_handler, getArtifact_createServerFn_handler, getArtifacts_createServerFn_handler, getAuthState_createServerFn_handler, getConfig_createServerFn_handler, getDefaultTeam_createServerFn_handler, getJobDetail_createServerFn_handler, getRunDiff_createServerFn_handler, listJobs_createServerFn_handler, listMyTeams_createServerFn_handler, listTemplates_createServerFn_handler, loadOlderRuns_createServerFn_handler, mintClaim_createServerFn_handler, patchJob_createServerFn_handler, pauseJob_createServerFn_handler, requestSteer_createServerFn_handler, runJob_createServerFn_handler, startJob_createServerFn_handler, stopJob_createServerFn_handler, stopRun_createServerFn_handler };
@@ -1,8 +1,8 @@
1
1
  import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
2
- import { c as getAuthState } from "./loopApi-BfMnXaKT.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");
2
+ import { c as getAuthState } from "./loopApi-7MTSs6hy.mjs";
3
+ import { a as authClient } from "./LoopPlaybook-C86vJIjZ.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-CJxQ0EG4.js
5
+ var $$splitComponentImporter = () => import("./loops._loopId-DFkyTJR3.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