@este.systems/dsc 0.1.6 → 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.
Files changed (45) hide show
  1. package/README.md +111 -31
  2. package/bin/dsc.mjs +13 -3
  3. package/dist/agent.js +76 -14
  4. package/dist/agent.js.map +1 -1
  5. package/dist/editor.js +37 -0
  6. package/dist/editor.js.map +1 -0
  7. package/dist/index.js +18 -59
  8. package/dist/index.js.map +1 -1
  9. package/dist/prompt.js +11 -5
  10. package/dist/prompt.js.map +1 -1
  11. package/dist/slash.js +59 -0
  12. package/dist/slash.js.map +1 -0
  13. package/dist/store.js +44 -0
  14. package/dist/store.js.map +1 -0
  15. package/dist/tools.js +145 -1
  16. package/dist/tools.js.map +1 -1
  17. package/dist/tui/AgentTaskList.js +31 -0
  18. package/dist/tui/AgentTaskList.js.map +1 -0
  19. package/dist/tui/App.js +53 -0
  20. package/dist/tui/App.js.map +1 -0
  21. package/dist/tui/ApprovalDialog.js +24 -0
  22. package/dist/tui/ApprovalDialog.js.map +1 -0
  23. package/dist/tui/CurrentTurn.js +13 -0
  24. package/dist/tui/CurrentTurn.js.map +1 -0
  25. package/dist/tui/History.js +43 -0
  26. package/dist/tui/History.js.map +1 -0
  27. package/dist/tui/Input.js +162 -0
  28. package/dist/tui/Input.js.map +1 -0
  29. package/dist/tui/Markdown.js +242 -0
  30. package/dist/tui/Markdown.js.map +1 -0
  31. package/dist/tui/PromptInput.js +55 -0
  32. package/dist/tui/PromptInput.js.map +1 -0
  33. package/dist/tui/QueuedPrompts.js +13 -0
  34. package/dist/tui/QueuedPrompts.js.map +1 -0
  35. package/dist/tui/StatusBar.js +50 -0
  36. package/dist/tui/StatusBar.js.map +1 -0
  37. package/dist/tui/TaskLine.js +12 -0
  38. package/dist/tui/TaskLine.js.map +1 -0
  39. package/dist/tui/useStore.js +17 -0
  40. package/dist/tui/useStore.js.map +1 -0
  41. package/dist/tui.js +786 -0
  42. package/dist/tui.js.map +1 -0
  43. package/dist/version.js +25 -0
  44. package/dist/version.js.map +1 -0
  45. 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"}
@@ -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":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAS;IAC7E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,8EAA8E;IAC9E,qEAAqE;IACrE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5D,4EAA4E;IAC5E,8CAA8C;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,yEAAyE;IACzE,wDAAwD;IACxD,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAE,EAAE;QAC1D,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1D,wEAAwE;QACxE,6DAA6D;QAC7D,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,mEAAmE;YACnE,qEAAqE;YACrE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,SAAS,CAAC,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,mEAAmE;YACnE,yDAAyD;YACzD,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,UAAU,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBACvC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACjC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC3B,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC3B,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO;YAC7B,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;YAC5B,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC9B,kEAAkE;gBAClE,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/B,UAAU,CAAC,OAAO,CAAC,CAAC;gBACpB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,gEAAgE;YAChE,gEAAgE;YAChE,iEAAiE;YACjE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9D,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC;YACD,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,SAAS,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,0BAA0B;YAC1B,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,wBAAwB;YACxB,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,qCAAqC;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC/C,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,qDAAqD;QACrD,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO;QAEjC,qEAAqE;QACrE,kEAAkE;QAClE,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB,CAAC;IAEF,wEAAwE;IACxE,uEAAuE;IACvE,2CAA2C;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,OAAO,CACL,MAAC,IAAI,eACF,GAAG,EACH,KAAK,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,OAAO,kBAAE,EAAE,GAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,cAAE,EAAE,GAAQ,EACrD,IAAI,IACA,CACR,CAAC;AACJ,CAAC"}
@@ -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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"}