loopable-cli 0.1.0 → 0.2.0

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 (98) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/_connectorId-m67WbiJ8.js +1 -0
  3. package/.output/public/assets/_loopId-Bf4K5sdd.js +1 -0
  4. package/.output/public/assets/_taskId-eCKkcVOx.js +1 -0
  5. package/.output/public/assets/alert-BT2EVMJP.js +1 -0
  6. package/.output/public/assets/arrow-left-CWUZt6k2.js +1 -0
  7. package/.output/public/assets/arrow-right-dy_oOg_c.js +1 -0
  8. package/.output/public/assets/connection-status-DCqqmY_6.js +1 -0
  9. package/.output/public/assets/connector-icon-qGpNsPgH.js +1 -0
  10. package/.output/public/assets/connectors-DxXlc9zF.js +1 -0
  11. package/.output/public/assets/{external-link-D46X-bXa.js → external-link-DC11orFA.js} +1 -1
  12. package/.output/public/assets/gaps-CoTA-PzA.js +1 -0
  13. package/.output/public/assets/inbox-CLEXUXCI.js +1 -0
  14. package/.output/public/assets/index-Cndsw84p.js +16 -0
  15. package/.output/public/assets/{loader-CcBl2u8m.js → loader-B4Epchm_.js} +1 -1
  16. package/.output/public/assets/loop-form-BvizlZdR.js +1 -0
  17. package/.output/public/assets/loops-Dbe_mf5T.js +1 -0
  18. package/.output/public/assets/new-DPEaXKAY.js +1 -0
  19. package/.output/public/assets/play-DD4xQgvi.js +1 -0
  20. package/.output/public/assets/preload-helper-CfdAYKD7.js +3 -0
  21. package/.output/public/assets/rolldown-runtime-CbXtAM7H.js +1 -0
  22. package/.output/public/assets/runners-BVBggS5B.js +1 -0
  23. package/.output/public/assets/select-Cppu-hti.js +1 -0
  24. package/.output/public/assets/setting-fields-BT1naVJX.js +3 -0
  25. package/.output/public/assets/{styles-DZL5V1o7.css → styles-D3sonCfX.css} +1 -1
  26. package/.output/public/assets/switch-hRIbNGOj.js +1 -0
  27. package/.output/public/assets/task-list-CrptnI1N.js +1 -0
  28. package/.output/public/assets/textarea-Fyuzi6Vp.js +1 -0
  29. package/.output/public/assets/{trash-2-D6u6NpzO.js → trash-2-BXZzBsoV.js} +1 -1
  30. package/.output/public/assets/useValueChanged-VVyq4hb9.js +1 -0
  31. package/.output/server/{_connectorId-8nb5yOzG.mjs → _connectorId-DcSnoRjk.mjs} +8 -8
  32. package/.output/server/_libs/@base-ui/react+[...].mjs +427 -427
  33. package/.output/server/{_loopId-BsUL1SeL.mjs → _loopId-G_TAkYtS.mjs} +8 -8
  34. package/.output/server/_ssr/{access-zIl15o8y.mjs → access-B7TcOZ7F.mjs} +2 -2
  35. package/.output/server/_ssr/{agents-Btql102J.mjs → agents-CrUmIQpi.mjs} +3 -3
  36. package/.output/server/_ssr/{agents-DAOZPgO2.mjs → agents-Dms_6TBF.mjs} +3 -3
  37. package/.output/server/_ssr/{alert-NEiOCTOl.mjs → alert-DQvzE7bu.mjs} +1 -1
  38. package/.output/server/_ssr/{callback-CUINvl7M.mjs → callback-D20cVD2w.mjs} +21 -4
  39. package/.output/server/_ssr/{client-CKkOfh-s.mjs → client-BtVRVhQ2.mjs} +4 -2
  40. package/.output/server/_ssr/{connection-status-Bi5peUAk.mjs → connection-status-BZr3Y-IC.mjs} +2 -2
  41. package/.output/server/_ssr/{connections-qnw2GVlP.mjs → connections-ypex3qUd.mjs} +3 -3
  42. package/.output/server/_ssr/{connector-icon-DZXQLLFo.mjs → connector-icon-CFrrHjzR.mjs} +2 -2
  43. package/.output/server/_ssr/{connectors-BHNwuIMj.mjs → connectors-4yzKb0KG.mjs} +5 -5
  44. package/.output/server/_ssr/{connectors-C28g0i4c.mjs → connectors-BZly0yGF.mjs} +2 -2
  45. package/.output/server/_ssr/{gaps-RAFSXLZf.mjs → gaps-D2Zh8sEo.mjs} +3 -3
  46. package/.output/server/_ssr/inbox-C2VBGLa5.mjs +114 -0
  47. package/.output/server/_ssr/{loop-form-DlObSewZ.mjs → loop-form-D-U-kU4k.mjs} +8 -7
  48. package/.output/server/_ssr/{loops-xt2Bn7_q.mjs → loops-D0XJ8eBb.mjs} +8 -8
  49. package/.output/server/_ssr/{loops-APFcP0y6.mjs → loops-Og_G3KyZ.mjs} +6 -6
  50. package/.output/server/_ssr/{new-DfKyd2Wa.mjs → new-CajvgIog.mjs} +5 -5
  51. package/.output/server/_ssr/{router-3WmpE5b_.mjs → router-BbrBz36P.mjs} +63 -62
  52. package/.output/server/_ssr/{runners-By-mwc3F.mjs → runners-B_WuF8UJ.mjs} +3 -3
  53. package/.output/server/_ssr/{runners-DtXs4Q8a.mjs → runners-D-0_lfiq.mjs} +3 -3
  54. package/.output/server/_ssr/{runners-DI_NxpHC.mjs → runners-zqF_zbEc.mjs} +4 -4
  55. package/.output/server/_ssr/{secrets-Hqti-niS.mjs → secrets-CRnpwGBh.mjs} +2 -2
  56. package/.output/server/_ssr/{setting-fields-8vKFj4df.mjs → setting-fields-mpXfGftI.mjs} +6 -13
  57. package/.output/server/_ssr/ssr.mjs +37 -33
  58. package/.output/server/_ssr/{start-Bdc2GJUI.mjs → start-BgTj-h_C.mjs} +4 -4
  59. package/.output/server/_ssr/{switch-ReNglgH6.mjs → switch-1pnd_bPJ.mjs} +2 -2
  60. package/.output/server/_ssr/{task-list-CUITIqkb.mjs → task-list-BnQJ94Dk.mjs} +9 -8
  61. package/.output/server/_ssr/{tasks-vcoodp_D.mjs → tasks-B_QmDFVs.mjs} +87 -8
  62. package/.output/server/_ssr/{tasks-SAjNovX6.mjs → tasks-LIi-W4cy.mjs} +15 -6
  63. package/.output/server/_ssr/textarea-CHJTKtsJ.mjs +14 -0
  64. package/.output/server/{_tanstack-start-manifest_v-C0cP5F0M.mjs → _tanstack-start-manifest_v-BCHAazE8.mjs} +52 -48
  65. package/.output/server/{_taskId-CXS3lod0.mjs → _taskId-CIv0ajIx.mjs} +17 -10
  66. package/.output/server/index.mjs +160 -160
  67. package/README.md +3 -3
  68. package/dist/cli.mjs +7181 -16
  69. package/dist/dispatcher.mjs +33 -2
  70. package/drizzle/0024_prompt_tasks.sql +44 -0
  71. package/drizzle/meta/_journal.json +7 -0
  72. package/package.json +1 -1
  73. package/.output/public/assets/_connectorId-BWjYn5tm.js +0 -1
  74. package/.output/public/assets/_loopId-Ds4RkyEc.js +0 -1
  75. package/.output/public/assets/_taskId-BOzICXDf.js +0 -1
  76. package/.output/public/assets/alert-Bn9-Zm0l.js +0 -1
  77. package/.output/public/assets/arrow-left-BF9juV9T.js +0 -1
  78. package/.output/public/assets/arrow-right-CzqvnOY1.js +0 -1
  79. package/.output/public/assets/button-HCY6DCY-.js +0 -1
  80. package/.output/public/assets/connection-status-CYZB8kLy.js +0 -1
  81. package/.output/public/assets/connector-icon-BZ_MUJV_.js +0 -1
  82. package/.output/public/assets/connectors-BvzttfSu.js +0 -1
  83. package/.output/public/assets/connectors-DdJNwRN_.js +0 -1
  84. package/.output/public/assets/gaps-D-I6xiDc.js +0 -1
  85. package/.output/public/assets/inbox-BUUu9xxE.js +0 -1
  86. package/.output/public/assets/index-ztzex0FN.js +0 -10
  87. package/.output/public/assets/loop-form-dB3CLcZb.js +0 -1
  88. package/.output/public/assets/loops-DRunQrxL.js +0 -1
  89. package/.output/public/assets/loops-oSdqMd29.js +0 -1
  90. package/.output/public/assets/manifests-DNMqf7Vi.js +0 -7
  91. package/.output/public/assets/new-uyFxVjuB.js +0 -1
  92. package/.output/public/assets/preload-helper-ORbuV86A.js +0 -3
  93. package/.output/public/assets/runners-DSU3r5Ww.js +0 -1
  94. package/.output/public/assets/setting-fields-ixkpdBb-.js +0 -3
  95. package/.output/public/assets/switch-d5ummmHY.js +0 -1
  96. package/.output/public/assets/task-list-BpOStt9v.js +0 -1
  97. package/.output/public/assets/tasks-B8MsKgic.js +0 -1
  98. package/.output/server/_ssr/inbox-k5zHergU.mjs +0 -35
@@ -1,18 +1,18 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
- import { A as DialogRoot, B as mergeProps, C as TooltipArrow, D as TooltipTrigger$1, E as TooltipPortal, F as DialogBackdrop, I as Separator, L as Input, M as DialogPopup, N as DialogDescription, O as TooltipRoot, P as DialogClose, R as Button, S as SelectRoot, T as TooltipPositioner, U as require_jsx_runtime, W as require_react, _ as SelectPositioner, b as SelectValue$1, d as SelectScrollDownArrow, f as SelectItemText, g as SelectPopup, h as SelectList, j as DialogPortal, k as DialogTitle, m as SelectItem$1, p as SelectItemIndicator, u as SelectScrollUpArrow, v as SelectPortal, w as TooltipPopup, x as SelectTrigger$1, y as SelectIcon, z as useRender } from "../_libs/@base-ui/react+[...].mjs";
2
+ import { A as DialogRoot, B as mergeProps, C as TooltipArrow, D as TooltipTrigger$1, E as TooltipPortal, F as DialogBackdrop, I as Separator, L as Input, M as DialogPopup, N as DialogDescription, O as TooltipRoot, P as DialogClose, R as useRender, S as SelectRoot, T as TooltipPositioner, U as require_jsx_runtime, W as require_react, _ as SelectPositioner, b as SelectValue$1, d as SelectScrollDownArrow, f as SelectItemText, g as SelectPopup, h as SelectList, j as DialogPortal, k as DialogTitle, m as SelectItem$1, p as SelectItemIndicator, u as SelectScrollUpArrow, v as SelectPortal, w as TooltipPopup, x as SelectTrigger$1, y as SelectIcon, z as Button } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { a as useRouterState, c as Outlet, d as createRootRoute, f as Link, g as notFound, h as redirect, i as HeadContent, l as lazyRouteComponent, m as useRouter, r as Scripts, s as createRouter, u as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
4
4
  import { i as getServerFnById, n as createServerFn, r as TSS_SERVER_FUNCTION } from "./ssr.mjs";
5
5
  import { n as clsx, t as cva } from "../_libs/class-variance-authority+clsx.mjs";
6
6
  import { t as twMerge } from "../_libs/tailwind-merge.mjs";
7
7
  import { _ as or, d as and, f as eq, g as lte, m as isNull } from "../_libs/drizzle-orm.mjs";
8
- import { d as runDir, g as tasks, s as db, t as __exportAll, u as rowsChanged } from "./client-CKkOfh-s.mjs";
9
- import { n as isHosted } from "./secrets-Hqti-niS.mjs";
10
- import { a as connectorManifest, f as saveAuthorizedConnection, m as takeAuthAttempt, o as connectorRuntime, p as startAuthAttempt } from "./connections-qnw2GVlP.mjs";
11
- import { n as callbackUrl, t as appOrigin } from "./callback-CUINvl7M.mjs";
12
- import { t as AGENT_MANIFESTS } from "./agents-Btql102J.mjs";
13
- import { r as bearer } from "./access-zIl15o8y.mjs";
14
- import { a as heartbeatRunner, d as runnerIdForToken, i as getRunner, o as isRunnerOnline, s as joinRunner } from "./runners-DtXs4Q8a.mjs";
15
- import { a as jobForTask, d as updateTask, o as jobRequiresHost, t as absorbAgentOutput, u as taskRow } from "./tasks-vcoodp_D.mjs";
8
+ import { d as runDir, g as tasks, s as db, t as __exportAll, u as rowsChanged } from "./client-BtVRVhQ2.mjs";
9
+ import { n as isHosted } from "./secrets-CRnpwGBh.mjs";
10
+ import { a as connectorManifest, f as saveAuthorizedConnection, m as takeAuthAttempt, o as connectorRuntime, p as startAuthAttempt } from "./connections-ypex3qUd.mjs";
11
+ import { n as callbackUrl, t as appOrigin } from "./callback-D20cVD2w.mjs";
12
+ import { t as AGENT_MANIFESTS } from "./agents-CrUmIQpi.mjs";
13
+ import { r as bearer } from "./access-B7TcOZ7F.mjs";
14
+ import { a as heartbeatRunner, d as runnerIdForToken, i as getRunner, o as isRunnerOnline, s as joinRunner } from "./runners-D-0_lfiq.mjs";
15
+ import { f as taskRow, o as jobForTask, p as updateTask, s as jobRequiresHost, t as absorbAgentOutput } from "./tasks-B_QmDFVs.mjs";
16
16
  import { F as Check, I as Bot, M as CircleAlert, N as ChevronUp, O as CirclePlay, P as ChevronDown, _ as LoaderCircle, a as Terminal, d as Plug, h as MousePointerClick, j as CircleCheck, k as CirclePause, m as OctagonX, n as Workflow, o as Settings, p as PanelLeft, r as TriangleAlert, s as Server, t as X, v as Info, y as Inbox } from "../_libs/lucide-react.mjs";
17
17
  import { n as toast, t as Toaster } from "../_libs/sonner.mjs";
18
18
  import { t as z } from "../_libs/next-themes.mjs";
@@ -20,12 +20,49 @@ import { randomBytes } from "node:crypto";
20
20
  import { appendFileSync, existsSync } from "node:fs";
21
21
  import { join } from "node:path";
22
22
  import { hostname } from "node:os";
23
- //#region node_modules/.nitro/vite/services/ssr/assets/card-IpIuKJC_.js
23
+ //#region node_modules/.nitro/vite/services/ssr/assets/card-vAtU-sOo.js
24
24
  var import_react = /* @__PURE__ */ __toESM(require_react());
25
25
  var import_jsx_runtime = require_jsx_runtime();
26
26
  function cn(...inputs) {
27
27
  return twMerge(clsx(inputs));
28
28
  }
29
+ var buttonVariants = cva("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
30
+ variants: {
31
+ variant: {
32
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
33
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
34
+ secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
35
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
36
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
37
+ link: "text-primary underline-offset-4 hover:underline"
38
+ },
39
+ size: {
40
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
41
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
42
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
43
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
44
+ icon: "size-8",
45
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
46
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
47
+ "icon-lg": "size-9"
48
+ }
49
+ },
50
+ defaultVariants: {
51
+ variant: "default",
52
+ size: "default"
53
+ }
54
+ });
55
+ function Button$1({ className, variant = "default", size = "default", ...props }) {
56
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button, {
57
+ "data-slot": "button",
58
+ className: cn(buttonVariants({
59
+ variant,
60
+ size,
61
+ className
62
+ })),
63
+ ...props
64
+ });
65
+ }
29
66
  var createSsrRpc = (functionId) => {
30
67
  const url = "/_serverFn/" + functionId;
31
68
  const serverFnMeta = { id: functionId };
@@ -90,7 +127,7 @@ function CardContent({ className, ...props }) {
90
127
  });
91
128
  }
92
129
  //#endregion
93
- //#region node_modules/.nitro/vite/services/ssr/assets/connectors-vIoacH6V.js
130
+ //#region node_modules/.nitro/vite/services/ssr/assets/connectors-BVFx4tKA.js
94
131
  /**
95
132
  * Readiness and connections for every connector in the registry. Manifests are
96
133
  * imported directly by the client, so they are deliberately not sent again.
@@ -111,18 +148,19 @@ var disconnectConnection = createServerFn({ method: "POST" }).inputValidator((da
111
148
  var verifyConnection = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("f9ade3084971078ee9f2bc16fcdcdfb5a8d66a0f9b634803bb611287c14e21d7"));
112
149
  var saveConnectionSettings = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("18bae5deb2a19571893f0067e374e537f16d6774f9b4e04f9b7349360f6f8fdc"));
113
150
  //#endregion
114
- //#region node_modules/.nitro/vite/services/ssr/assets/tasks-rgWCNdRw.js
151
+ //#region node_modules/.nitro/vite/services/ssr/assets/tasks-DXjXqmnW.js
115
152
  var getInbox = createServerFn({ method: "GET" }).handler(createSsrRpc("48bc32df9d6f69f45df8dfbc6e798e1f99152dbd4b4ed65b149fa2612c65e687"));
116
153
  var getLoopTasks = createServerFn({ method: "GET" }).inputValidator((data) => data).handler(createSsrRpc("3f938fac3e5ec1631e700a2fdd4790e78abbefeb732ecfbbe6864cc19f0d5aac"));
117
154
  var getTaskById = createServerFn({ method: "GET" }).inputValidator((data) => data).handler(createSsrRpc("0033ef7c619c027b1428a722dff188d315ed335645afcb1033528630b7c95e88"));
118
155
  var getTaskLog = createServerFn({ method: "GET" }).inputValidator((data) => data).handler(createSsrRpc("81f567724371f0d6f24e636906e2e9ea5b7384422ac583c86a1050fb838664ce"));
156
+ var runPrompt = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("bef559b165754b06d6d5cf7c6dccde3d5a6a326462430c621eb131f78665d6e1"));
119
157
  var runLoopNow = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("7258ce5fc6f23acf3aab039ecd4acdb006d42b2ddbf3ab8629b4000e101b51dc"));
120
158
  var stopTask = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("a57f49c322cc5afa2996e4a5777fa533fd963755d614d4a14eb32e51fb198d9d"));
121
159
  /** Whether the dispatcher is up, and how hard it is allowed to pull. */
122
160
  var getDispatcherState = createServerFn({ method: "GET" }).handler(createSsrRpc("921b049ebafe3c6fb5206fbe3e2100608d3333b944e18385e57da62a28233bc6"));
123
161
  var pauseDispatcher = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("0fa144f67263a4a51c51e8baf134a15b89c0afdf9b92b64660520a5bce247eec"));
124
162
  //#endregion
125
- //#region node_modules/.nitro/vite/services/ssr/assets/loops-BBQDw1Mh.js
163
+ //#region node_modules/.nitro/vite/services/ssr/assets/loops-DOq_YXyk.js
126
164
  /**
127
165
  * Saving is both making and changing, told apart by whether there is an id.
128
166
  * A loop chosen and not yet saved has none, and nothing on the server knew
@@ -139,7 +177,7 @@ var reorderLoop = createServerFn({ method: "POST" }).inputValidator((data) => da
139
177
  var getLoopPollState = createServerFn({ method: "GET" }).inputValidator((data) => data).handler(createSsrRpc("4fd3855e3e9ed954e102071a55b98d91651c9b1e353161f7223768ed6f2b8c28"));
140
178
  var runLoopBacklog = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("65494cbfd06143dbd9a012808fbba21163d9902e387869503fb8b68b0674902b"));
141
179
  //#endregion
142
- //#region node_modules/.nitro/vite/services/ssr/assets/router-3WmpE5b_.js
180
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-BbrBz36P.js
143
181
  /**
144
182
  * Loopable's mark: something going round, and the thing it goes round for.
145
183
  *
@@ -182,43 +220,6 @@ function LoopableMark({ className }) {
182
220
  ]
183
221
  });
184
222
  }
185
- var buttonVariants = cva("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
186
- variants: {
187
- variant: {
188
- default: "bg-primary text-primary-foreground hover:bg-primary/80",
189
- outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
190
- secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
191
- ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
192
- destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
193
- link: "text-primary underline-offset-4 hover:underline"
194
- },
195
- size: {
196
- default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
197
- xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
198
- sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
199
- lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
200
- icon: "size-8",
201
- "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
202
- "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
203
- "icon-lg": "size-9"
204
- }
205
- },
206
- defaultVariants: {
207
- variant: "default",
208
- size: "default"
209
- }
210
- });
211
- function Button$1({ className, variant = "default", size = "default", ...props }) {
212
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button, {
213
- "data-slot": "button",
214
- className: cn(buttonVariants({
215
- variant,
216
- size,
217
- className
218
- })),
219
- ...props
220
- });
221
- }
222
223
  /**
223
224
  * The dispatcher can stop between two page loads and nothing on a page would
224
225
  * change, so this asks rather than waiting to be told.
@@ -776,7 +777,7 @@ var Toaster$1 = ({ ...props }) => {
776
777
  ...props
777
778
  });
778
779
  };
779
- var styles_default = "/assets/styles-DZL5V1o7.css";
780
+ var styles_default = "/assets/styles-D3sonCfX.css";
780
781
  var Route$18 = createRootRoute({
781
782
  head: () => ({
782
783
  meta: [
@@ -1147,7 +1148,7 @@ function AgentRow({ manifest, view }) {
1147
1148
  ]
1148
1149
  }) : null] });
1149
1150
  }
1150
- var $$splitComponentImporter$7 = () => import("./connectors-BHNwuIMj.mjs");
1151
+ var $$splitComponentImporter$7 = () => import("./connectors-4yzKb0KG.mjs");
1151
1152
  var Route$15 = createFileRoute("/connectors/")({
1152
1153
  validateSearch: (search) => {
1153
1154
  const result = {};
@@ -1158,7 +1159,7 @@ var Route$15 = createFileRoute("/connectors/")({
1158
1159
  loader: () => getConnectorOverview(),
1159
1160
  component: lazyRouteComponent($$splitComponentImporter$7, "component")
1160
1161
  });
1161
- var $$splitComponentImporter$6 = () => import("../_connectorId-8nb5yOzG.mjs");
1162
+ var $$splitComponentImporter$6 = () => import("../_connectorId-DcSnoRjk.mjs");
1162
1163
  var Route$14 = createFileRoute("/connectors/$connectorId")({
1163
1164
  loader: async ({ params }) => {
1164
1165
  if (!connectorManifest(params.connectorId)) throw notFound();
@@ -1168,12 +1169,12 @@ var Route$14 = createFileRoute("/connectors/$connectorId")({
1168
1169
  },
1169
1170
  component: lazyRouteComponent($$splitComponentImporter$6, "component")
1170
1171
  });
1171
- var $$splitComponentImporter$5 = () => import("./inbox-k5zHergU.mjs");
1172
+ var $$splitComponentImporter$5 = () => import("./inbox-C2VBGLa5.mjs");
1172
1173
  var Route$13 = createFileRoute("/inbox/")({
1173
- loader: async () => ({ tasks: await getInbox() }),
1174
+ loader: () => getInbox(),
1174
1175
  component: lazyRouteComponent($$splitComponentImporter$5, "component")
1175
1176
  });
1176
- var $$splitComponentImporter$4 = () => import("../_taskId-CXS3lod0.mjs");
1177
+ var $$splitComponentImporter$4 = () => import("../_taskId-CIv0ajIx.mjs");
1177
1178
  var Route$12 = createFileRoute("/inbox/$taskId")({
1178
1179
  loader: async ({ params }) => {
1179
1180
  const task = await getTaskById({ data: { id: params.taskId } });
@@ -1200,7 +1201,7 @@ var Route$12 = createFileRoute("/inbox/$taskId")({
1200
1201
  * sees it when it next renews its claim, which is why the button says it has
1201
1202
  * been asked for rather than pretending it is already done.
1202
1203
  */
1203
- var $$splitComponentImporter$3 = () => import("./loops-xt2Bn7_q.mjs");
1204
+ var $$splitComponentImporter$3 = () => import("./loops-D0XJ8eBb.mjs");
1204
1205
  var Route$11 = createFileRoute("/loops/")({
1205
1206
  loader: () => getLoopsPage(),
1206
1207
  component: lazyRouteComponent($$splitComponentImporter$3, "component")
@@ -1211,7 +1212,7 @@ var Route$11 = createFileRoute("/loops/")({
1211
1212
  * may have been pointed somewhere else since it was made, and the card is the
1212
1213
  * one place someone scanning a list would notice.
1213
1214
  */
1214
- var $$splitComponentImporter$2 = () => import("../_loopId-BsUL1SeL.mjs");
1215
+ var $$splitComponentImporter$2 = () => import("../_loopId-G_TAkYtS.mjs");
1215
1216
  var Route$10 = createFileRoute("/loops/$loopId")({
1216
1217
  loader: async ({ params }) => {
1217
1218
  const loop = await getLoopById({ data: { id: params.loopId } });
@@ -1234,7 +1235,7 @@ var Route$10 = createFileRoute("/loops/$loopId")({
1234
1235
  * signal to arrive is a slow way to do it. Dry run means that shaping leaves
1235
1236
  * no marks on a real repository.
1236
1237
  */
1237
- var $$splitComponentImporter$1 = () => import("./new-DfKyd2Wa.mjs");
1238
+ var $$splitComponentImporter$1 = () => import("./new-CajvgIog.mjs");
1238
1239
  var Route$9 = createFileRoute("/loops/new")({
1239
1240
  validateSearch: (search) => {
1240
1241
  const result = {};
@@ -1264,7 +1265,7 @@ var Route$8 = createFileRoute("/machines/")({ beforeLoad: () => {
1264
1265
  var getRunnersPage = createServerFn({ method: "GET" }).handler(createSsrRpc("45dbbb612763589268984d236edcd17f5868ecf716df9625bfa46e7fec691f4e"));
1265
1266
  var rotateRunnerJoinToken = createServerFn({ method: "POST" }).handler(createSsrRpc("b4f7a66e1bb69cc14ab84d8f5dc7f85119c9a9b1d065a6b4e51dd0ba84c3f60c"));
1266
1267
  var removeRunner = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("611491b32d9583ccaae637ddf9fb2f842ff75994f50513ecd8273e305e889eb8"));
1267
- var $$splitComponentImporter = () => import("./runners-DI_NxpHC.mjs");
1268
+ var $$splitComponentImporter = () => import("./runners-zqF_zbEc.mjs");
1268
1269
  var Route$7 = createFileRoute("/runners/")({
1269
1270
  loader: () => getRunnersPage(),
1270
1271
  component: lazyRouteComponent($$splitComponentImporter, "component")
@@ -1550,4 +1551,4 @@ function getRouter() {
1550
1551
  });
1551
1552
  }
1552
1553
  //#endregion
1553
- export { stopTask as A, CardTitle as B, Button$1 as C, saveLoop as D, runLoopBacklog as E, verifyConnection as F, Badge as I, Card as L, continueQrLogin as M, disconnectConnection as N, toggleLoop as O, saveConnectionSettings as P, CardContent as R, Input$1 as S, reorderLoop as T, cn as V, SelectItem as _, Route$9 as a, Label as b, Route$12 as c, Route$15 as d, useLiveRefresh as f, SelectContent as g, Select$1 as h, rotateRunnerJoinToken as i, beginQrLogin as j, runLoopNow as k, Route$13 as l, isTaskActive as m, Route$7 as n, Route$10 as o, useLiveTasks as p, removeRunner as r, Route$11 as s, router_exports as t, Route$14 as u, SelectTrigger as v, removeLoop as w, Separator$1 as x, SelectValue as y, CardHeader as z };
1554
+ export { stopTask as A, CardHeader as B, removeLoop as C, toggleLoop as D, saveLoop as E, verifyConnection as F, cn as H, Badge as I, Button$1 as L, continueQrLogin as M, disconnectConnection as N, runLoopNow as O, saveConnectionSettings as P, Card as R, Input$1 as S, runLoopBacklog as T, CardTitle as V, SelectItem as _, Route$9 as a, Label as b, Route$12 as c, Route$15 as d, useLiveRefresh as f, SelectContent as g, Select$1 as h, rotateRunnerJoinToken as i, beginQrLogin as j, runPrompt as k, Route$13 as l, isTaskActive as m, Route$7 as n, Route$10 as o, useLiveTasks as p, removeRunner as r, Route$11 as s, router_exports as t, Route$14 as u, SelectTrigger as v, reorderLoop as w, Separator$1 as x, SelectValue as y, CardContent as z };
@@ -1,8 +1,8 @@
1
1
  import { n as createServerFn } from "./ssr.mjs";
2
- import { i as loopableOrigin } from "./callback-CUINvl7M.mjs";
3
- import { c as listRunners, n as forgetRunner, r as getJoinToken, u as rotateJoinToken } from "./runners-DtXs4Q8a.mjs";
2
+ import { i as loopableOrigin } from "./callback-D20cVD2w.mjs";
3
+ import { c as listRunners, n as forgetRunner, r as getJoinToken, u as rotateJoinToken } from "./runners-D-0_lfiq.mjs";
4
4
  import { t as createServerRpc } from "./createServerRpc-DPDrnFdH.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/runners-By-mwc3F.js
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/runners-B_WuF8UJ.js
6
6
  var getRunnersPage_createServerFn_handler = createServerRpc({
7
7
  id: "45dbbb612763589268984d236edcd17f5868ecf716df9625bfa46e7fec691f4e",
8
8
  name: "getRunnersPage",
@@ -1,9 +1,9 @@
1
1
  import { f as eq } from "../_libs/drizzle-orm.mjs";
2
- import { f as runners, g as tasks, s as db } from "./client-CKkOfh-s.mjs";
3
- import { a as runnerTokenKey, o as secretStore, r as joinTokenKey } from "./secrets-Hqti-niS.mjs";
2
+ import { f as runners, g as tasks, s as db } from "./client-BtVRVhQ2.mjs";
3
+ import { a as runnerTokenKey, o as secretStore, r as joinTokenKey } from "./secrets-CRnpwGBh.mjs";
4
4
  import { randomBytes, randomUUID } from "node:crypto";
5
5
  import { hostname } from "node:os";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/runners-DtXs4Q8a.js
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/runners-D-0_lfiq.js
7
7
  var ONLINE_MS = 45e3;
8
8
  function isRunnerOnline(row, now = Date.now()) {
9
9
  if (row.status !== "online") return false;
@@ -2,9 +2,9 @@ import { U as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
2
  import { m as useRouter } from "../_libs/@tanstack/react-router+[...].mjs";
3
3
  import { s as Server } from "../_libs/lucide-react.mjs";
4
4
  import { n as toast } from "../_libs/sonner.mjs";
5
- import { C as Button$1, I as Badge, L as Card, R as CardContent, f as useLiveRefresh, i as rotateRunnerJoinToken, n as Route$7, r as removeRunner, z as CardHeader } from "./router-3WmpE5b_.mjs";
6
- import { n as AlertDescription, t as Alert } from "./alert-NEiOCTOl.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/runners-DI_NxpHC.js
5
+ import { B as CardHeader, I as Badge, L as Button$1, R as Card, f as useLiveRefresh, i as rotateRunnerJoinToken, n as Route$7, r as removeRunner, z as CardContent } from "./router-BbrBz36P.mjs";
6
+ import { n as AlertDescription, t as Alert } from "./alert-DQvzE7bu.mjs";
7
+ //#region node_modules/.nitro/vite/services/ssr/assets/runners-zqF_zbEc.js
8
8
  var import_jsx_runtime = require_jsx_runtime();
9
9
  function inventoryLines(runner) {
10
10
  if (runner.inventory.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
@@ -44,7 +44,7 @@ function RunnersPage() {
44
44
  className: "text-xs",
45
45
  children: "npm install -g loopable-cli"
46
46
  }),
47
- "), sign in a coding agent on that host, then start a runner with this token."
47
+ "), sign in a coding agent on that host, then start a runner. Use this LAN IP so other machines can reach the App."
48
48
  ]
49
49
  }),
50
50
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
@@ -1,9 +1,9 @@
1
1
  import { f as eq } from "../_libs/drizzle-orm.mjs";
2
- import { m as secrets, o as dataDir, p as secretNamespace, s as db } from "./client-CKkOfh-s.mjs";
2
+ import { m as secrets, o as dataDir, p as secretNamespace, s as db } from "./client-BtVRVhQ2.mjs";
3
3
  import { chmodSync, existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { execFileSync } from "node:child_process";
6
- //#region node_modules/.nitro/vite/services/ssr/assets/secrets-Hqti-niS.js
6
+ //#region node_modules/.nitro/vite/services/ssr/assets/secrets-CRnpwGBh.js
7
7
  /**
8
8
  * Hosted Loopable shares a network database between the App Worker and the
9
9
  * Dispatcher. A local laptop still uses a file, and needs none of this.
@@ -1,16 +1,9 @@
1
- import "../_runtime.mjs";
2
- import { U as require_jsx_runtime, W as require_react } from "../_libs/@base-ui/react+[...].mjs";
3
- import { S as Input$1, V as cn, _ as SelectItem, b as Label, g as SelectContent, h as Select$1, v as SelectTrigger, y as SelectValue } from "./router-3WmpE5b_.mjs";
4
- import { t as Switch$1 } from "./switch-ReNglgH6.mjs";
5
- require_react();
1
+ import { U as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
+ import { S as Input$1, _ as SelectItem, b as Label, g as SelectContent, h as Select$1, v as SelectTrigger, y as SelectValue } from "./router-BbrBz36P.mjs";
3
+ import { t as Switch$1 } from "./switch-1pnd_bPJ.mjs";
4
+ import { t as Textarea } from "./textarea-CHJTKtsJ.mjs";
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/setting-fields-mpXfGftI.js
6
6
  var import_jsx_runtime = require_jsx_runtime();
7
- function Textarea({ className, ...props }) {
8
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", {
9
- "data-slot": "textarea",
10
- className: cn("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", className),
11
- ...props
12
- });
13
- }
14
7
  /**
15
8
  * One renderer for anything a connector declares as a field, so connection
16
9
  * settings and loop conditions can never drift apart visually.
@@ -89,4 +82,4 @@ function SettingFieldInputs({ fields, values, onChange, idPrefix = "" }) {
89
82
  }) });
90
83
  }
91
84
  //#endregion
92
- export { Textarea as n, initialFieldValues as r, SettingFieldInputs as t };
85
+ export { initialFieldValues as n, SettingFieldInputs as t };
@@ -4107,7 +4107,7 @@ var defaultSerovalPlugins = [
4107
4107
  * the dev styles URL for route-scoped CSS collection.
4108
4108
  */
4109
4109
  async function getStartManifest(matchedRoutes) {
4110
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-C0cP5F0M.mjs");
4110
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-BCHAazE8.mjs");
4111
4111
  const startManifest = tsrStartManifest();
4112
4112
  let routes = startManifest.routes;
4113
4113
  routes[rootRouteId];
@@ -4129,123 +4129,127 @@ async function getStartManifest(matchedRoutes) {
4129
4129
  var manifest = {
4130
4130
  "0033ef7c619c027b1428a722dff188d315ed335645afcb1033528630b7c95e88": {
4131
4131
  functionName: "getTaskById_createServerFn_handler",
4132
- importer: () => import("./tasks-SAjNovX6.mjs")
4132
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4133
4133
  },
4134
4134
  "0e209afb63fad4a95a5cfeaf4831610f23673145cbf5b8054765d79804a62d31": {
4135
4135
  functionName: "getConnectorOverview_createServerFn_handler",
4136
- importer: () => import("./connectors-C28g0i4c.mjs")
4136
+ importer: () => import("./connectors-BZly0yGF.mjs")
4137
4137
  },
4138
4138
  "0fa144f67263a4a51c51e8baf134a15b89c0afdf9b92b64660520a5bce247eec": {
4139
4139
  functionName: "pauseDispatcher_createServerFn_handler",
4140
- importer: () => import("./tasks-SAjNovX6.mjs")
4140
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4141
4141
  },
4142
4142
  "143ea51f7421d9eebec9ad31c2df8eed5aa2e5d8035473dbfad39913fd7d54c0": {
4143
4143
  functionName: "chooseDefaultAgent_createServerFn_handler",
4144
- importer: () => import("./agents-DAOZPgO2.mjs")
4144
+ importer: () => import("./agents-Dms_6TBF.mjs")
4145
4145
  },
4146
4146
  "18bae5deb2a19571893f0067e374e537f16d6774f9b4e04f9b7349360f6f8fdc": {
4147
4147
  functionName: "saveConnectionSettings_createServerFn_handler",
4148
- importer: () => import("./connectors-C28g0i4c.mjs")
4148
+ importer: () => import("./connectors-BZly0yGF.mjs")
4149
4149
  },
4150
4150
  "3f938fac3e5ec1631e700a2fdd4790e78abbefeb732ecfbbe6864cc19f0d5aac": {
4151
4151
  functionName: "getLoopTasks_createServerFn_handler",
4152
- importer: () => import("./tasks-SAjNovX6.mjs")
4152
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4153
4153
  },
4154
4154
  "3fc8a7de98be979f9820a4f5a0ca2e234ed8a7df8e692abb8c4437765474eca0": {
4155
4155
  functionName: "toggleLoop_createServerFn_handler",
4156
- importer: () => import("./loops-APFcP0y6.mjs")
4156
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4157
4157
  },
4158
4158
  "43b97e3644ad73286fe5de3e99134bff099e1a8704f1ae91fe643d419eceba73": {
4159
4159
  functionName: "continueQrLogin_createServerFn_handler",
4160
- importer: () => import("./connectors-C28g0i4c.mjs")
4160
+ importer: () => import("./connectors-BZly0yGF.mjs")
4161
4161
  },
4162
4162
  "45dbbb612763589268984d236edcd17f5868ecf716df9625bfa46e7fec691f4e": {
4163
4163
  functionName: "getRunnersPage_createServerFn_handler",
4164
- importer: () => import("./runners-By-mwc3F.mjs")
4164
+ importer: () => import("./runners-B_WuF8UJ.mjs")
4165
4165
  },
4166
4166
  "48bc32df9d6f69f45df8dfbc6e798e1f99152dbd4b4ed65b149fa2612c65e687": {
4167
4167
  functionName: "getInbox_createServerFn_handler",
4168
- importer: () => import("./tasks-SAjNovX6.mjs")
4168
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4169
4169
  },
4170
4170
  "4fd3855e3e9ed954e102071a55b98d91651c9b1e353161f7223768ed6f2b8c28": {
4171
4171
  functionName: "getLoopPollState_createServerFn_handler",
4172
- importer: () => import("./loops-APFcP0y6.mjs")
4172
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4173
4173
  },
4174
4174
  "611491b32d9583ccaae637ddf9fb2f842ff75994f50513ecd8273e305e889eb8": {
4175
4175
  functionName: "removeRunner_createServerFn_handler",
4176
- importer: () => import("./runners-By-mwc3F.mjs")
4176
+ importer: () => import("./runners-B_WuF8UJ.mjs")
4177
4177
  },
4178
4178
  "65494cbfd06143dbd9a012808fbba21163d9902e387869503fb8b68b0674902b": {
4179
4179
  functionName: "runLoopBacklog_createServerFn_handler",
4180
- importer: () => import("./loops-APFcP0y6.mjs")
4180
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4181
4181
  },
4182
4182
  "6d5a90e9ec4ebf70d8e2ac4aff960533a5e68d21b289033cc7e0751d00554c93": {
4183
4183
  functionName: "getLoopsPage_createServerFn_handler",
4184
- importer: () => import("./loops-APFcP0y6.mjs")
4184
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4185
4185
  },
4186
4186
  "7258ce5fc6f23acf3aab039ecd4acdb006d42b2ddbf3ab8629b4000e101b51dc": {
4187
4187
  functionName: "runLoopNow_createServerFn_handler",
4188
- importer: () => import("./tasks-SAjNovX6.mjs")
4188
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4189
4189
  },
4190
4190
  "794964d675b97edaa881ab5cb209225ef0a4507e3d2771d6577658a058e7621f": {
4191
4191
  functionName: "beginQrLogin_createServerFn_handler",
4192
- importer: () => import("./connectors-C28g0i4c.mjs")
4192
+ importer: () => import("./connectors-BZly0yGF.mjs")
4193
4193
  },
4194
4194
  "7d7d5f80a4f0d2b3bb659d7dc2a91ea5983880648b9d1aa24356e7340505930f": {
4195
4195
  functionName: "reorderLoop_createServerFn_handler",
4196
- importer: () => import("./loops-APFcP0y6.mjs")
4196
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4197
4197
  },
4198
4198
  "80883b912a5a0aba2aa583b505e4e289d765a3f7fbb793a97692f439e7f960ba": {
4199
4199
  functionName: "saveAgent_createServerFn_handler",
4200
- importer: () => import("./agents-DAOZPgO2.mjs")
4200
+ importer: () => import("./agents-Dms_6TBF.mjs")
4201
4201
  },
4202
4202
  "81a1af559b2a373901872aa9f9a6546f2f3bda8157d81c21a36ba0d1d337613b": {
4203
4203
  functionName: "getLoopById_createServerFn_handler",
4204
- importer: () => import("./loops-APFcP0y6.mjs")
4204
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4205
4205
  },
4206
4206
  "81f567724371f0d6f24e636906e2e9ea5b7384422ac583c86a1050fb838664ce": {
4207
4207
  functionName: "getTaskLog_createServerFn_handler",
4208
- importer: () => import("./tasks-SAjNovX6.mjs")
4208
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4209
4209
  },
4210
4210
  "921b049ebafe3c6fb5206fbe3e2100608d3333b944e18385e57da62a28233bc6": {
4211
4211
  functionName: "getDispatcherState_createServerFn_handler",
4212
- importer: () => import("./tasks-SAjNovX6.mjs")
4212
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4213
4213
  },
4214
4214
  "997d2dd097598c44811fe97def167b79d33e4349c51e783058da648e860c7c1f": {
4215
4215
  functionName: "getLoopReadiness_createServerFn_handler",
4216
- importer: () => import("./loops-APFcP0y6.mjs")
4216
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4217
4217
  },
4218
4218
  "a57f49c322cc5afa2996e4a5777fa533fd963755d614d4a14eb32e51fb198d9d": {
4219
4219
  functionName: "stopTask_createServerFn_handler",
4220
- importer: () => import("./tasks-SAjNovX6.mjs")
4220
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4221
4221
  },
4222
4222
  "b0878f841b35f46b5f2dc9cbd71c5be5895ae1b8903b3b24c24dfcf86291d3e4": {
4223
4223
  functionName: "runAgentTest_createServerFn_handler",
4224
- importer: () => import("./agents-DAOZPgO2.mjs")
4224
+ importer: () => import("./agents-Dms_6TBF.mjs")
4225
4225
  },
4226
4226
  "b4f7a66e1bb69cc14ab84d8f5dc7f85119c9a9b1d065a6b4e51dd0ba84c3f60c": {
4227
4227
  functionName: "rotateRunnerJoinToken_createServerFn_handler",
4228
- importer: () => import("./runners-By-mwc3F.mjs")
4228
+ importer: () => import("./runners-B_WuF8UJ.mjs")
4229
4229
  },
4230
4230
  "b5a89ca2d07f4ccf2827b5132ca52e7c7a42d584e702b0ab3963b2d5763c35b0": {
4231
4231
  functionName: "removeLoop_createServerFn_handler",
4232
- importer: () => import("./loops-APFcP0y6.mjs")
4232
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4233
4233
  },
4234
4234
  "bde588e9b0b81a4ee619a63872d6b8b76e22db006c7a3c4351bcd56e5f76bbed": {
4235
4235
  functionName: "getAgentsPage_createServerFn_handler",
4236
- importer: () => import("./agents-DAOZPgO2.mjs")
4236
+ importer: () => import("./agents-Dms_6TBF.mjs")
4237
+ },
4238
+ "bef559b165754b06d6d5cf7c6dccde3d5a6a326462430c621eb131f78665d6e1": {
4239
+ functionName: "runPrompt_createServerFn_handler",
4240
+ importer: () => import("./tasks-LIi-W4cy.mjs")
4237
4241
  },
4238
4242
  "e91fc2fd51633c7ca9184fea4beb66fe775ed0b4e6323111a4690da916a78b00": {
4239
4243
  functionName: "saveLoop_createServerFn_handler",
4240
- importer: () => import("./loops-APFcP0y6.mjs")
4244
+ importer: () => import("./loops-Og_G3KyZ.mjs")
4241
4245
  },
4242
4246
  "f94f0787ce6704ea24f18add66832e0367a0feb9a690d8ad6454abec5e5df193": {
4243
4247
  functionName: "disconnectConnection_createServerFn_handler",
4244
- importer: () => import("./connectors-C28g0i4c.mjs")
4248
+ importer: () => import("./connectors-BZly0yGF.mjs")
4245
4249
  },
4246
4250
  "f9ade3084971078ee9f2bc16fcdcdfb5a8d66a0f9b634803bb611287c14e21d7": {
4247
4251
  functionName: "verifyConnection_createServerFn_handler",
4248
- importer: () => import("./connectors-C28g0i4c.mjs")
4252
+ importer: () => import("./connectors-BZly0yGF.mjs")
4249
4253
  }
4250
4254
  };
4251
4255
  async function getServerFnById(id, access) {
@@ -6156,8 +6160,8 @@ var getBaseManifest = getProdBaseManifest;
6156
6160
  var createEarlyHintsForRequest = createEarlyHintsCollector;
6157
6161
  async function loadEntries() {
6158
6162
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
6159
- import("./router-3WmpE5b_.mjs").then((n) => n.t),
6160
- import("./start-Bdc2GJUI.mjs"),
6163
+ import("./router-BbrBz36P.mjs").then((n) => n.t),
6164
+ import("./start-BgTj-h_C.mjs"),
6161
6165
  import("./empty-plugin-adapters-BJ4m9L8g.mjs")
6162
6166
  ]);
6163
6167
  return {
@@ -1,8 +1,8 @@
1
1
  import { t as createMiddleware } from "./ssr.mjs";
2
- import { l as migrateIfNeeded } from "./client-CKkOfh-s.mjs";
3
- import { r as isLoopbackHost } from "./callback-CUINvl7M.mjs";
4
- import { a as readAppToken, i as isPublicApiPath, n as assertAppAccess, t as appAccessCookie } from "./access-zIl15o8y.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/start-Bdc2GJUI.js
2
+ import { l as migrateIfNeeded } from "./client-BtVRVhQ2.mjs";
3
+ import { r as isLoopbackHost } from "./callback-D20cVD2w.mjs";
4
+ import { a as readAppToken, i as isPublicApiPath, n as assertAppAccess, t as appAccessCookie } from "./access-B7TcOZ7F.mjs";
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/start-BgTj-h_C.js
6
6
  function dedupeSerializationAdapters(deduped, serializationAdapters) {
7
7
  for (let i = 0, len = serializationAdapters.length; i < len; i++) {
8
8
  const current = serializationAdapters[i];
@@ -1,6 +1,6 @@
1
1
  import { U as require_jsx_runtime, c as SwitchThumb, l as SwitchRoot } from "../_libs/@base-ui/react+[...].mjs";
2
- import { V as cn } from "./router-3WmpE5b_.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/switch-ReNglgH6.js
2
+ import { H as cn } from "./router-BbrBz36P.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/switch-1pnd_bPJ.js
4
4
  var import_jsx_runtime = require_jsx_runtime();
5
5
  function Switch$1({ className, size = "default", ...props }) {
6
6
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SwitchRoot, {
@@ -1,11 +1,11 @@
1
1
  import { U as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
2
  import { f as Link } from "../_libs/@tanstack/react-router+[...].mjs";
3
- import { a as connectorManifest } from "./connections-qnw2GVlP.mjs";
4
- import { n as agentManifest } from "./agents-Btql102J.mjs";
3
+ import { a as connectorManifest } from "./connections-ypex3qUd.mjs";
4
+ import { n as agentManifest } from "./agents-CrUmIQpi.mjs";
5
5
  import { A as CircleMinus, D as CircleSlash, I as Bot, T as CircleX, b as FileText, d as Plug, g as Loader, j as CircleCheck, n as Workflow, w as Clock } from "../_libs/lucide-react.mjs";
6
- import { I as Badge, L as Card, R as CardContent, V as cn, p as useLiveTasks } from "./router-3WmpE5b_.mjs";
7
- import { t as ConnectorIcon } from "./connector-icon-DZXQLLFo.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/task-list-CUITIqkb.js
6
+ import { H as cn, I as Badge, R as Card, p as useLiveTasks, z as CardContent } from "./router-BbrBz36P.mjs";
7
+ import { t as ConnectorIcon } from "./connector-icon-CFrrHjzR.mjs";
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/task-list-BnQJ94Dk.js
9
9
  var import_jsx_runtime = require_jsx_runtime();
10
10
  var STATES = {
11
11
  queued: {
@@ -79,7 +79,8 @@ var KIND_LABEL = {
79
79
  issue: "Issue",
80
80
  message: "Message",
81
81
  email: "Email",
82
- occurrence: "Scheduled run"
82
+ occurrence: "Scheduled run",
83
+ prompt: "Test run"
83
84
  };
84
85
  function when(iso) {
85
86
  const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1e3);
@@ -105,7 +106,7 @@ function TaskList({ tasks, showLoop = true, empty }) {
105
106
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
106
107
  className: "flex items-start gap-3",
107
108
  children: [
108
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConnectorIcon, {
109
+ task.sourceKind === "prompt" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Bot, { className: "mt-0.5 size-7 shrink-0 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConnectorIcon, {
109
110
  icon: connectorManifest(task.connectorId)?.icon ?? "Plug",
110
111
  accent: connectorManifest(task.connectorId)?.accent ?? "bg-muted",
111
112
  className: "mt-0.5 size-7 shrink-0"
@@ -155,7 +156,7 @@ function TaskMeta({ task, showLoop }) {
155
156
  const connector = connectorManifest(task.connectorId);
156
157
  const agent = task.agentId ? agentManifest(task.agentId) : void 0;
157
158
  const parts = [];
158
- if (showLoop) parts.push({
159
+ if (showLoop && task.loopName) parts.push({
159
160
  icon: Workflow,
160
161
  label: task.loopName
161
162
  });