@rk0429/agentic-relay 19.4.2 → 19.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ export function createClaudeStreamingExtractor(onText) {
9
9
  for (const event of lineBuffer.feed(chunk)) {
10
10
  const e = event;
11
11
  if (e.type === "assistant" &&
12
- e.subtype === "text" &&
12
+ (e.subtype === "text" || e.subtype === "thinking") &&
13
13
  typeof e.text === "string") {
14
14
  onText(e.text);
15
15
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-text-extractors.js","sourceRoot":"","sources":["../../../src/infrastructure/backends/streaming-text-extractors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming-text-extractors.js","sourceRoot":"","sources":["../../../src/infrastructure/backends/streaming-text-extractors.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  export interface InputBarProps {
3
3
  input: string;
4
+ cursorPos: number;
4
5
  busy: boolean;
5
6
  }
6
- export declare function InputBar({ input, busy }: InputBarProps): React.ReactNode;
7
+ export declare function InputBar({ input, cursorPos, busy }: InputBarProps): React.ReactNode;
@@ -2,14 +2,17 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { Box, Text } from "ink";
4
4
  import { theme } from "../theme.js";
5
+ import { splitAtGrapheme } from "../text-input-utils.js";
5
6
  const SPINNER_FRAMES = [
6
7
  "\u28CB", "\u28D9", "\u28F9", "\u28F8",
7
8
  "\u28FC", "\u28F4", "\u28E6", "\u28E7",
8
9
  "\u28C7", "\u28CF",
9
10
  ];
10
- export function InputBar({ input, busy }) {
11
+ export function InputBar({ input, cursorPos, busy }) {
11
12
  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 " }), _jsx(Text, { children: input }), _jsx(Text, { dimColor: true, children: "\u2588" })] })) }));
13
+ const [before, rest] = splitAtGrapheme(input, cursorPos);
14
+ const [cursorChar, after] = rest.length > 0 ? splitAtGrapheme(rest, 1) : ["", ""];
15
+ 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 " }), _jsx(Text, { children: before }), cursorChar ? (_jsx(Text, { inverse: true, children: cursorChar })) : (_jsx(Text, { dimColor: true, children: "\u2588" })), _jsx(Text, { children: after })] })) }));
13
16
  }
14
17
  function useSpinner(active) {
15
18
  const [frame, setFrame] = useState(0);
@@ -1 +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,EACzD,KAAC,IAAI,cAAE,KAAK,GAAQ,EACpB,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"}
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;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,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;AAQF,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAiB;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAElF,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,EACzD,KAAC,IAAI,cAAE,MAAM,GAAQ,EACpB,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,IAAI,IAAC,OAAO,kBAAE,UAAU,GAAQ,CAClC,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,QAAQ,GAAQ,CACjC,EACD,KAAC,IAAI,cAAE,KAAK,GAAQ,IACf,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"}
@@ -5,7 +5,7 @@ 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 { deleteLastGrapheme, extractBracketedPaste, ENABLE_BRACKETED_PASTE, DISABLE_BRACKETED_PASTE, } from "./text-input-utils.js";
8
+ import { extractBracketedPaste, graphemeLength, insertAtGrapheme, deleteGraphemeBefore, 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();
@@ -15,6 +15,7 @@ function RelayShellApp(props) {
15
15
  const { exit } = useApp();
16
16
  const [session, setSession] = useState(props.initialSession);
17
17
  const [input, setInput] = useState("");
18
+ const [cursorPos, setCursorPos] = useState(0);
18
19
  const [streamingText, setStreamingText] = useState("");
19
20
  const [busy, setBusy] = useState(false);
20
21
  const [notice, setNotice] = useState();
@@ -45,10 +46,23 @@ function RelayShellApp(props) {
45
46
  if (pasteContent !== undefined) {
46
47
  const cleaned = pasteContent.replace(/[\r\n]+/g, " ").trim();
47
48
  if (cleaned) {
48
- setInput((previous) => previous + cleaned);
49
+ setInput((previous) => {
50
+ const result = insertAtGrapheme(previous, cursorPos, cleaned);
51
+ setCursorPos(result.cursor);
52
+ return result.value;
53
+ });
49
54
  }
50
55
  return;
51
56
  }
57
+ // Arrow keys for cursor movement
58
+ if (key.leftArrow) {
59
+ setCursorPos((pos) => Math.max(0, pos - 1));
60
+ return;
61
+ }
62
+ if (key.rightArrow) {
63
+ setCursorPos((pos) => Math.min(graphemeLength(input), pos + 1));
64
+ return;
65
+ }
52
66
  if (key.ctrl && keyInput.toLowerCase() === "b") {
53
67
  const nextSession = props.service.cycleInteractiveBackend(session);
54
68
  setSession(nextSession);
@@ -65,12 +79,14 @@ function RelayShellApp(props) {
65
79
  if (prompt === "/new") {
66
80
  setSession((prev) => props.service.resetInteractiveSession(prev));
67
81
  setInput("");
82
+ setCursorPos(0);
68
83
  setNotice("Started a new session.");
69
84
  return;
70
85
  }
71
86
  setBusy(true);
72
87
  setNotice(undefined);
73
88
  setInput("");
89
+ setCursorPos(0);
74
90
  setStreamingText("");
75
91
  // Show user prompt immediately (before backend execution completes)
76
92
  setSession((prev) => props.service.appendInteractiveMessage(prev, {
@@ -105,14 +121,22 @@ function RelayShellApp(props) {
105
121
  return;
106
122
  }
107
123
  if (key.backspace || key.delete) {
108
- setInput((previous) => deleteLastGrapheme(previous));
124
+ setInput((previous) => {
125
+ const result = deleteGraphemeBefore(previous, cursorPos);
126
+ setCursorPos(result.cursor);
127
+ return result.value;
128
+ });
109
129
  return;
110
130
  }
111
131
  if (key.ctrl || key.meta || key.escape || !keyInput) {
112
132
  return;
113
133
  }
114
- setInput((previous) => previous + keyInput);
134
+ setInput((previous) => {
135
+ const result = insertAtGrapheme(previous, cursorPos, keyInput);
136
+ setCursorPos(result.cursor);
137
+ return result.value;
138
+ });
115
139
  });
116
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, { session: session }), _jsx(MessageList, { session: session, streamingText: busy ? streamingText : undefined, streamingBackend: busy ? session.currentBackend : undefined }), _jsx(InputBar, { input: input, busy: busy }), _jsx(StatusBar, { notice: notice, busy: busy })] }));
140
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, { session: session }), _jsx(MessageList, { session: session, streamingText: busy ? streamingText : undefined, streamingBackend: busy ? session.currentBackend : undefined }), _jsx(InputBar, { input: input, cursorPos: cursorPos, busy: busy }), _jsx(StatusBar, { notice: notice, busy: busy })] }));
117
141
  }
118
142
  //# 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,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAKpD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAG9C;IACC,MAAM,QAAQ,GAAG,MAAM,CACrB,KAAC,aAAa,IACZ,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,cAAc,EAAE,OAAO,CAAC,cAAc,GACtC,CACH,CAAC;IACF,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC/B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,KAGtB;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAU,CAAC;IAE/C,8DAA8D;IAC9D,8DAA8D;IAC9D,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,8EAA8E;IAC9E,6EAA6E;IAC7E,wEAAwE;IACxE,0EAA0E;IAC1E,QAAQ,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,GAAG,CAAC,IAAI,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,kEAAkE;QAClE,iEAAiE;QACjE,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAC9D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YACnE,UAAU,CAAC,WAAW,CAAC,CAAC;YACxB,SAAS,CACP,WAAW,CAAC,cAAc,KAAK,OAAO,CAAC,cAAc;gBACnD,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,eAAe,WAAW,CAAC,cAAc,GAAG,CACjD,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACb,SAAS,CAAC,wBAAwB,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAErB,oEAAoE;YACpE,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,CAAC,cAAc;gBAC5B,OAAO,EAAE,MAAM;aAChB,CAAC,CACH,CAAC;YAEF,KAAK,KAAK,CAAC,OAAO;iBACf,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE;gBACxC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;aACrE,CAAC;iBACD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC3B,SAAS,CACP,MAAM,CAAC,OAAO;oBACZ,CAAC,CAAC,WAAW,MAAM,CAAC,OAAO,CAAC,cAAc,sBAAsB,MAAM,CAAC,OAAO,CAAC,cAAc,GAAG;oBAChG,CAAC,CAAC,SAAS,CACd,CAAC;YACJ,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACrB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtB,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,QAAQ,EAAE;oBAC/C,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,QAAQ,CAAC,cAAc;oBAChC,OAAO,EAAE,OAAO;iBACjB,CAAC,CACH,CAAC;gBACF,SAAS,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YACL,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,GAAI,EAC5B,KAAC,WAAW,IACV,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAC/C,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,GAC3D,EACF,KAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,EACtC,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAI,IACrC,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"relay-shell.js","sourceRoot":"","sources":["../../../src/interfaces/cli/relay-shell.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,20 @@
5
5
  * and combining characters.
6
6
  */
7
7
  export declare function deleteLastGrapheme(str: string): string;
8
+ /** Count grapheme clusters in a string. */
9
+ export declare function graphemeLength(str: string): number;
10
+ /** Split a string at a grapheme-cluster offset. */
11
+ export declare function splitAtGrapheme(str: string, pos: number): [string, string];
12
+ /** Insert text at a grapheme-cluster offset, returning new string and new cursor position. */
13
+ export declare function insertAtGrapheme(str: string, pos: number, text: string): {
14
+ value: string;
15
+ cursor: number;
16
+ };
17
+ /** Delete the grapheme cluster before a cursor position (backspace). */
18
+ export declare function deleteGraphemeBefore(str: string, pos: number): {
19
+ value: string;
20
+ cursor: number;
21
+ };
8
22
  /**
9
23
  * Bracketed paste mode escape sequences.
10
24
  * When enabled, the terminal wraps pasted text in these markers,
@@ -16,6 +16,39 @@ export function deleteLastGrapheme(str) {
16
16
  const last = segments[segments.length - 1];
17
17
  return str.slice(0, last.index);
18
18
  }
19
+ /** Count grapheme clusters in a string. */
20
+ export function graphemeLength(str) {
21
+ if (str.length === 0)
22
+ return 0;
23
+ let count = 0;
24
+ for (const _ of segmenter.segment(str))
25
+ count++;
26
+ return count;
27
+ }
28
+ /** Split a string at a grapheme-cluster offset. */
29
+ export function splitAtGrapheme(str, pos) {
30
+ if (pos <= 0)
31
+ return ["", str];
32
+ let i = 0;
33
+ for (const { index, segment } of segmenter.segment(str)) {
34
+ if (i === pos)
35
+ return [str.slice(0, index), str.slice(index)];
36
+ i++;
37
+ }
38
+ return [str, ""];
39
+ }
40
+ /** Insert text at a grapheme-cluster offset, returning new string and new cursor position. */
41
+ export function insertAtGrapheme(str, pos, text) {
42
+ const [before, after] = splitAtGrapheme(str, pos);
43
+ return { value: before + text + after, cursor: pos + graphemeLength(text) };
44
+ }
45
+ /** Delete the grapheme cluster before a cursor position (backspace). */
46
+ export function deleteGraphemeBefore(str, pos) {
47
+ if (pos <= 0)
48
+ return { value: str, cursor: 0 };
49
+ const [before, after] = splitAtGrapheme(str, pos);
50
+ return { value: deleteLastGrapheme(before) + after, cursor: pos - 1 };
51
+ }
19
52
  /**
20
53
  * Bracketed paste mode escape sequences.
21
54
  * When enabled, the terminal wraps pasted text in these markers,
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"text-input-utils.js","sourceRoot":"","sources":["../../../src/interfaces/cli/text-input-utils.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.4.2",
704
+ version: "19.4.4",
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.4.2",
3
+ "version": "19.4.4",
4
4
  "displayName": "agentic-relay",
5
5
  "description": "Unified MCP relay for Claude Code, Codex CLI, and Gemini CLI",
6
6
  "type": "module",
@@ -102,6 +102,7 @@
102
102
  "@modelcontextprotocol/sdk": "1.27.1",
103
103
  "ink": "6.3.1",
104
104
  "react": "19.2.0",
105
+ "yaml": "^2.8.2",
105
106
  "zod": "4.3.6"
106
107
  },
107
108
  "devDependencies": {