@chances-ai/tui 24.2.0 → 25.0.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/dist/app.d.ts +22 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +107 -42
- package/dist/app.js.map +1 -1
- package/dist/editor/file-search.d.ts +18 -0
- package/dist/editor/file-search.d.ts.map +1 -0
- package/dist/editor/file-search.js +78 -0
- package/dist/editor/file-search.js.map +1 -0
- package/dist/editor/prompt-editor.d.ts +35 -0
- package/dist/editor/prompt-editor.d.ts.map +1 -0
- package/dist/editor/prompt-editor.js +153 -0
- package/dist/editor/prompt-editor.js.map +1 -0
- package/dist/editor/unified-autocomplete.d.ts +42 -0
- package/dist/editor/unified-autocomplete.d.ts.map +1 -0
- package/dist/editor/unified-autocomplete.js +141 -0
- package/dist/editor/unified-autocomplete.js.map +1 -0
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/ink-ext/keys.d.ts +4 -2
- package/dist/ink-ext/keys.d.ts.map +1 -1
- package/dist/ink-ext/keys.js +47 -5
- package/dist/ink-ext/keys.js.map +1 -1
- package/dist/ink-ext/types.d.ts +1 -1
- package/dist/ink-ext/types.d.ts.map +1 -1
- package/dist/ink-ext/types.js.map +1 -1
- package/dist/keybindings/defaults.d.ts +24 -0
- package/dist/keybindings/defaults.d.ts.map +1 -0
- package/dist/keybindings/defaults.js +21 -0
- package/dist/keybindings/defaults.js.map +1 -0
- package/dist/keybindings/index.d.ts +9 -0
- package/dist/keybindings/index.d.ts.map +1 -0
- package/dist/keybindings/index.js +9 -0
- package/dist/keybindings/index.js.map +1 -0
- package/dist/keybindings/merge.d.ts +25 -0
- package/dist/keybindings/merge.d.ts.map +1 -0
- package/dist/keybindings/merge.js +98 -0
- package/dist/keybindings/merge.js.map +1 -0
- package/dist/keybindings/schema.d.ts +17 -0
- package/dist/keybindings/schema.d.ts.map +1 -0
- package/dist/keybindings/schema.js +16 -0
- package/dist/keybindings/schema.js.map +1 -0
- package/dist/pager.d.ts +19 -0
- package/dist/pager.d.ts.map +1 -0
- package/dist/pager.js +83 -0
- package/dist/pager.js.map +1 -0
- package/dist/slash-typeahead.d.ts +8 -24
- package/dist/slash-typeahead.d.ts.map +1 -1
- package/dist/slash-typeahead.js +8 -67
- package/dist/slash-typeahead.js.map +1 -1
- package/package.json +7 -5
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useStdout } from "ink";
|
|
3
|
+
import { forwardRef, useImperativeHandle, useReducer, useRef, } from "react";
|
|
4
|
+
import { EmacsEditor, layout, nextGraphemeOffset, viewportRows, } from "@chances-ai/ui-core";
|
|
5
|
+
import { native } from "@chances-ai/native";
|
|
6
|
+
import { keyToken, useTextInput, usePasteInput } from "../ink-ext/index.js";
|
|
7
|
+
import { useTheme } from "../theme-context.js";
|
|
8
|
+
/**
|
|
9
|
+
* (7.4 §G5) The editor's width authority — the Rust hot path. `native.measure`
|
|
10
|
+
* is string-width-compatible by construction (emoji-table golden test), i.e.
|
|
11
|
+
* the SAME width Ink uses to lay out text, so layout + cursor never drift.
|
|
12
|
+
* Memoized: each distinct grapheme cluster crosses the JS↔Rust boundary once
|
|
13
|
+
* (a prompt has few distinct clusters) then is cached, avoiding a per-cluster
|
|
14
|
+
* native call on every keystroke. A literal tab measures 0 (string-width's
|
|
15
|
+
* value, = Ink's layout) rather than native's tab-stop expansion. When the
|
|
16
|
+
* `.node` addon is absent, `native.measure` itself falls back to the JS
|
|
17
|
+
* string-width path, so this stays correct everywhere.
|
|
18
|
+
*/
|
|
19
|
+
const MEASURE_CACHE_CAP = 4096; // distinct clusters; pathological pastes can't grow it unbounded (R3-G5)
|
|
20
|
+
const measureCache = new Map();
|
|
21
|
+
const measureCluster = (cluster) => {
|
|
22
|
+
if (cluster === "\t")
|
|
23
|
+
return 0;
|
|
24
|
+
let w = measureCache.get(cluster);
|
|
25
|
+
if (w === undefined) {
|
|
26
|
+
if (measureCache.size >= MEASURE_CACHE_CAP)
|
|
27
|
+
measureCache.clear();
|
|
28
|
+
w = native.measure(cluster);
|
|
29
|
+
measureCache.set(cluster, w);
|
|
30
|
+
}
|
|
31
|
+
return w;
|
|
32
|
+
};
|
|
33
|
+
/** Strip ANSI/OSC escape sequences + C0/C1 control chars (keeping `\n` and `\t`)
|
|
34
|
+
* from pasted text (R3-G5). Raw or split escapes in the buffer would otherwise
|
|
35
|
+
* render as garbage and drift the per-cluster width measurement vs Ink. */
|
|
36
|
+
const ANSI_AND_CONTROL_RE =
|
|
37
|
+
// eslint-disable-next-line no-control-regex
|
|
38
|
+
/\x1b\[[0-?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[@-Z\\-_]|[\x00-\x08\x0b-\x1f\x7f]/g;
|
|
39
|
+
function sanitizePaste(text) {
|
|
40
|
+
return text.replace(ANSI_AND_CONTROL_RE, "");
|
|
41
|
+
}
|
|
42
|
+
/** The `❯` prompt prefix (dim while a turn streams). (Bash-mode `!` indicator
|
|
43
|
+
* is W5 — done there without double-rendering the buffer's leading `!`.) */
|
|
44
|
+
function PromptPrefix({ busy }) {
|
|
45
|
+
const { theme, glyphs } = useTheme();
|
|
46
|
+
return (_jsxs(Text, { color: busy ? undefined : theme.accent, dimColor: busy, children: [glyphs.prompt, " "] }));
|
|
47
|
+
}
|
|
48
|
+
/** Max draft rows shown at once before the input windows around the cursor
|
|
49
|
+
* (§G2 / claude-code viewport scroll) — a long draft never pushes the
|
|
50
|
+
* transcript off-screen; `↑N`/`↓N` indicators show the clipped remainder. */
|
|
51
|
+
const INPUT_MAX_ROWS = 10;
|
|
52
|
+
/** Render the wrapped draft with an inverse-video cursor cell, windowed to
|
|
53
|
+
* `INPUT_MAX_ROWS` around the cursor. Layout + cursor share `measureCluster`
|
|
54
|
+
* (= Ink's string-width, §G5) so rows never re-wrap in Ink and the cursor
|
|
55
|
+
* column matches what's drawn. */
|
|
56
|
+
function EditorRows({ state, width, busy }) {
|
|
57
|
+
const inner = Math.max(1, width - 2); // leave room for the 2-cell prefix/indent
|
|
58
|
+
const lay = layout(state.buffer.text, state.buffer.cursor, inner, measureCluster);
|
|
59
|
+
const vp = viewportRows(lay.rows, lay.cursorRow, INPUT_MAX_ROWS);
|
|
60
|
+
return (_jsxs(Box, { flexDirection: "column", children: [vp.above > 0 ? (_jsxs(Box, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: `⋯ ${vp.above} more line${vp.above === 1 ? "" : "s"} above` })] })) : null, vp.rows.map((row, r) => {
|
|
61
|
+
// The `❯` prefix only on the true first row (nothing hidden above).
|
|
62
|
+
const prefix = r === 0 && vp.above === 0 ? _jsx(PromptPrefix, { busy: busy }) : _jsx(Text, { children: " " });
|
|
63
|
+
if (r !== vp.cursorRow) {
|
|
64
|
+
return (_jsxs(Box, { children: [prefix, _jsx(Text, { children: row.text })] }, row.start));
|
|
65
|
+
}
|
|
66
|
+
const local = state.buffer.cursor - row.start;
|
|
67
|
+
const before = row.text.slice(0, local);
|
|
68
|
+
let cursorChar = " ";
|
|
69
|
+
let after = "";
|
|
70
|
+
if (local < row.text.length) {
|
|
71
|
+
const end = nextGraphemeOffset(state.buffer.text, state.buffer.cursor);
|
|
72
|
+
cursorChar = state.buffer.text.slice(state.buffer.cursor, end);
|
|
73
|
+
after = row.text.slice(local + cursorChar.length);
|
|
74
|
+
}
|
|
75
|
+
return (_jsxs(Box, { children: [prefix, _jsx(Text, { children: before }), _jsx(Text, { inverse: true, children: cursorChar }), _jsx(Text, { children: after })] }, row.start));
|
|
76
|
+
}), vp.below > 0 ? (_jsxs(Box, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: `⋯ ${vp.below} more line${vp.below === 1 ? "" : "s"} below` })] })) : null] }));
|
|
77
|
+
}
|
|
78
|
+
export const PromptEditor = forwardRef(function PromptEditor({ keymap, busy, active, onChange, onEnter }, ref) {
|
|
79
|
+
const { stdout } = useStdout();
|
|
80
|
+
const cols = stdout?.columns ?? 80;
|
|
81
|
+
// The editor instance is stable for the component's life; `force` re-renders.
|
|
82
|
+
const editorRef = useRef(null);
|
|
83
|
+
editorRef.current ??= new EmacsEditor({ keymap, measure: measureCluster });
|
|
84
|
+
const editor = editorRef.current;
|
|
85
|
+
const [, force] = useReducer((c) => c + 1, 0);
|
|
86
|
+
// -- input history (R1-S3: ↑/↓ fall here only when the cursor can't move) --
|
|
87
|
+
const history = useRef([]);
|
|
88
|
+
const histPos = useRef(0); // 0 = editing the live draft; 1 = most recent; …
|
|
89
|
+
const savedDraft = useRef("");
|
|
90
|
+
const setTextInternal = (text) => {
|
|
91
|
+
editor.setText(text);
|
|
92
|
+
onChange(editor.getText());
|
|
93
|
+
force();
|
|
94
|
+
};
|
|
95
|
+
const historyPrev = () => {
|
|
96
|
+
if (history.current.length === 0)
|
|
97
|
+
return;
|
|
98
|
+
if (histPos.current === 0)
|
|
99
|
+
savedDraft.current = editor.getText();
|
|
100
|
+
if (histPos.current < history.current.length)
|
|
101
|
+
histPos.current += 1;
|
|
102
|
+
setTextInternal(history.current[history.current.length - histPos.current]);
|
|
103
|
+
};
|
|
104
|
+
const historyNext = () => {
|
|
105
|
+
if (histPos.current === 0)
|
|
106
|
+
return;
|
|
107
|
+
histPos.current -= 1;
|
|
108
|
+
setTextInternal(histPos.current === 0 ? savedDraft.current : history.current[history.current.length - histPos.current]);
|
|
109
|
+
};
|
|
110
|
+
useImperativeHandle(ref, () => ({
|
|
111
|
+
setText: (text) => {
|
|
112
|
+
histPos.current = 0;
|
|
113
|
+
setTextInternal(text);
|
|
114
|
+
},
|
|
115
|
+
getText: () => editor.getText(),
|
|
116
|
+
}));
|
|
117
|
+
useTextInput("Chat", (input, key) => {
|
|
118
|
+
editor.setWidth(Math.max(1, cols - 2));
|
|
119
|
+
const eff = editor.handle({ kind: "key", token: keyToken(input, key), char: input });
|
|
120
|
+
if (eff.kind === "historyPrev") {
|
|
121
|
+
historyPrev();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (eff.kind === "historyNext") {
|
|
125
|
+
historyNext();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
histPos.current = 0;
|
|
129
|
+
if (eff.kind === "submit") {
|
|
130
|
+
const text = editor.getText();
|
|
131
|
+
const trimmed = text.trim();
|
|
132
|
+
if (trimmed && !busy) {
|
|
133
|
+
const last = history.current[history.current.length - 1];
|
|
134
|
+
if (last !== trimmed)
|
|
135
|
+
history.current.push(trimmed);
|
|
136
|
+
}
|
|
137
|
+
onEnter(text);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
onChange(editor.getText());
|
|
141
|
+
force();
|
|
142
|
+
}, { active });
|
|
143
|
+
usePasteInput("Chat", (text) => {
|
|
144
|
+
histPos.current = 0;
|
|
145
|
+
editor.handle({ kind: "paste", text: sanitizePaste(text) });
|
|
146
|
+
onChange(editor.getText());
|
|
147
|
+
force();
|
|
148
|
+
}, { active });
|
|
149
|
+
if (!active)
|
|
150
|
+
return null;
|
|
151
|
+
return _jsx(EditorRows, { state: editor.getState(), width: cols, busy: busy });
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=prompt-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-editor.js","sourceRoot":"","sources":["../../src/editor/prompt-editor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type JSX } from "react";
|
|
2
|
+
import { type RankHit } from "@chances-ai/native";
|
|
3
|
+
import { type FileList } from "./file-search.js";
|
|
4
|
+
import type { SlashSuggestion } from "../slash-typeahead.js";
|
|
5
|
+
import type { ResourceSuggestion } from "../app.js";
|
|
6
|
+
/**
|
|
7
|
+
* (7.4 / task 04 W5) The unified fuzzy autocomplete (decision `[12.5]`):
|
|
8
|
+
* slash + @file + @agent + @mcp in ONE menu, ranked by the native fuzzy ranker
|
|
9
|
+
* (`fuzzyRank`, W2). Replaces the slash-only `SlashTypeahead` + the ghost-text
|
|
10
|
+
* `MentionAutocomplete`. Lives in the non-modal ink-ext `Autocomplete` context
|
|
11
|
+
* (the user keeps typing to filter); `↑/↓` navigate, `Tab` accepts, `Enter` runs
|
|
12
|
+
* a slash command / inserts a mention, `Esc` dismisses.
|
|
13
|
+
*
|
|
14
|
+
* Trigger detection is pure (`detectCompletion`, ui-core). @file candidates come
|
|
15
|
+
* from the cached workspace file list (git ls-files → native glob, R1-M3);
|
|
16
|
+
* everything is ranked together so it's a single fuzzy list, not grouped.
|
|
17
|
+
*/
|
|
18
|
+
/** An `@agent` candidate. */
|
|
19
|
+
export interface AgentSuggestion {
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface UnifiedAutocompleteProps {
|
|
24
|
+
/** The current draft (cursor-at-end assumption, matches the trigger detector). */
|
|
25
|
+
input: string;
|
|
26
|
+
busy: boolean;
|
|
27
|
+
slashCommands: SlashSuggestion[];
|
|
28
|
+
resources: ResourceSuggestion[];
|
|
29
|
+
agents?: AgentSuggestion[];
|
|
30
|
+
/** Workspace root for @file (default `process.cwd()`). */
|
|
31
|
+
root?: string;
|
|
32
|
+
/** Tab/accept (or Enter on a mention): replace the trigger token in the draft. */
|
|
33
|
+
onComplete: (newInput: string) => void;
|
|
34
|
+
/** Enter on a slash command: run it. */
|
|
35
|
+
onExecute: (line: string) => void;
|
|
36
|
+
/** Test seam: ranker (default native `fuzzyRank` + JS fallback). */
|
|
37
|
+
rank?: (query: string, candidates: string[]) => RankHit[];
|
|
38
|
+
/** Test seam: file-list loader (default git/native, cached). */
|
|
39
|
+
loadFiles?: (root: string) => Promise<FileList>;
|
|
40
|
+
}
|
|
41
|
+
export declare function UnifiedAutocomplete(props: UnifiedAutocompleteProps): JSX.Element | null;
|
|
42
|
+
//# sourceMappingURL=unified-autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-autocomplete.d.ts","sourceRoot":"","sources":["../../src/editor/unified-autocomplete.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD;;;;;;;;;;;GAWG;AAEH,6BAA6B;AAC7B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmBD,MAAM,WAAW,wBAAwB;IACvC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,wCAAwC;IACxC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,oEAAoE;IACpE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC;IAC1D,gEAAgE;IAChE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACjD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAwJvF"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
4
|
+
import { detectCompletion } from "@chances-ai/ui-core";
|
|
5
|
+
import { native } from "@chances-ai/native";
|
|
6
|
+
import { useKeybinding, useKeybindingContext } from "../ink-ext/index.js";
|
|
7
|
+
import { useTheme } from "../theme-context.js";
|
|
8
|
+
import { loadWorkspaceFiles } from "./file-search.js";
|
|
9
|
+
const ICON = { slash: "/", file: "+", agent: "*", mcp: "◇" };
|
|
10
|
+
const MAX_ITEMS = 10;
|
|
11
|
+
export function UnifiedAutocomplete(props) {
|
|
12
|
+
const { input, busy, slashCommands, resources, agents = [], onComplete, onExecute } = props;
|
|
13
|
+
const { theme } = useTheme();
|
|
14
|
+
const rank = props.rank ?? ((q, c) => native.fuzzyRank(q, c, MAX_ITEMS));
|
|
15
|
+
const loadFiles = props.loadFiles ?? loadWorkspaceFiles;
|
|
16
|
+
const root = props.root ?? process.cwd();
|
|
17
|
+
const [selected, setSelected] = useState(0);
|
|
18
|
+
const [dismissed, setDismissed] = useState(false);
|
|
19
|
+
const [fileList, setFileList] = useState(null);
|
|
20
|
+
const trigger = detectCompletion(input);
|
|
21
|
+
// Lazily index the workspace files once, on the first @mention.
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (trigger?.kind !== "mention" || fileList !== null)
|
|
24
|
+
return undefined;
|
|
25
|
+
let alive = true;
|
|
26
|
+
void loadFiles(root).then((r) => {
|
|
27
|
+
if (alive)
|
|
28
|
+
setFileList(r);
|
|
29
|
+
});
|
|
30
|
+
return () => {
|
|
31
|
+
alive = false;
|
|
32
|
+
};
|
|
33
|
+
}, [trigger?.kind, fileList, loadFiles, root]);
|
|
34
|
+
// Reset selection/dismiss whenever the draft changes (filter moved).
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
setSelected(0);
|
|
37
|
+
setDismissed(false);
|
|
38
|
+
}, [input]);
|
|
39
|
+
// (§G3) Derive every directory prefix from the flat file list ONCE per index
|
|
40
|
+
// (e.g. "a/b/c.ts" → "a/", "a/b/"), so @file completion offers expandable
|
|
41
|
+
// directory entries — not just leaf files.
|
|
42
|
+
const directories = useMemo(() => {
|
|
43
|
+
const set = new Set();
|
|
44
|
+
for (const f of fileList?.files ?? []) {
|
|
45
|
+
let idx = f.indexOf("/");
|
|
46
|
+
while (idx !== -1) {
|
|
47
|
+
set.add(f.slice(0, idx + 1)); // keep the trailing slash
|
|
48
|
+
idx = f.indexOf("/", idx + 1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return [...set];
|
|
52
|
+
}, [fileList]);
|
|
53
|
+
const items = useMemo(() => {
|
|
54
|
+
if (!trigger)
|
|
55
|
+
return [];
|
|
56
|
+
const head = input.slice(0, trigger.start);
|
|
57
|
+
const q = trigger.query;
|
|
58
|
+
// An empty query keeps source order at score 0 (so a bare `/` or `@` lists
|
|
59
|
+
// everything); otherwise the native ranker scores + sorts.
|
|
60
|
+
const ranked = (labels) => q === "" ? labels.map((_, i) => ({ index: i, score: 0 })) : rank(q, labels);
|
|
61
|
+
if (trigger.kind === "slash") {
|
|
62
|
+
const labels = slashCommands.map((c) => c.name);
|
|
63
|
+
return ranked(labels)
|
|
64
|
+
.slice(0, MAX_ITEMS)
|
|
65
|
+
.map((h) => {
|
|
66
|
+
const c = slashCommands[h.index];
|
|
67
|
+
return { kind: "slash", label: c.name, insert: `${head}/${c.name} `, detail: c.description, icon: ICON.slash };
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const toItem = (c) => ({
|
|
71
|
+
kind: c.kind,
|
|
72
|
+
label: c.label,
|
|
73
|
+
// Directories insert `@dir/` (no trailing space) → the menu re-detects the
|
|
74
|
+
// mention and browses deeper; files complete with a trailing space.
|
|
75
|
+
insert: c.isDirectory ? `${head}@${c.ref}` : `${head}@${c.ref} `,
|
|
76
|
+
detail: c.detail,
|
|
77
|
+
icon: c.isDirectory ? "▸" : ICON[c.kind],
|
|
78
|
+
isDirectory: c.isDirectory,
|
|
79
|
+
});
|
|
80
|
+
const dirCands = directories.map((d) => ({ kind: "file", label: d, ref: d, isDirectory: true }));
|
|
81
|
+
const fileCands = (fileList?.files ?? []).map((f) => ({ kind: "file", label: f, ref: f }));
|
|
82
|
+
// Directory-browse mode: the query ends with `/` AND looks like a file path
|
|
83
|
+
// (no `:` — an MCP ref is `server:uri`, which must stay in the fuzzy list,
|
|
84
|
+
// R3-G3) → list the dir's entries by prefix, immediate children first.
|
|
85
|
+
if (q.endsWith("/") && !q.includes(":")) {
|
|
86
|
+
const depth = (s) => (s.slice(q.length).match(/\//g) ?? []).length;
|
|
87
|
+
return [...dirCands, ...fileCands]
|
|
88
|
+
.filter((c) => c.label.startsWith(q) && c.label !== q)
|
|
89
|
+
.sort((a, b) => depth(a.label) - depth(b.label) || a.label.localeCompare(b.label))
|
|
90
|
+
.slice(0, MAX_ITEMS)
|
|
91
|
+
.map(toItem);
|
|
92
|
+
}
|
|
93
|
+
const cands = [...dirCands, ...fileCands];
|
|
94
|
+
for (const a of agents)
|
|
95
|
+
cands.push({ kind: "agent", label: a.name, ref: a.name, detail: a.description });
|
|
96
|
+
for (const r of resources)
|
|
97
|
+
cands.push({ kind: "mcp", label: r.ref, ref: r.ref, detail: r.name });
|
|
98
|
+
return ranked(cands.map((c) => c.label))
|
|
99
|
+
.slice(0, MAX_ITEMS)
|
|
100
|
+
.map((h) => toItem(cands[h.index]));
|
|
101
|
+
}, [trigger?.kind, trigger?.query, trigger?.start, input, slashCommands, agents, resources, fileList, directories, rank]);
|
|
102
|
+
const visible = trigger !== null && items.length > 0 && !dismissed;
|
|
103
|
+
const safeIndex = Math.min(selected, Math.max(0, items.length - 1));
|
|
104
|
+
useKeybindingContext("Autocomplete", visible);
|
|
105
|
+
useKeybinding("autocomplete:previous", () => setSelected(Math.max(0, safeIndex - 1)), {
|
|
106
|
+
context: "Autocomplete",
|
|
107
|
+
active: visible,
|
|
108
|
+
});
|
|
109
|
+
useKeybinding("autocomplete:next", () => setSelected(Math.min(items.length - 1, safeIndex + 1)), {
|
|
110
|
+
context: "Autocomplete",
|
|
111
|
+
active: visible,
|
|
112
|
+
});
|
|
113
|
+
useKeybinding("autocomplete:accept", // Tab — insert the selected completion, keep editing
|
|
114
|
+
() => {
|
|
115
|
+
const it = items[safeIndex];
|
|
116
|
+
if (it)
|
|
117
|
+
onComplete(it.insert);
|
|
118
|
+
}, { context: "Autocomplete", active: visible });
|
|
119
|
+
useKeybinding("autocomplete:execute", // Enter — run a slash command, else insert the mention
|
|
120
|
+
() => {
|
|
121
|
+
const it = items[safeIndex];
|
|
122
|
+
if (!it)
|
|
123
|
+
return;
|
|
124
|
+
if (it.kind === "slash") {
|
|
125
|
+
if (!busy)
|
|
126
|
+
onExecute(`/${it.label}`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
onComplete(it.insert);
|
|
130
|
+
}
|
|
131
|
+
}, { context: "Autocomplete", active: visible });
|
|
132
|
+
useKeybinding("autocomplete:dismiss", () => setDismissed(true), { context: "Autocomplete", active: visible });
|
|
133
|
+
if (!visible)
|
|
134
|
+
return null;
|
|
135
|
+
const truncated = trigger?.kind === "mention" && fileList?.truncated;
|
|
136
|
+
return (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [items.map((it, i) => {
|
|
137
|
+
const sel = i === safeIndex;
|
|
138
|
+
return (_jsxs(Text, { color: sel ? theme.permission : undefined, dimColor: !sel, children: [sel ? "❯ " : " ", it.icon, " ", it.label, it.detail ? _jsxs(Text, { dimColor: true, children: [" \u2014 ", it.detail] }) : null] }, `${it.kind}:${it.label}`));
|
|
139
|
+
}), truncated ? _jsx(Text, { dimColor: true, children: " \u2026 file index truncated; refine your query" }) : null] }));
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=unified-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-autocomplete.js","sourceRoot":"","sources":["../../src/editor/unified-autocomplete.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ import type { ModalController } from "./modal.js";
|
|
|
3
3
|
export { ChatViewModel } from "@chances-ai/ui-core";
|
|
4
4
|
export type { Line, LineKind } from "@chances-ai/ui-core";
|
|
5
5
|
export { ChatApp, suggestSlashCommands, suggestResourceMentions, type SlashSuggestion, type ResourceSuggestion, } from "./app.js";
|
|
6
|
-
export {
|
|
6
|
+
export { UnifiedAutocomplete, type UnifiedAutocompleteProps, type AgentSuggestion, } from "./editor/unified-autocomplete.js";
|
|
7
|
+
export { PromptEditor, type PromptEditorHandle, type PromptEditorProps } from "./editor/prompt-editor.js";
|
|
7
8
|
export { ModalController, type OpenModal } from "./modal.js";
|
|
8
9
|
export { ModelPicker, type PickableModel } from "./model-picker.js";
|
|
9
10
|
export { SessionPicker, type PickableSession } from "./session-picker.js";
|
|
@@ -21,6 +22,18 @@ export { Progress } from "./progress.js";
|
|
|
21
22
|
export interface ChatRenderOptions {
|
|
22
23
|
themeSetting?: import("./theme.js").ThemeSetting;
|
|
23
24
|
syntaxHighlight?: boolean;
|
|
25
|
+
/** (7.4) Raw key rebindings from `config.tui.keybindings`. */
|
|
26
|
+
keybindings?: Record<string, Record<string, string | null>>;
|
|
27
|
+
/** (7.4) Agent definitions for `@<agent>` autocomplete. */
|
|
28
|
+
availableAgents?: import("./editor/unified-autocomplete.js").AgentSuggestion[];
|
|
29
|
+
/** (7.4) Active model's context window (tokens) for the footer gauge. A getter
|
|
30
|
+
* is re-read each render so it stays correct after `/model` (R2-S2). */
|
|
31
|
+
contextWindow?: number | (() => number | undefined);
|
|
32
|
+
/** (7.4) Workspace root for `@file` completion (R2-S1). */
|
|
33
|
+
workspaceRoot?: string;
|
|
34
|
+
/** (7.4 §G1) Run a `!`-prefixed line as a local shell command (host-provided).
|
|
35
|
+
* When set, bash mode is live (footer + Enter routes here, not the model). */
|
|
36
|
+
onBashCommand?: (command: string) => void | Promise<void>;
|
|
24
37
|
}
|
|
25
38
|
export interface ChatHandle {
|
|
26
39
|
vm: ChatViewModel;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,8 @@ import { ChatApp } from "./app.js";
|
|
|
4
4
|
import { ChatViewModel } from "@chances-ai/ui-core";
|
|
5
5
|
export { ChatViewModel } from "@chances-ai/ui-core";
|
|
6
6
|
export { ChatApp, suggestSlashCommands, suggestResourceMentions, } from "./app.js";
|
|
7
|
-
export {
|
|
7
|
+
export { UnifiedAutocomplete, } from "./editor/unified-autocomplete.js";
|
|
8
|
+
export { PromptEditor } from "./editor/prompt-editor.js";
|
|
8
9
|
export { ModalController } from "./modal.js";
|
|
9
10
|
export { ModelPicker } from "./model-picker.js";
|
|
10
11
|
export { SessionPicker } from "./session-picker.js";
|
|
@@ -33,7 +34,7 @@ export function renderChat(vm, onSubmit, onSlash, modal, availableSlashCommands,
|
|
|
33
34
|
/** (v22) Cancel the in-flight turn (Esc while streaming). The host owns the
|
|
34
35
|
* CancellationToken; this is invoked from the TUI's `chat:cancel` binding. */
|
|
35
36
|
onInterrupt) {
|
|
36
|
-
const instance = render(_jsx(ChatApp, { vm: vm, onSubmit: onSubmit, onSlash: onSlash, onInterrupt: onInterrupt, modal: modal, availableSlashCommands: availableSlashCommands, availableResources: availableResources, themeSetting: options?.themeSetting, syntaxHighlight: options?.syntaxHighlight }));
|
|
37
|
+
const instance = render(_jsx(ChatApp, { vm: vm, onSubmit: onSubmit, onSlash: onSlash, onInterrupt: onInterrupt, modal: modal, availableSlashCommands: availableSlashCommands, availableResources: availableResources, themeSetting: options?.themeSetting, syntaxHighlight: options?.syntaxHighlight, keybindings: options?.keybindings, availableAgents: options?.availableAgents, contextWindow: options?.contextWindow, workspaceRoot: options?.workspaceRoot, onBashCommand: options?.onBashCommand }));
|
|
37
38
|
return {
|
|
38
39
|
vm,
|
|
39
40
|
// Ink 7 widened `waitUntilExit()` to `Promise<unknown>` (Ink 5 was
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,uBAAuB,GAGxB,MAAM,UAAU,CAAC;AAClB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,uBAAuB,GAGxB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,mBAAmB,GAGpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAmD,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,qEAAqE;AACrE,OAAO,EACL,QAAQ,EACR,cAAc,GAIf,MAAM,gBAAgB,CAAC;AACxB,oEAAoE;AACpE,OAAO,EACL,MAAM,EAGN,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,wEAAwE;AACxE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAiC,MAAM,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA0BzC;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,EAAiB,EACjB,QAA2C,EAC3C,OAAyC,EACzC,KAAuB,EACvB,sBAA6D,EAC7D,kBAA4D,EAC5D,OAA2B;AAC3B;+EAC+E;AAC/E,WAAwB;IAExB,MAAM,QAAQ,GAAG,MAAM,CACrB,KAAC,OAAO,IACN,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,sBAAsB,EAAE,sBAAsB,EAC9C,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,OAAO,EAAE,YAAY,EACnC,eAAe,EAAE,OAAO,EAAE,eAAe,EACzC,WAAW,EAAE,OAAO,EAAE,WAAW,EACjC,eAAe,EAAE,OAAO,EAAE,eAAe,EACzC,aAAa,EAAE,OAAO,EAAE,aAAa,EACrC,aAAa,EAAE,OAAO,EAAE,aAAa,EACrC,aAAa,EAAE,OAAO,EAAE,aAAa,GACrC,CACH,CAAC;IACF,OAAO;QACL,EAAE;QACF,mEAAmE;QACnE,yEAAyE;QACzE,sEAAsE;QACtE,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QACnE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE;KAClC,CAAC;AACJ,CAAC"}
|
package/dist/ink-ext/keys.d.ts
CHANGED
|
@@ -27,8 +27,10 @@ export declare const CONTEXT_SPECS: ContextSpecs;
|
|
|
27
27
|
*
|
|
28
28
|
* Note `Autocomplete.return → autocomplete:execute`: this is how submit-gating
|
|
29
29
|
* works. While the typeahead is active (non-modal, so Chat still receives typed
|
|
30
|
-
* chars), `return` resolves to the typeahead's execute action
|
|
31
|
-
* `
|
|
30
|
+
* chars), `return` resolves to the typeahead's execute action; only when the
|
|
31
|
+
* menu is gone does `return` fall through to the Chat **text sink** → the editor,
|
|
32
|
+
* which decides submit vs newline (docs/7.4 §2.8, §5.1 — `return` is NOT a Chat
|
|
33
|
+
* action binding anymore so the editor can own it for the vim-ready seam).
|
|
32
34
|
*/
|
|
33
35
|
export declare const DEFAULT_BINDINGS: BindingMap;
|
|
34
36
|
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/ink-ext/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/ink-ext/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAsC5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,YAS3B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,UA0D9B,CAAC"}
|
package/dist/ink-ext/keys.js
CHANGED
|
@@ -13,8 +13,17 @@ export function keyToken(input, key) {
|
|
|
13
13
|
// Force exit first — `` is the raw ETX some terminals send for Ctrl-C.
|
|
14
14
|
if (key.ctrl && (input === "c" || input === ""))
|
|
15
15
|
return "ctrl+c";
|
|
16
|
-
|
|
16
|
+
// Modified Return before the plain form (7.4 R1-M2): Shift/Meta+Enter insert a
|
|
17
|
+
// newline in the editor; plain Return falls to the editor's submit/newline
|
|
18
|
+
// decision. (Many terminals can't distinguish Shift+Enter — backslash
|
|
19
|
+
// continuation is the reliable multiline path; see input-mode.ts.)
|
|
20
|
+
if (key.return) {
|
|
21
|
+
if (key.shift)
|
|
22
|
+
return "shift+return";
|
|
23
|
+
if (key.meta)
|
|
24
|
+
return "meta+return";
|
|
17
25
|
return "return";
|
|
26
|
+
}
|
|
18
27
|
if (key.escape)
|
|
19
28
|
return "escape";
|
|
20
29
|
if (key.upArrow)
|
|
@@ -31,12 +40,27 @@ export function keyToken(input, key) {
|
|
|
31
40
|
return "pagedown";
|
|
32
41
|
if (key.tab)
|
|
33
42
|
return key.shift ? "shift+tab" : "tab";
|
|
34
|
-
|
|
43
|
+
// Modified Backspace before the plain form (7.4 R1-M2): Meta/Ctrl+Backspace =
|
|
44
|
+
// delete-word-backward in the editor keymap.
|
|
45
|
+
if (key.backspace) {
|
|
46
|
+
if (key.meta)
|
|
47
|
+
return "meta+backspace";
|
|
48
|
+
if (key.ctrl)
|
|
49
|
+
return "ctrl+backspace";
|
|
35
50
|
return "backspace";
|
|
51
|
+
}
|
|
36
52
|
if (key.delete)
|
|
37
53
|
return "delete";
|
|
38
54
|
if (input === " ")
|
|
39
55
|
return "space";
|
|
56
|
+
// (7.4 R1-M2) Modified letters → canonical `ctrl+<x>` / `meta+<x>`. `meta`
|
|
57
|
+
// matches Ink's `key.meta` (= Alt) + claude-code's default table; these tokens
|
|
58
|
+
// drive the editor's Emacs keymap + keybindings.json. Checked AFTER the
|
|
59
|
+
// special keys above so e.g. ctrl+backspace never falls here.
|
|
60
|
+
if (key.ctrl && /^[A-Za-z_]$/.test(input))
|
|
61
|
+
return `ctrl+${input.toLowerCase()}`;
|
|
62
|
+
if (key.meta && /^[A-Za-z]$/.test(input))
|
|
63
|
+
return `meta+${input.toLowerCase()}`;
|
|
40
64
|
// Printable char (or "" for unmapped keys) — the resolver won't match it, so
|
|
41
65
|
// it falls through to the active text sink.
|
|
42
66
|
return input;
|
|
@@ -54,6 +78,8 @@ export const CONTEXT_SPECS = {
|
|
|
54
78
|
Select: { modal: true },
|
|
55
79
|
Confirmation: { modal: true },
|
|
56
80
|
Modal: { modal: true },
|
|
81
|
+
// (7.4 §G4) The full-screen transcript pager owns the (alt) screen while open.
|
|
82
|
+
Pager: { modal: true },
|
|
57
83
|
};
|
|
58
84
|
/**
|
|
59
85
|
* Default key→action bindings per context. Producers register handlers for
|
|
@@ -64,13 +90,19 @@ export const CONTEXT_SPECS = {
|
|
|
64
90
|
*
|
|
65
91
|
* Note `Autocomplete.return → autocomplete:execute`: this is how submit-gating
|
|
66
92
|
* works. While the typeahead is active (non-modal, so Chat still receives typed
|
|
67
|
-
* chars), `return` resolves to the typeahead's execute action
|
|
68
|
-
* `
|
|
93
|
+
* chars), `return` resolves to the typeahead's execute action; only when the
|
|
94
|
+
* menu is gone does `return` fall through to the Chat **text sink** → the editor,
|
|
95
|
+
* which decides submit vs newline (docs/7.4 §2.8, §5.1 — `return` is NOT a Chat
|
|
96
|
+
* action binding anymore so the editor can own it for the vim-ready seam).
|
|
69
97
|
*/
|
|
70
98
|
export const DEFAULT_BINDINGS = {
|
|
71
99
|
Chat: {
|
|
72
|
-
return
|
|
100
|
+
// `return` is intentionally absent — the editor's text sink handles it
|
|
101
|
+
// (submit/newline decision). Only app-level keys bind here (7.4 R1-M4).
|
|
73
102
|
"shift+tab": "chat:cycleApprovalMode",
|
|
103
|
+
// (§G4) Open the full-screen transcript pager (rebindable; ctrl+o is free —
|
|
104
|
+
// the editor keymap doesn't use it).
|
|
105
|
+
"ctrl+o": "chat:openPager",
|
|
74
106
|
// (v22) Esc interrupts the streaming turn. The handler is gated to `busy`,
|
|
75
107
|
// and a non-busy Esc is a harmless no-op. When the slash typeahead is active
|
|
76
108
|
// the (higher-priority, non-modal) `Autocomplete` context owns `escape`
|
|
@@ -111,5 +143,15 @@ export const DEFAULT_BINDINGS = {
|
|
|
111
143
|
return: "modal:accept",
|
|
112
144
|
escape: "modal:cancel",
|
|
113
145
|
},
|
|
146
|
+
// (§G4) Transcript pager navigation; vim keys (j/k/g/G/b/d/u/q) flow through
|
|
147
|
+
// the modal text sink (like Confirmation's y/n).
|
|
148
|
+
Pager: {
|
|
149
|
+
up: "pager:up",
|
|
150
|
+
down: "pager:down",
|
|
151
|
+
pageup: "pager:pageUp",
|
|
152
|
+
pagedown: "pager:pageDown",
|
|
153
|
+
space: "pager:pageDown",
|
|
154
|
+
escape: "pager:close",
|
|
155
|
+
},
|
|
114
156
|
};
|
|
115
157
|
//# sourceMappingURL=keys.js.map
|
package/dist/ink-ext/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ink-ext/keys.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAY;IAClD,wEAAwE;IACxE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClE,IAAI,GAAG,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ink-ext/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/ink-ext/types.d.ts
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* every context below them (the `if (modalNode) return` gate
|
|
29
29
|
* today, made explicit).
|
|
30
30
|
*/
|
|
31
|
-
export type ContextName = "Global" | "Chat" | "Autocomplete" | "Select" | "Confirmation" | "Modal";
|
|
31
|
+
export type ContextName = "Global" | "Chat" | "Autocomplete" | "Select" | "Confirmation" | "Modal" | "Pager";
|
|
32
32
|
/** An action a context can bind a key to (e.g. `"select:next"`, `"chat:submit"`).
|
|
33
33
|
* Free-form string so producers add their own without touching this package. */
|
|
34
34
|
export type Action = string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ink-ext/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ink-ext/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,MAAM,GACN,cAAc,GACd,QAAQ,GACR,cAAc,GACd,OAAO,GACP,OAAO,CAAC;AAEZ;gFACgF;AAChF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAE5D,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAE9E;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;gDAE4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ink-ext/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ink-ext/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgFH,mFAAmF;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC"}
|