@rk0429/agentic-relay 19.1.0 → 19.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/dist/interfaces/cli/components/Header.d.ts +6 -0
- package/dist/interfaces/cli/components/Header.js +8 -0
- package/dist/interfaces/cli/components/Header.js.map +1 -0
- package/dist/interfaces/cli/components/InputBar.d.ts +6 -0
- package/dist/interfaces/cli/components/InputBar.js +28 -0
- package/dist/interfaces/cli/components/InputBar.js.map +1 -0
- package/dist/interfaces/cli/components/MessageList.d.ts +6 -0
- package/dist/interfaces/cli/components/MessageList.js +27 -0
- package/dist/interfaces/cli/components/MessageList.js.map +1 -0
- package/dist/interfaces/cli/components/StatusBar.d.ts +6 -0
- package/dist/interfaces/cli/components/StatusBar.js +7 -0
- package/dist/interfaces/cli/components/StatusBar.js.map +1 -0
- package/dist/interfaces/cli/relay-shell.js +95 -98
- package/dist/interfaces/cli/relay-shell.js.map +1 -1
- package/dist/interfaces/cli/text-input-utils.d.ts +40 -0
- package/dist/interfaces/cli/text-input-utils.js +90 -0
- package/dist/interfaces/cli/text-input-utils.js.map +1 -0
- package/dist/interfaces/cli/theme.d.ts +40 -0
- package/dist/interfaces/cli/theme.js +55 -0
- package/dist/interfaces/cli/theme.js.map +1 -0
- package/dist/interfaces/cli/visualization-renderer.js +11 -39
- package/dist/interfaces/cli/visualization-renderer.js.map +1 -1
- package/dist/interfaces/mcp/relay-mcp-server.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { theme } from "../theme.js";
|
|
4
|
+
export function Header({ session }) {
|
|
5
|
+
const currentSessionId = session.sessions[session.currentBackend]?.relaySessionId;
|
|
6
|
+
return (_jsxs(Box, { borderStyle: "round", borderColor: theme.chrome.border, paddingX: 1, flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { bold: true, color: theme.chrome.title, children: "agentic-relay" }), _jsx(Text, { color: theme.chrome.dim, children: " \u00B7 " }), _jsx(Text, { bold: true, children: session.currentBackend }), _jsxs(Text, { color: theme.chrome.dim, children: [" \u00B7 ", session.availableBackends.join(" | ")] })] }), currentSessionId ? (_jsxs(Text, { dimColor: true, children: ["session: ", currentSessionId] })) : null] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../../src/interfaces/cli/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAMpC,MAAM,UAAU,MAAM,CAAC,EAAE,OAAO,EAAe;IAC7C,MAAM,gBAAgB,GACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAE3D,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAChC,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,QAAQ,aAEtB,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,8BAAsB,EAC1D,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,YAAG,UAAU,GAAQ,EAClD,KAAC,IAAI,IAAC,IAAI,kBAAE,OAAO,CAAC,cAAc,GAAQ,EAC1C,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,aAC1B,UAAU,EACV,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IACjC,IACF,EACN,gBAAgB,CAAC,CAAC,CAAC,CAClB,MAAC,IAAI,IAAC,QAAQ,gCAAW,gBAAgB,IAAQ,CAClD,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text } from "ink";
|
|
4
|
+
import { theme } from "../theme.js";
|
|
5
|
+
const SPINNER_FRAMES = [
|
|
6
|
+
"\u28CB", "\u28D9", "\u28F9", "\u28F8",
|
|
7
|
+
"\u28FC", "\u28F4", "\u28E6", "\u28E7",
|
|
8
|
+
"\u28C7", "\u28CF",
|
|
9
|
+
];
|
|
10
|
+
export function InputBar({ input, busy }) {
|
|
11
|
+
const spinner = useSpinner(busy);
|
|
12
|
+
return (_jsx(Box, { borderStyle: "round", borderColor: busy ? theme.chrome.busy : theme.chrome.accent, paddingX: 1, children: busy ? (_jsxs(Text, { color: theme.chrome.busy, children: [spinner, " working..."] })) : (_jsxs(Text, { children: [_jsx(Text, { color: theme.chrome.accent, bold: true, children: "\u276F " }), input, _jsx(Text, { dimColor: true, children: "\u2588" })] })) }));
|
|
13
|
+
}
|
|
14
|
+
function useSpinner(active) {
|
|
15
|
+
const [frame, setFrame] = useState(0);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (!active) {
|
|
18
|
+
setFrame(0);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const timer = setInterval(() => {
|
|
22
|
+
setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);
|
|
23
|
+
}, 80);
|
|
24
|
+
return () => clearInterval(timer);
|
|
25
|
+
}, [active]);
|
|
26
|
+
return active ? (SPINNER_FRAMES[frame] ?? "\u28CB") : "";
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=InputBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../../../src/interfaces/cli/components/InputBar.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,cAAc,GAAG;IACrB,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IACtC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IACtC,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAOF,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAiB;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,CACL,KAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAC3D,QAAQ,EAAE,CAAC,YAEV,IAAI,CAAC,CAAC,CAAC,CACN,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,aAAG,OAAO,mBAAmB,CAC5D,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,kBAAE,SAAS,GAAQ,EACxD,KAAK,EACN,KAAC,IAAI,IAAC,QAAQ,kBAAE,QAAQ,GAAQ,IAC3B,CACR,GACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAe;IACjC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { RelayInteractiveSession } from "../../../application/relay-cli-service.js";
|
|
3
|
+
export interface MessageListProps {
|
|
4
|
+
session: RelayInteractiveSession;
|
|
5
|
+
}
|
|
6
|
+
export declare function MessageList({ session }: MessageListProps): React.ReactNode;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useStdout } from "ink";
|
|
3
|
+
import { theme } from "../theme.js";
|
|
4
|
+
const CHROME_LINES = 12; // header + input + controls + borders overhead
|
|
5
|
+
export function MessageList({ session }) {
|
|
6
|
+
const { stdout } = useStdout();
|
|
7
|
+
const terminalHeight = stdout?.rows ?? 24;
|
|
8
|
+
const maxMessages = Math.max(4, terminalHeight - CHROME_LINES);
|
|
9
|
+
const messages = session.messages.slice(-maxMessages);
|
|
10
|
+
return (_jsx(Box, { borderStyle: "round", borderColor: theme.chrome.border, flexDirection: "column", paddingX: 1, minHeight: 4, flexGrow: 1, children: messages.length === 0 ? (_jsx(Text, { dimColor: true, children: "No messages yet." })) : (messages.map((msg, i) => (_jsx(Box, { children: _jsxs(Text, { color: roleColor(msg.role), children: [_jsx(Text, { bold: true, children: rolePrefix(msg.role, msg.backend) }), " ", msg.content] }) }, `msg-${i}`)))) }));
|
|
11
|
+
}
|
|
12
|
+
function rolePrefix(role, backend) {
|
|
13
|
+
switch (role) {
|
|
14
|
+
case "user":
|
|
15
|
+
return `[user \u2192 ${backend ?? "unknown"}]`;
|
|
16
|
+
case "assistant":
|
|
17
|
+
return `[${backend ?? "assistant"}]`;
|
|
18
|
+
case "system":
|
|
19
|
+
return "[system]";
|
|
20
|
+
case "error":
|
|
21
|
+
return "[error]";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function roleColor(role) {
|
|
25
|
+
return theme.role[role];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=MessageList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../../../src/interfaces/cli/components/MessageList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,+CAA+C;AAMxE,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAoB;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;IAEtD,OAAO,CACL,KAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAChC,aAAa,EAAC,QAAQ,EACtB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,YAEV,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,KAAC,IAAI,IAAC,QAAQ,uCAAwB,CACvC,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,aAC9B,KAAC,IAAI,IAAC,IAAI,kBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,GAAQ,EACpD,GAAG,EACH,GAAG,CAAC,OAAO,IACP,IALC,OAAO,CAAC,EAAE,CAMd,CACP,CAAC,CACH,GACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,IAAyD,EACzD,OAA+D;IAE/D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,gBAAgB,OAAO,IAAI,SAAS,GAAG,CAAC;QACjD,KAAK,WAAW;YACd,OAAO,IAAI,OAAO,IAAI,WAAW,GAAG,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,UAAU,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,IAAyD;IAEzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { theme } from "../theme.js";
|
|
4
|
+
export function StatusBar({ notice, busy }) {
|
|
5
|
+
return (_jsxs(_Fragment, { children: [notice ? (_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: busy ? theme.chrome.busy : theme.chrome.success, children: notice }) })) : null, _jsx(Box, { paddingX: 1, justifyContent: "center", children: _jsxs(Text, { dimColor: true, children: ["Enter send ", "\u00B7", " Ctrl+B backend ", "\u00B7", " Ctrl+C exit"] }) })] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../../src/interfaces/cli/components/StatusBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOpC,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAkB;IACxD,OAAO,CACL,8BACG,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,YAAG,MAAM,GAAQ,GACzE,CACP,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,QAAQ,YACvC,MAAC,IAAI,IAAC,QAAQ,kCACA,QAAQ,sBAAkB,QAAQ,oBACzC,GACH,IACL,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,113 +1,110 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Box, render, useApp, useStdin } from "ink";
|
|
4
|
+
import { Header } from "./components/Header.js";
|
|
5
|
+
import { MessageList } from "./components/MessageList.js";
|
|
6
|
+
import { InputBar } from "./components/InputBar.js";
|
|
7
|
+
import { StatusBar } from "./components/StatusBar.js";
|
|
8
|
+
import { classifyInput, deleteLastGrapheme, ENABLE_BRACKETED_PASTE, DISABLE_BRACKETED_PASTE, } from "./text-input-utils.js";
|
|
3
9
|
export async function runRelayInteractiveShell(options) {
|
|
4
|
-
const instance = render(
|
|
5
|
-
service: options.service,
|
|
6
|
-
initialSession: options.initialSession,
|
|
7
|
-
}));
|
|
10
|
+
const instance = render(_jsx(RelayShellApp, { service: options.service, initialSession: options.initialSession }));
|
|
8
11
|
await instance.waitUntilExit();
|
|
9
12
|
return 0;
|
|
10
13
|
}
|
|
11
14
|
function RelayShellApp(props) {
|
|
12
15
|
const { exit } = useApp();
|
|
16
|
+
// ink's internal_eventEmitter provides decoded stdin chunks without
|
|
17
|
+
// conflicting with ink's readable-mode pipeline. This is an internal
|
|
18
|
+
// API (ink 6.x); if ink is upgraded, verify the emitter still exists.
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
20
|
+
const { setRawMode, internal_eventEmitter } = useStdin();
|
|
13
21
|
const [session, setSession] = useState(props.initialSession);
|
|
14
22
|
const [input, setInput] = useState("");
|
|
15
23
|
const [busy, setBusy] = useState(false);
|
|
16
24
|
const [notice, setNotice] = useState();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
// Refs to avoid re-registering the stdin listener on every state change.
|
|
26
|
+
const inputRef = useRef(input);
|
|
27
|
+
const sessionRef = useRef(session);
|
|
28
|
+
const busyRef = useRef(busy);
|
|
29
|
+
inputRef.current = input;
|
|
30
|
+
sessionRef.current = session;
|
|
31
|
+
busyRef.current = busy;
|
|
32
|
+
// Enable raw mode + bracketed paste on mount; clean up on unmount.
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
setRawMode(true);
|
|
35
|
+
process.stdout.write(ENABLE_BRACKETED_PASTE);
|
|
36
|
+
return () => {
|
|
37
|
+
setRawMode(false);
|
|
38
|
+
process.stdout.write(DISABLE_BRACKETED_PASTE);
|
|
39
|
+
};
|
|
40
|
+
}, [setRawMode]);
|
|
41
|
+
// Custom stdin handler — replaces ink's useInput so that multi-byte
|
|
42
|
+
// CJK characters and bracketed-paste sequences are kept intact.
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const handleData = (data) => {
|
|
45
|
+
const action = classifyInput(data);
|
|
46
|
+
if (action.kind === "control" && action.name === "ctrl-c") {
|
|
47
|
+
exit();
|
|
36
48
|
return;
|
|
37
49
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
if (busyRef.current)
|
|
51
|
+
return;
|
|
52
|
+
if (action.kind === "control") {
|
|
53
|
+
switch (action.name) {
|
|
54
|
+
case "ctrl-b": {
|
|
55
|
+
const current = sessionRef.current;
|
|
56
|
+
const nextSession = props.service.cycleInteractiveBackend(current);
|
|
57
|
+
setSession(nextSession);
|
|
58
|
+
setNotice(nextSession.currentBackend === current.currentBackend
|
|
59
|
+
? "No alternative backend is available."
|
|
60
|
+
: `Switched to ${nextSession.currentBackend}.`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
case "return": {
|
|
64
|
+
const prompt = inputRef.current.trim();
|
|
65
|
+
if (!prompt)
|
|
66
|
+
return;
|
|
67
|
+
setBusy(true);
|
|
68
|
+
setNotice(undefined);
|
|
69
|
+
setInput("");
|
|
70
|
+
void props.service
|
|
71
|
+
.submitInteractivePrompt(sessionRef.current, prompt)
|
|
72
|
+
.then((result) => {
|
|
73
|
+
setSession(result.session);
|
|
74
|
+
setNotice(result.handoff
|
|
75
|
+
? `Started ${result.session.currentBackend} with handoff from ${result.handoff.source_backend}.`
|
|
76
|
+
: undefined);
|
|
77
|
+
})
|
|
78
|
+
.catch((error) => {
|
|
79
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
80
|
+
setSession((previous) => props.service.appendInteractiveMessage(previous, {
|
|
81
|
+
role: "error",
|
|
82
|
+
backend: previous.currentBackend,
|
|
83
|
+
content: message,
|
|
84
|
+
}));
|
|
85
|
+
setNotice(message);
|
|
86
|
+
})
|
|
87
|
+
.finally(() => {
|
|
88
|
+
setBusy(false);
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
case "backspace":
|
|
93
|
+
setInput((previous) => deleteLastGrapheme(previous));
|
|
94
|
+
return;
|
|
95
|
+
default:
|
|
96
|
+
return;
|
|
48
97
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
.finally(() => {
|
|
61
|
-
setBusy(false);
|
|
62
|
-
});
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (key.backspace || key.delete) {
|
|
66
|
-
setInput((previous) => previous.slice(0, -1));
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (key.ctrl || key.meta || key.escape || !keyInput) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
setInput((previous) => previous + keyInput);
|
|
73
|
-
});
|
|
74
|
-
const currentSessionId = session.sessions[session.currentBackend]?.relaySessionId;
|
|
75
|
-
return React.createElement(Box, { flexDirection: "column" }, React.createElement(Text, { color: "cyanBright" }, "agentic-relay"), React.createElement(Text, null, `backend: ${session.currentBackend} | available: ${session.availableBackends.join(", ")}`), React.createElement(Text, { color: "gray" }, currentSessionId ? `session: ${currentSessionId}` : "session: new relay-managed session"), React.createElement(Text, { color: "gray" }, "controls: Enter send | Ctrl+B switch backend | Ctrl+C exit"), notice
|
|
76
|
-
? React.createElement(Text, { color: busy ? "yellow" : "green" }, notice)
|
|
77
|
-
: null, React.createElement(Box, { flexDirection: "column", marginTop: 1 }, renderMessages(session)), React.createElement(Text, { color: busy ? "yellow" : "white" }, `${busy ? "working" : "input"}> ${input}`));
|
|
78
|
-
}
|
|
79
|
-
function renderMessages(session) {
|
|
80
|
-
const recentMessages = session.messages.slice(-12);
|
|
81
|
-
return recentMessages.map((message, index) => React.createElement(Text, {
|
|
82
|
-
key: `${message.role}-${index}`,
|
|
83
|
-
color: messageColor(message.role),
|
|
84
|
-
}, `${messagePrefix(message.role, message.backend)} ${singleLine(message.content)}`));
|
|
85
|
-
}
|
|
86
|
-
function messagePrefix(role, backend) {
|
|
87
|
-
switch (role) {
|
|
88
|
-
case "user":
|
|
89
|
-
return `[user -> ${backend ?? "unknown"}]`;
|
|
90
|
-
case "assistant":
|
|
91
|
-
return `[${backend ?? "assistant"}]`;
|
|
92
|
-
case "system":
|
|
93
|
-
return "[system]";
|
|
94
|
-
case "error":
|
|
95
|
-
return "[error]";
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
function messageColor(role) {
|
|
99
|
-
switch (role) {
|
|
100
|
-
case "user":
|
|
101
|
-
return "white";
|
|
102
|
-
case "assistant":
|
|
103
|
-
return "cyan";
|
|
104
|
-
case "system":
|
|
105
|
-
return "yellow";
|
|
106
|
-
case "error":
|
|
107
|
-
return "red";
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
function singleLine(value) {
|
|
111
|
-
return value.replace(/\s+/g, " ").trim();
|
|
98
|
+
}
|
|
99
|
+
if (action.kind === "text") {
|
|
100
|
+
setInput((previous) => previous + action.value);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
internal_eventEmitter?.on("input", handleData);
|
|
104
|
+
return () => {
|
|
105
|
+
internal_eventEmitter?.removeListener("input", handleData);
|
|
106
|
+
};
|
|
107
|
+
}, [internal_eventEmitter, exit, props.service]);
|
|
108
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, { session: session }), _jsx(MessageList, { session: session }), _jsx(InputBar, { input: input, busy: busy }), _jsx(StatusBar, { notice: notice, busy: busy })] }));
|
|
112
109
|
}
|
|
113
110
|
//# sourceMappingURL=relay-shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-shell.js","sourceRoot":"","sources":["../../../src/interfaces/cli/relay-shell.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"relay-shell.js","sourceRoot":"","sources":["../../../src/interfaces/cli/relay-shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delete the last grapheme cluster from a string.
|
|
3
|
+
* Unlike `str.slice(0, -1)` which operates on UTF-16 code units,
|
|
4
|
+
* this correctly handles CJK characters, emoji, surrogate pairs,
|
|
5
|
+
* and combining characters.
|
|
6
|
+
*/
|
|
7
|
+
export declare function deleteLastGrapheme(str: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Bracketed paste mode escape sequences.
|
|
10
|
+
* When enabled, the terminal wraps pasted text in these markers,
|
|
11
|
+
* allowing the application to distinguish pasted text from typed input.
|
|
12
|
+
* Some terminals also use this for IME-committed text.
|
|
13
|
+
*/
|
|
14
|
+
export declare const BRACKETED_PASTE_START = "\u001B[200~";
|
|
15
|
+
export declare const BRACKETED_PASTE_END = "\u001B[201~";
|
|
16
|
+
export declare const ENABLE_BRACKETED_PASTE = "\u001B[?2004h";
|
|
17
|
+
export declare const DISABLE_BRACKETED_PASTE = "\u001B[?2004l";
|
|
18
|
+
/**
|
|
19
|
+
* Extract text from a bracketed paste sequence.
|
|
20
|
+
* Returns the inner text if the string contains bracketed paste markers,
|
|
21
|
+
* or undefined if no markers are found.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractBracketedPaste(data: string): string | undefined;
|
|
24
|
+
export type InputAction = {
|
|
25
|
+
kind: "text";
|
|
26
|
+
value: string;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "control";
|
|
29
|
+
name: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: "ignore";
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Classify a raw stdin chunk into an action.
|
|
35
|
+
*
|
|
36
|
+
* Unlike ink's `parseKeypress`, this treats multi-byte CJK characters,
|
|
37
|
+
* emoji, and bracketed-paste sequences as indivisible text rather than
|
|
38
|
+
* trying to classify them as key combinations.
|
|
39
|
+
*/
|
|
40
|
+
export declare function classifyInput(data: string): InputAction;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
2
|
+
/**
|
|
3
|
+
* Delete the last grapheme cluster from a string.
|
|
4
|
+
* Unlike `str.slice(0, -1)` which operates on UTF-16 code units,
|
|
5
|
+
* this correctly handles CJK characters, emoji, surrogate pairs,
|
|
6
|
+
* and combining characters.
|
|
7
|
+
*/
|
|
8
|
+
export function deleteLastGrapheme(str) {
|
|
9
|
+
if (str.length === 0) {
|
|
10
|
+
return str;
|
|
11
|
+
}
|
|
12
|
+
const segments = [...segmenter.segment(str)];
|
|
13
|
+
if (segments.length === 0) {
|
|
14
|
+
return str;
|
|
15
|
+
}
|
|
16
|
+
const last = segments[segments.length - 1];
|
|
17
|
+
return str.slice(0, last.index);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Bracketed paste mode escape sequences.
|
|
21
|
+
* When enabled, the terminal wraps pasted text in these markers,
|
|
22
|
+
* allowing the application to distinguish pasted text from typed input.
|
|
23
|
+
* Some terminals also use this for IME-committed text.
|
|
24
|
+
*/
|
|
25
|
+
export const BRACKETED_PASTE_START = "\x1b[200~";
|
|
26
|
+
export const BRACKETED_PASTE_END = "\x1b[201~";
|
|
27
|
+
export const ENABLE_BRACKETED_PASTE = "\x1b[?2004h";
|
|
28
|
+
export const DISABLE_BRACKETED_PASTE = "\x1b[?2004l";
|
|
29
|
+
/**
|
|
30
|
+
* Extract text from a bracketed paste sequence.
|
|
31
|
+
* Returns the inner text if the string contains bracketed paste markers,
|
|
32
|
+
* or undefined if no markers are found.
|
|
33
|
+
*/
|
|
34
|
+
export function extractBracketedPaste(data) {
|
|
35
|
+
const startIdx = data.indexOf(BRACKETED_PASTE_START);
|
|
36
|
+
if (startIdx === -1) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const contentStart = startIdx + BRACKETED_PASTE_START.length;
|
|
40
|
+
const endIdx = data.indexOf(BRACKETED_PASTE_END, contentStart);
|
|
41
|
+
if (endIdx === -1) {
|
|
42
|
+
// Paste end marker not found; treat everything after start as pasted text
|
|
43
|
+
return data.slice(contentStart);
|
|
44
|
+
}
|
|
45
|
+
return data.slice(contentStart, endIdx);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Classify a raw stdin chunk into an action.
|
|
49
|
+
*
|
|
50
|
+
* Unlike ink's `parseKeypress`, this treats multi-byte CJK characters,
|
|
51
|
+
* emoji, and bracketed-paste sequences as indivisible text rather than
|
|
52
|
+
* trying to classify them as key combinations.
|
|
53
|
+
*/
|
|
54
|
+
export function classifyInput(data) {
|
|
55
|
+
// --- bracketed paste -------------------------------------------------
|
|
56
|
+
const pasted = extractBracketedPaste(data);
|
|
57
|
+
if (pasted !== undefined) {
|
|
58
|
+
// Strip newlines from pasted text (single-line input bar)
|
|
59
|
+
const cleaned = pasted.replace(/[\r\n]+/g, " ").trim();
|
|
60
|
+
return cleaned ? { kind: "text", value: cleaned } : { kind: "ignore" };
|
|
61
|
+
}
|
|
62
|
+
// --- ctrl+key --------------------------------------------------------
|
|
63
|
+
if (data === "\x03")
|
|
64
|
+
return { kind: "control", name: "ctrl-c" };
|
|
65
|
+
if (data === "\x02")
|
|
66
|
+
return { kind: "control", name: "ctrl-b" };
|
|
67
|
+
// --- enter / return --------------------------------------------------
|
|
68
|
+
if (data === "\r" || data === "\n")
|
|
69
|
+
return { kind: "control", name: "return" };
|
|
70
|
+
// --- backspace / delete ----------------------------------------------
|
|
71
|
+
if (data === "\x7f" || data === "\b" || data === "\x1b\x7f" || data === "\x1b\b") {
|
|
72
|
+
return { kind: "control", name: "backspace" };
|
|
73
|
+
}
|
|
74
|
+
// --- escape / escape sequences (arrows, function keys, etc.) ---------
|
|
75
|
+
if (data === "\x1b" || data === "\x1b\x1b")
|
|
76
|
+
return { kind: "control", name: "escape" };
|
|
77
|
+
if (data.startsWith("\x1b[") || data.startsWith("\x1bO"))
|
|
78
|
+
return { kind: "ignore" };
|
|
79
|
+
if (/^\x1b[a-zA-Z0-9]$/.test(data))
|
|
80
|
+
return { kind: "ignore" };
|
|
81
|
+
// --- tab -------------------------------------------------------------
|
|
82
|
+
if (data === "\t")
|
|
83
|
+
return { kind: "ignore" };
|
|
84
|
+
// --- remaining ctrl characters (0x01–0x1a except the ones above) -----
|
|
85
|
+
if (data.length === 1 && data <= "\x1a")
|
|
86
|
+
return { kind: "ignore" };
|
|
87
|
+
// --- printable text (ASCII, CJK, emoji, etc.) ------------------------
|
|
88
|
+
return { kind: "text", value: data };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=text-input-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input-utils.js","sourceRoot":"","sources":["../../../src/interfaces/cli/text-input-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TaskStatus } from "../../core/types.js";
|
|
2
|
+
export declare const theme: {
|
|
3
|
+
readonly role: {
|
|
4
|
+
readonly user: "white";
|
|
5
|
+
readonly assistant: "cyan";
|
|
6
|
+
readonly system: "yellow";
|
|
7
|
+
readonly error: "red";
|
|
8
|
+
};
|
|
9
|
+
readonly status: {
|
|
10
|
+
backlog: string;
|
|
11
|
+
ready: string;
|
|
12
|
+
in_progress: string;
|
|
13
|
+
review: string;
|
|
14
|
+
blocked: string;
|
|
15
|
+
done: string;
|
|
16
|
+
superseded: string;
|
|
17
|
+
archived: string;
|
|
18
|
+
};
|
|
19
|
+
readonly chrome: {
|
|
20
|
+
readonly border: "gray";
|
|
21
|
+
readonly title: "cyanBright";
|
|
22
|
+
readonly dim: "gray";
|
|
23
|
+
readonly accent: "cyan";
|
|
24
|
+
readonly busy: "yellow";
|
|
25
|
+
readonly success: "green";
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export declare const ANSI: {
|
|
29
|
+
readonly reset: "\u001B[0m";
|
|
30
|
+
readonly bold: "\u001B[1m";
|
|
31
|
+
readonly dim: "\u001B[2m";
|
|
32
|
+
readonly red: "\u001B[31m";
|
|
33
|
+
readonly green: "\u001B[32m";
|
|
34
|
+
readonly yellow: "\u001B[33m";
|
|
35
|
+
readonly blue: "\u001B[34m";
|
|
36
|
+
readonly magenta: "\u001B[35m";
|
|
37
|
+
readonly cyan: "\u001B[36m";
|
|
38
|
+
readonly gray: "\u001B[90m";
|
|
39
|
+
};
|
|
40
|
+
export declare function statusAnsi(status: TaskStatus): string;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const theme = {
|
|
2
|
+
role: {
|
|
3
|
+
user: "white",
|
|
4
|
+
assistant: "cyan",
|
|
5
|
+
system: "yellow",
|
|
6
|
+
error: "red",
|
|
7
|
+
},
|
|
8
|
+
status: {
|
|
9
|
+
backlog: "gray",
|
|
10
|
+
ready: "cyan",
|
|
11
|
+
in_progress: "blue",
|
|
12
|
+
review: "magenta",
|
|
13
|
+
blocked: "red",
|
|
14
|
+
done: "green",
|
|
15
|
+
superseded: "gray",
|
|
16
|
+
archived: "gray",
|
|
17
|
+
},
|
|
18
|
+
chrome: {
|
|
19
|
+
border: "gray",
|
|
20
|
+
title: "cyanBright",
|
|
21
|
+
dim: "gray",
|
|
22
|
+
accent: "cyan",
|
|
23
|
+
busy: "yellow",
|
|
24
|
+
success: "green",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export const ANSI = {
|
|
28
|
+
reset: "\u001B[0m",
|
|
29
|
+
bold: "\u001B[1m",
|
|
30
|
+
dim: "\u001B[2m",
|
|
31
|
+
red: "\u001B[31m",
|
|
32
|
+
green: "\u001B[32m",
|
|
33
|
+
yellow: "\u001B[33m",
|
|
34
|
+
blue: "\u001B[34m",
|
|
35
|
+
magenta: "\u001B[35m",
|
|
36
|
+
cyan: "\u001B[36m",
|
|
37
|
+
gray: "\u001B[90m",
|
|
38
|
+
};
|
|
39
|
+
// ANSI.dim (intensity reduction) is used for superseded/archived instead of
|
|
40
|
+
// ANSI.gray to match the original visualization-renderer behavior. The Ink
|
|
41
|
+
// theme.status uses "gray" for these since Ink handles dim via the dimColor prop.
|
|
42
|
+
const STATUS_ANSI = {
|
|
43
|
+
backlog: ANSI.gray,
|
|
44
|
+
ready: ANSI.cyan,
|
|
45
|
+
in_progress: ANSI.blue,
|
|
46
|
+
review: ANSI.magenta,
|
|
47
|
+
blocked: ANSI.red,
|
|
48
|
+
done: ANSI.green,
|
|
49
|
+
superseded: ANSI.dim,
|
|
50
|
+
archived: ANSI.dim,
|
|
51
|
+
};
|
|
52
|
+
export function statusAnsi(status) {
|
|
53
|
+
return STATUS_ANSI[status];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/interfaces/cli/theme.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,KAAK;KACb;IACD,MAAM,EAAE;QACN,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,MAAM;KACoB;IACtC,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,MAAM;QACX,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;KACjB;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;CACV,CAAC;AAEX,4EAA4E;AAC5E,2EAA2E;AAC3E,kFAAkF;AAClF,MAAM,WAAW,GAA+B;IAC9C,OAAO,EAAE,IAAI,CAAC,IAAI;IAClB,KAAK,EAAE,IAAI,CAAC,IAAI;IAChB,WAAW,EAAE,IAAI,CAAC,IAAI;IACtB,MAAM,EAAE,IAAI,CAAC,OAAO;IACpB,OAAO,EAAE,IAAI,CAAC,GAAG;IACjB,IAAI,EAAE,IAAI,CAAC,KAAK;IAChB,UAAU,EAAE,IAAI,CAAC,GAAG;IACpB,QAAQ,EAAE,IAAI,CAAC,GAAG;CACnB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
const ANSI_BOLD = "\u001B[1m";
|
|
3
|
-
const ANSI_DIM = "\u001B[2m";
|
|
4
|
-
const ANSI_RED = "\u001B[31m";
|
|
5
|
-
const ANSI_GREEN = "\u001B[32m";
|
|
6
|
-
const ANSI_YELLOW = "\u001B[33m";
|
|
7
|
-
const ANSI_BLUE = "\u001B[34m";
|
|
8
|
-
const ANSI_MAGENTA = "\u001B[35m";
|
|
9
|
-
const ANSI_CYAN = "\u001B[36m";
|
|
10
|
-
const ANSI_GRAY = "\u001B[90m";
|
|
1
|
+
import { ANSI, statusAnsi } from "./theme.js";
|
|
11
2
|
export function renderVisualization(snapshot) {
|
|
12
3
|
const lines = [
|
|
13
4
|
"Task Tree",
|
|
@@ -20,7 +11,7 @@ export function renderVisualization(snapshot) {
|
|
|
20
11
|
}
|
|
21
12
|
function renderTaskTree(nodes) {
|
|
22
13
|
if (nodes.length === 0) {
|
|
23
|
-
return [`${
|
|
14
|
+
return [`${ANSI.dim}(no tasks)${ANSI.reset}`];
|
|
24
15
|
}
|
|
25
16
|
const lines = [];
|
|
26
17
|
nodes.forEach((node, index) => {
|
|
@@ -29,25 +20,25 @@ function renderTaskTree(nodes) {
|
|
|
29
20
|
return lines;
|
|
30
21
|
}
|
|
31
22
|
function appendTaskNode(lines, node, prefix, isLast, isRoot = false) {
|
|
32
|
-
const branch = isRoot ? "" : `${prefix}${isLast ? "
|
|
33
|
-
const blockedMarker = node.status === "blocked" ? `${
|
|
23
|
+
const branch = isRoot ? "" : `${prefix}${isLast ? "\u2514\u2500 " : "\u251C\u2500 "}`;
|
|
24
|
+
const blockedMarker = node.status === "blocked" ? `${ANSI.red}${ANSI.bold}! ${ANSI.reset}` : "";
|
|
34
25
|
const taskLine = [
|
|
35
26
|
`${branch}${blockedMarker}${colorizeStatus(node.status)} `,
|
|
36
27
|
`${node.title} `,
|
|
37
|
-
`${
|
|
28
|
+
`${ANSI.dim}(${node.task_id})${ANSI.reset}`,
|
|
38
29
|
` agent=${node.agent_id ?? "-"}`,
|
|
39
30
|
` session=${node.current_relay_session_id ?? "-"}`,
|
|
40
31
|
` deps=${node.depends_on.length > 0 ? node.depends_on.join(",") : "-"}`,
|
|
41
32
|
].join("");
|
|
42
33
|
lines.push(taskLine);
|
|
43
|
-
const childPrefix = isRoot ? "" : `${prefix}${isLast ? " " : "
|
|
34
|
+
const childPrefix = isRoot ? "" : `${prefix}${isLast ? " " : "\u2502 "}`;
|
|
44
35
|
if (node.status === "blocked" && node.blocked_reason) {
|
|
45
36
|
const blockedLabel = node.blocked_kind === "dependency"
|
|
46
37
|
? "blocked by dependency"
|
|
47
38
|
: node.blocked_kind === "error"
|
|
48
39
|
? "blocked by error"
|
|
49
40
|
: "blocked";
|
|
50
|
-
lines.push(`${childPrefix}${
|
|
41
|
+
lines.push(`${childPrefix}${ANSI.red}!! ${blockedLabel}: ${node.blocked_reason}${ANSI.reset}`);
|
|
51
42
|
}
|
|
52
43
|
node.children.forEach((child, index) => {
|
|
53
44
|
appendTaskNode(lines, child, childPrefix, index === node.children.length - 1, false);
|
|
@@ -55,14 +46,14 @@ function appendTaskNode(lines, node, prefix, isLast, isRoot = false) {
|
|
|
55
46
|
}
|
|
56
47
|
function renderActiveAgents(activeAgents) {
|
|
57
48
|
if (activeAgents.length === 0) {
|
|
58
|
-
return [`${
|
|
49
|
+
return [`${ANSI.dim}(no active agents)${ANSI.reset}`];
|
|
59
50
|
}
|
|
60
51
|
return activeAgents.map((agent) => {
|
|
61
52
|
const taskLabel = agent.task_title
|
|
62
53
|
? `${agent.task_title} (${agent.task_id})`
|
|
63
54
|
: (agent.task_id ?? "-");
|
|
64
55
|
return [
|
|
65
|
-
`${
|
|
56
|
+
`${ANSI.blue}${agent.agent_id}${ANSI.reset}`,
|
|
66
57
|
` relay_session=${agent.relay_session_id}`,
|
|
67
58
|
` task=${taskLabel}`,
|
|
68
59
|
` backend=${agent.backend ?? "-"}`,
|
|
@@ -71,27 +62,8 @@ function renderActiveAgents(activeAgents) {
|
|
|
71
62
|
});
|
|
72
63
|
}
|
|
73
64
|
function colorizeStatus(status) {
|
|
74
|
-
const color =
|
|
75
|
-
return `${color}[${status}]${
|
|
76
|
-
}
|
|
77
|
-
function statusColor(status) {
|
|
78
|
-
switch (status) {
|
|
79
|
-
case "backlog":
|
|
80
|
-
return ANSI_GRAY;
|
|
81
|
-
case "ready":
|
|
82
|
-
return ANSI_CYAN;
|
|
83
|
-
case "in_progress":
|
|
84
|
-
return ANSI_BLUE;
|
|
85
|
-
case "review":
|
|
86
|
-
return ANSI_MAGENTA;
|
|
87
|
-
case "blocked":
|
|
88
|
-
return ANSI_RED;
|
|
89
|
-
case "done":
|
|
90
|
-
return ANSI_GREEN;
|
|
91
|
-
case "superseded":
|
|
92
|
-
case "archived":
|
|
93
|
-
return ANSI_DIM;
|
|
94
|
-
}
|
|
65
|
+
const color = statusAnsi(status);
|
|
66
|
+
return `${color}[${status}]${ANSI.reset}`;
|
|
95
67
|
}
|
|
96
68
|
function formatDuration(totalSeconds) {
|
|
97
69
|
const hours = Math.floor(totalSeconds / 3600);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visualization-renderer.js","sourceRoot":"","sources":["../../../src/interfaces/cli/visualization-renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"visualization-renderer.js","sourceRoot":"","sources":["../../../src/interfaces/cli/visualization-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -701,7 +701,7 @@ const TOOL_DESCRIPTIONS = {
|
|
|
701
701
|
export function createRelayMcpServer(options) {
|
|
702
702
|
const server = new McpServer({
|
|
703
703
|
name: "agentic-relay",
|
|
704
|
-
version: "19.1
|
|
704
|
+
version: "19.2.1",
|
|
705
705
|
});
|
|
706
706
|
if (options.allowSpawnAgents) {
|
|
707
707
|
server.registerTool("spawn_agents", {
|