loopable-cli 0.1.0 → 0.2.1

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 (101) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/_connectorId-CkygNLny.js +1 -0
  3. package/.output/public/assets/_loopId-Cshlc5Ja.js +1 -0
  4. package/.output/public/assets/_taskId-BKDIJ_Fg.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-BUoK6Cru.js +1 -0
  10. package/.output/public/assets/connectors-CeLBtEtg.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-BtFoD7mF.js +1 -0
  13. package/.output/public/assets/inbox-BYNjkNDJ.js +1 -0
  14. package/.output/public/assets/index-0yP3Jn_G.js +18 -0
  15. package/.output/public/assets/{loader-CcBl2u8m.js → loader-B4Epchm_.js} +1 -1
  16. package/.output/public/assets/loop-form-DnSJNc1k.js +1 -0
  17. package/.output/public/assets/loops-1CvbqO6m.js +1 -0
  18. package/.output/public/assets/new-m5NlqYQT.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/refresh-cw-C3xBnKfy.js +1 -0
  22. package/.output/public/assets/rolldown-runtime-CbXtAM7H.js +1 -0
  23. package/.output/public/assets/runners-D8QVl-Y6.js +1 -0
  24. package/.output/public/assets/select-Cppu-hti.js +1 -0
  25. package/.output/public/assets/setting-fields-bJ_gTG7Q.js +3 -0
  26. package/.output/public/assets/styles-ClTGaXU0.css +2 -0
  27. package/.output/public/assets/switch-hRIbNGOj.js +1 -0
  28. package/.output/public/assets/task-list-BAxjcVgr.js +1 -0
  29. package/.output/public/assets/textarea-Fyuzi6Vp.js +1 -0
  30. package/.output/public/assets/{trash-2-D6u6NpzO.js → trash-2-BXZzBsoV.js} +1 -1
  31. package/.output/public/assets/useValueChanged-VVyq4hb9.js +1 -0
  32. package/.output/server/{_connectorId-8nb5yOzG.mjs → _connectorId-C9yydJrC.mjs} +92 -11
  33. package/.output/server/_libs/@base-ui/react+[...].mjs +427 -427
  34. package/.output/server/{_loopId-BsUL1SeL.mjs → _loopId-B0VG-eBC.mjs} +44 -15
  35. package/.output/server/_ssr/{callback-CUINvl7M.mjs → access-DTttr563.mjs} +39 -5
  36. package/.output/server/_ssr/{agents-DAOZPgO2.mjs → agents-C7B6RJ6-.mjs} +3 -3
  37. package/.output/server/_ssr/{agents-Btql102J.mjs → agents-DG643yoJ.mjs} +4 -4
  38. package/.output/server/_ssr/{alert-NEiOCTOl.mjs → alert-DQvzE7bu.mjs} +1 -1
  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-Df-aDpfJ.mjs} +816 -17
  42. package/.output/server/_ssr/connector-icon-WvxwZ5TF.mjs +56 -0
  43. package/.output/server/_ssr/{connectors-BHNwuIMj.mjs → connectors-BU0IiRge.mjs} +7 -6
  44. package/.output/server/_ssr/{connectors-C28g0i4c.mjs → connectors-e0mf2pMs.mjs} +14 -3
  45. package/.output/server/_ssr/{gaps-RAFSXLZf.mjs → gaps-Cz76ZicM.mjs} +6 -6
  46. package/.output/server/_ssr/inbox-CAUBa1I3.mjs +114 -0
  47. package/.output/server/_ssr/{loop-form-DlObSewZ.mjs → loop-form-FqSaXiHl.mjs} +8 -7
  48. package/.output/server/_ssr/{loops-APFcP0y6.mjs → loops-D8WuK7Ke.mjs} +200 -7
  49. package/.output/server/_ssr/{loops-xt2Bn7_q.mjs → loops-Dqoebe8q.mjs} +8 -8
  50. package/.output/server/_ssr/{new-DfKyd2Wa.mjs → new-bBsVaWD6.mjs} +5 -5
  51. package/.output/server/_ssr/{router-3WmpE5b_.mjs → router-54IDWTVz.mjs} +68 -62
  52. package/.output/server/_ssr/{runners-By-mwc3F.mjs → runners-Cj6z9Mqh.mjs} +26 -3
  53. package/.output/server/_ssr/{runners-DtXs4Q8a.mjs → runners-D2UAdLyj.mjs} +3 -3
  54. package/.output/server/_ssr/{runners-DI_NxpHC.mjs → runners-DGWaVvWi.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-DzBlslan.mjs} +6 -13
  57. package/.output/server/_ssr/ssr.mjs +45 -33
  58. package/.output/server/_ssr/{start-Bdc2GJUI.mjs → start-Vq3Oan3v.mjs} +3 -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-_qgBS9LU.mjs} +9 -8
  61. package/.output/server/_ssr/{tasks-vcoodp_D.mjs → tasks-BDqznm57.mjs} +98 -8
  62. package/.output/server/_ssr/{tasks-SAjNovX6.mjs → tasks-Qtml5TlK.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-CvheE7ZF.mjs} +54 -48
  65. package/.output/server/{_taskId-CXS3lod0.mjs → _taskId-V4QLBO2N.mjs} +17 -10
  66. package/.output/server/index.mjs +173 -166
  67. package/README.md +26 -21
  68. package/dist/cli.mjs +7146 -16
  69. package/dist/dispatcher.mjs +844 -33
  70. package/drizzle/0024_prompt_tasks.sql +44 -0
  71. package/drizzle/meta/_journal.json +7 -0
  72. package/package.json +21 -17
  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/styles-DZL5V1o7.css +0 -2
  96. package/.output/public/assets/switch-d5ummmHY.js +0 -1
  97. package/.output/public/assets/task-list-BpOStt9v.js +0 -1
  98. package/.output/public/assets/tasks-B8MsKgic.js +0 -1
  99. package/.output/server/_ssr/access-zIl15o8y.mjs +0 -42
  100. package/.output/server/_ssr/connector-icon-DZXQLLFo.mjs +0 -37
  101. package/.output/server/_ssr/inbox-k5zHergU.mjs +0 -35
@@ -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 { o as connectorManifest } from "./connections-Df-aDpfJ.mjs";
4
+ import { n as agentManifest } from "./agents-DG643yoJ.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 { B as Card, R as Badge, V as CardContent, W as cn, p as useLiveTasks } from "./router-54IDWTVz.mjs";
7
+ import { t as ConnectorIcon } from "./connector-icon-WvxwZ5TF.mjs";
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/task-list-_qgBS9LU.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
  });
@@ -1,12 +1,12 @@
1
1
  import { f as eq, u as desc } from "../_libs/drizzle-orm.mjs";
2
- import { c as loops, d as runDir, g as tasks, s as db } from "./client-CKkOfh-s.mjs";
3
- import { a as connectorManifest, c as credentialForConnector, i as connectorAction, o as connectorRuntime, s as connectorWorkflow } from "./connections-qnw2GVlP.mjs";
4
- import { o as settingsFor } from "./agents-Btql102J.mjs";
5
- import "./runners-DtXs4Q8a.mjs";
2
+ import { c as loops, d as runDir, g as tasks, s as db } from "./client-BtVRVhQ2.mjs";
3
+ import { a as connectorAction, c as connectorWorkflow, l as credentialForConnector, o as connectorManifest, s as connectorRuntime } from "./connections-Df-aDpfJ.mjs";
4
+ import { i as listAgents, n as agentManifest, s as settingsFor } from "./agents-DG643yoJ.mjs";
5
+ import { t as availableAgentIds } from "./runners-D2UAdLyj.mjs";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs";
8
8
  import { isAbsolute, join } from "node:path";
9
- //#region node_modules/.nitro/vite/services/ssr/assets/tasks-vcoodp_D.js
9
+ //#region node_modules/.nitro/vite/services/ssr/assets/tasks-BDqznm57.js
10
10
  /** The agent says this when the honest answer is silence. */
11
11
  var AGENT_NOTHING = "NOTHING_TO_DO";
12
12
  function isAgentNothing(text) {
@@ -177,13 +177,14 @@ function toView(row) {
177
177
  return {
178
178
  id: row.id,
179
179
  loopId: row.loopId,
180
- loopName: row.loopName ?? "Deleted loop",
180
+ loopName: row.loopName ?? (row.loopId ? "Deleted loop" : "Test run"),
181
181
  connectorId: row.connectorId,
182
182
  state: row.state,
183
183
  sourceUrl: row.sourceUrl,
184
184
  sourceKind: row.sourceKind,
185
185
  sourceRef: row.sourceRef,
186
186
  sourceTitle: row.sourceTitle,
187
+ prompt: row.prompt ?? null,
187
188
  dryRun: row.dryRun,
188
189
  agentId: row.agentId,
189
190
  runnerId: row.runnerId,
@@ -212,6 +213,7 @@ function select() {
212
213
  sourceKind: tasks.sourceKind,
213
214
  sourceRef: tasks.sourceRef,
214
215
  sourceTitle: tasks.sourceTitle,
216
+ prompt: tasks.prompt,
215
217
  dryRun: tasks.dryRun,
216
218
  agentId: tasks.agentId,
217
219
  runnerId: tasks.runnerId,
@@ -275,6 +277,46 @@ async function queue(input) {
275
277
  }).run();
276
278
  return await getTask(id);
277
279
  }
280
+ function titleFromPrompt(prompt) {
281
+ return (prompt.split("\n")[0]?.trim() ?? "").slice(0, 120) || "Test run";
282
+ }
283
+ function isPromptTask(task) {
284
+ return task.loopId == null;
285
+ }
286
+ /**
287
+ * A free-form ask from Inbox. No loop, no connector, no write-back: the runner
288
+ * runs the agent and the reply stays on the task.
289
+ */
290
+ async function enqueuePrompt(input) {
291
+ const prompt = input.prompt.trim();
292
+ if (!prompt) throw new Error("Write a prompt.");
293
+ if (!agentManifest(input.agentId)) throw new Error(`Unknown agent: ${input.agentId}`);
294
+ if (!(await availableAgentIds()).includes(input.agentId)) throw new Error("No runner is online that can run this agent.");
295
+ const id = randomUUID();
296
+ await db().insert(tasks).values({
297
+ id,
298
+ loopId: null,
299
+ connectorId: "prompt",
300
+ state: "queued",
301
+ sourceUrl: "",
302
+ sourceKind: "prompt",
303
+ sourceRef: "prompt",
304
+ sourceTitle: titleFromPrompt(prompt),
305
+ prompt,
306
+ dryRun: false,
307
+ agentId: input.agentId,
308
+ actionConnectorId: "prompt",
309
+ actionId: "none"
310
+ }).run();
311
+ return await getTask(id);
312
+ }
313
+ async function listRunnableAgents() {
314
+ const available = new Set(await availableAgentIds());
315
+ return (await listAgents()).filter((agent) => available.has(agent.agentId)).map((agent) => ({
316
+ agentId: agent.agentId,
317
+ name: agentManifest(agent.agentId)?.name ?? agent.agentId
318
+ }));
319
+ }
278
320
  /** Everything a loop needs before it can produce a task, or a reason it cannot. */
279
321
  async function runnable(loopId) {
280
322
  const loop = await db().select().from(loops).where(eq(loops.id, loopId)).get();
@@ -370,7 +412,8 @@ var KIND_NOUN = {
370
412
  issue: "issue",
371
413
  message: "the message",
372
414
  email: "the email",
373
- occurrence: "the run due at"
415
+ occurrence: "the run due at",
416
+ prompt: "the prompt"
374
417
  };
375
418
  function checkoutInstructions(item, branch, writesCode) {
376
419
  const checkout = item.checkout;
@@ -436,6 +479,8 @@ async function loadWork(id, signal) {
436
479
  const task = await taskRow(id);
437
480
  if (!task) throw new Error(`Task not found: ${id}`);
438
481
  if (signal?.aborted || task.cancelRequested) throw new TaskCancelled();
482
+ if (isPromptTask(task)) throw new Error("A prompt run has no work item to load.");
483
+ if (!task.loopId) throw new Error("The loop behind this task has been deleted.");
439
484
  const loop = await db().select().from(loops).where(eq(loops.id, task.loopId)).get();
440
485
  if (!loop) throw new Error("The loop behind this task has been deleted.");
441
486
  const workflow = connectorWorkflow(loop.connectorId, loop.workflowId);
@@ -462,6 +507,19 @@ async function loadWork(id, signal) {
462
507
  };
463
508
  }
464
509
  async function jobForTask(id) {
510
+ const existing = await taskRow(id);
511
+ if (!existing) throw new Error(`Task not found: ${id}`);
512
+ if (isPromptTask(existing)) {
513
+ if (!existing.agentId) throw new Error("This task has no agent yet.");
514
+ if (!existing.prompt) throw new Error("This task has no prompt.");
515
+ return {
516
+ taskId: id,
517
+ agentId: existing.agentId,
518
+ prompt: existing.prompt,
519
+ settings: await settingsFor(existing.agentId),
520
+ files: []
521
+ };
522
+ }
465
523
  const { task, loop, workflow, item } = await loadWork(id);
466
524
  if (!task.agentId) throw new Error("This task has no agent yet.");
467
525
  const workspace = runDir(id);
@@ -492,6 +550,27 @@ async function jobForTask(id) {
492
550
  };
493
551
  }
494
552
  async function absorbAgentOutput(id, raw) {
553
+ const existing = await taskRow(id);
554
+ if (!existing) throw new Error(`Task not found: ${id}`);
555
+ if (isPromptTask(existing)) {
556
+ const workspace = runDir(id);
557
+ const said = raw.trim();
558
+ writeFileSync(join(workspace, "reply.txt"), said);
559
+ if (!said) throw new Error("The agent produced nothing.");
560
+ if (isAgentNothing(said)) {
561
+ await finish(id, existing, {
562
+ state: "skipped",
563
+ output: said
564
+ });
565
+ return await getTask(id);
566
+ }
567
+ await updateTask(id, {
568
+ output: said,
569
+ comments: []
570
+ });
571
+ await finish(id, existing, { state: "prepared" });
572
+ return await getTask(id);
573
+ }
495
574
  const { task, workflow, action, item } = await loadWork(id);
496
575
  const workspace = runDir(id);
497
576
  const said = raw.trim();
@@ -529,5 +608,16 @@ async function finish(id, task, values) {
529
608
  leaseUntil: null
530
609
  });
531
610
  }
611
+ async function defaultAgentFor(pinned) {
612
+ if (pinned) {
613
+ if (!agentManifest(pinned)) throw new Error(`Unknown agent: ${pinned}`);
614
+ return pinned;
615
+ }
616
+ const available = await availableAgentIds();
617
+ const chosen = (await listAgents()).find((agent) => agent.isDefault)?.agentId ?? null;
618
+ if (chosen && available.includes(chosen)) return chosen;
619
+ if (available.length === 1) return available[0];
620
+ throw new Error("No agent is available. Start a runner with an agent signed in.");
621
+ }
532
622
  //#endregion
533
- export { jobForTask as a, readTaskLog as c, updateTask as d, getTask as i, requestCancel as l, enqueueSignal as n, jobRequiresHost as o, enqueueTask as r, listTasks as s, absorbAgentOutput as t, taskRow as u };
623
+ export { enqueueTask as a, jobRequiresHost as c, readTaskLog as d, requestCancel as f, enqueueSignal as i, listRunnableAgents as l, updateTask as m, defaultAgentFor as n, getTask as o, taskRow as p, enqueuePrompt as r, jobForTask as s, absorbAgentOutput as t, listTasks as u };
@@ -1,11 +1,11 @@
1
1
  import { n as createServerFn } from "./ssr.mjs";
2
2
  import { f as eq } from "../_libs/drizzle-orm.mjs";
3
- import { r as appSettings, s as db } from "./client-CKkOfh-s.mjs";
4
- import { l as onlineRunnerCount } from "./runners-DtXs4Q8a.mjs";
5
- import { c as readTaskLog, i as getTask, l as requestCancel, r as enqueueTask, s as listTasks } from "./tasks-vcoodp_D.mjs";
3
+ import { r as appSettings, s as db } from "./client-BtVRVhQ2.mjs";
4
+ import { l as onlineRunnerCount } from "./runners-D2UAdLyj.mjs";
5
+ import { a as enqueueTask, d as readTaskLog, f as requestCancel, l as listRunnableAgents, o as getTask, r as enqueuePrompt, u as listTasks } from "./tasks-BDqznm57.mjs";
6
6
  import { t as createServerRpc } from "./createServerRpc-DPDrnFdH.mjs";
7
7
  import { randomUUID } from "node:crypto";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/tasks-SAjNovX6.js
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/tasks-Qtml5TlK.js
9
9
  async function readSetting(key, fallback) {
10
10
  const row = await db().select().from(appSettings).where(eq(appSettings.key, key)).get();
11
11
  return row === void 0 ? fallback : row.value;
@@ -59,7 +59,10 @@ var getInbox_createServerFn_handler = createServerRpc({
59
59
  name: "getInbox",
60
60
  filename: "src/server/functions/tasks.ts"
61
61
  }, (opts) => getInbox.__executeServer(opts));
62
- var getInbox = createServerFn({ method: "GET" }).handler(getInbox_createServerFn_handler, async () => await listTasks());
62
+ var getInbox = createServerFn({ method: "GET" }).handler(getInbox_createServerFn_handler, async () => ({
63
+ tasks: await listTasks(),
64
+ agents: await listRunnableAgents()
65
+ }));
63
66
  var getLoopTasks_createServerFn_handler = createServerRpc({
64
67
  id: "3f938fac3e5ec1631e700a2fdd4790e78abbefeb732ecfbbe6864cc19f0d5aac",
65
68
  name: "getLoopTasks",
@@ -78,6 +81,12 @@ var getTaskLog_createServerFn_handler = createServerRpc({
78
81
  filename: "src/server/functions/tasks.ts"
79
82
  }, (opts) => getTaskLog.__executeServer(opts));
80
83
  var getTaskLog = createServerFn({ method: "GET" }).inputValidator((data) => data).handler(getTaskLog_createServerFn_handler, async ({ data }) => await readTaskLog(data.id));
84
+ var runPrompt_createServerFn_handler = createServerRpc({
85
+ id: "bef559b165754b06d6d5cf7c6dccde3d5a6a326462430c621eb131f78665d6e1",
86
+ name: "runPrompt",
87
+ filename: "src/server/functions/tasks.ts"
88
+ }, (opts) => runPrompt.__executeServer(opts));
89
+ var runPrompt = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(runPrompt_createServerFn_handler, async ({ data }) => await enqueuePrompt(data));
81
90
  var runLoopNow_createServerFn_handler = createServerRpc({
82
91
  id: "7258ce5fc6f23acf3aab039ecd4acdb006d42b2ddbf3ab8629b4000e101b51dc",
83
92
  name: "runLoopNow",
@@ -107,4 +116,4 @@ var pauseDispatcher_createServerFn_handler = createServerRpc({
107
116
  }, (opts) => pauseDispatcher.__executeServer(opts));
108
117
  var pauseDispatcher = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(pauseDispatcher_createServerFn_handler, async ({ data }) => await setDispatcherPaused(data.paused));
109
118
  //#endregion
110
- export { getDispatcherState_createServerFn_handler, getInbox_createServerFn_handler, getLoopTasks_createServerFn_handler, getTaskById_createServerFn_handler, getTaskLog_createServerFn_handler, pauseDispatcher_createServerFn_handler, runLoopNow_createServerFn_handler, stopTask_createServerFn_handler };
119
+ export { getDispatcherState_createServerFn_handler, getInbox_createServerFn_handler, getLoopTasks_createServerFn_handler, getTaskById_createServerFn_handler, getTaskLog_createServerFn_handler, pauseDispatcher_createServerFn_handler, runLoopNow_createServerFn_handler, runPrompt_createServerFn_handler, stopTask_createServerFn_handler };
@@ -0,0 +1,14 @@
1
+ import "../_runtime.mjs";
2
+ import { U as require_jsx_runtime, W as require_react } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { W as cn } from "./router-54IDWTVz.mjs";
4
+ require_react();
5
+ var import_jsx_runtime = require_jsx_runtime();
6
+ function Textarea({ className, ...props }) {
7
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", {
8
+ "data-slot": "textarea",
9
+ 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),
10
+ ...props
11
+ });
12
+ }
13
+ //#endregion
14
+ export { Textarea as t };
@@ -1,4 +1,4 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-C0cP5F0M.js
1
+ //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-CvheE7ZF.js
2
2
  var tsrStartManifest = () => ({ routes: {
3
3
  __root__: {
4
4
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/__root.tsx",
@@ -23,102 +23,108 @@ var tsrStartManifest = () => ({ routes: {
23
23
  "/api/runners/jobs/$taskId/log"
24
24
  ],
25
25
  preloads: [
26
- "/assets/index-ztzex0FN.js",
27
- "/assets/preload-helper-ORbuV86A.js",
28
- "/assets/button-HCY6DCY-.js",
29
- "/assets/tasks-B8MsKgic.js",
30
- "/assets/manifests-DNMqf7Vi.js",
31
- "/assets/connectors-BvzttfSu.js",
32
- "/assets/loops-oSdqMd29.js"
26
+ "/assets/index-0yP3Jn_G.js",
27
+ "/assets/rolldown-runtime-CbXtAM7H.js",
28
+ "/assets/preload-helper-CfdAYKD7.js",
29
+ "/assets/select-Cppu-hti.js",
30
+ "/assets/useValueChanged-VVyq4hb9.js"
33
31
  ],
34
32
  scripts: [{ attrs: {
35
33
  type: "module",
36
34
  async: !0,
37
- src: "/assets/index-ztzex0FN.js"
35
+ src: "/assets/index-0yP3Jn_G.js"
38
36
  } }]
39
37
  },
40
38
  "/connectors/$connectorId": {
41
39
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/connectors/$connectorId.tsx",
42
40
  children: void 0,
43
41
  preloads: [
44
- "/assets/_connectorId-BWjYn5tm.js",
45
- "/assets/arrow-left-BF9juV9T.js",
46
- "/assets/connector-icon-BZ_MUJV_.js",
47
- "/assets/external-link-D46X-bXa.js",
48
- "/assets/loader-CcBl2u8m.js",
49
- "/assets/trash-2-D6u6NpzO.js",
50
- "/assets/setting-fields-ixkpdBb-.js",
51
- "/assets/connection-status-CYZB8kLy.js",
52
- "/assets/alert-Bn9-Zm0l.js"
42
+ "/assets/_connectorId-CkygNLny.js",
43
+ "/assets/arrow-left-CWUZt6k2.js",
44
+ "/assets/connector-icon-BUoK6Cru.js",
45
+ "/assets/external-link-DC11orFA.js",
46
+ "/assets/loader-B4Epchm_.js",
47
+ "/assets/refresh-cw-C3xBnKfy.js",
48
+ "/assets/trash-2-BXZzBsoV.js",
49
+ "/assets/setting-fields-bJ_gTG7Q.js",
50
+ "/assets/connection-status-DCqqmY_6.js",
51
+ "/assets/alert-BT2EVMJP.js"
53
52
  ]
54
53
  },
55
54
  "/inbox/$taskId": {
56
55
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/inbox/$taskId.tsx",
57
56
  children: void 0,
58
57
  preloads: [
59
- "/assets/_taskId-BOzICXDf.js",
60
- "/assets/arrow-left-BF9juV9T.js",
61
- "/assets/task-list-BpOStt9v.js",
62
- "/assets/external-link-D46X-bXa.js",
63
- "/assets/loader-CcBl2u8m.js",
64
- "/assets/alert-Bn9-Zm0l.js"
58
+ "/assets/_taskId-BKDIJ_Fg.js",
59
+ "/assets/arrow-left-CWUZt6k2.js",
60
+ "/assets/task-list-BAxjcVgr.js",
61
+ "/assets/external-link-DC11orFA.js",
62
+ "/assets/loader-B4Epchm_.js",
63
+ "/assets/alert-BT2EVMJP.js"
65
64
  ]
66
65
  },
67
66
  "/loops/$loopId": {
68
67
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/loops/$loopId.tsx",
69
68
  children: void 0,
70
69
  preloads: [
71
- "/assets/_loopId-Ds4RkyEc.js",
72
- "/assets/arrow-left-BF9juV9T.js",
73
- "/assets/loop-form-dB3CLcZb.js",
74
- "/assets/task-list-BpOStt9v.js",
75
- "/assets/switch-d5ummmHY.js",
76
- "/assets/alert-Bn9-Zm0l.js",
77
- "/assets/gaps-D-I6xiDc.js"
70
+ "/assets/_loopId-Cshlc5Ja.js",
71
+ "/assets/arrow-left-CWUZt6k2.js",
72
+ "/assets/loop-form-DnSJNc1k.js",
73
+ "/assets/task-list-BAxjcVgr.js",
74
+ "/assets/play-DD4xQgvi.js",
75
+ "/assets/refresh-cw-C3xBnKfy.js",
76
+ "/assets/switch-hRIbNGOj.js",
77
+ "/assets/alert-BT2EVMJP.js",
78
+ "/assets/gaps-BtFoD7mF.js"
78
79
  ]
79
80
  },
80
81
  "/loops/new": {
81
82
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/loops/new.tsx",
82
83
  children: void 0,
83
84
  preloads: [
84
- "/assets/new-uyFxVjuB.js",
85
- "/assets/arrow-left-BF9juV9T.js",
86
- "/assets/arrow-right-CzqvnOY1.js",
87
- "/assets/loop-form-dB3CLcZb.js",
88
- "/assets/connector-icon-BZ_MUJV_.js"
85
+ "/assets/new-m5NlqYQT.js",
86
+ "/assets/arrow-left-CWUZt6k2.js",
87
+ "/assets/arrow-right-dy_oOg_c.js",
88
+ "/assets/loop-form-DnSJNc1k.js",
89
+ "/assets/connector-icon-BUoK6Cru.js"
89
90
  ]
90
91
  },
91
92
  "/connectors/": {
92
93
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/connectors/index.tsx",
93
94
  children: void 0,
94
95
  preloads: [
95
- "/assets/connectors-DdJNwRN_.js",
96
- "/assets/arrow-right-CzqvnOY1.js",
97
- "/assets/connector-icon-BZ_MUJV_.js",
98
- "/assets/connection-status-CYZB8kLy.js"
96
+ "/assets/connectors-CeLBtEtg.js",
97
+ "/assets/arrow-right-dy_oOg_c.js",
98
+ "/assets/connector-icon-BUoK6Cru.js",
99
+ "/assets/connection-status-DCqqmY_6.js"
99
100
  ]
100
101
  },
101
102
  "/inbox/": {
102
103
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/inbox/index.tsx",
103
104
  children: void 0,
104
- preloads: ["/assets/inbox-BUUu9xxE.js", "/assets/task-list-BpOStt9v.js"]
105
+ preloads: [
106
+ "/assets/inbox-BYNjkNDJ.js",
107
+ "/assets/task-list-BAxjcVgr.js",
108
+ "/assets/play-DD4xQgvi.js",
109
+ "/assets/textarea-Fyuzi6Vp.js"
110
+ ]
105
111
  },
106
112
  "/loops/": {
107
113
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/loops/index.tsx",
108
114
  children: void 0,
109
115
  preloads: [
110
- "/assets/loops-DRunQrxL.js",
111
- "/assets/connector-icon-BZ_MUJV_.js",
112
- "/assets/trash-2-D6u6NpzO.js",
113
- "/assets/switch-d5ummmHY.js",
114
- "/assets/alert-Bn9-Zm0l.js",
115
- "/assets/gaps-D-I6xiDc.js"
116
+ "/assets/loops-1CvbqO6m.js",
117
+ "/assets/connector-icon-BUoK6Cru.js",
118
+ "/assets/trash-2-BXZzBsoV.js",
119
+ "/assets/switch-hRIbNGOj.js",
120
+ "/assets/alert-BT2EVMJP.js",
121
+ "/assets/gaps-BtFoD7mF.js"
116
122
  ]
117
123
  },
118
124
  "/runners/": {
119
125
  filePath: "/Users/bytedance/codex-projects/loopable/src/routes/runners/index.tsx",
120
126
  children: void 0,
121
- preloads: ["/assets/runners-DSU3r5Ww.js", "/assets/alert-Bn9-Zm0l.js"]
127
+ preloads: ["/assets/runners-D8QVl-Y6.js", "/assets/alert-BT2EVMJP.js"]
122
128
  }
123
129
  } });
124
130
  //#endregion
@@ -1,13 +1,13 @@
1
1
  import { i as __toESM } from "./_runtime.mjs";
2
2
  import { U as require_jsx_runtime, W as require_react } from "./_libs/@base-ui/react+[...].mjs";
3
3
  import { f as Link, m as useRouter } from "./_libs/@tanstack/react-router+[...].mjs";
4
- import { a as connectorManifest, i as connectorAction } from "./_ssr/connections-qnw2GVlP.mjs";
4
+ import { a as connectorAction, o as connectorManifest } from "./_ssr/connections-Df-aDpfJ.mjs";
5
5
  import { B as ArrowLeft, C as ExternalLink, E as CircleStop, g as Loader, x as FileCode } from "./_libs/lucide-react.mjs";
6
6
  import { n as toast } from "./_libs/sonner.mjs";
7
- import { A as stopTask, B as CardTitle, C as Button$1, I as Badge, L as Card, R as CardContent, c as Route$12, m as isTaskActive, p as useLiveTasks, z as CardHeader } from "./_ssr/router-3WmpE5b_.mjs";
8
- import { n as AlertDescription, r as AlertTitle, t as Alert } from "./_ssr/alert-NEiOCTOl.mjs";
9
- import { i as taskTitle, r as TaskStateLabel, t as KIND_LABEL } from "./_ssr/task-list-CUITIqkb.mjs";
10
- //#region node_modules/.nitro/vite/services/ssr/assets/_taskId-CXS3lod0.js
7
+ import { B as Card, H as CardHeader, R as Badge, U as CardTitle, V as CardContent, c as Route$12, j as stopTask, m as isTaskActive, p as useLiveTasks, z as Button$1 } from "./_ssr/router-54IDWTVz.mjs";
8
+ import { n as AlertDescription, r as AlertTitle, t as Alert } from "./_ssr/alert-DQvzE7bu.mjs";
9
+ import { i as taskTitle, r as TaskStateLabel, t as KIND_LABEL } from "./_ssr/task-list-_qgBS9LU.mjs";
10
+ //#region node_modules/.nitro/vite/services/ssr/assets/_taskId-V4QLBO2N.js
11
11
  var import_react = /* @__PURE__ */ __toESM(require_react());
12
12
  var import_jsx_runtime = require_jsx_runtime();
13
13
  function TaskPage() {
@@ -30,9 +30,9 @@ function TaskPage() {
30
30
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
31
31
  className: "text-xl font-semibold tracking-tight",
32
32
  children: taskTitle(task)
33
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
33
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
34
34
  className: "mt-1 text-sm text-muted-foreground",
35
- children: [
35
+ children: task.loopId ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
36
36
  task.sourceRef,
37
37
  " ·",
38
38
  " ",
@@ -42,7 +42,7 @@ function TaskPage() {
42
42
  className: "underline",
43
43
  children: task.loopName
44
44
  })
45
- ]
45
+ ] }) : task.loopName
46
46
  })]
47
47
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
48
48
  className: "flex flex-col items-end gap-2",
@@ -103,7 +103,7 @@ function TaskPage() {
103
103
  children: [
104
104
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
105
105
  label: "Source",
106
- children: task.sourceUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
106
+ children: task.sourceKind === "prompt" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: KIND_LABEL.prompt }) : task.sourceUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
107
107
  href: task.sourceUrl,
108
108
  target: "_blank",
109
109
  rel: "noreferrer",
@@ -120,7 +120,14 @@ function TaskPage() {
120
120
  task.sourceRef
121
121
  ] })
122
122
  }),
123
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Row, {
123
+ task.prompt ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
124
+ className: "text-xs text-muted-foreground",
125
+ children: "Prompt"
126
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", {
127
+ className: "mt-1 overflow-x-auto whitespace-pre-wrap rounded-md bg-muted p-2.5 text-xs",
128
+ children: task.prompt
129
+ })] }) : null,
130
+ task.sourceKind === "prompt" ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Row, {
124
131
  label: "Action",
125
132
  children: [action?.name ?? task.actionId, task.actionConnectorId === task.connectorId ? null : ` on ${writer?.name ?? task.actionConnectorId}`]
126
133
  }),