@dreb/coding-agent 2.51.0 → 2.52.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 +7 -5
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -6
- package/dist/cli/args.js.map +1 -1
- package/dist/core/extensions/types.d.ts +31 -11
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/tools/ask-user.d.ts +28 -20
- package/dist/core/tools/ask-user.d.ts.map +1 -1
- package/dist/core/tools/ask-user.js +130 -106
- package/dist/core/tools/ask-user.js.map +1 -1
- package/dist/core/tools/index.d.ts +9 -7
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/modes/interactive/components/ask-wizard.d.ts +83 -0
- package/dist/modes/interactive/components/ask-wizard.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-wizard.js +464 -0
- package/dist/modes/interactive/components/ask-wizard.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +4 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +100 -20
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +18 -7
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/dashboard.md +1 -1
- package/docs/extensions.md +35 -18
- package/docs/rpc.md +26 -8
- package/examples/extensions/rpc-demo.ts +29 -0
- package/examples/rpc-extension-ui.ts +162 -6
- package/package.json +1 -1
- package/dist/modes/interactive/components/ask-user.d.ts +0 -59
- package/dist/modes/interactive/components/ask-user.d.ts.map +0 -1
- package/dist/modes/interactive/components/ask-user.js +0 -240
- package/dist/modes/interactive/components/ask-user.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-wizard.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/ask-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ask_user multi-question wizard.\n *\n * Renders one {@link AskRequest} — which carries one or more clarifying\n * questions — as a single native wizard and returns the batch of answers, one\n * {@link AskAnswer} per question, in order.\n *\n * Layout:\n * - Single question (N==1): compact inline panel with no tab strip.\n * - Multiple questions (N>=2): a compact tab strip at the top (one tab per\n * question plus a trailing \"✔ Submit\" review tab). Only the active tab is\n * rendered and receives keyboard input.\n *\n * Keyboard model:\n * ↑/↓ move a single cursor through the options and, last, the field\n * 1..9 select (single) or toggle (multi) the numbered option\n * Space toggle the highlighted checkbox (multi-select only)\n * Enter single-select: pick the highlighted option, then advance/submit;\n * free-text field: advance/submit the typed answer;\n * review tab: submit the whole batch\n * Shift+Enter insert a newline in a multiline free-text field\n * Tab/Shift+Tab switch to the next/previous tab (N>=2)\n * ←/→ switch tabs when the cursor is not on the free-text field (N>=2)\n * Esc stop the current agent turn\n */\n\nimport {\n\ttype Component,\n\tContainer,\n\tEditor,\n\ttype Focusable,\n\tgetKeybindings,\n\tInput,\n\tMarkdown,\n\tmatchesKey,\n\tSpacer,\n\tText,\n\ttype TUI,\n} from \"@dreb/tui\";\nimport type { AskAnswer, AskQuestion, AskRequest, AskResult } from \"../../../core/extensions/types.js\";\nimport { getEditorTheme, getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { CountdownTimer } from \"./countdown-timer.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.js\";\n\nexport interface AskWizardComponentOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n}\n\n/**\n * Left-indents a child component (the question Markdown, or the free-text\n * Input/Editor) so it aligns with the wizard's answer block instead of jutting\n * out to the terminal margin. Focus and input still route to the wrapped field\n * directly; only rendering is shifted.\n */\nclass Indented implements Component {\n\tconstructor(\n\t\tprivate child: Component,\n\t\tprivate pad: number,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst prefix = \" \".repeat(this.pad);\n\t\treturn this.child.render(Math.max(1, width - this.pad)).map((line) => prefix + line);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.child.invalidate?.();\n\t}\n}\n\n/** Left indent (columns) aligning the question and free-text field with the\n * answer block (past the cursor gutter and the \"N.\" number). */\nconst BODY_INDENT = 3;\n\n/** Per-question draft state (selection + cursor). Free text lives in `fields`. */\ninterface Draft {\n\tselected: string[];\n\tcursorIndex: number;\n}\n\nexport class AskWizardComponent extends Container implements Focusable {\n\tprivate questions: AskQuestion[];\n\tprivate drafts: Draft[];\n\t/** Stable per-question free-text fields, created once and reused. */\n\tprivate fields: (Input | Editor | undefined)[];\n\tprivate requestTitle: string | undefined;\n\n\t/** 0..N-1 are question tabs; index N is the review/Submit tab (N>=2 only). */\n\tprivate activeTab = 0;\n\n\tprivate onSubmitCallback: (result: AskResult) => void;\n\tprivate onStopCallback: () => void;\n\tprivate countdown: CountdownTimer | undefined;\n\tprivate countdownSeconds: number | undefined;\n\tprivate submitted = false;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.syncFieldFocus();\n\t}\n\n\tconstructor(\n\t\trequest: AskRequest,\n\t\tonSubmit: (result: AskResult) => void,\n\t\tonStop: () => void,\n\t\topts?: AskWizardComponentOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.questions = request.questions ?? [];\n\t\tthis.requestTitle = request.title?.trim() || undefined;\n\t\tthis.onSubmitCallback = onSubmit;\n\t\tthis.onStopCallback = onStop;\n\n\t\tthis.drafts = this.questions.map(() => ({ selected: [], cursorIndex: 0 }));\n\n\t\tthis.fields = this.questions.map((q) => {\n\t\t\tconst allowFree = q.allowFreeText !== false;\n\t\t\tif (!allowFree) return undefined;\n\t\t\tif (q.multiline && opts?.tui) {\n\t\t\t\t// Never wire editor.onSubmit — Enter is intercepted here so the editor\n\t\t\t\t// keeps its text (it clears itself on submit) across tab switches.\n\t\t\t\treturn new Editor(opts.tui, getEditorTheme(), {});\n\t\t\t}\n\t\t\treturn new Input();\n\t\t});\n\n\t\tif (opts?.timeout && opts.timeout > 0 && opts.tui) {\n\t\t\tthis.countdown = new CountdownTimer(\n\t\t\t\topts.timeout,\n\t\t\t\topts.tui,\n\t\t\t\t(s) => {\n\t\t\t\t\tthis.countdownSeconds = s;\n\t\t\t\t\tthis.rebuild();\n\t\t\t\t},\n\t\t\t\t() => this.stop(),\n\t\t\t);\n\t\t}\n\n\t\tthis.rebuild();\n\t\tthis.syncFieldFocus();\n\t}\n\n\t// --- Per-question helpers -------------------------------------------------\n\n\tprivate optionsFor(i: number): string[] {\n\t\treturn this.questions[i]?.options ?? [];\n\t}\n\n\tprivate isMultiSelect(i: number): boolean {\n\t\treturn this.questions[i]?.multiSelect === true && this.optionsFor(i).length > 0;\n\t}\n\n\tprivate allowFreeText(i: number): boolean {\n\t\treturn this.questions[i]?.allowFreeText !== false;\n\t}\n\n\t/** Cursor row index of the free-text field, or -1 when there is none. */\n\tprivate freeTextRow(i: number): number {\n\t\treturn this.allowFreeText(i) ? this.optionsFor(i).length : -1;\n\t}\n\n\tprivate lastRow(i: number): number {\n\t\tconst opts = this.optionsFor(i).length;\n\t\treturn this.allowFreeText(i) ? opts : opts - 1;\n\t}\n\n\tprivate cursorOnField(i: number): boolean {\n\t\treturn this.allowFreeText(i) && this.drafts[i].cursorIndex === this.freeTextRow(i);\n\t}\n\n\tprivate fieldText(i: number): string {\n\t\tconst field = this.fields[i];\n\t\tif (field instanceof Editor) return field.getText();\n\t\tif (field instanceof Input) return field.getValue();\n\t\treturn \"\";\n\t}\n\n\tprivate isAnswered(i: number): boolean {\n\t\treturn this.drafts[i].selected.length > 0 || this.fieldText(i).trim().length > 0;\n\t}\n\n\t/** Full (untruncated) tab title, whitespace-normalized. */\n\tprivate fullTitle(i: number): string {\n\t\tconst q = this.questions[i];\n\t\treturn (q.title?.trim() || q.question || \"\").replace(/\\s+/g, \" \");\n\t}\n\n\tprivate shortTitle(i: number): string {\n\t\tconst raw = this.fullTitle(i);\n\t\treturn raw.length > 18 ? `${raw.slice(0, 17)}…` : raw;\n\t}\n\n\tprivate countdownSuffix(): string {\n\t\treturn this.countdownSeconds != null ? theme.fg(\"muted\", ` (${this.countdownSeconds}s)`) : \"\";\n\t}\n\n\t// --- Rendering ------------------------------------------------------------\n\n\t/** Full-width accent rule bounding the wizard, à la Claude Code. */\n\tprivate rule(): Component {\n\t\treturn new DynamicBorder((s) => theme.fg(\"accent\", s));\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.clear();\n\t\tconst n = this.questions.length;\n\t\tthis.addChild(this.rule());\n\t\tif (n === 1) {\n\t\t\tthis.addChild(new Text(this.singleHeader(0), 1, 0));\n\t\t\tthis.addQuestionPanel(0);\n\t\t} else {\n\t\t\tthis.addChild(new Text(this.buildTabStrip(), 1, 0));\n\t\t\tif (this.activeTab < n) {\n\t\t\t\tthis.addQuestionPanel(this.activeTab);\n\t\t\t} else {\n\t\t\t\tthis.addReviewPanel();\n\t\t\t}\n\t\t}\n\t\tthis.addChild(this.rule());\n\t}\n\n\tprivate singleHeader(i: number): string {\n\t\tconst base = this.questions[i]?.title?.trim() || this.requestTitle || \"Question\";\n\t\treturn theme.fg(\"accent\", theme.bold(base)) + this.countdownSuffix();\n\t}\n\n\tprivate buildTabStrip(): string {\n\t\tconst n = this.questions.length;\n\t\tconst parts = this.questions.map((_, i) => {\n\t\t\tconst marker = this.isAnswered(i) ? \"●\" : \"○\";\n\t\t\t// The active tab shows its full title; the rest stay truncated so the\n\t\t\t// strip stays compact.\n\t\t\tconst title = i === this.activeTab ? this.fullTitle(i) : this.shortTitle(i);\n\t\t\tconst label = `${i + 1}.${marker} ${title}`;\n\t\t\treturn i === this.activeTab ? theme.fg(\"accent\", theme.bold(label)) : theme.fg(\"muted\", label);\n\t\t});\n\t\tconst submitLabel = \"✔ Submit\";\n\t\tparts.push(this.activeTab === n ? theme.fg(\"accent\", theme.bold(submitLabel)) : theme.fg(\"muted\", submitLabel));\n\t\treturn parts.join(\" \") + this.countdownSuffix();\n\t}\n\n\tprivate addQuestionPanel(i: number): void {\n\t\tconst q = this.questions[i];\n\t\tconst draft = this.drafts[i];\n\t\tconst opts = this.optionsFor(i);\n\t\tconst multiSelect = this.isMultiSelect(i);\n\n\t\t// Blank line + indented question aligned with the answer block below, so\n\t\t// the prompt reads as a heading over its options rather than crowding them.\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Indented(new Markdown(q.question, 0, 0, getMarkdownTheme(), undefined, true), BODY_INDENT));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tfor (let j = 0; j < opts.length; j++) {\n\t\t\tconst focused = draft.cursorIndex === j;\n\t\t\tconst chosen = draft.selected.includes(opts[j]);\n\t\t\tconst cursor = focused ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst num = `${j + 1}.`;\n\t\t\t// Multi-select keeps checkboxes; single-select drops the radio glyph and\n\t\t\t// relies on the green check + accent label to mark the chosen answer.\n\t\t\tlet marker: string;\n\t\t\tif (multiSelect) {\n\t\t\t\tconst box = chosen ? \"[x]\" : \"[ ]\";\n\t\t\t\tmarker = chosen ? theme.fg(\"accent\", box) : box;\n\t\t\t} else {\n\t\t\t\tmarker = chosen ? theme.fg(\"accent\", \"✔\") : \" \";\n\t\t\t}\n\t\t\tconst label = focused || chosen ? theme.fg(\"accent\", opts[j]) : theme.fg(\"text\", opts[j]);\n\t\t\tthis.addChild(new Text(`${cursor}${num} ${marker} ${label}`, 1, 0));\n\t\t}\n\n\t\tif (this.allowFreeText(i)) {\n\t\t\tconst onField = this.cursorOnField(i);\n\t\t\tconst prefix = onField ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst labelText = opts.length > 0 ? \"Or type your own answer:\" : \"Your answer:\";\n\t\t\tthis.addChild(\n\t\t\t\tnew Text(prefix + (onField ? theme.fg(\"accent\", labelText) : theme.fg(\"muted\", labelText)), 1, 0),\n\t\t\t);\n\t\t\tconst field = this.fields[i];\n\t\t\t// Indent the field so it aligns under the label instead of sitting at the\n\t\t\t// terminal margin like the main prompt — keeps focus visually inside the\n\t\t\t// wizard, consistent with the option rows.\n\t\t\tif (field) this.addChild(new Indented(field, BODY_INDENT));\n\t\t}\n\n\t\tthis.addChild(new Text(this.buildHint(i), 1, 0));\n\t}\n\n\tprivate buildHint(i: number): string {\n\t\tconst n = this.questions.length;\n\t\tconst parts = [rawKeyHint(\"↑↓\", \"move\")];\n\t\tif (this.isMultiSelect(i)) parts.push(rawKeyHint(\"Space\", \"toggle\"));\n\t\tif (n >= 2) parts.push(rawKeyHint(\"⇥\", \"switch\"));\n\t\tparts.push(keyHint(\"tui.select.confirm\", n === 1 ? \"submit\" : \"next\"));\n\t\tif (this.questions[i]?.multiline) parts.push(keyHint(\"tui.input.newLine\", \"newline\"));\n\t\tparts.push(keyHint(\"tui.select.cancel\", \"stop\"));\n\t\treturn parts.join(\" \");\n\t}\n\n\tprivate addReviewPanel(): void {\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Review your answers\")) + this.countdownSuffix(), 1, 0));\n\t\tfor (let i = 0; i < this.questions.length; i++) {\n\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `• ${this.shortTitle(i)} → ${this.answerSummary(i)}`), 1, 0));\n\t\t}\n\t\tconst hint = [\n\t\t\tkeyHint(\"tui.select.confirm\", \"submit\"),\n\t\t\trawKeyHint(\"⇥\", \"switch\"),\n\t\t\tkeyHint(\"tui.select.cancel\", \"stop\"),\n\t\t].join(\" \");\n\t\tthis.addChild(new Text(hint, 1, 0));\n\t}\n\n\tprivate answerSummary(i: number): string {\n\t\tconst draft = this.drafts[i];\n\t\tconst opts = this.optionsFor(i);\n\t\tconst selected = this.isMultiSelect(i)\n\t\t\t? opts.filter((o) => draft.selected.includes(o))\n\t\t\t: draft.selected.slice(0, 1);\n\t\tconst custom = this.fieldText(i).trim();\n\t\tconst parts = [...selected];\n\t\tif (custom) parts.push(custom);\n\t\treturn parts.length > 0 ? parts.join(\", \") : \"(unanswered)\";\n\t}\n\n\t// --- Focus ----------------------------------------------------------------\n\n\tprivate syncFieldFocus(): void {\n\t\tthis.fields.forEach((field, i) => {\n\t\t\tif (!field) return;\n\t\t\tfield.focused = this._focused && this.activeTab === i && this.cursorOnField(i);\n\t\t});\n\t}\n\n\t// --- Navigation -----------------------------------------------------------\n\n\tprivate moveCursor(delta: number): void {\n\t\tconst i = this.activeTab;\n\t\tconst first = this.optionsFor(i).length > 0 ? 0 : Math.max(0, this.freeTextRow(i));\n\t\tconst next = Math.max(first, Math.min(this.lastRow(i), this.drafts[i].cursorIndex + delta));\n\t\tif (next === this.drafts[i].cursorIndex) return;\n\t\tthis.drafts[i].cursorIndex = next;\n\t\tthis.rebuild();\n\t\tthis.syncFieldFocus();\n\t}\n\n\tprivate switchTab(delta: number): void {\n\t\tconst n = this.questions.length;\n\t\tif (n < 2) return;\n\t\tconst total = n + 1; // question tabs + review tab\n\t\tthis.activeTab = (this.activeTab + delta + total) % total;\n\t\tthis.rebuild();\n\t\tthis.syncFieldFocus();\n\t}\n\n\t/** Move to the next tab, or submit when there is nowhere left to go. */\n\tprivate advanceOrSubmit(i: number): void {\n\t\tif (this.questions.length === 1) {\n\t\t\tthis.submit();\n\t\t\treturn;\n\t\t}\n\t\tthis.activeTab = i + 1; // next question, or the review tab (index N)\n\t\tthis.rebuild();\n\t\tthis.syncFieldFocus();\n\t}\n\n\tprivate toggle(i: number, option: string): void {\n\t\tconst draft = this.drafts[i];\n\t\tconst at = draft.selected.indexOf(option);\n\t\tif (at === -1) draft.selected.push(option);\n\t\telse draft.selected.splice(at, 1);\n\t}\n\n\t// --- Submit / stop --------------------------------------------------------\n\n\tprivate answerFor(i: number): AskAnswer {\n\t\tconst draft = this.drafts[i];\n\t\tconst opts = this.optionsFor(i);\n\t\tconst customText = this.fieldText(i).trim() || undefined;\n\t\tif (this.isMultiSelect(i)) {\n\t\t\tconst selected = opts.filter((o) => draft.selected.includes(o));\n\t\t\tif (selected.length === 0 && !customText) return { selected: [], skipped: true };\n\t\t\treturn { selected, customText };\n\t\t}\n\t\tconst selected = draft.selected.slice(0, 1);\n\t\tif (selected.length === 0 && !customText) return { selected: [], skipped: true };\n\t\treturn { selected, customText };\n\t}\n\n\tprivate submit(): void {\n\t\tif (this.submitted) return;\n\t\tthis.submitted = true;\n\t\tthis.countdown?.dispose();\n\t\tconst answers = this.questions.map((_, i) => this.answerFor(i));\n\t\tthis.onSubmitCallback({ answers });\n\t}\n\n\tprivate stop(): void {\n\t\tif (this.submitted) return;\n\t\tthis.submitted = true;\n\t\tthis.countdown?.dispose();\n\t\tthis.onStopCallback();\n\t}\n\n\t// --- Input ----------------------------------------------------------------\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tconst n = this.questions.length;\n\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.stop();\n\t\t\treturn;\n\t\t}\n\n\t\t// Tab / Shift+Tab switch tabs before any field sees the key so switching\n\t\t// works regardless of which sub-field currently holds focus.\n\t\tif (n >= 2) {\n\t\t\tif (matchesKey(keyData, \"shift+tab\") || keyData === \"\\x1b[Z\") {\n\t\t\t\tthis.switchTab(-1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (kb.matches(keyData, \"tui.input.tab\") || keyData === \"\\t\") {\n\t\t\t\tthis.switchTab(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Review tab: Enter submits; arrows switch tabs.\n\t\tif (n >= 2 && this.activeTab === n) {\n\t\t\tif (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\" || keyData === \"\\r\") {\n\t\t\t\tthis.submit();\n\t\t\t} else if (keyData === \"\\x1b[D\") {\n\t\t\t\tthis.switchTab(-1);\n\t\t\t} else if (keyData === \"\\x1b[C\") {\n\t\t\t\tthis.switchTab(1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst i = this.activeTab;\n\n\t\t// Free-text field has focus: delegate editing, intercept Enter/leave keys.\n\t\tif (this.cursorOnField(i)) {\n\t\t\tconst field = this.fields[i];\n\t\t\tif (field instanceof Editor) {\n\t\t\t\tif (kb.matches(keyData, \"tui.select.up\") && field.getCursor().line === 0) {\n\t\t\t\t\tthis.moveCursor(-1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Shift+Enter (and bare LF newline) insert a line; real Enter advances.\n\t\t\t\tif (kb.matches(keyData, \"tui.input.newLine\") || keyData === \"\\n\") {\n\t\t\t\t\tfield.handleInput(keyData);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\t\t\tthis.advanceOrSubmit(i);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfield.handleInput(keyData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (field instanceof Input) {\n\t\t\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\t\t\tthis.moveCursor(-1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\" || keyData === \"\\r\") {\n\t\t\t\t\tthis.advanceOrSubmit(i);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfield.handleInput(keyData);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Cursor on an option row (or an option-less field-only question handled above).\n\t\tconst opts = this.optionsFor(i);\n\n\t\t// Numeric shortcuts select/toggle an option by its 1-based index.\n\t\tif (keyData.length === 1 && keyData >= \"1\" && keyData <= \"9\") {\n\t\t\tconst index = keyData.charCodeAt(0) - 49; // '1' -> 0\n\t\t\tif (index < opts.length) {\n\t\t\t\tif (this.isMultiSelect(i)) {\n\t\t\t\t\tthis.toggle(i, opts[index]);\n\t\t\t\t} else {\n\t\t\t\t\tthis.drafts[i].selected = [opts[index]];\n\t\t\t\t\tthis.drafts[i].cursorIndex = index;\n\t\t\t\t}\n\t\t\t\tthis.rebuild();\n\t\t\t\tthis.syncFieldFocus();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tthis.moveCursor(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tthis.moveCursor(1);\n\t\t\treturn;\n\t\t}\n\t\tif (n >= 2 && keyData === \"\\x1b[D\") {\n\t\t\tthis.switchTab(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (n >= 2 && keyData === \"\\x1b[C\") {\n\t\t\tthis.switchTab(1);\n\t\t\treturn;\n\t\t}\n\t\tif (this.isMultiSelect(i) && keyData === \" \") {\n\t\t\tthis.toggle(i, opts[this.drafts[i].cursorIndex]);\n\t\t\tthis.rebuild();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\" || keyData === \"\\r\") {\n\t\t\tconst option = opts[this.drafts[i].cursorIndex];\n\t\t\tif (option !== undefined && !this.isMultiSelect(i)) {\n\t\t\t\tthis.drafts[i].selected = [option];\n\t\t\t}\n\t\t\tthis.advanceOrSubmit(i);\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}
|
|
@@ -200,11 +200,13 @@ export declare class InteractiveMode {
|
|
|
200
200
|
*/
|
|
201
201
|
private hideExtensionInput;
|
|
202
202
|
/**
|
|
203
|
-
* Show a rich ask_user
|
|
203
|
+
* Show a rich multi-question ask_user wizard for extensions/built-in tools.
|
|
204
|
+
* One call renders one wizard; the whole batch resolves together on Submit,
|
|
205
|
+
* and Esc/timeout stops the current turn.
|
|
204
206
|
*/
|
|
205
207
|
private showExtensionAsk;
|
|
206
208
|
/**
|
|
207
|
-
* Hide the ask_user
|
|
209
|
+
* Hide the ask_user wizard.
|
|
208
210
|
*/
|
|
209
211
|
private hideExtensionAsk;
|
|
210
212
|
/**
|