@kky42/pievo-server 2.0.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{LoopView-CCYqXrKq.js → LoopView-Pbp2YtUu.js} +1 -1
- package/.output/public/assets/{Modal-BhRzAXQg.js → Modal-B3xpEtcf.js} +1 -1
- package/.output/public/assets/{SignIn-CV3jqX_8.js → SignIn-9vsaKv_p.js} +1 -1
- package/.output/public/assets/{actionUi-BRtdWVvO.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-BATGA0jG.js → index-DT_reRxT.js} +4 -4
- package/.output/public/assets/{invite._token-Dp2HL9X5.js → invite._token-5zhVSA26.js} +1 -1
- package/.output/public/assets/{invite._token-CQgv8lTC.js → invite._token-C3t4JfAY.js} +1 -1
- package/.output/public/assets/{lifecycleUi-C3k2MlX8.js → lifecycleUi-CMFw5Nlj.js} +1 -1
- package/.output/public/assets/{loopApi-5s2-kCnu.js → loopApi-C_Dtw-nL.js} +1 -1
- package/.output/public/assets/loops._loopId-6JlPOCsY.js +4 -0
- package/.output/public/assets/{loops._loopId_.runs._runId-BNN-dLrW.js → loops._loopId_.runs._runId-wFUMHN9w.js} +2 -2
- package/.output/public/assets/{notifyFns-DuBElaqG.js → notifyFns-CF12Yboc.js} +1 -1
- package/.output/public/assets/{preload-helper-3xcHsDtt.js → preload-helper--VCqDT5m.js} +2 -2
- package/.output/public/assets/{routes-CmuCVIIS.js → routes-DsdcURfk.js} +1 -1
- package/.output/public/assets/{routes-YnrsFY5X.js → routes-WVPuW976.js} +1 -1
- package/.output/public/assets/{t._teamId-BlE4mCSj.js → t._teamId-BdVLnwih.js} +1 -1
- package/.output/public/assets/{t._teamId-Bi-C9s5j.js → t._teamId-C9uEyAh_.js} +1 -1
- package/.output/public/assets/ui-Gb1413-F.js +1 -0
- package/.output/server/_ssr/{DashboardView-2eNPqWcy.mjs → DashboardView-DJMpoucm.mjs} +8 -8
- package/.output/server/_ssr/{LoopPlaybook-CnQ8Qgyf.mjs → LoopPlaybook-WFNer22Y.mjs} +3 -3
- package/.output/server/_ssr/{LoopView-DM30OPCN.mjs → LoopView-Dsc6oik9.mjs} +7 -7
- package/.output/server/_ssr/{Modal-B7gBr5Pm.mjs → Modal-Bc_5TYGr.mjs} +2 -2
- package/.output/server/_ssr/{SignIn-CaAi4_mk.mjs → SignIn-2qr-vtR5.mjs} +3 -3
- package/.output/server/_ssr/{actionUi-Be7dmMxb.mjs → actionUi-BKF6xI3d.mjs} +2 -2
- package/.output/server/_ssr/{adapters-CHURWoZx.mjs → adapters-Bwuh6uek.mjs} +2 -2
- package/.output/server/_ssr/{artifactFiles-D6b_RP78.mjs → artifactFiles-Cp1IBHne.mjs} +3 -3
- package/.output/server/_ssr/{artifactView-CYV1r48i.mjs → artifactView-DX4P3Krh.mjs} +2 -2
- package/.output/server/_ssr/artifacts-9G_Ai7vO.mjs +2 -0
- package/.output/server/_ssr/{auth-B_OxPpFr.mjs → auth-uQ19WsD1.mjs} +9 -9
- package/.output/server/_ssr/{boot-BNoivm21.mjs → boot-DPoPmSLh.mjs} +1236 -314
- package/.output/server/_ssr/boot-Zz5AJgfy.mjs +2 -0
- package/.output/server/_ssr/{bun-sqlite-dialect-BW9W1_Ps-B3RHdVjo.mjs → bun-sqlite-dialect-BW9W1_Ps-CqcLCApi.mjs} +2 -2
- package/.output/server/_ssr/{d1-sqlite-dialect-BLC8LXE6-DpVe1foU.mjs → d1-sqlite-dialect-BLC8LXE6-AuWb61y8.mjs} +2 -2
- package/.output/server/_ssr/db-BMANvbZu.mjs +2 -0
- package/.output/server/_ssr/{dist-BTx1ljg7.mjs → dist-CtYTvPCD.mjs} +2 -2
- package/.output/server/_ssr/{factory-TSnFcS96.mjs → factory-BtqxMS8a.mjs} +2 -2
- package/.output/server/_ssr/{invite._token-CvqaKH2R.mjs → invite._token-BlbVjz-o.mjs} +2 -2
- package/.output/server/_ssr/{invite._token-CDpO3cfB.mjs → invite._token-DBttmaDb.mjs} +6 -6
- package/.output/server/_ssr/{invite._token-DWOPXXLS.mjs → invite._token-DtAfQyfP.mjs} +5 -5
- package/.output/server/_ssr/{kysely-adapter-BWjzeCGK.mjs → kysely-adapter-bSpTlW7Z.mjs} +1 -1
- package/.output/server/_ssr/{lifecycleUi-5jMhxINb.mjs → lifecycleUi-Djb44Aj3.mjs} +4 -4
- package/.output/server/_ssr/logger-CR1a0flR.mjs +2 -0
- package/.output/server/_ssr/{loopApi-BfMnXaKT.mjs → loopApi-7MTSs6hy.mjs} +5 -5
- package/.output/server/_ssr/{loopApi-Cpm8YV3U.mjs → loopApi-BXRBFGWh.mjs} +23 -23
- package/.output/server/_ssr/{loops._loopId-C-y4Pux_.mjs → loops._loopId-6Q0DMXU0.mjs} +4 -4
- package/.output/server/_ssr/{loops._loopId-DfrHw2mZ.mjs → loops._loopId-C0x0SE8F.mjs} +85 -85
- package/.output/server/_ssr/{loops._loopId_.runs._runId-BXyyqXwX.mjs → loops._loopId_.runs._runId-BOJBJu_a.mjs} +4 -4
- package/.output/server/_ssr/{loops._loopId_.runs._runId-C9d0EC2Q.mjs → loops._loopId_.runs._runId-CkM0-ckn.mjs} +9 -9
- package/.output/server/_ssr/{machineFns-CRbwYxD3.mjs → machineFns-CQuvvdXx.mjs} +3 -3
- package/.output/server/_ssr/{node-sqlite-dialect-B10G6C4W.mjs → node-sqlite-dialect-ZOyD6D7F.mjs} +2 -2
- package/.output/server/_ssr/{notifyFns-DvH4C-GH.mjs → notifyFns-BOeYZDRp.mjs} +3 -3
- package/.output/server/_ssr/{notifyFns-CtmSVNmE.mjs → notifyFns-UFZ2j7Fv.mjs} +7 -7
- package/.output/server/_ssr/{router-B4ipreZ4.mjs → router-jnPelPNh.mjs} +32 -32
- package/.output/server/_ssr/{routes-DKox93l0.mjs → routes-Bx0bRxt9.mjs} +2 -2
- package/.output/server/_ssr/{routes-iHT61OkI.mjs → routes-CMAUcUsZ.mjs} +5 -5
- package/.output/server/_ssr/{routes-l7tUe3lr.mjs → routes-CXnbFjB_.mjs} +6 -6
- package/.output/server/_ssr/runDiff-CDPvl_cY.mjs +2 -0
- package/.output/server/_ssr/ssr.mjs +51 -51
- package/.output/server/_ssr/store-DDOk2Ty_.mjs +2 -0
- package/.output/server/_ssr/{t._teamId-jO8dUmSQ.mjs → t._teamId-36z-mmyw.mjs} +5 -5
- package/.output/server/_ssr/{t._teamId-BPK2mrN3.mjs → t._teamId-Bsm4WrJl.mjs} +6 -6
- package/.output/server/_ssr/{t._teamId-B3g0Cs8B.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-6zjFV7lM.mjs → teamFns-DAx4a1z4.mjs} +3 -3
- package/.output/server/_ssr/tokens-7KEKpLnu.mjs +2 -0
- package/.output/server/_ssr/{ui-CI-OeTr7.mjs → ui-B6mE5-5v.mjs} +6 -6
- package/.output/server/{_tanstack-start-manifest_v-CxHUYCv8.mjs → _tanstack-start-manifest_v-5iQOchGB.mjs} +28 -28
- package/.output/server/drizzle/0015_run_history_foundation.sql +43 -0
- package/.output/server/drizzle/0016_plural_machine_runs.sql +4 -0
- package/.output/server/drizzle/meta/_journal.json +14 -0
- package/.output/server/index.mjs +118 -118
- package/drizzle/0015_run_history_foundation.sql +43 -0
- package/drizzle/0016_plural_machine_runs.sql +4 -0
- package/drizzle/meta/_journal.json +14 -0
- package/package.json +1 -1
- package/.output/public/assets/app-B03JVnFn.css +0 -2
- package/.output/public/assets/loops._loopId-C9vRjZ8W.js +0 -4
- package/.output/public/assets/ui-By58RJgB.js +0 -1
- package/.output/server/_ssr/artifacts-CXMpBzMY.mjs +0 -2
- package/.output/server/_ssr/boot-C9VAWt9Z.mjs +0 -2
- package/.output/server/_ssr/db-C11vQNxP.mjs +0 -2
- package/.output/server/_ssr/logger-DE_PU5bE.mjs +0 -2
- package/.output/server/_ssr/runDiff-Bohd5W5R.mjs +0 -113
- package/.output/server/_ssr/store-Ck7kCAGf.mjs +0 -2
- package/.output/server/_ssr/tokens-oJm6yFyt.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, mt as isTaskEntry } from "./boot-
|
|
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-
|
|
3
|
+
import { c as CODING_AGENTS, g as buildFileEntries, mt as isTaskEntry } from "./boot-DPoPmSLh.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 {
|
|
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 { i as useFlash, n as FlashLine, r as LoadErrorCard, t as ConfirmBar } from "./actionUi-BKF6xI3d.mjs";
|
|
9
|
+
import { s as useSession } from "./LoopPlaybook-WFNer22Y.mjs";
|
|
9
10
|
import { t as setActiveTeamCookie } from "./teamCookie-B7hLOIie.mjs";
|
|
10
|
-
import { t as SignIn } from "./SignIn-
|
|
11
|
-
import { i as
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-DfrHw2mZ.js
|
|
11
|
+
import { t as SignIn } from "./SignIn-2qr-vtR5.mjs";
|
|
12
|
+
import { i as lifecycleDisplay, n as daemonStopSupport, r as deriveLoopLifecycle, t as DAEMON_UPGRADE_REQUIRED } from "./lifecycleUi-Djb44Aj3.mjs";
|
|
13
|
+
import { a as listChannels, n as Timeline, s as mergeRuns, t as MachinesModal } from "./notifyFns-UFZ2j7Fv.mjs";
|
|
14
|
+
import { t as Route } from "./loops._loopId-6Q0DMXU0.mjs";
|
|
15
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId-C0x0SE8F.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}).`,
|
|
@@ -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: "
|
|
@@ -556,7 +556,7 @@ var EDIT_SEEDS = [
|
|
|
556
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-Dsc6oik9.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-DM30OPCN.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();
|
|
@@ -697,21 +697,21 @@ function LoopDetailView({ id }) {
|
|
|
697
697
|
setPending(null);
|
|
698
698
|
}
|
|
699
699
|
}
|
|
700
|
-
async function
|
|
701
|
-
const instruction =
|
|
700
|
+
async function onRequestSteer() {
|
|
701
|
+
const instruction = steerInstruction.trim();
|
|
702
702
|
if (!instruction) return;
|
|
703
703
|
setActionErr(null);
|
|
704
|
-
setPending("
|
|
704
|
+
setPending("steer");
|
|
705
705
|
try {
|
|
706
|
-
const r = await
|
|
706
|
+
const r = await requestSteer({ data: {
|
|
707
707
|
id,
|
|
708
708
|
instruction
|
|
709
709
|
} });
|
|
710
|
-
if (r.error) return setActionErr(`Couldn't queue the
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
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("");
|
|
715
715
|
await refreshAll();
|
|
716
716
|
} finally {
|
|
717
717
|
setPending(null);
|
|
@@ -747,19 +747,19 @@ function LoopDetailView({ id }) {
|
|
|
747
747
|
const lifecycleText = lifecycleDisplay(detail);
|
|
748
748
|
const protocolSupport = daemonStopSupport(detail.machine.daemonProtocol);
|
|
749
749
|
const onMachine = detail.machine.name ? `“${detail.machine.name}”` : "the bound machine";
|
|
750
|
-
const
|
|
751
|
-
const
|
|
752
|
-
const
|
|
753
|
-
|
|
754
|
-
|
|
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);
|
|
755
755
|
};
|
|
756
|
-
const
|
|
757
|
-
const
|
|
756
|
+
const steerDir = loopDir(job.taskFile);
|
|
757
|
+
const copySteerPrompt = async () => {
|
|
758
758
|
try {
|
|
759
|
-
await navigator.clipboard.writeText(
|
|
759
|
+
await navigator.clipboard.writeText(buildSteerPrompt({
|
|
760
760
|
loopId: id,
|
|
761
761
|
loopName: s.name,
|
|
762
|
-
instruction:
|
|
762
|
+
instruction: steerInstruction
|
|
763
763
|
}));
|
|
764
764
|
setPromptCopied(true);
|
|
765
765
|
setTimeout(() => setPromptCopied(false), 4e3);
|
|
@@ -799,9 +799,9 @@ function LoopDetailView({ id }) {
|
|
|
799
799
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
800
800
|
className: btn,
|
|
801
801
|
disabled: actionDisabled || !canRunWork,
|
|
802
|
-
title: "Dispatch or copy a prompt for an owner-requested
|
|
803
|
-
onClick: () =>
|
|
804
|
-
children: "
|
|
802
|
+
title: "Dispatch or copy a prompt for an owner-requested steer",
|
|
803
|
+
onClick: () => setSteerVia(true),
|
|
804
|
+
children: "Steer"
|
|
805
805
|
}),
|
|
806
806
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
807
807
|
className: btn,
|
|
@@ -859,12 +859,12 @@ function LoopDetailView({ id }) {
|
|
|
859
859
|
className: "mt-3 rounded-md border border-wire bg-raised px-4 py-3 text-meta text-secondary",
|
|
860
860
|
children: "Deleting… graceful stop is waiting for execution authority to end."
|
|
861
861
|
}),
|
|
862
|
-
|
|
862
|
+
steerVia && !deleting && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
863
863
|
className: "mt-4 border-t border-hairline pt-4",
|
|
864
864
|
onKeyDown: (e) => {
|
|
865
|
-
if (e.key === "Escape" && pending !== "
|
|
865
|
+
if (e.key === "Escape" && pending !== "steer") {
|
|
866
866
|
e.stopPropagation();
|
|
867
|
-
|
|
867
|
+
setSteerVia(false);
|
|
868
868
|
}
|
|
869
869
|
},
|
|
870
870
|
children: [
|
|
@@ -872,7 +872,7 @@ function LoopDetailView({ id }) {
|
|
|
872
872
|
className: "flex flex-wrap items-baseline justify-between gap-x-4 gap-y-1",
|
|
873
873
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
874
874
|
className: "text-body font-medium text-display",
|
|
875
|
-
children: "
|
|
875
|
+
children: "Steer with your coding agent"
|
|
876
876
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
877
877
|
className: "text-meta text-secondary",
|
|
878
878
|
children: [
|
|
@@ -883,24 +883,24 @@ function LoopDetailView({ id }) {
|
|
|
883
883
|
})]
|
|
884
884
|
}),
|
|
885
885
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", {
|
|
886
|
-
ref:
|
|
886
|
+
ref: steerBoxRef,
|
|
887
887
|
autoFocus: true,
|
|
888
|
-
value:
|
|
889
|
-
onChange: (e) =>
|
|
888
|
+
value: steerInstruction,
|
|
889
|
+
onChange: (e) => setSteerInstruction(e.target.value),
|
|
890
890
|
onKeyDown: (e) => {
|
|
891
|
-
if ((e.metaKey || e.ctrlKey) && e.key === "Enter" &&
|
|
891
|
+
if ((e.metaKey || e.ctrlKey) && e.key === "Enter" && steerInstruction.trim() && pending !== "steer") onRequestSteer();
|
|
892
892
|
},
|
|
893
893
|
rows: 3,
|
|
894
894
|
placeholder: "e.g. run at 9am on weekdays instead, and also check coffee stock",
|
|
895
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"
|
|
896
896
|
}),
|
|
897
|
-
!
|
|
897
|
+
!steerInstruction.trim() && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
898
898
|
className: "mt-2 flex flex-wrap gap-1.5",
|
|
899
|
-
children:
|
|
899
|
+
children: STEER_SEEDS.map((sd) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
900
900
|
type: "button",
|
|
901
901
|
onClick: () => {
|
|
902
|
-
|
|
903
|
-
|
|
902
|
+
setSteerInstruction(sd.seed);
|
|
903
|
+
steerBoxRef.current?.focus();
|
|
904
904
|
},
|
|
905
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",
|
|
906
906
|
children: sd.label
|
|
@@ -911,22 +911,22 @@ function LoopDetailView({ id }) {
|
|
|
911
911
|
children: [
|
|
912
912
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
913
913
|
className: btnCost,
|
|
914
|
-
disabled: pending === "
|
|
914
|
+
disabled: pending === "steer" || !steerInstruction.trim(),
|
|
915
915
|
title: offlineHint,
|
|
916
|
-
onClick: () => void
|
|
917
|
-
children: pending === "
|
|
916
|
+
onClick: () => void onRequestSteer(),
|
|
917
|
+
children: pending === "steer" ? "Dispatching…" : "Dispatch to your coding agent"
|
|
918
918
|
}),
|
|
919
919
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
920
920
|
type: "button",
|
|
921
921
|
className: btn,
|
|
922
|
-
disabled: pending === "
|
|
923
|
-
onClick: () => void
|
|
922
|
+
disabled: pending === "steer",
|
|
923
|
+
onClick: () => void copySteerPrompt(),
|
|
924
924
|
children: promptCopied ? "✓ Prompt copied" : "Copy prompt"
|
|
925
925
|
}),
|
|
926
926
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
927
927
|
className: btn,
|
|
928
|
-
disabled: pending === "
|
|
929
|
-
onClick: () =>
|
|
928
|
+
disabled: pending === "steer",
|
|
929
|
+
onClick: () => setSteerVia(false),
|
|
930
930
|
children: "Cancel"
|
|
931
931
|
}),
|
|
932
932
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
@@ -942,9 +942,9 @@ function LoopDetailView({ id }) {
|
|
|
942
942
|
children: [
|
|
943
943
|
"✓ Copied · run your coding agent",
|
|
944
944
|
" ",
|
|
945
|
-
|
|
945
|
+
steerDir ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: ["in ", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
|
|
946
946
|
className: "break-all font-mono text-primary",
|
|
947
|
-
children:
|
|
947
|
+
children: steerDir
|
|
948
948
|
})] }) : "in the loop’s local directory on this machine",
|
|
949
949
|
" ",
|
|
950
950
|
"and paste the prompt to adjust the loop yourself."
|
|
@@ -1041,7 +1041,7 @@ function LoopDetailView({ id }) {
|
|
|
1041
1041
|
}),
|
|
1042
1042
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1043
1043
|
className: "text-meta text-secondary",
|
|
1044
|
-
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)}.` : ""]
|
|
1045
1045
|
}),
|
|
1046
1046
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
1047
1047
|
type: "button",
|
|
@@ -1210,13 +1210,13 @@ function LoopDetailView({ id }) {
|
|
|
1210
1210
|
]
|
|
1211
1211
|
})]
|
|
1212
1212
|
}),
|
|
1213
|
-
|
|
1213
|
+
steerDispatched && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
1214
1214
|
className: "mt-6 rounded-card border border-hairline bg-surface px-6 py-5 shadow-card",
|
|
1215
1215
|
style: { animation: "fadeIn 0.2s ease-out" },
|
|
1216
1216
|
"aria-live": "polite",
|
|
1217
1217
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
1218
1218
|
className: "flex flex-wrap items-center gap-x-4 gap-y-2",
|
|
1219
|
-
children: [!
|
|
1219
|
+
children: [!steerRun || steerRun.queued ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1220
1220
|
className: "inline-flex items-center gap-2.5 text-body text-secondary",
|
|
1221
1221
|
children: [
|
|
1222
1222
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
@@ -1225,7 +1225,7 @@ function LoopDetailView({ id }) {
|
|
|
1225
1225
|
}),
|
|
1226
1226
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1227
1227
|
className: "font-medium text-primary",
|
|
1228
|
-
children: "
|
|
1228
|
+
children: "Steer queued"
|
|
1229
1229
|
}),
|
|
1230
1230
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
1231
1231
|
"waiting for ",
|
|
@@ -1233,7 +1233,7 @@ function LoopDetailView({ id }) {
|
|
|
1233
1233
|
" and higher-priority work…"
|
|
1234
1234
|
] })
|
|
1235
1235
|
]
|
|
1236
|
-
}) :
|
|
1236
|
+
}) : steerRun.running ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1237
1237
|
className: "inline-flex min-w-0 items-center gap-2.5 text-body text-secondary",
|
|
1238
1238
|
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1239
1239
|
"aria-hidden": true,
|
|
@@ -1241,7 +1241,7 @@ function LoopDetailView({ id }) {
|
|
|
1241
1241
|
style: runPulseStyle
|
|
1242
1242
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1243
1243
|
className: "shrink-0 font-medium text-primary",
|
|
1244
|
-
children: "Applying your
|
|
1244
|
+
children: "Applying your steer"
|
|
1245
1245
|
})]
|
|
1246
1246
|
}) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1247
1247
|
className: "inline-flex min-w-0 items-center gap-2 text-body",
|
|
@@ -1249,38 +1249,38 @@ function LoopDetailView({ id }) {
|
|
|
1249
1249
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1250
1250
|
"aria-hidden": true,
|
|
1251
1251
|
className: "size-2.5 shrink-0 rounded-[2px]",
|
|
1252
|
-
style: { background: dotColor(
|
|
1252
|
+
style: { background: dotColor(steerRun) }
|
|
1253
1253
|
}),
|
|
1254
1254
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
1255
1255
|
className: "font-medium",
|
|
1256
|
-
style: { color: dotColor(
|
|
1257
|
-
children:
|
|
1256
|
+
style: { color: dotColor(steerRun) },
|
|
1257
|
+
children: steerRun.canceled ? "Steer canceled" : steerRun.phase === "error" ? "Steer failed" : "Steer applied"
|
|
1258
1258
|
}),
|
|
1259
|
-
|
|
1259
|
+
steerRun.error && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
1260
1260
|
className: "truncate text-secondary",
|
|
1261
|
-
children: ["· ",
|
|
1261
|
+
children: ["· ", steerRun.error]
|
|
1262
1262
|
})
|
|
1263
1263
|
]
|
|
1264
1264
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
1265
1265
|
className: "ml-auto flex items-center gap-3.5",
|
|
1266
|
-
children: [
|
|
1266
|
+
children: [steerRun && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
|
|
1267
1267
|
to: "/loops/$loopId/runs/$runId",
|
|
1268
1268
|
params: {
|
|
1269
1269
|
loopId: id,
|
|
1270
|
-
runId:
|
|
1270
|
+
runId: steerRun.id
|
|
1271
1271
|
},
|
|
1272
1272
|
className: "text-label font-medium text-interactive underline underline-offset-2 transition-colors hover:text-display",
|
|
1273
1273
|
children: "View run →"
|
|
1274
1274
|
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
1275
1275
|
type: "button",
|
|
1276
|
-
onClick:
|
|
1276
|
+
onClick: dismissSteer,
|
|
1277
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",
|
|
1278
|
-
children:
|
|
1278
|
+
children: steerSettled ? "Done" : "Hide"
|
|
1279
1279
|
})]
|
|
1280
1280
|
})]
|
|
1281
|
-
}),
|
|
1281
|
+
}), steerSettled && steerRun.message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
1282
1282
|
className: "mt-3.5",
|
|
1283
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pre, { children:
|
|
1283
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Pre, { children: steerRun.message })
|
|
1284
1284
|
})]
|
|
1285
1285
|
}),
|
|
1286
1286
|
hasUi && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
@@ -1365,7 +1365,7 @@ function EditHead({ name, onBack }) {
|
|
|
1365
1365
|
}),
|
|
1366
1366
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
|
|
1367
1367
|
className: "mt-1.5 max-w-[640px] text-meta leading-snug text-secondary",
|
|
1368
|
-
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."
|
|
1369
1369
|
})
|
|
1370
1370
|
] });
|
|
1371
1371
|
}
|
|
@@ -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-WFNer22Y.mjs";
|
|
4
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-BOJBJu_a.js
|
|
5
|
+
var $$splitComponentImporter = () => import("./loops._loopId_.runs._runId-CkM0-ckn.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
|
|
@@ -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 { 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-
|
|
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 { r as LoadErrorCard } from "./actionUi-BKF6xI3d.mjs";
|
|
7
|
+
import { s as useSession } from "./LoopPlaybook-WFNer22Y.mjs";
|
|
8
|
+
import { t as SignIn } from "./SignIn-2qr-vtR5.mjs";
|
|
9
|
+
import { t as Route } from "./loops._loopId_.runs._runId-BOJBJu_a.mjs";
|
|
10
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/loops._loopId_.runs._runId-CkM0-ckn.js
|
|
11
11
|
var import_react = /* @__PURE__ */ __toESM(require_react());
|
|
12
12
|
var import_jsx_runtime = require_jsx_runtime();
|
|
13
13
|
/**
|
|
@@ -504,8 +504,8 @@ function RunDetailView({ loopId, runId }) {
|
|
|
504
504
|
type: "button",
|
|
505
505
|
onClick: onStop,
|
|
506
506
|
className: btnDanger,
|
|
507
|
-
disabled: !!run.running && detail.machine.daemonProtocol !==
|
|
508
|
-
title: run.running && detail.machine.daemonProtocol !==
|
|
507
|
+
disabled: !!run.running && detail.machine.daemonProtocol !== 3,
|
|
508
|
+
title: run.running && detail.machine.daemonProtocol !== 3 ? "Daemon upgrade required to stop a running process. Run `npm install -g @kky42/pievo@latest`, then `pievo daemon restart`." : void 0,
|
|
509
509
|
children: "Stop run"
|
|
510
510
|
})]
|
|
511
511
|
})]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { $ as getMachine, A as daemonNeedsUpdate, Bt as rememberConnectKey, Ct as listMachinesForTeam, F as deleteMachine$1, Jt as sha256, L as ensureServer, Mt as machineIdFromToken, O as createMachine$1, Pt as mintDeviceToken, St as listMachines$1, d as MIN_DAEMON_VERSION, jt as loopsForMachine, tn as updateMachine } from "./boot-DPoPmSLh.mjs";
|
|
2
2
|
import { n as createServerFn } from "./ssr.mjs";
|
|
3
|
-
import { requestScope } from "./auth-
|
|
3
|
+
import { requestScope } from "./auth-uQ19WsD1.mjs";
|
|
4
4
|
import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
|
|
5
5
|
//#region node_modules/.nitro/vite/services/ssr/assets/machineScope-2h-fcKmG.js
|
|
6
6
|
/**
|
|
@@ -28,7 +28,7 @@ function tokenVisibleTo(m, scope) {
|
|
|
28
28
|
return !scope.enforce || m.userId === scope.userId;
|
|
29
29
|
}
|
|
30
30
|
//#endregion
|
|
31
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/machineFns-
|
|
31
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/machineFns-CQuvvdXx.js
|
|
32
32
|
/**
|
|
33
33
|
* Latest published @kky42/pievo version — a cached, fail-silent lookup of the
|
|
34
34
|
* npm dist-tag `latest`, so the web can tell a user their daemon is outdated and
|
package/.output/server/_ssr/{node-sqlite-dialect-B10G6C4W.mjs → node-sqlite-dialect-ZOyD6D7F.mjs}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-
|
|
1
|
+
import { n as DefaultQueryCompiler, o as CompiledQuery, s as sql$1 } from "./auth-uQ19WsD1.mjs";
|
|
2
2
|
import { n as DEFAULT_MIGRATION_TABLE, t as DEFAULT_MIGRATION_LOCK_TABLE } from "./kysely-migration-tables-JkVUjPF_-bPAX9LR_.mjs";
|
|
3
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/node-sqlite-dialect-
|
|
3
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/node-sqlite-dialect-ZOyD6D7F.js
|
|
4
4
|
var NodeSqliteAdapter = class {
|
|
5
5
|
get supportsCreateIfNotExists() {
|
|
6
6
|
return true;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { K as getChannel, L as ensureServer, N as deleteChannel$1, bt as listChannels$1, s as CHANNELS, w as createChannel$1 } from "./boot-DPoPmSLh.mjs";
|
|
2
2
|
import { n as createServerFn } from "./ssr.mjs";
|
|
3
|
-
import { requestScope } from "./auth-
|
|
3
|
+
import { requestScope } from "./auth-uQ19WsD1.mjs";
|
|
4
4
|
import { t as createServerRpc } from "./createServerRpc-BD8Xn_0_.mjs";
|
|
5
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-
|
|
5
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-BOeYZDRp.js
|
|
6
6
|
/**
|
|
7
7
|
* Notification-channel server functions. Channels are per-team push targets a
|
|
8
8
|
* loop can route its run messages to. Secrets (bot token / chat id) live in the
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { o as __toESM } from "../_runtime.mjs";
|
|
2
2
|
import { a as TooltipTrigger, g as require_jsx_runtime, h as require_react, i as TooltipPortal, n as TooltipPopup, o as TooltipRoot, r as TooltipPositioner } from "../_libs/@base-ui/react+[...].mjs";
|
|
3
|
-
import { Nt as machinePresence, lt as isOutdated } from "./boot-
|
|
4
|
-
import { E as runPulseAnim, M as useHydrated, S as labelCls, T as rel, _ as dur, c as btnDanger, g as dotOpacity, h as dotLabel, j as until, l as btnPrimary, m as dotColor, o as btn, t as ErrorBanner, v as fmt, x as inputCls } from "./ui-
|
|
3
|
+
import { Nt as machinePresence, lt as isOutdated } from "./boot-DPoPmSLh.mjs";
|
|
4
|
+
import { E as runPulseAnim, M as useHydrated, S as labelCls, T as rel, _ as dur, c as btnDanger, g as dotOpacity, h as dotLabel, j as until, l as btnPrimary, m as dotColor, o as btn, t as ErrorBanner, v as fmt, x as inputCls } from "./ui-B6mE5-5v.mjs";
|
|
5
5
|
import { n as createServerFn } from "./ssr.mjs";
|
|
6
|
-
import { l as getConfig, r as createSsrRpc } from "./loopApi-
|
|
7
|
-
import { n as ModalHead, r as ModalSection, t as Modal } from "./Modal-
|
|
8
|
-
import { n as daemonStopSupport } from "./lifecycleUi-
|
|
9
|
-
//#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-
|
|
6
|
+
import { l as getConfig, r as createSsrRpc } from "./loopApi-7MTSs6hy.mjs";
|
|
7
|
+
import { n as ModalHead, r as ModalSection, t as Modal } from "./Modal-Bc_5TYGr.mjs";
|
|
8
|
+
import { n as daemonStopSupport } from "./lifecycleUi-Djb44Aj3.mjs";
|
|
9
|
+
//#region node_modules/.nitro/vite/services/ssr/assets/notifyFns-UFZ2j7Fv.js
|
|
10
10
|
var import_react = /* @__PURE__ */ __toESM(require_react());
|
|
11
11
|
var import_jsx_runtime = require_jsx_runtime();
|
|
12
12
|
/**
|
|
@@ -457,7 +457,7 @@ function MachinesModal({ open, onClose, teamId }) {
|
|
|
457
457
|
className: "text-label text-secondary",
|
|
458
458
|
children: daemonStopSupport(m.daemonProtocol).label
|
|
459
459
|
}),
|
|
460
|
-
m.daemonProtocol
|
|
460
|
+
!daemonStopSupport(m.daemonProtocol).supported && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
461
461
|
className: "text-label text-accent",
|
|
462
462
|
children: "Daemon upgrade required to stop a running process"
|
|
463
463
|
}),
|