@rk0429/agentic-relay 19.4.1 → 19.4.3
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/InputBar.d.ts +2 -1
- package/dist/interfaces/cli/components/InputBar.js +5 -2
- package/dist/interfaces/cli/components/InputBar.js.map +1 -1
- package/dist/interfaces/cli/relay-shell.js +35 -5
- package/dist/interfaces/cli/relay-shell.js.map +1 -1
- package/dist/interfaces/cli/text-input-utils.d.ts +14 -0
- package/dist/interfaces/cli/text-input-utils.js +33 -0
- package/dist/interfaces/cli/text-input-utils.js.map +1 -1
- package/dist/interfaces/mcp/relay-mcp-server.js +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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;
|
|
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 {
|
|
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) =>
|
|
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,13 +79,21 @@ 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("");
|
|
91
|
+
// Show user prompt immediately (before backend execution completes)
|
|
92
|
+
setSession((prev) => props.service.appendInteractiveMessage(prev, {
|
|
93
|
+
role: "user",
|
|
94
|
+
backend: prev.currentBackend,
|
|
95
|
+
content: prompt,
|
|
96
|
+
}));
|
|
75
97
|
void props.service
|
|
76
98
|
.submitInteractivePrompt(session, prompt, {
|
|
77
99
|
onStreamingText: (chunk) => setStreamingText((prev) => prev + chunk),
|
|
@@ -99,14 +121,22 @@ function RelayShellApp(props) {
|
|
|
99
121
|
return;
|
|
100
122
|
}
|
|
101
123
|
if (key.backspace || key.delete) {
|
|
102
|
-
setInput((previous) =>
|
|
124
|
+
setInput((previous) => {
|
|
125
|
+
const result = deleteGraphemeBefore(previous, cursorPos);
|
|
126
|
+
setCursorPos(result.cursor);
|
|
127
|
+
return result.value;
|
|
128
|
+
});
|
|
103
129
|
return;
|
|
104
130
|
}
|
|
105
131
|
if (key.ctrl || key.meta || key.escape || !keyInput) {
|
|
106
132
|
return;
|
|
107
133
|
}
|
|
108
|
-
setInput((previous) =>
|
|
134
|
+
setInput((previous) => {
|
|
135
|
+
const result = insertAtGrapheme(previous, cursorPos, keyInput);
|
|
136
|
+
setCursorPos(result.cursor);
|
|
137
|
+
return result.value;
|
|
138
|
+
});
|
|
109
139
|
});
|
|
110
|
-
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 })] }));
|
|
111
141
|
}
|
|
112
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,
|
|
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.
|
|
704
|
+
version: "19.4.3",
|
|
705
705
|
});
|
|
706
706
|
if (options.allowSpawnAgents) {
|
|
707
707
|
server.registerTool("spawn_agents", {
|