@kky42/pievo-server 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{LoopView-XXW59HAV.js → LoopView-Pbp2YtUu.js} +3 -3
- package/.output/public/assets/{Modal-BnCPgN_k.js → Modal-B3xpEtcf.js} +1 -1
- package/.output/public/assets/{SignIn-BAoOONQ9.js → SignIn-9vsaKv_p.js} +1 -1
- package/.output/public/assets/{actionUi-Dxe9cHAc.js → actionUi-DDDfD0WX.js} +1 -1
- package/.output/public/assets/app-CStTBRt2.css +2 -0
- package/.output/public/assets/{artifactView-DekEs5ME.js → artifactView-BV-yQVrj.js} +1 -1
- package/.output/public/assets/index-49hAH0gP.js +12 -0
- package/.output/public/assets/{invite._token-BAqaXvte.js → invite._token-C3t4JfAY.js} +1 -1
- package/.output/public/assets/{invite._token-q54LLZ6A.js → invite._token-C891oGkK.js} +1 -1
- package/.output/public/assets/lifecycleUi-C3k2MlX8.js +1 -0
- package/.output/public/assets/{loopApi-5s2-kCnu.js → loopApi-C_Dtw-nL.js} +1 -1
- package/.output/public/assets/loops._loopId-DD4fKGMu.js +4 -0
- package/.output/public/assets/{loops._loopId_.runs._runId-lGYlHXTN.js → loops._loopId_.runs._runId-DoPcCQy7.js} +2 -2
- package/.output/public/assets/notifyFns-BaukhLAg.js +1 -0
- package/.output/public/assets/{preload-helper-ycaoAemE.js → preload-helper--VCqDT5m.js} +2 -2
- package/.output/public/assets/{routes-D0zKR7gK.js → routes-BS4N7Lnf.js} +1 -1
- package/.output/public/assets/{routes-C7Pw5lGn.js → routes-DsdcURfk.js} +1 -1
- package/.output/public/assets/{t._teamId-CCgajlMS.js → t._teamId-C9uEyAh_.js} +1 -1
- package/.output/public/assets/{t._teamId-Cn7cRGAh.js → t._teamId-DSYlMX_v.js} +1 -1
- package/.output/public/assets/ui-Gb1413-F.js +1 -0
- package/.output/server/_ssr/{DashboardView-BhJBW7IL.mjs → DashboardView-CQdjYy03.mjs} +36 -111
- package/.output/server/_ssr/{LoopPlaybook-BC9Dvnw2.mjs → LoopPlaybook-C86vJIjZ.mjs} +9 -9
- package/.output/server/_ssr/{LoopView-Dom6Ad5G.mjs → LoopView-cDyjmf1B.mjs} +16 -16
- package/.output/server/_ssr/{Modal-CfWC9R49.mjs → Modal-Bc_5TYGr.mjs} +2 -2
- package/.output/server/_ssr/{SignIn-D70NUJsN.mjs → SignIn-BQQiD3Ss.mjs} +3 -3
- package/.output/server/_ssr/{actionUi-mDYOvJdB.mjs → actionUi-BKF6xI3d.mjs} +2 -2
- package/.output/server/_ssr/{adapters-D0d1fBKK.mjs → adapters-N4-yQ1vK.mjs} +4 -8
- package/.output/server/_ssr/{artifactFiles-BfE1070_.mjs → artifactFiles-Dl1EaUtJ.mjs} +3 -3
- package/.output/server/_ssr/{artifactView-CYV1r48i.mjs → artifactView-DX4P3Krh.mjs} +2 -2
- package/.output/server/_ssr/artifacts-DzWJrBxK.mjs +2 -0
- package/.output/server/_ssr/{auth-BP81awUE.mjs → auth-CbAfO4Ne.mjs} +9 -9
- package/.output/server/_ssr/{boot-sM4t8RJu.mjs → boot-BZ-YyUiD.mjs} +1397 -626
- package/.output/server/_ssr/{boot-pUGFIxSA.mjs → boot-BigKgB8p.mjs} +1 -1
- package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-CZJuWL5Z.mjs → bun-sqlite-dialect-BW9W1_Ps-B67XLJZt.mjs} +2 -2
- package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-C2PCtZfI.mjs → d1-sqlite-dialect-BLC8LXE6-nff_yHzH.mjs} +2 -2
- package/.output/server/_ssr/db-BF8vSovA.mjs +2 -0
- package/.output/server/_ssr/{dist-Z7v6ihws.mjs → dist-BGjVt6NE.mjs} +2 -2
- package/.output/server/_ssr/{factory-BQ_XiP23.mjs → factory-DNeo3vVt.mjs} +2 -2
- package/.output/server/_ssr/{invite._token-CRAl6-yK.mjs → invite._token-Bipap1cl.mjs} +6 -6
- package/.output/server/_ssr/{invite._token-23daBIfe.mjs → invite._token-BlbVjz-o.mjs} +2 -2
- package/.output/server/_ssr/{invite._token-VKmyC9-R.mjs → invite._token-z3PzCMzb.mjs} +5 -5
- package/.output/server/_ssr/{kysely-adapter-DjQPkqgJ.mjs → kysely-adapter-C1ww7PKr.mjs} +1 -1
- package/.output/server/_ssr/{lifecycleUi-l3nx9i3T.mjs → lifecycleUi-5jMhxINb.mjs} +1 -3
- package/.output/server/_ssr/logger-C7aewtve.mjs +2 -0
- package/.output/server/_ssr/{loopApi-BfMnXaKT.mjs → loopApi-7MTSs6hy.mjs} +5 -5
- package/.output/server/_ssr/{loopApi-i7xdpokI.mjs → loopApi-JzGGZZp2.mjs} +31 -25
- package/.output/server/_ssr/{loops._loopId-jXSgPWG1.mjs → loops._loopId-CJxQ0EG4.mjs} +4 -4
- package/.output/server/_ssr/{loops._loopId-DOPfN_Op.mjs → loops._loopId-DFkyTJR3.mjs} +106 -132
- package/.output/server/_ssr/{loops._loopId_.runs._runId-DiBP2rCe.mjs → loops._loopId_.runs._runId-DkG-ZCD1.mjs} +10 -17
- package/.output/server/_ssr/{loops._loopId_.runs._runId-BhoM6DWj.mjs → loops._loopId_.runs._runId-lTigSOmT.mjs} +4 -4
- package/.output/server/_ssr/{machineFns-ChO1NM3C.mjs → machineFns-Dda8-rBY.mjs} +3 -3
- package/.output/server/_ssr/{node-sqlite-dialect-BGlhyZkk.mjs → node-sqlite-dialect-BS2OAFJh.mjs} +2 -2
- package/.output/server/_ssr/{notifyFns-DWotltSJ.mjs → notifyFns-C6eyIFZE.mjs} +7 -8
- package/.output/server/_ssr/{notifyFns-B1MSIzrT.mjs → notifyFns-C9N0QLe3.mjs} +3 -3
- package/.output/server/_ssr/{router-BOHN4CWd.mjs → router-DIfoLu1r.mjs} +30 -30
- package/.output/server/_ssr/{routes-DjaTMZqZ.mjs → routes-Bx0bRxt9.mjs} +2 -2
- package/.output/server/_ssr/{routes-BQjhKV-m.mjs → routes-DYJB0rKC.mjs} +5 -5
- package/.output/server/_ssr/{routes-C2VJzARp.mjs → routes-bWgX0tRE.mjs} +6 -6
- package/.output/server/_ssr/runDiff-B9t7ouYj.mjs +2 -0
- package/.output/server/_ssr/ssr.mjs +51 -51
- package/.output/server/_ssr/store-Dw4LiFjE.mjs +2 -0
- package/.output/server/_ssr/{t._teamId-o86wLJrg.mjs → t._teamId-B_ieXBNF.mjs} +6 -6
- package/.output/server/_ssr/{t._teamId-CRgNlDGk.mjs → t._teamId-C_KZZ4Xh.mjs} +5 -5
- package/.output/server/_ssr/{t._teamId-D_vi_OuG.mjs → t._teamId-D9nCEa2h.mjs} +2 -2
- package/.output/server/_ssr/{teamFns-D4I-0dEB.mjs → teamFns-BBIbatdZ.mjs} +2 -2
- package/.output/server/_ssr/{teamFns-C3vnwAqv.mjs → teamFns-O3ZmtZL2.mjs} +3 -3
- package/.output/server/_ssr/tokens-DI_pklQB.mjs +2 -0
- package/.output/server/_ssr/{ui-WGITbP6Z.mjs → ui-B6mE5-5v.mjs} +7 -23
- package/.output/server/{_tanstack-start-manifest_v-DYC0z7st.mjs → _tanstack-start-manifest_v-DKnfwHZr.mjs} +28 -28
- package/.output/server/drizzle/0014_luxuriant_scrambler.sql +5 -0
- package/.output/server/drizzle/0015_run_history_foundation.sql +43 -0
- package/.output/server/drizzle/meta/_journal.json +14 -0
- package/.output/server/index.mjs +106 -106
- package/drizzle/0014_luxuriant_scrambler.sql +5 -0
- package/drizzle/0015_run_history_foundation.sql +43 -0
- package/drizzle/meta/_journal.json +14 -0
- package/package.json +1 -1
- package/.output/public/assets/app-DzFILlbu.css +0 -2
- package/.output/public/assets/index-BtvLZjhl.js +0 -12
- package/.output/public/assets/lifecycleUi-B8Je9exd.js +0 -1
- package/.output/public/assets/loops._loopId-BCK4oIRv.js +0 -4
- package/.output/public/assets/notifyFns-BneSItOi.js +0 -1
- package/.output/public/assets/ui-RFP3R3lU.js +0 -1
- package/.output/server/_ssr/artifacts-CSGRJdSy.mjs +0 -2
- package/.output/server/_ssr/db-Cc6I8bWL.mjs +0 -2
- package/.output/server/_ssr/logger-CHoC5_kz.mjs +0 -2
- package/.output/server/_ssr/runDiff-SlGPjjNq.mjs +0 -113
- package/.output/server/_ssr/store-BjXC623Z.mjs +0 -2
- package/.output/server/_ssr/tokens-BCOvumer.mjs +0 -2
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { o as __toESM } from "../_runtime.mjs";
|
|
2
2
|
import { g as require_jsx_runtime, h as require_react } from "../_libs/@base-ui/react+[...].mjs";
|
|
3
|
-
import { c as CODING_AGENTS, g as buildFileEntries,
|
|
4
|
-
import { A as
|
|
3
|
+
import { c as CODING_AGENTS, g as buildFileEntries, mt as isTaskEntry } from "./boot-BZ-YyUiD.mjs";
|
|
4
|
+
import { A as tsShort, D as runPulseStyle, O as sectionHeadCls, S as labelCls, T as rel, _ as dur, b as humanBytes, c as btnDanger, d as btnQuiet, h as dotLabel, i as Pre, j as until, k as selectCls, l as btnPrimary, m as dotColor, n as Loading, o as btn, p as cronText, r as Pill, s as btnCost, t as ErrorBanner, v as fmt, x as inputCls } from "./ui-B6mE5-5v.mjs";
|
|
5
5
|
import { d as useNavigate, u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
|
|
6
|
-
import { C as stopJob, S as startJob, a as evolveJob, b as
|
|
7
|
-
import { n as TaskFileView, r as ViewerHead, t as ArtifactBody } from "./artifactView-
|
|
8
|
-
import {
|
|
9
|
-
import { s as useSession } from "./LoopPlaybook-BC9Dvnw2.mjs";
|
|
6
|
+
import { C as stopJob, S as startJob, a as evolveJob, b as requestSteer, d as getJobDetail, g as loadOlderRuns, i as deleteJob, s as getArtifacts, v as patchJob, x as runJob, y as pauseJob } from "./loopApi-7MTSs6hy.mjs";
|
|
7
|
+
import { n as TaskFileView, r as ViewerHead, t as ArtifactBody } from "./artifactView-DX4P3Krh.mjs";
|
|
8
|
+
import { s as useSession } from "./LoopPlaybook-C86vJIjZ.mjs";
|
|
10
9
|
import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
|
|
11
|
-
import { t as SignIn } from "./SignIn-
|
|
12
|
-
import { i as
|
|
13
|
-
import {
|
|
14
|
-
import { t as
|
|
15
|
-
|
|
10
|
+
import { t as SignIn } from "./SignIn-BQQiD3Ss.mjs";
|
|
11
|
+
import { i as useFlash, n as FlashLine, r as LoadErrorCard, t as ConfirmBar } from "./actionUi-BKF6xI3d.mjs";
|
|
12
|
+
import { i as lifecycleDisplay, n as daemonStopSupport, r as deriveLoopLifecycle, t as DAEMON_UPGRADE_REQUIRED } from "./lifecycleUi-5jMhxINb.mjs";
|
|
13
|
+
import { a as listChannels, n as Timeline, s as mergeRuns, t as MachinesModal } from "./notifyFns-C6eyIFZE.mjs";
|
|
14
|
+
import { t as Route } from "./loops._loopId-CJxQ0EG4.mjs";
|
|
15
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-DFkyTJR3.js
|
|
16
16
|
var import_react = /* @__PURE__ */ __toESM(require_react());
|
|
17
17
|
var import_jsx_runtime = require_jsx_runtime();
|
|
18
18
|
/**
|
|
19
19
|
* Copy-prompt path for the loop-detail Edit composer.
|
|
20
20
|
*
|
|
21
|
-
* The dispatch path (`
|
|
21
|
+
* The dispatch path (`requestSteer`) runs ONE agent pass on the owner's machine -
|
|
22
22
|
* spends credits, no conversation. This is the non-dispatch alternative: a
|
|
23
23
|
* self-contained prompt the owner pastes into their OWN local coding-agent
|
|
24
24
|
* session (in the loop's directory) so they can iterate/converse and adjust the
|
|
@@ -40,7 +40,7 @@ function loopDir(taskFile) {
|
|
|
40
40
|
* instruction, or a clear placeholder asking them to describe it), and that the
|
|
41
41
|
* agent should drive the installed pievo CLI/skill (`pievo loops`,
|
|
42
42
|
* `pievo edit <id> ...`) to apply and confirm the change. Concise, agent-neutral. */
|
|
43
|
-
function
|
|
43
|
+
function buildSteerPrompt({ loopId, loopName, instruction }) {
|
|
44
44
|
const want = instruction?.trim() || "Describe the change you want to make to this loop.";
|
|
45
45
|
return [
|
|
46
46
|
`I want to adjust my Pievo loop "${loopName}" (loop id: ${loopId}).`,
|
|
@@ -212,7 +212,7 @@ function initState(initial) {
|
|
|
212
212
|
taskFile: initial?.taskFile ?? "",
|
|
213
213
|
notify: initial?.notify ?? "auto",
|
|
214
214
|
channelId: initial?.channelId ?? "",
|
|
215
|
-
|
|
215
|
+
metricSchema: initial?.metricSchema ? JSON.stringify(initial.metricSchema) : "",
|
|
216
216
|
ui: initial?.ui ?? "",
|
|
217
217
|
agent: initial?.agent ?? "claude-code",
|
|
218
218
|
workdir: e?.workdir ?? "",
|
|
@@ -288,10 +288,10 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial, channel
|
|
|
288
288
|
listChannels().then(setFetched).catch(() => {});
|
|
289
289
|
}, [channelsProp]);
|
|
290
290
|
(0, import_react.useImperativeHandle)(ref, () => ({ read() {
|
|
291
|
-
let
|
|
292
|
-
const ss = f.
|
|
291
|
+
let metricSchema;
|
|
292
|
+
const ss = f.metricSchema.trim();
|
|
293
293
|
if (ss) try {
|
|
294
|
-
|
|
294
|
+
metricSchema = JSON.parse(ss);
|
|
295
295
|
} catch {
|
|
296
296
|
setSchemaErr("Not valid JSON - expected an array like [{\"key\":\"mrr\",\"label\":\"MRR\",\"unit\":\"$\"}]");
|
|
297
297
|
return null;
|
|
@@ -307,7 +307,7 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial, channel
|
|
|
307
307
|
ui: f.ui.trim() || void 0,
|
|
308
308
|
agent: f.agent,
|
|
309
309
|
exec: buildFormExec(f),
|
|
310
|
-
|
|
310
|
+
metricSchema
|
|
311
311
|
};
|
|
312
312
|
} }));
|
|
313
313
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
@@ -489,9 +489,9 @@ var LoopForm = (0, import_react.forwardRef)(function LoopForm({ initial, channel
|
|
|
489
489
|
fallback: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EditorFallback, { minHeight: "90px" }),
|
|
490
490
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CodeField, {
|
|
491
491
|
lang: "json",
|
|
492
|
-
value: f.
|
|
492
|
+
value: f.metricSchema,
|
|
493
493
|
onChange: (v) => {
|
|
494
|
-
set("
|
|
494
|
+
set("metricSchema", v);
|
|
495
495
|
setSchemaErr(null);
|
|
496
496
|
},
|
|
497
497
|
minHeight: "90px",
|
|
@@ -538,7 +538,7 @@ var AGENT_LABEL = {
|
|
|
538
538
|
};
|
|
539
539
|
/** Composer starters - one per editable dimension, so a blank box never stalls
|
|
540
540
|
* the owner. Clicking seeds the instruction; the agent handles the rest. */
|
|
541
|
-
var
|
|
541
|
+
var STEER_SEEDS = [
|
|
542
542
|
{
|
|
543
543
|
label: "Change the schedule",
|
|
544
544
|
seed: "Change the schedule: "
|
|
@@ -552,11 +552,11 @@ var EDIT_SEEDS = [
|
|
|
552
552
|
seed: "Improve the dashboard: "
|
|
553
553
|
},
|
|
554
554
|
{
|
|
555
|
-
label: "Set
|
|
556
|
-
seed: "Give this loop a
|
|
555
|
+
label: "Set an objective",
|
|
556
|
+
seed: "Give this loop a standing objective to optimize toward: "
|
|
557
557
|
}
|
|
558
558
|
];
|
|
559
|
-
var LoopView = (0, import_react.lazy)(() => import("./LoopView-
|
|
559
|
+
var LoopView = (0, import_react.lazy)(() => import("./LoopView-cDyjmf1B.mjs").then((m) => ({ default: m.LoopView })));
|
|
560
560
|
/**
|
|
561
561
|
* Loop detail PAGE body (`/loops/$loopId`) — the redesign of the former modal.
|
|
562
562
|
* One scrolling page: a loop header (name / status / schedule / agent / machine +
|
|
@@ -570,7 +570,7 @@ var LoopView = (0, import_react.lazy)(() => import("./LoopView-Dom6Ad5G.mjs").th
|
|
|
570
570
|
* the owner describes the change while looking at the spec/dashboard it applies
|
|
571
571
|
* to. Dispatch swaps the composer for a live status card under the header
|
|
572
572
|
* (queued → applying → settled with report + files + a link to
|
|
573
|
-
* the
|
|
573
|
+
* the steer run); the page keeps polling, so the applied change surfaces around
|
|
574
574
|
* the card. Settings remains a full-page field-form takeover.
|
|
575
575
|
*/
|
|
576
576
|
function LoopDetailView({ id }) {
|
|
@@ -580,12 +580,12 @@ function LoopDetailView({ id }) {
|
|
|
580
580
|
const [err, setErr] = (0, import_react.useState)(null);
|
|
581
581
|
const [actionErr, setActionErr] = (0, import_react.useState)(null);
|
|
582
582
|
const [editing, setEditing] = (0, import_react.useState)(false);
|
|
583
|
-
const [
|
|
584
|
-
const [
|
|
583
|
+
const [steerVia, setSteerVia] = (0, import_react.useState)(false);
|
|
584
|
+
const [steerInstruction, setSteerInstruction] = (0, import_react.useState)("");
|
|
585
585
|
const [promptCopied, setPromptCopied] = (0, import_react.useState)(false);
|
|
586
|
-
const [
|
|
587
|
-
const [
|
|
588
|
-
const
|
|
586
|
+
const [steerDispatched, setSteerDispatched] = (0, import_react.useState)(false);
|
|
587
|
+
const [steerRunId, setSteerRunId] = (0, import_react.useState)(null);
|
|
588
|
+
const steerBoxRef = (0, import_react.useRef)(null);
|
|
589
589
|
const [machinesOpen, setMachinesOpen] = (0, import_react.useState)(false);
|
|
590
590
|
const [pending, setPending] = (0, import_react.useState)(null);
|
|
591
591
|
const [confirmingDelete, setConfirmingDelete] = (0, import_react.useState)(false);
|
|
@@ -607,11 +607,11 @@ function LoopDetailView({ id }) {
|
|
|
607
607
|
(0, import_react.useEffect)(() => {
|
|
608
608
|
setDetail(null);
|
|
609
609
|
setEditing(false);
|
|
610
|
-
|
|
611
|
-
|
|
610
|
+
setSteerVia(false);
|
|
611
|
+
setSteerInstruction("");
|
|
612
612
|
setPromptCopied(false);
|
|
613
|
-
|
|
614
|
-
|
|
613
|
+
setSteerDispatched(false);
|
|
614
|
+
setSteerRunId(null);
|
|
615
615
|
setConfirmingDelete(false);
|
|
616
616
|
setOlder([]);
|
|
617
617
|
load();
|
|
@@ -664,10 +664,7 @@ function LoopDetailView({ id }) {
|
|
|
664
664
|
setActionErr(null);
|
|
665
665
|
setPending("lifecycle");
|
|
666
666
|
try {
|
|
667
|
-
const r = action === "pause" ? await pauseJob({ data: id }) : action === "start" ? await startJob({ data: id }) : action === "stop" ? await stopJob({ data: id }) :
|
|
668
|
-
id,
|
|
669
|
-
patch: { enabled: true }
|
|
670
|
-
} }) : await deleteJob({ data: id });
|
|
667
|
+
const r = action === "pause" ? await pauseJob({ data: id }) : action === "start" ? await startJob({ data: id }) : action === "stop" ? await stopJob({ data: id }) : await deleteJob({ data: id });
|
|
671
668
|
if (r.error) return setActionErr(`${action[0].toUpperCase() + action.slice(1)} failed: ${r.error}`);
|
|
672
669
|
setConfirmingDelete(false);
|
|
673
670
|
if (r.deleted) {
|
|
@@ -677,7 +674,7 @@ function LoopDetailView({ id }) {
|
|
|
677
674
|
}
|
|
678
675
|
if (action === "delete") deletingRef.current = true;
|
|
679
676
|
await refreshAll();
|
|
680
|
-
setFlash({ label: action === "start" ? "Started" : action === "
|
|
677
|
+
setFlash({ label: action === "start" ? "Started" : action === "pause" ? "Paused" : action === "stop" ? "Stop requested" : "Deleting" });
|
|
681
678
|
} finally {
|
|
682
679
|
setPending(null);
|
|
683
680
|
}
|
|
@@ -700,21 +697,21 @@ function LoopDetailView({ id }) {
|
|
|
700
697
|
setPending(null);
|
|
701
698
|
}
|
|
702
699
|
}
|
|
703
|
-
async function
|
|
704
|
-
const instruction =
|
|
700
|
+
async function onRequestSteer() {
|
|
701
|
+
const instruction = steerInstruction.trim();
|
|
705
702
|
if (!instruction) return;
|
|
706
703
|
setActionErr(null);
|
|
707
|
-
setPending("
|
|
704
|
+
setPending("steer");
|
|
708
705
|
try {
|
|
709
|
-
const r = await
|
|
706
|
+
const r = await requestSteer({ data: {
|
|
710
707
|
id,
|
|
711
708
|
instruction
|
|
712
709
|
} });
|
|
713
|
-
if (r.error) return setActionErr(`Couldn't queue the
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
710
|
+
if (r.error) return setActionErr(`Couldn't queue the steer pass: ${r.error}`);
|
|
711
|
+
setSteerRunId(r.runId ?? null);
|
|
712
|
+
setSteerDispatched(true);
|
|
713
|
+
setSteerVia(false);
|
|
714
|
+
setSteerInstruction("");
|
|
718
715
|
await refreshAll();
|
|
719
716
|
} finally {
|
|
720
717
|
setPending(null);
|
|
@@ -746,25 +743,23 @@ function LoopDetailView({ id }) {
|
|
|
746
743
|
const online = detail.machine.online;
|
|
747
744
|
const asleep = detail.machine.presence === "asleep";
|
|
748
745
|
const offlineHint = !online ? asleep ? "Machine asleep - requests will stay queued until it wakes" : "Machine offline - requests will stay queued until it reconnects" : void 0;
|
|
749
|
-
const completed = isCompleted(s);
|
|
750
746
|
const lifecycle = deriveLoopLifecycle(s);
|
|
751
747
|
const lifecycleText = lifecycleDisplay(detail);
|
|
752
748
|
const protocolSupport = daemonStopSupport(detail.machine.daemonProtocol);
|
|
753
|
-
const closedActive = isClosed(s) && !completed;
|
|
754
749
|
const onMachine = detail.machine.name ? `“${detail.machine.name}”` : "the bound machine";
|
|
755
|
-
const
|
|
756
|
-
const
|
|
757
|
-
const
|
|
758
|
-
|
|
759
|
-
|
|
750
|
+
const steerRun = steerDispatched && steerRunId ? runs.find((r) => r.id === steerRunId) : void 0;
|
|
751
|
+
const steerSettled = !!steerRun && !steerRun.queued && !steerRun.running;
|
|
752
|
+
const dismissSteer = () => {
|
|
753
|
+
setSteerDispatched(false);
|
|
754
|
+
setSteerRunId(null);
|
|
760
755
|
};
|
|
761
|
-
const
|
|
762
|
-
const
|
|
756
|
+
const steerDir = loopDir(job.taskFile);
|
|
757
|
+
const copySteerPrompt = async () => {
|
|
763
758
|
try {
|
|
764
|
-
await navigator.clipboard.writeText(
|
|
759
|
+
await navigator.clipboard.writeText(buildSteerPrompt({
|
|
765
760
|
loopId: id,
|
|
766
761
|
loopName: s.name,
|
|
767
|
-
instruction:
|
|
762
|
+
instruction: steerInstruction
|
|
768
763
|
}));
|
|
769
764
|
setPromptCopied(true);
|
|
770
765
|
setTimeout(() => setPromptCopied(false), 4e3);
|
|
@@ -781,8 +776,8 @@ function LoopDetailView({ id }) {
|
|
|
781
776
|
})
|
|
782
777
|
});
|
|
783
778
|
const deleting = lifecycle === "deleting";
|
|
784
|
-
const paused = !s.enabled && !
|
|
785
|
-
const active = s.enabled && !
|
|
779
|
+
const paused = !s.enabled && !deleting;
|
|
780
|
+
const active = s.enabled && !deleting;
|
|
786
781
|
const actionDisabled = busy || deleting;
|
|
787
782
|
const canRunWork = active || paused;
|
|
788
783
|
const canStop = canRunWork && !!s.running && protocolSupport.supported;
|
|
@@ -797,21 +792,21 @@ function LoopDetailView({ id }) {
|
|
|
797
792
|
className: btnPrimary,
|
|
798
793
|
disabled: actionDisabled || !canRunWork,
|
|
799
794
|
onClick: () => void doRun(),
|
|
800
|
-
title: !canRunWork ? "Unavailable for a
|
|
795
|
+
title: !canRunWork ? "Unavailable for a deleting loop" : offlineHint ?? (job.exec ? "Spends credits" : void 0),
|
|
801
796
|
"aria-label": job.exec ? "Run once - spends credits" : "Run once",
|
|
802
797
|
children: pending === "run" ? "Queuing…" : "Run once"
|
|
803
798
|
}),
|
|
804
799
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
805
800
|
className: btn,
|
|
806
|
-
disabled: actionDisabled || !
|
|
807
|
-
title: "Dispatch or copy a prompt for an owner-requested
|
|
808
|
-
onClick: () =>
|
|
809
|
-
children: "
|
|
801
|
+
disabled: actionDisabled || !canRunWork,
|
|
802
|
+
title: "Dispatch or copy a prompt for an owner-requested steer",
|
|
803
|
+
onClick: () => setSteerVia(true),
|
|
804
|
+
children: "Steer"
|
|
810
805
|
}),
|
|
811
806
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
812
807
|
className: btn,
|
|
813
808
|
disabled: actionDisabled || !canRunWork,
|
|
814
|
-
title: !canRunWork ? "Unavailable for a
|
|
809
|
+
title: !canRunWork ? "Unavailable for a deleting loop" : offlineHint ?? "Spends credits",
|
|
815
810
|
onClick: () => void doEvolve(),
|
|
816
811
|
children: pending === "evolve" ? "Evolving…" : "Evolve once"
|
|
817
812
|
}),
|
|
@@ -840,12 +835,6 @@ function LoopDetailView({ id }) {
|
|
|
840
835
|
onClick: () => void doLifecycle("stop"),
|
|
841
836
|
children: "Stop"
|
|
842
837
|
}),
|
|
843
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
844
|
-
className: btn,
|
|
845
|
-
disabled: actionDisabled || !completed,
|
|
846
|
-
onClick: () => void doLifecycle("reopen"),
|
|
847
|
-
children: "Reopen"
|
|
848
|
-
}),
|
|
849
838
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
850
839
|
className: btnDanger,
|
|
851
840
|
disabled: actionDisabled,
|
|
@@ -870,12 +859,12 @@ function LoopDetailView({ id }) {
|
|
|
870
859
|
className: "mt-3 rounded-md border border-wire bg-raised px-4 py-3 text-meta text-secondary",
|
|
871
860
|
children: "Deleting… graceful stop is waiting for execution authority to end."
|
|
872
861
|
}),
|
|
873
|
-
|
|
862
|
+
steerVia && !deleting && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
874
863
|
className: "mt-4 border-t border-hairline pt-4",
|
|
875
864
|
onKeyDown: (e) => {
|
|
876
|
-
if (e.key === "Escape" && pending !== "
|
|
865
|
+
if (e.key === "Escape" && pending !== "steer") {
|
|
877
866
|
e.stopPropagation();
|
|
878
|
-
|
|
867
|
+
setSteerVia(false);
|
|
879
868
|
}
|
|
880
869
|
},
|
|
881
870
|
children: [
|
|
@@ -883,7 +872,7 @@ function LoopDetailView({ id }) {
|
|
|
883
872
|
className: "flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1",
|
|
884
873
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
885
874
|
className: "text-body font-medium text-display",
|
|
886
|
-
children: "
|
|
875
|
+
children: "Steer with your coding agent"
|
|
887
876
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
888
877
|
className: "text-meta text-secondary",
|
|
889
878
|
children: [
|
|
@@ -894,24 +883,24 @@ function LoopDetailView({ id }) {
|
|
|
894
883
|
})]
|
|
895
884
|
}),
|
|
896
885
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", {
|
|
897
|
-
ref:
|
|
886
|
+
ref: steerBoxRef,
|
|
898
887
|
autoFocus: true,
|
|
899
|
-
value:
|
|
900
|
-
onChange: (e) =>
|
|
888
|
+
value: steerInstruction,
|
|
889
|
+
onChange: (e) => setSteerInstruction(e.target.value),
|
|
901
890
|
onKeyDown: (e) => {
|
|
902
|
-
if ((e.metaKey || e.ctrlKey) && e.key === "Enter" &&
|
|
891
|
+
if ((e.metaKey || e.ctrlKey) && e.key === "Enter" && steerInstruction.trim() && pending !== "steer") onRequestSteer();
|
|
903
892
|
},
|
|
904
893
|
rows: 3,
|
|
905
894
|
placeholder: "e.g. run at 9am on weekdays instead, and also check coffee stock",
|
|
906
895
|
className: "mt-3 w-full resize-y rounded-control border border-wire bg-raised p-3 font-mono text-label leading-relaxed text-primary outline-none transition-shadow placeholder:text-disabled focus:border-transparent focus:shadow-focus"
|
|
907
896
|
}),
|
|
908
|
-
!
|
|
897
|
+
!steerInstruction.trim() && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
909
898
|
className: "mt-2 flex flex-wrap gap-1.5",
|
|
910
|
-
children:
|
|
899
|
+
children: STEER_SEEDS.map((sd) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
911
900
|
type: "button",
|
|
912
901
|
onClick: () => {
|
|
913
|
-
|
|
914
|
-
|
|
902
|
+
setSteerInstruction(sd.seed);
|
|
903
|
+
steerBoxRef.current?.focus();
|
|
915
904
|
},
|
|
916
905
|
className: "cursor-pointer rounded-full border border-wire bg-surface px-3 py-1 text-label font-medium text-secondary transition-colors hover:bg-raised hover:text-display",
|
|
917
906
|
children: sd.label
|
|
@@ -922,22 +911,22 @@ function LoopDetailView({ id }) {
|
|
|
922
911
|
children: [
|
|
923
912
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
924
913
|
className: btnCost,
|
|
925
|
-
disabled: pending === "
|
|
914
|
+
disabled: pending === "steer" || !steerInstruction.trim(),
|
|
926
915
|
title: offlineHint,
|
|
927
|
-
onClick: () => void
|
|
928
|
-
children: pending === "
|
|
916
|
+
onClick: () => void onRequestSteer(),
|
|
917
|
+
children: pending === "steer" ? "Dispatching…" : "Dispatch to your coding agent"
|
|
929
918
|
}),
|
|
930
919
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
931
920
|
type: "button",
|
|
932
921
|
className: btn,
|
|
933
|
-
disabled: pending === "
|
|
934
|
-
onClick: () => void
|
|
922
|
+
disabled: pending === "steer",
|
|
923
|
+
onClick: () => void copySteerPrompt(),
|
|
935
924
|
children: promptCopied ? "✓ Prompt copied" : "Copy prompt"
|
|
936
925
|
}),
|
|
937
926
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
938
927
|
className: btn,
|
|
939
|
-
disabled: pending === "
|
|
940
|
-
onClick: () =>
|
|
928
|
+
disabled: pending === "steer",
|
|
929
|
+
onClick: () => setSteerVia(false),
|
|
941
930
|
children: "Cancel"
|
|
942
931
|
}),
|
|
943
932
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
@@ -953,9 +942,9 @@ function LoopDetailView({ id }) {
|
|
|
953
942
|
children: [
|
|
954
943
|
"✓ Copied · run your coding agent",
|
|
955
944
|
" ",
|
|
956
|
-
|
|
945
|
+
steerDir ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: ["in ", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
|
|
957
946
|
className: "break-all font-mono text-primary",
|
|
958
|
-
children:
|
|
947
|
+
children: steerDir
|
|
959
948
|
})] }) : "in the loop’s local directory on this machine",
|
|
960
949
|
" ",
|
|
961
950
|
"and paste the prompt to adjust the loop yourself."
|
|
@@ -1052,7 +1041,7 @@ function LoopDetailView({ id }) {
|
|
|
1052
1041
|
}),
|
|
1053
1042
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1054
1043
|
className: "text-meta text-secondary",
|
|
1055
|
-
children: [asleep ? "- queued work starts automatically when it reconnects." : "- manual run, evolve, and
|
|
1044
|
+
children: [asleep ? "- queued work starts automatically when it reconnects." : "- manual run, evolve, and steer requests remain safely queued.", detail.machine.lastSeen ? ` Last seen ${rel(detail.machine.lastSeen)}.` : ""]
|
|
1056
1045
|
}),
|
|
1057
1046
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
1058
1047
|
type: "button",
|
|
@@ -1118,11 +1107,7 @@ function LoopDetailView({ id }) {
|
|
|
1118
1107
|
className: "text-[28px] font-semibold leading-tight tracking-[-0.015em] text-display",
|
|
1119
1108
|
children: s.name
|
|
1120
1109
|
}),
|
|
1121
|
-
|
|
1122
|
-
tone: "success",
|
|
1123
|
-
dot: "green",
|
|
1124
|
-
children: "Completed"
|
|
1125
|
-
}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pill, {
|
|
1110
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pill, {
|
|
1126
1111
|
tone: lifecycle === "stopping" ? "running" : void 0,
|
|
1127
1112
|
dot: lifecycle === "stopping" ? "pulse" : void 0,
|
|
1128
1113
|
children: lifecycleText
|
|
@@ -1131,10 +1116,10 @@ function LoopDetailView({ id }) {
|
|
|
1131
1116
|
tone: "outline",
|
|
1132
1117
|
children: "Queued"
|
|
1133
1118
|
}) : null,
|
|
1134
|
-
|
|
1119
|
+
s.goal && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pill, {
|
|
1135
1120
|
tone: "success",
|
|
1136
1121
|
title: s.goal ?? void 0,
|
|
1137
|
-
children: "
|
|
1122
|
+
children: "Objective"
|
|
1138
1123
|
}),
|
|
1139
1124
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pill, {
|
|
1140
1125
|
tone: "outline",
|
|
@@ -1174,7 +1159,7 @@ function LoopDetailView({ id }) {
|
|
|
1174
1159
|
}),
|
|
1175
1160
|
metaDot,
|
|
1176
1161
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: ["next ", fmt(s.nextRun)] }),
|
|
1177
|
-
s.nextRun && s.enabled &&
|
|
1162
|
+
s.nextRun && s.enabled && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1178
1163
|
className: "text-disabled",
|
|
1179
1164
|
children: [
|
|
1180
1165
|
"(",
|
|
@@ -1200,24 +1185,13 @@ function LoopDetailView({ id }) {
|
|
|
1200
1185
|
})
|
|
1201
1186
|
]
|
|
1202
1187
|
}),
|
|
1203
|
-
|
|
1188
|
+
s.goal && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
1204
1189
|
className: "mt-2 text-body leading-snug text-secondary",
|
|
1205
1190
|
children: ["Working toward: ", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1206
1191
|
className: "text-primary",
|
|
1207
1192
|
children: s.goal
|
|
1208
1193
|
})]
|
|
1209
1194
|
}),
|
|
1210
|
-
lifecycle === "completed" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
1211
|
-
className: "mt-2 text-body leading-snug text-success",
|
|
1212
|
-
children: [
|
|
1213
|
-
"Completed",
|
|
1214
|
-
s.completedAt ? ` · ${fmt(s.completedAt)}` : "",
|
|
1215
|
-
s.completionReason && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1216
|
-
className: "text-secondary",
|
|
1217
|
-
children: [" - ", s.completionReason]
|
|
1218
|
-
})
|
|
1219
|
-
]
|
|
1220
|
-
}),
|
|
1221
1195
|
latestIncidentRun?.reportIncident && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
1222
1196
|
className: "mt-2 text-body leading-snug text-secondary",
|
|
1223
1197
|
children: latestIncidentRun.phase === "error" ? "Last run failed · Terminal report rejected" : "Last run telemetry warning · Terminal report rejected"
|
|
@@ -1236,13 +1210,13 @@ function LoopDetailView({ id }) {
|
|
|
1236
1210
|
]
|
|
1237
1211
|
})]
|
|
1238
1212
|
}),
|
|
1239
|
-
|
|
1213
|
+
steerDispatched && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
1240
1214
|
className: "mt-6 rounded-card border border-hairline bg-surface px-6 py-5 shadow-card",
|
|
1241
1215
|
style: { animation: "fadeIn 0.2s ease-out" },
|
|
1242
1216
|
"aria-live": "polite",
|
|
1243
1217
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
1244
1218
|
className: "flex flex-wrap items-center gap-x-4 gap-y-2",
|
|
1245
|
-
children: [!
|
|
1219
|
+
children: [!steerRun || steerRun.queued ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1246
1220
|
className: "inline-flex items-center gap-2.5 text-body text-secondary",
|
|
1247
1221
|
children: [
|
|
1248
1222
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
@@ -1251,7 +1225,7 @@ function LoopDetailView({ id }) {
|
|
|
1251
1225
|
}),
|
|
1252
1226
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1253
1227
|
className: "font-medium text-primary",
|
|
1254
|
-
children: "
|
|
1228
|
+
children: "Steer queued"
|
|
1255
1229
|
}),
|
|
1256
1230
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
1257
1231
|
"waiting for ",
|
|
@@ -1259,7 +1233,7 @@ function LoopDetailView({ id }) {
|
|
|
1259
1233
|
" and higher-priority work…"
|
|
1260
1234
|
] })
|
|
1261
1235
|
]
|
|
1262
|
-
}) :
|
|
1236
|
+
}) : steerRun.running ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1263
1237
|
className: "inline-flex min-w-0 items-center gap-2.5 text-body text-secondary",
|
|
1264
1238
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1265
1239
|
"aria-hidden": true,
|
|
@@ -1267,7 +1241,7 @@ function LoopDetailView({ id }) {
|
|
|
1267
1241
|
style: runPulseStyle
|
|
1268
1242
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1269
1243
|
className: "shrink-0 font-medium text-primary",
|
|
1270
|
-
children: "Applying your
|
|
1244
|
+
children: "Applying your steer"
|
|
1271
1245
|
})]
|
|
1272
1246
|
}) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1273
1247
|
className: "inline-flex min-w-0 items-center gap-2 text-body",
|
|
@@ -1275,38 +1249,38 @@ function LoopDetailView({ id }) {
|
|
|
1275
1249
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1276
1250
|
"aria-hidden": true,
|
|
1277
1251
|
className: "size-2.5 shrink-0 rounded-[2px]",
|
|
1278
|
-
style: { background: dotColor(
|
|
1252
|
+
style: { background: dotColor(steerRun) }
|
|
1279
1253
|
}),
|
|
1280
1254
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1281
1255
|
className: "font-medium",
|
|
1282
|
-
style: { color: dotColor(
|
|
1283
|
-
children:
|
|
1256
|
+
style: { color: dotColor(steerRun) },
|
|
1257
|
+
children: steerRun.canceled ? "Steer canceled" : steerRun.phase === "error" ? "Steer failed" : "Steer applied"
|
|
1284
1258
|
}),
|
|
1285
|
-
|
|
1259
|
+
steerRun.error && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1286
1260
|
className: "truncate text-secondary",
|
|
1287
|
-
children: ["· ",
|
|
1261
|
+
children: ["· ", steerRun.error]
|
|
1288
1262
|
})
|
|
1289
1263
|
]
|
|
1290
1264
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
1291
1265
|
className: "ml-auto flex items-center gap-3.5",
|
|
1292
|
-
children: [
|
|
1266
|
+
children: [steerRun && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
|
|
1293
1267
|
to: "/loops/$loopId/runs/$runId",
|
|
1294
1268
|
params: {
|
|
1295
1269
|
loopId: id,
|
|
1296
|
-
runId:
|
|
1270
|
+
runId: steerRun.id
|
|
1297
1271
|
},
|
|
1298
1272
|
className: "text-label font-medium text-interactive underline underline-offset-2 transition-colors hover:text-display",
|
|
1299
1273
|
children: "View run →"
|
|
1300
1274
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
1301
1275
|
type: "button",
|
|
1302
|
-
onClick:
|
|
1276
|
+
onClick: dismissSteer,
|
|
1303
1277
|
className: "inline-flex cursor-pointer items-center gap-1.5 border-none bg-transparent p-0 text-meta font-medium text-secondary transition-colors hover:text-display",
|
|
1304
|
-
children:
|
|
1278
|
+
children: steerSettled ? "Done" : "Hide"
|
|
1305
1279
|
})]
|
|
1306
1280
|
})]
|
|
1307
|
-
}),
|
|
1281
|
+
}), steerSettled && steerRun.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
1308
1282
|
className: "mt-3.5",
|
|
1309
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pre, { children:
|
|
1283
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pre, { children: steerRun.message })
|
|
1310
1284
|
})]
|
|
1311
1285
|
}),
|
|
1312
1286
|
hasUi && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
@@ -1391,7 +1365,7 @@ function EditHead({ name, onBack }) {
|
|
|
1391
1365
|
}),
|
|
1392
1366
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
|
|
1393
1367
|
className: "mt-1.5 max-w-[640px] text-meta leading-snug text-secondary",
|
|
1394
|
-
children: "Loop configuration, notifications, and push channel, saved directly - no agent pass or credits. For changes in plain words, use
|
|
1368
|
+
children: "Loop configuration, notifications, and push channel, saved directly - no agent pass or credits. For changes in plain words, use Steer instead."
|
|
1395
1369
|
})
|
|
1396
1370
|
] });
|
|
1397
1371
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { o as __toESM } from "../_runtime.mjs";
|
|
2
2
|
import { g as require_jsx_runtime, h as require_react } from "../_libs/@base-ui/react+[...].mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { D as runPulseStyle, O as sectionHeadCls, _ as dur, a as StatusPill, b as humanBytes, c as btnDanger, n as Loading, o as btn, r as Pill, v as fmt, y as fnum } from "./ui-B6mE5-5v.mjs";
|
|
4
4
|
import { u as Link } from "../_libs/@tanstack/react-router+[...].mjs";
|
|
5
|
-
import { d as getJobDetail, f as getRunDiff, g as loadOlderRuns, w as stopRun } from "./loopApi-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { t as Route } from "./loops._loopId_.runs._runId-
|
|
10
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-
|
|
5
|
+
import { d as getJobDetail, f as getRunDiff, g as loadOlderRuns, w as stopRun } from "./loopApi-7MTSs6hy.mjs";
|
|
6
|
+
import { s as useSession } from "./LoopPlaybook-C86vJIjZ.mjs";
|
|
7
|
+
import { t as SignIn } from "./SignIn-BQQiD3Ss.mjs";
|
|
8
|
+
import { r as LoadErrorCard } from "./actionUi-BKF6xI3d.mjs";
|
|
9
|
+
import { t as Route } from "./loops._loopId_.runs._runId-lTigSOmT.mjs";
|
|
10
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-DkG-ZCD1.js
|
|
11
11
|
var import_react = /* @__PURE__ */ __toESM(require_react());
|
|
12
12
|
var import_jsx_runtime = require_jsx_runtime();
|
|
13
13
|
/**
|
|
@@ -623,13 +623,6 @@ function RunDetailView({ loopId, runId }) {
|
|
|
623
623
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
624
624
|
className: "space-y-3.5",
|
|
625
625
|
children: [
|
|
626
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, {
|
|
627
|
-
k: "State",
|
|
628
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusPill, {
|
|
629
|
-
run,
|
|
630
|
-
colorText: true
|
|
631
|
-
})
|
|
632
|
-
}),
|
|
633
626
|
run.status && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, {
|
|
634
627
|
k: "Status",
|
|
635
628
|
children: run.status
|
|
@@ -654,11 +647,11 @@ function RunDetailView({ loopId, runId }) {
|
|
|
654
647
|
]
|
|
655
648
|
})
|
|
656
649
|
}),
|
|
657
|
-
run.
|
|
658
|
-
k: "Run
|
|
650
|
+
run.metrics != null && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, {
|
|
651
|
+
k: "Run metrics",
|
|
659
652
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
|
|
660
653
|
className: "block break-all font-mono text-label text-secondary",
|
|
661
|
-
children: JSON.stringify(run.
|
|
654
|
+
children: JSON.stringify(run.metrics)
|
|
662
655
|
})
|
|
663
656
|
}),
|
|
664
657
|
run.error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { c as createFileRoute, s as lazyRouteComponent } from "../_libs/@tanstack/react-router+[...].mjs";
|
|
2
|
-
import { c as getAuthState } from "./loopApi-
|
|
3
|
-
import { a as authClient } from "./LoopPlaybook-
|
|
4
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-
|
|
5
|
-
var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-
|
|
2
|
+
import { c as getAuthState } from "./loopApi-7MTSs6hy.mjs";
|
|
3
|
+
import { a as authClient } from "./LoopPlaybook-C86vJIjZ.mjs";
|
|
4
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-lTigSOmT.js
|
|
5
|
+
var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-DkG-ZCD1.mjs");
|
|
6
6
|
/**
|
|
7
7
|
* Run detail PAGE — `/loops/$loopId/runs/$runId`. A standalone page (the trailing
|
|
8
8
|
* `_` on the `$loopId` segment opts it out of the loop page's component so the run
|