@rk0429/agentic-relay 19.2.1 → 19.2.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.js +1 -1
- package/dist/interfaces/cli/components/InputBar.js.map +1 -1
- package/dist/interfaces/cli/relay-shell.js +73 -83
- package/dist/interfaces/cli/relay-shell.js.map +1 -1
- package/dist/interfaces/cli/text-input-utils.d.ts +0 -17
- package/dist/interfaces/cli/text-input-utils.js +0 -43
- 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
|
@@ -9,7 +9,7 @@ const SPINNER_FRAMES = [
|
|
|
9
9
|
];
|
|
10
10
|
export function InputBar({ input, busy }) {
|
|
11
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" })] })) }));
|
|
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
13
|
}
|
|
14
14
|
function useSpinner(active) {
|
|
15
15
|
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,
|
|
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,11 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect,
|
|
3
|
-
import { Box, render, useApp,
|
|
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 {
|
|
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
|
-
//
|
|
26
|
-
|
|
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
|
-
}, [
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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":";AAAA,OAAc,EAAE,SAAS,EAAE,
|
|
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":"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":"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.
|
|
704
|
+
version: "19.2.3",
|
|
705
705
|
});
|
|
706
706
|
if (options.allowSpawnAgents) {
|
|
707
707
|
server.registerTool("spawn_agents", {
|