@bastani/atomic 0.9.4-alpha.4 → 0.9.4-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  3. package/dist/builtin/cursor/package.json +3 -3
  4. package/dist/builtin/intercom/CHANGELOG.md +12 -0
  5. package/dist/builtin/intercom/package.json +2 -2
  6. package/dist/builtin/mcp/CHANGELOG.md +12 -0
  7. package/dist/builtin/mcp/package.json +3 -3
  8. package/dist/builtin/subagents/CHANGELOG.md +12 -0
  9. package/dist/builtin/subagents/package.json +4 -4
  10. package/dist/builtin/web-access/CHANGELOG.md +12 -0
  11. package/dist/builtin/web-access/package.json +2 -2
  12. package/dist/builtin/workflows/CHANGELOG.md +12 -0
  13. package/dist/builtin/workflows/package.json +2 -2
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js +13 -25
  16. package/dist/cli/file-processor.js.map +1 -1
  17. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  18. package/dist/core/agent-session-auto-compaction.js +8 -1
  19. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  20. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  21. package/dist/core/agent-session-extension-bindings.js +1 -1
  22. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  23. package/dist/core/agent-session-methods.d.ts +3 -0
  24. package/dist/core/agent-session-methods.d.ts.map +1 -1
  25. package/dist/core/agent-session-methods.js.map +1 -1
  26. package/dist/core/agent-session-prompt.d.ts +2 -0
  27. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  28. package/dist/core/agent-session-prompt.js +15 -2
  29. package/dist/core/agent-session-prompt.js.map +1 -1
  30. package/dist/core/agent-session-state.d.ts.map +1 -1
  31. package/dist/core/agent-session-state.js +2 -2
  32. package/dist/core/agent-session-state.js.map +1 -1
  33. package/dist/core/agent-session-tool-hooks.d.ts +7 -1
  34. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  35. package/dist/core/agent-session-tool-hooks.js +26 -4
  36. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  37. package/dist/core/agent-session-tree.d.ts.map +1 -1
  38. package/dist/core/agent-session-tree.js +3 -1
  39. package/dist/core/agent-session-tree.js.map +1 -1
  40. package/dist/core/agent-session-types.d.ts +4 -0
  41. package/dist/core/agent-session-types.d.ts.map +1 -1
  42. package/dist/core/agent-session-types.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +1 -0
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +1 -0
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/copilot-model-catalog.d.ts +18 -5
  48. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  49. package/dist/core/copilot-model-catalog.js +64 -5
  50. package/dist/core/copilot-model-catalog.js.map +1 -1
  51. package/dist/core/extensions/api-types.d.ts +2 -1
  52. package/dist/core/extensions/api-types.d.ts.map +1 -1
  53. package/dist/core/extensions/api-types.js.map +1 -1
  54. package/dist/core/extensions/index.d.ts +1 -1
  55. package/dist/core/extensions/index.d.ts.map +1 -1
  56. package/dist/core/extensions/index.js.map +1 -1
  57. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  58. package/dist/core/extensions/loader-core.js +3 -3
  59. package/dist/core/extensions/loader-core.js.map +1 -1
  60. package/dist/core/extensions/session-events.d.ts +7 -1
  61. package/dist/core/extensions/session-events.d.ts.map +1 -1
  62. package/dist/core/extensions/session-events.js.map +1 -1
  63. package/dist/core/http-dispatcher.d.ts.map +1 -1
  64. package/dist/core/http-dispatcher.js +28 -1
  65. package/dist/core/http-dispatcher.js.map +1 -1
  66. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  67. package/dist/core/model-registry-builtins.js +10 -2
  68. package/dist/core/model-registry-builtins.js.map +1 -1
  69. package/dist/core/model-registry.d.ts.map +1 -1
  70. package/dist/core/model-registry.js +4 -3
  71. package/dist/core/model-registry.js.map +1 -1
  72. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  73. package/dist/core/model-resolver-defaults.js +1 -1
  74. package/dist/core/model-resolver-defaults.js.map +1 -1
  75. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  76. package/dist/core/resource-loader-reload.js +2 -1
  77. package/dist/core/resource-loader-reload.js.map +1 -1
  78. package/dist/core/session-manager-core.d.ts +2 -12
  79. package/dist/core/session-manager-core.d.ts.map +1 -1
  80. package/dist/core/session-manager-core.js +8 -16
  81. package/dist/core/session-manager-core.js.map +1 -1
  82. package/dist/core/settings-manager-resource-accessors.d.ts +1 -0
  83. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  84. package/dist/core/settings-manager-resource-accessors.js +11 -0
  85. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  86. package/dist/core/settings-manager-ui-accessors.d.ts +2 -0
  87. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  88. package/dist/core/settings-manager-ui-accessors.js +9 -0
  89. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  90. package/dist/core/settings-types.d.ts +2 -0
  91. package/dist/core/settings-types.d.ts.map +1 -1
  92. package/dist/core/settings-types.js.map +1 -1
  93. package/dist/core/timings.d.ts +7 -5
  94. package/dist/core/timings.d.ts.map +1 -1
  95. package/dist/core/timings.js +42 -24
  96. package/dist/core/timings.js.map +1 -1
  97. package/dist/core/tools/read.d.ts.map +1 -1
  98. package/dist/core/tools/read.js +12 -23
  99. package/dist/core/tools/read.js.map +1 -1
  100. package/dist/index-extensions.d.ts +1 -1
  101. package/dist/index-extensions.d.ts.map +1 -1
  102. package/dist/index-extensions.js.map +1 -1
  103. package/dist/index.d.ts +1 -1
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js.map +1 -1
  106. package/dist/main-session.d.ts.map +1 -1
  107. package/dist/main-session.js +14 -5
  108. package/dist/main-session.js.map +1 -1
  109. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  110. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  111. package/dist/modes/interactive/components/assistant-message.js +22 -15
  112. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  113. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  114. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  115. package/dist/modes/interactive/components/chat-message-renderer.js +5 -5
  116. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  117. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  118. package/dist/modes/interactive/components/chat-session-host-events.js +8 -0
  119. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  120. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -0
  122. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  123. package/dist/modes/interactive/components/user-message.d.ts +6 -2
  124. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/user-message.js +16 -5
  126. package/dist/modes/interactive/components/user-message.js.map +1 -1
  127. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  128. package/dist/modes/interactive/interactive-agent-events.js +6 -1
  129. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  130. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  131. package/dist/modes/interactive/interactive-editor-actions.js +1 -0
  132. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  133. package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -1
  134. package/dist/modes/interactive/interactive-extension-context.js +1 -0
  135. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  136. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  137. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  138. package/dist/modes/interactive/interactive-mode-base.js +2 -0
  139. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  140. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  141. package/dist/modes/interactive/interactive-model-routing.js +1 -4
  142. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  143. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  144. package/dist/modes/interactive/interactive-render-chat.js +4 -3
  145. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  146. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  147. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  148. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  149. package/dist/modes/rpc/rpc-client.d.ts +28 -51
  150. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  151. package/dist/modes/rpc/rpc-client.js +27 -51
  152. package/dist/modes/rpc/rpc-client.js.map +1 -1
  153. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  154. package/dist/modes/rpc/rpc-command-handler.js +19 -0
  155. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  156. package/dist/modes/rpc/rpc-types.d.ts +26 -0
  157. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  158. package/dist/modes/rpc/rpc-types.js.map +1 -1
  159. package/dist/rpc-entry.d.ts +3 -0
  160. package/dist/rpc-entry.d.ts.map +1 -0
  161. package/dist/rpc-entry.js +12 -0
  162. package/dist/rpc-entry.js.map +1 -0
  163. package/dist/utils/image-convert.d.ts +1 -0
  164. package/dist/utils/image-convert.d.ts.map +1 -1
  165. package/dist/utils/image-convert.js +21 -15
  166. package/dist/utils/image-convert.js.map +1 -1
  167. package/dist/utils/image-process.d.ts +18 -0
  168. package/dist/utils/image-process.d.ts.map +1 -0
  169. package/dist/utils/image-process.js +83 -0
  170. package/dist/utils/image-process.js.map +1 -0
  171. package/dist/utils/mime.d.ts.map +1 -1
  172. package/dist/utils/mime.js +41 -0
  173. package/dist/utils/mime.js.map +1 -1
  174. package/docs/compaction.md +2 -0
  175. package/docs/extensions.md +11 -0
  176. package/docs/providers.md +1 -0
  177. package/docs/rpc.md +58 -0
  178. package/docs/settings.md +2 -0
  179. package/npm-shrinkwrap.json +134 -136
  180. package/package.json +11 -6
@@ -151,6 +151,7 @@ InteractiveModeBase.prototype.createExtensionUIContext = function () {
151
151
  toolOutputExpanded: this.toolOutputExpanded,
152
152
  showImages: this.settingsManager.getShowImages(),
153
153
  imageWidthCells: this.settingsManager.getImageWidthCells(),
154
+ outputPad: this.outputPad,
154
155
  getToolDefinition: (toolName) => this.getRegisteredToolDefinition(toolName),
155
156
  getCustomMessageRenderer: (customType) => this.session.extensionRunner.getMessageRenderer(customType),
156
157
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-extension-context.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type ExtensionUIContext, type HostCustomUiState, type HostCustomUiStateListener, type ProjectTrustContext, getAvailableThemesWithPaths, getThemeByName, Theme, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.addExtensionTerminalInputListener = function(this: InteractiveModeBase, handler: (data: string) => { consume?: boolean; data?: string } | undefined): () => void {\n const unsubscribe = this.ui.addInputListener(handler);\n this.extensionTerminalInputUnsubscribers.add(unsubscribe);\n return () => {\n unsubscribe();\n this.extensionTerminalInputUnsubscribers.delete(unsubscribe);\n };\n };\n\nInteractiveModeBase.prototype.clearExtensionTerminalInputListeners = function(this: InteractiveModeBase): void {\n for (const unsubscribe of this.extensionTerminalInputUnsubscribers) {\n unsubscribe();\n }\n this.extensionTerminalInputUnsubscribers.clear();\n };\n\nInteractiveModeBase.prototype.getHostCustomUiState = function(this: InteractiveModeBase): HostCustomUiState {\n const focusDeferred =\n this.blockingInlineCustomUiDepth > 0 && this.pendingInlineCustomUiFocus !== undefined;\n return {\n blockingInlineCustomUiDepth: this.blockingInlineCustomUiDepth,\n blockingInlineCustomUiActive: this.blockingInlineCustomUiDepth > 0,\n ...(focusDeferred ? { blockingInlineCustomUiFocusDeferred: true } : {}),\n };\n };\n\nInteractiveModeBase.prototype.notifyHostCustomUiStateListeners = function(this: InteractiveModeBase): void {\n const state = this.getHostCustomUiState();\n for (const listener of this.hostCustomUiStateListeners) {\n try {\n listener(state);\n } catch {\n /* ignore observer errors */\n }\n }\n };\n\nInteractiveModeBase.prototype.beginHostInlineCustomUi = function(this: InteractiveModeBase): () => void {\n let released = false;\n this.blockingInlineCustomUiDepth++;\n this.notifyHostCustomUiStateListeners();\n return () => {\n if (released) return;\n released = true;\n this.blockingInlineCustomUiDepth = Math.max(\n 0,\n this.blockingInlineCustomUiDepth - 1,\n );\n this.notifyHostCustomUiStateListeners();\n };\n };\n\nInteractiveModeBase.prototype.beginInlineCustomUiFocusDeferral = function(this: InteractiveModeBase): () => void {\n let released = false;\n this.deferredInlineCustomUiFocusDepth++;\n return () => {\n if (released) return;\n released = true;\n this.deferredInlineCustomUiFocusDepth = Math.max(\n 0,\n this.deferredInlineCustomUiFocusDepth - 1,\n );\n if (this.deferredInlineCustomUiFocusDepth === 0) {\n this.focusHostInlineCustomUi();\n }\n };\n };\n\nInteractiveModeBase.prototype.shouldDeferInlineCustomUiFocus = function(this: InteractiveModeBase): boolean {\n return this.deferredInlineCustomUiFocusDepth > 0;\n };\n\nInteractiveModeBase.prototype.focusHostInlineCustomUi = function(this: InteractiveModeBase): boolean {\n const component = this.pendingInlineCustomUiFocus;\n if (component === undefined) return false;\n this.pendingInlineCustomUiFocus = undefined;\n this.ui.setFocus(component);\n this.ui.requestRender();\n this.notifyHostCustomUiStateListeners();\n return true;\n };\n\nInteractiveModeBase.prototype.onHostCustomUiStateChange = function(this: InteractiveModeBase, listener: HostCustomUiStateListener): () => void {\n this.hostCustomUiStateListeners.add(listener);\n return () => {\n this.hostCustomUiStateListeners.delete(listener);\n };\n };\n\nInteractiveModeBase.prototype.createProjectTrustContext = function(this: InteractiveModeBase, cwd: string): ProjectTrustContext {\n const ui = this.createExtensionUIContext();\n return {\n cwd,\n mode: \"tui\",\n hasUI: true,\n ui: {\n select: ui.select,\n confirm: ui.confirm,\n input: ui.input,\n notify: ui.notify,\n },\n };\n };\n\nInteractiveModeBase.prototype.createExtensionUIContext = function(this: InteractiveModeBase): ExtensionUIContext {\n return {\n select: (title, options, opts) =>\n this.showExtensionSelector(title, options, opts),\n confirm: (title, message, opts) =>\n this.showExtensionConfirm(title, message, opts),\n input: (title, placeholder, opts) =>\n this.showExtensionInput(title, placeholder, opts),\n notify: (message, type) => this.showExtensionNotify(message, type),\n requestRender: () => this.ui.requestRender(),\n getHostCustomUiState: () => this.getHostCustomUiState(),\n onHostCustomUiStateChange: (listener) =>\n this.onHostCustomUiStateChange(listener),\n focusHostInlineCustomUi: () => this.focusHostInlineCustomUi(),\n onTerminalInput: (handler) =>\n this.addExtensionTerminalInputListener(handler),\n setStatus: (key, text) => this.setExtensionStatus(key, text),\n setWorkingMessage: (message) => {\n this.workingMessage = message;\n if (this.loadingAnimation) {\n this.loadingAnimation.setMessage(\n message ?? this.defaultWorkingMessage,\n );\n }\n },\n setWorkingVisible: (visible) => this.setWorkingVisible(visible),\n setWorkingIndicator: (options) => this.setWorkingIndicator(options),\n setHiddenThinkingLabel: (label) => this.setHiddenThinkingLabel(label),\n setWidget: (key, content, options) =>\n this.setExtensionWidget(key, content, options),\n setFooter: (factory) => this.setExtensionFooter(factory),\n setHeader: (factory) => this.setExtensionHeader(factory),\n setTitle: (title) => this.ui.terminal.setTitle(title),\n custom: (factory, options) => this.showExtensionCustom(factory, options),\n pasteToEditor: (text) =>\n this.editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => this.editor.setText(text),\n getEditorText: () =>\n this.editor.getExpandedText?.() ?? this.editor.getText(),\n editor: (title, prefill) => this.showExtensionEditor(title, prefill),\n addAutocompleteProvider: (factory) => {\n this.autocompleteProviderWrappers.push(factory);\n this.setupAutocompleteProvider();\n },\n setEditorComponent: (factory) => this.setCustomEditorComponent(factory),\n getEditorComponent: () => this.editorComponentFactory,\n getFooterDataProvider: () => this.footerDataProvider,\n get theme() {\n return theme;\n },\n getAllThemes: () => getAvailableThemesWithPaths(),\n getTheme: (name) => getThemeByName(name),\n setTheme: (themeOrName) => {\n if (themeOrName instanceof Theme) {\n return this.themeController.setThemeInstance(themeOrName);\n }\n const result = this.themeController.setThemeName(themeOrName);\n if (result.success && this.settingsManager.getThemeSetting() !== themeOrName) {\n this.settingsManager.setTheme(themeOrName);\n }\n return result;\n },\n getToolsExpanded: () => this.toolOutputExpanded,\n setToolsExpanded: (expanded) => this.setToolsExpanded(expanded),\n getChatRenderSettings: () => ({\n hideThinkingBlock: this.hideThinkingBlock,\n hiddenThinkingLabel: this.hiddenThinkingLabel,\n toolOutputExpanded: this.toolOutputExpanded,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n getToolDefinition: (toolName: string) =>\n this.getRegisteredToolDefinition(toolName),\n getCustomMessageRenderer: (customType: string) =>\n this.session.extensionRunner.getMessageRenderer(customType),\n }),\n };\n };\n"]}
1
+ {"version":3,"file":"interactive-extension-context.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type ExtensionUIContext, type HostCustomUiState, type HostCustomUiStateListener, type ProjectTrustContext, getAvailableThemesWithPaths, getThemeByName, Theme, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.addExtensionTerminalInputListener = function(this: InteractiveModeBase, handler: (data: string) => { consume?: boolean; data?: string } | undefined): () => void {\n const unsubscribe = this.ui.addInputListener(handler);\n this.extensionTerminalInputUnsubscribers.add(unsubscribe);\n return () => {\n unsubscribe();\n this.extensionTerminalInputUnsubscribers.delete(unsubscribe);\n };\n };\n\nInteractiveModeBase.prototype.clearExtensionTerminalInputListeners = function(this: InteractiveModeBase): void {\n for (const unsubscribe of this.extensionTerminalInputUnsubscribers) {\n unsubscribe();\n }\n this.extensionTerminalInputUnsubscribers.clear();\n };\n\nInteractiveModeBase.prototype.getHostCustomUiState = function(this: InteractiveModeBase): HostCustomUiState {\n const focusDeferred =\n this.blockingInlineCustomUiDepth > 0 && this.pendingInlineCustomUiFocus !== undefined;\n return {\n blockingInlineCustomUiDepth: this.blockingInlineCustomUiDepth,\n blockingInlineCustomUiActive: this.blockingInlineCustomUiDepth > 0,\n ...(focusDeferred ? { blockingInlineCustomUiFocusDeferred: true } : {}),\n };\n };\n\nInteractiveModeBase.prototype.notifyHostCustomUiStateListeners = function(this: InteractiveModeBase): void {\n const state = this.getHostCustomUiState();\n for (const listener of this.hostCustomUiStateListeners) {\n try {\n listener(state);\n } catch {\n /* ignore observer errors */\n }\n }\n };\n\nInteractiveModeBase.prototype.beginHostInlineCustomUi = function(this: InteractiveModeBase): () => void {\n let released = false;\n this.blockingInlineCustomUiDepth++;\n this.notifyHostCustomUiStateListeners();\n return () => {\n if (released) return;\n released = true;\n this.blockingInlineCustomUiDepth = Math.max(\n 0,\n this.blockingInlineCustomUiDepth - 1,\n );\n this.notifyHostCustomUiStateListeners();\n };\n };\n\nInteractiveModeBase.prototype.beginInlineCustomUiFocusDeferral = function(this: InteractiveModeBase): () => void {\n let released = false;\n this.deferredInlineCustomUiFocusDepth++;\n return () => {\n if (released) return;\n released = true;\n this.deferredInlineCustomUiFocusDepth = Math.max(\n 0,\n this.deferredInlineCustomUiFocusDepth - 1,\n );\n if (this.deferredInlineCustomUiFocusDepth === 0) {\n this.focusHostInlineCustomUi();\n }\n };\n };\n\nInteractiveModeBase.prototype.shouldDeferInlineCustomUiFocus = function(this: InteractiveModeBase): boolean {\n return this.deferredInlineCustomUiFocusDepth > 0;\n };\n\nInteractiveModeBase.prototype.focusHostInlineCustomUi = function(this: InteractiveModeBase): boolean {\n const component = this.pendingInlineCustomUiFocus;\n if (component === undefined) return false;\n this.pendingInlineCustomUiFocus = undefined;\n this.ui.setFocus(component);\n this.ui.requestRender();\n this.notifyHostCustomUiStateListeners();\n return true;\n };\n\nInteractiveModeBase.prototype.onHostCustomUiStateChange = function(this: InteractiveModeBase, listener: HostCustomUiStateListener): () => void {\n this.hostCustomUiStateListeners.add(listener);\n return () => {\n this.hostCustomUiStateListeners.delete(listener);\n };\n };\n\nInteractiveModeBase.prototype.createProjectTrustContext = function(this: InteractiveModeBase, cwd: string): ProjectTrustContext {\n const ui = this.createExtensionUIContext();\n return {\n cwd,\n mode: \"tui\",\n hasUI: true,\n ui: {\n select: ui.select,\n confirm: ui.confirm,\n input: ui.input,\n notify: ui.notify,\n },\n };\n };\n\nInteractiveModeBase.prototype.createExtensionUIContext = function(this: InteractiveModeBase): ExtensionUIContext {\n return {\n select: (title, options, opts) =>\n this.showExtensionSelector(title, options, opts),\n confirm: (title, message, opts) =>\n this.showExtensionConfirm(title, message, opts),\n input: (title, placeholder, opts) =>\n this.showExtensionInput(title, placeholder, opts),\n notify: (message, type) => this.showExtensionNotify(message, type),\n requestRender: () => this.ui.requestRender(),\n getHostCustomUiState: () => this.getHostCustomUiState(),\n onHostCustomUiStateChange: (listener) =>\n this.onHostCustomUiStateChange(listener),\n focusHostInlineCustomUi: () => this.focusHostInlineCustomUi(),\n onTerminalInput: (handler) =>\n this.addExtensionTerminalInputListener(handler),\n setStatus: (key, text) => this.setExtensionStatus(key, text),\n setWorkingMessage: (message) => {\n this.workingMessage = message;\n if (this.loadingAnimation) {\n this.loadingAnimation.setMessage(\n message ?? this.defaultWorkingMessage,\n );\n }\n },\n setWorkingVisible: (visible) => this.setWorkingVisible(visible),\n setWorkingIndicator: (options) => this.setWorkingIndicator(options),\n setHiddenThinkingLabel: (label) => this.setHiddenThinkingLabel(label),\n setWidget: (key, content, options) =>\n this.setExtensionWidget(key, content, options),\n setFooter: (factory) => this.setExtensionFooter(factory),\n setHeader: (factory) => this.setExtensionHeader(factory),\n setTitle: (title) => this.ui.terminal.setTitle(title),\n custom: (factory, options) => this.showExtensionCustom(factory, options),\n pasteToEditor: (text) =>\n this.editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => this.editor.setText(text),\n getEditorText: () =>\n this.editor.getExpandedText?.() ?? this.editor.getText(),\n editor: (title, prefill) => this.showExtensionEditor(title, prefill),\n addAutocompleteProvider: (factory) => {\n this.autocompleteProviderWrappers.push(factory);\n this.setupAutocompleteProvider();\n },\n setEditorComponent: (factory) => this.setCustomEditorComponent(factory),\n getEditorComponent: () => this.editorComponentFactory,\n getFooterDataProvider: () => this.footerDataProvider,\n get theme() {\n return theme;\n },\n getAllThemes: () => getAvailableThemesWithPaths(),\n getTheme: (name) => getThemeByName(name),\n setTheme: (themeOrName) => {\n if (themeOrName instanceof Theme) {\n return this.themeController.setThemeInstance(themeOrName);\n }\n const result = this.themeController.setThemeName(themeOrName);\n if (result.success && this.settingsManager.getThemeSetting() !== themeOrName) {\n this.settingsManager.setTheme(themeOrName);\n }\n return result;\n },\n getToolsExpanded: () => this.toolOutputExpanded,\n setToolsExpanded: (expanded) => this.setToolsExpanded(expanded),\n getChatRenderSettings: () => ({\n hideThinkingBlock: this.hideThinkingBlock,\n hiddenThinkingLabel: this.hiddenThinkingLabel,\n toolOutputExpanded: this.toolOutputExpanded,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n outputPad: this.outputPad,\n getToolDefinition: (toolName: string) =>\n this.getRegisteredToolDefinition(toolName),\n getCustomMessageRenderer: (customType: string) =>\n this.session.extensionRunner.getMessageRenderer(customType),\n }),\n };\n };\n"]}
@@ -53,6 +53,7 @@ export declare class InteractiveModeBase {
53
53
  pendingTools: Map<string, ToolExecutionComponent>;
54
54
  toolOutputExpanded: boolean;
55
55
  hideThinkingBlock: boolean;
56
+ outputPad: 0 | 1;
56
57
  skillCommands: Map<string, string>;
57
58
  unsubscribe?: () => void;
58
59
  signalCleanupHandlers: Array<() => void>;
@@ -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\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 // 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.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\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":"AAAA;;;GAGG;AACH,OAAoB,+BAA+B,CAAC;AACpD,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,2BAA2B,EAAE,KAAK,aAAa,EAAE,KAAK,yBAAyB,EAAE,SAAS,EAAE,MAAM,EAAmB,MAAM,EAAkB,IAAI,EAAE,GAAG,EAAW,kBAAkB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,cAAc,EAAE,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAuC,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC3rB,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAEnG,qBAAa,mBAAmB;IAE9B,WAAW,EAAE,mBAAmB,CAAC;IAGjC,EAAE,EAAE,GAAG,CAAC;IAGR,aAAa,EAAE,SAAS,CAAC;IAGzB,wBAAwB,EAAE,SAAS,CAAC;IAGpC,eAAe,EAAE,SAAS,CAAC;IAG3B,aAAa,EAAE,YAAY,CAAC;IAG5B,MAAM,EAAE,eAAe,CAAC;IAGxB,sBAAsB,EAAE,aAAa,GAAG,SAAS,CAAC;IAGlD,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAGvD,4BAA4B,EAAE,2BAA2B,EAAE,CAAM;IAGjE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAG3B,eAAe,EAAE,SAAS,CAAC;IAG3B,MAAM,EAAE,eAAe,CAAC;IAGxB,UAAU,EAAE,mBAAmB,CAAC;IAGhC,kBAAkB,EAAE,kBAAkB,CAAC;IAIvC,WAAW,EAAE,kBAAkB,CAAC;IAGhC,OAAO,EAAE,MAAM,CAAC;IAGhB,aAAa,UAAS;IAItB,qBAAqB,UAAS;IAG9B,sBAAsB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAGzC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAGjC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAa;IAGjD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAG/C,cAAc,UAAQ;IAGtB,uBAAuB,EAAE,sBAAsB,GAAG,SAAS,CAC/C;IAGZ,QAAQ,CAAC,qBAAqB,gBAAgB;IAG9C,QAAQ,CAAC,0BAA0B,iBAAiB;IAGpD,mBAAmB,SAAmC;IAItD,cAAc,SAAK;IAGnB,cAAc,SAAK;IAGnB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAa;IAGlD,mBAAmB,UAAS;IAG5B,iCAAiC,UAAS;IAG1C,wBAAwB,UAAS;IAGjC,8BAA8B,UAAS;IAGvC,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAa;IAG9D,gCAAgC,UAAS;IAGzC,kCAAkC,EAAE,SAAS,EAAE,CAAM;IAGrD,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IAKzC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAa;IAGjD,cAAc,EAAE,IAAI,GAAG,SAAS,CAAa;IAK7C,kBAAkB,EAAE,yBAAyB,GAAG,SAAS,CAAa;IAGtE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAa;IAK3D,YAAY,sCAA6C;IAKzD,kBAAkB,UAAS;IAK3B,iBAAiB,UAAS;IAC1B,SAAS,EAAE,CAAC,GAAG,CAAC,CAAK;IAKrB,aAAa,sBAA6B;IAK1C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAGzB,qBAAqB,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAM;IAK9C,UAAU,UAAS;IAKnB,aAAa,EAAE,sBAAsB,GAAG,SAAS,CAAa;IAK9D,qBAAqB,EAAE,sBAAsB,EAAE,CAAM;IAKrD,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAa;IAGrD,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IAKzC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAa;IAG5C,cAAc,EAAE,cAAc,GAAG,SAAS,CAAa;IAGvD,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAKhC,wBAAwB,EAAE,uBAAuB,EAAE,CAAM;IAKzD,iBAAiB,UAAS;IAK1B,iBAAiB,EAAE,0BAA0B,GAAG,SAAS,CAAa;IAGtE,cAAc,EAAE,uBAAuB,GAAG,SAAS,CAAa;IAGhE,eAAe,EAAE,wBAAwB,GAAG,SAAS,CAAa;IAGlE,mCAAmC,YAAiB,IAAI,EAAI;IAG5D,2BAA2B,SAAK;IAGhC,gCAAgC,SAAK;IAGrC,0BAA0B,EAAE,SAAS,GAAG,SAAS,CAAa;IAG9D,0BAA0B,iCAAwC;IAGlE,eAAe,EAAE,0BAA0B,CAAC;IAK5C,qBAAqB;oBAEO,IAAI;OAC5B;IAGJ,qBAAqB;oBAEO,IAAI;OAC5B;IAGJ,oBAAoB,EAAG,SAAS,CAAC;IAGjC,oBAAoB,EAAG,SAAS,CAAC;IAKjC,YAAY,EAAE,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAChD;IAKZ,eAAe,EAAE,SAAS,CAAC;IAK3B,aAAa,EAAE,SAAS,GAAG,SAAS,CAAa;IAKjD,YAAY,EAAE,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAChD;IAKZ,IAAI,OAAO,IAAI,YAAY,CAE1B;IAGD,IAAI,KAAK,kDAER;IAGD,IAAI,cAAc,wDAEjB;IAGD,IAAI,eAAe,6CAElB;IAIO,OAAO,EAAE,sBAAsB,CAAC;IAIxC,YACE,WAAW,EAAE,mBAAmB,EAChC,OAAO,GAAE,sBAA2B,EA2DrC;IAKD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,MAAM;IAItC;;;;OAIG;IACH,cAAc,UAAS;CACxB","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 // 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.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"]}
@@ -48,6 +48,7 @@ export class InteractiveModeBase {
48
48
  this.toolOutputExpanded = false;
49
49
  // Thinking block visibility state
50
50
  this.hideThinkingBlock = false;
51
+ this.outputPad = 1;
51
52
  // Skill commands: command name -> skill file path
52
53
  this.skillCommands = new Map();
53
54
  this.signalCleanupHandlers = [];
@@ -125,6 +126,7 @@ export class InteractiveModeBase {
125
126
  this.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);
126
127
  // Load hide thinking block setting
127
128
  this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
129
+ this.outputPad = this.settingsManager.getOutputPad();
128
130
  // Register themes from resource loader and initialize
129
131
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
130
132
  this.themeController = new InteractiveThemeController(this.ui, this.settingsManager, (message) => this.showError(message), () => this.updateEditorBorderColor());
@@ -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\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 // 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.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\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\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 // 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.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 +1 @@
1
- {"version":3,"file":"interactive-model-routing.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n const cred = registry.authStorage.get(\"github-copilot\");\n // Gate: do nothing unless the user has the GitHub Copilot provider.\n if (!cred || cred.type !== \"oauth\") return;\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n await this.resumePendingFirstRunOnboardingSeed();\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n async (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
1
+ {"version":3,"file":"interactive-model-routing.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n // Gate: do nothing unless the user has a Copilot token, including COPILOT_GITHUB_TOKEN env auth.\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n await this.resumePendingFirstRunOnboardingSeed();\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n async (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
@@ -56,10 +56,7 @@ InteractiveModeBase.prototype.refreshCopilotModelCatalog = async function () {
56
56
  };
57
57
  InteractiveModeBase.prototype.loadCopilotModelCatalog = async function () {
58
58
  const registry = this.session.modelRegistry;
59
- const cred = registry.authStorage.get("github-copilot");
60
- // Gate: do nothing unless the user has the GitHub Copilot provider.
61
- if (!cred || cred.type !== "oauth")
62
- return;
59
+ // Gate: do nothing unless the user has a Copilot token, including COPILOT_GITHUB_TOKEN env auth.
63
60
  try {
64
61
  const token = await registry.getApiKeyForProvider("github-copilot");
65
62
  if (!token)
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-model-routing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAwB,WAAW,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AACnc,OAAO,EAAE,mCAAmC,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAEpH,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK,WAAqC,UAAmB;IAC5G,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,IAAI,CAAC,mCAAmC,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,mBAAmB,GAAG,KAAK,WAAqC,UAAkB;IAC5G,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC/C,OAAO,4BAA4B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK;IACpD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACxC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,0BAA0B,GAAG,KAAK;IAC5D,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO;IACvC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACjC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,sBAAsB,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,uBAAuB,GAAG,KAAK;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxD,oEAAoE;IACpE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,IAAI,OAAO,GAAG,uBAAuB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,MAAM,wBAAwB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;QACD,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACtC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,qFAAqF;IACvF,CAAC;AACH,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,4BAA4B,GAAG,KAAK;IAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,uCAAuC,GAAG,KAAK,WAAqC,KAAK,GAA2B,IAAI,CAAC,OAAO,CAAC,KAAK;IAChK,IAAI,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,mBAAmB,KAAK,KAAK,EAAE,CAAC;QACrE,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GACpB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,gBAAgB,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAClE,KAAK,CAAC,QAAQ,CACf,CAAC;QACF,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;AACH,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAoC,kBAA2B;IAC7G,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CACzC,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,OAAO,CAAC,KAAK,EAClB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,OAAO,CAAC,aAAa,EAC1B,IAAI,CAAC,OAAO,CAAC,YAAY,EACzB,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC;gBACP,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC;oBAClD,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,MAAM,IAAI,CAAC,mCAAmC,EAAE,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,SAAS,CACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC,EACD,GAAG,EAAE;YACH,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC,EACD,kBAAkB,CACnB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAoC,KAAiB;IAC3G,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAC1E,MAAM,oBAAoB,GACxB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,IAAI,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,IAAI,8BAA8B,CACjD,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,EAAE,aAAa,EAAE,EAAE;YACtB,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE;oBAC3C,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,UAAU,CACb,UAAU,KAAK,CAAC,EAAE,WAAW,mBAAmB,CAAC,aAAa,CAAC,UAAU,CAC1E,CAAC;gBACF,MAAM,IAAI,CAAC,mCAAmC,EAAE,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,SAAS,CACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC,EACD,GAAG,EAAE;YACH,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,CAAC,CACF,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK;IACpD,2BAA2B;IAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IAE5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,0FAA0F;IAC1F,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACtD,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvD,yDAAyD;IACzD,IAAI,iBAAiB,GAAoB,IAAI,CAAC;IAE9C,IAAI,eAAe,EAAE,CAAC;QACpB,sCAAsC;QACtC,iBAAiB,GAAG,mBAAmB,CAAC,GAAG,CACzC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAC1D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;QACzD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAC1C,QAAQ,EACR,IAAI,CAAC,OAAO,CAAC,aAAa,CAC3B,CAAC;YACF,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAClC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,mBAAmB,GAAG,KAAK,EAAE,UAA2B,EAAE,EAAE;QAChE,iBAAiB,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACjE,IACE,UAAU;YACV,UAAU,CAAC,MAAM,GAAG,CAAC;YACrB,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EACxC,CAAC;YACG,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAC7C,UAAU,EACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAC3B,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,eAAe,CAC1B,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3B,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,aAAa,EAAE,EAAE,CAAC,aAAa;aAChC,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC1C,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAChD;YACE,SAAS;YACT,eAAe,EAAE,iBAAiB;SACnC,EACD;YACE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC7B,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACxC,CAAC;YACD,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE;gBACxB,sBAAsB;gBACtB,MAAM,WAAW,GACf,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;oBAC3D,CAAC,CAAC,SAAS,CAAC,6BAA6B;oBACzC,CAAC,CAAC,UAAU,CAAC;gBACjB,IAAI,CAAC,eAAe,CAAC,gBAAgB,CACnC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE;gBACb,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YAC1B,CAAC;SACF,CACF,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEJ,mBAAmB,CAAC,SAAS,CAAC,uBAAuB,GAAG;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAE9D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAEzE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,IAAI,4BAA4B,CAC/C,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1D,KAAK,EAAE,OAAO,EAAE,EAAE;YAChB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,IAAI,EAAE,CAAC;oBACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;oBACxB,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAC/C,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,SAAS,CACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC,EACD,GAAG,EAAE;YACH,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC,EACD,iBAAiB,CAClB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n const cred = registry.authStorage.get(\"github-copilot\");\n // Gate: do nothing unless the user has the GitHub Copilot provider.\n if (!cred || cred.type !== \"oauth\") return;\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n await this.resumePendingFirstRunOnboardingSeed();\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n async (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
1
+ {"version":3,"file":"interactive-model-routing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n // Gate: do nothing unless the user has a Copilot token, including COPILOT_GITHUB_TOKEN env auth.\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n await this.resumePendingFirstRunOnboardingSeed();\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n async (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-render-chat.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-render-chat.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type AgentMessage, type Component, type ContextCompactionResult, type SessionContext, type TruncationResult, type ChatMessageEntry, type ChatMessageRenderOptions, Spacer, Text, parseSkillBlock, AssistantMessageComponent, BashExecutionComponent, BranchSummaryMessageComponent, chatEntriesFromAgentMessages, renderChatMessageEntry, addChatTranscriptEntry, ContextCompactionSummaryMessageComponent, CustomMessageComponent, SkillInvocationMessageComponent, ToolExecutionComponent, UserMessageComponent, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showStatus = function(this: InteractiveModeBase, message: string): void {\n const children = this.chatContainer.children;\n const last =\n children.length > 0 ? children[children.length - 1] : undefined;\n const secondLast =\n children.length > 1 ? children[children.length - 2] : undefined;\n\n if (\n last &&\n secondLast &&\n last === this.lastStatusText &&\n secondLast === this.lastStatusSpacer\n ) {\n this.lastStatusText.setText(theme.fg(\"dim\", message));\n this.ui.requestRender();\n return;\n }\n\n const spacer = new Spacer(1);\n const text = new Text(theme.fg(\"dim\", message), 1, 0);\n this.chatContainer.addChild(spacer);\n this.chatContainer.addChild(text);\n this.lastStatusSpacer = spacer;\n this.lastStatusText = text;\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.chatMessageRenderOptions = function(this: InteractiveModeBase): ChatMessageRenderOptions {\n return {\n ui: this.ui,\n cwd: this.sessionManager.getCwd(),\n markdownTheme: this.getMarkdownThemeWithSettings(),\n hideThinkingBlock: this.hideThinkingBlock,\n hiddenThinkingLabel: this.hiddenThinkingLabel,\n toolOutputExpanded: this.toolOutputExpanded,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n getToolDefinition: (toolName) => this.getRegisteredToolDefinition(toolName),\n getCustomMessageRenderer: (customType) =>\n this.session.extensionRunner.getMessageRenderer(customType),\n };\n };\n\nInteractiveModeBase.prototype.addRenderedChatEntry = function(this: InteractiveModeBase, entry: ChatMessageEntry): Component {\n const component = renderChatMessageEntry(entry, this.chatMessageRenderOptions());\n addChatTranscriptEntry(this.chatContainer, component, entry.role);\n return component;\n };\n\nInteractiveModeBase.prototype.addContextCompactionSummaryToChat = function(this: InteractiveModeBase, result: ContextCompactionResult): void {\n this.chatContainer.addChild(new Spacer(1));\n const component = new ContextCompactionSummaryMessageComponent(\n result,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n };\n\nInteractiveModeBase.prototype.addMessageToChat = function(this: InteractiveModeBase, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n switch (message.role) {\n case \"bashExecution\": {\n const component = new BashExecutionComponent(\n message.command,\n this.ui,\n message.excludeFromContext,\n );\n if (message.output) {\n component.appendOutput(message.output);\n }\n component.setComplete(\n message.exitCode,\n message.cancelled,\n message.truncated\n ? ({ truncated: true } as TruncationResult)\n : undefined,\n message.fullOutputPath,\n );\n this.chatContainer.addChild(component);\n break;\n }\n case \"custom\": {\n if (message.display) {\n const renderer = this.session.extensionRunner.getMessageRenderer(\n message.customType,\n );\n const component = new CustomMessageComponent(\n message,\n renderer,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n }\n break;\n }\n case \"branchSummary\": {\n this.chatContainer.addChild(new Spacer(1));\n const component = new BranchSummaryMessageComponent(\n message,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n break;\n }\n case \"user\": {\n const textContent = this.getUserMessageText(message);\n if (textContent) {\n if (this.chatContainer.children.length > 0) {\n this.chatContainer.addChild(new Spacer(1));\n }\n const skillBlock = parseSkillBlock(textContent);\n if (skillBlock) {\n // Render skill block (collapsible)\n const component = new SkillInvocationMessageComponent(\n skillBlock,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n // Render user message separately if present\n if (skillBlock.userMessage) {\n const userComponent = new UserMessageComponent(\n skillBlock.userMessage,\n this.getMarkdownThemeWithSettings(),\n );\n this.chatContainer.addChild(userComponent);\n }\n } else {\n const userComponent = new UserMessageComponent(\n textContent,\n this.getMarkdownThemeWithSettings(),\n );\n this.chatContainer.addChild(userComponent);\n }\n if (options?.populateHistory) {\n this.editor.addToHistory?.(textContent);\n }\n }\n break;\n }\n case \"assistant\": {\n const assistantComponent = new AssistantMessageComponent(\n message,\n this.hideThinkingBlock,\n this.getMarkdownThemeWithSettings(),\n this.hiddenThinkingLabel,\n );\n this.chatContainer.addChild(assistantComponent);\n break;\n }\n case \"toolResult\": {\n // Tool results are rendered inline with tool calls, handled separately\n break;\n }\n default:\n break;\n }\n };\n\nInteractiveModeBase.prototype.renderSessionContext = function(this: InteractiveModeBase, sessionContext: SessionContext, options: { updateFooter?: boolean; populateHistory?: boolean } = {}): void {\n this.pendingTools.clear();\n\n if (options.updateFooter) {\n this.footer.invalidate();\n this.updateEditorBorderColor();\n }\n\n const entries = chatEntriesFromAgentMessages(sessionContext.messages);\n for (const entry of entries) {\n const component = this.addRenderedChatEntry(entry);\n if (\n entry.kind === \"tool\" &&\n entry.isPartial !== false &&\n component instanceof ToolExecutionComponent\n ) {\n this.pendingTools.set(entry.toolCallId, component);\n }\n if (options.populateHistory && entry.kind === \"user\") {\n this.editor.addToHistory?.(entry.text);\n }\n }\n\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.renderInitialMessages = function(this: InteractiveModeBase): void {\n // Get aligned messages and entries from session context\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context, {\n updateFooter: true,\n populateHistory: true,\n });\n\n // Show compaction info if session was compacted\n const allEntries = this.sessionManager.getEntries();\n const compactionCount = allEntries.filter(\n (e) => e.type === \"compaction\",\n ).length;\n if (compactionCount > 0) {\n const times =\n compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n this.showStatus(`Session compacted ${times}`);\n }\n };\n\nInteractiveModeBase.prototype.getUserInput = async function(this: InteractiveModeBase): Promise<string> {\n const queuedInput = this.pendingUserInputs.shift();\n if (queuedInput !== undefined) {\n return queuedInput;\n }\n\n return new Promise((resolve) => {\n this.onInputCallback = (text: string) => {\n this.onInputCallback = undefined;\n resolve(text);\n };\n });\n };\n\nInteractiveModeBase.prototype.rebuildChatFromMessages = function(this: InteractiveModeBase): void {\n this.chatContainer.clear();\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context);\n };\n"]}
1
+ {"version":3,"file":"interactive-render-chat.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-render-chat.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type AgentMessage, type Component, type ContextCompactionResult, type SessionContext, type TruncationResult, type ChatMessageEntry, type ChatMessageRenderOptions, Spacer, Text, parseSkillBlock, AssistantMessageComponent, BashExecutionComponent, BranchSummaryMessageComponent, chatEntriesFromAgentMessages, renderChatMessageEntry, addChatTranscriptEntry, ContextCompactionSummaryMessageComponent, CustomMessageComponent, SkillInvocationMessageComponent, ToolExecutionComponent, UserMessageComponent, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showStatus = function(this: InteractiveModeBase, message: string): void {\n const children = this.chatContainer.children;\n const last =\n children.length > 0 ? children[children.length - 1] : undefined;\n const secondLast =\n children.length > 1 ? children[children.length - 2] : undefined;\n\n if (\n last &&\n secondLast &&\n last === this.lastStatusText &&\n secondLast === this.lastStatusSpacer\n ) {\n this.lastStatusText.setText(theme.fg(\"dim\", message));\n this.ui.requestRender();\n return;\n }\n\n const spacer = new Spacer(1);\n const text = new Text(theme.fg(\"dim\", message), 1, 0);\n this.chatContainer.addChild(spacer);\n this.chatContainer.addChild(text);\n this.lastStatusSpacer = spacer;\n this.lastStatusText = text;\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.chatMessageRenderOptions = function(this: InteractiveModeBase): ChatMessageRenderOptions {\n return {\n ui: this.ui,\n cwd: this.sessionManager.getCwd(),\n markdownTheme: this.getMarkdownThemeWithSettings(),\n hideThinkingBlock: this.hideThinkingBlock,\n hiddenThinkingLabel: this.hiddenThinkingLabel,\n toolOutputExpanded: this.toolOutputExpanded,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n outputPad: this.outputPad,\n getToolDefinition: (toolName) => this.getRegisteredToolDefinition(toolName),\n getCustomMessageRenderer: (customType) =>\n this.session.extensionRunner.getMessageRenderer(customType),\n };\n };\n\nInteractiveModeBase.prototype.addRenderedChatEntry = function(this: InteractiveModeBase, entry: ChatMessageEntry): Component {\n const component = renderChatMessageEntry(entry, this.chatMessageRenderOptions());\n addChatTranscriptEntry(this.chatContainer, component, entry.role);\n return component;\n };\n\nInteractiveModeBase.prototype.addContextCompactionSummaryToChat = function(this: InteractiveModeBase, result: ContextCompactionResult): void {\n this.chatContainer.addChild(new Spacer(1));\n const component = new ContextCompactionSummaryMessageComponent(\n result,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n };\n\nInteractiveModeBase.prototype.addMessageToChat = function(this: InteractiveModeBase, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n switch (message.role) {\n case \"bashExecution\": {\n const component = new BashExecutionComponent(\n message.command,\n this.ui,\n message.excludeFromContext,\n );\n if (message.output) {\n component.appendOutput(message.output);\n }\n component.setComplete(\n message.exitCode,\n message.cancelled,\n message.truncated\n ? ({ truncated: true } as TruncationResult)\n : undefined,\n message.fullOutputPath,\n );\n this.chatContainer.addChild(component);\n break;\n }\n case \"custom\": {\n if (message.display) {\n const renderer = this.session.extensionRunner.getMessageRenderer(\n message.customType,\n );\n const component = new CustomMessageComponent(\n message,\n renderer,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n }\n break;\n }\n case \"branchSummary\": {\n this.chatContainer.addChild(new Spacer(1));\n const component = new BranchSummaryMessageComponent(\n message,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n break;\n }\n case \"user\": {\n const textContent = this.getUserMessageText(message);\n if (textContent) {\n if (this.chatContainer.children.length > 0) {\n this.chatContainer.addChild(new Spacer(1));\n }\n const skillBlock = parseSkillBlock(textContent);\n if (skillBlock) {\n // Render skill block (collapsible)\n const component = new SkillInvocationMessageComponent(\n skillBlock,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n // Render user message separately if present\n if (skillBlock.userMessage) {\n const userComponent = new UserMessageComponent(\n skillBlock.userMessage,\n this.getMarkdownThemeWithSettings(),\n this.outputPad,\n );\n this.chatContainer.addChild(userComponent);\n }\n } else {\n const userComponent = new UserMessageComponent(\n textContent,\n this.getMarkdownThemeWithSettings(),\n this.outputPad,\n );\n this.chatContainer.addChild(userComponent);\n }\n if (options?.populateHistory) {\n this.editor.addToHistory?.(textContent);\n }\n }\n break;\n }\n case \"assistant\": {\n const assistantComponent = new AssistantMessageComponent(\n message,\n this.hideThinkingBlock,\n this.getMarkdownThemeWithSettings(),\n this.hiddenThinkingLabel,\n this.outputPad,\n );\n this.chatContainer.addChild(assistantComponent);\n break;\n }\n case \"toolResult\": {\n // Tool results are rendered inline with tool calls, handled separately\n break;\n }\n default:\n break;\n }\n };\n\nInteractiveModeBase.prototype.renderSessionContext = function(this: InteractiveModeBase, sessionContext: SessionContext, options: { updateFooter?: boolean; populateHistory?: boolean } = {}): void {\n this.pendingTools.clear();\n\n if (options.updateFooter) {\n this.footer.invalidate();\n this.updateEditorBorderColor();\n }\n\n const entries = chatEntriesFromAgentMessages(sessionContext.messages);\n for (const entry of entries) {\n const component = this.addRenderedChatEntry(entry);\n if (\n entry.kind === \"tool\" &&\n entry.isPartial !== false &&\n component instanceof ToolExecutionComponent\n ) {\n this.pendingTools.set(entry.toolCallId, component);\n }\n if (options.populateHistory && entry.kind === \"user\") {\n this.editor.addToHistory?.(entry.text);\n }\n }\n\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.renderInitialMessages = function(this: InteractiveModeBase): void {\n // Get aligned messages and entries from session context\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context, {\n updateFooter: true,\n populateHistory: true,\n });\n\n // Show compaction info if session was compacted\n const allEntries = this.sessionManager.getEntries();\n const compactionCount = allEntries.filter(\n (e) => e.type === \"compaction\",\n ).length;\n if (compactionCount > 0) {\n const times =\n compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n this.showStatus(`Session compacted ${times}`);\n }\n };\n\nInteractiveModeBase.prototype.getUserInput = async function(this: InteractiveModeBase): Promise<string> {\n const queuedInput = this.pendingUserInputs.shift();\n if (queuedInput !== undefined) {\n return queuedInput;\n }\n\n return new Promise((resolve) => {\n this.onInputCallback = (text: string) => {\n this.onInputCallback = undefined;\n resolve(text);\n };\n });\n };\n\nInteractiveModeBase.prototype.rebuildChatFromMessages = function(this: InteractiveModeBase): void {\n this.chatContainer.clear();\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context);\n };\n"]}
@@ -30,6 +30,7 @@ InteractiveModeBase.prototype.chatMessageRenderOptions = function () {
30
30
  toolOutputExpanded: this.toolOutputExpanded,
31
31
  showImages: this.settingsManager.getShowImages(),
32
32
  imageWidthCells: this.settingsManager.getImageWidthCells(),
33
+ outputPad: this.outputPad,
33
34
  getToolDefinition: (toolName) => this.getRegisteredToolDefinition(toolName),
34
35
  getCustomMessageRenderer: (customType) => this.session.extensionRunner.getMessageRenderer(customType),
35
36
  };
@@ -88,12 +89,12 @@ InteractiveModeBase.prototype.addMessageToChat = function (message, options) {
88
89
  this.chatContainer.addChild(component);
89
90
  // Render user message separately if present
90
91
  if (skillBlock.userMessage) {
91
- const userComponent = new UserMessageComponent(skillBlock.userMessage, this.getMarkdownThemeWithSettings());
92
+ const userComponent = new UserMessageComponent(skillBlock.userMessage, this.getMarkdownThemeWithSettings(), this.outputPad);
92
93
  this.chatContainer.addChild(userComponent);
93
94
  }
94
95
  }
95
96
  else {
96
- const userComponent = new UserMessageComponent(textContent, this.getMarkdownThemeWithSettings());
97
+ const userComponent = new UserMessageComponent(textContent, this.getMarkdownThemeWithSettings(), this.outputPad);
97
98
  this.chatContainer.addChild(userComponent);
98
99
  }
99
100
  if (options?.populateHistory) {
@@ -103,7 +104,7 @@ InteractiveModeBase.prototype.addMessageToChat = function (message, options) {
103
104
  break;
104
105
  }
105
106
  case "assistant": {
106
- const assistantComponent = new AssistantMessageComponent(message, this.hideThinkingBlock, this.getMarkdownThemeWithSettings(), this.hiddenThinkingLabel);
107
+ const assistantComponent = new AssistantMessageComponent(message, this.hideThinkingBlock, this.getMarkdownThemeWithSettings(), this.hiddenThinkingLabel, this.outputPad);
107
108
  this.chatContainer.addChild(assistantComponent);
108
109
  break;
109
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-render-chat.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-render-chat.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type AgentMessage, type Component, type ContextCompactionResult, type SessionContext, type TruncationResult, type ChatMessageEntry, type ChatMessageRenderOptions, Spacer, Text, parseSkillBlock, AssistantMessageComponent, BashExecutionComponent, BranchSummaryMessageComponent, chatEntriesFromAgentMessages, renderChatMessageEntry, addChatTranscriptEntry, ContextCompactionSummaryMessageComponent, CustomMessageComponent, SkillInvocationMessageComponent, ToolExecutionComponent, UserMessageComponent, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showStatus = function(this: InteractiveModeBase, message: string): void {\n const children = this.chatContainer.children;\n const last =\n children.length > 0 ? children[children.length - 1] : undefined;\n const secondLast =\n children.length > 1 ? children[children.length - 2] : undefined;\n\n if (\n last &&\n secondLast &&\n last === this.lastStatusText &&\n secondLast === this.lastStatusSpacer\n ) {\n this.lastStatusText.setText(theme.fg(\"dim\", message));\n this.ui.requestRender();\n return;\n }\n\n const spacer = new Spacer(1);\n const text = new Text(theme.fg(\"dim\", message), 1, 0);\n this.chatContainer.addChild(spacer);\n this.chatContainer.addChild(text);\n this.lastStatusSpacer = spacer;\n this.lastStatusText = text;\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.chatMessageRenderOptions = function(this: InteractiveModeBase): ChatMessageRenderOptions {\n return {\n ui: this.ui,\n cwd: this.sessionManager.getCwd(),\n markdownTheme: this.getMarkdownThemeWithSettings(),\n hideThinkingBlock: this.hideThinkingBlock,\n hiddenThinkingLabel: this.hiddenThinkingLabel,\n toolOutputExpanded: this.toolOutputExpanded,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n getToolDefinition: (toolName) => this.getRegisteredToolDefinition(toolName),\n getCustomMessageRenderer: (customType) =>\n this.session.extensionRunner.getMessageRenderer(customType),\n };\n };\n\nInteractiveModeBase.prototype.addRenderedChatEntry = function(this: InteractiveModeBase, entry: ChatMessageEntry): Component {\n const component = renderChatMessageEntry(entry, this.chatMessageRenderOptions());\n addChatTranscriptEntry(this.chatContainer, component, entry.role);\n return component;\n };\n\nInteractiveModeBase.prototype.addContextCompactionSummaryToChat = function(this: InteractiveModeBase, result: ContextCompactionResult): void {\n this.chatContainer.addChild(new Spacer(1));\n const component = new ContextCompactionSummaryMessageComponent(\n result,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n };\n\nInteractiveModeBase.prototype.addMessageToChat = function(this: InteractiveModeBase, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n switch (message.role) {\n case \"bashExecution\": {\n const component = new BashExecutionComponent(\n message.command,\n this.ui,\n message.excludeFromContext,\n );\n if (message.output) {\n component.appendOutput(message.output);\n }\n component.setComplete(\n message.exitCode,\n message.cancelled,\n message.truncated\n ? ({ truncated: true } as TruncationResult)\n : undefined,\n message.fullOutputPath,\n );\n this.chatContainer.addChild(component);\n break;\n }\n case \"custom\": {\n if (message.display) {\n const renderer = this.session.extensionRunner.getMessageRenderer(\n message.customType,\n );\n const component = new CustomMessageComponent(\n message,\n renderer,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n }\n break;\n }\n case \"branchSummary\": {\n this.chatContainer.addChild(new Spacer(1));\n const component = new BranchSummaryMessageComponent(\n message,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n break;\n }\n case \"user\": {\n const textContent = this.getUserMessageText(message);\n if (textContent) {\n if (this.chatContainer.children.length > 0) {\n this.chatContainer.addChild(new Spacer(1));\n }\n const skillBlock = parseSkillBlock(textContent);\n if (skillBlock) {\n // Render skill block (collapsible)\n const component = new SkillInvocationMessageComponent(\n skillBlock,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n // Render user message separately if present\n if (skillBlock.userMessage) {\n const userComponent = new UserMessageComponent(\n skillBlock.userMessage,\n this.getMarkdownThemeWithSettings(),\n );\n this.chatContainer.addChild(userComponent);\n }\n } else {\n const userComponent = new UserMessageComponent(\n textContent,\n this.getMarkdownThemeWithSettings(),\n );\n this.chatContainer.addChild(userComponent);\n }\n if (options?.populateHistory) {\n this.editor.addToHistory?.(textContent);\n }\n }\n break;\n }\n case \"assistant\": {\n const assistantComponent = new AssistantMessageComponent(\n message,\n this.hideThinkingBlock,\n this.getMarkdownThemeWithSettings(),\n this.hiddenThinkingLabel,\n );\n this.chatContainer.addChild(assistantComponent);\n break;\n }\n case \"toolResult\": {\n // Tool results are rendered inline with tool calls, handled separately\n break;\n }\n default:\n break;\n }\n };\n\nInteractiveModeBase.prototype.renderSessionContext = function(this: InteractiveModeBase, sessionContext: SessionContext, options: { updateFooter?: boolean; populateHistory?: boolean } = {}): void {\n this.pendingTools.clear();\n\n if (options.updateFooter) {\n this.footer.invalidate();\n this.updateEditorBorderColor();\n }\n\n const entries = chatEntriesFromAgentMessages(sessionContext.messages);\n for (const entry of entries) {\n const component = this.addRenderedChatEntry(entry);\n if (\n entry.kind === \"tool\" &&\n entry.isPartial !== false &&\n component instanceof ToolExecutionComponent\n ) {\n this.pendingTools.set(entry.toolCallId, component);\n }\n if (options.populateHistory && entry.kind === \"user\") {\n this.editor.addToHistory?.(entry.text);\n }\n }\n\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.renderInitialMessages = function(this: InteractiveModeBase): void {\n // Get aligned messages and entries from session context\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context, {\n updateFooter: true,\n populateHistory: true,\n });\n\n // Show compaction info if session was compacted\n const allEntries = this.sessionManager.getEntries();\n const compactionCount = allEntries.filter(\n (e) => e.type === \"compaction\",\n ).length;\n if (compactionCount > 0) {\n const times =\n compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n this.showStatus(`Session compacted ${times}`);\n }\n };\n\nInteractiveModeBase.prototype.getUserInput = async function(this: InteractiveModeBase): Promise<string> {\n const queuedInput = this.pendingUserInputs.shift();\n if (queuedInput !== undefined) {\n return queuedInput;\n }\n\n return new Promise((resolve) => {\n this.onInputCallback = (text: string) => {\n this.onInputCallback = undefined;\n resolve(text);\n };\n });\n };\n\nInteractiveModeBase.prototype.rebuildChatFromMessages = function(this: InteractiveModeBase): void {\n this.chatContainer.clear();\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context);\n };\n"]}
1
+ {"version":3,"file":"interactive-render-chat.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-render-chat.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type AgentMessage, type Component, type ContextCompactionResult, type SessionContext, type TruncationResult, type ChatMessageEntry, type ChatMessageRenderOptions, Spacer, Text, parseSkillBlock, AssistantMessageComponent, BashExecutionComponent, BranchSummaryMessageComponent, chatEntriesFromAgentMessages, renderChatMessageEntry, addChatTranscriptEntry, ContextCompactionSummaryMessageComponent, CustomMessageComponent, SkillInvocationMessageComponent, ToolExecutionComponent, UserMessageComponent, theme } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showStatus = function(this: InteractiveModeBase, message: string): void {\n const children = this.chatContainer.children;\n const last =\n children.length > 0 ? children[children.length - 1] : undefined;\n const secondLast =\n children.length > 1 ? children[children.length - 2] : undefined;\n\n if (\n last &&\n secondLast &&\n last === this.lastStatusText &&\n secondLast === this.lastStatusSpacer\n ) {\n this.lastStatusText.setText(theme.fg(\"dim\", message));\n this.ui.requestRender();\n return;\n }\n\n const spacer = new Spacer(1);\n const text = new Text(theme.fg(\"dim\", message), 1, 0);\n this.chatContainer.addChild(spacer);\n this.chatContainer.addChild(text);\n this.lastStatusSpacer = spacer;\n this.lastStatusText = text;\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.chatMessageRenderOptions = function(this: InteractiveModeBase): ChatMessageRenderOptions {\n return {\n ui: this.ui,\n cwd: this.sessionManager.getCwd(),\n markdownTheme: this.getMarkdownThemeWithSettings(),\n hideThinkingBlock: this.hideThinkingBlock,\n hiddenThinkingLabel: this.hiddenThinkingLabel,\n toolOutputExpanded: this.toolOutputExpanded,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n outputPad: this.outputPad,\n getToolDefinition: (toolName) => this.getRegisteredToolDefinition(toolName),\n getCustomMessageRenderer: (customType) =>\n this.session.extensionRunner.getMessageRenderer(customType),\n };\n };\n\nInteractiveModeBase.prototype.addRenderedChatEntry = function(this: InteractiveModeBase, entry: ChatMessageEntry): Component {\n const component = renderChatMessageEntry(entry, this.chatMessageRenderOptions());\n addChatTranscriptEntry(this.chatContainer, component, entry.role);\n return component;\n };\n\nInteractiveModeBase.prototype.addContextCompactionSummaryToChat = function(this: InteractiveModeBase, result: ContextCompactionResult): void {\n this.chatContainer.addChild(new Spacer(1));\n const component = new ContextCompactionSummaryMessageComponent(\n result,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n };\n\nInteractiveModeBase.prototype.addMessageToChat = function(this: InteractiveModeBase, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n switch (message.role) {\n case \"bashExecution\": {\n const component = new BashExecutionComponent(\n message.command,\n this.ui,\n message.excludeFromContext,\n );\n if (message.output) {\n component.appendOutput(message.output);\n }\n component.setComplete(\n message.exitCode,\n message.cancelled,\n message.truncated\n ? ({ truncated: true } as TruncationResult)\n : undefined,\n message.fullOutputPath,\n );\n this.chatContainer.addChild(component);\n break;\n }\n case \"custom\": {\n if (message.display) {\n const renderer = this.session.extensionRunner.getMessageRenderer(\n message.customType,\n );\n const component = new CustomMessageComponent(\n message,\n renderer,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n }\n break;\n }\n case \"branchSummary\": {\n this.chatContainer.addChild(new Spacer(1));\n const component = new BranchSummaryMessageComponent(\n message,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n break;\n }\n case \"user\": {\n const textContent = this.getUserMessageText(message);\n if (textContent) {\n if (this.chatContainer.children.length > 0) {\n this.chatContainer.addChild(new Spacer(1));\n }\n const skillBlock = parseSkillBlock(textContent);\n if (skillBlock) {\n // Render skill block (collapsible)\n const component = new SkillInvocationMessageComponent(\n skillBlock,\n this.getMarkdownThemeWithSettings(),\n );\n component.setExpanded(this.toolOutputExpanded);\n this.chatContainer.addChild(component);\n // Render user message separately if present\n if (skillBlock.userMessage) {\n const userComponent = new UserMessageComponent(\n skillBlock.userMessage,\n this.getMarkdownThemeWithSettings(),\n this.outputPad,\n );\n this.chatContainer.addChild(userComponent);\n }\n } else {\n const userComponent = new UserMessageComponent(\n textContent,\n this.getMarkdownThemeWithSettings(),\n this.outputPad,\n );\n this.chatContainer.addChild(userComponent);\n }\n if (options?.populateHistory) {\n this.editor.addToHistory?.(textContent);\n }\n }\n break;\n }\n case \"assistant\": {\n const assistantComponent = new AssistantMessageComponent(\n message,\n this.hideThinkingBlock,\n this.getMarkdownThemeWithSettings(),\n this.hiddenThinkingLabel,\n this.outputPad,\n );\n this.chatContainer.addChild(assistantComponent);\n break;\n }\n case \"toolResult\": {\n // Tool results are rendered inline with tool calls, handled separately\n break;\n }\n default:\n break;\n }\n };\n\nInteractiveModeBase.prototype.renderSessionContext = function(this: InteractiveModeBase, sessionContext: SessionContext, options: { updateFooter?: boolean; populateHistory?: boolean } = {}): void {\n this.pendingTools.clear();\n\n if (options.updateFooter) {\n this.footer.invalidate();\n this.updateEditorBorderColor();\n }\n\n const entries = chatEntriesFromAgentMessages(sessionContext.messages);\n for (const entry of entries) {\n const component = this.addRenderedChatEntry(entry);\n if (\n entry.kind === \"tool\" &&\n entry.isPartial !== false &&\n component instanceof ToolExecutionComponent\n ) {\n this.pendingTools.set(entry.toolCallId, component);\n }\n if (options.populateHistory && entry.kind === \"user\") {\n this.editor.addToHistory?.(entry.text);\n }\n }\n\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.renderInitialMessages = function(this: InteractiveModeBase): void {\n // Get aligned messages and entries from session context\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context, {\n updateFooter: true,\n populateHistory: true,\n });\n\n // Show compaction info if session was compacted\n const allEntries = this.sessionManager.getEntries();\n const compactionCount = allEntries.filter(\n (e) => e.type === \"compaction\",\n ).length;\n if (compactionCount > 0) {\n const times =\n compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n this.showStatus(`Session compacted ${times}`);\n }\n };\n\nInteractiveModeBase.prototype.getUserInput = async function(this: InteractiveModeBase): Promise<string> {\n const queuedInput = this.pendingUserInputs.shift();\n if (queuedInput !== undefined) {\n return queuedInput;\n }\n\n return new Promise((resolve) => {\n this.onInputCallback = (text: string) => {\n this.onInputCallback = undefined;\n resolve(text);\n };\n });\n };\n\nInteractiveModeBase.prototype.rebuildChatFromMessages = function(this: InteractiveModeBase): void {\n this.chatContainer.clear();\n const context = this.sessionManager.buildSessionContext();\n this.renderSessionContext(context);\n };\n"]}