@este.systems/dsc 0.1.7 → 0.2.0
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/README.md +111 -31
- package/bin/dsc.mjs +13 -3
- package/dist/agent.js +76 -14
- package/dist/agent.js.map +1 -1
- package/dist/editor.js +37 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.js +5 -60
- package/dist/index.js.map +1 -1
- package/dist/prompt.js +11 -5
- package/dist/prompt.js.map +1 -1
- package/dist/slash.js +59 -0
- package/dist/slash.js.map +1 -0
- package/dist/store.js +44 -0
- package/dist/store.js.map +1 -0
- package/dist/tools.js +145 -1
- package/dist/tools.js.map +1 -1
- package/dist/tui/AgentTaskList.js +31 -0
- package/dist/tui/AgentTaskList.js.map +1 -0
- package/dist/tui/App.js +53 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/ApprovalDialog.js +24 -0
- package/dist/tui/ApprovalDialog.js.map +1 -0
- package/dist/tui/CurrentTurn.js +13 -0
- package/dist/tui/CurrentTurn.js.map +1 -0
- package/dist/tui/History.js +43 -0
- package/dist/tui/History.js.map +1 -0
- package/dist/tui/Input.js +162 -0
- package/dist/tui/Input.js.map +1 -0
- package/dist/tui/Markdown.js +242 -0
- package/dist/tui/Markdown.js.map +1 -0
- package/dist/tui/PromptInput.js +55 -0
- package/dist/tui/PromptInput.js.map +1 -0
- package/dist/tui/QueuedPrompts.js +13 -0
- package/dist/tui/QueuedPrompts.js.map +1 -0
- package/dist/tui/StatusBar.js +50 -0
- package/dist/tui/StatusBar.js.map +1 -0
- package/dist/tui/TaskLine.js +12 -0
- package/dist/tui/TaskLine.js.map +1 -0
- package/dist/tui/useStore.js +17 -0
- package/dist/tui/useStore.js.map +1 -0
- package/dist/tui.js +786 -0
- package/dist/tui.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useStore } from "./useStore.js";
|
|
4
|
+
// Status glyphs — chosen for parity with Claude Code's task-list look.
|
|
5
|
+
// Filled circle for completed, half-filled for in-progress (the only one
|
|
6
|
+
// with motion when read), empty for pending.
|
|
7
|
+
const ICON = {
|
|
8
|
+
pending: "○",
|
|
9
|
+
in_progress: "◐",
|
|
10
|
+
completed: "●",
|
|
11
|
+
};
|
|
12
|
+
const COLOR = {
|
|
13
|
+
pending: "gray",
|
|
14
|
+
in_progress: "yellow",
|
|
15
|
+
completed: "green",
|
|
16
|
+
};
|
|
17
|
+
export function AgentTaskList() {
|
|
18
|
+
const tasks = useStore((s) => s.agentTasks);
|
|
19
|
+
if (tasks.length === 0)
|
|
20
|
+
return null;
|
|
21
|
+
// Hide once every task is done — the list is meant as a working view, not
|
|
22
|
+
// a finished receipt. The model can still recall via task_list.
|
|
23
|
+
const allDone = tasks.every((t) => t.status === "completed");
|
|
24
|
+
if (allDone)
|
|
25
|
+
return null;
|
|
26
|
+
return (_jsx(Box, { flexDirection: "column", marginY: 1, paddingX: 1, children: tasks.map((t) => {
|
|
27
|
+
const label = t.status === "in_progress" && t.activeForm ? t.activeForm : t.subject;
|
|
28
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: COLOR[t.status], children: ICON[t.status] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: COLOR[t.status], strikethrough: t.status === "completed", dimColor: t.status === "completed", children: label })] })] }, t.id));
|
|
29
|
+
}) }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=AgentTaskList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentTaskList.js","sourceRoot":"","sources":["../../src/tui/AgentTaskList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,uEAAuE;AACvE,yEAAyE;AACzE,6CAA6C;AAC7C,MAAM,IAAI,GAAwC;IAChD,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,GAAG;CACf,CAAC;AACF,MAAM,KAAK,GAAwC;IACjD,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,QAAQ;IACrB,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAC7D,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YAChD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,KAAK,GACT,CAAC,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACxE,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,YAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAQ,EACrD,MAAC,IAAI,eACF,GAAG,EACJ,KAAC,IAAI,IACH,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EACtB,aAAa,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW,EACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW,YAEjC,KAAK,GACD,IACF,KAXC,CAAC,CAAC,EAAE,CAYR,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
package/dist/tui/App.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, useApp, useInput } from "ink";
|
|
3
|
+
import { History } from "./History.js";
|
|
4
|
+
import { CurrentTurn } from "./CurrentTurn.js";
|
|
5
|
+
import { TaskLine } from "./TaskLine.js";
|
|
6
|
+
import { ApprovalDialog } from "./ApprovalDialog.js";
|
|
7
|
+
import { StatusBar } from "./StatusBar.js";
|
|
8
|
+
import { PromptInput } from "./PromptInput.js";
|
|
9
|
+
import { AgentTaskList } from "./AgentTaskList.js";
|
|
10
|
+
import { QueuedPrompts } from "./QueuedPrompts.js";
|
|
11
|
+
import { useStore } from "./useStore.js";
|
|
12
|
+
export function App({ onSubmit, onAbort, history }) {
|
|
13
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(History, {}), _jsx(CurrentTurn, {}), _jsx(AgentTaskList, {}), _jsx(TaskLine, {}), _jsx(ApprovalDialog, {}), _jsx(KeyHandlers, { onAbort: onAbort }), _jsx(QueuedPrompts, {}), _jsx(PromptInput, { onSubmit: onSubmit, history: history }), _jsx(StatusBar, {})] }));
|
|
14
|
+
}
|
|
15
|
+
// Global keyboard shortcuts. Mounted alongside PromptInput / ApprovalDialog —
|
|
16
|
+
// ink's useInput fans out to every subscribed component, so each owner gets
|
|
17
|
+
// to react. Approval-active state silences ESC here (the dialog handles ESC
|
|
18
|
+
// itself as a "no" answer).
|
|
19
|
+
function KeyHandlers({ onAbort }) {
|
|
20
|
+
const busy = useStore((s) => s.busy);
|
|
21
|
+
const approvalActive = useStore((s) => s.approval !== null);
|
|
22
|
+
const { exit } = useApp();
|
|
23
|
+
useInput((input, key) => {
|
|
24
|
+
if (approvalActive)
|
|
25
|
+
return;
|
|
26
|
+
if (key.escape && busy) {
|
|
27
|
+
onAbort();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (key.ctrl && input === "c") {
|
|
31
|
+
// Match readline: abort the running turn first; explicit second press
|
|
32
|
+
// (when idle) exits. Idle Ctrl+C just exits — no double-tap dance,
|
|
33
|
+
// since the dynamic frame makes the "(press again)" hint awkward.
|
|
34
|
+
if (busy)
|
|
35
|
+
onAbort();
|
|
36
|
+
else {
|
|
37
|
+
exit();
|
|
38
|
+
process.exit(130);
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (key.ctrl && input === "d" && !busy) {
|
|
43
|
+
// Ctrl+D on an empty prompt is the standard "I'm done" — TextInput
|
|
44
|
+
// doesn't intercept it, so handle here. We don't gate on prompt
|
|
45
|
+
// emptiness because PromptInput owns that state; in practice users
|
|
46
|
+
// press Ctrl+D when they mean to exit.
|
|
47
|
+
exit();
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAUzC,MAAM,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAY;IAC1D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,OAAO,KAAG,EACX,KAAC,WAAW,KAAG,EACf,KAAC,aAAa,KAAG,EACjB,KAAC,QAAQ,KAAG,EACZ,KAAC,cAAc,KAAG,EAClB,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,GAAI,EACjC,KAAC,aAAa,KAAG,EACjB,KAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAI,EACrD,KAAC,SAAS,KAAG,IACT,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,4BAA4B;AAC5B,SAAS,WAAW,CAAC,EAAE,OAAO,EAA2B;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,cAAc;YAAE,OAAO;QAC3B,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,sEAAsE;YACtE,mEAAmE;YACnE,kEAAkE;YAClE,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC;iBACf,CAAC;gBACJ,IAAI,EAAE,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,mEAAmE;YACnE,gEAAgE;YAChE,mEAAmE;YACnE,uCAAuC;YACvC,IAAI,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import { useStore } from "./useStore.js";
|
|
4
|
+
import { setState } from "../store.js";
|
|
5
|
+
export function ApprovalDialog() {
|
|
6
|
+
const approval = useStore((s) => s.approval);
|
|
7
|
+
useInput((input, key) => {
|
|
8
|
+
if (!approval)
|
|
9
|
+
return;
|
|
10
|
+
const ch = input.toLowerCase();
|
|
11
|
+
if (ch === "y") {
|
|
12
|
+
approval.resolve("y");
|
|
13
|
+
setState({ approval: null });
|
|
14
|
+
}
|
|
15
|
+
else if (ch === "n" || key.escape) {
|
|
16
|
+
approval.resolve("n");
|
|
17
|
+
setState({ approval: null });
|
|
18
|
+
}
|
|
19
|
+
}, { isActive: approval !== null });
|
|
20
|
+
if (!approval)
|
|
21
|
+
return null;
|
|
22
|
+
return (_jsxs(Box, { borderStyle: "round", borderColor: "yellow", paddingX: 1, flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: approval.title }), approval.body ? _jsx(Text, { children: approval.body }) : null, _jsxs(Text, { dimColor: true, children: [approval.question, " [y]es / [n]o (Esc rejects)"] })] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ApprovalDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalDialog.js","sourceRoot":"","sources":["../../src/tui/ApprovalDialog.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE7C,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtB,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACpC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtB,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAAE,CAChC,CAAC;IAEF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,QAAQ,EACpB,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,QAAQ,EACtB,YAAY,EAAE,CAAC,aAEf,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,YACtB,QAAQ,CAAC,KAAK,GACV,EACN,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,cAAE,QAAQ,CAAC,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,EACpD,MAAC,IAAI,IAAC,QAAQ,mBAAE,QAAQ,CAAC,QAAQ,mCAAmC,IAChE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useStore } from "./useStore.js";
|
|
3
|
+
import { MessageRow } from "./History.js";
|
|
4
|
+
// The single in-progress assistant message lives outside <Static> so it
|
|
5
|
+
// re-renders on every streamed chunk. Once the agent finalizes the turn,
|
|
6
|
+
// the imperative layer moves it into history and clears `current`.
|
|
7
|
+
export function CurrentTurn() {
|
|
8
|
+
const current = useStore((s) => s.current);
|
|
9
|
+
if (!current)
|
|
10
|
+
return null;
|
|
11
|
+
return _jsx(MessageRow, { message: current, streaming: true });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=CurrentTurn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurrentTurn.js","sourceRoot":"","sources":["../../src/tui/CurrentTurn.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wEAAwE;AACxE,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,KAAC,UAAU,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,SAAG,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Static, Text } from "ink";
|
|
3
|
+
import { useStore } from "./useStore.js";
|
|
4
|
+
import { Markdown } from "./Markdown.js";
|
|
5
|
+
// Finalized messages pushed into <Static> render exactly once each, then
|
|
6
|
+
// scroll into terminal scrollback like any normal stdout output — meaning
|
|
7
|
+
// they're selectable and copy/paste-able.
|
|
8
|
+
export function History() {
|
|
9
|
+
const history = useStore((s) => s.history);
|
|
10
|
+
return (_jsx(Static, { items: history, children: (m) => _jsx(MessageRow, { message: m }, m.id) }));
|
|
11
|
+
}
|
|
12
|
+
export function MessageRow({ message: m, streaming = false }) {
|
|
13
|
+
if (m.role === "tool") {
|
|
14
|
+
const label = m.tool_name ? `← ${m.tool_name}` : "← tool";
|
|
15
|
+
return (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { dimColor: true, children: [label, ": ", truncate(m.content, 600)] }) }));
|
|
16
|
+
}
|
|
17
|
+
if (m.role === "system") {
|
|
18
|
+
// Errors get red; everything else (slash-command output, notices) goes
|
|
19
|
+
// dim so it reads like the REPL's status/info lines rather than a bold
|
|
20
|
+
// header.
|
|
21
|
+
const isError = /^(error|API error|\(interrupted)/i.test(m.content);
|
|
22
|
+
return (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: isError ? "red" : undefined, dimColor: !isError, children: m.content }) }));
|
|
23
|
+
}
|
|
24
|
+
if (m.role === "user") {
|
|
25
|
+
// Highlight the prompt with a subtly different background — no role
|
|
26
|
+
// label, no header. Each physical line is its own Text so the bg color
|
|
27
|
+
// paints behind every line independently (a single Text containing
|
|
28
|
+
// newlines doesn't keep the bg across the break in most terminals).
|
|
29
|
+
const lines = m.content.split("\n");
|
|
30
|
+
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: lines.map((line, i) => (_jsxs(Text, { backgroundColor: "blackBright", children: [" ", line, " "] }, i))) }));
|
|
31
|
+
}
|
|
32
|
+
const renderRich = m.role === "assistant" && !streaming && !!m.content;
|
|
33
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "magenta", children: m.role }), m.reasoning ? (
|
|
34
|
+
// Render reasoning as its own labeled block: a dim "thinking"
|
|
35
|
+
// header with the body indented two columns and styled italic
|
|
36
|
+
// dim. Sits between the assistant label and the answer so the
|
|
37
|
+
// user can skim past it once they trust the model on a task.
|
|
38
|
+
_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { dimColor: true, children: "thinking" }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { dimColor: true, italic: true, children: m.reasoning }) })] })) : null, renderRich ? (_jsx(Markdown, { source: m.content })) : m.content ? (_jsx(Text, { children: m.content })) : null] }));
|
|
39
|
+
}
|
|
40
|
+
function truncate(s, n) {
|
|
41
|
+
return s.length <= n ? s : s.slice(0, n) + "…";
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=History.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/tui/History.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Text, useInput } from "ink";
|
|
4
|
+
import { completeSlash } from "../slash.js";
|
|
5
|
+
/**
|
|
6
|
+
* Single-line controlled input with cursor, arrow-key navigation, history
|
|
7
|
+
* recall (Up/Down), TAB completion for `/slash` commands, and standard
|
|
8
|
+
* line-edit shortcuts. We don't use ink-text-input because we need to own
|
|
9
|
+
* TAB and arrow handling — ink's useInput doesn't support stopping event
|
|
10
|
+
* propagation, so a parallel handler would fight ink-text-input's own
|
|
11
|
+
* processing.
|
|
12
|
+
*
|
|
13
|
+
* The component is "controlled" — `value` and `onChange` come from the
|
|
14
|
+
* parent. Cursor position, history index, and the saved draft (what the
|
|
15
|
+
* user had typed before pressing Up) are local state.
|
|
16
|
+
*/
|
|
17
|
+
export function Input({ value, onChange, onSubmit, focus, history = [] }) {
|
|
18
|
+
const [cursor, setCursor] = useState(value.length);
|
|
19
|
+
// null = editing a fresh line; otherwise an index into `history` (latest = -1
|
|
20
|
+
// is fresh, history.length - 1 is the most recent, 0 is the oldest).
|
|
21
|
+
const [histIdx, setHistIdx] = useState(null);
|
|
22
|
+
// What the user had typed before they started navigating history — restored
|
|
23
|
+
// when they press Down past the newest entry.
|
|
24
|
+
const [draft, setDraft] = useState("");
|
|
25
|
+
// Keep the cursor in range when the parent rewrites `value` (e.g. clears
|
|
26
|
+
// after submit, or completion replaces the whole line).
|
|
27
|
+
if (cursor > value.length) {
|
|
28
|
+
setCursor(value.length);
|
|
29
|
+
}
|
|
30
|
+
const setValueCursor = (next, nextCursor) => {
|
|
31
|
+
onChange(next);
|
|
32
|
+
setCursor(Math.max(0, Math.min(next.length, nextCursor)));
|
|
33
|
+
// User-driven edit cancels history navigation; the displayed line is no
|
|
34
|
+
// longer the historical entry but the user's mutation of it.
|
|
35
|
+
setHistIdx(null);
|
|
36
|
+
};
|
|
37
|
+
useInput((input, key) => {
|
|
38
|
+
if (!focus)
|
|
39
|
+
return;
|
|
40
|
+
if (key.return) {
|
|
41
|
+
// Submit. Reset cursor/history; parent decides what to do with the
|
|
42
|
+
// value (clear it, continue buffering for backslash-multiline, etc.)
|
|
43
|
+
onSubmit(value);
|
|
44
|
+
setCursor(0);
|
|
45
|
+
setHistIdx(null);
|
|
46
|
+
setDraft("");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (key.tab) {
|
|
50
|
+
// Complete a slash command. Only act when the cursor is at the end
|
|
51
|
+
// of the partial — completing mid-text would be jarring.
|
|
52
|
+
const { completion } = completeSlash(value);
|
|
53
|
+
if (completion && completion !== value) {
|
|
54
|
+
setValueCursor(completion, completion.length);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (key.upArrow) {
|
|
59
|
+
if (history.length === 0)
|
|
60
|
+
return;
|
|
61
|
+
if (histIdx === null) {
|
|
62
|
+
setDraft(value);
|
|
63
|
+
const idx = history.length - 1;
|
|
64
|
+
const entry = history[idx];
|
|
65
|
+
setHistIdx(idx);
|
|
66
|
+
onChange(entry);
|
|
67
|
+
setCursor(entry.length);
|
|
68
|
+
}
|
|
69
|
+
else if (histIdx > 0) {
|
|
70
|
+
const idx = histIdx - 1;
|
|
71
|
+
const entry = history[idx];
|
|
72
|
+
setHistIdx(idx);
|
|
73
|
+
onChange(entry);
|
|
74
|
+
setCursor(entry.length);
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (key.downArrow) {
|
|
79
|
+
if (histIdx === null)
|
|
80
|
+
return;
|
|
81
|
+
const nextIdx = histIdx + 1;
|
|
82
|
+
if (nextIdx >= history.length) {
|
|
83
|
+
// Past the newest entry — restore the draft the user was editing.
|
|
84
|
+
setHistIdx(null);
|
|
85
|
+
onChange(draft);
|
|
86
|
+
setCursor(draft.length);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const entry = history[nextIdx];
|
|
90
|
+
setHistIdx(nextIdx);
|
|
91
|
+
onChange(entry);
|
|
92
|
+
setCursor(entry.length);
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (key.leftArrow) {
|
|
97
|
+
setCursor((c) => Math.max(0, c - 1));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (key.rightArrow) {
|
|
101
|
+
setCursor((c) => Math.min(value.length, c + 1));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (key.backspace || key.delete) {
|
|
105
|
+
// Treat both as backspace (delete-before-cursor) — terminal/ink
|
|
106
|
+
// disagree on which key sends which event across platforms, and
|
|
107
|
+
// "backspace deletes left" is the universally expected behavior.
|
|
108
|
+
if (cursor > 0) {
|
|
109
|
+
const next = value.slice(0, cursor - 1) + value.slice(cursor);
|
|
110
|
+
setValueCursor(next, cursor - 1);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Emacs-style line shortcuts that most terminals leak through.
|
|
115
|
+
if (key.ctrl && input === "a") {
|
|
116
|
+
setCursor(0);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (key.ctrl && input === "e") {
|
|
120
|
+
setCursor(value.length);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (key.ctrl && input === "u") {
|
|
124
|
+
// Clear to start of line.
|
|
125
|
+
setValueCursor(value.slice(cursor), 0);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (key.ctrl && input === "k") {
|
|
129
|
+
// Clear to end of line.
|
|
130
|
+
setValueCursor(value.slice(0, cursor), cursor);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (key.ctrl && input === "w") {
|
|
134
|
+
// Delete the word before the cursor.
|
|
135
|
+
const left = value.slice(0, cursor);
|
|
136
|
+
const trimmed = left.replace(/\s*\S+\s*$/, "");
|
|
137
|
+
setValueCursor(trimmed + value.slice(cursor), trimmed.length);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Ignore other ctrl/meta combos — KeyHandlers in App.tsx owns Ctrl+C
|
|
141
|
+
// and Ctrl+D, ApprovalDialog owns its own keys, etc.
|
|
142
|
+
if (key.ctrl || key.meta)
|
|
143
|
+
return;
|
|
144
|
+
// Printable character (or paste — ink delivers multi-char input in a
|
|
145
|
+
// single useInput call when the user pastes). Drop control chars.
|
|
146
|
+
if (input && input.length > 0) {
|
|
147
|
+
const clean = input.replace(/[\x00-\x08\x0b-\x1f]/g, "");
|
|
148
|
+
if (!clean)
|
|
149
|
+
return;
|
|
150
|
+
const next = value.slice(0, cursor) + clean + value.slice(cursor);
|
|
151
|
+
setValueCursor(next, cursor + clean.length);
|
|
152
|
+
}
|
|
153
|
+
}, { isActive: focus });
|
|
154
|
+
// Render: split into [pre-cursor, cursor-char, post-cursor]. The cursor
|
|
155
|
+
// is shown as an inverse-video single cell so it sits on the character
|
|
156
|
+
// it'd act on (or a space at end-of-line).
|
|
157
|
+
const pre = value.slice(0, cursor);
|
|
158
|
+
const at = value[cursor] ?? " ";
|
|
159
|
+
const post = value.slice(cursor + 1);
|
|
160
|
+
return (_jsxs(Text, { children: [pre, focus ? _jsx(Text, { inverse: true, children: at }) : _jsx(Text, { children: at }), post] }));
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../../src/tui/Input.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
export function Markdown({ source }) {
|
|
4
|
+
const blocks = parseBlocks(source);
|
|
5
|
+
return (_jsx(_Fragment, { children: blocks.map((b, i) => (_jsx(Block, { block: b }, i))) }));
|
|
6
|
+
}
|
|
7
|
+
const isTableRow = (l) => {
|
|
8
|
+
const t = l.trim();
|
|
9
|
+
return t.length >= 3 && t.startsWith("|") && t.endsWith("|");
|
|
10
|
+
};
|
|
11
|
+
const isTableSeparator = (l) => /^\s*\|(\s*:?-+:?\s*\|)+\s*$/.test(l);
|
|
12
|
+
function parseTableRow(line) {
|
|
13
|
+
const trimmed = line.trim().replace(/^\|/, "").replace(/\|$/, "");
|
|
14
|
+
return trimmed.split("|").map((c) => c.trim());
|
|
15
|
+
}
|
|
16
|
+
function parseCellEmphasis(raw) {
|
|
17
|
+
// Only recognize the simple "whole-cell bold" pattern. Anything fancier
|
|
18
|
+
// (e.g. partial-cell emphasis) keeps the literal markers — width math
|
|
19
|
+
// would diverge from visible length and the column would skew.
|
|
20
|
+
const m = raw.match(/^\*\*(.+)\*\*$/);
|
|
21
|
+
if (m)
|
|
22
|
+
return { bold: true, text: m[1] };
|
|
23
|
+
return { bold: false, text: raw };
|
|
24
|
+
}
|
|
25
|
+
function parseBlocks(src) {
|
|
26
|
+
const lines = src.split(/\r?\n/);
|
|
27
|
+
const out = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
while (i < lines.length) {
|
|
30
|
+
const line = lines[i];
|
|
31
|
+
// Fenced code block: ``` or ```lang. Collect until matching fence.
|
|
32
|
+
const fence = line.match(/^```(.*)$/);
|
|
33
|
+
if (fence) {
|
|
34
|
+
const lang = fence[1].trim();
|
|
35
|
+
const body = [];
|
|
36
|
+
i++;
|
|
37
|
+
while (i < lines.length && !/^```/.test(lines[i])) {
|
|
38
|
+
body.push(lines[i]);
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
if (i < lines.length)
|
|
42
|
+
i++; // consume the closing ```
|
|
43
|
+
out.push({ kind: "code", lang, lines: body });
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// ATX heading: #, ##, ... (up to 6).
|
|
47
|
+
const h = line.match(/^(#{1,6})\s+(.+)$/);
|
|
48
|
+
if (h) {
|
|
49
|
+
out.push({ kind: "heading", level: h[1].length, text: h[2] });
|
|
50
|
+
i++;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Blockquote run: consecutive `> ` lines.
|
|
54
|
+
if (/^>\s?/.test(line)) {
|
|
55
|
+
const body = [];
|
|
56
|
+
while (i < lines.length && /^>\s?/.test(lines[i])) {
|
|
57
|
+
body.push(lines[i].replace(/^>\s?/, ""));
|
|
58
|
+
i++;
|
|
59
|
+
}
|
|
60
|
+
out.push({ kind: "quote", lines: body });
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Table: header row + separator + zero or more data rows. Recognized by
|
|
64
|
+
// the second line being a separator (|---|---|...) — without that we'd
|
|
65
|
+
// mis-classify any text that happens to start with `|`.
|
|
66
|
+
if (isTableRow(line) && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {
|
|
67
|
+
const rows = [parseTableRow(line)];
|
|
68
|
+
i += 2; // skip header + separator
|
|
69
|
+
while (i < lines.length && isTableRow(lines[i])) {
|
|
70
|
+
if (!isTableSeparator(lines[i]))
|
|
71
|
+
rows.push(parseTableRow(lines[i]));
|
|
72
|
+
i++;
|
|
73
|
+
}
|
|
74
|
+
out.push({ kind: "table", rows });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Bulleted or numbered list: consecutive lines starting with `-`/`*`/`+ ` or `N. `.
|
|
78
|
+
if (/^\s*(?:[-*+]|\d+\.)\s+/.test(line)) {
|
|
79
|
+
const items = [];
|
|
80
|
+
const ordered = /^\s*\d+\.\s+/.test(line);
|
|
81
|
+
while (i < lines.length && /^\s*(?:[-*+]|\d+\.)\s+/.test(lines[i])) {
|
|
82
|
+
items.push(lines[i].replace(/^\s*(?:[-*+]|\d+\.)\s+/, ""));
|
|
83
|
+
i++;
|
|
84
|
+
}
|
|
85
|
+
out.push({ kind: "list", items, ordered });
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
// Blank line.
|
|
89
|
+
if (line.trim() === "") {
|
|
90
|
+
out.push({ kind: "blank" });
|
|
91
|
+
i++;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
// Paragraph: collect contiguous non-special lines.
|
|
95
|
+
const para = [line];
|
|
96
|
+
i++;
|
|
97
|
+
while (i < lines.length &&
|
|
98
|
+
lines[i].trim() !== "" &&
|
|
99
|
+
!/^```/.test(lines[i]) &&
|
|
100
|
+
!/^(#{1,6})\s+/.test(lines[i]) &&
|
|
101
|
+
!/^>\s?/.test(lines[i]) &&
|
|
102
|
+
!/^\s*(?:[-*+]|\d+\.)\s+/.test(lines[i])) {
|
|
103
|
+
para.push(lines[i]);
|
|
104
|
+
i++;
|
|
105
|
+
}
|
|
106
|
+
out.push({ kind: "paragraph", text: para.join(" ") });
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
function Block({ block }) {
|
|
111
|
+
if (block.kind === "blank") {
|
|
112
|
+
return _jsx(Text, { children: " " });
|
|
113
|
+
}
|
|
114
|
+
if (block.kind === "heading") {
|
|
115
|
+
const color = block.level <= 2 ? "cyan" : "magenta";
|
|
116
|
+
return (_jsx(Box, { children: _jsxs(Text, { bold: true, color: color, children: ["#".repeat(block.level), " ", block.text] }) }));
|
|
117
|
+
}
|
|
118
|
+
if (block.kind === "code") {
|
|
119
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 0, children: [block.lang ? (_jsxs(Text, { dimColor: true, children: ["```", block.lang] })) : (_jsx(Text, { dimColor: true, children: "```" })), block.lines.map((l, i) => (_jsxs(Text, { color: "cyan", children: [" ", l] }, i))), _jsx(Text, { dimColor: true, children: "```" })] }));
|
|
120
|
+
}
|
|
121
|
+
if (block.kind === "quote") {
|
|
122
|
+
return (_jsx(Box, { flexDirection: "column", children: block.lines.map((l, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2502 " }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(Inline, { source: l }) })] }, i))) }));
|
|
123
|
+
}
|
|
124
|
+
if (block.kind === "table") {
|
|
125
|
+
// Strip simple **bold** wrappers from each cell so the markers don't
|
|
126
|
+
// appear as literal text. Width measurement uses the stripped length so
|
|
127
|
+
// columns line up regardless of how many cells were emphasized.
|
|
128
|
+
const parsed = block.rows.map((r) => r.map(parseCellEmphasis));
|
|
129
|
+
const cols = Math.max(...parsed.map((r) => r.length));
|
|
130
|
+
const widths = new Array(cols).fill(0);
|
|
131
|
+
for (const r of parsed) {
|
|
132
|
+
for (let j = 0; j < r.length; j++) {
|
|
133
|
+
widths[j] = Math.max(widths[j], r[j].text.length);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return (_jsx(Box, { flexDirection: "column", children: parsed.map((row, i) => (
|
|
137
|
+
// Render the row as one Text node (not a nested Box) so each row
|
|
138
|
+
// occupies exactly one terminal line and there's no flexbox-driven
|
|
139
|
+
// gap between rows. Bold spans inside the row are emitted as
|
|
140
|
+
// inline <Text bold> children — ink composes them into a single
|
|
141
|
+
// styled string. Header row gets bold for the whole line.
|
|
142
|
+
_jsx(Text, { bold: i === 0, children: row.map((cell, j) => {
|
|
143
|
+
// Pad to column width to keep the columns aligned, EXCEPT on
|
|
144
|
+
// the final cell — trailing spaces past the last visible
|
|
145
|
+
// character would push the line over the terminal width, ink
|
|
146
|
+
// would wrap them onto a new line, and that line would render
|
|
147
|
+
// as a phantom blank between rows.
|
|
148
|
+
const isLast = j === row.length - 1;
|
|
149
|
+
const pad = isLast
|
|
150
|
+
? ""
|
|
151
|
+
: " ".repeat(Math.max(0, widths[j] - cell.text.length));
|
|
152
|
+
const sep = isLast ? "" : " │ ";
|
|
153
|
+
return (_jsxs(Text, { children: [_jsx(Text, { bold: cell.bold, children: cell.text }), pad, sep] }, j));
|
|
154
|
+
}) }, i))) }));
|
|
155
|
+
}
|
|
156
|
+
if (block.kind === "list") {
|
|
157
|
+
return (_jsx(Box, { flexDirection: "column", children: block.items.map((it, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: block.ordered ? `${i + 1}. ` : "• " }), _jsx(Text, { children: _jsx(Inline, { source: it }) })] }, i))) }));
|
|
158
|
+
}
|
|
159
|
+
return (_jsx(Box, { children: _jsx(Text, { children: _jsx(Inline, { source: block.text }) }) }));
|
|
160
|
+
}
|
|
161
|
+
// Inline span parser: scans the string left-to-right and emits styled spans
|
|
162
|
+
// for **bold**, *italic*, `code`, [text](url). The unambiguous markers are
|
|
163
|
+
// chosen for predictability — markdown's full inline grammar is famously
|
|
164
|
+
// fiddly, so we keep this dumb-but-deterministic.
|
|
165
|
+
function Inline({ source }) {
|
|
166
|
+
const parts = parseInline(source);
|
|
167
|
+
return (_jsx(_Fragment, { children: parts.map((p, i) => {
|
|
168
|
+
if (typeof p === "string")
|
|
169
|
+
return p;
|
|
170
|
+
if (p.kind === "bold")
|
|
171
|
+
return _jsx(Text, { bold: true, children: p.text }, i);
|
|
172
|
+
if (p.kind === "italic")
|
|
173
|
+
return _jsx(Text, { italic: true, children: p.text }, i);
|
|
174
|
+
if (p.kind === "code")
|
|
175
|
+
return (_jsxs(Text, { color: "cyan", dimColor: true, children: ["`", p.text, "`"] }, i));
|
|
176
|
+
if (p.kind === "link")
|
|
177
|
+
return (_jsxs(Text, { color: "cyan", underline: true, children: [p.text, p.href ? _jsxs(Text, { dimColor: true, children: [" (", p.href, ")"] }) : null] }, i));
|
|
178
|
+
return null;
|
|
179
|
+
}) }));
|
|
180
|
+
}
|
|
181
|
+
function parseInline(src) {
|
|
182
|
+
const out = [];
|
|
183
|
+
let buf = "";
|
|
184
|
+
const flush = () => {
|
|
185
|
+
if (buf.length) {
|
|
186
|
+
out.push(buf);
|
|
187
|
+
buf = "";
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
let i = 0;
|
|
191
|
+
while (i < src.length) {
|
|
192
|
+
// Greedy **bold** before *italic*.
|
|
193
|
+
if (src.startsWith("**", i)) {
|
|
194
|
+
const close = src.indexOf("**", i + 2);
|
|
195
|
+
if (close !== -1) {
|
|
196
|
+
flush();
|
|
197
|
+
out.push({ kind: "bold", text: src.slice(i + 2, close) });
|
|
198
|
+
i = close + 2;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (src[i] === "*" && src[i + 1] !== "*" && src[i + 1] !== " ") {
|
|
203
|
+
const close = src.indexOf("*", i + 1);
|
|
204
|
+
if (close !== -1) {
|
|
205
|
+
flush();
|
|
206
|
+
out.push({ kind: "italic", text: src.slice(i + 1, close) });
|
|
207
|
+
i = close + 1;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (src[i] === "`") {
|
|
212
|
+
const close = src.indexOf("`", i + 1);
|
|
213
|
+
if (close !== -1) {
|
|
214
|
+
flush();
|
|
215
|
+
out.push({ kind: "code", text: src.slice(i + 1, close) });
|
|
216
|
+
i = close + 1;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (src[i] === "[") {
|
|
221
|
+
const closeBracket = src.indexOf("]", i + 1);
|
|
222
|
+
if (closeBracket !== -1 && src[closeBracket + 1] === "(") {
|
|
223
|
+
const closeParen = src.indexOf(")", closeBracket + 2);
|
|
224
|
+
if (closeParen !== -1) {
|
|
225
|
+
flush();
|
|
226
|
+
out.push({
|
|
227
|
+
kind: "link",
|
|
228
|
+
text: src.slice(i + 1, closeBracket),
|
|
229
|
+
href: src.slice(closeBracket + 2, closeParen),
|
|
230
|
+
});
|
|
231
|
+
i = closeParen + 1;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
buf += src[i];
|
|
237
|
+
i++;
|
|
238
|
+
}
|
|
239
|
+
flush();
|
|
240
|
+
return out;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=Markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../src/tui/Markdown.tsx"],"names":[],"mappings":"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"}
|