@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.
Files changed (52) hide show
  1. package/dist/app.d.ts +22 -1
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +107 -42
  4. package/dist/app.js.map +1 -1
  5. package/dist/editor/file-search.d.ts +18 -0
  6. package/dist/editor/file-search.d.ts.map +1 -0
  7. package/dist/editor/file-search.js +78 -0
  8. package/dist/editor/file-search.js.map +1 -0
  9. package/dist/editor/prompt-editor.d.ts +35 -0
  10. package/dist/editor/prompt-editor.d.ts.map +1 -0
  11. package/dist/editor/prompt-editor.js +153 -0
  12. package/dist/editor/prompt-editor.js.map +1 -0
  13. package/dist/editor/unified-autocomplete.d.ts +42 -0
  14. package/dist/editor/unified-autocomplete.d.ts.map +1 -0
  15. package/dist/editor/unified-autocomplete.js +141 -0
  16. package/dist/editor/unified-autocomplete.js.map +1 -0
  17. package/dist/index.d.ts +14 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/ink-ext/keys.d.ts +4 -2
  22. package/dist/ink-ext/keys.d.ts.map +1 -1
  23. package/dist/ink-ext/keys.js +47 -5
  24. package/dist/ink-ext/keys.js.map +1 -1
  25. package/dist/ink-ext/types.d.ts +1 -1
  26. package/dist/ink-ext/types.d.ts.map +1 -1
  27. package/dist/ink-ext/types.js.map +1 -1
  28. package/dist/keybindings/defaults.d.ts +24 -0
  29. package/dist/keybindings/defaults.d.ts.map +1 -0
  30. package/dist/keybindings/defaults.js +21 -0
  31. package/dist/keybindings/defaults.js.map +1 -0
  32. package/dist/keybindings/index.d.ts +9 -0
  33. package/dist/keybindings/index.d.ts.map +1 -0
  34. package/dist/keybindings/index.js +9 -0
  35. package/dist/keybindings/index.js.map +1 -0
  36. package/dist/keybindings/merge.d.ts +25 -0
  37. package/dist/keybindings/merge.d.ts.map +1 -0
  38. package/dist/keybindings/merge.js +98 -0
  39. package/dist/keybindings/merge.js.map +1 -0
  40. package/dist/keybindings/schema.d.ts +17 -0
  41. package/dist/keybindings/schema.d.ts.map +1 -0
  42. package/dist/keybindings/schema.js +16 -0
  43. package/dist/keybindings/schema.js.map +1 -0
  44. package/dist/pager.d.ts +19 -0
  45. package/dist/pager.d.ts.map +1 -0
  46. package/dist/pager.js +83 -0
  47. package/dist/pager.js.map +1 -0
  48. package/dist/slash-typeahead.d.ts +8 -24
  49. package/dist/slash-typeahead.d.ts.map +1 -1
  50. package/dist/slash-typeahead.js +8 -67
  51. package/dist/slash-typeahead.js.map +1 -1
  52. 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 { SlashTypeahead } from "./slash-typeahead.js";
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;
@@ -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,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EACL,QAAQ,EACR,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,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;AAEzC,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,YAAY,EAAE,YAAY,CAAC;IACjD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,aAAa,CAAC;IAClB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC3C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACzC,KAAK,CAAC,EAAE,eAAe,EACvB,sBAAsB,CAAC,EAAE,OAAO,UAAU,EAAE,eAAe,EAAE,EAC7D,kBAAkB,CAAC,EAAE,OAAO,UAAU,EAAE,kBAAkB,EAAE,EAC5D,OAAO,CAAC,EAAE,iBAAiB;AAC3B;+EAC+E;AAC/E,WAAW,CAAC,EAAE,MAAM,IAAI,GACvB,UAAU,CAsBZ"}
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 { SlashTypeahead } from "./slash-typeahead.js";
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,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,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;AAczC;;;;;;;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,GACzC,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"}
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"}
@@ -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 BEFORE Chat's
31
- * `chat:submit` the menu must be acted on or dismissed first.
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,CAkB5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,YAO3B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,EAAE,UA4C9B,CAAC"}
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"}
@@ -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
- if (key.return)
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
- if (key.backspace)
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 BEFORE Chat's
68
- * `chat:submit` the menu must be acted on or dismissed first.
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: "chat:submit",
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
@@ -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;QAAE,OAAO,QAAQ,CAAC;IAChC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAChC,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IACjC,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IACjC,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAChC,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAChC,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClC,6EAA6E;IAC7E,4CAA4C;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;IACxB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;IACtB,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;IAC9B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;IACvB,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;IAC7B,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;CACvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,IAAI,EAAE;QACJ,MAAM,EAAE,aAAa;QACrB,WAAW,EAAE,wBAAwB;QACrC,2EAA2E;QAC3E,6EAA6E;QAC7E,wEAAwE;QACxE,2DAA2D;QAC3D,MAAM,EAAE,aAAa;KACtB;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,uBAAuB;QAC3B,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE,qBAAqB;QAC1B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;KAC/B;IACD,MAAM,EAAE;QACN,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,aAAa;QACnB,4EAA4E;QAC5E,sEAAsE;QACtE,oEAAoE;QACpE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,eAAe;QACvB,KAAK,EAAE,eAAe;KACvB;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,gBAAgB;KACxB;IACD,wEAAwE;IACxE,mEAAmE;IACnE,KAAK,EAAE;QACL,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;KACvB;CACF,CAAC"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ink-ext/keys.ts"],"names":[],"mappings":"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"}
@@ -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,GAAG,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC;AAEnG;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
+ {"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;AAyEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC"}
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"}