@bastani/atomic 0.9.5-alpha.2 → 0.9.5-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/builtin/cursor/package.json +2 -2
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/web-access/package.json +1 -1
  7. package/dist/builtin/workflows/CHANGELOG.md +13 -0
  8. package/dist/builtin/workflows/builtin/goal-prompts.ts +2 -0
  9. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +138 -0
  10. package/dist/builtin/workflows/builtin/ralph-runner.ts +10 -118
  11. package/dist/builtin/workflows/builtin/shared-prompts.ts +5 -0
  12. package/dist/builtin/workflows/package.json +1 -1
  13. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  14. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  15. package/dist/modes/interactive/interactive-auth-login.js +0 -1
  16. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  17. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  18. package/dist/modes/interactive/interactive-hotkeys-debug.js +3 -3
  19. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  20. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  21. package/dist/modes/interactive/interactive-input-handling.js +0 -51
  22. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  23. package/dist/modes/interactive/interactive-mode-base.d.ts +2 -4
  24. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  25. package/dist/modes/interactive/interactive-mode-base.js +2 -4
  26. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  27. package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -9
  28. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  29. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  30. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  31. package/dist/modes/interactive/interactive-model-routing.js +0 -3
  32. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  33. package/dist/modes/interactive/interactive-onboarding.d.ts +0 -9
  34. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
  35. package/dist/modes/interactive/interactive-onboarding.js +23 -201
  36. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  37. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  38. package/dist/modes/interactive/interactive-session-routing.js +2 -2
  39. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  40. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  41. package/dist/modes/interactive/interactive-slash-commands.js +1 -1
  42. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  43. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  44. package/dist/modes/interactive/interactive-startup.js +36 -43
  45. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  46. package/docs/quickstart.md +3 -3
  47. package/docs/settings.md +1 -1
  48. package/docs/usage.md +1 -1
  49. package/docs/workflows.md +21 -2
  50. package/npm-shrinkwrap.json +23 -23
  51. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-hotkeys-debug.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-hotkeys-debug.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Keybinding, type AppKeybinding, fs, path, Markdown, Spacer, Text, visibleWidth, getDebugLogPath, ArminComponent, DaxnutsComponent, DynamicBorder, EarendilAnnouncementComponent, formatKeyText, keyDisplayText, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAppKeyDisplay = function(this: InteractiveModeBase, action: AppKeybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.getEditorKeyDisplay = function(this: InteractiveModeBase, action: Keybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.handleHotkeysCommand = function(this: InteractiveModeBase): void {\n // Navigation keybindings\n const cursorUp = this.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n const cursorDown = this.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n const cursorLeft = this.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n const cursorRight = this.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n const cursorWordLeft = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordLeft\",\n );\n const cursorWordRight = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordRight\",\n );\n const cursorLineStart = this.getEditorKeyDisplay(\n \"tui.editor.cursorLineStart\",\n );\n const cursorLineEnd = this.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n const jumpForward = this.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n const jumpBackward = this.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n const pageUp = this.getEditorKeyDisplay(\"tui.editor.pageUp\");\n const pageDown = this.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n // Editing keybindings\n const submit = this.getEditorKeyDisplay(\"tui.input.submit\");\n const newLine = this.getEditorKeyDisplay(\"tui.input.newLine\");\n const deleteWordBackward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordBackward\",\n );\n const deleteWordForward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordForward\",\n );\n const deleteToLineStart = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineStart\",\n );\n const deleteToLineEnd = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineEnd\",\n );\n const yank = this.getEditorKeyDisplay(\"tui.editor.yank\");\n const yankPop = this.getEditorKeyDisplay(\"tui.editor.yankPop\");\n const undo = this.getEditorKeyDisplay(\"tui.editor.undo\");\n const tab = this.getEditorKeyDisplay(\"tui.input.tab\");\n\n // App keybindings\n const interrupt = this.getAppKeyDisplay(\"app.interrupt\");\n const clear = this.getAppKeyDisplay(\"app.clear\");\n const exit = this.getAppKeyDisplay(\"app.exit\");\n const suspend = this.getAppKeyDisplay(\"app.suspend\");\n const cycleThinkingLevel = this.getAppKeyDisplay(\"app.thinking.cycle\");\n const cycleModelForward = this.getAppKeyDisplay(\"app.model.cycleForward\");\n const selectModel = this.getAppKeyDisplay(\"app.model.select\");\n const expandTools = this.getAppKeyDisplay(\"app.tools.expand\");\n const toggleThinking = this.getAppKeyDisplay(\"app.thinking.toggle\");\n const externalEditor = this.getAppKeyDisplay(\"app.editor.external\");\n const cycleModelBackward = this.getAppKeyDisplay(\"app.model.cycleBackward\");\n const followUp = this.getAppKeyDisplay(\"app.message.followUp\");\n const dequeue = this.getAppKeyDisplay(\"app.message.dequeue\");\n const pasteImage = this.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n let hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (ctrl+enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n // Add extension-registered shortcuts\n const extensionRunner = this.session.extensionRunner;\n const shortcuts = extensionRunner.getShortcuts(\n this.keybindings.getEffectiveConfig(),\n );\n if (shortcuts.size > 0) {\n hotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n for (const [key, shortcut] of shortcuts) {\n const description = shortcut.description ?? shortcut.extensionPath;\n const keyDisplay = formatKeyText(key, { capitalize: true });\n hotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n }\n }\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DynamicBorder());\n this.chatContainer.addChild(\n new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0),\n );\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()),\n );\n this.chatContainer.addChild(new DynamicBorder());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleClearCommand = async function(this: InteractiveModeBase): Promise<void> {\n if (this.loadingAnimation) {\n this.loadingAnimation.stop();\n this.loadingAnimation = undefined;\n }\n this.statusContainer.clear();\n try {\n const result = await this.runtimeHost.newSession();\n if (result.cancelled) {\n return;\n }\n if (this.firstRunOnboardingActive) {\n this.clearPendingFirstRunOnboardingSeed();\n }\n this.renderCurrentSessionState();\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(`${theme.fg(\"accent\", \"✓ New session started\")}`, 1, 1),\n );\n this.ui.requestRender();\n } catch (error: unknown) {\n await this.handleFatalRuntimeError(\"Failed to create session\", error);\n }\n };\n\nInteractiveModeBase.prototype.handleDebugCommand = function(this: InteractiveModeBase): void {\n const width = this.ui.terminal.columns;\n const height = this.ui.terminal.rows;\n const allLines = this.ui.render(width);\n\n const debugLogPath = getDebugLogPath();\n const debugData = [\n `Debug output at ${new Date().toISOString()}`,\n `Terminal: ${width}x${height}`,\n `Total lines: ${allLines.length}`,\n \"\",\n \"=== All rendered lines with visible widths ===\",\n ...allLines.map((line, idx) => {\n const vw = visibleWidth(line);\n const escaped = JSON.stringify(line);\n return `[${idx}] (w=${vw}) ${escaped}`;\n }),\n \"\",\n \"=== Agent messages (JSONL) ===\",\n ...this.session.messages.map((msg) => JSON.stringify(msg)),\n \"\",\n ].join(\"\\n\");\n\n fs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n fs.writeFileSync(debugLogPath, debugData);\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(\n `${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`,\n 1,\n 1,\n ),\n );\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleArminSaysHi = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new ArminComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDementedDelves = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new EarendilAnnouncementComponent());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDaxnuts = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DaxnutsComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.checkDaxnutsEasterEgg = function(this: InteractiveModeBase, model: { provider: string; id: string }): void {\n if (\n model.provider === \"opencode\" &&\n model.id.toLowerCase().includes(\"kimi-k2.5\")\n ) {\n this.handleDaxnuts();\n }\n };\n"]}
1
+ {"version":3,"file":"interactive-hotkeys-debug.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-hotkeys-debug.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Keybinding, type AppKeybinding, fs, path, Markdown, Spacer, Text, visibleWidth, getDebugLogPath, ArminComponent, DaxnutsComponent, DynamicBorder, EarendilAnnouncementComponent, formatKeyText, keyDisplayText, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAppKeyDisplay = function(this: InteractiveModeBase, action: AppKeybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.getEditorKeyDisplay = function(this: InteractiveModeBase, action: Keybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.handleHotkeysCommand = function(this: InteractiveModeBase): void {\n // Navigation keybindings\n const cursorUp = this.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n const cursorDown = this.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n const cursorLeft = this.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n const cursorRight = this.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n const cursorWordLeft = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordLeft\",\n );\n const cursorWordRight = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordRight\",\n );\n const cursorLineStart = this.getEditorKeyDisplay(\n \"tui.editor.cursorLineStart\",\n );\n const cursorLineEnd = this.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n const jumpForward = this.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n const jumpBackward = this.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n const pageUp = this.getEditorKeyDisplay(\"tui.editor.pageUp\");\n const pageDown = this.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n // Editing keybindings\n const submit = this.getEditorKeyDisplay(\"tui.input.submit\");\n const newLine = this.getEditorKeyDisplay(\"tui.input.newLine\");\n const deleteWordBackward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordBackward\",\n );\n const deleteWordForward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordForward\",\n );\n const deleteToLineStart = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineStart\",\n );\n const deleteToLineEnd = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineEnd\",\n );\n const yank = this.getEditorKeyDisplay(\"tui.editor.yank\");\n const yankPop = this.getEditorKeyDisplay(\"tui.editor.yankPop\");\n const undo = this.getEditorKeyDisplay(\"tui.editor.undo\");\n const tab = this.getEditorKeyDisplay(\"tui.input.tab\");\n\n // App keybindings\n const interrupt = this.getAppKeyDisplay(\"app.interrupt\");\n const clear = this.getAppKeyDisplay(\"app.clear\");\n const exit = this.getAppKeyDisplay(\"app.exit\");\n const suspend = this.getAppKeyDisplay(\"app.suspend\");\n const cycleThinkingLevel = this.getAppKeyDisplay(\"app.thinking.cycle\");\n const cycleModelForward = this.getAppKeyDisplay(\"app.model.cycleForward\");\n const selectModel = this.getAppKeyDisplay(\"app.model.select\");\n const expandTools = this.getAppKeyDisplay(\"app.tools.expand\");\n const toggleThinking = this.getAppKeyDisplay(\"app.thinking.toggle\");\n const externalEditor = this.getAppKeyDisplay(\"app.editor.external\");\n const cycleModelBackward = this.getAppKeyDisplay(\"app.model.cycleBackward\");\n const followUp = this.getAppKeyDisplay(\"app.message.followUp\");\n const dequeue = this.getAppKeyDisplay(\"app.message.dequeue\");\n const pasteImage = this.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n let hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (ctrl+enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n // Add extension-registered shortcuts\n const extensionRunner = this.session.extensionRunner;\n const shortcuts = extensionRunner.getShortcuts(\n this.keybindings.getEffectiveConfig(),\n );\n if (shortcuts.size > 0) {\n hotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n for (const [key, shortcut] of shortcuts) {\n const description = shortcut.description ?? shortcut.extensionPath;\n const keyDisplay = formatKeyText(key, { capitalize: true });\n hotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n }\n }\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DynamicBorder());\n this.chatContainer.addChild(\n new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0),\n );\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()),\n );\n this.chatContainer.addChild(new DynamicBorder());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleClearCommand = async function(this: InteractiveModeBase): Promise<void> {\n if (this.loadingAnimation) {\n this.loadingAnimation.stop();\n this.loadingAnimation = undefined;\n }\n this.statusContainer.clear();\n try {\n const result = await this.runtimeHost.newSession();\n if (result.cancelled) {\n return;\n }\n this.renderCurrentSessionState();\n if (this.firstRunNoticeVisible) {\n this.clearFirstRunOnboardingUi();\n }\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(`${theme.fg(\"accent\", \"✓ New session started\")}`, 1, 1),\n );\n this.ui.requestRender();\n } catch (error: unknown) {\n await this.handleFatalRuntimeError(\"Failed to create session\", error);\n }\n };\n\nInteractiveModeBase.prototype.handleDebugCommand = function(this: InteractiveModeBase): void {\n const width = this.ui.terminal.columns;\n const height = this.ui.terminal.rows;\n const allLines = this.ui.render(width);\n\n const debugLogPath = getDebugLogPath();\n const debugData = [\n `Debug output at ${new Date().toISOString()}`,\n `Terminal: ${width}x${height}`,\n `Total lines: ${allLines.length}`,\n \"\",\n \"=== All rendered lines with visible widths ===\",\n ...allLines.map((line, idx) => {\n const vw = visibleWidth(line);\n const escaped = JSON.stringify(line);\n return `[${idx}] (w=${vw}) ${escaped}`;\n }),\n \"\",\n \"=== Agent messages (JSONL) ===\",\n ...this.session.messages.map((msg) => JSON.stringify(msg)),\n \"\",\n ].join(\"\\n\");\n\n fs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n fs.writeFileSync(debugLogPath, debugData);\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(\n `${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`,\n 1,\n 1,\n ),\n );\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleArminSaysHi = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new ArminComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDementedDelves = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new EarendilAnnouncementComponent());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDaxnuts = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DaxnutsComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.checkDaxnutsEasterEgg = function(this: InteractiveModeBase, model: { provider: string; id: string }): void {\n if (\n model.provider === \"opencode\" &&\n model.id.toLowerCase().includes(\"kimi-k2.5\")\n ) {\n this.handleDaxnuts();\n }\n };\n"]}
@@ -126,10 +126,10 @@ InteractiveModeBase.prototype.handleClearCommand = async function () {
126
126
  if (result.cancelled) {
127
127
  return;
128
128
  }
129
- if (this.firstRunOnboardingActive) {
130
- this.clearPendingFirstRunOnboardingSeed();
131
- }
132
129
  this.renderCurrentSessionState();
130
+ if (this.firstRunNoticeVisible) {
131
+ this.clearFirstRunOnboardingUi();
132
+ }
133
133
  this.chatContainer.addChild(new Spacer(1));
134
134
  this.chatContainer.addChild(new Text(`${theme.fg("accent", "✓ New session started")}`, 1, 1));
135
135
  this.ui.requestRender();
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-hotkeys-debug.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-hotkeys-debug.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Keybinding, type AppKeybinding, fs, path, Markdown, Spacer, Text, visibleWidth, getDebugLogPath, ArminComponent, DaxnutsComponent, DynamicBorder, EarendilAnnouncementComponent, formatKeyText, keyDisplayText, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAppKeyDisplay = function(this: InteractiveModeBase, action: AppKeybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.getEditorKeyDisplay = function(this: InteractiveModeBase, action: Keybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.handleHotkeysCommand = function(this: InteractiveModeBase): void {\n // Navigation keybindings\n const cursorUp = this.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n const cursorDown = this.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n const cursorLeft = this.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n const cursorRight = this.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n const cursorWordLeft = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordLeft\",\n );\n const cursorWordRight = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordRight\",\n );\n const cursorLineStart = this.getEditorKeyDisplay(\n \"tui.editor.cursorLineStart\",\n );\n const cursorLineEnd = this.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n const jumpForward = this.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n const jumpBackward = this.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n const pageUp = this.getEditorKeyDisplay(\"tui.editor.pageUp\");\n const pageDown = this.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n // Editing keybindings\n const submit = this.getEditorKeyDisplay(\"tui.input.submit\");\n const newLine = this.getEditorKeyDisplay(\"tui.input.newLine\");\n const deleteWordBackward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordBackward\",\n );\n const deleteWordForward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordForward\",\n );\n const deleteToLineStart = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineStart\",\n );\n const deleteToLineEnd = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineEnd\",\n );\n const yank = this.getEditorKeyDisplay(\"tui.editor.yank\");\n const yankPop = this.getEditorKeyDisplay(\"tui.editor.yankPop\");\n const undo = this.getEditorKeyDisplay(\"tui.editor.undo\");\n const tab = this.getEditorKeyDisplay(\"tui.input.tab\");\n\n // App keybindings\n const interrupt = this.getAppKeyDisplay(\"app.interrupt\");\n const clear = this.getAppKeyDisplay(\"app.clear\");\n const exit = this.getAppKeyDisplay(\"app.exit\");\n const suspend = this.getAppKeyDisplay(\"app.suspend\");\n const cycleThinkingLevel = this.getAppKeyDisplay(\"app.thinking.cycle\");\n const cycleModelForward = this.getAppKeyDisplay(\"app.model.cycleForward\");\n const selectModel = this.getAppKeyDisplay(\"app.model.select\");\n const expandTools = this.getAppKeyDisplay(\"app.tools.expand\");\n const toggleThinking = this.getAppKeyDisplay(\"app.thinking.toggle\");\n const externalEditor = this.getAppKeyDisplay(\"app.editor.external\");\n const cycleModelBackward = this.getAppKeyDisplay(\"app.model.cycleBackward\");\n const followUp = this.getAppKeyDisplay(\"app.message.followUp\");\n const dequeue = this.getAppKeyDisplay(\"app.message.dequeue\");\n const pasteImage = this.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n let hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (ctrl+enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n // Add extension-registered shortcuts\n const extensionRunner = this.session.extensionRunner;\n const shortcuts = extensionRunner.getShortcuts(\n this.keybindings.getEffectiveConfig(),\n );\n if (shortcuts.size > 0) {\n hotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n for (const [key, shortcut] of shortcuts) {\n const description = shortcut.description ?? shortcut.extensionPath;\n const keyDisplay = formatKeyText(key, { capitalize: true });\n hotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n }\n }\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DynamicBorder());\n this.chatContainer.addChild(\n new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0),\n );\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()),\n );\n this.chatContainer.addChild(new DynamicBorder());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleClearCommand = async function(this: InteractiveModeBase): Promise<void> {\n if (this.loadingAnimation) {\n this.loadingAnimation.stop();\n this.loadingAnimation = undefined;\n }\n this.statusContainer.clear();\n try {\n const result = await this.runtimeHost.newSession();\n if (result.cancelled) {\n return;\n }\n if (this.firstRunOnboardingActive) {\n this.clearPendingFirstRunOnboardingSeed();\n }\n this.renderCurrentSessionState();\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(`${theme.fg(\"accent\", \"✓ New session started\")}`, 1, 1),\n );\n this.ui.requestRender();\n } catch (error: unknown) {\n await this.handleFatalRuntimeError(\"Failed to create session\", error);\n }\n };\n\nInteractiveModeBase.prototype.handleDebugCommand = function(this: InteractiveModeBase): void {\n const width = this.ui.terminal.columns;\n const height = this.ui.terminal.rows;\n const allLines = this.ui.render(width);\n\n const debugLogPath = getDebugLogPath();\n const debugData = [\n `Debug output at ${new Date().toISOString()}`,\n `Terminal: ${width}x${height}`,\n `Total lines: ${allLines.length}`,\n \"\",\n \"=== All rendered lines with visible widths ===\",\n ...allLines.map((line, idx) => {\n const vw = visibleWidth(line);\n const escaped = JSON.stringify(line);\n return `[${idx}] (w=${vw}) ${escaped}`;\n }),\n \"\",\n \"=== Agent messages (JSONL) ===\",\n ...this.session.messages.map((msg) => JSON.stringify(msg)),\n \"\",\n ].join(\"\\n\");\n\n fs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n fs.writeFileSync(debugLogPath, debugData);\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(\n `${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`,\n 1,\n 1,\n ),\n );\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleArminSaysHi = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new ArminComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDementedDelves = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new EarendilAnnouncementComponent());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDaxnuts = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DaxnutsComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.checkDaxnutsEasterEgg = function(this: InteractiveModeBase, model: { provider: string; id: string }): void {\n if (\n model.provider === \"opencode\" &&\n model.id.toLowerCase().includes(\"kimi-k2.5\")\n ) {\n this.handleDaxnuts();\n }\n };\n"]}
1
+ {"version":3,"file":"interactive-hotkeys-debug.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-hotkeys-debug.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Keybinding, type AppKeybinding, fs, path, Markdown, Spacer, Text, visibleWidth, getDebugLogPath, ArminComponent, DaxnutsComponent, DynamicBorder, EarendilAnnouncementComponent, formatKeyText, keyDisplayText, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAppKeyDisplay = function(this: InteractiveModeBase, action: AppKeybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.getEditorKeyDisplay = function(this: InteractiveModeBase, action: Keybinding): string {\n return keyDisplayText(action);\n };\n\nInteractiveModeBase.prototype.handleHotkeysCommand = function(this: InteractiveModeBase): void {\n // Navigation keybindings\n const cursorUp = this.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n const cursorDown = this.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n const cursorLeft = this.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n const cursorRight = this.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n const cursorWordLeft = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordLeft\",\n );\n const cursorWordRight = this.getEditorKeyDisplay(\n \"tui.editor.cursorWordRight\",\n );\n const cursorLineStart = this.getEditorKeyDisplay(\n \"tui.editor.cursorLineStart\",\n );\n const cursorLineEnd = this.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n const jumpForward = this.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n const jumpBackward = this.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n const pageUp = this.getEditorKeyDisplay(\"tui.editor.pageUp\");\n const pageDown = this.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n // Editing keybindings\n const submit = this.getEditorKeyDisplay(\"tui.input.submit\");\n const newLine = this.getEditorKeyDisplay(\"tui.input.newLine\");\n const deleteWordBackward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordBackward\",\n );\n const deleteWordForward = this.getEditorKeyDisplay(\n \"tui.editor.deleteWordForward\",\n );\n const deleteToLineStart = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineStart\",\n );\n const deleteToLineEnd = this.getEditorKeyDisplay(\n \"tui.editor.deleteToLineEnd\",\n );\n const yank = this.getEditorKeyDisplay(\"tui.editor.yank\");\n const yankPop = this.getEditorKeyDisplay(\"tui.editor.yankPop\");\n const undo = this.getEditorKeyDisplay(\"tui.editor.undo\");\n const tab = this.getEditorKeyDisplay(\"tui.input.tab\");\n\n // App keybindings\n const interrupt = this.getAppKeyDisplay(\"app.interrupt\");\n const clear = this.getAppKeyDisplay(\"app.clear\");\n const exit = this.getAppKeyDisplay(\"app.exit\");\n const suspend = this.getAppKeyDisplay(\"app.suspend\");\n const cycleThinkingLevel = this.getAppKeyDisplay(\"app.thinking.cycle\");\n const cycleModelForward = this.getAppKeyDisplay(\"app.model.cycleForward\");\n const selectModel = this.getAppKeyDisplay(\"app.model.select\");\n const expandTools = this.getAppKeyDisplay(\"app.tools.expand\");\n const toggleThinking = this.getAppKeyDisplay(\"app.thinking.toggle\");\n const externalEditor = this.getAppKeyDisplay(\"app.editor.external\");\n const cycleModelBackward = this.getAppKeyDisplay(\"app.model.cycleBackward\");\n const followUp = this.getAppKeyDisplay(\"app.message.followUp\");\n const dequeue = this.getAppKeyDisplay(\"app.message.dequeue\");\n const pasteImage = this.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n let hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (ctrl+enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n // Add extension-registered shortcuts\n const extensionRunner = this.session.extensionRunner;\n const shortcuts = extensionRunner.getShortcuts(\n this.keybindings.getEffectiveConfig(),\n );\n if (shortcuts.size > 0) {\n hotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n for (const [key, shortcut] of shortcuts) {\n const description = shortcut.description ?? shortcut.extensionPath;\n const keyDisplay = formatKeyText(key, { capitalize: true });\n hotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n }\n }\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DynamicBorder());\n this.chatContainer.addChild(\n new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0),\n );\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()),\n );\n this.chatContainer.addChild(new DynamicBorder());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleClearCommand = async function(this: InteractiveModeBase): Promise<void> {\n if (this.loadingAnimation) {\n this.loadingAnimation.stop();\n this.loadingAnimation = undefined;\n }\n this.statusContainer.clear();\n try {\n const result = await this.runtimeHost.newSession();\n if (result.cancelled) {\n return;\n }\n this.renderCurrentSessionState();\n if (this.firstRunNoticeVisible) {\n this.clearFirstRunOnboardingUi();\n }\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(`${theme.fg(\"accent\", \"✓ New session started\")}`, 1, 1),\n );\n this.ui.requestRender();\n } catch (error: unknown) {\n await this.handleFatalRuntimeError(\"Failed to create session\", error);\n }\n };\n\nInteractiveModeBase.prototype.handleDebugCommand = function(this: InteractiveModeBase): void {\n const width = this.ui.terminal.columns;\n const height = this.ui.terminal.rows;\n const allLines = this.ui.render(width);\n\n const debugLogPath = getDebugLogPath();\n const debugData = [\n `Debug output at ${new Date().toISOString()}`,\n `Terminal: ${width}x${height}`,\n `Total lines: ${allLines.length}`,\n \"\",\n \"=== All rendered lines with visible widths ===\",\n ...allLines.map((line, idx) => {\n const vw = visibleWidth(line);\n const escaped = JSON.stringify(line);\n return `[${idx}] (w=${vw}) ${escaped}`;\n }),\n \"\",\n \"=== Agent messages (JSONL) ===\",\n ...this.session.messages.map((msg) => JSON.stringify(msg)),\n \"\",\n ].join(\"\\n\");\n\n fs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n fs.writeFileSync(debugLogPath, debugData);\n\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(\n new Text(\n `${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`,\n 1,\n 1,\n ),\n );\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleArminSaysHi = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new ArminComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDementedDelves = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new EarendilAnnouncementComponent());\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.handleDaxnuts = function(this: InteractiveModeBase): void {\n this.chatContainer.addChild(new Spacer(1));\n this.chatContainer.addChild(new DaxnutsComponent(this.ui));\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.checkDaxnutsEasterEgg = function(this: InteractiveModeBase, model: { provider: string; id: string }): void {\n if (\n model.provider === \"opencode\" &&\n model.id.toLowerCase().includes(\"kimi-k2.5\")\n ) {\n this.handleDaxnuts();\n }\n };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-input-handling.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-input-handling.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { pasteClipboardImageToEditor } from \"./interactive-mode-deps.ts\";\nimport { NORMAL_CHAT_TRANSITION_COPY, isCwdLocalExistingPathSeed, isExistingAbsolutePathSeed } from \"./interactive-onboarding.ts\";\n\nInteractiveModeBase.prototype.setupKeyHandlers = function(this: InteractiveModeBase): void {\n // Set up handlers on defaultEditor - they use this.editor for text access\n // so they work correctly regardless of which editor is active\n this.defaultEditor.onEscape = () => {\n if (this.session.isStreaming) {\n this.restoreQueuedMessagesToEditor({ abort: true });\n } else if (this.session.isBashRunning) {\n this.session.abortBash();\n } else if (this.isBashMode) {\n this.editor.setText(\"\");\n this.isBashMode = false;\n this.updateEditorBorderColor();\n } else if (!this.editor.getText().trim()) {\n // Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n const action = this.settingsManager.getDoubleEscapeAction();\n if (action !== \"none\") {\n const now = Date.now();\n if (now - this.lastEscapeTime < 500) {\n if (action === \"tree\") {\n this.showTreeSelector();\n } else {\n this.showUserMessageSelector();\n }\n this.lastEscapeTime = 0;\n } else {\n this.lastEscapeTime = now;\n }\n }\n }\n };\n\n // Register app action handlers\n this.defaultEditor.onAction(\"app.clear\", () => this.handleCtrlC());\n this.defaultEditor.onCtrlD = () => this.handleCtrlD();\n this.defaultEditor.onAction(\"app.suspend\", () => this.handleCtrlZ());\n this.defaultEditor.onAction(\"app.thinking.cycle\", () =>\n this.cycleThinkingLevel(),\n );\n this.defaultEditor.onAction(\"app.model.cycleForward\", () =>\n this.cycleModel(\"forward\"),\n );\n this.defaultEditor.onAction(\"app.model.cycleBackward\", () =>\n this.cycleModel(\"backward\"),\n );\n\n // Global debug handler on TUI (works regardless of focus)\n this.ui.onDebug = () => this.handleDebugCommand();\n this.defaultEditor.onAction(\"app.model.select\", () =>\n this.showModelSelector(),\n );\n this.defaultEditor.onAction(\"app.tools.expand\", () =>\n this.toggleToolOutputExpansion(),\n );\n this.defaultEditor.onAction(\"app.thinking.toggle\", () =>\n this.toggleThinkingBlockVisibility(),\n );\n this.defaultEditor.onAction(\"app.editor.external\", () =>\n this.openExternalEditor(),\n );\n this.defaultEditor.onAction(\"app.message.followUp\", () =>\n this.handleFollowUp(),\n );\n this.defaultEditor.onAction(\"app.message.dequeue\", () =>\n this.handleDequeue(),\n );\n this.defaultEditor.onAction(\"app.session.new\", () =>\n this.handleClearCommand(),\n );\n this.defaultEditor.onAction(\"app.session.tree\", () =>\n this.showTreeSelector(),\n );\n this.defaultEditor.onAction(\"app.session.fork\", () =>\n this.showUserMessageSelector(),\n );\n this.defaultEditor.onAction(\"app.session.resume\", () =>\n this.showSessionSelector(),\n );\n\n this.defaultEditor.onChange = (text: string) => {\n const wasBashMode = this.isBashMode;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n if (wasBashMode !== this.isBashMode) {\n this.updateEditorBorderColor();\n }\n };\n\n // Handle clipboard image paste (triggered on Ctrl+V)\n this.defaultEditor.onPasteImage = () => {\n this.handleClipboardImagePaste();\n };\n };\n\nInteractiveModeBase.prototype.handleClipboardImagePaste = async function(this: InteractiveModeBase): Promise<void> {\n await pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {\n showWarning: (message) => this.showWarning(message),\n });\n };\n\nInteractiveModeBase.prototype.setupEditorSubmitHandler = function(this: InteractiveModeBase): void {\n const submitFirstRunOnboardingSeed = async (text: string): Promise<void> => {\n if (this.firstRunOnboardingSeedInFlight) return;\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n const readyForHandoff = typeof this.isFirstRunOnboardingReadyForHandoff === \"function\"\n ? this.isFirstRunOnboardingReadyForHandoff()\n : true;\n if (!readyForHandoff) {\n this.stashFirstRunOnboardingSeed(text);\n return;\n }\n this.firstRunOnboardingSeedInFlight = true;\n try {\n await this.handleOnboardingWorkflowSeed(text);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.showError(errorMessage);\n this.editor.setText(text);\n } finally {\n this.firstRunOnboardingSeedInFlight = false;\n }\n };\n\n this.defaultEditor.onSubmit = async (text: string) => {\n text = text.trim();\n if (!text) return;\n\n if (this.firstRunOnboardingActive && (text === \"/chat\" || text.startsWith(\"/chat \"))) {\n const chatMessage = text.slice(5).trim();\n this.completeFirstRunOnboarding();\n this.showStatus(NORMAL_CHAT_TRANSITION_COPY);\n this.editor.setText(\"\");\n if (!chatMessage) return;\n this.flushPendingBashComponents();\n if (this.onInputCallback) {\n this.onInputCallback(chatMessage);\n } else {\n this.pendingUserInputs.push(chatMessage);\n }\n this.editor.addToHistory?.(text);\n return;\n }\n\n if (this.firstRunOnboardingActive && text.startsWith(\"/\") && (isCwdLocalExistingPathSeed(text, this.sessionManager.getCwd()) || isExistingAbsolutePathSeed(text))) {\n await submitFirstRunOnboardingSeed(text);\n return;\n }\n\n // Handle commands\n if (text === \"/settings\") {\n this.showSettingsSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fast\") {\n this.editor.setText(\"\");\n this.showFastModeSelector();\n return;\n }\n if (text === \"/scoped-models\") {\n this.editor.setText(\"\");\n await this.showModelsSelector();\n return;\n }\n if (text === \"/model\" || text.startsWith(\"/model \")) {\n const searchTerm = text.startsWith(\"/model \")\n ? text.slice(7).trim()\n : undefined;\n this.editor.setText(\"\");\n await this.handleModelCommand(searchTerm);\n return;\n }\n if (text === \"/export\" || text.startsWith(\"/export \")) {\n await this.handleExportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/import\" || text.startsWith(\"/import \")) {\n await this.handleImportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/share\") {\n await this.handleShareCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/copy\") {\n await this.handleCopyCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/name\" || text.startsWith(\"/name \")) {\n this.handleNameCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/session\") {\n this.handleSessionCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/changelog\") {\n this.handleChangelogCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/atomic\" || text.startsWith(\"/atomic \")) {\n this.editor.setText(\"\");\n await this.session.prompt(text);\n return;\n }\n if (text === \"/hotkeys\") {\n this.handleHotkeysCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fork\") {\n this.showUserMessageSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/clone\") {\n this.editor.setText(\"\");\n await this.handleCloneCommand();\n return;\n }\n if (text === \"/tree\") {\n this.showTreeSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/trust\") {\n this.showTrustSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/login\") {\n this.showOAuthSelector(\"login\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/logout\") {\n this.showOAuthSelector(\"logout\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/new\") {\n this.editor.setText(\"\");\n await this.handleClearCommand();\n return;\n }\n if (/^\\/compact(?:\\s|$)/.test(text)) {\n this.editor.setText(\"\");\n if (text !== \"/compact\") {\n this.showWarning(\"Usage: /compact\");\n return;\n }\n await this.handleCompactCommand();\n return;\n }\n if (text === \"/reload\") {\n this.editor.setText(\"\");\n await this.handleReloadCommand();\n return;\n }\n if (text === \"/debug\") {\n this.handleDebugCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/arminsayshi\") {\n this.handleArminSaysHi();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/dementedelves\") {\n this.handleDementedDelves();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/resume\") {\n this.showSessionSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/quit\" || text === \"/exit\") {\n this.editor.setText(\"\");\n await this.shutdown();\n return;\n }\n\n // Handle bash command (! for normal, !! for excluded from context)\n if (text.startsWith(\"!\")) {\n const isExcluded = text.startsWith(\"!!\");\n const command = isExcluded\n ? text.slice(2).trim()\n : text.slice(1).trim();\n if (command) {\n if (this.session.isBashRunning) {\n this.showWarning(\n \"A bash command is already running. esc cancel first.\",\n );\n this.editor.setText(text);\n return;\n }\n this.editor.addToHistory?.(text);\n await this.handleBashCommand(command, isExcluded);\n this.isBashMode = false;\n this.updateEditorBorderColor();\n return;\n }\n }\n\n if (this.firstRunOnboardingActive && !text.startsWith(\"/\")) {\n await submitFirstRunOnboardingSeed(text);\n return;\n }\n\n // Queue input during compaction (extension commands execute immediately)\n if (this.session.isCompacting) {\n if (this.isExtensionCommand(text)) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text);\n } else {\n this.queueCompactionMessage(text, \"steer\");\n }\n return;\n }\n\n // If streaming, use prompt() with steer behavior\n // This handles extension commands (execute immediately), prompt template expansion, and queueing\n if (this.session.isStreaming) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text, { streamingBehavior: \"steer\" });\n this.updatePendingMessagesDisplay();\n this.ui.requestRender();\n return;\n }\n\n // Normal message submission\n // First, move any pending bash components to chat\n this.flushPendingBashComponents();\n\n if (this.onInputCallback) {\n this.onInputCallback(text);\n } else {\n this.pendingUserInputs.push(text);\n }\n this.editor.addToHistory?.(text);\n };\n };\n"]}
1
+ {"version":3,"file":"interactive-input-handling.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-input-handling.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { pasteClipboardImageToEditor } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.setupKeyHandlers = function(this: InteractiveModeBase): void {\n // Set up handlers on defaultEditor - they use this.editor for text access\n // so they work correctly regardless of which editor is active\n this.defaultEditor.onEscape = () => {\n if (this.session.isStreaming) {\n this.restoreQueuedMessagesToEditor({ abort: true });\n } else if (this.session.isBashRunning) {\n this.session.abortBash();\n } else if (this.isBashMode) {\n this.editor.setText(\"\");\n this.isBashMode = false;\n this.updateEditorBorderColor();\n } else if (!this.editor.getText().trim()) {\n // Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n const action = this.settingsManager.getDoubleEscapeAction();\n if (action !== \"none\") {\n const now = Date.now();\n if (now - this.lastEscapeTime < 500) {\n if (action === \"tree\") {\n this.showTreeSelector();\n } else {\n this.showUserMessageSelector();\n }\n this.lastEscapeTime = 0;\n } else {\n this.lastEscapeTime = now;\n }\n }\n }\n };\n\n // Register app action handlers\n this.defaultEditor.onAction(\"app.clear\", () => this.handleCtrlC());\n this.defaultEditor.onCtrlD = () => this.handleCtrlD();\n this.defaultEditor.onAction(\"app.suspend\", () => this.handleCtrlZ());\n this.defaultEditor.onAction(\"app.thinking.cycle\", () =>\n this.cycleThinkingLevel(),\n );\n this.defaultEditor.onAction(\"app.model.cycleForward\", () =>\n this.cycleModel(\"forward\"),\n );\n this.defaultEditor.onAction(\"app.model.cycleBackward\", () =>\n this.cycleModel(\"backward\"),\n );\n\n // Global debug handler on TUI (works regardless of focus)\n this.ui.onDebug = () => this.handleDebugCommand();\n this.defaultEditor.onAction(\"app.model.select\", () =>\n this.showModelSelector(),\n );\n this.defaultEditor.onAction(\"app.tools.expand\", () =>\n this.toggleToolOutputExpansion(),\n );\n this.defaultEditor.onAction(\"app.thinking.toggle\", () =>\n this.toggleThinkingBlockVisibility(),\n );\n this.defaultEditor.onAction(\"app.editor.external\", () =>\n this.openExternalEditor(),\n );\n this.defaultEditor.onAction(\"app.message.followUp\", () =>\n this.handleFollowUp(),\n );\n this.defaultEditor.onAction(\"app.message.dequeue\", () =>\n this.handleDequeue(),\n );\n this.defaultEditor.onAction(\"app.session.new\", () =>\n this.handleClearCommand(),\n );\n this.defaultEditor.onAction(\"app.session.tree\", () =>\n this.showTreeSelector(),\n );\n this.defaultEditor.onAction(\"app.session.fork\", () =>\n this.showUserMessageSelector(),\n );\n this.defaultEditor.onAction(\"app.session.resume\", () =>\n this.showSessionSelector(),\n );\n\n this.defaultEditor.onChange = (text: string) => {\n const wasBashMode = this.isBashMode;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n if (wasBashMode !== this.isBashMode) {\n this.updateEditorBorderColor();\n }\n };\n\n // Handle clipboard image paste (triggered on Ctrl+V)\n this.defaultEditor.onPasteImage = () => {\n this.handleClipboardImagePaste();\n };\n };\n\nInteractiveModeBase.prototype.handleClipboardImagePaste = async function(this: InteractiveModeBase): Promise<void> {\n await pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {\n showWarning: (message) => this.showWarning(message),\n });\n };\n\nInteractiveModeBase.prototype.setupEditorSubmitHandler = function(this: InteractiveModeBase): void {\n this.defaultEditor.onSubmit = async (text: string) => {\n text = text.trim();\n if (!text) return;\n\n // Handle commands\n if (text === \"/settings\") {\n this.showSettingsSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fast\") {\n this.editor.setText(\"\");\n this.showFastModeSelector();\n return;\n }\n if (text === \"/scoped-models\") {\n this.editor.setText(\"\");\n await this.showModelsSelector();\n return;\n }\n if (text === \"/model\" || text.startsWith(\"/model \")) {\n const searchTerm = text.startsWith(\"/model \")\n ? text.slice(7).trim()\n : undefined;\n this.editor.setText(\"\");\n await this.handleModelCommand(searchTerm);\n return;\n }\n if (text === \"/export\" || text.startsWith(\"/export \")) {\n await this.handleExportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/import\" || text.startsWith(\"/import \")) {\n await this.handleImportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/share\") {\n await this.handleShareCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/copy\") {\n await this.handleCopyCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/name\" || text.startsWith(\"/name \")) {\n this.handleNameCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/session\") {\n this.handleSessionCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/changelog\") {\n this.handleChangelogCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/atomic\" || text.startsWith(\"/atomic \")) {\n this.editor.setText(\"\");\n await this.session.prompt(text);\n return;\n }\n if (text === \"/hotkeys\") {\n this.handleHotkeysCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fork\") {\n this.showUserMessageSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/clone\") {\n this.editor.setText(\"\");\n await this.handleCloneCommand();\n return;\n }\n if (text === \"/tree\") {\n this.showTreeSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/trust\") {\n this.showTrustSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/login\") {\n this.showOAuthSelector(\"login\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/logout\") {\n this.showOAuthSelector(\"logout\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/new\") {\n this.editor.setText(\"\");\n await this.handleClearCommand();\n return;\n }\n if (/^\\/compact(?:\\s|$)/.test(text)) {\n this.editor.setText(\"\");\n if (text !== \"/compact\") {\n this.showWarning(\"Usage: /compact\");\n return;\n }\n await this.handleCompactCommand();\n return;\n }\n if (text === \"/reload\") {\n this.editor.setText(\"\");\n await this.handleReloadCommand();\n return;\n }\n if (text === \"/debug\") {\n this.handleDebugCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/arminsayshi\") {\n this.handleArminSaysHi();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/dementedelves\") {\n this.handleDementedDelves();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/resume\") {\n this.showSessionSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/quit\" || text === \"/exit\") {\n this.editor.setText(\"\");\n await this.shutdown();\n return;\n }\n\n // Handle bash command (! for normal, !! for excluded from context)\n if (text.startsWith(\"!\")) {\n const isExcluded = text.startsWith(\"!!\");\n const command = isExcluded\n ? text.slice(2).trim()\n : text.slice(1).trim();\n if (command) {\n if (this.session.isBashRunning) {\n this.showWarning(\n \"A bash command is already running. esc cancel first.\",\n );\n this.editor.setText(text);\n return;\n }\n this.editor.addToHistory?.(text);\n await this.handleBashCommand(command, isExcluded);\n this.isBashMode = false;\n this.updateEditorBorderColor();\n return;\n }\n }\n\n // Queue input during compaction (extension commands execute immediately)\n if (this.session.isCompacting) {\n if (this.isExtensionCommand(text)) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text);\n } else {\n this.queueCompactionMessage(text, \"steer\");\n }\n return;\n }\n\n // If streaming, use prompt() with steer behavior\n // This handles extension commands (execute immediately), prompt template expansion, and queueing\n if (this.session.isStreaming) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text, { streamingBehavior: \"steer\" });\n this.updatePendingMessagesDisplay();\n this.ui.requestRender();\n return;\n }\n\n // Normal message submission\n // First, move any pending bash components to chat\n this.flushPendingBashComponents();\n\n if (this.onInputCallback) {\n this.onInputCallback(text);\n } else {\n this.pendingUserInputs.push(text);\n }\n this.editor.addToHistory?.(text);\n };\n };\n"]}
@@ -1,6 +1,5 @@
1
1
  import { InteractiveModeBase } from "./interactive-mode-base.js";
2
2
  import { pasteClipboardImageToEditor } from "./interactive-mode-deps.js";
3
- import { NORMAL_CHAT_TRANSITION_COPY, isCwdLocalExistingPathSeed, isExistingAbsolutePathSeed } from "./interactive-onboarding.js";
4
3
  InteractiveModeBase.prototype.setupKeyHandlers = function () {
5
4
  // Set up handlers on defaultEditor - they use this.editor for text access
6
5
  // so they work correctly regardless of which editor is active
@@ -73,56 +72,10 @@ InteractiveModeBase.prototype.handleClipboardImagePaste = async function () {
73
72
  });
74
73
  };
75
74
  InteractiveModeBase.prototype.setupEditorSubmitHandler = function () {
76
- const submitFirstRunOnboardingSeed = async (text) => {
77
- if (this.firstRunOnboardingSeedInFlight)
78
- return;
79
- this.editor.addToHistory?.(text);
80
- this.editor.setText("");
81
- const readyForHandoff = typeof this.isFirstRunOnboardingReadyForHandoff === "function"
82
- ? this.isFirstRunOnboardingReadyForHandoff()
83
- : true;
84
- if (!readyForHandoff) {
85
- this.stashFirstRunOnboardingSeed(text);
86
- return;
87
- }
88
- this.firstRunOnboardingSeedInFlight = true;
89
- try {
90
- await this.handleOnboardingWorkflowSeed(text);
91
- }
92
- catch (error) {
93
- const errorMessage = error instanceof Error ? error.message : String(error);
94
- this.showError(errorMessage);
95
- this.editor.setText(text);
96
- }
97
- finally {
98
- this.firstRunOnboardingSeedInFlight = false;
99
- }
100
- };
101
75
  this.defaultEditor.onSubmit = async (text) => {
102
76
  text = text.trim();
103
77
  if (!text)
104
78
  return;
105
- if (this.firstRunOnboardingActive && (text === "/chat" || text.startsWith("/chat "))) {
106
- const chatMessage = text.slice(5).trim();
107
- this.completeFirstRunOnboarding();
108
- this.showStatus(NORMAL_CHAT_TRANSITION_COPY);
109
- this.editor.setText("");
110
- if (!chatMessage)
111
- return;
112
- this.flushPendingBashComponents();
113
- if (this.onInputCallback) {
114
- this.onInputCallback(chatMessage);
115
- }
116
- else {
117
- this.pendingUserInputs.push(chatMessage);
118
- }
119
- this.editor.addToHistory?.(text);
120
- return;
121
- }
122
- if (this.firstRunOnboardingActive && text.startsWith("/") && (isCwdLocalExistingPathSeed(text, this.sessionManager.getCwd()) || isExistingAbsolutePathSeed(text))) {
123
- await submitFirstRunOnboardingSeed(text);
124
- return;
125
- }
126
79
  // Handle commands
127
80
  if (text === "/settings") {
128
81
  this.showSettingsSelector();
@@ -285,10 +238,6 @@ InteractiveModeBase.prototype.setupEditorSubmitHandler = function () {
285
238
  return;
286
239
  }
287
240
  }
288
- if (this.firstRunOnboardingActive && !text.startsWith("/")) {
289
- await submitFirstRunOnboardingSeed(text);
290
- return;
291
- }
292
241
  // Queue input during compaction (extension commands execute immediately)
293
242
  if (this.session.isCompacting) {
294
243
  if (this.isExtensionCommand(text)) {
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-input-handling.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-input-handling.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { pasteClipboardImageToEditor } from \"./interactive-mode-deps.ts\";\nimport { NORMAL_CHAT_TRANSITION_COPY, isCwdLocalExistingPathSeed, isExistingAbsolutePathSeed } from \"./interactive-onboarding.ts\";\n\nInteractiveModeBase.prototype.setupKeyHandlers = function(this: InteractiveModeBase): void {\n // Set up handlers on defaultEditor - they use this.editor for text access\n // so they work correctly regardless of which editor is active\n this.defaultEditor.onEscape = () => {\n if (this.session.isStreaming) {\n this.restoreQueuedMessagesToEditor({ abort: true });\n } else if (this.session.isBashRunning) {\n this.session.abortBash();\n } else if (this.isBashMode) {\n this.editor.setText(\"\");\n this.isBashMode = false;\n this.updateEditorBorderColor();\n } else if (!this.editor.getText().trim()) {\n // Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n const action = this.settingsManager.getDoubleEscapeAction();\n if (action !== \"none\") {\n const now = Date.now();\n if (now - this.lastEscapeTime < 500) {\n if (action === \"tree\") {\n this.showTreeSelector();\n } else {\n this.showUserMessageSelector();\n }\n this.lastEscapeTime = 0;\n } else {\n this.lastEscapeTime = now;\n }\n }\n }\n };\n\n // Register app action handlers\n this.defaultEditor.onAction(\"app.clear\", () => this.handleCtrlC());\n this.defaultEditor.onCtrlD = () => this.handleCtrlD();\n this.defaultEditor.onAction(\"app.suspend\", () => this.handleCtrlZ());\n this.defaultEditor.onAction(\"app.thinking.cycle\", () =>\n this.cycleThinkingLevel(),\n );\n this.defaultEditor.onAction(\"app.model.cycleForward\", () =>\n this.cycleModel(\"forward\"),\n );\n this.defaultEditor.onAction(\"app.model.cycleBackward\", () =>\n this.cycleModel(\"backward\"),\n );\n\n // Global debug handler on TUI (works regardless of focus)\n this.ui.onDebug = () => this.handleDebugCommand();\n this.defaultEditor.onAction(\"app.model.select\", () =>\n this.showModelSelector(),\n );\n this.defaultEditor.onAction(\"app.tools.expand\", () =>\n this.toggleToolOutputExpansion(),\n );\n this.defaultEditor.onAction(\"app.thinking.toggle\", () =>\n this.toggleThinkingBlockVisibility(),\n );\n this.defaultEditor.onAction(\"app.editor.external\", () =>\n this.openExternalEditor(),\n );\n this.defaultEditor.onAction(\"app.message.followUp\", () =>\n this.handleFollowUp(),\n );\n this.defaultEditor.onAction(\"app.message.dequeue\", () =>\n this.handleDequeue(),\n );\n this.defaultEditor.onAction(\"app.session.new\", () =>\n this.handleClearCommand(),\n );\n this.defaultEditor.onAction(\"app.session.tree\", () =>\n this.showTreeSelector(),\n );\n this.defaultEditor.onAction(\"app.session.fork\", () =>\n this.showUserMessageSelector(),\n );\n this.defaultEditor.onAction(\"app.session.resume\", () =>\n this.showSessionSelector(),\n );\n\n this.defaultEditor.onChange = (text: string) => {\n const wasBashMode = this.isBashMode;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n if (wasBashMode !== this.isBashMode) {\n this.updateEditorBorderColor();\n }\n };\n\n // Handle clipboard image paste (triggered on Ctrl+V)\n this.defaultEditor.onPasteImage = () => {\n this.handleClipboardImagePaste();\n };\n };\n\nInteractiveModeBase.prototype.handleClipboardImagePaste = async function(this: InteractiveModeBase): Promise<void> {\n await pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {\n showWarning: (message) => this.showWarning(message),\n });\n };\n\nInteractiveModeBase.prototype.setupEditorSubmitHandler = function(this: InteractiveModeBase): void {\n const submitFirstRunOnboardingSeed = async (text: string): Promise<void> => {\n if (this.firstRunOnboardingSeedInFlight) return;\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n const readyForHandoff = typeof this.isFirstRunOnboardingReadyForHandoff === \"function\"\n ? this.isFirstRunOnboardingReadyForHandoff()\n : true;\n if (!readyForHandoff) {\n this.stashFirstRunOnboardingSeed(text);\n return;\n }\n this.firstRunOnboardingSeedInFlight = true;\n try {\n await this.handleOnboardingWorkflowSeed(text);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.showError(errorMessage);\n this.editor.setText(text);\n } finally {\n this.firstRunOnboardingSeedInFlight = false;\n }\n };\n\n this.defaultEditor.onSubmit = async (text: string) => {\n text = text.trim();\n if (!text) return;\n\n if (this.firstRunOnboardingActive && (text === \"/chat\" || text.startsWith(\"/chat \"))) {\n const chatMessage = text.slice(5).trim();\n this.completeFirstRunOnboarding();\n this.showStatus(NORMAL_CHAT_TRANSITION_COPY);\n this.editor.setText(\"\");\n if (!chatMessage) return;\n this.flushPendingBashComponents();\n if (this.onInputCallback) {\n this.onInputCallback(chatMessage);\n } else {\n this.pendingUserInputs.push(chatMessage);\n }\n this.editor.addToHistory?.(text);\n return;\n }\n\n if (this.firstRunOnboardingActive && text.startsWith(\"/\") && (isCwdLocalExistingPathSeed(text, this.sessionManager.getCwd()) || isExistingAbsolutePathSeed(text))) {\n await submitFirstRunOnboardingSeed(text);\n return;\n }\n\n // Handle commands\n if (text === \"/settings\") {\n this.showSettingsSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fast\") {\n this.editor.setText(\"\");\n this.showFastModeSelector();\n return;\n }\n if (text === \"/scoped-models\") {\n this.editor.setText(\"\");\n await this.showModelsSelector();\n return;\n }\n if (text === \"/model\" || text.startsWith(\"/model \")) {\n const searchTerm = text.startsWith(\"/model \")\n ? text.slice(7).trim()\n : undefined;\n this.editor.setText(\"\");\n await this.handleModelCommand(searchTerm);\n return;\n }\n if (text === \"/export\" || text.startsWith(\"/export \")) {\n await this.handleExportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/import\" || text.startsWith(\"/import \")) {\n await this.handleImportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/share\") {\n await this.handleShareCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/copy\") {\n await this.handleCopyCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/name\" || text.startsWith(\"/name \")) {\n this.handleNameCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/session\") {\n this.handleSessionCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/changelog\") {\n this.handleChangelogCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/atomic\" || text.startsWith(\"/atomic \")) {\n this.editor.setText(\"\");\n await this.session.prompt(text);\n return;\n }\n if (text === \"/hotkeys\") {\n this.handleHotkeysCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fork\") {\n this.showUserMessageSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/clone\") {\n this.editor.setText(\"\");\n await this.handleCloneCommand();\n return;\n }\n if (text === \"/tree\") {\n this.showTreeSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/trust\") {\n this.showTrustSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/login\") {\n this.showOAuthSelector(\"login\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/logout\") {\n this.showOAuthSelector(\"logout\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/new\") {\n this.editor.setText(\"\");\n await this.handleClearCommand();\n return;\n }\n if (/^\\/compact(?:\\s|$)/.test(text)) {\n this.editor.setText(\"\");\n if (text !== \"/compact\") {\n this.showWarning(\"Usage: /compact\");\n return;\n }\n await this.handleCompactCommand();\n return;\n }\n if (text === \"/reload\") {\n this.editor.setText(\"\");\n await this.handleReloadCommand();\n return;\n }\n if (text === \"/debug\") {\n this.handleDebugCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/arminsayshi\") {\n this.handleArminSaysHi();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/dementedelves\") {\n this.handleDementedDelves();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/resume\") {\n this.showSessionSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/quit\" || text === \"/exit\") {\n this.editor.setText(\"\");\n await this.shutdown();\n return;\n }\n\n // Handle bash command (! for normal, !! for excluded from context)\n if (text.startsWith(\"!\")) {\n const isExcluded = text.startsWith(\"!!\");\n const command = isExcluded\n ? text.slice(2).trim()\n : text.slice(1).trim();\n if (command) {\n if (this.session.isBashRunning) {\n this.showWarning(\n \"A bash command is already running. esc cancel first.\",\n );\n this.editor.setText(text);\n return;\n }\n this.editor.addToHistory?.(text);\n await this.handleBashCommand(command, isExcluded);\n this.isBashMode = false;\n this.updateEditorBorderColor();\n return;\n }\n }\n\n if (this.firstRunOnboardingActive && !text.startsWith(\"/\")) {\n await submitFirstRunOnboardingSeed(text);\n return;\n }\n\n // Queue input during compaction (extension commands execute immediately)\n if (this.session.isCompacting) {\n if (this.isExtensionCommand(text)) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text);\n } else {\n this.queueCompactionMessage(text, \"steer\");\n }\n return;\n }\n\n // If streaming, use prompt() with steer behavior\n // This handles extension commands (execute immediately), prompt template expansion, and queueing\n if (this.session.isStreaming) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text, { streamingBehavior: \"steer\" });\n this.updatePendingMessagesDisplay();\n this.ui.requestRender();\n return;\n }\n\n // Normal message submission\n // First, move any pending bash components to chat\n this.flushPendingBashComponents();\n\n if (this.onInputCallback) {\n this.onInputCallback(text);\n } else {\n this.pendingUserInputs.push(text);\n }\n this.editor.addToHistory?.(text);\n };\n };\n"]}
1
+ {"version":3,"file":"interactive-input-handling.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-input-handling.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { pasteClipboardImageToEditor } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.setupKeyHandlers = function(this: InteractiveModeBase): void {\n // Set up handlers on defaultEditor - they use this.editor for text access\n // so they work correctly regardless of which editor is active\n this.defaultEditor.onEscape = () => {\n if (this.session.isStreaming) {\n this.restoreQueuedMessagesToEditor({ abort: true });\n } else if (this.session.isBashRunning) {\n this.session.abortBash();\n } else if (this.isBashMode) {\n this.editor.setText(\"\");\n this.isBashMode = false;\n this.updateEditorBorderColor();\n } else if (!this.editor.getText().trim()) {\n // Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n const action = this.settingsManager.getDoubleEscapeAction();\n if (action !== \"none\") {\n const now = Date.now();\n if (now - this.lastEscapeTime < 500) {\n if (action === \"tree\") {\n this.showTreeSelector();\n } else {\n this.showUserMessageSelector();\n }\n this.lastEscapeTime = 0;\n } else {\n this.lastEscapeTime = now;\n }\n }\n }\n };\n\n // Register app action handlers\n this.defaultEditor.onAction(\"app.clear\", () => this.handleCtrlC());\n this.defaultEditor.onCtrlD = () => this.handleCtrlD();\n this.defaultEditor.onAction(\"app.suspend\", () => this.handleCtrlZ());\n this.defaultEditor.onAction(\"app.thinking.cycle\", () =>\n this.cycleThinkingLevel(),\n );\n this.defaultEditor.onAction(\"app.model.cycleForward\", () =>\n this.cycleModel(\"forward\"),\n );\n this.defaultEditor.onAction(\"app.model.cycleBackward\", () =>\n this.cycleModel(\"backward\"),\n );\n\n // Global debug handler on TUI (works regardless of focus)\n this.ui.onDebug = () => this.handleDebugCommand();\n this.defaultEditor.onAction(\"app.model.select\", () =>\n this.showModelSelector(),\n );\n this.defaultEditor.onAction(\"app.tools.expand\", () =>\n this.toggleToolOutputExpansion(),\n );\n this.defaultEditor.onAction(\"app.thinking.toggle\", () =>\n this.toggleThinkingBlockVisibility(),\n );\n this.defaultEditor.onAction(\"app.editor.external\", () =>\n this.openExternalEditor(),\n );\n this.defaultEditor.onAction(\"app.message.followUp\", () =>\n this.handleFollowUp(),\n );\n this.defaultEditor.onAction(\"app.message.dequeue\", () =>\n this.handleDequeue(),\n );\n this.defaultEditor.onAction(\"app.session.new\", () =>\n this.handleClearCommand(),\n );\n this.defaultEditor.onAction(\"app.session.tree\", () =>\n this.showTreeSelector(),\n );\n this.defaultEditor.onAction(\"app.session.fork\", () =>\n this.showUserMessageSelector(),\n );\n this.defaultEditor.onAction(\"app.session.resume\", () =>\n this.showSessionSelector(),\n );\n\n this.defaultEditor.onChange = (text: string) => {\n const wasBashMode = this.isBashMode;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n if (wasBashMode !== this.isBashMode) {\n this.updateEditorBorderColor();\n }\n };\n\n // Handle clipboard image paste (triggered on Ctrl+V)\n this.defaultEditor.onPasteImage = () => {\n this.handleClipboardImagePaste();\n };\n };\n\nInteractiveModeBase.prototype.handleClipboardImagePaste = async function(this: InteractiveModeBase): Promise<void> {\n await pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {\n showWarning: (message) => this.showWarning(message),\n });\n };\n\nInteractiveModeBase.prototype.setupEditorSubmitHandler = function(this: InteractiveModeBase): void {\n this.defaultEditor.onSubmit = async (text: string) => {\n text = text.trim();\n if (!text) return;\n\n // Handle commands\n if (text === \"/settings\") {\n this.showSettingsSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fast\") {\n this.editor.setText(\"\");\n this.showFastModeSelector();\n return;\n }\n if (text === \"/scoped-models\") {\n this.editor.setText(\"\");\n await this.showModelsSelector();\n return;\n }\n if (text === \"/model\" || text.startsWith(\"/model \")) {\n const searchTerm = text.startsWith(\"/model \")\n ? text.slice(7).trim()\n : undefined;\n this.editor.setText(\"\");\n await this.handleModelCommand(searchTerm);\n return;\n }\n if (text === \"/export\" || text.startsWith(\"/export \")) {\n await this.handleExportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/import\" || text.startsWith(\"/import \")) {\n await this.handleImportCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/share\") {\n await this.handleShareCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/copy\") {\n await this.handleCopyCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/name\" || text.startsWith(\"/name \")) {\n this.handleNameCommand(text);\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/session\") {\n this.handleSessionCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/changelog\") {\n this.handleChangelogCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/atomic\" || text.startsWith(\"/atomic \")) {\n this.editor.setText(\"\");\n await this.session.prompt(text);\n return;\n }\n if (text === \"/hotkeys\") {\n this.handleHotkeysCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/fork\") {\n this.showUserMessageSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/clone\") {\n this.editor.setText(\"\");\n await this.handleCloneCommand();\n return;\n }\n if (text === \"/tree\") {\n this.showTreeSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/trust\") {\n this.showTrustSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/login\") {\n this.showOAuthSelector(\"login\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/logout\") {\n this.showOAuthSelector(\"logout\");\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/new\") {\n this.editor.setText(\"\");\n await this.handleClearCommand();\n return;\n }\n if (/^\\/compact(?:\\s|$)/.test(text)) {\n this.editor.setText(\"\");\n if (text !== \"/compact\") {\n this.showWarning(\"Usage: /compact\");\n return;\n }\n await this.handleCompactCommand();\n return;\n }\n if (text === \"/reload\") {\n this.editor.setText(\"\");\n await this.handleReloadCommand();\n return;\n }\n if (text === \"/debug\") {\n this.handleDebugCommand();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/arminsayshi\") {\n this.handleArminSaysHi();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/dementedelves\") {\n this.handleDementedDelves();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/resume\") {\n this.showSessionSelector();\n this.editor.setText(\"\");\n return;\n }\n if (text === \"/quit\" || text === \"/exit\") {\n this.editor.setText(\"\");\n await this.shutdown();\n return;\n }\n\n // Handle bash command (! for normal, !! for excluded from context)\n if (text.startsWith(\"!\")) {\n const isExcluded = text.startsWith(\"!!\");\n const command = isExcluded\n ? text.slice(2).trim()\n : text.slice(1).trim();\n if (command) {\n if (this.session.isBashRunning) {\n this.showWarning(\n \"A bash command is already running. esc cancel first.\",\n );\n this.editor.setText(text);\n return;\n }\n this.editor.addToHistory?.(text);\n await this.handleBashCommand(command, isExcluded);\n this.isBashMode = false;\n this.updateEditorBorderColor();\n return;\n }\n }\n\n // Queue input during compaction (extension commands execute immediately)\n if (this.session.isCompacting) {\n if (this.isExtensionCommand(text)) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text);\n } else {\n this.queueCompactionMessage(text, \"steer\");\n }\n return;\n }\n\n // If streaming, use prompt() with steer behavior\n // This handles extension commands (execute immediately), prompt template expansion, and queueing\n if (this.session.isStreaming) {\n this.editor.addToHistory?.(text);\n this.editor.setText(\"\");\n await this.session.prompt(text, { streamingBehavior: \"steer\" });\n this.updatePendingMessagesDisplay();\n this.ui.requestRender();\n return;\n }\n\n // Normal message submission\n // First, move any pending bash components to chat\n this.flushPendingBashComponents();\n\n if (this.onInputCallback) {\n this.onInputCallback(text);\n } else {\n this.pendingUserInputs.push(text);\n }\n this.editor.addToHistory?.(text);\n };\n };\n"]}
@@ -40,11 +40,9 @@ export declare class InteractiveModeBase {
40
40
  changelogMarkdown: string | undefined;
41
41
  startupNoticesShown: boolean;
42
42
  anthropicSubscriptionWarningShown: boolean;
43
- firstRunOnboardingActive: boolean;
44
- firstRunOnboardingSeedInFlight: boolean;
45
- pendingFirstRunOnboardingSeed: string | undefined;
43
+ firstRunNoticeVisible: boolean;
46
44
  hadLastChangelogVersionAtStartup: boolean;
47
- firstRunOnboardingHeaderComponents: Component[];
45
+ firstRunOnboardingNoticeComponents: Component[];
48
46
  autoTrustOnReloadCwd: string | undefined;
49
47
  lastStatusSpacer: Spacer | undefined;
50
48
  lastStatusText: Text | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-base.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport type {} from \"./interactive-mode-surface.ts\";\nimport { type AssistantMessage, type AutocompleteProvider, type EditorComponent, type Component, type LoaderIndicatorOptions, type AgentSession, type AgentSessionRuntime, type AutocompleteProviderFactory, type EditorFactory, type HostCustomUiStateListener, Container, Loader, ProcessTerminal, Spacer, setKeybindings, Text, TUI, VERSION, FooterDataProvider, KeybindingsManager, AssistantMessageComponent, BashExecutionComponent, CountdownTimer, CustomEditor, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, UsageMeterComponent, ToolExecutionComponent, getEditorTheme, setRegisteredThemes, InteractiveThemeController } from \"./interactive-mode-deps.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\n\nexport class InteractiveModeBase {\n\n runtimeHost: AgentSessionRuntime;\n\n\n ui: TUI;\n\n\n chatContainer: Container;\n\n\n pendingMessagesContainer: Container;\n\n\n statusContainer: Container;\n\n\n defaultEditor: CustomEditor;\n\n\n editor: EditorComponent;\n\n\n editorComponentFactory: EditorFactory | undefined;\n\n\n autocompleteProvider: AutocompleteProvider | undefined;\n\n\n autocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\n fdPath: string | undefined;\n\n\n editorContainer: Container;\n\n\n footer: FooterComponent;\n\n\n usageMeter: UsageMeterComponent;\n\n\n footerDataProvider: FooterDataProvider;\n\n\n // Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n keybindings: KeybindingsManager;\n\n\n version: string;\n\n\n isInitialized = false;\n\n\n // GitHub Copilot CAPI context-window catalog load state (gated on the Copilot provider).\n copilotCatalogApplied = false;\n\n\n copilotCatalogInFlight?: Promise<void>;\n\n\n onInputCallback?: (text: string) => void;\n\n\n pendingUserInputs: string[] = [];\n\n\n loadingAnimation: Loader | undefined = undefined;\n\n\n workingMessage: string | undefined = undefined;\n\n\n workingVisible = true;\n\n\n workingIndicatorOptions: LoaderIndicatorOptions | undefined =\n undefined;\n\n\n readonly defaultWorkingMessage = \"Working...\";\n\n\n readonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\n hiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\n\n lastSigintTime = 0;\n\n\n lastEscapeTime = 0;\n\n\n changelogMarkdown: string | undefined = undefined;\n\n\n startupNoticesShown = false;\n\n\n anthropicSubscriptionWarningShown = false;\n\n\n firstRunOnboardingActive = false;\n\n\n firstRunOnboardingSeedInFlight = false;\n\n\n pendingFirstRunOnboardingSeed: string | undefined = undefined;\n\n\n hadLastChangelogVersionAtStartup = false;\n\n\n firstRunOnboardingHeaderComponents: Component[] = [];\n\n\n autoTrustOnReloadCwd: string | undefined;\n\n\n\n // Status line tracking (for mutating immediately-sequential status updates)\n lastStatusSpacer: Spacer | undefined = undefined;\n\n\n lastStatusText: Text | undefined = undefined;\n\n\n\n // Streaming message tracking\n streamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\n streamingMessage: AssistantMessage | undefined = undefined;\n\n\n\n // Tool execution tracking: toolCallId -> component\n pendingTools = new Map<string, ToolExecutionComponent>();\n\n\n\n // Tool output expansion state\n toolOutputExpanded = false;\n\n\n\n // Thinking block visibility state\n hideThinkingBlock = false;\n outputPad: 0 | 1 = 1;\n\n\n\n // Skill commands: command name -> skill file path\n skillCommands = new Map<string, string>();\n\n\n\n // Agent subscription unsubscribe function\n unsubscribe?: () => void;\n\n\n signalCleanupHandlers: Array<() => void> = [];\n\n\n\n // Track if editor is in bash mode (text starts with !)\n isBashMode = false;\n\n\n\n // Track current bash execution component\n bashComponent: BashExecutionComponent | undefined = undefined;\n\n\n\n // Track pending bash components (shown in pending area, moved to chat on submit)\n pendingBashComponents: BashExecutionComponent[] = [];\n\n\n\n // Auto-compaction state\n autoCompactionLoader: Loader | undefined = undefined;\n\n\n autoCompactionEscapeHandler?: () => void;\n\n\n\n // Auto-retry state\n retryLoader: Loader | undefined = undefined;\n\n\n retryCountdown: CountdownTimer | undefined = undefined;\n\n\n retryEscapeHandler?: () => void;\n\n\n\n // Messages queued while compaction is running\n compactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\n\n // Deferred extension load state (first paint happens before extensions load)\n deferredStartupPending = false;\n\n\n deferredStartupPromise: Promise<void> | undefined = undefined;\n\n\n\n // Shutdown state\n shutdownRequested = false;\n\n\n\n // Extension UI state\n extensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\n extensionInput: ExtensionInputComponent | undefined = undefined;\n\n\n extensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\n extensionTerminalInputUnsubscribers = new Set<() => void>();\n\n\n blockingInlineCustomUiDepth = 0;\n\n\n deferredInlineCustomUiFocusDepth = 0;\n\n\n pendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\n hostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\n themeController: InteractiveThemeController;\n\n\n\n // Extension widgets (components rendered above/below the editor)\n extensionWidgetsAbove = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n extensionWidgetsBelow = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n widgetContainerAbove!: Container;\n\n\n widgetContainerBelow!: Container;\n\n\n\n // Custom footer from extension (undefined = use built-in footer)\n customFooter: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Header container that holds the built-in or custom header\n headerContainer: Container;\n\n\n\n // Built-in header (logo + keybinding hints + changelog)\n builtInHeader: Component | undefined = undefined;\n\n\n\n // Custom header from extension (undefined = use built-in header)\n customHeader: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Convenience accessors\n get session(): AgentSession {\n return this.runtimeHost.session;\n }\n\n\n get agent() {\n return this.session.agent;\n }\n\n\n get sessionManager() {\n return this.session.sessionManager;\n }\n\n\n get settingsManager() {\n return this.session.settingsManager;\n }\n\n\n\n declare options: InteractiveModeOptions;\n\n\n\n constructor(\n runtimeHost: AgentSessionRuntime,\n options: InteractiveModeOptions = {},\n ) {\n this.options = options;\n this.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n this.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n this.runtimeHost = runtimeHost;\n this.runtimeHost.setBeforeSessionInvalidate(() => {\n this.resetExtensionUI();\n });\n this.runtimeHost.setRebindSession(async () => {\n await this.rebindCurrentSession();\n });\n this.version = VERSION;\n this.ui = new TUI(\n new ProcessTerminal(),\n this.settingsManager.getShowHardwareCursor(),\n );\n this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n this.headerContainer = new Container();\n this.chatContainer = new Container();\n this.pendingMessagesContainer = new Container();\n this.statusContainer = new Container();\n this.widgetContainerAbove = new Container();\n this.widgetContainerBelow = new Container();\n this.keybindings = KeybindingsManager.create();\n setKeybindings(this.keybindings);\n const editorPaddingX = this.settingsManager.getEditorPaddingX();\n const autocompleteMaxVisible =\n this.settingsManager.getAutocompleteMaxVisible();\n this.defaultEditor = new CustomEditor(\n this.ui,\n getEditorTheme(),\n this.keybindings,\n {\n paddingX: editorPaddingX,\n autocompleteMaxVisible,\n },\n );\n this.editor = this.defaultEditor;\n this.editorContainer = new Container();\n this.editorContainer.addChild(this.editor as Component);\n this.footerDataProvider = new FooterDataProvider(\n this.sessionManager.getCwd(),\n );\n this.footer = new FooterComponent(this.session, this.footerDataProvider);\n this.usageMeter = new UsageMeterComponent(this.session);\n this.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n // Load hide thinking block setting\n this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n this.outputPad = this.settingsManager.getOutputPad();\n\n // Register themes from resource loader and initialize\n setRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n this.themeController = new InteractiveThemeController(\n this.ui,\n this.settingsManager,\n (message) => this.showError(message),\n () => this.updateEditorBorderColor(),\n );\n }\n\n\n\n // Maximum total widget lines to prevent viewport overflow\n static readonly MAX_WIDGET_LINES = 10;\n\n\n\n /**\n * Gracefully shutdown the agent.\n * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n * repaint the final frame while the process is exiting.\n */\n isShuttingDown = false;\n}\n"]}
1
+ {"version":3,"file":"interactive-mode-base.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport type {} from \"./interactive-mode-surface.ts\";\nimport { type AssistantMessage, type AutocompleteProvider, type EditorComponent, type Component, type LoaderIndicatorOptions, type AgentSession, type AgentSessionRuntime, type AutocompleteProviderFactory, type EditorFactory, type HostCustomUiStateListener, Container, Loader, ProcessTerminal, Spacer, setKeybindings, Text, TUI, VERSION, FooterDataProvider, KeybindingsManager, AssistantMessageComponent, BashExecutionComponent, CountdownTimer, CustomEditor, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, UsageMeterComponent, ToolExecutionComponent, getEditorTheme, setRegisteredThemes, InteractiveThemeController } from \"./interactive-mode-deps.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\n\nexport class InteractiveModeBase {\n\n runtimeHost: AgentSessionRuntime;\n\n\n ui: TUI;\n\n\n chatContainer: Container;\n\n\n pendingMessagesContainer: Container;\n\n\n statusContainer: Container;\n\n\n defaultEditor: CustomEditor;\n\n\n editor: EditorComponent;\n\n\n editorComponentFactory: EditorFactory | undefined;\n\n\n autocompleteProvider: AutocompleteProvider | undefined;\n\n\n autocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\n fdPath: string | undefined;\n\n\n editorContainer: Container;\n\n\n footer: FooterComponent;\n\n\n usageMeter: UsageMeterComponent;\n\n\n footerDataProvider: FooterDataProvider;\n\n\n // Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n keybindings: KeybindingsManager;\n\n\n version: string;\n\n\n isInitialized = false;\n\n\n // GitHub Copilot CAPI context-window catalog load state (gated on the Copilot provider).\n copilotCatalogApplied = false;\n\n\n copilotCatalogInFlight?: Promise<void>;\n\n\n onInputCallback?: (text: string) => void;\n\n\n pendingUserInputs: string[] = [];\n\n\n loadingAnimation: Loader | undefined = undefined;\n\n\n workingMessage: string | undefined = undefined;\n\n\n workingVisible = true;\n\n\n workingIndicatorOptions: LoaderIndicatorOptions | undefined =\n undefined;\n\n\n readonly defaultWorkingMessage = \"Working...\";\n\n\n readonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\n hiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\n\n lastSigintTime = 0;\n\n\n lastEscapeTime = 0;\n\n\n changelogMarkdown: string | undefined = undefined;\n\n startupNoticesShown = false;\n\n anthropicSubscriptionWarningShown = false;\n\n firstRunNoticeVisible = false;\n\n hadLastChangelogVersionAtStartup = false;\n\n firstRunOnboardingNoticeComponents: Component[] = [];\n\n autoTrustOnReloadCwd: string | undefined;\n\n\n\n // Status line tracking (for mutating immediately-sequential status updates)\n lastStatusSpacer: Spacer | undefined = undefined;\n\n\n lastStatusText: Text | undefined = undefined;\n\n\n\n // Streaming message tracking\n streamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\n streamingMessage: AssistantMessage | undefined = undefined;\n\n\n\n // Tool execution tracking: toolCallId -> component\n pendingTools = new Map<string, ToolExecutionComponent>();\n\n\n\n // Tool output expansion state\n toolOutputExpanded = false;\n\n\n\n // Thinking block visibility state\n hideThinkingBlock = false;\n outputPad: 0 | 1 = 1;\n\n\n\n // Skill commands: command name -> skill file path\n skillCommands = new Map<string, string>();\n\n\n\n // Agent subscription unsubscribe function\n unsubscribe?: () => void;\n\n\n signalCleanupHandlers: Array<() => void> = [];\n\n\n\n // Track if editor is in bash mode (text starts with !)\n isBashMode = false;\n\n\n\n // Track current bash execution component\n bashComponent: BashExecutionComponent | undefined = undefined;\n\n\n\n // Track pending bash components (shown in pending area, moved to chat on submit)\n pendingBashComponents: BashExecutionComponent[] = [];\n\n\n\n // Auto-compaction state\n autoCompactionLoader: Loader | undefined = undefined;\n\n\n autoCompactionEscapeHandler?: () => void;\n\n\n\n // Auto-retry state\n retryLoader: Loader | undefined = undefined;\n\n\n retryCountdown: CountdownTimer | undefined = undefined;\n\n\n retryEscapeHandler?: () => void;\n\n\n\n // Messages queued while compaction is running\n compactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\n\n // Deferred extension load state (first paint happens before extensions load)\n deferredStartupPending = false;\n\n\n deferredStartupPromise: Promise<void> | undefined = undefined;\n\n\n\n // Shutdown state\n shutdownRequested = false;\n\n\n\n // Extension UI state\n extensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\n extensionInput: ExtensionInputComponent | undefined = undefined;\n\n\n extensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\n extensionTerminalInputUnsubscribers = new Set<() => void>();\n\n\n blockingInlineCustomUiDepth = 0;\n\n\n deferredInlineCustomUiFocusDepth = 0;\n\n\n pendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\n hostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\n themeController: InteractiveThemeController;\n\n\n\n // Extension widgets (components rendered above/below the editor)\n extensionWidgetsAbove = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n extensionWidgetsBelow = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n widgetContainerAbove!: Container;\n\n\n widgetContainerBelow!: Container;\n\n\n\n // Custom footer from extension (undefined = use built-in footer)\n customFooter: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Header container that holds the built-in or custom header\n headerContainer: Container;\n\n\n\n // Built-in header (logo + keybinding hints + changelog)\n builtInHeader: Component | undefined = undefined;\n\n\n\n // Custom header from extension (undefined = use built-in header)\n customHeader: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Convenience accessors\n get session(): AgentSession {\n return this.runtimeHost.session;\n }\n\n\n get agent() {\n return this.session.agent;\n }\n\n\n get sessionManager() {\n return this.session.sessionManager;\n }\n\n\n get settingsManager() {\n return this.session.settingsManager;\n }\n\n\n\n declare options: InteractiveModeOptions;\n\n\n\n constructor(\n runtimeHost: AgentSessionRuntime,\n options: InteractiveModeOptions = {},\n ) {\n this.options = options;\n this.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n this.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n this.runtimeHost = runtimeHost;\n this.runtimeHost.setBeforeSessionInvalidate(() => {\n this.resetExtensionUI();\n });\n this.runtimeHost.setRebindSession(async () => {\n await this.rebindCurrentSession();\n });\n this.version = VERSION;\n this.ui = new TUI(\n new ProcessTerminal(),\n this.settingsManager.getShowHardwareCursor(),\n );\n this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n this.headerContainer = new Container();\n this.chatContainer = new Container();\n this.pendingMessagesContainer = new Container();\n this.statusContainer = new Container();\n this.widgetContainerAbove = new Container();\n this.widgetContainerBelow = new Container();\n this.keybindings = KeybindingsManager.create();\n setKeybindings(this.keybindings);\n const editorPaddingX = this.settingsManager.getEditorPaddingX();\n const autocompleteMaxVisible =\n this.settingsManager.getAutocompleteMaxVisible();\n this.defaultEditor = new CustomEditor(\n this.ui,\n getEditorTheme(),\n this.keybindings,\n {\n paddingX: editorPaddingX,\n autocompleteMaxVisible,\n },\n );\n this.editor = this.defaultEditor;\n this.editorContainer = new Container();\n this.editorContainer.addChild(this.editor as Component);\n this.footerDataProvider = new FooterDataProvider(\n this.sessionManager.getCwd(),\n );\n this.footer = new FooterComponent(this.session, this.footerDataProvider);\n this.usageMeter = new UsageMeterComponent(this.session);\n this.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n // Load hide thinking block setting\n this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n this.outputPad = this.settingsManager.getOutputPad();\n\n // Register themes from resource loader and initialize\n setRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n this.themeController = new InteractiveThemeController(\n this.ui,\n this.settingsManager,\n (message) => this.showError(message),\n () => this.updateEditorBorderColor(),\n );\n }\n\n\n\n // Maximum total widget lines to prevent viewport overflow\n static readonly MAX_WIDGET_LINES = 10;\n\n\n\n /**\n * Gracefully shutdown the agent.\n * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n * repaint the final frame while the process is exiting.\n */\n isShuttingDown = false;\n}\n"]}
@@ -31,11 +31,9 @@ export class InteractiveModeBase {
31
31
  this.changelogMarkdown = undefined;
32
32
  this.startupNoticesShown = false;
33
33
  this.anthropicSubscriptionWarningShown = false;
34
- this.firstRunOnboardingActive = false;
35
- this.firstRunOnboardingSeedInFlight = false;
36
- this.pendingFirstRunOnboardingSeed = undefined;
34
+ this.firstRunNoticeVisible = false;
37
35
  this.hadLastChangelogVersionAtStartup = false;
38
- this.firstRunOnboardingHeaderComponents = [];
36
+ this.firstRunOnboardingNoticeComponents = [];
39
37
  // Status line tracking (for mutating immediately-sequential status updates)
40
38
  this.lastStatusSpacer = undefined;
41
39
  this.lastStatusText = undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-base.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport type {} from \"./interactive-mode-surface.ts\";\nimport { type AssistantMessage, type AutocompleteProvider, type EditorComponent, type Component, type LoaderIndicatorOptions, type AgentSession, type AgentSessionRuntime, type AutocompleteProviderFactory, type EditorFactory, type HostCustomUiStateListener, Container, Loader, ProcessTerminal, Spacer, setKeybindings, Text, TUI, VERSION, FooterDataProvider, KeybindingsManager, AssistantMessageComponent, BashExecutionComponent, CountdownTimer, CustomEditor, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, UsageMeterComponent, ToolExecutionComponent, getEditorTheme, setRegisteredThemes, InteractiveThemeController } from \"./interactive-mode-deps.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\n\nexport class InteractiveModeBase {\n\n runtimeHost: AgentSessionRuntime;\n\n\n ui: TUI;\n\n\n chatContainer: Container;\n\n\n pendingMessagesContainer: Container;\n\n\n statusContainer: Container;\n\n\n defaultEditor: CustomEditor;\n\n\n editor: EditorComponent;\n\n\n editorComponentFactory: EditorFactory | undefined;\n\n\n autocompleteProvider: AutocompleteProvider | undefined;\n\n\n autocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\n fdPath: string | undefined;\n\n\n editorContainer: Container;\n\n\n footer: FooterComponent;\n\n\n usageMeter: UsageMeterComponent;\n\n\n footerDataProvider: FooterDataProvider;\n\n\n // Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n keybindings: KeybindingsManager;\n\n\n version: string;\n\n\n isInitialized = false;\n\n\n // GitHub Copilot CAPI context-window catalog load state (gated on the Copilot provider).\n copilotCatalogApplied = false;\n\n\n copilotCatalogInFlight?: Promise<void>;\n\n\n onInputCallback?: (text: string) => void;\n\n\n pendingUserInputs: string[] = [];\n\n\n loadingAnimation: Loader | undefined = undefined;\n\n\n workingMessage: string | undefined = undefined;\n\n\n workingVisible = true;\n\n\n workingIndicatorOptions: LoaderIndicatorOptions | undefined =\n undefined;\n\n\n readonly defaultWorkingMessage = \"Working...\";\n\n\n readonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\n hiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\n\n lastSigintTime = 0;\n\n\n lastEscapeTime = 0;\n\n\n changelogMarkdown: string | undefined = undefined;\n\n\n startupNoticesShown = false;\n\n\n anthropicSubscriptionWarningShown = false;\n\n\n firstRunOnboardingActive = false;\n\n\n firstRunOnboardingSeedInFlight = false;\n\n\n pendingFirstRunOnboardingSeed: string | undefined = undefined;\n\n\n hadLastChangelogVersionAtStartup = false;\n\n\n firstRunOnboardingHeaderComponents: Component[] = [];\n\n\n autoTrustOnReloadCwd: string | undefined;\n\n\n\n // Status line tracking (for mutating immediately-sequential status updates)\n lastStatusSpacer: Spacer | undefined = undefined;\n\n\n lastStatusText: Text | undefined = undefined;\n\n\n\n // Streaming message tracking\n streamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\n streamingMessage: AssistantMessage | undefined = undefined;\n\n\n\n // Tool execution tracking: toolCallId -> component\n pendingTools = new Map<string, ToolExecutionComponent>();\n\n\n\n // Tool output expansion state\n toolOutputExpanded = false;\n\n\n\n // Thinking block visibility state\n hideThinkingBlock = false;\n outputPad: 0 | 1 = 1;\n\n\n\n // Skill commands: command name -> skill file path\n skillCommands = new Map<string, string>();\n\n\n\n // Agent subscription unsubscribe function\n unsubscribe?: () => void;\n\n\n signalCleanupHandlers: Array<() => void> = [];\n\n\n\n // Track if editor is in bash mode (text starts with !)\n isBashMode = false;\n\n\n\n // Track current bash execution component\n bashComponent: BashExecutionComponent | undefined = undefined;\n\n\n\n // Track pending bash components (shown in pending area, moved to chat on submit)\n pendingBashComponents: BashExecutionComponent[] = [];\n\n\n\n // Auto-compaction state\n autoCompactionLoader: Loader | undefined = undefined;\n\n\n autoCompactionEscapeHandler?: () => void;\n\n\n\n // Auto-retry state\n retryLoader: Loader | undefined = undefined;\n\n\n retryCountdown: CountdownTimer | undefined = undefined;\n\n\n retryEscapeHandler?: () => void;\n\n\n\n // Messages queued while compaction is running\n compactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\n\n // Deferred extension load state (first paint happens before extensions load)\n deferredStartupPending = false;\n\n\n deferredStartupPromise: Promise<void> | undefined = undefined;\n\n\n\n // Shutdown state\n shutdownRequested = false;\n\n\n\n // Extension UI state\n extensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\n extensionInput: ExtensionInputComponent | undefined = undefined;\n\n\n extensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\n extensionTerminalInputUnsubscribers = new Set<() => void>();\n\n\n blockingInlineCustomUiDepth = 0;\n\n\n deferredInlineCustomUiFocusDepth = 0;\n\n\n pendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\n hostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\n themeController: InteractiveThemeController;\n\n\n\n // Extension widgets (components rendered above/below the editor)\n extensionWidgetsAbove = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n extensionWidgetsBelow = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n widgetContainerAbove!: Container;\n\n\n widgetContainerBelow!: Container;\n\n\n\n // Custom footer from extension (undefined = use built-in footer)\n customFooter: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Header container that holds the built-in or custom header\n headerContainer: Container;\n\n\n\n // Built-in header (logo + keybinding hints + changelog)\n builtInHeader: Component | undefined = undefined;\n\n\n\n // Custom header from extension (undefined = use built-in header)\n customHeader: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Convenience accessors\n get session(): AgentSession {\n return this.runtimeHost.session;\n }\n\n\n get agent() {\n return this.session.agent;\n }\n\n\n get sessionManager() {\n return this.session.sessionManager;\n }\n\n\n get settingsManager() {\n return this.session.settingsManager;\n }\n\n\n\n declare options: InteractiveModeOptions;\n\n\n\n constructor(\n runtimeHost: AgentSessionRuntime,\n options: InteractiveModeOptions = {},\n ) {\n this.options = options;\n this.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n this.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n this.runtimeHost = runtimeHost;\n this.runtimeHost.setBeforeSessionInvalidate(() => {\n this.resetExtensionUI();\n });\n this.runtimeHost.setRebindSession(async () => {\n await this.rebindCurrentSession();\n });\n this.version = VERSION;\n this.ui = new TUI(\n new ProcessTerminal(),\n this.settingsManager.getShowHardwareCursor(),\n );\n this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n this.headerContainer = new Container();\n this.chatContainer = new Container();\n this.pendingMessagesContainer = new Container();\n this.statusContainer = new Container();\n this.widgetContainerAbove = new Container();\n this.widgetContainerBelow = new Container();\n this.keybindings = KeybindingsManager.create();\n setKeybindings(this.keybindings);\n const editorPaddingX = this.settingsManager.getEditorPaddingX();\n const autocompleteMaxVisible =\n this.settingsManager.getAutocompleteMaxVisible();\n this.defaultEditor = new CustomEditor(\n this.ui,\n getEditorTheme(),\n this.keybindings,\n {\n paddingX: editorPaddingX,\n autocompleteMaxVisible,\n },\n );\n this.editor = this.defaultEditor;\n this.editorContainer = new Container();\n this.editorContainer.addChild(this.editor as Component);\n this.footerDataProvider = new FooterDataProvider(\n this.sessionManager.getCwd(),\n );\n this.footer = new FooterComponent(this.session, this.footerDataProvider);\n this.usageMeter = new UsageMeterComponent(this.session);\n this.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n // Load hide thinking block setting\n this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n this.outputPad = this.settingsManager.getOutputPad();\n\n // Register themes from resource loader and initialize\n setRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n this.themeController = new InteractiveThemeController(\n this.ui,\n this.settingsManager,\n (message) => this.showError(message),\n () => this.updateEditorBorderColor(),\n );\n }\n\n\n\n // Maximum total widget lines to prevent viewport overflow\n static readonly MAX_WIDGET_LINES = 10;\n\n\n\n /**\n * Gracefully shutdown the agent.\n * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n * repaint the final frame while the process is exiting.\n */\n isShuttingDown = false;\n}\n"]}
1
+ {"version":3,"file":"interactive-mode-base.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport type {} from \"./interactive-mode-surface.ts\";\nimport { type AssistantMessage, type AutocompleteProvider, type EditorComponent, type Component, type LoaderIndicatorOptions, type AgentSession, type AgentSessionRuntime, type AutocompleteProviderFactory, type EditorFactory, type HostCustomUiStateListener, Container, Loader, ProcessTerminal, Spacer, setKeybindings, Text, TUI, VERSION, FooterDataProvider, KeybindingsManager, AssistantMessageComponent, BashExecutionComponent, CountdownTimer, CustomEditor, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, UsageMeterComponent, ToolExecutionComponent, getEditorTheme, setRegisteredThemes, InteractiveThemeController } from \"./interactive-mode-deps.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\n\nexport class InteractiveModeBase {\n\n runtimeHost: AgentSessionRuntime;\n\n\n ui: TUI;\n\n\n chatContainer: Container;\n\n\n pendingMessagesContainer: Container;\n\n\n statusContainer: Container;\n\n\n defaultEditor: CustomEditor;\n\n\n editor: EditorComponent;\n\n\n editorComponentFactory: EditorFactory | undefined;\n\n\n autocompleteProvider: AutocompleteProvider | undefined;\n\n\n autocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\n fdPath: string | undefined;\n\n\n editorContainer: Container;\n\n\n footer: FooterComponent;\n\n\n usageMeter: UsageMeterComponent;\n\n\n footerDataProvider: FooterDataProvider;\n\n\n // Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n keybindings: KeybindingsManager;\n\n\n version: string;\n\n\n isInitialized = false;\n\n\n // GitHub Copilot CAPI context-window catalog load state (gated on the Copilot provider).\n copilotCatalogApplied = false;\n\n\n copilotCatalogInFlight?: Promise<void>;\n\n\n onInputCallback?: (text: string) => void;\n\n\n pendingUserInputs: string[] = [];\n\n\n loadingAnimation: Loader | undefined = undefined;\n\n\n workingMessage: string | undefined = undefined;\n\n\n workingVisible = true;\n\n\n workingIndicatorOptions: LoaderIndicatorOptions | undefined =\n undefined;\n\n\n readonly defaultWorkingMessage = \"Working...\";\n\n\n readonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\n hiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\n\n lastSigintTime = 0;\n\n\n lastEscapeTime = 0;\n\n\n changelogMarkdown: string | undefined = undefined;\n\n startupNoticesShown = false;\n\n anthropicSubscriptionWarningShown = false;\n\n firstRunNoticeVisible = false;\n\n hadLastChangelogVersionAtStartup = false;\n\n firstRunOnboardingNoticeComponents: Component[] = [];\n\n autoTrustOnReloadCwd: string | undefined;\n\n\n\n // Status line tracking (for mutating immediately-sequential status updates)\n lastStatusSpacer: Spacer | undefined = undefined;\n\n\n lastStatusText: Text | undefined = undefined;\n\n\n\n // Streaming message tracking\n streamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\n streamingMessage: AssistantMessage | undefined = undefined;\n\n\n\n // Tool execution tracking: toolCallId -> component\n pendingTools = new Map<string, ToolExecutionComponent>();\n\n\n\n // Tool output expansion state\n toolOutputExpanded = false;\n\n\n\n // Thinking block visibility state\n hideThinkingBlock = false;\n outputPad: 0 | 1 = 1;\n\n\n\n // Skill commands: command name -> skill file path\n skillCommands = new Map<string, string>();\n\n\n\n // Agent subscription unsubscribe function\n unsubscribe?: () => void;\n\n\n signalCleanupHandlers: Array<() => void> = [];\n\n\n\n // Track if editor is in bash mode (text starts with !)\n isBashMode = false;\n\n\n\n // Track current bash execution component\n bashComponent: BashExecutionComponent | undefined = undefined;\n\n\n\n // Track pending bash components (shown in pending area, moved to chat on submit)\n pendingBashComponents: BashExecutionComponent[] = [];\n\n\n\n // Auto-compaction state\n autoCompactionLoader: Loader | undefined = undefined;\n\n\n autoCompactionEscapeHandler?: () => void;\n\n\n\n // Auto-retry state\n retryLoader: Loader | undefined = undefined;\n\n\n retryCountdown: CountdownTimer | undefined = undefined;\n\n\n retryEscapeHandler?: () => void;\n\n\n\n // Messages queued while compaction is running\n compactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\n\n // Deferred extension load state (first paint happens before extensions load)\n deferredStartupPending = false;\n\n\n deferredStartupPromise: Promise<void> | undefined = undefined;\n\n\n\n // Shutdown state\n shutdownRequested = false;\n\n\n\n // Extension UI state\n extensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\n extensionInput: ExtensionInputComponent | undefined = undefined;\n\n\n extensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\n extensionTerminalInputUnsubscribers = new Set<() => void>();\n\n\n blockingInlineCustomUiDepth = 0;\n\n\n deferredInlineCustomUiFocusDepth = 0;\n\n\n pendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\n hostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\n themeController: InteractiveThemeController;\n\n\n\n // Extension widgets (components rendered above/below the editor)\n extensionWidgetsAbove = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n extensionWidgetsBelow = new Map<\n string,\n Component & { dispose?(): void }\n >();\n\n\n widgetContainerAbove!: Container;\n\n\n widgetContainerBelow!: Container;\n\n\n\n // Custom footer from extension (undefined = use built-in footer)\n customFooter: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Header container that holds the built-in or custom header\n headerContainer: Container;\n\n\n\n // Built-in header (logo + keybinding hints + changelog)\n builtInHeader: Component | undefined = undefined;\n\n\n\n // Custom header from extension (undefined = use built-in header)\n customHeader: (Component & { dispose?(): void }) | undefined =\n undefined;\n\n\n\n // Convenience accessors\n get session(): AgentSession {\n return this.runtimeHost.session;\n }\n\n\n get agent() {\n return this.session.agent;\n }\n\n\n get sessionManager() {\n return this.session.sessionManager;\n }\n\n\n get settingsManager() {\n return this.session.settingsManager;\n }\n\n\n\n declare options: InteractiveModeOptions;\n\n\n\n constructor(\n runtimeHost: AgentSessionRuntime,\n options: InteractiveModeOptions = {},\n ) {\n this.options = options;\n this.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n this.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n this.runtimeHost = runtimeHost;\n this.runtimeHost.setBeforeSessionInvalidate(() => {\n this.resetExtensionUI();\n });\n this.runtimeHost.setRebindSession(async () => {\n await this.rebindCurrentSession();\n });\n this.version = VERSION;\n this.ui = new TUI(\n new ProcessTerminal(),\n this.settingsManager.getShowHardwareCursor(),\n );\n this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n this.headerContainer = new Container();\n this.chatContainer = new Container();\n this.pendingMessagesContainer = new Container();\n this.statusContainer = new Container();\n this.widgetContainerAbove = new Container();\n this.widgetContainerBelow = new Container();\n this.keybindings = KeybindingsManager.create();\n setKeybindings(this.keybindings);\n const editorPaddingX = this.settingsManager.getEditorPaddingX();\n const autocompleteMaxVisible =\n this.settingsManager.getAutocompleteMaxVisible();\n this.defaultEditor = new CustomEditor(\n this.ui,\n getEditorTheme(),\n this.keybindings,\n {\n paddingX: editorPaddingX,\n autocompleteMaxVisible,\n },\n );\n this.editor = this.defaultEditor;\n this.editorContainer = new Container();\n this.editorContainer.addChild(this.editor as Component);\n this.footerDataProvider = new FooterDataProvider(\n this.sessionManager.getCwd(),\n );\n this.footer = new FooterComponent(this.session, this.footerDataProvider);\n this.usageMeter = new UsageMeterComponent(this.session);\n this.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n // Load hide thinking block setting\n this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n this.outputPad = this.settingsManager.getOutputPad();\n\n // Register themes from resource loader and initialize\n setRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n this.themeController = new InteractiveThemeController(\n this.ui,\n this.settingsManager,\n (message) => this.showError(message),\n () => this.updateEditorBorderColor(),\n );\n }\n\n\n\n // Maximum total widget lines to prevent viewport overflow\n static readonly MAX_WIDGET_LINES = 10;\n\n\n\n /**\n * Gracefully shutdown the agent.\n * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n * repaint the final frame while the process is exiting.\n */\n isShuttingDown = false;\n}\n"]}
@@ -11,17 +11,11 @@ declare module "./interactive-mode-base.ts" {
11
11
  setupAutocompleteProvider(): void;
12
12
  showStartupNoticesIfNeeded(): void;
13
13
  hadLastChangelogVersionAtStartup: boolean;
14
- firstRunOnboardingHeaderComponents: Component[];
15
- firstRunOnboardingSeedInFlight: boolean;
16
- pendingFirstRunOnboardingSeed: string | undefined;
14
+ firstRunNoticeVisible: boolean;
15
+ firstRunOnboardingNoticeComponents: Component[];
16
+ initializeFirstRunOnboardingMarkers(): void;
17
17
  isFirstRunOnboardingEligible(): boolean;
18
- isFirstRunOnboardingReadyForHandoff(): boolean;
19
- stashFirstRunOnboardingSeed(seed: string): void;
20
- resumePendingFirstRunOnboardingSeed(): Promise<void>;
21
- clearPendingFirstRunOnboardingSeed(): void;
22
18
  clearFirstRunOnboardingUi(): void;
23
- completeFirstRunOnboarding(): void;
24
- handleOnboardingWorkflowSeed(seed: string): Promise<void>;
25
19
  init(): Promise<void>;
26
20
  completeDeferredStartup(): Promise<void>;
27
21
  retryDeferredModelRestore(): Promise<void>;