@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.
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { RelayInteractiveSession } from "../../../application/relay-cli-service.js";
3
+ export interface HeaderProps {
4
+ session: RelayInteractiveSession;
5
+ }
6
+ export declare function Header({ session }: HeaderProps): React.ReactNode;
@@ -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,6 @@
1
+ import React from "react";
2
+ export interface InputBarProps {
3
+ input: string;
4
+ busy: boolean;
5
+ }
6
+ export declare function InputBar({ input, busy }: InputBarProps): React.ReactNode;
@@ -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,6 @@
1
+ import React from "react";
2
+ export interface StatusBarProps {
3
+ notice?: string;
4
+ busy: boolean;
5
+ }
6
+ export declare function StatusBar({ notice, busy }: StatusBarProps): React.ReactNode;
@@ -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 React, { useState } from "react";
2
- import { Box, Text, render, useApp, useInput } from "ink";
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(React.createElement(RelayShellApp, {
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
- useInput((keyInput, key) => {
18
- if (key.ctrl && keyInput === "c") {
19
- exit();
20
- return;
21
- }
22
- if (busy) {
23
- return;
24
- }
25
- if (key.ctrl && keyInput.toLowerCase() === "b") {
26
- const nextSession = props.service.cycleInteractiveBackend(session);
27
- setSession(nextSession);
28
- setNotice(nextSession.currentBackend === session.currentBackend
29
- ? "No alternative backend is available."
30
- : `Switched to ${nextSession.currentBackend}.`);
31
- return;
32
- }
33
- if (key.return) {
34
- const prompt = input.trim();
35
- if (!prompt) {
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
- setBusy(true);
39
- setNotice(undefined);
40
- setInput("");
41
- void props.service
42
- .submitInteractivePrompt(session, prompt)
43
- .then((result) => {
44
- setSession(result.session);
45
- if (result.handoff) {
46
- setNotice(`Started ${result.session.currentBackend} with handoff from ${result.handoff.source_backend}.`);
47
- return;
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
- setNotice(undefined);
50
- })
51
- .catch((error) => {
52
- const message = error instanceof Error ? error.message : String(error);
53
- setSession((previous) => props.service.appendInteractiveMessage(previous, {
54
- role: "error",
55
- backend: previous.currentBackend,
56
- content: message,
57
- }));
58
- setNotice(message);
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":"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"}
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
- const ANSI_RESET = "\u001B[0m";
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 [`${ANSI_DIM}(no tasks)${ANSI_RESET}`];
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" ? `${ANSI_RED}${ANSI_BOLD}! ${ANSI_RESET}` : "";
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
- `${ANSI_DIM}(${node.task_id})${ANSI_RESET}`,
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}${ANSI_RED}!! ${blockedLabel}: ${node.blocked_reason}${ANSI_RESET}`);
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 [`${ANSI_DIM}(no active agents)${ANSI_RESET}`];
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
- `${ANSI_BLUE}${agent.agent_id}${ANSI_RESET}`,
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 = statusColor(status);
75
- return `${color}[${status}]${ANSI_RESET}`;
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":"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"}
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.0",
704
+ version: "19.2.1",
705
705
  });
706
706
  if (options.allowSpawnAgents) {
707
707
  server.registerTool("spawn_agents", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rk0429/agentic-relay",
3
- "version": "19.1.0",
3
+ "version": "19.2.1",
4
4
  "displayName": "agentic-relay",
5
5
  "description": "Unified MCP relay for Claude Code, Codex CLI, and Gemini CLI",
6
6
  "type": "module",