@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.
- 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 +18 -59
- 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/dist/version.js +25 -0
- package/dist/version.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { Input } from "./Input.js";
|
|
5
|
+
import { useStore } from "./useStore.js";
|
|
6
|
+
export function PromptInput({ onSubmit, history }) {
|
|
7
|
+
const busy = useStore((s) => s.busy);
|
|
8
|
+
const approval = useStore((s) => s.approval);
|
|
9
|
+
const [value, setValue] = useState("");
|
|
10
|
+
// Accumulated prior lines from backslash-continuation. Rendered dimly
|
|
11
|
+
// above the active input so the user sees the running buffer.
|
|
12
|
+
const [buffer, setBuffer] = useState([]);
|
|
13
|
+
// When an approval is pending, ApprovalDialog owns the keyboard. We still
|
|
14
|
+
// mount the input so the prompt visually stays put, but disable submit.
|
|
15
|
+
const blocked = !!approval;
|
|
16
|
+
const continuing = buffer.length > 0;
|
|
17
|
+
// ESC clears an in-progress multiline buffer. Gated to non-busy/non-approval
|
|
18
|
+
// so it doesn't fight with the abort and approval-dialog handlers.
|
|
19
|
+
useInput((_input, key) => {
|
|
20
|
+
if (key.escape && continuing) {
|
|
21
|
+
setBuffer([]);
|
|
22
|
+
setValue("");
|
|
23
|
+
}
|
|
24
|
+
}, { isActive: !blocked && !busy && continuing });
|
|
25
|
+
const handleSubmit = (v) => {
|
|
26
|
+
if (blocked)
|
|
27
|
+
return;
|
|
28
|
+
// Bash-style continuation: odd number of trailing backslashes means
|
|
29
|
+
// "keep going on the next line" — strip the final backslash, push the
|
|
30
|
+
// rest into the buffer, clear the input. Even count (e.g. \\) is a
|
|
31
|
+
// literal trailing backslash and the line submits.
|
|
32
|
+
const trailing = (v.match(/\\+$/) || [""])[0].length;
|
|
33
|
+
if (trailing % 2 === 1) {
|
|
34
|
+
setBuffer((b) => [...b, v.slice(0, -1)]);
|
|
35
|
+
setValue("");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const full = [...buffer, v].join("\n").trim();
|
|
39
|
+
setBuffer([]);
|
|
40
|
+
setValue("");
|
|
41
|
+
if (!full)
|
|
42
|
+
return;
|
|
43
|
+
onSubmit(full);
|
|
44
|
+
};
|
|
45
|
+
const promptChar = blocked
|
|
46
|
+
? "? "
|
|
47
|
+
: continuing
|
|
48
|
+
? "… "
|
|
49
|
+
: busy
|
|
50
|
+
? "… "
|
|
51
|
+
: "> ";
|
|
52
|
+
const promptColor = blocked ? "gray" : busy || continuing ? "yellow" : "green";
|
|
53
|
+
return (_jsxs(Box, { flexDirection: "column", children: [buffer.map((line, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2026 " }), _jsx(Text, { children: line })] }, i))), _jsxs(Box, { children: [_jsx(Text, { bold: true, color: promptColor, children: promptChar }), _jsx(Input, { value: value, onChange: setValue, onSubmit: handleSubmit, focus: !blocked, history: history })] })] }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=PromptInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromptInput.js","sourceRoot":"","sources":["../../src/tui/PromptInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useStore } from "./useStore.js";
|
|
4
|
+
// Renders the type-ahead queue above the prompt input. Each pending line
|
|
5
|
+
// is shown dim with a "→" marker, so the user can confirm what's about
|
|
6
|
+
// to run after the current turn finishes. Hidden when the queue is empty.
|
|
7
|
+
export function QueuedPrompts() {
|
|
8
|
+
const queue = useStore((s) => s.queue);
|
|
9
|
+
if (queue.length === 0)
|
|
10
|
+
return null;
|
|
11
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { dimColor: true, children: ["queued (", queue.length, "):"] }), queue.map((line, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2192 " }), _jsx(Text, { dimColor: true, children: line })] }, i)))] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=QueuedPrompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueuedPrompts.js","sourceRoot":"","sources":["../../src/tui/QueuedPrompts.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,yEAAyE;AACzE,uEAAuE;AACvE,0EAA0E;AAC1E,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,IAAI,IAAC,QAAQ,+BAAU,KAAK,CAAC,MAAM,UAAU,EAC7C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,8BAAU,EACxB,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,KAFpB,CAAC,CAGL,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useStdout } from "ink";
|
|
3
|
+
import { useStore } from "./useStore.js";
|
|
4
|
+
function formatCount(n) {
|
|
5
|
+
if (n >= 1_000_000)
|
|
6
|
+
return (n / 1_000_000).toFixed(1) + "M";
|
|
7
|
+
if (n >= 1_000)
|
|
8
|
+
return (n / 1_000).toFixed(1) + "K";
|
|
9
|
+
return String(n);
|
|
10
|
+
}
|
|
11
|
+
function formatDuration(s) {
|
|
12
|
+
const h = Math.floor(s / 3600);
|
|
13
|
+
const m = Math.floor((s % 3600) / 60);
|
|
14
|
+
const sec = s % 60;
|
|
15
|
+
if (h > 0)
|
|
16
|
+
return `${h}:${String(m).padStart(2, "0")}:${String(sec).padStart(2, "0")}`;
|
|
17
|
+
return `${m}:${String(sec).padStart(2, "0")}`;
|
|
18
|
+
}
|
|
19
|
+
export function StatusBar() {
|
|
20
|
+
const s = useStore((x) => x);
|
|
21
|
+
const { stdout } = useStdout();
|
|
22
|
+
const width = stdout?.columns ?? 80;
|
|
23
|
+
const flags = (s.yolo ? " yolo" : "") +
|
|
24
|
+
(!s.reasoning ? " no-reasoning" : "") +
|
|
25
|
+
(s.compacted ? " compacted" : "");
|
|
26
|
+
const cache = s.cacheHitTokens > 0 || s.cacheMissTokens > 0
|
|
27
|
+
? ` (h:${formatCount(s.cacheHitTokens)} m:${formatCount(s.cacheMissTokens)})`
|
|
28
|
+
: "";
|
|
29
|
+
const left = `${s.model}${flags} · $${s.cost.toFixed(4)} ` +
|
|
30
|
+
`▲${formatCount(s.inTokens)}${cache} ▼${formatCount(s.outTokens)} ` +
|
|
31
|
+
`ctx:${formatCount(s.contextTokens)}` +
|
|
32
|
+
(s.queueDepth > 0 ? ` queued:${s.queueDepth}` : "");
|
|
33
|
+
const right = s.busy
|
|
34
|
+
? s.task
|
|
35
|
+
? `${s.task}`
|
|
36
|
+
: "thinking"
|
|
37
|
+
: formatDuration(s.sessionSeconds);
|
|
38
|
+
// Pad left + right to fill terminal width so the reverse-video block
|
|
39
|
+
// spans edge-to-edge without wrapping. The rendered line is framed by a
|
|
40
|
+
// single leading + trailing space, so subtract 2 from `width` to leave
|
|
41
|
+
// room for them.
|
|
42
|
+
const inner = Math.max(0, width - 2);
|
|
43
|
+
const rightLen = right.length;
|
|
44
|
+
const leftMax = Math.max(0, inner - rightLen - 1);
|
|
45
|
+
const leftClipped = left.length > leftMax ? left.slice(0, Math.max(0, leftMax - 1)) + "…" : left;
|
|
46
|
+
const padCount = Math.max(1, inner - leftClipped.length - rightLen);
|
|
47
|
+
const line = ` ${leftClipped}${" ".repeat(padCount)}${right} `;
|
|
48
|
+
return (_jsx(Box, { children: _jsx(Text, { inverse: true, children: line }) }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/tui/StatusBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useStore } from "./useStore.js";
|
|
4
|
+
// One-line indicator for the currently-running tool, e.g. "→ bash(npm test)".
|
|
5
|
+
// Shown only while busy AND a tool is in flight.
|
|
6
|
+
export function TaskLine() {
|
|
7
|
+
const task = useStore((s) => s.task);
|
|
8
|
+
if (!task)
|
|
9
|
+
return null;
|
|
10
|
+
return (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: ["\u2192 ", task] }) }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=TaskLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskLine.js","sourceRoot":"","sources":["../../src/tui/TaskLine.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,8EAA8E;AAC9E,iDAAiD;AACjD,MAAM,UAAU,QAAQ;IACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,QAAQ,8BAAI,IAAI,IAAQ,GAC1B,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { getState, subscribe } from "../store.js";
|
|
3
|
+
// React hook that selects a slice of store state and re-renders the
|
|
4
|
+
// component when that slice changes (referential equality check by default).
|
|
5
|
+
//
|
|
6
|
+
// const messages = useStore((s) => s.history);
|
|
7
|
+
export function useStore(selector, equalityFn = Object.is) {
|
|
8
|
+
const [value, setValue] = useState(() => selector(getState()));
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
return subscribe(() => {
|
|
11
|
+
const next = selector(getState());
|
|
12
|
+
setValue((prev) => (equalityFn(prev, next) ? prev : next));
|
|
13
|
+
});
|
|
14
|
+
}, [selector, equalityFn]);
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=useStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStore.js","sourceRoot":"","sources":["../../src/tui/useStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAC;AAEnE,oEAAoE;AACpE,6EAA6E;AAC7E,EAAE;AACF,+CAA+C;AAC/C,MAAM,UAAU,QAAQ,CACtB,QAA8B,EAC9B,aAAsC,MAAM,CAAC,EAAE;IAE/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/D,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,SAAS,CAAC,GAAG,EAAE;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC"}
|