@rk0429/agentic-relay 19.2.1 → 19.2.2

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.
@@ -1,11 +1,11 @@
1
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";
2
+ import { useEffect, useState } from "react";
3
+ import { Box, render, useApp, useInput } from "ink";
4
4
  import { Header } from "./components/Header.js";
5
5
  import { MessageList } from "./components/MessageList.js";
6
6
  import { InputBar } from "./components/InputBar.js";
7
7
  import { StatusBar } from "./components/StatusBar.js";
8
- import { classifyInput, deleteLastGrapheme, ENABLE_BRACKETED_PASTE, DISABLE_BRACKETED_PASTE, } from "./text-input-utils.js";
8
+ import { deleteLastGrapheme, extractBracketedPaste, ENABLE_BRACKETED_PASTE, DISABLE_BRACKETED_PASTE, } from "./text-input-utils.js";
9
9
  export async function runRelayInteractiveShell(options) {
10
10
  const instance = render(_jsx(RelayShellApp, { service: options.service, initialSession: options.initialSession }));
11
11
  await instance.waitUntilExit();
@@ -13,98 +13,88 @@ export async function runRelayInteractiveShell(options) {
13
13
  }
14
14
  function RelayShellApp(props) {
15
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();
21
16
  const [session, setSession] = useState(props.initialSession);
22
17
  const [input, setInput] = useState("");
23
18
  const [busy, setBusy] = useState(false);
24
19
  const [notice, setNotice] = useState();
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.
20
+ // Enable bracketed paste mode on mount so that terminals wrap
21
+ // pasted (and some IME-committed) text in detectable markers.
33
22
  useEffect(() => {
34
- setRawMode(true);
35
23
  process.stdout.write(ENABLE_BRACKETED_PASTE);
36
24
  return () => {
37
- setRawMode(false);
38
25
  process.stdout.write(DISABLE_BRACKETED_PASTE);
39
26
  };
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();
48
- return;
27
+ }, []);
28
+ // Use ink's useInput which wraps the callback in reconciler.batchedUpdates().
29
+ // This is critical for LegacyRoot: without batchedUpdates, setState triggers
30
+ // a synchronous commit whose onRender may be throttled, causing Yoga to
31
+ // report stale computed widths and wrapAnsi to break CJK text vertically.
32
+ useInput((keyInput, key) => {
33
+ if (key.ctrl && keyInput === "c") {
34
+ exit();
35
+ return;
36
+ }
37
+ if (busy) {
38
+ return;
39
+ }
40
+ // Bracketed paste: useInput strips the leading \e from the sequence,
41
+ // so a paste arrives as "[200~…content…\e[201~". Re-prepend \e to
42
+ // reconstruct the original sequence for extractBracketedPaste().
43
+ const pasteContent = extractBracketedPaste("\x1b" + keyInput);
44
+ if (pasteContent !== undefined) {
45
+ const cleaned = pasteContent.replace(/[\r\n]+/g, " ").trim();
46
+ if (cleaned) {
47
+ setInput((previous) => previous + cleaned);
49
48
  }
50
- if (busyRef.current)
49
+ return;
50
+ }
51
+ if (key.ctrl && keyInput.toLowerCase() === "b") {
52
+ const nextSession = props.service.cycleInteractiveBackend(session);
53
+ setSession(nextSession);
54
+ setNotice(nextSession.currentBackend === session.currentBackend
55
+ ? "No alternative backend is available."
56
+ : `Switched to ${nextSession.currentBackend}.`);
57
+ return;
58
+ }
59
+ if (key.return) {
60
+ const prompt = input.trim();
61
+ if (!prompt) {
51
62
  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;
97
- }
98
- }
99
- if (action.kind === "text") {
100
- setInput((previous) => previous + action.value);
101
63
  }
102
- };
103
- internal_eventEmitter?.on("input", handleData);
104
- return () => {
105
- internal_eventEmitter?.removeListener("input", handleData);
106
- };
107
- }, [internal_eventEmitter, exit, props.service]);
64
+ setBusy(true);
65
+ setNotice(undefined);
66
+ setInput("");
67
+ void props.service
68
+ .submitInteractivePrompt(session, prompt)
69
+ .then((result) => {
70
+ setSession(result.session);
71
+ setNotice(result.handoff
72
+ ? `Started ${result.session.currentBackend} with handoff from ${result.handoff.source_backend}.`
73
+ : undefined);
74
+ })
75
+ .catch((error) => {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ setSession((previous) => props.service.appendInteractiveMessage(previous, {
78
+ role: "error",
79
+ backend: previous.currentBackend,
80
+ content: message,
81
+ }));
82
+ setNotice(message);
83
+ })
84
+ .finally(() => {
85
+ setBusy(false);
86
+ });
87
+ return;
88
+ }
89
+ if (key.backspace || key.delete) {
90
+ setInput((previous) => deleteLastGrapheme(previous));
91
+ return;
92
+ }
93
+ if (key.ctrl || key.meta || key.escape || !keyInput) {
94
+ return;
95
+ }
96
+ setInput((previous) => previous + keyInput);
97
+ });
108
98
  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 })] }));
109
99
  }
110
100
  //# 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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"}
@@ -21,20 +21,3 @@ export declare const DISABLE_BRACKETED_PASTE = "\u001B[?2004l";
21
21
  * or undefined if no markers are found.
22
22
  */
23
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;
@@ -44,47 +44,4 @@ export function extractBracketedPaste(data) {
44
44
  }
45
45
  return data.slice(contentStart, endIdx);
46
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
47
  //# sourceMappingURL=text-input-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-input-utils.js","sourceRoot":"","sources":["../../../src/interfaces/cli/text-input-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"text-input-utils.js","sourceRoot":"","sources":["../../../src/interfaces/cli/text-input-utils.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAC5C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAC;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,0EAA0E;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
@@ -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.2.1",
704
+ version: "19.2.2",
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.2.1",
3
+ "version": "19.2.2",
4
4
  "displayName": "agentic-relay",
5
5
  "description": "Unified MCP relay for Claude Code, Codex CLI, and Gemini CLI",
6
6
  "type": "module",