@bastani/atomic 0.9.23 → 0.9.24

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 (149) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/CHANGELOG.md +12 -0
  4. package/dist/builtin/mcp/README.md +1 -0
  5. package/dist/builtin/mcp/index.bundle.mjs +244 -58
  6. package/dist/builtin/mcp/package.json +1 -1
  7. package/dist/builtin/subagents/package.json +1 -1
  8. package/dist/builtin/web-access/package.json +1 -1
  9. package/dist/builtin/workflows/CHANGELOG.md +22 -0
  10. package/dist/builtin/workflows/builtin/{chunk-d3xhj946.js → chunk-cpw5gtzg.js} +1 -1
  11. package/dist/builtin/workflows/builtin/{chunk-kgn5wz1c.js → chunk-e1254zvd.js} +139 -15
  12. package/dist/builtin/workflows/builtin/{chunk-hj8mh07f.js → chunk-qy6g0baf.js} +1 -1
  13. package/dist/builtin/workflows/builtin/goal.js +2 -2
  14. package/dist/builtin/workflows/builtin/index.js +3 -3
  15. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  16. package/dist/builtin/workflows/package.json +1 -1
  17. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +1 -0
  18. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_sonnet_5_5.md +131 -0
  19. package/dist/builtin/workflows/src/extension/index.bundle.mjs +187 -25
  20. package/dist/builtin/workflows/src/index.js +147 -17
  21. package/dist/core/agent-session-events.js +1 -1
  22. package/dist/core/agent-session-events.js.map +1 -1
  23. package/dist/core/agent-session-state.js +5 -2
  24. package/dist/core/agent-session-state.js.map +1 -1
  25. package/dist/core/extensions/api-types.d.ts +12 -0
  26. package/dist/core/extensions/api-types.d.ts.map +1 -1
  27. package/dist/core/extensions/api-types.js.map +1 -1
  28. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  29. package/dist/core/extensions/loader-api.js +42 -0
  30. package/dist/core/extensions/loader-api.js.map +1 -1
  31. package/dist/core/extensions/loader-bindings.d.ts.map +1 -1
  32. package/dist/core/extensions/loader-bindings.js +13 -7
  33. package/dist/core/extensions/loader-bindings.js.map +1 -1
  34. package/dist/core/extensions/loader-resources.d.ts +3 -0
  35. package/dist/core/extensions/loader-resources.d.ts.map +1 -1
  36. package/dist/core/extensions/loader-resources.js.map +1 -1
  37. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  38. package/dist/core/extensions/loader-runtime.js +2 -0
  39. package/dist/core/extensions/loader-runtime.js.map +1 -1
  40. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  41. package/dist/core/extensions/loader-virtual-modules.js +2 -0
  42. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  43. package/dist/core/extensions/mcp-server-registry.d.ts +22 -0
  44. package/dist/core/extensions/mcp-server-registry.d.ts.map +1 -0
  45. package/dist/core/extensions/mcp-server-registry.js +51 -0
  46. package/dist/core/extensions/mcp-server-registry.js.map +1 -0
  47. package/dist/core/extensions/runtime-types.d.ts +3 -0
  48. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  49. package/dist/core/extensions/runtime-types.js.map +1 -1
  50. package/dist/core/keybindings.d.ts +1 -1
  51. package/dist/core/keybindings.d.ts.map +1 -1
  52. package/dist/core/keybindings.js +1 -1
  53. package/dist/core/keybindings.js.map +1 -1
  54. package/dist/core/mcp-servers.d.ts +39 -0
  55. package/dist/core/mcp-servers.d.ts.map +1 -0
  56. package/dist/core/mcp-servers.js +2 -0
  57. package/dist/core/mcp-servers.js.map +1 -0
  58. package/dist/core/model-resolver-defaults.js +2 -2
  59. package/dist/core/model-resolver-defaults.js.map +1 -1
  60. package/dist/core/package-manager-manifest.d.ts +3 -0
  61. package/dist/core/package-manager-manifest.d.ts.map +1 -1
  62. package/dist/core/package-manager-manifest.js +14 -0
  63. package/dist/core/package-manager-manifest.js.map +1 -1
  64. package/dist/core/package-manager-mcp-servers.d.ts +4 -0
  65. package/dist/core/package-manager-mcp-servers.d.ts.map +1 -0
  66. package/dist/core/package-manager-mcp-servers.js +53 -0
  67. package/dist/core/package-manager-mcp-servers.js.map +1 -0
  68. package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
  69. package/dist/core/package-manager-resource-accumulator.js +2 -0
  70. package/dist/core/package-manager-resource-accumulator.js.map +1 -1
  71. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  72. package/dist/core/package-manager-resource-collector.js +2 -0
  73. package/dist/core/package-manager-resource-collector.js.map +1 -1
  74. package/dist/core/package-manager-resource-patterns.d.ts +4 -0
  75. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
  76. package/dist/core/package-manager-resource-patterns.js +36 -12
  77. package/dist/core/package-manager-resource-patterns.js.map +1 -1
  78. package/dist/core/package-manager-types.d.ts +14 -0
  79. package/dist/core/package-manager-types.d.ts.map +1 -1
  80. package/dist/core/package-manager-types.js.map +1 -1
  81. package/dist/core/package-manager.d.ts +1 -1
  82. package/dist/core/package-manager.d.ts.map +1 -1
  83. package/dist/core/package-manager.js.map +1 -1
  84. package/dist/core/resource-loader-core.d.ts +4 -0
  85. package/dist/core/resource-loader-core.d.ts.map +1 -1
  86. package/dist/core/resource-loader-core.js +7 -0
  87. package/dist/core/resource-loader-core.js.map +1 -1
  88. package/dist/core/resource-loader-helpers.d.ts.map +1 -1
  89. package/dist/core/resource-loader-helpers.js +1 -0
  90. package/dist/core/resource-loader-helpers.js.map +1 -1
  91. package/dist/core/resource-loader-internals.d.ts +2 -0
  92. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  93. package/dist/core/resource-loader-internals.js.map +1 -1
  94. package/dist/core/resource-loader-package-resources.d.ts +3 -0
  95. package/dist/core/resource-loader-package-resources.d.ts.map +1 -1
  96. package/dist/core/resource-loader-package-resources.js +25 -2
  97. package/dist/core/resource-loader-package-resources.js.map +1 -1
  98. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  99. package/dist/core/resource-loader-reload.js +4 -1
  100. package/dist/core/resource-loader-reload.js.map +1 -1
  101. package/dist/core/session-manager-core.d.ts +2 -0
  102. package/dist/core/session-manager-core.d.ts.map +1 -1
  103. package/dist/core/session-manager-core.js +6 -1
  104. package/dist/core/session-manager-core.js.map +1 -1
  105. package/dist/core/settings-types.d.ts +1 -0
  106. package/dist/core/settings-types.d.ts.map +1 -1
  107. package/dist/core/settings-types.js.map +1 -1
  108. package/dist/extensions/llama/provider.d.ts +1 -1
  109. package/dist/extensions/llama/provider.d.ts.map +1 -1
  110. package/dist/extensions/llama/provider.js +37 -10
  111. package/dist/extensions/llama/provider.js.map +1 -1
  112. package/dist/index.d.ts +2 -1
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/modes/interactive/chat-input-actions.d.ts +12 -0
  116. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
  117. package/dist/modes/interactive/chat-input-actions.js +44 -18
  118. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  119. package/dist/modes/interactive/components/chat-session-host-editor.d.ts +11 -0
  120. package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/chat-session-host-editor.js +7 -1
  122. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
  123. package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -1
  124. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  125. package/dist/modes/interactive/interactive-input-handling.js +3 -1
  126. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  127. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  128. package/dist/modes/interactive/interactive-mode-helpers.js +1 -6
  129. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  130. package/dist/utils/clipboard-native.d.ts +2 -0
  131. package/dist/utils/clipboard-native.d.ts.map +1 -1
  132. package/dist/utils/clipboard-native.js.map +1 -1
  133. package/dist/utils/clipboard.d.ts +7 -0
  134. package/dist/utils/clipboard.d.ts.map +1 -1
  135. package/dist/utils/clipboard.js +37 -1
  136. package/dist/utils/clipboard.js.map +1 -1
  137. package/docs/extensions/api-reference.md +19 -0
  138. package/docs/extensions.md +4 -0
  139. package/docs/keybindings.md +2 -2
  140. package/docs/llama-cpp.md +13 -0
  141. package/docs/mcp-servers.md +18 -0
  142. package/docs/models/evals.md +16 -4
  143. package/docs/packages/authoring.md +27 -0
  144. package/docs/packages/reference.md +3 -2
  145. package/docs/packages.md +3 -2
  146. package/docs/skills.md +3 -1
  147. package/examples/extensions/gondolin/package-lock.json +3 -3
  148. package/npm-shrinkwrap.json +46 -46
  149. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"chat-session-host-editor.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-session-host-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EditorComponent, EditorTheme, Focusable, TUI } from \"@earendil-works/pi-tui\";\nimport { openExternalEditorForText, pasteClipboardImageToEditor } from \"../chat-input-actions.ts\";\nimport {\n\tisChatSessionBashRunning,\n\tisChatSessionStreaming,\n\tnotifyChatSessionStatus,\n\tnotifyChatSessionWarning,\n} from \"./chat-session-host-runtime.ts\";\nimport type { ChatSessionHostState } from \"./chat-session-host-state.ts\";\nimport type { ChatSessionHostOpts, ChatSessionSubmitMode } from \"./chat-session-host-types.ts\";\nimport { matchesKey } from \"./chat-session-host-utils.ts\";\nimport type { ChatTranscriptEntryLike } from \"./chat-transcript.js\";\nimport { CustomEditor } from \"./custom-editor.ts\";\n\nexport interface ChatSessionEditorCallbacks {\n\tsubmit: (mode: ChatSessionSubmitMode, submittedText?: string) => void | Promise<void>;\n\trestoreQueuedMessagesToEditor: () => boolean;\n\tabortCompaction: () => void | Promise<void>;\n\tinterrupt: (options?: { restoreQueuedMessages?: boolean }) => void | Promise<void>;\n\tabortBash: () => void | Promise<void>;\n}\n\nexport function createChatSessionEditor<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n\ttui: TUI | undefined,\n\tkeybindings: unknown,\n\teditorTheme: EditorTheme,\n\teditorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n\tcallbacks: ChatSessionEditorCallbacks,\n): EditorComponent | undefined {\n\tif (!tui || !keybindings) return undefined;\n\tconst editor =\n\t\tcreateInheritedEditor(tui, editorTheme, keybindings, editorFactory) ??\n\t\tnew CustomEditor(tui, editorTheme, keybindings as ConstructorParameters<typeof CustomEditor>[2], {\n\t\t\tpaddingX: 0,\n\t\t\tautocompleteMaxVisible: 5,\n\t\t});\n\teditor.onChange = (text) => {\n\t\tstate.inputBuffer = text;\n\t\tstate.isBashMode = text.trimStart().startsWith(\"!\");\n\t};\n\teditor.onSubmit = (text) => {\n\t\tvoid callbacks.submit(\"auto\", text);\n\t};\n\tconst actionEditor = editor as EditorComponent & {\n\t\tonAction?: (action: string, handler: () => void) => void;\n\t\tonEscape?: () => void;\n\t\tonPasteImage?: () => void;\n\t};\n\tactionEditor.onAction?.(\"app.message.followUp\", () => {\n\t\tvoid callbacks.submit(\"followUp\");\n\t});\n\tactionEditor.onAction?.(\"app.message.dequeue\", () => {\n\t\tcallbacks.restoreQueuedMessagesToEditor();\n\t});\n\tactionEditor.onAction?.(\"app.editor.external\", () => {\n\t\tvoid openChatSessionExternalEditor(state);\n\t});\n\tif (state.actions) {\n\t\tfor (const [action, handler] of Object.entries(state.actions)) {\n\t\t\tactionEditor.onAction?.(action, () => {\n\t\t\t\tvoid handler();\n\t\t\t});\n\t\t}\n\t}\n\tconst previousPasteImage = actionEditor.onPasteImage;\n\tactionEditor.onPasteImage = () => {\n\t\tpreviousPasteImage?.();\n\t\tvoid pasteClipboardImageToEditor(chatSessionEditorAccess(state), () => state.requestRender?.(), {\n\t\t\tshowWarning: (message) => notifyChatSessionWarning(state, message),\n\t\t});\n\t};\n\tconst previousEscape = actionEditor.onEscape;\n\tactionEditor.onEscape = () => {\n\t\tif (state.compacting) {\n\t\t\tvoid callbacks.abortCompaction();\n\t\t\treturn;\n\t\t}\n\t\tif (isChatSessionStreaming(state)) {\n\t\t\tvoid callbacks.interrupt({ restoreQueuedMessages: true });\n\t\t\treturn;\n\t\t}\n\t\tif (isChatSessionBashRunning(state)) {\n\t\t\tvoid callbacks.abortBash();\n\t\t\treturn;\n\t\t}\n\t\tif (state.isBashMode) {\n\t\t\tsetChatSessionEditorText(state, \"\");\n\t\t\tnotifyChatSessionStatus(state, \"Bash mode cleared\");\n\t\t\treturn;\n\t\t}\n\t\tpreviousEscape?.();\n\t};\n\treturn editor;\n}\n\nexport function handleChatSessionInput<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n\tdata: string,\n\tcallbacks: ChatSessionEditorCallbacks,\n): boolean {\n\tif (state.bodyViewport.handleInput(data)) return true;\n\tif (matchesKey(data, \"alt+up\")) {\n\t\tcallbacks.restoreQueuedMessagesToEditor();\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"ctrl+f\")) {\n\t\tvoid callbacks.submit(\"followUp\");\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"escape\")) {\n\t\tif (state.compacting) {\n\t\t\tvoid callbacks.abortCompaction();\n\t\t\treturn true;\n\t\t}\n\t\tif (isChatSessionStreaming(state)) {\n\t\t\tvoid callbacks.interrupt({ restoreQueuedMessages: true });\n\t\t\treturn true;\n\t\t}\n\t\tif (isChatSessionBashRunning(state)) {\n\t\t\tvoid callbacks.abortBash();\n\t\t\treturn true;\n\t\t}\n\t\tif (state.isBashMode) {\n\t\t\tsetChatSessionEditorText(state, \"\");\n\t\t\tnotifyChatSessionStatus(state, \"Bash mode cleared\");\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (state.editor) {\n\t\tstate.editor.handleInput(data);\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"enter\")) {\n\t\tvoid callbacks.submit(\"auto\");\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"backspace\")) {\n\t\tsetChatSessionEditorText(state, state.inputBuffer.slice(0, -1));\n\t\treturn true;\n\t}\n\tif (data.length === 1 && data >= \" \" && data <= \"~\") {\n\t\tsetChatSessionEditorText(state, `${state.inputBuffer}${data}`);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport function setChatSessionEditorText<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n\ttext: string,\n): void {\n\tstate.inputBuffer = text;\n\tstate.isBashMode = text.trimStart().startsWith(\"!\");\n\tstate.editor?.setText(text);\n}\n\nexport function setEditorPlaceholder(editor: EditorComponent, placeholder: string | undefined): void {\n\tconst candidate = editor as EditorComponent & {\n\t\tsetPlaceholder?: (value: string | undefined) => void;\n\t};\n\tcandidate.setPlaceholder?.(placeholder);\n}\n\nexport function setEditorBorderColor(editor: EditorComponent, borderColor: (text: string) => string): void {\n\tconst candidate = editor as EditorComponent & {\n\t\tborderColor?: (text: string) => string;\n\t};\n\tif (candidate.borderColor !== undefined) candidate.borderColor = borderColor;\n}\n\nexport function setEditorFocused(editor: EditorComponent, focused: boolean): void {\n\tconst candidate = editor as EditorComponent & Partial<Focusable>;\n\tif (\"focused\" in candidate) candidate.focused = focused;\n}\n\nfunction createInheritedEditor<TExtraEntry extends ChatTranscriptEntryLike>(\n\ttui: TUI,\n\teditorTheme: EditorTheme,\n\tkeybindings: unknown,\n\teditorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n): EditorComponent | undefined {\n\tif (!editorFactory) return undefined;\n\ttry {\n\t\treturn editorFactory(tui, editorTheme, keybindings);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction chatSessionEditorAccess<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n): {\n\tinsertTextAtCursor: (text: string) => void;\n\tgetText: () => string;\n\tsetText: (text: string) => void;\n} {\n\treturn {\n\t\tinsertTextAtCursor: (text: string) => {\n\t\t\tif (state.editor?.insertTextAtCursor) {\n\t\t\t\tstate.editor.insertTextAtCursor(text);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetChatSessionEditorText(state, `${state.inputBuffer}${text}`);\n\t\t},\n\t\tgetText: () => state.inputBuffer,\n\t\tsetText: (text: string) => setChatSessionEditorText(state, text),\n\t};\n}\n\nasync function openChatSessionExternalEditor<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n): Promise<void> {\n\tif (!state.editor) return;\n\tconst host = state.tui;\n\tif (!host) return;\n\tconst currentText = state.editor.getExpandedText?.() ?? state.editor.getText();\n\tconst updated = await openExternalEditorForText(currentText, host, {\n\t\tshowWarning: (message) => notifyChatSessionWarning(state, message),\n\t});\n\tif (updated !== undefined) setChatSessionEditorText(state, updated);\n}\n"]}
1
+ {"version":3,"file":"chat-session-host-editor.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-session-host-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EditorComponent, EditorTheme, Focusable, TUI } from \"@earendil-works/pi-tui\";\nimport { openExternalEditorForText, pasteClipboardImageToEditor } from \"../chat-input-actions.ts\";\nimport {\n\tisChatSessionBashRunning,\n\tisChatSessionStreaming,\n\tnotifyChatSessionStatus,\n\tnotifyChatSessionWarning,\n} from \"./chat-session-host-runtime.ts\";\nimport type { ChatSessionHostState } from \"./chat-session-host-state.ts\";\nimport type { ChatSessionHostOpts, ChatSessionSubmitMode } from \"./chat-session-host-types.ts\";\nimport { matchesKey } from \"./chat-session-host-utils.ts\";\nimport type { ChatTranscriptEntryLike } from \"./chat-transcript.js\";\nimport { CustomEditor } from \"./custom-editor.ts\";\n\nexport interface ChatSessionEditorCallbacks {\n\tsubmit: (mode: ChatSessionSubmitMode, submittedText?: string) => void | Promise<void>;\n\trestoreQueuedMessagesToEditor: () => boolean;\n\tabortCompaction: () => void | Promise<void>;\n\tinterrupt: (options?: { restoreQueuedMessages?: boolean }) => void | Promise<void>;\n\tabortBash: () => void | Promise<void>;\n}\n\nexport function createChatSessionEditor<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n\ttui: TUI | undefined,\n\tkeybindings: unknown,\n\teditorTheme: EditorTheme,\n\teditorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n\tcallbacks: ChatSessionEditorCallbacks,\n): EditorComponent | undefined {\n\tif (!tui || !keybindings) return undefined;\n\tconst editor =\n\t\tcreateInheritedEditor(tui, editorTheme, keybindings, editorFactory) ??\n\t\tnew CustomEditor(tui, editorTheme, keybindings as ConstructorParameters<typeof CustomEditor>[2], {\n\t\t\tpaddingX: 0,\n\t\t\tautocompleteMaxVisible: 5,\n\t\t});\n\teditor.onChange = (text) => {\n\t\tstate.inputBuffer = text;\n\t\tstate.isBashMode = text.trimStart().startsWith(\"!\");\n\t};\n\teditor.onSubmit = (text) => {\n\t\tvoid callbacks.submit(\"auto\", text);\n\t};\n\tconst actionEditor = editor as EditorComponent & {\n\t\tonAction?: (action: string, handler: () => void) => void;\n\t\tonEscape?: () => void;\n\t\tonPasteImage?: () => void;\n\t};\n\tactionEditor.onAction?.(\"app.message.followUp\", () => {\n\t\tvoid callbacks.submit(\"followUp\");\n\t});\n\tactionEditor.onAction?.(\"app.message.dequeue\", () => {\n\t\tcallbacks.restoreQueuedMessagesToEditor();\n\t});\n\tactionEditor.onAction?.(\"app.editor.external\", () => {\n\t\tvoid openChatSessionExternalEditor(state);\n\t});\n\tif (state.actions) {\n\t\tfor (const [action, handler] of Object.entries(state.actions)) {\n\t\t\tactionEditor.onAction?.(action, () => {\n\t\t\t\tvoid handler();\n\t\t\t});\n\t\t}\n\t}\n\tconst previousPasteImage = actionEditor.onPasteImage;\n\tactionEditor.onPasteImage = () => {\n\t\tpreviousPasteImage?.();\n\t\tvoid pasteClipboardImageToEditor(chatSessionEditorAccess(state), () => state.requestRender?.(), {\n\t\t\tshowWarning: (message) => notifyChatSessionWarning(state, message),\n\t\t\tisBashMode: state.isBashMode,\n\t\t});\n\t};\n\tconst previousEscape = actionEditor.onEscape;\n\tactionEditor.onEscape = () => {\n\t\tif (state.compacting) {\n\t\t\tvoid callbacks.abortCompaction();\n\t\t\treturn;\n\t\t}\n\t\tif (isChatSessionStreaming(state)) {\n\t\t\tvoid callbacks.interrupt({ restoreQueuedMessages: true });\n\t\t\treturn;\n\t\t}\n\t\tif (isChatSessionBashRunning(state)) {\n\t\t\tvoid callbacks.abortBash();\n\t\t\treturn;\n\t\t}\n\t\tif (state.isBashMode) {\n\t\t\tsetChatSessionEditorText(state, \"\");\n\t\t\tnotifyChatSessionStatus(state, \"Bash mode cleared\");\n\t\t\treturn;\n\t\t}\n\t\tpreviousEscape?.();\n\t};\n\treturn editor;\n}\n\nexport function handleChatSessionInput<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n\tdata: string,\n\tcallbacks: ChatSessionEditorCallbacks,\n): boolean {\n\tif (state.bodyViewport.handleInput(data)) return true;\n\tif (matchesKey(data, \"alt+up\")) {\n\t\tcallbacks.restoreQueuedMessagesToEditor();\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"ctrl+f\")) {\n\t\tvoid callbacks.submit(\"followUp\");\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"escape\")) {\n\t\tif (state.compacting) {\n\t\t\tvoid callbacks.abortCompaction();\n\t\t\treturn true;\n\t\t}\n\t\tif (isChatSessionStreaming(state)) {\n\t\t\tvoid callbacks.interrupt({ restoreQueuedMessages: true });\n\t\t\treturn true;\n\t\t}\n\t\tif (isChatSessionBashRunning(state)) {\n\t\t\tvoid callbacks.abortBash();\n\t\t\treturn true;\n\t\t}\n\t\tif (state.isBashMode) {\n\t\t\tsetChatSessionEditorText(state, \"\");\n\t\t\tnotifyChatSessionStatus(state, \"Bash mode cleared\");\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (state.editor) {\n\t\tstate.editor.handleInput(data);\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"enter\")) {\n\t\tvoid callbacks.submit(\"auto\");\n\t\treturn true;\n\t}\n\tif (matchesKey(data, \"backspace\")) {\n\t\tsetChatSessionEditorText(state, state.inputBuffer.slice(0, -1));\n\t\treturn true;\n\t}\n\tif (data.length === 1 && data >= \" \" && data <= \"~\") {\n\t\tsetChatSessionEditorText(state, `${state.inputBuffer}${data}`);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport function setChatSessionEditorText<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n\ttext: string,\n): void {\n\tstate.inputBuffer = text;\n\tstate.isBashMode = text.trimStart().startsWith(\"!\");\n\tstate.editor?.setText(text);\n}\n\nexport function setEditorPlaceholder(editor: EditorComponent, placeholder: string | undefined): void {\n\tconst candidate = editor as EditorComponent & {\n\t\tsetPlaceholder?: (value: string | undefined) => void;\n\t};\n\tcandidate.setPlaceholder?.(placeholder);\n}\n\nexport function setEditorBorderColor(editor: EditorComponent, borderColor: (text: string) => string): void {\n\tconst candidate = editor as EditorComponent & {\n\t\tborderColor?: (text: string) => string;\n\t};\n\tif (candidate.borderColor !== undefined) candidate.borderColor = borderColor;\n}\n\nexport function setEditorFocused(editor: EditorComponent, focused: boolean): void {\n\tconst candidate = editor as EditorComponent & Partial<Focusable>;\n\tif (\"focused\" in candidate) candidate.focused = focused;\n}\n\nfunction createInheritedEditor<TExtraEntry extends ChatTranscriptEntryLike>(\n\ttui: TUI,\n\teditorTheme: EditorTheme,\n\tkeybindings: unknown,\n\teditorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n): EditorComponent | undefined {\n\tif (!editorFactory) return undefined;\n\ttry {\n\t\treturn editorFactory(tui, editorTheme, keybindings);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\ntype EditorCursor = { line: number; col: number };\ntype CursorAwareEditor = EditorComponent & { getCursor(): EditorCursor };\n\nfunction hasCursor(editor: EditorComponent | undefined): editor is CursorAwareEditor {\n\treturn typeof (editor as Partial<CursorAwareEditor> | undefined)?.getCursor === \"function\";\n}\n\nexport function chatSessionEditorAccess<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n): {\n\tinsertTextAtCursor: (text: string) => void;\n\tgetText: () => string;\n\tsetText: (text: string) => void;\n\tgetCursor?: () => EditorCursor;\n} {\n\tconst editor = state.editor;\n\treturn {\n\t\tinsertTextAtCursor: (text: string) => {\n\t\t\tif (state.editor?.insertTextAtCursor) {\n\t\t\t\tstate.editor.insertTextAtCursor(text);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetChatSessionEditorText(state, `${state.inputBuffer}${text}`);\n\t\t},\n\t\tgetText: () => state.inputBuffer,\n\t\tsetText: (text: string) => setChatSessionEditorText(state, text),\n\t\t...(hasCursor(editor) ? { getCursor: () => editor.getCursor() } : {}),\n\t};\n}\n\nasync function openChatSessionExternalEditor<TExtraEntry extends ChatTranscriptEntryLike>(\n\tstate: ChatSessionHostState<TExtraEntry>,\n): Promise<void> {\n\tif (!state.editor) return;\n\tconst host = state.tui;\n\tif (!host) return;\n\tconst currentText = state.editor.getExpandedText?.() ?? state.editor.getText();\n\tconst updated = await openExternalEditorForText(currentText, host, {\n\t\tshowWarning: (message) => notifyChatSessionWarning(state, message),\n\t});\n\tif (updated !== undefined) setChatSessionEditorText(state, updated);\n}\n"]}
@@ -87,7 +87,7 @@ InteractiveModeBase.prototype.handleHotkeysCommand = function () {
87
87
  | \`${externalEditor}\` | Edit message in external editor |
88
88
  | \`${followUp}\` | Queue follow-up message |
89
89
  | \`${dequeue}\` | Restore queued messages |
90
- | \`${pasteImage}\` | Paste image from clipboard |
90
+ | \`${pasteImage}\` | Paste files on macOS, images, or text from clipboard |
91
91
  | \`/\` | Slash commands |
92
92
  | \`!\` | Run bash command |
93
93
  | \`!!\` | Run bash command (excluded from context) |
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-hotkeys-debug.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-hotkeys-debug.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype AppKeybinding,\n\tArminComponent,\n\tDaxnutsComponent,\n\tDynamicBorder,\n\tEarendilAnnouncementComponent,\n\tformatKeyText,\n\tfs,\n\tgetDebugLogPath,\n\ttype Keybinding,\n\tkeyDisplayText,\n\tMarkdown,\n\tpath,\n\tSpacer,\n\tText,\n\ttheme,\n\tvisibleWidth,\n} from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAppKeyDisplay = function (this: InteractiveModeBase, action: AppKeybinding): string {\n\treturn keyDisplayText(action);\n};\n\nInteractiveModeBase.prototype.getEditorKeyDisplay = function (this: InteractiveModeBase, action: Keybinding): string {\n\treturn keyDisplayText(action);\n};\n\nInteractiveModeBase.prototype.handleHotkeysCommand = function (this: InteractiveModeBase): void {\n\t// Navigation keybindings\n\tconst cursorUp = this.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n\tconst cursorDown = this.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n\tconst cursorLeft = this.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n\tconst cursorRight = this.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n\tconst cursorWordLeft = this.getEditorKeyDisplay(\"tui.editor.cursorWordLeft\");\n\tconst cursorWordRight = this.getEditorKeyDisplay(\"tui.editor.cursorWordRight\");\n\tconst cursorLineStart = this.getEditorKeyDisplay(\"tui.editor.cursorLineStart\");\n\tconst cursorLineEnd = this.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n\tconst jumpForward = this.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n\tconst jumpBackward = this.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n\tconst pageUp = this.getEditorKeyDisplay(\"tui.editor.pageUp\");\n\tconst pageDown = this.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n\t// Editing keybindings\n\tconst submit = this.getEditorKeyDisplay(\"tui.input.submit\");\n\tconst newLine = this.getEditorKeyDisplay(\"tui.input.newLine\");\n\tconst deleteWordBackward = this.getEditorKeyDisplay(\"tui.editor.deleteWordBackward\");\n\tconst deleteWordForward = this.getEditorKeyDisplay(\"tui.editor.deleteWordForward\");\n\tconst deleteToLineStart = this.getEditorKeyDisplay(\"tui.editor.deleteToLineStart\");\n\tconst deleteToLineEnd = this.getEditorKeyDisplay(\"tui.editor.deleteToLineEnd\");\n\tconst yank = this.getEditorKeyDisplay(\"tui.editor.yank\");\n\tconst yankPop = this.getEditorKeyDisplay(\"tui.editor.yankPop\");\n\tconst undo = this.getEditorKeyDisplay(\"tui.editor.undo\");\n\tconst tab = this.getEditorKeyDisplay(\"tui.input.tab\");\n\n\t// App keybindings\n\tconst interrupt = this.getAppKeyDisplay(\"app.interrupt\");\n\tconst clear = this.getAppKeyDisplay(\"app.clear\");\n\tconst exit = this.getAppKeyDisplay(\"app.exit\");\n\tconst suspend = this.getAppKeyDisplay(\"app.suspend\");\n\tconst cycleThinkingLevel = this.getAppKeyDisplay(\"app.thinking.cycle\");\n\tconst cycleModelForward = this.getAppKeyDisplay(\"app.model.cycleForward\");\n\tconst selectModel = this.getAppKeyDisplay(\"app.model.select\");\n\tconst expandTools = this.getAppKeyDisplay(\"app.tools.expand\");\n\tconst toggleThinking = this.getAppKeyDisplay(\"app.thinking.toggle\");\n\tconst externalEditor = this.getAppKeyDisplay(\"app.editor.external\");\n\tconst cycleModelBackward = this.getAppKeyDisplay(\"app.model.cycleBackward\");\n\tconst followUp = this.getAppKeyDisplay(\"app.message.followUp\");\n\tconst dequeue = this.getAppKeyDisplay(\"app.message.dequeue\");\n\tconst pasteImage = this.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n\tlet hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (ctrl+enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n\t// Add extension-registered shortcuts\n\tconst extensionRunner = this.session.extensionRunner;\n\tconst shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());\n\tif (shortcuts.size > 0) {\n\t\thotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n\t\tfor (const [key, shortcut] of shortcuts) {\n\t\t\tconst description = shortcut.description ?? shortcut.extensionPath;\n\t\t\tconst keyDisplay = formatKeyText(key, { capitalize: true });\n\t\t\thotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n\t\t}\n\t}\n\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new DynamicBorder());\n\tthis.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0));\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()));\n\tthis.chatContainer.addChild(new DynamicBorder());\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleClearCommand = async function (this: InteractiveModeBase): Promise<void> {\n\tawait this.ensureDeferredStartupComplete();\n\tInteractiveModeBase.prototype.clearWorkingLoader.call(this);\n\ttry {\n\t\tconst result = await this.runtimeHost.newSession();\n\t\tif (result.cancelled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.renderCurrentSessionState();\n\t\tif (this.firstRunNoticeVisible) {\n\t\t\tthis.clearFirstRunOnboardingUi();\n\t\t}\n\t\tthis.chatContainer.addChild(new Spacer(1));\n\t\tthis.chatContainer.addChild(new Text(`${theme.fg(\"accent\", \"✓ New session started\")}`, 1, 1));\n\t\tthis.ui.requestRender();\n\t} catch (error: unknown) {\n\t\tawait this.handleFatalRuntimeError(\"Failed to create session\", error);\n\t}\n};\n\nInteractiveModeBase.prototype.handleDebugCommand = function (this: InteractiveModeBase): void {\n\tconst width = this.ui.terminal.columns;\n\tconst height = this.ui.terminal.rows;\n\tconst allLines = this.ui.render(width);\n\n\tconst debugLogPath = getDebugLogPath();\n\tconst debugData = [\n\t\t`Debug output at ${new Date().toISOString()}`,\n\t\t`Terminal: ${width}x${height}`,\n\t\t`Total lines: ${allLines.length}`,\n\t\t\"\",\n\t\t\"=== All rendered lines with visible widths ===\",\n\t\t...allLines.map((line, idx) => {\n\t\t\tconst vw = visibleWidth(line);\n\t\t\tconst escaped = JSON.stringify(line);\n\t\t\treturn `[${idx}] (w=${vw}) ${escaped}`;\n\t\t}),\n\t\t\"\",\n\t\t\"=== Agent messages (JSONL) ===\",\n\t\t...this.session.messages.map((msg) => JSON.stringify(msg)),\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tfs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n\tfs.writeFileSync(debugLogPath, debugData);\n\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(\n\t\tnew Text(`${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`, 1, 1),\n\t);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleArminSaysHi = function (this: InteractiveModeBase): void {\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new ArminComponent(this.ui));\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleDementedDelves = function (this: InteractiveModeBase): void {\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new EarendilAnnouncementComponent());\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleDaxnuts = function (this: InteractiveModeBase): void {\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new DaxnutsComponent(this.ui));\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.checkDaxnutsEasterEgg = function (\n\tthis: InteractiveModeBase,\n\tmodel: { provider: string; id: string },\n): void {\n\tif (model.provider === \"opencode\" && model.id.toLowerCase().includes(\"kimi-k2.5\")) {\n\t\tthis.handleDaxnuts();\n\t}\n};\n"]}
1
+ {"version":3,"file":"interactive-hotkeys-debug.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-hotkeys-debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAEN,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,6BAA6B,EAC7B,aAAa,EACb,EAAE,EACF,eAAe,EAEf,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,GACZ,MAAM,4BAA4B,CAAC;AAEpC,mBAAmB,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAqC,MAAqB;IAC1G,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAqC,MAAkB;IAC1G,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,oBAAoB,GAAG;IACpD,yBAAyB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC/E,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IAEjE,sBAAsB;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IAC9D,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,+BAA+B,CAAC,CAAC;IACrF,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;IACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;IACnF,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAEtD,kBAAkB;IAClB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IACpE,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;IAErE,IAAI,OAAO,GAAG;;;;MAIT,QAAQ,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW;MACrE,cAAc,UAAU,eAAe;MACvC,eAAe;MACf,aAAa;MACb,WAAW;MACX,YAAY;MACZ,MAAM,UAAU,QAAQ;;;;;MAKxB,MAAM;MACN,OAAO,gBAAgB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EAAE;MAC9F,kBAAkB;MAClB,iBAAiB;MACjB,iBAAiB;MACjB,eAAe;MACf,IAAI;MACJ,OAAO;MACP,IAAI;;;;;MAKJ,GAAG;MACH,SAAS;MACT,KAAK;MACL,IAAI;MACJ,OAAO;MACP,kBAAkB;MAClB,iBAAiB,UAAU,kBAAkB;MAC7C,WAAW;MACX,WAAW;MACX,cAAc;MACd,cAAc;MACd,QAAQ;MACR,OAAO;MACP,UAAU;;;;CAIf,CAAC;IAED,qCAAqC;IACrC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACrD,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACtF,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI;;;;CAIZ,CAAC;QACA,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,aAAa,CAAC;YACnE,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,OAAO,IAAI,OAAO,UAAU,QAAQ,WAAW,MAAM,CAAC;QACvD,CAAC;IACF,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG,KAAK;IACvD,MAAM,IAAI,CAAC,6BAA6B,EAAE,CAAC;IAC3C,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,uBAAuB,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;AACF,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,GAAG;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG;QACjB,mBAAmB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QAC7C,aAAa,KAAK,IAAI,MAAM,EAAE;QAC9B,gBAAgB,QAAQ,CAAC,MAAM,EAAE;QACjC,EAAE;QACF,gDAAgD;QAChD,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,IAAI,GAAG,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QACxC,CAAC,CAAC;QACF,EAAE;QACF,gCAAgC;QAChC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1D,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAClG,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,GAAG;IACjD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,oBAAoB,GAAG;IACpD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,aAAa,GAAG;IAC7C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,mBAAmB,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAErD,KAAuC;IAEvC,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;AACF,CAAC,CAAC","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype AppKeybinding,\n\tArminComponent,\n\tDaxnutsComponent,\n\tDynamicBorder,\n\tEarendilAnnouncementComponent,\n\tformatKeyText,\n\tfs,\n\tgetDebugLogPath,\n\ttype Keybinding,\n\tkeyDisplayText,\n\tMarkdown,\n\tpath,\n\tSpacer,\n\tText,\n\ttheme,\n\tvisibleWidth,\n} from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.getAppKeyDisplay = function (this: InteractiveModeBase, action: AppKeybinding): string {\n\treturn keyDisplayText(action);\n};\n\nInteractiveModeBase.prototype.getEditorKeyDisplay = function (this: InteractiveModeBase, action: Keybinding): string {\n\treturn keyDisplayText(action);\n};\n\nInteractiveModeBase.prototype.handleHotkeysCommand = function (this: InteractiveModeBase): void {\n\t// Navigation keybindings\n\tconst cursorUp = this.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n\tconst cursorDown = this.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n\tconst cursorLeft = this.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n\tconst cursorRight = this.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n\tconst cursorWordLeft = this.getEditorKeyDisplay(\"tui.editor.cursorWordLeft\");\n\tconst cursorWordRight = this.getEditorKeyDisplay(\"tui.editor.cursorWordRight\");\n\tconst cursorLineStart = this.getEditorKeyDisplay(\"tui.editor.cursorLineStart\");\n\tconst cursorLineEnd = this.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n\tconst jumpForward = this.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n\tconst jumpBackward = this.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n\tconst pageUp = this.getEditorKeyDisplay(\"tui.editor.pageUp\");\n\tconst pageDown = this.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n\t// Editing keybindings\n\tconst submit = this.getEditorKeyDisplay(\"tui.input.submit\");\n\tconst newLine = this.getEditorKeyDisplay(\"tui.input.newLine\");\n\tconst deleteWordBackward = this.getEditorKeyDisplay(\"tui.editor.deleteWordBackward\");\n\tconst deleteWordForward = this.getEditorKeyDisplay(\"tui.editor.deleteWordForward\");\n\tconst deleteToLineStart = this.getEditorKeyDisplay(\"tui.editor.deleteToLineStart\");\n\tconst deleteToLineEnd = this.getEditorKeyDisplay(\"tui.editor.deleteToLineEnd\");\n\tconst yank = this.getEditorKeyDisplay(\"tui.editor.yank\");\n\tconst yankPop = this.getEditorKeyDisplay(\"tui.editor.yankPop\");\n\tconst undo = this.getEditorKeyDisplay(\"tui.editor.undo\");\n\tconst tab = this.getEditorKeyDisplay(\"tui.input.tab\");\n\n\t// App keybindings\n\tconst interrupt = this.getAppKeyDisplay(\"app.interrupt\");\n\tconst clear = this.getAppKeyDisplay(\"app.clear\");\n\tconst exit = this.getAppKeyDisplay(\"app.exit\");\n\tconst suspend = this.getAppKeyDisplay(\"app.suspend\");\n\tconst cycleThinkingLevel = this.getAppKeyDisplay(\"app.thinking.cycle\");\n\tconst cycleModelForward = this.getAppKeyDisplay(\"app.model.cycleForward\");\n\tconst selectModel = this.getAppKeyDisplay(\"app.model.select\");\n\tconst expandTools = this.getAppKeyDisplay(\"app.tools.expand\");\n\tconst toggleThinking = this.getAppKeyDisplay(\"app.thinking.toggle\");\n\tconst externalEditor = this.getAppKeyDisplay(\"app.editor.external\");\n\tconst cycleModelBackward = this.getAppKeyDisplay(\"app.model.cycleBackward\");\n\tconst followUp = this.getAppKeyDisplay(\"app.message.followUp\");\n\tconst dequeue = this.getAppKeyDisplay(\"app.message.dequeue\");\n\tconst pasteImage = this.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n\tlet hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (ctrl+enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste files on macOS, images, or text from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n\t// Add extension-registered shortcuts\n\tconst extensionRunner = this.session.extensionRunner;\n\tconst shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());\n\tif (shortcuts.size > 0) {\n\t\thotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n\t\tfor (const [key, shortcut] of shortcuts) {\n\t\t\tconst description = shortcut.description ?? shortcut.extensionPath;\n\t\t\tconst keyDisplay = formatKeyText(key, { capitalize: true });\n\t\t\thotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n\t\t}\n\t}\n\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new DynamicBorder());\n\tthis.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0));\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()));\n\tthis.chatContainer.addChild(new DynamicBorder());\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleClearCommand = async function (this: InteractiveModeBase): Promise<void> {\n\tawait this.ensureDeferredStartupComplete();\n\tInteractiveModeBase.prototype.clearWorkingLoader.call(this);\n\ttry {\n\t\tconst result = await this.runtimeHost.newSession();\n\t\tif (result.cancelled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.renderCurrentSessionState();\n\t\tif (this.firstRunNoticeVisible) {\n\t\t\tthis.clearFirstRunOnboardingUi();\n\t\t}\n\t\tthis.chatContainer.addChild(new Spacer(1));\n\t\tthis.chatContainer.addChild(new Text(`${theme.fg(\"accent\", \"✓ New session started\")}`, 1, 1));\n\t\tthis.ui.requestRender();\n\t} catch (error: unknown) {\n\t\tawait this.handleFatalRuntimeError(\"Failed to create session\", error);\n\t}\n};\n\nInteractiveModeBase.prototype.handleDebugCommand = function (this: InteractiveModeBase): void {\n\tconst width = this.ui.terminal.columns;\n\tconst height = this.ui.terminal.rows;\n\tconst allLines = this.ui.render(width);\n\n\tconst debugLogPath = getDebugLogPath();\n\tconst debugData = [\n\t\t`Debug output at ${new Date().toISOString()}`,\n\t\t`Terminal: ${width}x${height}`,\n\t\t`Total lines: ${allLines.length}`,\n\t\t\"\",\n\t\t\"=== All rendered lines with visible widths ===\",\n\t\t...allLines.map((line, idx) => {\n\t\t\tconst vw = visibleWidth(line);\n\t\t\tconst escaped = JSON.stringify(line);\n\t\t\treturn `[${idx}] (w=${vw}) ${escaped}`;\n\t\t}),\n\t\t\"\",\n\t\t\"=== Agent messages (JSONL) ===\",\n\t\t...this.session.messages.map((msg) => JSON.stringify(msg)),\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tfs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n\tfs.writeFileSync(debugLogPath, debugData);\n\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(\n\t\tnew Text(`${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`, 1, 1),\n\t);\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleArminSaysHi = function (this: InteractiveModeBase): void {\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new ArminComponent(this.ui));\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleDementedDelves = function (this: InteractiveModeBase): void {\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new EarendilAnnouncementComponent());\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.handleDaxnuts = function (this: InteractiveModeBase): void {\n\tthis.chatContainer.addChild(new Spacer(1));\n\tthis.chatContainer.addChild(new DaxnutsComponent(this.ui));\n\tthis.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.checkDaxnutsEasterEgg = function (\n\tthis: InteractiveModeBase,\n\tmodel: { provider: string; id: string },\n): void {\n\tif (model.provider === \"opencode\" && model.id.toLowerCase().includes(\"kimi-k2.5\")) {\n\t\tthis.handleDaxnuts();\n\t}\n};\n"]}
@@ -121,7 +121,8 @@ InteractiveModeBase.prototype.setupKeyHandlers = function () {
121
121
  this.updateEditorBorderColor();
122
122
  }
123
123
  };
124
- // Handle clipboard image paste (triggered on Ctrl+V)
124
+ // Handle clipboard paste (triggered on Ctrl+V). Copied files use their original paths,
125
+ // images are attached via temporary files, and plain text is the final fallback.
125
126
  this.defaultEditor.onPasteImage = () => {
126
127
  this.handleClipboardImagePaste();
127
128
  };
@@ -129,6 +130,7 @@ InteractiveModeBase.prototype.setupKeyHandlers = function () {
129
130
  InteractiveModeBase.prototype.handleClipboardImagePaste = async function () {
130
131
  await pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {
131
132
  showWarning: (message) => this.showWarning(message),
133
+ isBashMode: this.isBashMode,
132
134
  });
133
135
  };
134
136
  InteractiveModeBase.prototype.deliverStartupReplayPrompt = function (text) {
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-input-handling.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-input-handling.ts"],"names":[],"mappings":"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","sourcesContent":["import { markLifecycleTiming } from \"../../core/lifecycle-timings.ts\";\nimport { getOwnerTaskStore } from \"../../core/tasks/owner-store.js\";\nimport { yieldToEventLoop } from \"../../utils/event-loop.ts\";\nimport {\n\tinteractiveEngineNeedsExplicitTermination,\n\tinterruptBlockedInteractiveEngine,\n\tterminateInteractiveEngine,\n} from \"../interactive-engine/extension-ui-bridge.ts\";\nimport { IsolatedInteractiveRuntime } from \"../interactive-engine/isolated-runtime.js\";\nimport {\n\tdismissRemoteProxy,\n\tremoteEngineProxyOwner,\n\tremoteProxyHandlesCtrlC,\n} from \"../interactive-engine/remote-input-ownership.ts\";\nimport { showTaskInspector } from \"../rpc/task-ui-bridge.js\";\nimport { StartupIdentityComponent } from \"./components/startup-identity.ts\";\nimport { COMPACTION_ALREADY_IN_PROGRESS_WARNING } from \"./interactive-bash-compact.ts\";\nimport { routeGlobalClearInput } from \"./interactive-global-clear.ts\";\nimport { isPhysicalCtrlC, isPhysicalEscape, isSafetyKeyRelease } from \"./interactive-key-identity.ts\";\nimport { InteractiveModeBase, seedStartupInput } from \"./interactive-mode-base.ts\";\nimport { pasteClipboardImageToEditor, recordTimeSinceReset } from \"./interactive-mode-deps.ts\";\nimport { pauseAndAbortInteractiveSession } from \"./interactive-pause.ts\";\nimport { restoreFailedSubmissionDraft } from \"./interactive-prompt-restore.ts\";\n\nexport function registerStartupInputListeners(mode: InteractiveModeBase): void {\n\tmode.addTuiInputListener(() =>\n\t\tmode.builtInHeader instanceof StartupIdentityComponent ? void mode.builtInHeader.settle() : undefined,\n\t);\n\tmode.addTuiInputListener((data) =>\n\t\trouteGlobalClearInput(data, {\n\t\t\t// Physical identity first: safety routing must survive an `app.clear` remap.\n\t\t\tmatchesCtrlC: isPhysicalCtrlC,\n\t\t\tmatchesEscape: isPhysicalEscape,\n\t\t\tisSafetyKeyRelease,\n\t\t\tmatchesClear: (candidate) => mode.keybindings.matches(candidate, \"app.clear\"),\n\t\t\thasOverlay: () => mode.ui.hasOverlay(),\n\t\t\tblockingInlineCustomUiActive: () => mode.blockingInlineCustomUiDepth > 0,\n\t\t\teditorOwnsInput: () => mode.editorContainer.children.includes(mode.editor),\n\t\t\tremoteEngineProxyOwner: () =>\n\t\t\t\tremoteEngineProxyOwner(mode.runtimeHost, {\n\t\t\t\t\thasOverlay: () => mode.ui.hasOverlay(),\n\t\t\t\t\tinlineComponents: () => mode.editorContainer.children,\n\t\t\t\t}),\n\t\t\tremoteProxyHandlesCtrlC: (owner) => remoteProxyHandlesCtrlC(mode.runtimeHost, owner),\n\t\t\tonRemoteProxyDismiss: (owner) => {\n\t\t\t\tdismissRemoteProxy(mode.runtimeHost, owner);\n\t\t\t},\n\t\t\tengineNeedsExplicitTermination: () => interactiveEngineNeedsExplicitTermination(mode.runtimeHost),\n\t\t\tonEngineTerminate: () => {\n\t\t\t\tterminateInteractiveEngine(mode.runtimeHost);\n\t\t\t},\n\t\t\tonClear: () => mode.handleCtrlC(),\n\t\t\trequestRender: () => mode.ui.requestRender(),\n\t\t}),\n\t);\n}\n\nInteractiveModeBase.prototype.setupKeyHandlers = function (this: InteractiveModeBase): void {\n\tregisterStartupInputListeners(this);\n\t// Set up handlers on defaultEditor - they use this.editor for text access\n\t// so they work correctly regardless of which editor is active\n\tthis.defaultEditor.onEscape = () => {\n\t\tif (!this.session.isStreaming && interruptBlockedInteractiveEngine(this.runtimeHost)) return;\n\t\tif (this.session.isStreaming || this.session.agent.hasQueuedMessages() || this.session.queuedMessagesPaused) {\n\t\t\tpauseAndAbortInteractiveSession(this, { restoreQueuedMessages: true });\n\t\t} else if (this.session.isBashRunning) {\n\t\t\tthis.session.abortBash();\n\t\t} else if (this.isBashMode) {\n\t\t\tthis.editor.setText(\"\");\n\t\t\tthis.isBashMode = false;\n\t\t\tthis.updateEditorBorderColor();\n\t\t} else if (!this.editor.getText().trim()) {\n\t\t\t// Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n\t\t\tconst action = this.settingsManager.getDoubleEscapeAction();\n\t\t\tif (action !== \"none\") {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - this.lastEscapeTime < 500) {\n\t\t\t\t\tif (action === \"tree\") {\n\t\t\t\t\t\tthis.showTreeSelector();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.showUserMessageSelector();\n\t\t\t\t\t}\n\t\t\t\t\tthis.lastEscapeTime = 0;\n\t\t\t\t} else {\n\t\t\t\t\tthis.lastEscapeTime = now;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Register app action handlers\n\tthis.defaultEditor.onAction(\"app.clear\", () => this.handleCtrlC());\n\tthis.defaultEditor.onCtrlD = () => this.handleCtrlD();\n\tthis.defaultEditor.onAction(\"app.suspend\", () => this.handleCtrlZ());\n\tthis.defaultEditor.onAction(\"app.thinking.cycle\", () => this.cycleThinkingLevel());\n\tthis.defaultEditor.onAction(\"app.model.cycleForward\", () => {\n\t\tvoid (async () => {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\tawait this.cycleModel(\"forward\");\n\t\t})();\n\t});\n\tthis.defaultEditor.onAction(\"app.model.cycleBackward\", () => {\n\t\tvoid (async () => {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\tawait this.cycleModel(\"backward\");\n\t\t})();\n\t});\n\n\t// Global debug handler on TUI (works regardless of focus)\n\tthis.ui.onDebug = () => this.handleDebugCommand();\n\tthis.defaultEditor.onAction(\"app.model.select\", () => {\n\t\tvoid (async () => {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\tthis.showModelSelector();\n\t\t})();\n\t});\n\tthis.defaultEditor.onAction(\"app.tools.expand\", () => this.toggleToolOutputExpansion());\n\tthis.defaultEditor.onAction(\"app.thinking.toggle\", () => this.toggleThinkingBlockVisibility());\n\tthis.defaultEditor.onAction(\"app.editor.external\", () => {\n\t\tvoid this.openExternalEditor();\n\t});\n\tthis.defaultEditor.onAction(\"app.message.followUp\", () => this.handleFollowUp());\n\tthis.defaultEditor.onAction(\"app.message.dequeue\", () => this.handleDequeue());\n\tthis.defaultEditor.onAction(\"app.session.new\", () => this.handleClearCommand());\n\tthis.defaultEditor.onAction(\"app.session.tree\", () => this.showTreeSelector());\n\tthis.defaultEditor.onAction(\"app.session.fork\", () => this.showUserMessageSelector());\n\tthis.defaultEditor.onAction(\"app.session.resume\", () => this.showSessionSelector());\n\n\tthis.defaultEditor.onChange = (text: string) => {\n\t\tconst wasBashMode = this.isBashMode;\n\t\tthis.isBashMode = text.trimStart().startsWith(\"!\");\n\t\tif (wasBashMode !== this.isBashMode) {\n\t\t\tthis.updateEditorBorderColor();\n\t\t}\n\t};\n\n\t// Handle clipboard image paste (triggered on Ctrl+V)\n\tthis.defaultEditor.onPasteImage = () => {\n\t\tthis.handleClipboardImagePaste();\n\t};\n};\n\nInteractiveModeBase.prototype.handleClipboardImagePaste = async function (this: InteractiveModeBase): Promise<void> {\n\tawait pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {\n\t\tshowWarning: (message) => this.showWarning(message),\n\t});\n};\n\nInteractiveModeBase.prototype.deliverStartupReplayPrompt = function (this: InteractiveModeBase, text: string): void {\n\tif (this.onInputCallback) {\n\t\tif (!text.startsWith(\"/\")) {\n\t\t\tthis.renderDeferredUserInput(text);\n\t\t}\n\t\tconst callback = this.onInputCallback;\n\t\tthis.onInputCallback = undefined;\n\t\tcallback({ text, draft: text });\n\t} else {\n\t\tthis.pendingUserInputs.push({ text, draft: text });\n\t}\n};\n\nInteractiveModeBase.prototype.recoverCookedStartupInput = function (this: InteractiveModeBase): boolean {\n\tif (this.startupCookedInputRecovered || this.pendingUserInputs.length > 0) return true;\n\tconst text = this.editor.getText();\n\tconst cookedLines = text\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n\tconst isCommandLike = (line: string | undefined) =>\n\t\tline !== undefined && (line.startsWith(\"/\") || line.startsWith(\"!\"));\n\t// A raw startup capture distinguishes drafts from Enter-terminated submissions.\n\t// Never reinterpret its visible command-like draft (including a bare \"/\") as\n\t// submitted merely because header/chat initialization is now draining input.\n\tconst singleCommandLike =\n\t\tthis.options.startupInputCapture === undefined && cookedLines.length === 1 && isCommandLike(cookedLines[0]);\n\tif (cookedLines.length < 2 && !singleCommandLike) return false;\n\n\tthis.startupCookedInputRecovered = true;\n\tconst activeInput = this.startupReplayActiveInput?.trim();\n\tlet draftText = \"\";\n\tlet submissions = cookedLines;\n\tif (\n\t\tactiveInput === undefined &&\n\t\tcookedLines.length > 1 &&\n\t\t!isCommandLike(cookedLines[cookedLines.length - 1]) &&\n\t\t(!isCommandLike(cookedLines[0]) || cookedLines.length > 2)\n\t) {\n\t\tdraftText = cookedLines[cookedLines.length - 1] ?? \"\";\n\t\tsubmissions = cookedLines.slice(0, -1);\n\t} else if (activeInput && cookedLines.length > 1 && !isCommandLike(cookedLines[cookedLines.length - 1])) {\n\t\tdraftText = cookedLines[cookedLines.length - 1] ?? \"\";\n\t\tsubmissions = cookedLines.slice(0, -1);\n\t}\n\tif (submissions.length === 0) return true;\n\n\tif (activeInput) {\n\t\tconst queuedSubmissions = submissions[0] === activeInput ? submissions.slice(1) : submissions;\n\t\tthis.editor.setText(draftText);\n\t\tthis.startupReplayInputs.push(...queuedSubmissions);\n\t\treturn true;\n\t}\n\n\tthis.editor.setText(\"\");\n\tseedStartupInput(\n\t\tthis.pendingUserInputs,\n\t\tthis.editor,\n\t\t{ text: draftText, submissions },\n\t\tthis.startupReplayInputs,\n\t\t(draft) => {\n\t\t\tthis.startupDraftText = draft;\n\t\t},\n\t\t(active) => {\n\t\t\tthis.startupReplayActiveInput = active;\n\t\t},\n\t);\n\treturn true;\n};\n\nInteractiveModeBase.prototype.drainStartupReplayCommands = async function (this: InteractiveModeBase): Promise<void> {\n\twhile (this.pendingUserInputs.length === 0 && this.startupReplayActiveInput) {\n\t\tconst activeInput = this.startupReplayActiveInput;\n\t\tawait this.defaultEditor.onSubmit?.(activeInput);\n\t\tif (this.editor.getText().trim() === activeInput.trim()) {\n\t\t\tthis.editor.setText(\"\");\n\t\t}\n\t\tif (this.startupReplayActiveInput?.trim() === activeInput.trim()) break;\n\t}\n};\n\nInteractiveModeBase.prototype.advanceStartupInputReplay = function (\n\tthis: InteractiveModeBase,\n\tsubmittedText: string,\n): void {\n\tif (this.startupReplayActiveInput?.trim() !== submittedText.trim()) return;\n\tthis.startupReplayActiveInput = undefined;\n\n\twhile (this.startupReplayInputs.length > 0) {\n\t\tconst nextInput = this.startupReplayInputs.shift();\n\t\tif (nextInput === undefined) break;\n\t\tconst trimmed = nextInput.trimStart();\n\t\tif (trimmed.startsWith(\"/\") || trimmed.startsWith(\"!\")) {\n\t\t\tthis.startupReplayActiveInput = nextInput.trim();\n\t\t\tthis.editor.setText(this.startupReplayActiveInput);\n\t\t\tthis.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tthis.deliverStartupReplayPrompt(nextInput);\n\t}\n\n\tif (this.startupDraftText !== undefined) {\n\t\tthis.editor.setText(this.startupDraftText);\n\t\tthis.startupDraftText = undefined;\n\t\tthis.ui.requestRender();\n\t}\n};\n\nInteractiveModeBase.prototype.setupEditorSubmitHandler = function (this: InteractiveModeBase): void {\n\tthis.defaultEditor.onSubmit = async (text: string) => {\n\t\tif (!this.firstSubmitRecorded) {\n\t\t\tthis.firstSubmitRecorded = true;\n\t\t\trecordTimeSinceReset(\"interactive-first-submit\");\n\t\t\tmarkLifecycleTiming(\"interactive-first-submit\");\n\t\t}\n\t\t// pi-tui trims, expands pastes, and clears the editor before it calls\n\t\t// onSubmit, so the callback argument is already reduced. Prefer the buffer\n\t\t// CustomEditor snapshotted for this very dispatch, which is what the user\n\t\t// actually had, and fall back to the argument for other editors and for\n\t\t// tests that invoke onSubmit directly.\n\t\tconst submittedDraft = this.defaultEditor.takeSubmittedDraft?.() ?? text;\n\t\ttext = text.trim();\n\t\tif (!text) return;\n\n\t\tif (this.startupReplayActiveInput && this.startupReplayActiveInput.trim() !== text.trim()) {\n\t\t\tthis.startupReplayInputs.push(text);\n\t\t\tthis.editor.addToHistory?.(text);\n\t\t\tthis.editor.setText(\"\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t// Handle commands\n\t\t\tif (text === \"/tasks\" || text.startsWith(\"/tasks \")) {\n\t\t\t\tif (this.runtimeHost instanceof IsolatedInteractiveRuntime) {\n\t\t\t\t\tawait this.runtimeHost.openTaskInspector(text.slice(6).trim() || undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!getOwnerTaskStore(this.session)) this.session.getAgentTaskHost();\n\t\t\t\tconst store = getOwnerTaskStore(this.session);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tif (!store) {\n\t\t\t\t\tthis.showStatus(\"Launched agents and shells will appear here.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait showTaskInspector(\n\t\t\t\t\t{ custom: (factory, options) => this.showExtensionCustom(factory, options) },\n\t\t\t\t\tstore,\n\t\t\t\t\ttext.slice(6).trim() || undefined,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/settings\") {\n\t\t\t\tthis.showSettingsSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/scoped-models\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tthis.showModelsSelector();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/model\" || text.startsWith(\"/model \")) {\n\t\t\t\tconst searchTerm = text.startsWith(\"/model \") ? text.slice(7).trim() : undefined;\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tawait this.handleModelCommand(searchTerm);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/thinking\" || text.startsWith(\"/thinking \")) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tthis.handleThinkingCommand(text.startsWith(\"/thinking \") ? text.slice(10).trim() : undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/export\" || text.startsWith(\"/export \")) {\n\t\t\t\tawait this.handleExportCommand(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/import\" || text.startsWith(\"/import \")) {\n\t\t\t\tawait this.handleImportCommand(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/share\") {\n\t\t\t\tawait this.handleShareCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/copy\") {\n\t\t\t\tawait this.handleCopyCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/name\" || text.startsWith(\"/name \")) {\n\t\t\t\tthis.handleNameCommand(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/session\") {\n\t\t\t\tthis.handleSessionCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/changelog\") {\n\t\t\t\tthis.handleChangelogCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/hotkeys\") {\n\t\t\t\tthis.handleHotkeysCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/fork\") {\n\t\t\t\tthis.showUserMessageSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/clone\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.handleCloneCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/tree\") {\n\t\t\t\tthis.showTreeSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/trust\") {\n\t\t\t\tthis.showTrustSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^\\/login(?:\\s|$)/.test(text)) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.handleLoginCommand(text.slice(\"/login\".length).trim() || undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^\\/logout(?:\\s|$)/.test(text)) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.showOAuthSelector(\"logout\", text.slice(\"/logout\".length).trim() || undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/new\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.handleClearCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^\\/compact(?:\\s|$)/.test(text)) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tif (text !== \"/compact\") {\n\t\t\t\t\tthis.showWarning(\"Usage: /compact\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// A manual request can take over automatic compaction, but a second manual\n\t\t\t\t// compaction or branch summary still has no safe independent owner.\n\t\t\t\tconst automaticCompaction =\n\t\t\t\t\tthis.session.compactionReason === \"threshold\" || this.session.compactionReason === \"overflow\";\n\t\t\t\tif (this.manualCompactionTakeoverPending || (this.compactionActive && !automaticCompaction)) {\n\t\t\t\t\tthis.showWarning(COMPACTION_ALREADY_IN_PROGRESS_WARNING);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait this.handleCompactCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/reload\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tawait this.handleReloadCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/debug\") {\n\t\t\t\tthis.handleDebugCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/arminsayshi\") {\n\t\t\t\tthis.handleArminSaysHi();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/dementedelves\") {\n\t\t\t\tthis.handleDementedDelves();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/resume\") {\n\t\t\t\tthis.showSessionSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/quit\" || text === \"/exit\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.shutdown();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (text.startsWith(\"/\") && this.deferredStartupPending) {\n\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\tawait yieldToEventLoop();\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tawait this.session.prompt(text);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Handle bash command (! for normal, !! for excluded from context)\n\t\t\tif (text.startsWith(\"!\")) {\n\t\t\t\tconst isExcluded = text.startsWith(\"!!\");\n\t\t\t\tconst command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();\n\t\t\t\tif (command) {\n\t\t\t\t\tif (this.session.isBashRunning) {\n\t\t\t\t\t\tthis.showWarning(\"A bash command is already running. esc cancel first.\");\n\t\t\t\t\t\tthis.editor.setText(text);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\t\tawait this.handleBashCommand(command, isExcluded);\n\t\t\t\t\tthis.isBashMode = false;\n\t\t\t\t\tthis.updateEditorBorderColor();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Queue input during compaction (extension commands execute immediately)\n\t\t\tif (this.compactionActive) {\n\t\t\t\tif (this.isExtensionCommand(text)) {\n\t\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\t\tawait this.session.prompt(text);\n\t\t\t\t} else {\n\t\t\t\t\tthis.queueCompactionMessage(text, \"steer\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If streaming, use prompt() with steer behavior\n\t\t\t// This handles extension commands (execute immediately), prompt template expansion, and queueing\n\t\t\tif (this.session.isStreaming && !this.session.queuedMessagesPaused) {\n\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.session.prompt(text, { streamingBehavior: \"steer\" });\n\t\t\t\tthis.updatePendingMessagesDisplay();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Normal message submission\n\t\t\t// First, move any pending bash components to chat\n\t\t\tthis.flushPendingBashComponents();\n\t\t\t// The draft travels with this submission, never through shared state: a\n\t\t\t// later submission whose trimmed text is identical must not be able to\n\t\t\t// claim, or clear, this one's exact buffer.\n\t\t\tconst submission = { text, draft: submittedDraft };\n\n\t\t\tif (this.onInputCallback) {\n\t\t\t\tif (!text.startsWith(\"/\")) {\n\t\t\t\t\tthis.renderDeferredUserInput(text);\n\t\t\t\t}\n\t\t\t\tthis.onInputCallback(submission);\n\t\t\t} else {\n\t\t\t\tthis.pendingUserInputs.push(submission);\n\t\t\t}\n\t\t\tthis.editor.addToHistory?.(text);\n\t\t} catch (error) {\n\t\t\t// Direct dispatch branches above hand text straight to the engine and\n\t\t\t// never reach runUserPromptTurn(), so this is the only place their send\n\t\t\t// failures can put the draft back. Anything else is not ours to absorb.\n\t\t\tif (!restoreFailedSubmissionDraft(this, error, submittedDraft)) throw error;\n\t\t} finally {\n\t\t\tthis.advanceStartupInputReplay?.(text);\n\t\t}\n\t};\n};\n"]}
1
+ {"version":3,"file":"interactive-input-handling.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-input-handling.ts"],"names":[],"mappings":"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","sourcesContent":["import { markLifecycleTiming } from \"../../core/lifecycle-timings.ts\";\nimport { getOwnerTaskStore } from \"../../core/tasks/owner-store.js\";\nimport { yieldToEventLoop } from \"../../utils/event-loop.ts\";\nimport {\n\tinteractiveEngineNeedsExplicitTermination,\n\tinterruptBlockedInteractiveEngine,\n\tterminateInteractiveEngine,\n} from \"../interactive-engine/extension-ui-bridge.ts\";\nimport { IsolatedInteractiveRuntime } from \"../interactive-engine/isolated-runtime.js\";\nimport {\n\tdismissRemoteProxy,\n\tremoteEngineProxyOwner,\n\tremoteProxyHandlesCtrlC,\n} from \"../interactive-engine/remote-input-ownership.ts\";\nimport { showTaskInspector } from \"../rpc/task-ui-bridge.js\";\nimport { StartupIdentityComponent } from \"./components/startup-identity.ts\";\nimport { COMPACTION_ALREADY_IN_PROGRESS_WARNING } from \"./interactive-bash-compact.ts\";\nimport { routeGlobalClearInput } from \"./interactive-global-clear.ts\";\nimport { isPhysicalCtrlC, isPhysicalEscape, isSafetyKeyRelease } from \"./interactive-key-identity.ts\";\nimport { InteractiveModeBase, seedStartupInput } from \"./interactive-mode-base.ts\";\nimport { pasteClipboardImageToEditor, recordTimeSinceReset } from \"./interactive-mode-deps.ts\";\nimport { pauseAndAbortInteractiveSession } from \"./interactive-pause.ts\";\nimport { restoreFailedSubmissionDraft } from \"./interactive-prompt-restore.ts\";\n\nexport function registerStartupInputListeners(mode: InteractiveModeBase): void {\n\tmode.addTuiInputListener(() =>\n\t\tmode.builtInHeader instanceof StartupIdentityComponent ? void mode.builtInHeader.settle() : undefined,\n\t);\n\tmode.addTuiInputListener((data) =>\n\t\trouteGlobalClearInput(data, {\n\t\t\t// Physical identity first: safety routing must survive an `app.clear` remap.\n\t\t\tmatchesCtrlC: isPhysicalCtrlC,\n\t\t\tmatchesEscape: isPhysicalEscape,\n\t\t\tisSafetyKeyRelease,\n\t\t\tmatchesClear: (candidate) => mode.keybindings.matches(candidate, \"app.clear\"),\n\t\t\thasOverlay: () => mode.ui.hasOverlay(),\n\t\t\tblockingInlineCustomUiActive: () => mode.blockingInlineCustomUiDepth > 0,\n\t\t\teditorOwnsInput: () => mode.editorContainer.children.includes(mode.editor),\n\t\t\tremoteEngineProxyOwner: () =>\n\t\t\t\tremoteEngineProxyOwner(mode.runtimeHost, {\n\t\t\t\t\thasOverlay: () => mode.ui.hasOverlay(),\n\t\t\t\t\tinlineComponents: () => mode.editorContainer.children,\n\t\t\t\t}),\n\t\t\tremoteProxyHandlesCtrlC: (owner) => remoteProxyHandlesCtrlC(mode.runtimeHost, owner),\n\t\t\tonRemoteProxyDismiss: (owner) => {\n\t\t\t\tdismissRemoteProxy(mode.runtimeHost, owner);\n\t\t\t},\n\t\t\tengineNeedsExplicitTermination: () => interactiveEngineNeedsExplicitTermination(mode.runtimeHost),\n\t\t\tonEngineTerminate: () => {\n\t\t\t\tterminateInteractiveEngine(mode.runtimeHost);\n\t\t\t},\n\t\t\tonClear: () => mode.handleCtrlC(),\n\t\t\trequestRender: () => mode.ui.requestRender(),\n\t\t}),\n\t);\n}\n\nInteractiveModeBase.prototype.setupKeyHandlers = function (this: InteractiveModeBase): void {\n\tregisterStartupInputListeners(this);\n\t// Set up handlers on defaultEditor - they use this.editor for text access\n\t// so they work correctly regardless of which editor is active\n\tthis.defaultEditor.onEscape = () => {\n\t\tif (!this.session.isStreaming && interruptBlockedInteractiveEngine(this.runtimeHost)) return;\n\t\tif (this.session.isStreaming || this.session.agent.hasQueuedMessages() || this.session.queuedMessagesPaused) {\n\t\t\tpauseAndAbortInteractiveSession(this, { restoreQueuedMessages: true });\n\t\t} else if (this.session.isBashRunning) {\n\t\t\tthis.session.abortBash();\n\t\t} else if (this.isBashMode) {\n\t\t\tthis.editor.setText(\"\");\n\t\t\tthis.isBashMode = false;\n\t\t\tthis.updateEditorBorderColor();\n\t\t} else if (!this.editor.getText().trim()) {\n\t\t\t// Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n\t\t\tconst action = this.settingsManager.getDoubleEscapeAction();\n\t\t\tif (action !== \"none\") {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - this.lastEscapeTime < 500) {\n\t\t\t\t\tif (action === \"tree\") {\n\t\t\t\t\t\tthis.showTreeSelector();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.showUserMessageSelector();\n\t\t\t\t\t}\n\t\t\t\t\tthis.lastEscapeTime = 0;\n\t\t\t\t} else {\n\t\t\t\t\tthis.lastEscapeTime = now;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Register app action handlers\n\tthis.defaultEditor.onAction(\"app.clear\", () => this.handleCtrlC());\n\tthis.defaultEditor.onCtrlD = () => this.handleCtrlD();\n\tthis.defaultEditor.onAction(\"app.suspend\", () => this.handleCtrlZ());\n\tthis.defaultEditor.onAction(\"app.thinking.cycle\", () => this.cycleThinkingLevel());\n\tthis.defaultEditor.onAction(\"app.model.cycleForward\", () => {\n\t\tvoid (async () => {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\tawait this.cycleModel(\"forward\");\n\t\t})();\n\t});\n\tthis.defaultEditor.onAction(\"app.model.cycleBackward\", () => {\n\t\tvoid (async () => {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\tawait this.cycleModel(\"backward\");\n\t\t})();\n\t});\n\n\t// Global debug handler on TUI (works regardless of focus)\n\tthis.ui.onDebug = () => this.handleDebugCommand();\n\tthis.defaultEditor.onAction(\"app.model.select\", () => {\n\t\tvoid (async () => {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\tthis.showModelSelector();\n\t\t})();\n\t});\n\tthis.defaultEditor.onAction(\"app.tools.expand\", () => this.toggleToolOutputExpansion());\n\tthis.defaultEditor.onAction(\"app.thinking.toggle\", () => this.toggleThinkingBlockVisibility());\n\tthis.defaultEditor.onAction(\"app.editor.external\", () => {\n\t\tvoid this.openExternalEditor();\n\t});\n\tthis.defaultEditor.onAction(\"app.message.followUp\", () => this.handleFollowUp());\n\tthis.defaultEditor.onAction(\"app.message.dequeue\", () => this.handleDequeue());\n\tthis.defaultEditor.onAction(\"app.session.new\", () => this.handleClearCommand());\n\tthis.defaultEditor.onAction(\"app.session.tree\", () => this.showTreeSelector());\n\tthis.defaultEditor.onAction(\"app.session.fork\", () => this.showUserMessageSelector());\n\tthis.defaultEditor.onAction(\"app.session.resume\", () => this.showSessionSelector());\n\n\tthis.defaultEditor.onChange = (text: string) => {\n\t\tconst wasBashMode = this.isBashMode;\n\t\tthis.isBashMode = text.trimStart().startsWith(\"!\");\n\t\tif (wasBashMode !== this.isBashMode) {\n\t\t\tthis.updateEditorBorderColor();\n\t\t}\n\t};\n\n\t// Handle clipboard paste (triggered on Ctrl+V). Copied files use their original paths,\n\t// images are attached via temporary files, and plain text is the final fallback.\n\tthis.defaultEditor.onPasteImage = () => {\n\t\tthis.handleClipboardImagePaste();\n\t};\n};\n\nInteractiveModeBase.prototype.handleClipboardImagePaste = async function (this: InteractiveModeBase): Promise<void> {\n\tawait pasteClipboardImageToEditor(this.editor, () => this.ui.requestRender(), {\n\t\tshowWarning: (message) => this.showWarning(message),\n\t\tisBashMode: this.isBashMode,\n\t});\n};\n\nInteractiveModeBase.prototype.deliverStartupReplayPrompt = function (this: InteractiveModeBase, text: string): void {\n\tif (this.onInputCallback) {\n\t\tif (!text.startsWith(\"/\")) {\n\t\t\tthis.renderDeferredUserInput(text);\n\t\t}\n\t\tconst callback = this.onInputCallback;\n\t\tthis.onInputCallback = undefined;\n\t\tcallback({ text, draft: text });\n\t} else {\n\t\tthis.pendingUserInputs.push({ text, draft: text });\n\t}\n};\n\nInteractiveModeBase.prototype.recoverCookedStartupInput = function (this: InteractiveModeBase): boolean {\n\tif (this.startupCookedInputRecovered || this.pendingUserInputs.length > 0) return true;\n\tconst text = this.editor.getText();\n\tconst cookedLines = text\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n\tconst isCommandLike = (line: string | undefined) =>\n\t\tline !== undefined && (line.startsWith(\"/\") || line.startsWith(\"!\"));\n\t// A raw startup capture distinguishes drafts from Enter-terminated submissions.\n\t// Never reinterpret its visible command-like draft (including a bare \"/\") as\n\t// submitted merely because header/chat initialization is now draining input.\n\tconst singleCommandLike =\n\t\tthis.options.startupInputCapture === undefined && cookedLines.length === 1 && isCommandLike(cookedLines[0]);\n\tif (cookedLines.length < 2 && !singleCommandLike) return false;\n\n\tthis.startupCookedInputRecovered = true;\n\tconst activeInput = this.startupReplayActiveInput?.trim();\n\tlet draftText = \"\";\n\tlet submissions = cookedLines;\n\tif (\n\t\tactiveInput === undefined &&\n\t\tcookedLines.length > 1 &&\n\t\t!isCommandLike(cookedLines[cookedLines.length - 1]) &&\n\t\t(!isCommandLike(cookedLines[0]) || cookedLines.length > 2)\n\t) {\n\t\tdraftText = cookedLines[cookedLines.length - 1] ?? \"\";\n\t\tsubmissions = cookedLines.slice(0, -1);\n\t} else if (activeInput && cookedLines.length > 1 && !isCommandLike(cookedLines[cookedLines.length - 1])) {\n\t\tdraftText = cookedLines[cookedLines.length - 1] ?? \"\";\n\t\tsubmissions = cookedLines.slice(0, -1);\n\t}\n\tif (submissions.length === 0) return true;\n\n\tif (activeInput) {\n\t\tconst queuedSubmissions = submissions[0] === activeInput ? submissions.slice(1) : submissions;\n\t\tthis.editor.setText(draftText);\n\t\tthis.startupReplayInputs.push(...queuedSubmissions);\n\t\treturn true;\n\t}\n\n\tthis.editor.setText(\"\");\n\tseedStartupInput(\n\t\tthis.pendingUserInputs,\n\t\tthis.editor,\n\t\t{ text: draftText, submissions },\n\t\tthis.startupReplayInputs,\n\t\t(draft) => {\n\t\t\tthis.startupDraftText = draft;\n\t\t},\n\t\t(active) => {\n\t\t\tthis.startupReplayActiveInput = active;\n\t\t},\n\t);\n\treturn true;\n};\n\nInteractiveModeBase.prototype.drainStartupReplayCommands = async function (this: InteractiveModeBase): Promise<void> {\n\twhile (this.pendingUserInputs.length === 0 && this.startupReplayActiveInput) {\n\t\tconst activeInput = this.startupReplayActiveInput;\n\t\tawait this.defaultEditor.onSubmit?.(activeInput);\n\t\tif (this.editor.getText().trim() === activeInput.trim()) {\n\t\t\tthis.editor.setText(\"\");\n\t\t}\n\t\tif (this.startupReplayActiveInput?.trim() === activeInput.trim()) break;\n\t}\n};\n\nInteractiveModeBase.prototype.advanceStartupInputReplay = function (\n\tthis: InteractiveModeBase,\n\tsubmittedText: string,\n): void {\n\tif (this.startupReplayActiveInput?.trim() !== submittedText.trim()) return;\n\tthis.startupReplayActiveInput = undefined;\n\n\twhile (this.startupReplayInputs.length > 0) {\n\t\tconst nextInput = this.startupReplayInputs.shift();\n\t\tif (nextInput === undefined) break;\n\t\tconst trimmed = nextInput.trimStart();\n\t\tif (trimmed.startsWith(\"/\") || trimmed.startsWith(\"!\")) {\n\t\t\tthis.startupReplayActiveInput = nextInput.trim();\n\t\t\tthis.editor.setText(this.startupReplayActiveInput);\n\t\t\tthis.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tthis.deliverStartupReplayPrompt(nextInput);\n\t}\n\n\tif (this.startupDraftText !== undefined) {\n\t\tthis.editor.setText(this.startupDraftText);\n\t\tthis.startupDraftText = undefined;\n\t\tthis.ui.requestRender();\n\t}\n};\n\nInteractiveModeBase.prototype.setupEditorSubmitHandler = function (this: InteractiveModeBase): void {\n\tthis.defaultEditor.onSubmit = async (text: string) => {\n\t\tif (!this.firstSubmitRecorded) {\n\t\t\tthis.firstSubmitRecorded = true;\n\t\t\trecordTimeSinceReset(\"interactive-first-submit\");\n\t\t\tmarkLifecycleTiming(\"interactive-first-submit\");\n\t\t}\n\t\t// pi-tui trims, expands pastes, and clears the editor before it calls\n\t\t// onSubmit, so the callback argument is already reduced. Prefer the buffer\n\t\t// CustomEditor snapshotted for this very dispatch, which is what the user\n\t\t// actually had, and fall back to the argument for other editors and for\n\t\t// tests that invoke onSubmit directly.\n\t\tconst submittedDraft = this.defaultEditor.takeSubmittedDraft?.() ?? text;\n\t\ttext = text.trim();\n\t\tif (!text) return;\n\n\t\tif (this.startupReplayActiveInput && this.startupReplayActiveInput.trim() !== text.trim()) {\n\t\t\tthis.startupReplayInputs.push(text);\n\t\t\tthis.editor.addToHistory?.(text);\n\t\t\tthis.editor.setText(\"\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t// Handle commands\n\t\t\tif (text === \"/tasks\" || text.startsWith(\"/tasks \")) {\n\t\t\t\tif (this.runtimeHost instanceof IsolatedInteractiveRuntime) {\n\t\t\t\t\tawait this.runtimeHost.openTaskInspector(text.slice(6).trim() || undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!getOwnerTaskStore(this.session)) this.session.getAgentTaskHost();\n\t\t\t\tconst store = getOwnerTaskStore(this.session);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tif (!store) {\n\t\t\t\t\tthis.showStatus(\"Launched agents and shells will appear here.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait showTaskInspector(\n\t\t\t\t\t{ custom: (factory, options) => this.showExtensionCustom(factory, options) },\n\t\t\t\t\tstore,\n\t\t\t\t\ttext.slice(6).trim() || undefined,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/settings\") {\n\t\t\t\tthis.showSettingsSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/scoped-models\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tthis.showModelsSelector();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/model\" || text.startsWith(\"/model \")) {\n\t\t\t\tconst searchTerm = text.startsWith(\"/model \") ? text.slice(7).trim() : undefined;\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tawait this.handleModelCommand(searchTerm);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/thinking\" || text.startsWith(\"/thinking \")) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tthis.handleThinkingCommand(text.startsWith(\"/thinking \") ? text.slice(10).trim() : undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/export\" || text.startsWith(\"/export \")) {\n\t\t\t\tawait this.handleExportCommand(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/import\" || text.startsWith(\"/import \")) {\n\t\t\t\tawait this.handleImportCommand(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/share\") {\n\t\t\t\tawait this.handleShareCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/copy\") {\n\t\t\t\tawait this.handleCopyCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/name\" || text.startsWith(\"/name \")) {\n\t\t\t\tthis.handleNameCommand(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/session\") {\n\t\t\t\tthis.handleSessionCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/changelog\") {\n\t\t\t\tthis.handleChangelogCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/hotkeys\") {\n\t\t\t\tthis.handleHotkeysCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/fork\") {\n\t\t\t\tthis.showUserMessageSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/clone\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.handleCloneCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/tree\") {\n\t\t\t\tthis.showTreeSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/trust\") {\n\t\t\t\tthis.showTrustSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^\\/login(?:\\s|$)/.test(text)) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.handleLoginCommand(text.slice(\"/login\".length).trim() || undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^\\/logout(?:\\s|$)/.test(text)) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.showOAuthSelector(\"logout\", text.slice(\"/logout\".length).trim() || undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/new\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.handleClearCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (/^\\/compact(?:\\s|$)/.test(text)) {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tif (text !== \"/compact\") {\n\t\t\t\t\tthis.showWarning(\"Usage: /compact\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// A manual request can take over automatic compaction, but a second manual\n\t\t\t\t// compaction or branch summary still has no safe independent owner.\n\t\t\t\tconst automaticCompaction =\n\t\t\t\t\tthis.session.compactionReason === \"threshold\" || this.session.compactionReason === \"overflow\";\n\t\t\t\tif (this.manualCompactionTakeoverPending || (this.compactionActive && !automaticCompaction)) {\n\t\t\t\t\tthis.showWarning(COMPACTION_ALREADY_IN_PROGRESS_WARNING);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait this.handleCompactCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/reload\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tawait this.handleReloadCommand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/debug\") {\n\t\t\t\tthis.handleDebugCommand();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/arminsayshi\") {\n\t\t\t\tthis.handleArminSaysHi();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/dementedelves\") {\n\t\t\t\tthis.handleDementedDelves();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/resume\") {\n\t\t\t\tthis.showSessionSelector();\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (text === \"/quit\" || text === \"/exit\") {\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.shutdown();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (text.startsWith(\"/\") && this.deferredStartupPending) {\n\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\tawait yieldToEventLoop();\n\t\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t\t\tawait this.session.prompt(text);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Handle bash command (! for normal, !! for excluded from context)\n\t\t\tif (text.startsWith(\"!\")) {\n\t\t\t\tconst isExcluded = text.startsWith(\"!!\");\n\t\t\t\tconst command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();\n\t\t\t\tif (command) {\n\t\t\t\t\tif (this.session.isBashRunning) {\n\t\t\t\t\t\tthis.showWarning(\"A bash command is already running. esc cancel first.\");\n\t\t\t\t\t\tthis.editor.setText(text);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\t\tawait this.handleBashCommand(command, isExcluded);\n\t\t\t\t\tthis.isBashMode = false;\n\t\t\t\t\tthis.updateEditorBorderColor();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Queue input during compaction (extension commands execute immediately)\n\t\t\tif (this.compactionActive) {\n\t\t\t\tif (this.isExtensionCommand(text)) {\n\t\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\t\tawait this.session.prompt(text);\n\t\t\t\t} else {\n\t\t\t\t\tthis.queueCompactionMessage(text, \"steer\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If streaming, use prompt() with steer behavior\n\t\t\t// This handles extension commands (execute immediately), prompt template expansion, and queueing\n\t\t\tif (this.session.isStreaming && !this.session.queuedMessagesPaused) {\n\t\t\t\tthis.editor.addToHistory?.(text);\n\t\t\t\tthis.editor.setText(\"\");\n\t\t\t\tawait this.session.prompt(text, { streamingBehavior: \"steer\" });\n\t\t\t\tthis.updatePendingMessagesDisplay();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Normal message submission\n\t\t\t// First, move any pending bash components to chat\n\t\t\tthis.flushPendingBashComponents();\n\t\t\t// The draft travels with this submission, never through shared state: a\n\t\t\t// later submission whose trimmed text is identical must not be able to\n\t\t\t// claim, or clear, this one's exact buffer.\n\t\t\tconst submission = { text, draft: submittedDraft };\n\n\t\t\tif (this.onInputCallback) {\n\t\t\t\tif (!text.startsWith(\"/\")) {\n\t\t\t\t\tthis.renderDeferredUserInput(text);\n\t\t\t\t}\n\t\t\t\tthis.onInputCallback(submission);\n\t\t\t} else {\n\t\t\t\tthis.pendingUserInputs.push(submission);\n\t\t\t}\n\t\t\tthis.editor.addToHistory?.(text);\n\t\t} catch (error) {\n\t\t\t// Direct dispatch branches above hand text straight to the engine and\n\t\t\t// never reach runUserPromptTurn(), so this is the only place their send\n\t\t\t// failures can put the draft back. Anything else is not ours to absorb.\n\t\t\tif (!restoreFailedSubmissionDraft(this, error, submittedDraft)) throw error;\n\t\t} finally {\n\t\t\tthis.advanceStartupInputReplay?.(text);\n\t\t}\n\t};\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-helpers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,GAAG,EAER,uBAAuB,EAEvB,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,IAAI,EACJ,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D;AAED,qBAAa,cAAe,SAAQ,IAAK,YAAW,UAAU;IAC7D,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,iBAAyB,gBAAgB,CAA6B;IACtE,iBAAyB,eAAe,CAA6B;IAErE,YACC,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5C,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,EAC3C,QAAQ,UAAQ,EAChB,QAAQ,SAAI,EACZ,QAAQ,SAAI,EAOZ;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAGnC;IAED,OAAO,IAAI,IAAI,CAGd;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvC;CACD;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM3D;AAED,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAe5G;AAED,eAAO,MAAM,mCAAmC,0MACwJ,CAAC;AAEzM,eAAO,MAAM,2BAA2B,aAAiE,CAAC;AAE1G,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAErE;AASD,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAatF;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,IAAI,MAAM,OAAO,uBAAuB,CAE9G;AAED,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,oFAAoF;AACpF,wBAAgB,qBAAqB,CACpC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACvC,OAAO,CAGT"}
1
+ {"version":3,"file":"interactive-mode-helpers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,KAAK,GAAG,EAER,uBAAuB,EAEvB,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,IAAI,EACJ,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D;AAED,qBAAa,cAAe,SAAQ,IAAK,YAAW,UAAU;IAC7D,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,iBAAyB,gBAAgB,CAA6B;IACtE,iBAAyB,eAAe,CAA6B;IAErE,YACC,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5C,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,EAC3C,QAAQ,UAAQ,EAChB,QAAQ,SAAI,EACZ,QAAQ,SAAI,EAOZ;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAGnC;IAED,OAAO,IAAI,IAAI,CAGd;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvC;CACD;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM3D;AAED,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAe5G;AAED,eAAO,MAAM,mCAAmC,0MACwJ,CAAC;AAEzM,eAAO,MAAM,2BAA2B,aAAiE,CAAC;AAE1G,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAErE;AAED,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAatF;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,IAAI,MAAM,OAAO,uBAAuB,CAE9G;AAED,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,oFAAoF;AACpF,wBAAgB,qBAAqB,CACpC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACvC,OAAO,CAGT"}
@@ -1,4 +1,5 @@
1
1
  import { builtinProviders } from "@bastani/pi-ai/providers/all";
2
+ import { quoteIfNeeded } from "./chat-input-actions.js";
2
3
  import { APP_NAME, BUILTIN_SLASH_COMMANDS, defaultModelPerProvider, fs, Text, } from "./interactive-mode-deps.js";
3
4
  export function isExpandable(obj) {
4
5
  return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
@@ -66,12 +67,6 @@ export function isAnthropicSubscriptionAuthKey(apiKey) {
66
67
  export function isUnknownModel(model) {
67
68
  return !!model && model.provider === "unknown" && model.id === "unknown" && model.api === "unknown";
68
69
  }
69
- function quoteIfNeeded(value) {
70
- if (value.length > 0 && !/[^a-zA-Z0-9_\-./~:@]/.test(value)) {
71
- return value;
72
- }
73
- return `'${value.replace(/'/g, `'\\''`)}'`;
74
- }
75
70
  export function formatResumeCommand(sessionManager) {
76
71
  if (!process.stdout.isTTY)
77
72
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-helpers.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { builtinProviders } from \"@bastani/pi-ai/providers/all\";\nimport {\n\tAPP_NAME,\n\ttype Api,\n\tBUILTIN_SLASH_COMMANDS,\n\tdefaultModelPerProvider,\n\tfs,\n\ttype Model,\n\ttype SessionManager,\n\tText,\n} from \"./interactive-mode-deps.ts\";\nimport type { Expandable } from \"./interactive-mode-types.ts\";\n\nexport function isExpandable(obj: unknown): obj is Expandable {\n\treturn typeof obj === \"object\" && obj !== null && \"setExpanded\" in obj && typeof obj.setExpanded === \"function\";\n}\n\nexport class ExpandableText extends Text implements Expandable {\n\tprivate expanded: boolean;\n\tprivate contentWidth: number | undefined;\n\tprivate readonly textPaddingX: number;\n\n\tprivate declare readonly getCollapsedText: (width?: number) => string;\n\tprivate declare readonly getExpandedText: (width?: number) => string;\n\n\tconstructor(\n\t\tgetCollapsedText: (width?: number) => string,\n\t\tgetExpandedText: (width?: number) => string,\n\t\texpanded = false,\n\t\tpaddingX = 0,\n\t\tpaddingY = 0,\n\t) {\n\t\tsuper(expanded ? getExpandedText() : getCollapsedText(), paddingX, paddingY);\n\t\tthis.getCollapsedText = getCollapsedText;\n\t\tthis.getExpandedText = getExpandedText;\n\t\tthis.expanded = expanded;\n\t\tthis.textPaddingX = paddingX;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.refresh();\n\t}\n\n\trefresh(): void {\n\t\tconst width = this.contentWidth;\n\t\tthis.setText(this.expanded ? this.getExpandedText(width) : this.getCollapsedText(width));\n\t}\n\n\toverride render(width: number): string[] {\n\t\t// Text getters may adapt their layout to the available content width\n\t\t// (e.g. the startup banner drops its side-by-side meta column on narrow\n\t\t// terminals), so refresh whenever the render width changes.\n\t\tconst contentWidth = Math.max(1, width - this.textPaddingX * 2);\n\t\tif (contentWidth !== this.contentWidth) {\n\t\t\tthis.contentWidth = contentWidth;\n\t\t\tthis.refresh();\n\t\t}\n\t\treturn super.render(width);\n\t}\n}\n\nconst DEAD_TERMINAL_ERROR_CODES = new Set([\"EIO\", \"EPIPE\", \"ENOTCONN\"]);\n\nexport function isDeadTerminalError(error: unknown): boolean {\n\tif (!error || typeof error !== \"object\" || !(\"code\" in error)) {\n\t\treturn false;\n\t}\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn code !== undefined && DEAD_TERMINAL_ERROR_CODES.has(code);\n}\n\nexport function formatCrashExtensionHint(extensionMatches: readonly string[] | undefined): string | undefined {\n\tconst matches = Array.isArray(extensionMatches)\n\t\t? extensionMatches.filter((match): match is string => typeof match === \"string\" && match.length > 0)\n\t\t: [];\n\tif (matches.length === 0) return undefined;\n\tconst quoted = matches.map((match) => `\\`${match}\\``);\n\tconst labels =\n\t\tquoted.length === 1\n\t\t\t? quoted[0]\n\t\t\t: quoted.length === 2\n\t\t\t\t? quoted.join(\" and \")\n\t\t\t\t: `${quoted.slice(0, -1).join(\", \")}, and ${quoted[quoted.length - 1]}`;\n\tconst noun = matches.length === 1 ? \"extension\" : \"extensions\";\n\tconst pronoun = matches.length === 1 ? \"it\" : \"them\";\n\treturn `A stack frame came from loaded ${noun} ${labels}, which may be involved. Try disabling ${pronoun} with \\`${APP_NAME} config\\`, or run \\`${APP_NAME} -ne\\` to confirm.`;\n}\n\nexport const ANTHROPIC_SUBSCRIPTION_AUTH_WARNING =\n\t\"Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage.\";\n\nexport const BUILTIN_SLASH_COMMAND_NAMES = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));\n\nexport function isAnthropicSubscriptionAuthKey(apiKey: string | undefined): boolean {\n\treturn typeof apiKey === \"string\" && apiKey.startsWith(\"sk-ant-oat\");\n}\n\nexport function isUnknownModel(model: Model<Api> | undefined): boolean {\n\treturn !!model && model.provider === \"unknown\" && model.id === \"unknown\" && model.api === \"unknown\";\n}\n\nfunction quoteIfNeeded(value: string): string {\n\tif (value.length > 0 && !/[^a-zA-Z0-9_\\-./~:@]/.test(value)) {\n\t\treturn value;\n\t}\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport function formatResumeCommand(sessionManager: SessionManager): string | undefined {\n\tif (!process.stdout.isTTY) return undefined;\n\tif (!sessionManager.isPersisted()) return undefined;\n\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile || !fs.existsSync(sessionFile)) return undefined;\n\n\tconst args = [APP_NAME];\n\tif (!sessionManager.usesDefaultSessionDir()) {\n\t\targs.push(\"--session-dir\", quoteIfNeeded(sessionManager.getSessionDir()));\n\t}\n\targs.push(\"--session\", sessionManager.getSessionId());\n\treturn args.join(\" \");\n}\n\nexport function hasDefaultModelProvider(providerId: string): providerId is keyof typeof defaultModelPerProvider {\n\treturn providerId in defaultModelPerProvider;\n}\n\nexport const BEDROCK_PROVIDER_ID = \"amazon-bedrock\";\n\n/** @deprecated Login options are now built directly from provider auth metadata. */\nexport function isApiKeyLoginProvider(\n\tproviderId: string,\n\toauthProviderIds: ReadonlySet<string>,\n\t_builtInProviderIds?: ReadonlySet<string>,\n): boolean {\n\tconst builtin = builtinProviders().find((provider) => provider.id === providerId);\n\treturn builtin ? builtin.auth.apiKey !== undefined : !oauthProviderIds.has(providerId);\n}\n"]}
1
+ {"version":3,"file":"interactive-mode-helpers.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { builtinProviders } from \"@bastani/pi-ai/providers/all\";\nimport { quoteIfNeeded } from \"./chat-input-actions.ts\";\nimport {\n\tAPP_NAME,\n\ttype Api,\n\tBUILTIN_SLASH_COMMANDS,\n\tdefaultModelPerProvider,\n\tfs,\n\ttype Model,\n\ttype SessionManager,\n\tText,\n} from \"./interactive-mode-deps.ts\";\nimport type { Expandable } from \"./interactive-mode-types.ts\";\n\nexport function isExpandable(obj: unknown): obj is Expandable {\n\treturn typeof obj === \"object\" && obj !== null && \"setExpanded\" in obj && typeof obj.setExpanded === \"function\";\n}\n\nexport class ExpandableText extends Text implements Expandable {\n\tprivate expanded: boolean;\n\tprivate contentWidth: number | undefined;\n\tprivate readonly textPaddingX: number;\n\n\tprivate declare readonly getCollapsedText: (width?: number) => string;\n\tprivate declare readonly getExpandedText: (width?: number) => string;\n\n\tconstructor(\n\t\tgetCollapsedText: (width?: number) => string,\n\t\tgetExpandedText: (width?: number) => string,\n\t\texpanded = false,\n\t\tpaddingX = 0,\n\t\tpaddingY = 0,\n\t) {\n\t\tsuper(expanded ? getExpandedText() : getCollapsedText(), paddingX, paddingY);\n\t\tthis.getCollapsedText = getCollapsedText;\n\t\tthis.getExpandedText = getExpandedText;\n\t\tthis.expanded = expanded;\n\t\tthis.textPaddingX = paddingX;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.refresh();\n\t}\n\n\trefresh(): void {\n\t\tconst width = this.contentWidth;\n\t\tthis.setText(this.expanded ? this.getExpandedText(width) : this.getCollapsedText(width));\n\t}\n\n\toverride render(width: number): string[] {\n\t\t// Text getters may adapt their layout to the available content width\n\t\t// (e.g. the startup banner drops its side-by-side meta column on narrow\n\t\t// terminals), so refresh whenever the render width changes.\n\t\tconst contentWidth = Math.max(1, width - this.textPaddingX * 2);\n\t\tif (contentWidth !== this.contentWidth) {\n\t\t\tthis.contentWidth = contentWidth;\n\t\t\tthis.refresh();\n\t\t}\n\t\treturn super.render(width);\n\t}\n}\n\nconst DEAD_TERMINAL_ERROR_CODES = new Set([\"EIO\", \"EPIPE\", \"ENOTCONN\"]);\n\nexport function isDeadTerminalError(error: unknown): boolean {\n\tif (!error || typeof error !== \"object\" || !(\"code\" in error)) {\n\t\treturn false;\n\t}\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn code !== undefined && DEAD_TERMINAL_ERROR_CODES.has(code);\n}\n\nexport function formatCrashExtensionHint(extensionMatches: readonly string[] | undefined): string | undefined {\n\tconst matches = Array.isArray(extensionMatches)\n\t\t? extensionMatches.filter((match): match is string => typeof match === \"string\" && match.length > 0)\n\t\t: [];\n\tif (matches.length === 0) return undefined;\n\tconst quoted = matches.map((match) => `\\`${match}\\``);\n\tconst labels =\n\t\tquoted.length === 1\n\t\t\t? quoted[0]\n\t\t\t: quoted.length === 2\n\t\t\t\t? quoted.join(\" and \")\n\t\t\t\t: `${quoted.slice(0, -1).join(\", \")}, and ${quoted[quoted.length - 1]}`;\n\tconst noun = matches.length === 1 ? \"extension\" : \"extensions\";\n\tconst pronoun = matches.length === 1 ? \"it\" : \"them\";\n\treturn `A stack frame came from loaded ${noun} ${labels}, which may be involved. Try disabling ${pronoun} with \\`${APP_NAME} config\\`, or run \\`${APP_NAME} -ne\\` to confirm.`;\n}\n\nexport const ANTHROPIC_SUBSCRIPTION_AUTH_WARNING =\n\t\"Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage.\";\n\nexport const BUILTIN_SLASH_COMMAND_NAMES = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));\n\nexport function isAnthropicSubscriptionAuthKey(apiKey: string | undefined): boolean {\n\treturn typeof apiKey === \"string\" && apiKey.startsWith(\"sk-ant-oat\");\n}\n\nexport function isUnknownModel(model: Model<Api> | undefined): boolean {\n\treturn !!model && model.provider === \"unknown\" && model.id === \"unknown\" && model.api === \"unknown\";\n}\n\nexport function formatResumeCommand(sessionManager: SessionManager): string | undefined {\n\tif (!process.stdout.isTTY) return undefined;\n\tif (!sessionManager.isPersisted()) return undefined;\n\n\tconst sessionFile = sessionManager.getSessionFile();\n\tif (!sessionFile || !fs.existsSync(sessionFile)) return undefined;\n\n\tconst args = [APP_NAME];\n\tif (!sessionManager.usesDefaultSessionDir()) {\n\t\targs.push(\"--session-dir\", quoteIfNeeded(sessionManager.getSessionDir()));\n\t}\n\targs.push(\"--session\", sessionManager.getSessionId());\n\treturn args.join(\" \");\n}\n\nexport function hasDefaultModelProvider(providerId: string): providerId is keyof typeof defaultModelPerProvider {\n\treturn providerId in defaultModelPerProvider;\n}\n\nexport const BEDROCK_PROVIDER_ID = \"amazon-bedrock\";\n\n/** @deprecated Login options are now built directly from provider auth metadata. */\nexport function isApiKeyLoginProvider(\n\tproviderId: string,\n\toauthProviderIds: ReadonlySet<string>,\n\t_builtInProviderIds?: ReadonlySet<string>,\n): boolean {\n\tconst builtin = builtinProviders().find((provider) => provider.id === providerId);\n\treturn builtin ? builtin.auth.apiKey !== undefined : !oauthProviderIds.has(providerId);\n}\n"]}
@@ -3,6 +3,8 @@ export type ClipboardModule = {
3
3
  getText: () => Promise<string>;
4
4
  hasImage: () => boolean;
5
5
  getImageBinary: () => Promise<Array<number>>;
6
+ /** Pasteboard types on the clipboard, such as `public.file-url`. Absent from older module versions. */
7
+ availableFormats?: () => string[];
6
8
  };
7
9
  type ClipboardRequire = (id: string) => unknown;
8
10
  export declare function loadClipboardNative(requires?: readonly ClipboardRequire[]): ClipboardModule | null;
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard-native.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard-native.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEF,KAAK,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;AAMhD,wBAAgB,mBAAmB,CAClC,QAAQ,GAAE,SAAS,gBAAgB,EAA0C,GAC3E,eAAe,GAAG,IAAI,CASxB;AAED,QAAA,MAAM,SAAS,wBAA2E,CAAC;AAE3F,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"clipboard-native.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard-native.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,uGAAuG;IACvG,gBAAgB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,KAAK,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;AAMhD,wBAAgB,mBAAmB,CAClC,QAAQ,GAAE,SAAS,gBAAgB,EAA0C,GAC3E,eAAe,GAAG,IAAI,CASxB;AAED,QAAA,MAAM,SAAS,wBAA2E,CAAC;AAE3F,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard-native.js","sourceRoot":"","sources":["../../src/utils/clipboard-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAWpC,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,MAAM,oBAAoB,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAChH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAE/G,MAAM,UAAU,mBAAmB,CAClC,QAAQ,GAAgC,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE7E,KAAK,MAAM,gBAAgB,IAAI,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC;YACJ,OAAO,gBAAgB,CAAC,yBAAyB,CAAoB,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACR,gCAAgC;QACjC,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3F,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { pathToFileURL } from \"url\";\n\nexport type ClipboardModule = {\n\tsetText: (text: string) => Promise<void>;\n\tgetText: () => Promise<string>;\n\thasImage: () => boolean;\n\tgetImageBinary: () => Promise<Array<number>>;\n};\n\ntype ClipboardRequire = (id: string) => unknown;\n\nconst moduleRequire = createRequire(import.meta.url);\nconst executableDirRequire = createRequire(pathToFileURL(join(dirname(process.execPath), \"package.json\")).href);\nconst hasDisplay = process.platform !== \"linux\" || Boolean(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);\n\nexport function loadClipboardNative(\n\trequires: readonly ClipboardRequire[] = [moduleRequire, executableDirRequire],\n): ClipboardModule | null {\n\tfor (const requireClipboard of requires) {\n\t\ttry {\n\t\t\treturn requireClipboard(\"@mariozechner/clipboard\") as ClipboardModule;\n\t\t} catch {\n\t\t\t// Try the next resolution root.\n\t\t}\n\t}\n\treturn null;\n}\n\nconst clipboard = !process.env.TERMUX_VERSION && hasDisplay ? loadClipboardNative() : null;\n\nexport { clipboard };\n"]}
1
+ {"version":3,"file":"clipboard-native.js","sourceRoot":"","sources":["../../src/utils/clipboard-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAapC,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,MAAM,oBAAoB,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAChH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAE/G,MAAM,UAAU,mBAAmB,CAClC,QAAQ,GAAgC,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE7E,KAAK,MAAM,gBAAgB,IAAI,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC;YACJ,OAAO,gBAAgB,CAAC,yBAAyB,CAAoB,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACR,gCAAgC;QACjC,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3F,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport { pathToFileURL } from \"url\";\n\nexport type ClipboardModule = {\n\tsetText: (text: string) => Promise<void>;\n\tgetText: () => Promise<string>;\n\thasImage: () => boolean;\n\tgetImageBinary: () => Promise<Array<number>>;\n\t/** Pasteboard types on the clipboard, such as `public.file-url`. Absent from older module versions. */\n\tavailableFormats?: () => string[];\n};\n\ntype ClipboardRequire = (id: string) => unknown;\n\nconst moduleRequire = createRequire(import.meta.url);\nconst executableDirRequire = createRequire(pathToFileURL(join(dirname(process.execPath), \"package.json\")).href);\nconst hasDisplay = process.platform !== \"linux\" || Boolean(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);\n\nexport function loadClipboardNative(\n\trequires: readonly ClipboardRequire[] = [moduleRequire, executableDirRequire],\n): ClipboardModule | null {\n\tfor (const requireClipboard of requires) {\n\t\ttry {\n\t\t\treturn requireClipboard(\"@mariozechner/clipboard\") as ClipboardModule;\n\t\t} catch {\n\t\t\t// Try the next resolution root.\n\t\t}\n\t}\n\treturn null;\n}\n\nconst clipboard = !process.env.TERMUX_VERSION && hasDisplay ? loadClipboardNative() : null;\n\nexport { clipboard };\n"]}
@@ -1,5 +1,12 @@
1
+ import { type ClipboardModule } from "./clipboard-native.ts";
1
2
  export declare function readClipboardText(source?: {
2
3
  getText(): Promise<string>;
3
4
  } | null): Promise<string | null>;
5
+ /**
6
+ * Read file paths, such as Finder file copies, from the macOS clipboard. The native clipboard
7
+ * module reports whether file URLs are present; AppKit is read through JavaScript for Automation
8
+ * only then, because the module cannot read file URLs itself.
9
+ */
10
+ export declare function readClipboardFilePaths(source?: Pick<ClipboardModule, "availableFormats"> | null, currentPlatform?: NodeJS.Platform): Promise<string[] | null>;
4
11
  export declare function copyToClipboard(text: string): Promise<void>;
5
12
  //# sourceMappingURL=clipboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AA4EA,wBAAsB,iBAAiB,CACtC,MAAM,GAAE;IAAE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAgB,GACvD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIjE"}
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAqExE,wBAAsB,iBAAiB,CACtC,MAAM,GAAE;IAAE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAgB,GACvD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAeD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,GAAE,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAgB,EACpE,eAAe,GAAE,MAAM,CAAC,QAA2B,GACjD,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAqB1B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIjE"}
@@ -1,4 +1,4 @@
1
- import { execFileSync, execSync, spawn } from "child_process";
1
+ import { execFile, execFileSync, execSync, spawn } from "child_process";
2
2
  import { randomUUID } from "crypto";
3
3
  import { unlinkSync, writeFileSync } from "fs";
4
4
  import { platform, tmpdir } from "os";
@@ -76,6 +76,42 @@ export async function readClipboardText(source = clipboard) {
76
76
  return null;
77
77
  }
78
78
  }
79
+ /** Pasteboard type that Finder and other macOS apps publish for copied files. */
80
+ const FILE_URL_PASTEBOARD_TYPE = "public.file-url";
81
+ /** Prints the POSIX paths of the file URLs on the general pasteboard as a JSON array. */
82
+ const READ_FILE_URLS_SCRIPT = `ObjC.import("AppKit");
83
+ const urls = $.NSPasteboard.generalPasteboard.readObjectsForClassesOptions(
84
+ $.NSArray.arrayWithObject($.NSURL),
85
+ $.NSDictionary.dictionaryWithObjectForKey($.NSNumber.numberWithBool(true), $.NSPasteboardURLReadingFileURLsOnlyKey)
86
+ );
87
+ const paths = [];
88
+ for (let i = 0; i < urls.count; i++) paths.push(ObjC.unwrap(urls.objectAtIndex(i).path));
89
+ JSON.stringify(paths);`;
90
+ /**
91
+ * Read file paths, such as Finder file copies, from the macOS clipboard. The native clipboard
92
+ * module reports whether file URLs are present; AppKit is read through JavaScript for Automation
93
+ * only then, because the module cannot read file URLs itself.
94
+ */
95
+ export async function readClipboardFilePaths(source = clipboard, currentPlatform = process.platform) {
96
+ if (currentPlatform !== "darwin" || !source?.availableFormats?.().includes(FILE_URL_PASTEBOARD_TYPE))
97
+ return null;
98
+ const stdout = await new Promise((resolve, reject) => {
99
+ execFile("osascript", ["-l", "JavaScript", "-e", READ_FILE_URLS_SCRIPT], { timeout: 5000, env: createChildProcessEnvironment() }, (error, output, stderr) => {
100
+ if (error) {
101
+ // The default error message repeats the whole script; report what osascript printed instead.
102
+ const detail = stderr.trim();
103
+ reject(new Error(`osascript could not read the copied files${detail ? `: ${detail}` : ""}`));
104
+ }
105
+ else
106
+ resolve(output);
107
+ });
108
+ });
109
+ const paths = JSON.parse(stdout);
110
+ if (!Array.isArray(paths) || paths.some((path) => typeof path !== "string")) {
111
+ throw new Error("Unexpected clipboard file path output");
112
+ }
113
+ return paths.length > 0 ? paths : null;
114
+ }
79
115
  export async function copyToClipboard(text) {
80
116
  let copied = false;
81
117
  const p = platform();