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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/_connectorId-CkygNLny.js +1 -0
- package/.output/public/assets/_loopId-Cshlc5Ja.js +1 -0
- package/.output/public/assets/_taskId-BKDIJ_Fg.js +1 -0
- package/.output/public/assets/alert-BT2EVMJP.js +1 -0
- package/.output/public/assets/arrow-left-CWUZt6k2.js +1 -0
- package/.output/public/assets/arrow-right-dy_oOg_c.js +1 -0
- package/.output/public/assets/connection-status-DCqqmY_6.js +1 -0
- package/.output/public/assets/connector-icon-BUoK6Cru.js +1 -0
- package/.output/public/assets/connectors-CeLBtEtg.js +1 -0
- package/.output/public/assets/{external-link-D46X-bXa.js → external-link-DC11orFA.js} +1 -1
- package/.output/public/assets/gaps-BtFoD7mF.js +1 -0
- package/.output/public/assets/inbox-BYNjkNDJ.js +1 -0
- package/.output/public/assets/index-0yP3Jn_G.js +18 -0
- package/.output/public/assets/{loader-CcBl2u8m.js → loader-B4Epchm_.js} +1 -1
- package/.output/public/assets/loop-form-DnSJNc1k.js +1 -0
- package/.output/public/assets/loops-1CvbqO6m.js +1 -0
- package/.output/public/assets/new-m5NlqYQT.js +1 -0
- package/.output/public/assets/play-DD4xQgvi.js +1 -0
- package/.output/public/assets/preload-helper-CfdAYKD7.js +3 -0
- package/.output/public/assets/refresh-cw-C3xBnKfy.js +1 -0
- package/.output/public/assets/rolldown-runtime-CbXtAM7H.js +1 -0
- package/.output/public/assets/runners-D8QVl-Y6.js +1 -0
- package/.output/public/assets/select-Cppu-hti.js +1 -0
- package/.output/public/assets/setting-fields-bJ_gTG7Q.js +3 -0
- package/.output/public/assets/styles-ClTGaXU0.css +2 -0
- package/.output/public/assets/switch-hRIbNGOj.js +1 -0
- package/.output/public/assets/task-list-BAxjcVgr.js +1 -0
- package/.output/public/assets/textarea-Fyuzi6Vp.js +1 -0
- package/.output/public/assets/{trash-2-D6u6NpzO.js → trash-2-BXZzBsoV.js} +1 -1
- package/.output/public/assets/useValueChanged-VVyq4hb9.js +1 -0
- package/.output/server/{_connectorId-8nb5yOzG.mjs → _connectorId-C9yydJrC.mjs} +92 -11
- package/.output/server/_libs/@base-ui/react+[...].mjs +427 -427
- package/.output/server/{_loopId-BsUL1SeL.mjs → _loopId-B0VG-eBC.mjs} +44 -15
- package/.output/server/_ssr/{callback-CUINvl7M.mjs → access-DTttr563.mjs} +39 -5
- package/.output/server/_ssr/{agents-DAOZPgO2.mjs → agents-C7B6RJ6-.mjs} +3 -3
- package/.output/server/_ssr/{agents-Btql102J.mjs → agents-DG643yoJ.mjs} +4 -4
- package/.output/server/_ssr/{alert-NEiOCTOl.mjs → alert-DQvzE7bu.mjs} +1 -1
- package/.output/server/_ssr/{client-CKkOfh-s.mjs → client-BtVRVhQ2.mjs} +4 -2
- package/.output/server/_ssr/{connection-status-Bi5peUAk.mjs → connection-status-BZr3Y-IC.mjs} +2 -2
- package/.output/server/_ssr/{connections-qnw2GVlP.mjs → connections-Df-aDpfJ.mjs} +816 -17
- package/.output/server/_ssr/connector-icon-WvxwZ5TF.mjs +56 -0
- package/.output/server/_ssr/{connectors-BHNwuIMj.mjs → connectors-BU0IiRge.mjs} +7 -6
- package/.output/server/_ssr/{connectors-C28g0i4c.mjs → connectors-e0mf2pMs.mjs} +14 -3
- package/.output/server/_ssr/{gaps-RAFSXLZf.mjs → gaps-Cz76ZicM.mjs} +6 -6
- package/.output/server/_ssr/inbox-CAUBa1I3.mjs +114 -0
- package/.output/server/_ssr/{loop-form-DlObSewZ.mjs → loop-form-FqSaXiHl.mjs} +8 -7
- package/.output/server/_ssr/{loops-APFcP0y6.mjs → loops-D8WuK7Ke.mjs} +200 -7
- package/.output/server/_ssr/{loops-xt2Bn7_q.mjs → loops-Dqoebe8q.mjs} +8 -8
- package/.output/server/_ssr/{new-DfKyd2Wa.mjs → new-bBsVaWD6.mjs} +5 -5
- package/.output/server/_ssr/{router-3WmpE5b_.mjs → router-54IDWTVz.mjs} +68 -62
- package/.output/server/_ssr/{runners-By-mwc3F.mjs → runners-Cj6z9Mqh.mjs} +26 -3
- package/.output/server/_ssr/{runners-DtXs4Q8a.mjs → runners-D2UAdLyj.mjs} +3 -3
- package/.output/server/_ssr/{runners-DI_NxpHC.mjs → runners-DGWaVvWi.mjs} +4 -4
- package/.output/server/_ssr/{secrets-Hqti-niS.mjs → secrets-CRnpwGBh.mjs} +2 -2
- package/.output/server/_ssr/{setting-fields-8vKFj4df.mjs → setting-fields-DzBlslan.mjs} +6 -13
- package/.output/server/_ssr/ssr.mjs +45 -33
- package/.output/server/_ssr/{start-Bdc2GJUI.mjs → start-Vq3Oan3v.mjs} +3 -4
- package/.output/server/_ssr/{switch-ReNglgH6.mjs → switch-1pnd_bPJ.mjs} +2 -2
- package/.output/server/_ssr/{task-list-CUITIqkb.mjs → task-list-_qgBS9LU.mjs} +9 -8
- package/.output/server/_ssr/{tasks-vcoodp_D.mjs → tasks-BDqznm57.mjs} +98 -8
- package/.output/server/_ssr/{tasks-SAjNovX6.mjs → tasks-Qtml5TlK.mjs} +15 -6
- package/.output/server/_ssr/textarea-CHJTKtsJ.mjs +14 -0
- package/.output/server/{_tanstack-start-manifest_v-C0cP5F0M.mjs → _tanstack-start-manifest_v-CvheE7ZF.mjs} +54 -48
- package/.output/server/{_taskId-CXS3lod0.mjs → _taskId-V4QLBO2N.mjs} +17 -10
- package/.output/server/index.mjs +173 -166
- package/README.md +26 -21
- package/dist/cli.mjs +7146 -16
- package/dist/dispatcher.mjs +844 -33
- package/drizzle/0024_prompt_tasks.sql +44 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +21 -17
- package/.output/public/assets/_connectorId-BWjYn5tm.js +0 -1
- package/.output/public/assets/_loopId-Ds4RkyEc.js +0 -1
- package/.output/public/assets/_taskId-BOzICXDf.js +0 -1
- package/.output/public/assets/alert-Bn9-Zm0l.js +0 -1
- package/.output/public/assets/arrow-left-BF9juV9T.js +0 -1
- package/.output/public/assets/arrow-right-CzqvnOY1.js +0 -1
- package/.output/public/assets/button-HCY6DCY-.js +0 -1
- package/.output/public/assets/connection-status-CYZB8kLy.js +0 -1
- package/.output/public/assets/connector-icon-BZ_MUJV_.js +0 -1
- package/.output/public/assets/connectors-BvzttfSu.js +0 -1
- package/.output/public/assets/connectors-DdJNwRN_.js +0 -1
- package/.output/public/assets/gaps-D-I6xiDc.js +0 -1
- package/.output/public/assets/inbox-BUUu9xxE.js +0 -1
- package/.output/public/assets/index-ztzex0FN.js +0 -10
- package/.output/public/assets/loop-form-dB3CLcZb.js +0 -1
- package/.output/public/assets/loops-DRunQrxL.js +0 -1
- package/.output/public/assets/loops-oSdqMd29.js +0 -1
- package/.output/public/assets/manifests-DNMqf7Vi.js +0 -7
- package/.output/public/assets/new-uyFxVjuB.js +0 -1
- package/.output/public/assets/preload-helper-ORbuV86A.js +0 -3
- package/.output/public/assets/runners-DSU3r5Ww.js +0 -1
- package/.output/public/assets/setting-fields-ixkpdBb-.js +0 -3
- package/.output/public/assets/styles-DZL5V1o7.css +0 -2
- package/.output/public/assets/switch-d5ummmHY.js +0 -1
- package/.output/public/assets/task-list-BpOStt9v.js +0 -1
- package/.output/public/assets/tasks-B8MsKgic.js +0 -1
- package/.output/server/_ssr/access-zIl15o8y.mjs +0 -42
- package/.output/server/_ssr/connector-icon-DZXQLLFo.mjs +0 -37
- 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 {
|
|
4
|
-
import { n as agentManifest } from "./agents-
|
|
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 {
|
|
7
|
-
import { t as ConnectorIcon } from "./connector-icon-
|
|
8
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/task-list-
|
|
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-
|
|
3
|
-
import { a as
|
|
4
|
-
import {
|
|
5
|
-
import "./runners-
|
|
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-
|
|
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 {
|
|
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-
|
|
4
|
-
import { l as onlineRunnerCount } from "./runners-
|
|
5
|
-
import {
|
|
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-
|
|
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 () =>
|
|
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-
|
|
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-
|
|
27
|
-
"/assets/
|
|
28
|
-
"/assets/
|
|
29
|
-
"/assets/
|
|
30
|
-
"/assets/
|
|
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-
|
|
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-
|
|
45
|
-
"/assets/arrow-left-
|
|
46
|
-
"/assets/connector-icon-
|
|
47
|
-
"/assets/external-link-
|
|
48
|
-
"/assets/loader-
|
|
49
|
-
"/assets/
|
|
50
|
-
"/assets/
|
|
51
|
-
"/assets/
|
|
52
|
-
"/assets/
|
|
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-
|
|
60
|
-
"/assets/arrow-left-
|
|
61
|
-
"/assets/task-list-
|
|
62
|
-
"/assets/external-link-
|
|
63
|
-
"/assets/loader-
|
|
64
|
-
"/assets/alert-
|
|
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-
|
|
72
|
-
"/assets/arrow-left-
|
|
73
|
-
"/assets/loop-form-
|
|
74
|
-
"/assets/task-list-
|
|
75
|
-
"/assets/
|
|
76
|
-
"/assets/
|
|
77
|
-
"/assets/
|
|
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-
|
|
85
|
-
"/assets/arrow-left-
|
|
86
|
-
"/assets/arrow-right-
|
|
87
|
-
"/assets/loop-form-
|
|
88
|
-
"/assets/connector-icon-
|
|
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-
|
|
96
|
-
"/assets/arrow-right-
|
|
97
|
-
"/assets/connector-icon-
|
|
98
|
-
"/assets/connection-status-
|
|
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: [
|
|
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-
|
|
111
|
-
"/assets/connector-icon-
|
|
112
|
-
"/assets/trash-2-
|
|
113
|
-
"/assets/switch-
|
|
114
|
-
"/assets/alert-
|
|
115
|
-
"/assets/gaps-
|
|
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-
|
|
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
|
|
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 {
|
|
8
|
-
import { n as AlertDescription, r as AlertTitle, t as Alert } from "./_ssr/alert-
|
|
9
|
-
import { i as taskTitle, r as TaskStateLabel, t as KIND_LABEL } from "./_ssr/task-list-
|
|
10
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/_taskId-
|
|
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.
|
|
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)(
|
|
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
|
}),
|