@astralyn/pi 0.87.4 → 0.87.6
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/CHANGELOG.md +33 -0
- package/dist/bundle/chunks/{chunk-CUDKRZ2V.js → chunk-4W4Q2H6W.js} +58 -57
- package/dist/bundle/chunks/{chunk-ANT4TSUE.js → chunk-IORR2FW4.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-Y2YZRMU3.js → virtual-modules-KUEIEAZN.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +8 -24
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +54 -109
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/background/session.d.ts +11 -7
- package/dist/core/background/session.d.ts.map +1 -1
- package/dist/core/background/session.js +42 -16
- package/dist/core/background/session.js.map +1 -1
- package/dist/core/context-snapshot.d.ts +17 -4
- package/dist/core/context-snapshot.d.ts.map +1 -1
- package/dist/core/context-snapshot.js +48 -50
- package/dist/core/context-snapshot.js.map +1 -1
- package/dist/core/extensions/distribution-api.d.ts +0 -7
- package/dist/core/extensions/distribution-api.d.ts.map +1 -1
- package/dist/core/extensions/distribution-api.js +6 -6
- package/dist/core/extensions/distribution-api.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +3 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -5
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +10 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +3 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +59 -7
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -3
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +0 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +0 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +0 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +0 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +0 -7
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +0 -11
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +59 -5
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/edit.d.ts.map +1 -1
- package/dist/core/tools/renderers/edit.js +4 -22
- package/dist/core/tools/renderers/edit.js.map +1 -1
- package/dist/core/tools/renderers/find.d.ts.map +1 -1
- package/dist/core/tools/renderers/find.js +7 -6
- package/dist/core/tools/renderers/find.js.map +1 -1
- package/dist/core/tools/renderers/grep.d.ts.map +1 -1
- package/dist/core/tools/renderers/grep.js +8 -7
- package/dist/core/tools/renderers/grep.js.map +1 -1
- package/dist/core/tools/renderers/ls.d.ts.map +1 -1
- package/dist/core/tools/renderers/ls.js +3 -2
- package/dist/core/tools/renderers/ls.js.map +1 -1
- package/dist/core/tools/renderers/read.d.ts.map +1 -1
- package/dist/core/tools/renderers/read.js +7 -12
- package/dist/core/tools/renderers/read.js.map +1 -1
- package/dist/core/tools/renderers/write.d.ts.map +1 -1
- package/dist/core/tools/renderers/write.js +3 -2
- package/dist/core/tools/renderers/write.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +2 -6
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +5 -4
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/extensions/background/completion-render.d.ts.map +1 -1
- package/dist/extensions/background/completion-render.js +3 -4
- package/dist/extensions/background/completion-render.js.map +1 -1
- package/dist/extensions/background/constants.d.ts +2 -0
- package/dist/extensions/background/constants.d.ts.map +1 -1
- package/dist/extensions/background/constants.js +2 -0
- package/dist/extensions/background/constants.js.map +1 -1
- package/dist/extensions/background/index.d.ts.map +1 -1
- package/dist/extensions/background/index.js +31 -5
- package/dist/extensions/background/index.js.map +1 -1
- package/dist/extensions/question/detail-pane.d.ts +12 -0
- package/dist/extensions/question/detail-pane.d.ts.map +1 -0
- package/dist/extensions/question/detail-pane.js +42 -0
- package/dist/extensions/question/detail-pane.js.map +1 -0
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +175 -105
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/option-window.d.ts +26 -0
- package/dist/extensions/question/option-window.d.ts.map +1 -0
- package/dist/extensions/question/option-window.js +53 -0
- package/dist/extensions/question/option-window.js.map +1 -0
- package/dist/extensions/question/render-cache.d.ts +4 -4
- package/dist/extensions/question/render-cache.d.ts.map +1 -1
- package/dist/extensions/question/render-cache.js +10 -11
- package/dist/extensions/question/render-cache.js.map +1 -1
- package/dist/extensions/todo/constants.d.ts +1 -1
- package/dist/extensions/todo/constants.d.ts.map +1 -1
- package/dist/extensions/todo/constants.js +2 -2
- package/dist/extensions/todo/constants.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js +12 -8
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/schema.d.ts +1 -0
- package/dist/extensions/todo/schema.d.ts.map +1 -1
- package/dist/extensions/todo/schema.js +1 -1
- package/dist/extensions/todo/schema.js.map +1 -1
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +15 -5
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts +4 -4
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +11 -30
- package/dist/extensions/todo/view.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/status-marker.d.ts +2 -2
- package/dist/modes/interactive/components/status-marker.js +2 -2
- package/dist/modes/interactive/components/status-marker.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -10
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -3
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tool-view/chat.d.ts +20 -0
- package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -0
- package/dist/modes/interactive/tool-view/chat.js +46 -0
- package/dist/modes/interactive/tool-view/chat.js.map +1 -0
- package/dist/modes/interactive/tool-view/fallback.d.ts +14 -0
- package/dist/modes/interactive/tool-view/fallback.d.ts.map +1 -0
- package/dist/modes/interactive/tool-view/fallback.js +52 -0
- package/dist/modes/interactive/tool-view/fallback.js.map +1 -0
- package/dist/modes/interactive/tool-view/style.d.ts +63 -0
- package/dist/modes/interactive/tool-view/style.d.ts.map +1 -0
- package/dist/modes/interactive/tool-view/style.js +83 -0
- package/dist/modes/interactive/tool-view/style.js.map +1 -0
- package/dist/modes/interactive/{components → tool-view}/tool-execution.d.ts +17 -24
- package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/{components → tool-view}/tool-execution.js +42 -116
- package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -0
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/background.md +1 -1
- package/docs/bundled/extensions/question.md +6 -5
- package/docs/bundled/extensions/todo.md +5 -5
- package/docs/bundled/tool-presentation.md +41 -31
- package/docs/extensions.md +1 -4
- package/docs/keybindings.md +11 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/dist/core/model-stream-options.d.ts +0 -6
- package/dist/core/model-stream-options.d.ts.map +0 -1
- package/dist/core/model-stream-options.js +0 -20
- package/dist/core/model-stream-options.js.map +0 -1
- package/dist/modes/interactive/components/tool-chrome.d.ts +0 -28
- package/dist/modes/interactive/components/tool-chrome.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-chrome.js +0 -84
- package/dist/modes/interactive/components/tool-chrome.js.map +0 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-execution.js.map +0 -1
- package/dist/modes/interactive/components/tool-group.d.ts +0 -17
- package/dist/modes/interactive/components/tool-group.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-group.js +0 -78
- package/dist/modes/interactive/components/tool-group.js.map +0 -1
- package/dist/modes/interactive/tool-chat.d.ts +0 -21
- package/dist/modes/interactive/tool-chat.d.ts.map +0 -1
- package/dist/modes/interactive/tool-chat.js +0 -58
- package/dist/modes/interactive/tool-chat.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./keybindings.ts\";\nimport { Editor, type EditorTheme, Markdown, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { Keybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel as configuredKeyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ruleBorder, wrapWithPrefix } from \"./dialog-primitives.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { PreviewLinesCache, WidthCachedRender } from \"./render-cache.ts\";\nimport {\n\tdisplayOptions,\n\tfirstUnanswered,\n\thasAnswer,\n\thasMultiAnswer,\n\tnewQuestionState,\n\torderedAnswers,\n} from \"./state.ts\";\nimport type { DialogResult, DisplayOption, InputMode, Question, QuestionAnswer, QuestionOption } from \"./types.ts\";\n\ntype DialogView = \"question\" | \"review\";\n\nconst PREVIEW_MAX_LINES = 16;\n/**\n * Estimated non-preview rows in the stacked (narrow) layout: top/bottom rules,\n * tab strip + blank, question line + blank, up to 5 option rows with\n * descriptions, the \"Chat about this\" row, warning slot, and the hint line.\n * Reserved so the preview clamps short of the terminal height.\n */\nconst PREVIEW_CHROME_ROWS = 18;\nconst VIEWPORT_SCROLL_STEP = 4;\n\ninterface VerticalViewport {\n\tlines: string[];\n\tstart: number;\n\tmaxStart: number;\n}\n\nfunction applyVerticalViewport(\n\tlines: string[],\n\twidth: number,\n\tterminalRows: number,\n\ttheme: Theme,\n\toptions: { anchorLine?: number; preferredStart?: number } = {},\n): VerticalViewport {\n\tconst maxRows = Math.max(1, Math.floor(terminalRows));\n\tif (lines.length <= maxRows) return { lines, start: 0, maxStart: 0 };\n\tif (maxRows < 5) {\n\t\tconst anchor = Math.max(0, Math.min(lines.length - 1, options.anchorLine ?? 0));\n\t\tconst start = Math.max(0, Math.min(lines.length - maxRows, anchor - Math.floor(maxRows / 2)));\n\t\treturn { lines: lines.slice(start, start + maxRows), start, maxStart: lines.length - maxRows };\n\t}\n\n\tconst first = lines[0] ?? \"\";\n\tconst last = lines[lines.length - 1] ?? \"\";\n\tconst body = lines.slice(1, -1);\n\tconst contentRows = maxRows - 4;\n\tconst maxStart = Math.max(0, body.length - contentRows);\n\tconst anchorInBody = Math.max(0, Math.min(body.length - 1, (options.anchorLine ?? 1) - 1));\n\tconst requestedStart = options.preferredStart ?? Math.max(0, anchorInBody - Math.floor(contentRows / 2));\n\tconst start = Math.max(0, Math.min(maxStart, requestedStart));\n\tconst bottomHidden = Math.max(0, body.length - start - contentRows);\n\tconst indicator = (text: string) => theme.fg(\"dim\", truncateToWidth(text, Math.max(1, width)));\n\treturn {\n\t\tlines: [\n\t\t\tfirst,\n\t\t\tstart > 0 ? indicator(`↑ ${start} rows hidden`) : \"\",\n\t\t\t...body.slice(start, start + contentRows),\n\t\t\tbottomHidden > 0 ? indicator(`↓ ${bottomHidden} rows hidden`) : \"\",\n\t\t\tlast,\n\t\t],\n\t\tstart,\n\t\tmaxStart,\n\t};\n}\n\nexport function createQuestionDialog(questions: Question[], signal?: AbortSignal) {\n\treturn (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: DialogResult) => void) => {\n\t\tlet currentIdx = 0;\n\t\tlet view: DialogView = \"question\";\n\t\tlet inputMode: InputMode;\n\t\tlet noteTarget: string | undefined;\n\t\tlet notesSnapshot: { prior: QuestionAnswer | undefined } | undefined;\n\t\tlet reviewScrollOffset = 0;\n\t\tlet reviewMaxScrollOffset = 0;\n\t\tlet dialogFocused = false;\n\t\tlet footerFocused = false;\n\t\tlet finished = false;\n\t\tconst cache = new WidthCachedRender();\n\t\tconst previewCache = new PreviewLinesCache();\n\t\tconst states = questions.map(() => newQuestionState());\n\t\tconst optionsByQuestion = questions.map((question) => displayOptions(question));\n\n\t\tconst editorTheme: EditorTheme = {\n\t\t\tborderColor: (s) => theme.fg(\"accent\", s),\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\tselectedText: (t) => theme.fg(\"accent\", t),\n\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t},\n\t\t};\n\t\tconst editor = new Editor(tui, editorTheme);\n\n\t\tconst currentQuestion = () => questions[currentIdx];\n\t\tconst currentState = () => states[currentIdx];\n\t\tconst currentOptions = () => optionsByQuestion[currentIdx];\n\t\tconst keyMatches = (data: string, keybinding: Keybinding) => keybindings.matches(data, keybinding);\n\t\tconst keyLabel = (keybinding: Keybinding) => configuredKeyLabel(keybinding, { keybindings });\n\t\tconst keyAction = (keybinding: Keybinding, action: string) => {\n\t\t\tconst label = keyLabel(keybinding);\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\t// Editor reads the global TUI manager internally, while dialog controls use the injected manager.\n\t\tconst editorSubmitAction = (action: string) => {\n\t\t\tconst label = configuredKeyLabel(\"tui.input.submit\");\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\tconst keyGroupAction = (bindings: Keybinding[], action: string) => {\n\t\t\tconst labels = bindings.map(keyLabel).filter(Boolean).join(\"/\");\n\t\t\treturn labels ? `${labels} ${action}` : \"\";\n\t\t};\n\t\tconst joinHints = (...hints: string[]) => hints.filter(Boolean).join(\" • \");\n\n\t\tfunction finish(result: DialogResult): void {\n\t\t\tif (finished) return;\n\t\t\tfinished = true;\n\t\t\tdone(result);\n\t\t}\n\n\t\tconst onAbort = () => finish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\tif (signal?.aborted) onAbort();\n\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tfunction refresh(): void {\n\t\t\tcache.invalidate();\n\t\t\ttui.requestRender();\n\t\t}\n\n\t\tfunction syncEditorFocus(): void {\n\t\t\teditor.focused = dialogFocused && inputMode !== undefined;\n\t\t}\n\n\t\tfunction setCurrentIdx(index: number): void {\n\t\t\tcurrentIdx = Math.max(0, Math.min(questions.length - 1, index));\n\t\t\tview = \"question\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tnotesSnapshot = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction clearWarning(): void {\n\t\t\tcurrentState().warning = undefined;\n\t\t}\n\n\t\tfunction focusedOption(): DisplayOption | undefined {\n\t\t\treturn currentOptions()[currentState().optionIndex];\n\t\t}\n\n\t\tfunction showReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before reviewing your answers.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tview = \"review\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction advanceAfterAnswer(): void {\n\t\t\tif (questions.length === 1 && !currentQuestion().multiSelect) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing === undefined) {\n\t\t\t\tshowReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentIdx(missing);\n\t\t}\n\n\t\tfunction beginCustomInput(): void {\n\t\t\tconst state = currentState();\n\t\t\tinputMode = \"custom\";\n\t\t\tnoteTarget = undefined;\n\t\t\tconst existingSingle = state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined;\n\t\t\teditor.setText(state.customAnswer?.text ?? existingSingle ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction selectSingleOption(option: QuestionOption): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tstate.singleAnswer = {\n\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\tquestion: question.question,\n\t\t\t\theader: question.header,\n\t\t\t\tkind: \"option\",\n\t\t\t\tanswer: option.label,\n\t\t\t\t...(option.preview ? { preview: option.preview } : {}),\n\t\t\t};\n\t\t\tstate.warning = undefined;\n\t\t}\n\n\t\tfunction beginNotesInput(): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst option = focusedOption();\n\t\t\tif (!option || option.kind === \"other\") {\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (question.multiSelect && !state.multiSelected.has(option.optionIndex)) {\n\t\t\t\tstate.warning = \"Select the option first, then add notes.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!question.multiSelect) {\n\t\t\t\tnotesSnapshot = { prior: state.singleAnswer };\n\t\t\t\tselectSingleOption(option);\n\t\t\t}\n\t\t\tinputMode = \"notes\";\n\t\t\tnoteTarget = option.label;\n\t\t\teditor.setText(state.notesByOption.get(option.label) ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction recordSingle(option: DisplayOption): void {\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (currentState().singleAnswer?.kind === \"custom\") {\n\t\t\t\t\tadvanceAfterAnswer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselectSingleOption(option);\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction recordMulti(): void {\n\t\t\tconst state = currentState();\n\t\t\tif (!hasMultiAnswer(state)) {\n\t\t\t\tstate.warning = \"Select at least one option, type a custom answer, or cancel the questions.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstate.warning = undefined;\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction toggleMultiOption(option: DisplayOption): void {\n\t\t\tconst state = currentState();\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (state.customAnswer) {\n\t\t\t\t\tstate.customAnswer.selected = !state.customAnswer.selected;\n\t\t\t\t\tclearWarning();\n\t\t\t\t} else {\n\t\t\t\t\tconst tabKey = keyLabel(\"tui.input.tab\");\n\t\t\t\t\tstate.warning = tabKey\n\t\t\t\t\t\t? `Press ${tabKey} to type a custom answer.`\n\t\t\t\t\t\t: \"Choose Type something to type a custom answer.\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.multiSelected.has(option.optionIndex)) state.multiSelected.delete(option.optionIndex);\n\t\t\telse state.multiSelected.add(option.optionIndex);\n\t\t\tclearWarning();\n\t\t}\n\n\t\tfunction finishReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before submitting.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t}\n\n\t\teditor.onSubmit = (value) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tif (trimmed.length > QUESTION_LIMITS.userTextChars) {\n\t\t\t\tstate.warning = `Keep notes and custom answers under ${QUESTION_LIMITS.userTextChars} characters.`;\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\tif (noteTarget) {\n\t\t\t\t\tif (trimmed) state.notesByOption.set(noteTarget, trimmed);\n\t\t\t\t\telse state.notesByOption.delete(noteTarget);\n\t\t\t\t}\n\t\t\t\tinputMode = undefined;\n\t\t\t\tnoteTarget = undefined;\n\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (inputMode === \"custom\") {\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tstate.customAnswer = { text: trimmed, selected: true };\n\t\t\t\t\tstate.optionIndex = question.options.length;\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstate.singleAnswer = {\n\t\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\t\tquestion: question.question,\n\t\t\t\t\theader: question.header,\n\t\t\t\t\tkind: \"custom\",\n\t\t\t\t\tanswer: trimmed,\n\t\t\t\t};\n\t\t\t\tinputMode = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\tadvanceAfterAnswer();\n\t\t\t}\n\t\t};\n\n\t\tfunction handleReviewInput(data: string): void {\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\treviewScrollOffset = Math.max(0, reviewScrollOffset - VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\treviewScrollOffset = Math.min(reviewMaxScrollOffset, reviewScrollOffset + VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tfinishReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleQuestionInput(data: string): void {\n\t\t\tif (inputMode) {\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tif (inputMode === \"notes\" && notesSnapshot) {\n\t\t\t\t\t\tcurrentState().singleAnswer = notesSnapshot.prior;\n\t\t\t\t\t}\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\tnoteTarget = undefined;\n\t\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.handleInput(data);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tif (currentIdx > 0) setCurrentIdx(currentIdx - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorRight\")) {\n\t\t\t\tif (currentIdx < questions.length - 1) setCurrentIdx(currentIdx + 1);\n\t\t\t\telse if (firstUnanswered(states) === undefined) showReview();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = options.length - 1;\n\t\t\t\t} else if (state.optionIndex > 0) {\n\t\t\t\t\tstate.optionIndex--;\n\t\t\t\t}\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\tif (footerFocused) return;\n\t\t\t\tif (state.optionIndex < options.length - 1) state.optionIndex++;\n\t\t\t\telse footerFocused = true;\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.input.tab\")) {\n\t\t\t\tif (!footerFocused) beginNotesInput();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.length === 1 && data >= \"1\" && data <= \"9\") {\n\t\t\t\tconst index = data.charCodeAt(0) - 49;\n\t\t\t\tconst target = options[index];\n\t\t\t\tif (target) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = index;\n\t\t\t\t\tclearWarning();\n\t\t\t\t\tif (currentQuestion().multiSelect) {\n\t\t\t\t\t\ttoggleMultiOption(target);\n\t\t\t\t\t\trefresh();\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecordSingle(target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (footerFocused) {\n\t\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"needs_clarification\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst option = options[state.optionIndex];\n\t\t\tif (question.multiSelect && keyMatches(data, \"app.list.toggle\")) {\n\t\t\t\tif (option) toggleMultiOption(option);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tif (option?.kind === \"other\" && !state.customAnswer) {\n\t\t\t\t\t\tbeginCustomInput();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecordMulti();\n\t\t\t\t} else if (option) recordSingle(option);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t}\n\t\t}\n\n\t\tfunction handleInput(data: string): void {\n\t\t\tif (view === \"review\") handleReviewInput(data);\n\t\t\telse handleQuestionInput(data);\n\t\t}\n\n\t\tfunction render(width: number): string[] {\n\t\t\treturn cache.get(width, tui.terminal.rows, compute);\n\t\t}\n\n\t\tfunction renderTabs(renderWidth: number, lines: string[]): void {\n\t\t\tif (questions.length < 2) return;\n\t\t\tconst tabCount = questions.length + 1;\n\t\t\tconst headerWidth = Math.max(4, Math.floor((renderWidth - tabCount * 5) / tabCount));\n\t\t\tconst tabs = [\n\t\t\t\t...questions.map((question, index) => {\n\t\t\t\t\tconst answered = hasAnswer(states[index]);\n\t\t\t\t\tconst label = ` ${answered ? \"■\" : \"□\"} ${truncateToWidth(question.header, headerWidth)} `;\n\t\t\t\t\tif (view === \"question\" && index === currentIdx) {\n\t\t\t\t\t\treturn theme.bg(\"selectedBg\", theme.fg(answered ? \"success\" : \"text\", label));\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(answered ? \"success\" : \"muted\", label);\n\t\t\t\t}),\n\t\t\t\tview === \"review\"\n\t\t\t\t\t? theme.bg(\"selectedBg\", theme.fg(\"text\", \" ✓ Submit \"))\n\t\t\t\t\t: theme.fg(firstUnanswered(states) === undefined ? \"success\" : \"dim\", \" ✓ Submit \"),\n\t\t\t].join(\" \");\n\t\t\twrapWithPrefix(\" \", tabs, renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tfunction previewLines(previewText: string, width: number, terminalRows: number): string[] {\n\t\t\tconst maxLines = Math.max(4, Math.min(PREVIEW_MAX_LINES, terminalRows - PREVIEW_CHROME_ROWS));\n\t\t\treturn previewCache.get(previewText, width, maxLines, () => {\n\t\t\t\tconst markdown = new Markdown(previewText, 1, 0, getMarkdownTheme());\n\t\t\t\tconst rendered = markdown.render(Math.max(1, width));\n\t\t\t\tif (rendered.length <= maxLines) return rendered;\n\t\t\t\treturn [\n\t\t\t\t\t...rendered.slice(0, maxLines),\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(`… ${rendered.length - maxLines} preview lines hidden`, Math.max(1, width)),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t\t}\n\n\t\t/** Multi-select checkbox marker; the other row shows no box until a custom answer exists. */\n\t\tfunction multiMarker(option: DisplayOption, checked: boolean, hasCustomAnswer: boolean): string {\n\t\t\tif (option.kind === \"other\" && !hasCustomAnswer) return \" \";\n\t\t\treturn checked ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t}\n\n\t\tfunction renderReview(renderWidth: number, lines: string[]): void {\n\t\t\twrapWithPrefix(\" \", theme.fg(\"accent\", \"Review answers\"), renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t\tfor (const answer of orderedAnswers(questions, states)) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"text\", `${answer.questionIndex + 1}. ${answer.question}`),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t\tconst response =\n\t\t\t\t\tanswer.kind === \"multi\"\n\t\t\t\t\t\t? (answer.selected?.join(\", \") ?? \"(no input)\")\n\t\t\t\t\t\t: (answer.answer ?? \"(no input)\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"success\", response), renderWidth, lines);\n\t\t\t\tfor (const note of answer.notes ?? []) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", `Note for ${note.option}: ${note.text}`), renderWidth, lines);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"dim\",\n\t\t\t\t\tjoinHints(\n\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"submit\"),\n\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"edit last question\"),\n\t\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"scroll\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t}\n\n\t\tfunction compute(width: number, terminalRows: number): string[] {\n\t\t\tconst lines: string[] = [];\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\trenderTabs(renderWidth, lines);\n\n\t\t\tif (view === \"review\") {\n\t\t\t\trenderReview(renderWidth, lines);\n\t\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\t\tconst viewport = applyVerticalViewport(lines, renderWidth, terminalRows, theme, {\n\t\t\t\t\tpreferredStart: reviewScrollOffset,\n\t\t\t\t});\n\t\t\t\treviewMaxScrollOffset = viewport.maxStart;\n\t\t\t\treviewScrollOffset = viewport.start;\n\t\t\t\treturn viewport.lines;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tconst isMulti = question.multiSelect === true;\n\t\t\tconst digitRange = `1-${Math.min(9, options.length)}`;\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\t`${theme.fg(\"accent\", question.header)} ${theme.fg(\"text\", question.question)}`,\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tlines.push(\"\");\n\n\t\t\tconst optionLines: string[] = [];\n\t\t\tlet focusedOptionStart = 0;\n\t\t\tlet focusedOptionEnd = 0;\n\t\t\tlet inputAnchorOffset: number | undefined;\n\t\t\tconst hasPreview =\n\t\t\t\tinputMode === undefined && !isMulti && options.some((option) => option.kind === \"option\" && option.preview);\n\t\t\tconst showPreviewSideBySide = hasPreview && renderWidth >= 60;\n\t\t\tconst listWidth = showPreviewSideBySide ? Math.max(20, Math.floor(renderWidth * 0.4)) : renderWidth;\n\n\t\t\tfor (let index = 0; index < options.length; index++) {\n\t\t\t\tconst option = options[index];\n\t\t\t\tconst focused = !footerFocused && index === state.optionIndex;\n\t\t\t\tconst checked =\n\t\t\t\t\tisMulti &&\n\t\t\t\t\t((option.kind === \"option\" && state.multiSelected.has(option.optionIndex)) ||\n\t\t\t\t\t\t(option.kind === \"other\" && state.customAnswer?.selected === true));\n\t\t\t\tconst selectedSingle =\n\t\t\t\t\t!isMulti &&\n\t\t\t\t\t(option.kind === \"other\"\n\t\t\t\t\t\t? state.singleAnswer?.kind === \"custom\"\n\t\t\t\t\t\t: state.singleAnswer?.answer === option.label);\n\t\t\t\tconst marker = isMulti ? multiMarker(option, checked, state.customAnswer !== undefined) : \" \";\n\t\t\t\tconst focusArrow = focused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\t\tconst note =\n\t\t\t\t\toption.kind === \"option\" && state.notesByOption.has(option.label) ? theme.fg(\"success\", \" +note\") : \"\";\n\t\t\t\tconst customText =\n\t\t\t\t\toption.kind === \"other\"\n\t\t\t\t\t\t? (state.customAnswer?.text ??\n\t\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined))\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst labelText = customText ? `${option.label} ✎ ${customText}` : option.label;\n\t\t\t\tconst label = `${index + 1}. ${labelText}${selectedSingle ? \" ✓\" : \"\"}${note}`;\n\t\t\t\tconst color = focused ? \"accent\" : selectedSingle || checked ? \"success\" : \"text\";\n\t\t\t\tif (focused) focusedOptionStart = optionLines.length;\n\t\t\t\twrapWithPrefix(`${focusArrow} ${marker} `, theme.fg(color, label), listWidth, optionLines);\n\t\t\t\tif (option.kind === \"option\" && option.description) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", option.description), listWidth, optionLines);\n\t\t\t\t}\n\t\t\t\tif (focused) focusedOptionEnd = optionLines.length;\n\t\t\t}\n\n\t\t\tif (inputMode) {\n\t\t\t\toptionLines.push(\"\");\n\t\t\t\tconst label = inputMode === \"notes\" ? `Notes for ${noteTarget ?? \"option\"}:` : \"Your answer:\";\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", label), listWidth, optionLines);\n\t\t\t\tfor (const line of editor.render(Math.max(1, listWidth - 2))) optionLines.push(` ${line}`);\n\t\t\t\tinputAnchorOffset = Math.max(0, optionLines.length - 1);\n\t\t\t}\n\n\t\t\tconst optionListStartLine = lines.length;\n\t\t\tif (showPreviewSideBySide) {\n\t\t\t\tconst gap = 2;\n\t\t\t\tconst rightWidth = renderWidth - listWidth - gap;\n\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\tconst preview = previewText\n\t\t\t\t\t? previewLines(previewText, rightWidth, terminalRows)\n\t\t\t\t\t: [theme.fg(\"dim\", \"(no preview)\")];\n\t\t\t\tconst rightLines = [...Array.from({ length: focusedOptionStart }, () => \"\"), ...preview];\n\t\t\t\tconst maxRows = Math.max(optionLines.length, rightLines.length);\n\t\t\t\tconst pad = \" \".repeat(gap);\n\t\t\t\tfor (let row = 0; row < maxRows; row++) {\n\t\t\t\t\tconst left = row < optionLines.length ? optionLines[row] : \"\";\n\t\t\t\t\tconst leftPadded = left + \" \".repeat(Math.max(0, listWidth - visibleWidth(left)));\n\t\t\t\t\tconst right = row < rightLines.length ? rightLines[row] : \"\";\n\t\t\t\t\tlines.push(`${leftPadded}${pad}${right}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (hasPreview) {\n\t\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\t\tif (previewText) {\n\t\t\t\t\t\toptionLines.splice(\n\t\t\t\t\t\t\tfocusedOptionEnd,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\truleBorder(theme, renderWidth, \"dim\"),\n\t\t\t\t\t\t\t...previewLines(previewText, renderWidth, terminalRows),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlines.push(...optionLines);\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst chatLine = lines.length;\n\t\t\tconst chatPrefix = footerFocused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\twrapWithPrefix(\n\t\t\t\t`${chatPrefix} `,\n\t\t\t\ttheme.fg(footerFocused ? \"accent\" : \"text\", \"Chat about this\"),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tlet warningLine: number | undefined;\n\t\t\tif (state.warning) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\twarningLine = lines.length;\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"warning\", state.warning), renderWidth, lines);\n\t\t\t}\n\t\t\tlines.push(\"\");\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(\"save notes\"), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (inputMode === \"custom\") {\n\t\t\t\tconst hint = isMulti ? \"save custom answer\" : \"continue\";\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(hint), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (footerFocused) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"discuss\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.up\", \"return to options\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (isMulti) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} toggle`,\n\t\t\t\t\t\t\tkeyAction(\"app.list.toggle\", \"toggle focused\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"continue\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} select`,\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"select\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\tlet anchorLine = optionListStartLine + focusedOptionStart;\n\t\t\tif (inputAnchorOffset !== undefined) anchorLine = optionListStartLine + inputAnchorOffset;\n\t\t\telse if (warningLine !== undefined) anchorLine = warningLine;\n\t\t\telse if (footerFocused) anchorLine = chatLine;\n\t\t\treturn applyVerticalViewport(lines, renderWidth, terminalRows, theme, { anchorLine }).lines;\n\t\t}\n\n\t\treturn {\n\t\t\tget focused() {\n\t\t\t\treturn dialogFocused;\n\t\t\t},\n\t\t\tset focused(value: boolean) {\n\t\t\t\tdialogFocused = value;\n\t\t\t\tsyncEditorFocus();\n\t\t\t},\n\t\t\trender,\n\t\t\tinvalidate: () => {\n\t\t\t\tcache.invalidate();\n\t\t\t},\n\t\t\thandleInput,\n\t\t\tdispose() {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./keybindings.ts\";\nimport {\n\tCURSOR_MARKER,\n\tEditor,\n\ttype EditorTheme,\n\tMarkdown,\n\ttype TUI,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { Keybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel as configuredKeyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { DetailPane } from \"./detail-pane.ts\";\nimport { ruleBorder, wrapWithPrefix } from \"./dialog-primitives.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { moreOptionsHint, type WindowItem, windowItems } from \"./option-window.ts\";\nimport { PreviewLinesCache, WidthCachedRender } from \"./render-cache.ts\";\nimport {\n\tdisplayOptions,\n\tfirstUnanswered,\n\thasAnswer,\n\thasMultiAnswer,\n\tnewQuestionState,\n\torderedAnswers,\n} from \"./state.ts\";\nimport type { DialogResult, DisplayOption, InputMode, Question, QuestionAnswer, QuestionOption } from \"./types.ts\";\n\ntype DialogView = \"question\" | \"review\";\n\n/**\n * The dialog replaces the editor in the bottom dock, and the dock grows with its\n * content. Capping the dialog at half the terminal keeps the transcript (often the\n * assistant reply the question refers to) readable while the dialog is open.\n */\nconst DIALOG_MAX_FRACTION = 0.5;\nconst DIALOG_MIN_ROWS = 16;\nconst VIEWPORT_SCROLL_STEP = 4;\n\ninterface VerticalViewport {\n\tlines: string[];\n\tstart: number;\n\tmaxStart: number;\n}\n\nfunction dialogRowBudget(terminalRows: number): number {\n\tconst rows = Math.max(1, Math.floor(terminalRows));\n\treturn Math.min(rows, Math.max(DIALOG_MIN_ROWS, Math.floor(rows * DIALOG_MAX_FRACTION)));\n}\n\n/** Clamp `lines` to `maxRows` between the first and last line, scrolling around the anchor. */\nfunction applyVerticalViewport(\n\tlines: string[],\n\twidth: number,\n\tmaxRows: number,\n\ttheme: Theme,\n\toptions: { anchorLine?: number; preferredStart?: number } = {},\n): VerticalViewport {\n\tif (lines.length <= maxRows) return { lines, start: 0, maxStart: 0 };\n\tif (maxRows < 5) {\n\t\tconst anchor = Math.max(0, Math.min(lines.length - 1, options.anchorLine ?? 0));\n\t\tconst start = Math.max(0, Math.min(lines.length - maxRows, anchor - Math.floor(maxRows / 2)));\n\t\treturn { lines: lines.slice(start, start + maxRows), start, maxStart: lines.length - maxRows };\n\t}\n\n\tconst first = lines[0] ?? \"\";\n\tconst last = lines[lines.length - 1] ?? \"\";\n\tconst body = lines.slice(1, -1);\n\tconst contentRows = maxRows - 4;\n\tconst maxStart = Math.max(0, body.length - contentRows);\n\tconst anchorInBody = Math.max(0, Math.min(body.length - 1, (options.anchorLine ?? 1) - 1));\n\tconst requestedStart = options.preferredStart ?? Math.max(0, anchorInBody - Math.floor(contentRows / 2));\n\tconst start = Math.max(0, Math.min(maxStart, requestedStart));\n\tconst bottomHidden = Math.max(0, body.length - start - contentRows);\n\tconst indicator = (text: string) => theme.fg(\"dim\", truncateToWidth(text, Math.max(1, width)));\n\treturn {\n\t\tlines: [\n\t\t\tfirst,\n\t\t\tstart > 0 ? indicator(`↑ ${start} rows hidden`) : \"\",\n\t\t\t...body.slice(start, start + contentRows),\n\t\t\tbottomHidden > 0 ? indicator(`↓ ${bottomHidden} rows hidden`) : \"\",\n\t\t\tlast,\n\t\t],\n\t\tstart,\n\t\tmaxStart,\n\t};\n}\n\nexport function createQuestionDialog(questions: Question[], signal?: AbortSignal) {\n\treturn (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: DialogResult) => void) => {\n\t\tlet currentIdx = 0;\n\t\tlet view: DialogView = \"question\";\n\t\tlet inputMode: InputMode;\n\t\tlet noteTarget: string | undefined;\n\t\tlet notesSnapshot: { prior: QuestionAnswer | undefined } | undefined;\n\t\tlet reviewScrollOffset = 0;\n\t\tlet reviewMaxScrollOffset = 0;\n\t\tlet dialogFocused = false;\n\t\tlet footerFocused = false;\n\t\tlet finished = false;\n\t\tconst cache = new WidthCachedRender();\n\t\tconst previewCache = new PreviewLinesCache();\n\t\tconst details = new DetailPane();\n\t\tconst states = questions.map(() => newQuestionState());\n\t\tconst optionsByQuestion = questions.map((question) => displayOptions(question));\n\n\t\tconst editorTheme: EditorTheme = {\n\t\t\tborderColor: (s) => theme.fg(\"accent\", s),\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\tselectedText: (t) => theme.fg(\"accent\", t),\n\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t},\n\t\t};\n\t\tconst editor = new Editor(tui, editorTheme);\n\n\t\tconst currentQuestion = () => questions[currentIdx];\n\t\tconst currentState = () => states[currentIdx];\n\t\tconst currentOptions = () => optionsByQuestion[currentIdx];\n\t\tconst keyMatches = (data: string, keybinding: Keybinding) => keybindings.matches(data, keybinding);\n\t\tconst keyLabel = (keybinding: Keybinding) => configuredKeyLabel(keybinding, { keybindings });\n\t\tconst keyAction = (keybinding: Keybinding, action: string) => {\n\t\t\tconst label = keyLabel(keybinding);\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\t// Editor reads the global TUI manager internally, while dialog controls use the injected manager.\n\t\tconst editorSubmitAction = (action: string) => {\n\t\t\tconst label = configuredKeyLabel(\"tui.input.submit\");\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\tconst keyGroupAction = (bindings: Keybinding[], action: string) => {\n\t\t\tconst labels = bindings.map(keyLabel).filter(Boolean).join(\"/\");\n\t\t\treturn labels ? `${labels} ${action}` : \"\";\n\t\t};\n\t\tconst joinHints = (...hints: string[]) => hints.filter(Boolean).join(\" • \");\n\n\t\tfunction finish(result: DialogResult): void {\n\t\t\tif (finished) return;\n\t\t\tfinished = true;\n\t\t\tdone(result);\n\t\t}\n\n\t\tconst onAbort = () => finish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\tif (signal?.aborted) onAbort();\n\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tfunction refresh(): void {\n\t\t\tcache.invalidate();\n\t\t\ttui.requestRender();\n\t\t}\n\n\t\tfunction syncEditorFocus(): void {\n\t\t\teditor.focused = dialogFocused && inputMode !== undefined;\n\t\t}\n\n\t\tfunction setCurrentIdx(index: number): void {\n\t\t\tdetails.reset();\n\t\t\tcurrentIdx = Math.max(0, Math.min(questions.length - 1, index));\n\t\t\tview = \"question\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tnotesSnapshot = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction clearWarning(): void {\n\t\t\tcurrentState().warning = undefined;\n\t\t}\n\n\t\tfunction focusedOption(): DisplayOption | undefined {\n\t\t\treturn currentOptions()[currentState().optionIndex];\n\t\t}\n\n\t\tfunction showReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before reviewing your answers.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tview = \"review\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction advanceAfterAnswer(): void {\n\t\t\tif (questions.length === 1 && !currentQuestion().multiSelect) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing === undefined) {\n\t\t\t\tshowReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentIdx(missing);\n\t\t}\n\n\t\tfunction beginCustomInput(): void {\n\t\t\tdetails.reset();\n\t\t\tconst state = currentState();\n\t\t\tinputMode = \"custom\";\n\t\t\tnoteTarget = undefined;\n\t\t\tconst existingSingle = state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined;\n\t\t\teditor.setText(state.customAnswer?.text ?? existingSingle ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction selectSingleOption(option: QuestionOption): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tstate.singleAnswer = {\n\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\tquestion: question.question,\n\t\t\t\theader: question.header,\n\t\t\t\tkind: \"option\",\n\t\t\t\tanswer: option.label,\n\t\t\t\t...(option.preview ? { preview: option.preview } : {}),\n\t\t\t};\n\t\t\tstate.warning = undefined;\n\t\t}\n\n\t\tfunction beginNotesInput(): void {\n\t\t\tdetails.reset();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst option = focusedOption();\n\t\t\tif (!option || option.kind === \"other\") {\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (question.multiSelect && !state.multiSelected.has(option.optionIndex)) {\n\t\t\t\tstate.warning = \"Select the option first, then add notes.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!question.multiSelect) {\n\t\t\t\tnotesSnapshot = { prior: state.singleAnswer };\n\t\t\t\tselectSingleOption(option);\n\t\t\t}\n\t\t\tinputMode = \"notes\";\n\t\t\tnoteTarget = option.label;\n\t\t\teditor.setText(state.notesByOption.get(option.label) ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction recordSingle(option: DisplayOption): void {\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (currentState().singleAnswer?.kind === \"custom\") {\n\t\t\t\t\tadvanceAfterAnswer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselectSingleOption(option);\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction recordMulti(): void {\n\t\t\tconst state = currentState();\n\t\t\tif (!hasMultiAnswer(state)) {\n\t\t\t\tstate.warning = \"Select at least one option, type a custom answer, or cancel the questions.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstate.warning = undefined;\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction toggleMultiOption(option: DisplayOption): void {\n\t\t\tconst state = currentState();\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (state.customAnswer) {\n\t\t\t\t\tstate.customAnswer.selected = !state.customAnswer.selected;\n\t\t\t\t\tclearWarning();\n\t\t\t\t} else {\n\t\t\t\t\tconst tabKey = keyLabel(\"tui.input.tab\");\n\t\t\t\t\tstate.warning = tabKey\n\t\t\t\t\t\t? `Press ${tabKey} to type a custom answer.`\n\t\t\t\t\t\t: \"Choose Type something to type a custom answer.\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.multiSelected.has(option.optionIndex)) state.multiSelected.delete(option.optionIndex);\n\t\t\telse state.multiSelected.add(option.optionIndex);\n\t\t\tclearWarning();\n\t\t}\n\n\t\tfunction finishReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before submitting.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t}\n\n\t\teditor.onSubmit = (value) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tif (trimmed.length > QUESTION_LIMITS.userTextChars) {\n\t\t\t\tstate.warning = `Keep notes and custom answers under ${QUESTION_LIMITS.userTextChars} characters.`;\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\tif (noteTarget) {\n\t\t\t\t\tif (trimmed) state.notesByOption.set(noteTarget, trimmed);\n\t\t\t\t\telse state.notesByOption.delete(noteTarget);\n\t\t\t\t}\n\t\t\t\tinputMode = undefined;\n\t\t\t\tnoteTarget = undefined;\n\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (inputMode === \"custom\") {\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tstate.customAnswer = { text: trimmed, selected: true };\n\t\t\t\t\tstate.optionIndex = question.options.length;\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstate.singleAnswer = {\n\t\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\t\tquestion: question.question,\n\t\t\t\t\theader: question.header,\n\t\t\t\t\tkind: \"custom\",\n\t\t\t\t\tanswer: trimmed,\n\t\t\t\t};\n\t\t\t\tinputMode = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\tadvanceAfterAnswer();\n\t\t\t}\n\t\t};\n\n\t\tfunction handleReviewInput(data: string): void {\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\treviewScrollOffset = Math.max(0, reviewScrollOffset - VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\treviewScrollOffset = Math.min(reviewMaxScrollOffset, reviewScrollOffset + VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tfinishReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleQuestionInput(data: string): void {\n\t\t\tif (inputMode) {\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tif (inputMode === \"notes\" && notesSnapshot) {\n\t\t\t\t\t\tcurrentState().singleAnswer = notesSnapshot.prior;\n\t\t\t\t\t}\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\tnoteTarget = undefined;\n\t\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.handleInput(data);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tif (currentIdx > 0) setCurrentIdx(currentIdx - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"app.question.pageUp\") || keyMatches(data, \"app.question.pageDown\")) {\n\t\t\t\t// Resolve the current pane's height even if another key arrived before a redraw.\n\t\t\t\trender(tui.terminal.columns);\n\t\t\t\tdetails.page(keyMatches(data, \"app.question.pageUp\") ? -1 : 1);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorRight\")) {\n\t\t\t\tif (currentIdx < questions.length - 1) setCurrentIdx(currentIdx + 1);\n\t\t\t\telse if (firstUnanswered(states) === undefined) showReview();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = options.length - 1;\n\t\t\t\t} else if (state.optionIndex > 0) {\n\t\t\t\t\tstate.optionIndex--;\n\t\t\t\t}\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\tif (footerFocused) return;\n\t\t\t\tif (state.optionIndex < options.length - 1) state.optionIndex++;\n\t\t\t\telse footerFocused = true;\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.input.tab\")) {\n\t\t\t\tif (!footerFocused) beginNotesInput();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.length === 1 && data >= \"1\" && data <= \"9\") {\n\t\t\t\tconst index = data.charCodeAt(0) - 49;\n\t\t\t\tconst target = options[index];\n\t\t\t\tif (target) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = index;\n\t\t\t\t\tclearWarning();\n\t\t\t\t\tif (currentQuestion().multiSelect) {\n\t\t\t\t\t\ttoggleMultiOption(target);\n\t\t\t\t\t\trefresh();\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecordSingle(target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (footerFocused) {\n\t\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"needs_clarification\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst option = options[state.optionIndex];\n\t\t\tif (question.multiSelect && keyMatches(data, \"app.list.toggle\")) {\n\t\t\t\tif (option) toggleMultiOption(option);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tif (option?.kind === \"other\" && !state.customAnswer) {\n\t\t\t\t\t\tbeginCustomInput();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecordMulti();\n\t\t\t\t} else if (option) recordSingle(option);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t}\n\t\t}\n\n\t\tfunction handleInput(data: string): void {\n\t\t\tif (view === \"review\") handleReviewInput(data);\n\t\t\telse handleQuestionInput(data);\n\t\t}\n\n\t\tfunction render(width: number): string[] {\n\t\t\treturn cache.get(width, tui.terminal.rows, compute);\n\t\t}\n\n\t\tfunction renderTabs(renderWidth: number, lines: string[]): void {\n\t\t\tif (questions.length < 2) return;\n\t\t\tconst tabCount = questions.length + 1;\n\t\t\tconst headerWidth = Math.max(4, Math.floor((renderWidth - tabCount * 5) / tabCount));\n\t\t\tconst tabs = [\n\t\t\t\t...questions.map((question, index) => {\n\t\t\t\t\tconst answered = hasAnswer(states[index]);\n\t\t\t\t\tconst label = ` ${answered ? \"■\" : \"□\"} ${truncateToWidth(question.header, headerWidth)} `;\n\t\t\t\t\tif (view === \"question\" && index === currentIdx) {\n\t\t\t\t\t\treturn theme.bg(\"selectedBg\", theme.fg(answered ? \"success\" : \"text\", label));\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(answered ? \"success\" : \"muted\", label);\n\t\t\t\t}),\n\t\t\t\tview === \"review\"\n\t\t\t\t\t? theme.bg(\"selectedBg\", theme.fg(\"text\", \" ✓ Submit \"))\n\t\t\t\t\t: theme.fg(firstUnanswered(states) === undefined ? \"success\" : \"dim\", \" ✓ Submit \"),\n\t\t\t].join(\" \");\n\t\t\twrapWithPrefix(\" \", tabs, renderWidth, lines);\n\t\t}\n\n\t\tfunction previewLines(previewText: string, width: number): string[] {\n\t\t\treturn previewCache.get(previewText, width, () =>\n\t\t\t\tnew Markdown(previewText, 1, 0, getMarkdownTheme()).render(Math.max(1, width)),\n\t\t\t);\n\t\t}\n\n\t\t/** Multi-select checkbox marker; the other row shows no box until a custom answer exists. */\n\t\tfunction multiMarker(option: DisplayOption, checked: boolean, hasCustomAnswer: boolean): string {\n\t\t\tif (option.kind === \"other\" && !hasCustomAnswer) return \" \";\n\t\t\treturn checked ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t}\n\n\t\tfunction renderReview(renderWidth: number, lines: string[]): void {\n\t\t\twrapWithPrefix(\" \", theme.fg(\"accent\", \"Review answers\"), renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t\tfor (const answer of orderedAnswers(questions, states)) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"text\", `${answer.questionIndex + 1}. ${answer.question}`),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t\tconst response =\n\t\t\t\t\tanswer.kind === \"multi\"\n\t\t\t\t\t\t? (answer.selected?.join(\", \") ?? \"(no input)\")\n\t\t\t\t\t\t: (answer.answer ?? \"(no input)\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"success\", response), renderWidth, lines);\n\t\t\t\tfor (const note of answer.notes ?? []) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", `Note for ${note.option}: ${note.text}`), renderWidth, lines);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"dim\",\n\t\t\t\t\tjoinHints(\n\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"submit\"),\n\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"edit last question\"),\n\t\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"scroll\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t}\n\n\t\t/** Chat row, warning, and key hints: always visible below the scrolling option area. */\n\t\tfunction renderQuestionFooter(renderWidth: number, digitRange: string): string[] {\n\t\t\tconst state = currentState();\n\t\t\tconst isMulti = currentQuestion().multiSelect === true;\n\t\t\tconst lines: string[] = [];\n\t\t\tconst chatPrefix = footerFocused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\twrapWithPrefix(\n\t\t\t\t`${chatPrefix} `,\n\t\t\t\ttheme.fg(footerFocused ? \"accent\" : \"text\", \"Chat about this\"),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tif (state.warning) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"warning\", state.warning), renderWidth, lines);\n\t\t\t}\n\t\t\tlet hints: string;\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\thints = joinHints(editorSubmitAction(\"save notes\"), keyAction(\"tui.select.cancel\", \"back\"));\n\t\t\t} else if (inputMode === \"custom\") {\n\t\t\t\thints = joinHints(\n\t\t\t\t\teditorSubmitAction(isMulti ? \"save custom answer\" : \"continue\"),\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"back\"),\n\t\t\t\t);\n\t\t\t} else if (footerFocused) {\n\t\t\t\thints = joinHints(\n\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"discuss\"),\n\t\t\t\t\tkeyAction(\"tui.select.up\", \"return to options\"),\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t);\n\t\t\t} else if (isMulti) {\n\t\t\t\thints = joinHints(\n\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"navigate\"),\n\t\t\t\t\t`${digitRange} toggle`,\n\t\t\t\t\tkeyAction(\"app.list.toggle\", \"toggle focused\"),\n\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"continue\"),\n\t\t\t\t\tquestions.length > 1\n\t\t\t\t\t\t? keyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\")\n\t\t\t\t\t\t: \"\",\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\thints = joinHints(\n\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"navigate\"),\n\t\t\t\t\t`${digitRange} select`,\n\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"select\"),\n\t\t\t\t\tquestions.length > 1\n\t\t\t\t\t\t? keyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\")\n\t\t\t\t\t\t: \"\",\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Wrap between actions, so a key stays beside the action it performs.\n\t\t\tlet hintLine = \"\";\n\t\t\tfor (const hint of hints.split(\" • \")) {\n\t\t\t\tconst joined = hintLine ? `${hintLine} • ${hint}` : hint;\n\t\t\t\tif (hintLine && visibleWidth(joined) > renderWidth - 1) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"dim\", hintLine), renderWidth, lines);\n\t\t\t\t\thintLine = hint;\n\t\t\t\t} else hintLine = joined;\n\t\t\t}\n\t\t\tif (hintLine) wrapWithPrefix(\" \", theme.fg(\"dim\", hintLine), renderWidth, lines);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\treturn lines;\n\t\t}\n\n\t\t/**\n\t\t * Show whole items from `optionLines` in `rows` rows around `focus`, with\n\t\t * \"more options\" hints on the sides that have hidden items. `focusRow` is the\n\t\t * row of the focused item's first line.\n\t\t */\n\t\tfunction windowOptionLines(\n\t\t\toptionLines: string[],\n\t\t\titems: WindowItem[],\n\t\t\tfocus: number,\n\t\t\trows: number,\n\t\t\twidth: number,\n\t\t): { rows: string[]; focusRow: number } {\n\t\t\tconst window = windowItems(items, focus, rows);\n\t\t\tconst rowsBefore = (count: number) => items.slice(0, count).reduce((sum, item) => sum + item.height, 0);\n\t\t\tconst from = rowsBefore(window.first);\n\t\t\tconst block = optionLines.slice(from, rowsBefore(window.last + 1));\n\t\t\tconst visible = applyVerticalViewport(block, width, window.contentRows, theme, {\n\t\t\t\tanchorLine: Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tblock.findIndex((line) => line.includes(CURSOR_MARKER)),\n\t\t\t\t),\n\t\t\t}).lines;\n\t\t\tif (!window.showAbove && !window.showBelow) return { rows: visible, focusRow: rowsBefore(focus) - from };\n\t\t\tconst hint = (direction: \"up\" | \"down\", count: number) =>\n\t\t\t\ttheme.fg(\"dim\", ` ${truncateToWidth(moreOptionsHint(direction, count), Math.max(1, width - 1))}`);\n\t\t\tconst spare = Array.from({ length: Math.max(0, window.contentRows - visible.length) }, () => \"\");\n\t\t\treturn {\n\t\t\t\trows: [\n\t\t\t\t\t...(window.showAbove ? [hint(\"up\", window.hiddenAbove)] : []),\n\t\t\t\t\t...visible,\n\t\t\t\t\t...(window.showBelow ? [hint(\"down\", window.hiddenBelow)] : []),\n\t\t\t\t\t...spare,\n\t\t\t\t],\n\t\t\t\tfocusRow: (window.showAbove ? 1 : 0) + rowsBefore(focus) - from,\n\t\t\t};\n\t\t}\n\n\t\tfunction compute(width: number, terminalRows: number): string[] {\n\t\t\tconst lines: string[] = [];\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tconst maxRows = dialogRowBudget(terminalRows);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\trenderTabs(renderWidth, lines);\n\n\t\t\tif (view === \"review\") {\n\t\t\t\trenderReview(renderWidth, lines);\n\t\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\t\tconst viewport = applyVerticalViewport(lines, renderWidth, maxRows, theme, {\n\t\t\t\t\tpreferredStart: reviewScrollOffset,\n\t\t\t\t});\n\t\t\t\treviewMaxScrollOffset = viewport.maxStart;\n\t\t\t\treviewScrollOffset = viewport.start;\n\t\t\t\treturn viewport.lines;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tconst isMulti = question.multiSelect === true;\n\t\t\twrapWithPrefix(\" \", theme.fg(\"text\", question.question), renderWidth, lines);\n\n\t\t\t// The pinned head and footer leave one bounded area for choices and reading.\n\t\t\tconst footerLines = renderQuestionFooter(renderWidth, `1-${Math.min(9, options.length)}`);\n\t\t\tconst areaRows = Math.max(1, maxRows - lines.length - footerLines.length);\n\t\t\tconst sideBySide = !inputMode && renderWidth >= 72;\n\t\t\t// Measure every authored label, reserving the six-column prefix and a checkmark.\n\t\t\t// Saved answers and focus changes must not move the divider or reflow the preview.\n\t\t\tconst listWidth = sideBySide\n\t\t\t\t? Math.min(\n\t\t\t\t\t\tMath.floor((renderWidth - 3) / 2),\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\t24,\n\t\t\t\t\t\t\t...options.map(\n\t\t\t\t\t\t\t\t(option, index) => 6 + visibleWidth(`${index + 1}. ${option.label.replace(/\\s+/gu, \" \")}`) + 2,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t: renderWidth;\n\t\t\tconst detailWidth = sideBySide ? renderWidth - listWidth - 3 : renderWidth;\n\n\t\t\tconst optionLines: string[] = [];\n\t\t\tconst items: WindowItem[] = [];\n\t\t\tlet focusItem = footerFocused ? options.length - 1 : state.optionIndex;\n\t\t\tfor (let index = 0; index < options.length; index++) {\n\t\t\t\tconst option = options[index];\n\t\t\t\tconst focused = !footerFocused && index === state.optionIndex;\n\t\t\t\tconst checked =\n\t\t\t\t\tisMulti &&\n\t\t\t\t\t((option.kind === \"option\" && state.multiSelected.has(option.optionIndex)) ||\n\t\t\t\t\t\t(option.kind === \"other\" && state.customAnswer?.selected === true));\n\t\t\t\tconst selectedSingle =\n\t\t\t\t\t!isMulti &&\n\t\t\t\t\t(option.kind === \"other\"\n\t\t\t\t\t\t? state.singleAnswer?.kind === \"custom\"\n\t\t\t\t\t\t: state.singleAnswer?.answer === option.label);\n\t\t\t\tconst marker = isMulti ? multiMarker(option, checked, state.customAnswer !== undefined) : \" \";\n\t\t\t\tconst focusArrow = focused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\t\tconst note =\n\t\t\t\t\toption.kind === \"option\" && state.notesByOption.has(option.label) ? theme.fg(\"success\", \" +note\") : \"\";\n\t\t\t\tconst customText =\n\t\t\t\t\toption.kind === \"other\"\n\t\t\t\t\t\t? (state.customAnswer?.text ??\n\t\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined))\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst labelText = (customText ? `${option.label} ✎ ${customText}` : option.label).replace(/\\s+/gu, \" \");\n\t\t\t\tconst label = `${index + 1}. ${labelText}${selectedSingle ? \" ✓\" : \"\"}${note}`;\n\t\t\t\tconst color = focused ? \"accent\" : selectedSingle || checked ? \"success\" : \"text\";\n\t\t\t\tconst row = truncateToWidth(`${focusArrow} ${marker} ${theme.fg(color, label)}`, listWidth);\n\t\t\t\toptionLines.push(\n\t\t\t\t\tfocused ? theme.bg(\"selectedBg\", row + \" \".repeat(Math.max(0, listWidth - visibleWidth(row)))) : row,\n\t\t\t\t);\n\t\t\t\titems.push({ height: 1, countsAsOption: true });\n\t\t\t}\n\n\t\t\tif (inputMode) {\n\t\t\t\tconst start = optionLines.length;\n\t\t\t\tconst label = inputMode === \"notes\" ? `Notes for ${noteTarget ?? \"option\"}:` : \"Your answer:\";\n\t\t\t\toptionLines.push(theme.fg(\"muted\", truncateToWidth(` ${label}`, listWidth)));\n\t\t\t\tfor (const line of editor.render(Math.max(1, listWidth - 2))) optionLines.push(` ${line}`);\n\t\t\t\titems.push({ height: optionLines.length - start, countsAsOption: false });\n\t\t\t\tfocusItem = items.length - 1;\n\t\t\t}\n\n\t\t\tconst regionStart = lines.length;\n\t\t\tlet focusRow: number;\n\t\t\tif (inputMode) {\n\t\t\t\tconst windowed = windowOptionLines(optionLines, items, focusItem, areaRows, renderWidth);\n\t\t\t\tfocusRow = windowed.focusRow;\n\t\t\t\tlines.push(...windowed.rows);\n\t\t\t} else {\n\t\t\t\tconst option = options[state.optionIndex];\n\t\t\t\tconst content: string[] = [];\n\t\t\t\tconst hasPreview = !footerFocused && !isMulti && option.kind === \"option\" && Boolean(option.preview);\n\t\t\t\tconst title = footerFocused ? \"Chat about this\" : `${hasPreview ? \"Preview\" : \"Details\"} · ${option.label}`;\n\t\t\t\t// The compact list may elide a long label; its full text stays readable here.\n\t\t\t\tif (\n\t\t\t\t\t!footerFocused &&\n\t\t\t\t\tvisibleWidth(`${state.optionIndex + 1}. ${option.label.replace(/\\s+/gu, \" \")}`) > listWidth - 6\n\t\t\t\t) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"text\", option.label), detailWidth, content);\n\t\t\t\t}\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\t\" \",\n\t\t\t\t\t\ttheme.fg(\"muted\", \"Discuss this question before choosing an answer.\"),\n\t\t\t\t\t\tdetailWidth,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t);\n\t\t\t\t} else if (option.kind === \"option\") {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", option.description), detailWidth, content);\n\t\t\t\t\tconst note = state.notesByOption.get(option.label);\n\t\t\t\t\tif (note) wrapWithPrefix(\" \", theme.fg(\"success\", `Note: ${note}`), detailWidth, content);\n\t\t\t\t\tif (hasPreview && option.preview) content.push(\"\", ...previewLines(option.preview, detailWidth));\n\t\t\t\t} else {\n\t\t\t\t\tconst custom =\n\t\t\t\t\t\tstate.customAnswer?.text ??\n\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined);\n\t\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\t\" \",\n\t\t\t\t\t\ttheme.fg(\"muted\", custom || \"Write your own answer instead of choosing an option.\"),\n\t\t\t\t\t\tdetailWidth,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// On narrow screens reserve reading space first, then show as many compact\n\t\t\t\t// choices as fit. The focused choice always remains in the list window.\n\t\t\t\tconst optionRows = sideBySide ? areaRows : Math.max(1, Math.min(options.length, areaRows - 4));\n\t\t\t\tconst detailRows = sideBySide ? areaRows : Math.max(1, areaRows - optionRows);\n\t\t\t\tconst left = windowOptionLines(optionLines, items, focusItem, optionRows, listWidth);\n\t\t\t\tconst right = details.render(\n\t\t\t\t\t`${currentIdx}:${state.optionIndex}:${footerFocused}`,\n\t\t\t\t\ttitle,\n\t\t\t\t\tcontent,\n\t\t\t\t\tdetailWidth,\n\t\t\t\t\tdetailRows,\n\t\t\t\t\tkeyGroupAction([\"app.question.pageUp\", \"app.question.pageDown\"], \"scroll\"),\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tfocusRow = left.focusRow;\n\t\t\t\tif (sideBySide) {\n\t\t\t\t\tfor (let row = 0; row < Math.max(left.rows.length, right.length); row++) {\n\t\t\t\t\t\tconst leftText = left.rows[row] ?? \"\";\n\t\t\t\t\t\tconst leftPadded = leftText + \" \".repeat(Math.max(0, listWidth - visibleWidth(leftText)));\n\t\t\t\t\t\tlines.push(`${leftPadded}${theme.fg(\"dim\", \" │ \")}${right[row] ?? \"\"}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlines.push(...left.rows, ...right);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst anchorLine = regionStart + focusRow;\n\t\t\tlines.push(...footerLines);\n\t\t\t// Only a terminal too short for the pinned rows has lines left to drop here.\n\t\t\treturn applyVerticalViewport(lines, renderWidth, maxRows, theme, { anchorLine }).lines;\n\t\t}\n\n\t\treturn {\n\t\t\tget focused() {\n\t\t\t\treturn dialogFocused;\n\t\t\t},\n\t\t\tset focused(value: boolean) {\n\t\t\t\tdialogFocused = value;\n\t\t\t\tsyncEditorFocus();\n\t\t\t},\n\t\t\trender,\n\t\t\tinvalidate: () => {\n\t\t\t\tcache.invalidate();\n\t\t\t},\n\t\t\thandleInput,\n\t\t\tdispose() {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** One block of rows in the option area: an option, or the notes/custom editor under the list. */
|
|
2
|
+
export interface WindowItem {
|
|
3
|
+
height: number;
|
|
4
|
+
countsAsOption: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ItemWindow {
|
|
7
|
+
/** Index of the first and last visible item. */
|
|
8
|
+
first: number;
|
|
9
|
+
last: number;
|
|
10
|
+
/** Rows left for the visible items after reserving the hint rows. */
|
|
11
|
+
contentRows: number;
|
|
12
|
+
showAbove: boolean;
|
|
13
|
+
showBelow: boolean;
|
|
14
|
+
/** Options (not rows) outside the window. */
|
|
15
|
+
hiddenAbove: number;
|
|
16
|
+
hiddenBelow: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function moreOptionsHint(direction: "up" | "down", count: number): string;
|
|
19
|
+
/**
|
|
20
|
+
* Choose the whole items to show in `rows` rows, keeping `focus` visible. Hint rows
|
|
21
|
+
* ("↑ N more options", "↓ N more options") are reserved only on a side that has
|
|
22
|
+
* hidden items, so a list that starts or ends in view gets that row back.
|
|
23
|
+
* An item taller than the window stays alone; the caller clips its rows.
|
|
24
|
+
*/
|
|
25
|
+
export declare function windowItems(items: readonly WindowItem[], focus: number, rows: number): ItemWindow;
|
|
26
|
+
//# sourceMappingURL=option-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-window.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/option-window.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAsCjG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function moreOptionsHint(direction, count) {
|
|
2
|
+
const arrow = direction === "up" ? "↑" : "↓";
|
|
3
|
+
if (count <= 0)
|
|
4
|
+
return `${arrow} more ${direction === "up" ? "above" : "below"}`;
|
|
5
|
+
return `${arrow} ${count} more option${count === 1 ? "" : "s"}`;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Choose the whole items to show in `rows` rows, keeping `focus` visible. Hint rows
|
|
9
|
+
* ("↑ N more options", "↓ N more options") are reserved only on a side that has
|
|
10
|
+
* hidden items, so a list that starts or ends in view gets that row back.
|
|
11
|
+
* An item taller than the window stays alone; the caller clips its rows.
|
|
12
|
+
*/
|
|
13
|
+
export function windowItems(items, focus, rows) {
|
|
14
|
+
const count = items.length;
|
|
15
|
+
const total = items.reduce((sum, item) => sum + item.height, 0);
|
|
16
|
+
const build = (first, last, contentRows) => ({
|
|
17
|
+
first,
|
|
18
|
+
last,
|
|
19
|
+
contentRows,
|
|
20
|
+
showAbove: first > 0,
|
|
21
|
+
showBelow: last < count - 1,
|
|
22
|
+
hiddenAbove: items.slice(0, first).filter((item) => item.countsAsOption).length,
|
|
23
|
+
hiddenBelow: items.slice(last + 1).filter((item) => item.countsAsOption).length,
|
|
24
|
+
});
|
|
25
|
+
if (total <= rows)
|
|
26
|
+
return build(0, count - 1, rows);
|
|
27
|
+
const windowFor = (contentRows) => {
|
|
28
|
+
let first = focus;
|
|
29
|
+
let last = focus;
|
|
30
|
+
let used = items[focus].height;
|
|
31
|
+
for (let grew = true; grew;) {
|
|
32
|
+
grew = false;
|
|
33
|
+
if (last + 1 < count && used + items[last + 1].height <= contentRows) {
|
|
34
|
+
last++;
|
|
35
|
+
used += items[last].height;
|
|
36
|
+
grew = true;
|
|
37
|
+
}
|
|
38
|
+
if (first > 0 && used + items[first - 1].height <= contentRows) {
|
|
39
|
+
first--;
|
|
40
|
+
used += items[first].height;
|
|
41
|
+
grew = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return build(first, last, contentRows);
|
|
45
|
+
};
|
|
46
|
+
if (rows <= 2)
|
|
47
|
+
return { ...windowFor(Math.max(1, rows)), showAbove: false, showBelow: false };
|
|
48
|
+
const window = windowFor(rows - 2);
|
|
49
|
+
if (window.first === 0 || window.last === count - 1)
|
|
50
|
+
return windowFor(rows - 1);
|
|
51
|
+
return window;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=option-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-window.js","sourceRoot":"","sources":["../../../src/extensions/question/option-window.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,eAAe,CAAC,SAAwB,EAAE,KAAa;IACtE,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,GAAG,KAAK,SAAS,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjF,OAAO,GAAG,KAAK,IAAI,KAAK,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAA4B,EAAE,KAAa,EAAE,IAAY;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB,EAAc,EAAE,CAAC,CAAC;QAChF,KAAK;QACL,IAAI;QACJ,WAAW;QACX,SAAS,EAAE,KAAK,GAAG,CAAC;QACpB,SAAS,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC;QAC3B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM;QAC/E,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM;KAC/E,CAAC,CAAC;IACH,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAc,EAAE;QACrD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAI,CAAC;YAC9B,IAAI,GAAG,KAAK,CAAC;YACb,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBACtE,IAAI,EAAE,CAAC;gBACP,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;gBAC3B,IAAI,GAAG,IAAI,CAAC;YACb,CAAC;YACD,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBAChE,KAAK,EAAE,CAAC;gBACR,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;gBAC5B,IAAI,GAAG,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9F,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["/** One block of rows in the option area: an option, or the notes/custom editor under the list. */\nexport interface WindowItem {\n\theight: number;\n\tcountsAsOption: boolean;\n}\n\nexport interface ItemWindow {\n\t/** Index of the first and last visible item. */\n\tfirst: number;\n\tlast: number;\n\t/** Rows left for the visible items after reserving the hint rows. */\n\tcontentRows: number;\n\tshowAbove: boolean;\n\tshowBelow: boolean;\n\t/** Options (not rows) outside the window. */\n\thiddenAbove: number;\n\thiddenBelow: number;\n}\n\nexport function moreOptionsHint(direction: \"up\" | \"down\", count: number): string {\n\tconst arrow = direction === \"up\" ? \"↑\" : \"↓\";\n\tif (count <= 0) return `${arrow} more ${direction === \"up\" ? \"above\" : \"below\"}`;\n\treturn `${arrow} ${count} more option${count === 1 ? \"\" : \"s\"}`;\n}\n\n/**\n * Choose the whole items to show in `rows` rows, keeping `focus` visible. Hint rows\n * (\"↑ N more options\", \"↓ N more options\") are reserved only on a side that has\n * hidden items, so a list that starts or ends in view gets that row back.\n * An item taller than the window stays alone; the caller clips its rows.\n */\nexport function windowItems(items: readonly WindowItem[], focus: number, rows: number): ItemWindow {\n\tconst count = items.length;\n\tconst total = items.reduce((sum, item) => sum + item.height, 0);\n\tconst build = (first: number, last: number, contentRows: number): ItemWindow => ({\n\t\tfirst,\n\t\tlast,\n\t\tcontentRows,\n\t\tshowAbove: first > 0,\n\t\tshowBelow: last < count - 1,\n\t\thiddenAbove: items.slice(0, first).filter((item) => item.countsAsOption).length,\n\t\thiddenBelow: items.slice(last + 1).filter((item) => item.countsAsOption).length,\n\t});\n\tif (total <= rows) return build(0, count - 1, rows);\n\n\tconst windowFor = (contentRows: number): ItemWindow => {\n\t\tlet first = focus;\n\t\tlet last = focus;\n\t\tlet used = items[focus].height;\n\t\tfor (let grew = true; grew; ) {\n\t\t\tgrew = false;\n\t\t\tif (last + 1 < count && used + items[last + 1].height <= contentRows) {\n\t\t\t\tlast++;\n\t\t\t\tused += items[last].height;\n\t\t\t\tgrew = true;\n\t\t\t}\n\t\t\tif (first > 0 && used + items[first - 1].height <= contentRows) {\n\t\t\t\tfirst--;\n\t\t\t\tused += items[first].height;\n\t\t\t\tgrew = true;\n\t\t\t}\n\t\t}\n\t\treturn build(first, last, contentRows);\n\t};\n\n\tif (rows <= 2) return { ...windowFor(Math.max(1, rows)), showAbove: false, showBelow: false };\n\tconst window = windowFor(rows - 2);\n\tif (window.first === 0 || window.last === count - 1) return windowFor(rows - 1);\n\treturn window;\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memoize rendered preview lines by (previewText, width
|
|
3
|
-
*
|
|
4
|
-
* immutable for a dialog's lifetime and carry few previews, so no eviction.
|
|
2
|
+
* Memoize rendered preview lines by (previewText, width) so editor keystrokes and
|
|
3
|
+
* option scrolling don't re-parse the preview markdown on every frame. Questions
|
|
4
|
+
* are immutable for a dialog's lifetime and carry few previews, so no eviction.
|
|
5
5
|
*/
|
|
6
6
|
export declare class PreviewLinesCache {
|
|
7
7
|
private cache;
|
|
8
|
-
get(previewText: string, width: number,
|
|
8
|
+
get(previewText: string, width: number, compute: () => string[]): string[];
|
|
9
9
|
}
|
|
10
10
|
/** Cache custom dialog output by terminal dimensions. */
|
|
11
11
|
export declare class WidthCachedRender {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-cache.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"render-cache.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE;CAa1E;AAED,yDAAyD;AACzD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,IAAI,IAAI;IAIlB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE;CAQlG"}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memoize rendered preview lines by (previewText, width
|
|
3
|
-
*
|
|
4
|
-
* immutable for a dialog's lifetime and carry few previews, so no eviction.
|
|
2
|
+
* Memoize rendered preview lines by (previewText, width) so editor keystrokes and
|
|
3
|
+
* option scrolling don't re-parse the preview markdown on every frame. Questions
|
|
4
|
+
* are immutable for a dialog's lifetime and carry few previews, so no eviction.
|
|
5
5
|
*/
|
|
6
6
|
export class PreviewLinesCache {
|
|
7
7
|
constructor() {
|
|
8
8
|
this.cache = new Map();
|
|
9
9
|
}
|
|
10
|
-
get(previewText, width,
|
|
11
|
-
let
|
|
12
|
-
if (!
|
|
13
|
-
|
|
14
|
-
this.cache.set(previewText,
|
|
10
|
+
get(previewText, width, compute) {
|
|
11
|
+
let byWidth = this.cache.get(previewText);
|
|
12
|
+
if (!byWidth) {
|
|
13
|
+
byWidth = new Map();
|
|
14
|
+
this.cache.set(previewText, byWidth);
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
let lines = byDimensions.get(key);
|
|
16
|
+
let lines = byWidth.get(width);
|
|
18
17
|
if (!lines) {
|
|
19
18
|
lines = compute();
|
|
20
|
-
|
|
19
|
+
byWidth.set(width, lines);
|
|
21
20
|
}
|
|
22
21
|
return lines;
|
|
23
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACS,UAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACS,UAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAe1D,CAAC;IAbA,GAAG,CAAC,WAAmB,EAAE,KAAa,EAAE,OAAuB;QAC9D,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,yDAAyD;AACzD,MAAM,OAAO,iBAAiB;IAK7B,UAAU;QACT,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,OAAoD;QACtF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;YAC/F,OAAO,IAAI,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD","sourcesContent":["/**\n * Memoize rendered preview lines by (previewText, width) so editor keystrokes and\n * option scrolling don't re-parse the preview markdown on every frame. Questions\n * are immutable for a dialog's lifetime and carry few previews, so no eviction.\n */\nexport class PreviewLinesCache {\n\tprivate cache = new Map<string, Map<number, string[]>>();\n\n\tget(previewText: string, width: number, compute: () => string[]): string[] {\n\t\tlet byWidth = this.cache.get(previewText);\n\t\tif (!byWidth) {\n\t\t\tbyWidth = new Map();\n\t\t\tthis.cache.set(previewText, byWidth);\n\t\t}\n\t\tlet lines = byWidth.get(width);\n\t\tif (!lines) {\n\t\t\tlines = compute();\n\t\t\tbyWidth.set(width, lines);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\n/** Cache custom dialog output by terminal dimensions. */\nexport class WidthCachedRender {\n\tprivate cachedLines: string[] | undefined;\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedHeight: number | undefined;\n\n\tinvalidate(): void {\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tget(width: number, height: number, compute: (width: number, height: number) => string[]): string[] {\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === width && this.cachedHeight === height)\n\t\t\treturn this.cachedLines;\n\t\tthis.cachedLines = compute(width, height);\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedHeight = height;\n\t\treturn this.cachedLines;\n\t}\n}\n"]}
|
|
@@ -10,7 +10,7 @@ export declare const TODO_MAX_BATCH_ITEMS = 20;
|
|
|
10
10
|
/** Input limits keep task snapshots and model-facing output bounded. */
|
|
11
11
|
export declare const TODO_MAX_SUBJECT_LENGTH = 160;
|
|
12
12
|
export declare const TODO_MAX_DESCRIPTION_LENGTH = 500;
|
|
13
|
-
export declare const TODO_TOOL_DESCRIPTION = "Manage the conversation's task list for multi-step coding work. One call applies a patch: create adds tasks (status defaults to pending), update edits tasks by id (blank or omitted fields are kept), delete removes tasks by id. Omit or leave empty any group you do not need; call with {} to list every task with its description.
|
|
13
|
+
export declare const TODO_TOOL_DESCRIPTION = "Manage the conversation's task list for multi-step coding work. One call applies a patch: create adds tasks (status defaults to pending), update edits tasks by id (blank or omitted fields are kept), delete removes tasks by id. Omit or leave empty any group you do not need; call with {} to list every task with its description. At most one task may be in_progress: setting one demotes the others. The list holds 20 tasks; when full, the oldest completed tasks are removed automatically, except tasks created or updated in this call. Delete existing tasks in the same patch to free space; an id cannot be both updated and deleted. A call that fails validation leaves the list unchanged.\n\n{\"create\": [{\"subject\": \"Wire parser\", \"description\": \"Parser handles the config format\", \"status\": \"in_progress\"}]}\n{\"update\": [{\"id\": 1, \"status\": \"completed\"}, {\"id\": 2, \"status\": \"in_progress\"}]}\n{\"delete\": [3]}";
|
|
14
14
|
export declare const TODO_PROMPT_SNIPPET = "Track multi-step coding work with a small outcome-oriented task list";
|
|
15
15
|
export declare const TODO_PROMPT_GUIDELINES: string[];
|
|
16
16
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,0EAA0E;AAC1E,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAO/C,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,0EAA0E;AAC1E,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAO/C,eAAO,MAAM,qBAAqB,66BAIlB,CAAC;AAEjB,eAAO,MAAM,mBAAmB,yEAAyE,CAAC;AAE1G,eAAO,MAAM,sBAAsB,UAKlC,CAAC"}
|
|
@@ -15,7 +15,7 @@ export const TODO_MAX_DESCRIPTION_LENGTH = 500;
|
|
|
15
15
|
// Per-parameter bounds and wording live in the schema. The single-in_progress
|
|
16
16
|
// rule is stated in both places on purpose: it is the invariant models break
|
|
17
17
|
// most often.
|
|
18
|
-
export const TODO_TOOL_DESCRIPTION = `Manage the conversation's task list for multi-step coding work. One call applies a patch: create adds tasks (status defaults to pending), update edits tasks by id (blank or omitted fields are kept), delete removes tasks by id. Omit or leave empty any group you do not need; call with {} to list every task with its description.
|
|
18
|
+
export const TODO_TOOL_DESCRIPTION = `Manage the conversation's task list for multi-step coding work. One call applies a patch: create adds tasks (status defaults to pending), update edits tasks by id (blank or omitted fields are kept), delete removes tasks by id. Omit or leave empty any group you do not need; call with {} to list every task with its description. At most one task may be in_progress: setting one demotes the others. The list holds 20 tasks; when full, the oldest completed tasks are removed automatically, except tasks created or updated in this call. Delete existing tasks in the same patch to free space; an id cannot be both updated and deleted. A call that fails validation leaves the list unchanged.
|
|
19
19
|
|
|
20
20
|
{"create": [{"subject": "Wire parser", "description": "Parser handles the config format", "status": "in_progress"}]}
|
|
21
21
|
{"update": [{"id": 1, "status": "completed"}, {"id": 2, "status": "in_progress"}]}
|
|
@@ -23,7 +23,7 @@ export const TODO_TOOL_DESCRIPTION = `Manage the conversation's task list for mu
|
|
|
23
23
|
export const TODO_PROMPT_SNIPPET = "Track multi-step coding work with a small outcome-oriented task list";
|
|
24
24
|
export const TODO_PROMPT_GUIDELINES = [
|
|
25
25
|
"Use `todo` for work with three or more meaningful steps, for user-provided task lists, and in long sessions where progress can drift; skip it for trivial single-step tasks and simple Q&A.",
|
|
26
|
-
"
|
|
26
|
+
"Mark the `todo` task you are working on in_progress before starting, and completed only after its description is satisfied. Leave no task in_progress when waiting or when all work is done.",
|
|
27
27
|
"When blocked, leave the `todo` task pending and create a task for the blocker instead of faking completion.",
|
|
28
28
|
"Keep the `todo` list short: list before create to avoid duplicates, work in id order, and delete obsolete tasks promptly.",
|
|
29
29
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/todo/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,cAAc;AACd,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;gBAIrB,CAAC;AAEjB,MAAM,CAAC,MAAM,mBAAmB,GAAG,sEAAsE,CAAC;AAE1G,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,6LAA6L;IAC7L,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/todo/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,cAAc;AACd,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;gBAIrB,CAAC;AAEjB,MAAM,CAAC,MAAM,mBAAmB,GAAG,sEAAsE,CAAC;AAE1G,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,6LAA6L;IAC7L,8LAA8L;IAC9L,6GAA6G;IAC7G,2HAA2H;CAC3H,CAAC","sourcesContent":["/**\n * todo/constants.ts — tool identity, command name, input bounds, and prompt copy.\n */\n\nexport const TODO_TOOL_NAME = \"todo\";\nexport const TODO_TOOL_LABEL = \"Todo\";\nexport const TODOS_COMMAND_NAME = \"todos\";\n\n/** Hard capacity of the task list and of a single create/delete batch. */\nexport const TODO_MAX_ITEMS = 20;\nexport const TODO_MAX_BATCH_ITEMS = 20;\n\n/** Input limits keep task snapshots and model-facing output bounded. */\nexport const TODO_MAX_SUBJECT_LENGTH = 160;\nexport const TODO_MAX_DESCRIPTION_LENGTH = 500;\n\n// Mechanism plus the cross-field rules TodoParamsSchema cannot state (total\n// capacity with automatic reclaim, the single-in_progress rule, atomicity).\n// Per-parameter bounds and wording live in the schema. The single-in_progress\n// rule is stated in both places on purpose: it is the invariant models break\n// most often.\nexport const TODO_TOOL_DESCRIPTION = `Manage the conversation's task list for multi-step coding work. One call applies a patch: create adds tasks (status defaults to pending), update edits tasks by id (blank or omitted fields are kept), delete removes tasks by id. Omit or leave empty any group you do not need; call with {} to list every task with its description. At most one task may be in_progress: setting one demotes the others. The list holds 20 tasks; when full, the oldest completed tasks are removed automatically, except tasks created or updated in this call. Delete existing tasks in the same patch to free space; an id cannot be both updated and deleted. A call that fails validation leaves the list unchanged.\n\n{\"create\": [{\"subject\": \"Wire parser\", \"description\": \"Parser handles the config format\", \"status\": \"in_progress\"}]}\n{\"update\": [{\"id\": 1, \"status\": \"completed\"}, {\"id\": 2, \"status\": \"in_progress\"}]}\n{\"delete\": [3]}`;\n\nexport const TODO_PROMPT_SNIPPET = \"Track multi-step coding work with a small outcome-oriented task list\";\n\nexport const TODO_PROMPT_GUIDELINES = [\n\t\"Use `todo` for work with three or more meaningful steps, for user-provided task lists, and in long sessions where progress can drift; skip it for trivial single-step tasks and simple Q&A.\",\n\t\"Mark the `todo` task you are working on in_progress before starting, and completed only after its description is satisfied. Leave no task in_progress when waiting or when all work is done.\",\n\t\"When blocked, leave the `todo` task pending and create a task for the blocker instead of faking completion.\",\n\t\"Keep the `todo` list short: list before create to avoid duplicates, work in id order, and delete obsolete tasks promptly.\",\n];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AA6BxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AA6BxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8EnD"}
|
|
@@ -12,7 +12,7 @@ import { isStaleExtensionContextError, } from "../../core/extensions/types.js";
|
|
|
12
12
|
import { TODO_PROMPT_GUIDELINES, TODO_PROMPT_SNIPPET, TODO_TOOL_DESCRIPTION, TODO_TOOL_LABEL, TODO_TOOL_NAME, TODOS_COMMAND_NAME, } from "./constants.js";
|
|
13
13
|
import { TodoParamsSchema } from "./schema.js";
|
|
14
14
|
import { createTodoStore, replayTodosFromBranch } from "./state.js";
|
|
15
|
-
import { formatCommandList, formatTodoCall, formatTodoContent,
|
|
15
|
+
import { formatCommandList, formatTodoCall, formatTodoContent, formatTodoSummary } from "./view.js";
|
|
16
16
|
import { TodoWidget } from "./widget.js";
|
|
17
17
|
function safeReplay(ctx, store) {
|
|
18
18
|
// Every ctx.sessionManager access stays inside the guard: a lifecycle event
|
|
@@ -38,10 +38,6 @@ export default function todo(pi) {
|
|
|
38
38
|
parameters: TodoParamsSchema,
|
|
39
39
|
constrainedSampling: { type: "json_schema", strict: "prefer" },
|
|
40
40
|
executionMode: "sequential",
|
|
41
|
-
// Consecutive todo calls collapse into one run like read/find's `explore`
|
|
42
|
-
// group; the widget already carries the live list, so the transcript only
|
|
43
|
-
// needs the sequence of operations.
|
|
44
|
-
toolGroup: TODO_TOOL_NAME,
|
|
45
41
|
async execute(_toolCallId, params, _signal, _onUpdate) {
|
|
46
42
|
// Validation errors throw before any state mutation, so the store is
|
|
47
43
|
// untouched on failure.
|
|
@@ -49,11 +45,19 @@ export default function todo(pi) {
|
|
|
49
45
|
const text = formatTodoContent(details.change, details.state);
|
|
50
46
|
return { content: [{ type: "text", text }], details };
|
|
51
47
|
},
|
|
48
|
+
// The widget already carries the live list, so a collapsed row is one
|
|
49
|
+
// result-aware line and the result text appears only when expanded.
|
|
52
50
|
renderCall(args, theme, context) {
|
|
53
51
|
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
54
|
-
text.setText(context.
|
|
55
|
-
?
|
|
56
|
-
:
|
|
52
|
+
text.setText(context.expanded
|
|
53
|
+
? formatTodoCall(args, theme, true, context.result)
|
|
54
|
+
: formatTodoSummary(args, theme, context));
|
|
55
|
+
return text;
|
|
56
|
+
},
|
|
57
|
+
renderResult(result, options, theme, context) {
|
|
58
|
+
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
59
|
+
const output = result.content.flatMap((block) => (block.type === "text" ? [block.text] : [])).join("\n");
|
|
60
|
+
text.setText(options.expanded ? theme.fg("toolOutput", output) : "");
|
|
57
61
|
return text;
|
|
58
62
|
},
|
|
59
63
|
});
|