pi-ui-extend 0.1.8 → 0.1.11

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 (191) hide show
  1. package/README.md +57 -2
  2. package/bin/pix.mjs +4 -4
  3. package/dist/app/app.d.ts +4 -0
  4. package/dist/app/app.js +112 -45
  5. package/dist/app/{cli.d.ts → cli/cli.d.ts} +1 -1
  6. package/dist/app/{cli.js → cli/cli.js} +1 -1
  7. package/dist/app/{install.d.ts → cli/install.d.ts} +2 -0
  8. package/dist/app/{install.js → cli/install.js} +18 -3
  9. package/dist/app/{command-controller.d.ts → commands/command-controller.d.ts} +1 -1
  10. package/dist/app/{command-controller.js → commands/command-controller.js} +4 -0
  11. package/dist/app/{command-host.d.ts → commands/command-host.d.ts} +7 -3
  12. package/dist/app/{command-model-actions.d.ts → commands/command-model-actions.d.ts} +6 -1
  13. package/dist/app/{command-model-actions.js → commands/command-model-actions.js} +106 -2
  14. package/dist/app/{command-navigation-actions.d.ts → commands/command-navigation-actions.d.ts} +7 -2
  15. package/dist/app/{command-navigation-actions.js → commands/command-navigation-actions.js} +42 -19
  16. package/dist/app/{command-registry.d.ts → commands/command-registry.d.ts} +5 -1
  17. package/dist/app/{command-registry.js → commands/command-registry.js} +32 -0
  18. package/dist/app/{command-runtime.js → commands/command-runtime.js} +1 -1
  19. package/dist/app/{command-session-actions.d.ts → commands/command-session-actions.d.ts} +1 -0
  20. package/dist/app/{command-session-actions.js → commands/command-session-actions.js} +18 -8
  21. package/dist/app/{shell-controller.d.ts → commands/shell-controller.d.ts} +2 -1
  22. package/dist/app/{shell-controller.js → commands/shell-controller.js} +2 -2
  23. package/dist/app/{slash-commands.d.ts → commands/slash-commands.d.ts} +2 -2
  24. package/dist/app/{slash-commands.js → commands/slash-commands.js} +1 -1
  25. package/dist/app/constants.d.ts +1 -1
  26. package/dist/app/constants.js +1 -1
  27. package/dist/app/{extension-actions-controller.d.ts → extensions/extension-actions-controller.d.ts} +1 -1
  28. package/dist/app/{extension-actions-controller.js → extensions/extension-actions-controller.js} +1 -1
  29. package/dist/app/{extension-ui-controller.d.ts → extensions/extension-ui-controller.d.ts} +3 -3
  30. package/dist/app/{extension-ui-controller.js → extensions/extension-ui-controller.js} +3 -3
  31. package/dist/app/icons.js +1 -1
  32. package/dist/app/input/autocomplete-controller.d.ts +52 -0
  33. package/dist/app/input/autocomplete-controller.js +352 -0
  34. package/dist/app/{input-action-controller.d.ts → input/input-action-controller.d.ts} +8 -7
  35. package/dist/app/{input-action-controller.js → input/input-action-controller.js} +24 -3
  36. package/dist/app/{input-controller.d.ts → input/input-controller.d.ts} +4 -3
  37. package/dist/app/{input-controller.js → input/input-controller.js} +3 -1
  38. package/dist/app/{input-paste-handler.d.ts → input/input-paste-handler.d.ts} +2 -1
  39. package/dist/app/{input-paste-handler.js → input/input-paste-handler.js} +25 -21
  40. package/dist/app/{native-modifiers.js → input/native-modifiers.js} +2 -2
  41. package/dist/app/{prompt-enhancer-controller.d.ts → input/prompt-enhancer-controller.d.ts} +5 -5
  42. package/dist/app/{prompt-enhancer-controller.js → input/prompt-enhancer-controller.js} +3 -3
  43. package/dist/app/{voice-controller.d.ts → input/voice-controller.d.ts} +3 -1
  44. package/dist/app/{voice-controller.js → input/voice-controller.js} +29 -17
  45. package/dist/app/{model-ref.d.ts → model/model-ref.d.ts} +1 -1
  46. package/dist/app/{model-ref.js → model/model-ref.js} +1 -1
  47. package/dist/app/{model-usage-controller.js → model/model-usage-controller.js} +1 -1
  48. package/dist/app/{model-usage-status.d.ts → model/model-usage-status.d.ts} +10 -1
  49. package/dist/app/{model-usage-status.js → model/model-usage-status.js} +125 -35
  50. package/dist/app/{menu-items-controller.d.ts → popup/menu-items-controller.d.ts} +4 -4
  51. package/dist/app/{menu-items-controller.js → popup/menu-items-controller.js} +5 -5
  52. package/dist/app/{popup-action-controller.d.ts → popup/popup-action-controller.d.ts} +4 -4
  53. package/dist/app/{popup-action-controller.js → popup/popup-action-controller.js} +3 -3
  54. package/dist/app/{popup-menu-controller.d.ts → popup/popup-menu-controller.d.ts} +4 -4
  55. package/dist/app/{popup-menu-controller.js → popup/popup-menu-controller.js} +7 -7
  56. package/dist/app/process.d.ts +17 -0
  57. package/dist/app/process.js +68 -0
  58. package/dist/app/{conversation-entry-renderer.d.ts → rendering/conversation-entry-renderer.d.ts} +3 -3
  59. package/dist/app/{conversation-entry-renderer.js → rendering/conversation-entry-renderer.js} +20 -9
  60. package/dist/app/{conversation-shell-renderer.d.ts → rendering/conversation-shell-renderer.d.ts} +1 -1
  61. package/dist/app/{conversation-shell-renderer.js → rendering/conversation-shell-renderer.js} +1 -1
  62. package/dist/app/{conversation-tool-renderer.d.ts → rendering/conversation-tool-renderer.d.ts} +3 -3
  63. package/dist/app/{conversation-tool-renderer.js → rendering/conversation-tool-renderer.js} +10 -9
  64. package/dist/app/{conversation-viewport.d.ts → rendering/conversation-viewport.d.ts} +3 -3
  65. package/dist/app/{dcp-stats.js → rendering/dcp-stats.js} +1 -1
  66. package/dist/app/{editor-layout-renderer.d.ts → rendering/editor-layout-renderer.d.ts} +4 -3
  67. package/dist/app/{editor-layout-renderer.js → rendering/editor-layout-renderer.js} +13 -3
  68. package/dist/app/{editor-panels.d.ts → rendering/editor-panels.d.ts} +2 -2
  69. package/dist/app/{editor-panels.js → rendering/editor-panels.js} +4 -4
  70. package/dist/app/{message-content.d.ts → rendering/message-content.d.ts} +1 -1
  71. package/dist/app/{message-content.js → rendering/message-content.js} +66 -8
  72. package/dist/app/{render-controller.d.ts → rendering/render-controller.d.ts} +6 -6
  73. package/dist/app/{render-controller.js → rendering/render-controller.js} +11 -6
  74. package/dist/app/{render-text.d.ts → rendering/render-text.d.ts} +5 -2
  75. package/dist/app/{render-text.js → rendering/render-text.js} +53 -5
  76. package/dist/app/{status-line-renderer.d.ts → rendering/status-line-renderer.d.ts} +8 -4
  77. package/dist/app/{status-line-renderer.js → rendering/status-line-renderer.js} +73 -29
  78. package/dist/app/{tab-line-renderer.d.ts → rendering/tab-line-renderer.d.ts} +3 -3
  79. package/dist/app/{tab-line-renderer.js → rendering/tab-line-renderer.js} +2 -2
  80. package/dist/app/{toast-controller.d.ts → rendering/toast-controller.d.ts} +1 -1
  81. package/dist/app/{toast-controller.js → rendering/toast-controller.js} +2 -2
  82. package/dist/app/{toast-renderer.d.ts → rendering/toast-renderer.d.ts} +3 -3
  83. package/dist/app/{toast-renderer.js → rendering/toast-renderer.js} +3 -3
  84. package/dist/app/{tool-block-renderer.d.ts → rendering/tool-block-renderer.d.ts} +5 -5
  85. package/dist/app/{tool-block-renderer.js → rendering/tool-block-renderer.js} +15 -33
  86. package/dist/app/runtime.d.ts +6 -1
  87. package/dist/app/runtime.js +35 -2
  88. package/dist/app/{blink-controller.js → screen/blink-controller.js} +1 -1
  89. package/dist/app/{clipboard.d.ts → screen/clipboard.d.ts} +2 -2
  90. package/dist/app/{clipboard.js → screen/clipboard.js} +13 -18
  91. package/dist/app/{image-click-targets.d.ts → screen/image-click-targets.d.ts} +2 -2
  92. package/dist/app/{image-opener.d.ts → screen/image-opener.d.ts} +1 -1
  93. package/dist/app/{mouse-controller.d.ts → screen/mouse-controller.d.ts} +17 -10
  94. package/dist/app/{mouse-controller.js → screen/mouse-controller.js} +72 -29
  95. package/dist/app/{screen-selection.d.ts → screen/screen-selection.d.ts} +1 -1
  96. package/dist/app/{screen-styler.d.ts → screen/screen-styler.d.ts} +6 -3
  97. package/dist/app/{screen-styler.js → screen/screen-styler.js} +7 -6
  98. package/dist/app/{scroll-controller.d.ts → screen/scroll-controller.d.ts} +3 -3
  99. package/dist/app/{scroll-controller.js → screen/scroll-controller.js} +1 -1
  100. package/dist/app/{status-controller.d.ts → screen/status-controller.d.ts} +5 -2
  101. package/dist/app/{status-controller.js → screen/status-controller.js} +24 -9
  102. package/dist/app/{queued-message-controller.d.ts → session/queued-message-controller.d.ts} +9 -3
  103. package/dist/app/{queued-message-controller.js → session/queued-message-controller.js} +34 -23
  104. package/dist/app/{request-history.js → session/request-history.js} +2 -2
  105. package/dist/app/session/resume-session-loader.d.ts +15 -0
  106. package/dist/app/session/resume-session-loader.js +204 -0
  107. package/dist/app/{session-event-controller.d.ts → session/session-event-controller.d.ts} +8 -4
  108. package/dist/app/{session-event-controller.js → session/session-event-controller.js} +75 -8
  109. package/dist/app/{session-history.d.ts → session/session-history.d.ts} +1 -1
  110. package/dist/app/{session-history.js → session/session-history.js} +7 -6
  111. package/dist/app/{session-lifecycle-controller.d.ts → session/session-lifecycle-controller.d.ts} +7 -2
  112. package/dist/app/{session-lifecycle-controller.js → session/session-lifecycle-controller.js} +13 -5
  113. package/dist/app/{session-search.d.ts → session/session-search.d.ts} +1 -1
  114. package/dist/app/{session-search.js → session/session-search.js} +3 -3
  115. package/dist/app/{tabs-controller.d.ts → session/tabs-controller.d.ts} +11 -2
  116. package/dist/app/{tabs-controller.js → session/tabs-controller.js} +105 -9
  117. package/dist/app/{subagents-files.d.ts → subagents/subagents-files.d.ts} +1 -1
  118. package/dist/app/{subagents-files.js → subagents/subagents-files.js} +1 -1
  119. package/dist/app/{subagents-model.d.ts → subagents/subagents-model.d.ts} +1 -1
  120. package/dist/app/{subagents-model.js → subagents/subagents-model.js} +4 -4
  121. package/dist/app/{subagents-widget-controller.d.ts → subagents/subagents-widget-controller.d.ts} +1 -1
  122. package/dist/app/{subagents-widget-controller.js → subagents/subagents-widget-controller.js} +2 -2
  123. package/dist/app/{nerd-font-controller.js → terminal/nerd-font-controller.js} +16 -17
  124. package/dist/app/{terminal-bell-sound-controller.js → terminal/terminal-bell-sound-controller.js} +1 -1
  125. package/dist/app/{terminal-controller.d.ts → terminal/terminal-controller.d.ts} +1 -0
  126. package/dist/app/{terminal-controller.js → terminal/terminal-controller.js} +3 -2
  127. package/dist/app/{todo-model.d.ts → todo/todo-model.d.ts} +1 -1
  128. package/dist/app/{todo-model.js → todo/todo-model.js} +3 -3
  129. package/dist/app/{todo-widget-controller.d.ts → todo/todo-widget-controller.d.ts} +1 -1
  130. package/dist/app/{todo-widget-controller.js → todo/todo-widget-controller.js} +2 -2
  131. package/dist/app/types.d.ts +16 -2
  132. package/dist/app/{workspace-actions-controller.d.ts → workspace/workspace-actions-controller.d.ts} +2 -2
  133. package/dist/app/{workspace-actions-controller.js → workspace/workspace-actions-controller.js} +6 -6
  134. package/dist/app/{workspace-undo.d.ts → workspace/workspace-undo.d.ts} +1 -1
  135. package/dist/app/{workspace-undo.js → workspace/workspace-undo.js} +22 -20
  136. package/dist/config.d.ts +27 -0
  137. package/dist/config.js +174 -1
  138. package/dist/default-pix-config.js +38 -353
  139. package/dist/input-editor.d.ts +7 -1
  140. package/dist/input-editor.js +47 -6
  141. package/dist/main.js +2 -2
  142. package/dist/markdown-format.d.ts +1 -0
  143. package/dist/markdown-format.js +26 -1
  144. package/external/pi-tools-suite/README.md +78 -0
  145. package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +4 -0
  146. package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +6 -1
  147. package/external/pi-tools-suite/src/dcp/compression-blocks.ts +1 -0
  148. package/external/pi-tools-suite/src/dcp/prompts.ts +5 -0
  149. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +314 -193
  150. package/external/pi-tools-suite/src/index.ts +1 -0
  151. package/external/pi-tools-suite/src/lib/lsp.ts +2 -1
  152. package/external/pi-tools-suite/src/lsp/_shared/output.ts +8 -7
  153. package/external/pi-tools-suite/src/lsp/manager.ts +4 -4
  154. package/external/pi-tools-suite/src/opencode-import/commands.ts +86 -0
  155. package/external/pi-tools-suite/src/opencode-import/importer.ts +208 -0
  156. package/external/pi-tools-suite/src/opencode-import/index.ts +25 -0
  157. package/external/pi-tools-suite/src/repo-discovery/index.ts +49 -2
  158. package/external/pi-tools-suite/src/todo/tool/response-envelope.ts +9 -1
  159. package/external/pi-tools-suite/src/tool-descriptions.ts +1 -1
  160. package/package.json +1 -1
  161. /package/dist/app/{startup-checks.d.ts → cli/startup-checks.d.ts} +0 -0
  162. /package/dist/app/{startup-checks.js → cli/startup-checks.js} +0 -0
  163. /package/dist/app/{startup-info.d.ts → cli/startup-info.d.ts} +0 -0
  164. /package/dist/app/{startup-info.js → cli/startup-info.js} +0 -0
  165. /package/dist/app/{update.d.ts → cli/update.d.ts} +0 -0
  166. /package/dist/app/{update.js → cli/update.js} +0 -0
  167. /package/dist/app/{command-host.js → commands/command-host.js} +0 -0
  168. /package/dist/app/{command-runtime.d.ts → commands/command-runtime.d.ts} +0 -0
  169. /package/dist/app/{shell-command.d.ts → commands/shell-command.d.ts} +0 -0
  170. /package/dist/app/{shell-command.js → commands/shell-command.js} +0 -0
  171. /package/dist/app/{extension-event-bus.d.ts → extensions/extension-event-bus.d.ts} +0 -0
  172. /package/dist/app/{extension-event-bus.js → extensions/extension-event-bus.js} +0 -0
  173. /package/dist/app/{native-modifiers.d.ts → input/native-modifiers.d.ts} +0 -0
  174. /package/dist/app/{terminal-edit-shortcuts.d.ts → input/terminal-edit-shortcuts.d.ts} +0 -0
  175. /package/dist/app/{terminal-edit-shortcuts.js → input/terminal-edit-shortcuts.js} +0 -0
  176. /package/dist/app/{model-usage-controller.d.ts → model/model-usage-controller.d.ts} +0 -0
  177. /package/dist/app/{conversation-viewport.js → rendering/conversation-viewport.js} +0 -0
  178. /package/dist/app/{dcp-stats.d.ts → rendering/dcp-stats.d.ts} +0 -0
  179. /package/dist/app/{blink-controller.d.ts → screen/blink-controller.d.ts} +0 -0
  180. /package/dist/app/{file-link-opener.d.ts → screen/file-link-opener.d.ts} +0 -0
  181. /package/dist/app/{file-link-opener.js → screen/file-link-opener.js} +0 -0
  182. /package/dist/app/{file-links.d.ts → screen/file-links.d.ts} +0 -0
  183. /package/dist/app/{file-links.js → screen/file-links.js} +0 -0
  184. /package/dist/app/{image-click-targets.js → screen/image-click-targets.js} +0 -0
  185. /package/dist/app/{image-opener.js → screen/image-opener.js} +0 -0
  186. /package/dist/app/{screen-selection.js → screen/screen-selection.js} +0 -0
  187. /package/dist/app/{request-history.d.ts → session/request-history.d.ts} +0 -0
  188. /package/dist/app/{nerd-font-controller.d.ts → terminal/nerd-font-controller.d.ts} +0 -0
  189. /package/dist/app/{terminal-bell-sound-controller.d.ts → terminal/terminal-bell-sound-controller.d.ts} +0 -0
  190. /package/dist/app/{terminal-output-buffer.d.ts → terminal/terminal-output-buffer.d.ts} +0 -0
  191. /package/dist/app/{terminal-output-buffer.js → terminal/terminal-output-buffer.js} +0 -0
@@ -1,8 +1,8 @@
1
- import { compactProgressBarSegments, formatCompactProgressBar } from "../context-progress-bar.js";
1
+ import { compactProgressBarSegments, formatCompactProgressBar } from "../../context-progress-bar.js";
2
2
  import { padOrTrimPlain } from "./render-text.js";
3
- import { stringDisplayWidth } from "../terminal-width.js";
4
- import { APP_ICONS } from "./icons.js";
5
- import { resolveColor, resolveModelColor } from "../config.js";
3
+ import { stringDisplayWidth } from "../../terminal-width.js";
4
+ import { APP_ICONS } from "../icons.js";
5
+ import { resolveColor, resolveModelColor } from "../../config.js";
6
6
  const MODEL_USAGE_PROGRESS_BAR_WIDTH = stringDisplayWidth(formatCompactProgressBar(100));
7
7
  export class StatusLineRenderer {
8
8
  host;
@@ -13,13 +13,17 @@ export class StatusLineRenderer {
13
13
  const contentWidth = Math.max(1, width);
14
14
  const left = 0;
15
15
  const statusDot = APP_ICONS.record;
16
+ const draftQueueButton = this.draftQueueWidgetText();
16
17
  const userJumpButton = APP_ICONS.user;
17
18
  const thinkingExpandButton = APP_ICONS.thinkingExpanded;
18
19
  const compactToolsButton = APP_ICONS.compactTools;
19
20
  const terminalBellSoundWidgetText = this.host.terminalBellSoundStatusWidgetText();
20
21
  const promptEnhancerWidgetText = this.host.promptEnhancerStatusWidgetText();
21
22
  const voiceWidgetText = this.host.voiceStatusWidgetText();
22
- const rightWidgetText = [userJumpButton, terminalBellSoundWidgetText, thinkingExpandButton, compactToolsButton, promptEnhancerWidgetText, voiceWidgetText].filter((text) => text.length > 0).join(" ");
23
+ const rightWidgetParts = draftQueueButton.length > 0
24
+ ? [draftQueueButton, promptEnhancerWidgetText, userJumpButton, terminalBellSoundWidgetText, thinkingExpandButton, compactToolsButton, voiceWidgetText]
25
+ : [userJumpButton, terminalBellSoundWidgetText, thinkingExpandButton, compactToolsButton, promptEnhancerWidgetText, voiceWidgetText];
26
+ const rightWidgetText = rightWidgetParts.filter((text) => text.length > 0).join(" ");
23
27
  const rightWidgetWidth = stringDisplayWidth(rightWidgetText);
24
28
  const leftWidth = rightWidgetWidth > 0 && contentWidth > rightWidgetWidth + 1 ? contentWidth - rightWidgetWidth - 1 : contentWidth;
25
29
  const baseStatus = this.host.currentStatus();
@@ -34,37 +38,60 @@ export class StatusLineRenderer {
34
38
  const innerText = leftWidth < contentWidth ? `${leftText} ${rightWidgetText}` : padOrTrimPlain(leftText, contentWidth);
35
39
  const text = padOrTrimPlain(innerText, width);
36
40
  let nextWidgetStartColumn = left + leftWidth + 2;
37
- const userJumpWidget = leftWidth < contentWidth
38
- ? this.widgetLayout(nextWidgetStartColumn, userJumpButton)
41
+ let draftQueueWidget = leftWidth < contentWidth && draftQueueButton.length > 0
42
+ ? this.widgetLayout(nextWidgetStartColumn, draftQueueButton)
39
43
  : undefined;
40
- if (userJumpWidget)
41
- nextWidgetStartColumn = userJumpWidget.endColumn + 1;
42
- const terminalBellSoundWidget = leftWidth < contentWidth && terminalBellSoundWidgetText.length > 0
43
- ? this.widgetLayout(nextWidgetStartColumn, terminalBellSoundWidgetText)
44
- : undefined;
45
- if (terminalBellSoundWidget)
46
- nextWidgetStartColumn = terminalBellSoundWidget.endColumn + 1;
47
- const thinkingExpandWidget = leftWidth < contentWidth
48
- ? this.widgetLayout(nextWidgetStartColumn, thinkingExpandButton)
49
- : undefined;
50
- if (thinkingExpandWidget)
51
- nextWidgetStartColumn = thinkingExpandWidget.endColumn + 1;
52
- const compactToolsWidget = leftWidth < contentWidth
53
- ? this.widgetLayout(nextWidgetStartColumn, compactToolsButton)
54
- : undefined;
55
- if (compactToolsWidget)
56
- nextWidgetStartColumn = compactToolsWidget.endColumn + 1;
57
- const promptEnhancerWidget = leftWidth < contentWidth && promptEnhancerWidgetText.length > 0
58
- ? this.widgetLayout(nextWidgetStartColumn, promptEnhancerWidgetText)
59
- : undefined;
60
- if (promptEnhancerWidget)
61
- nextWidgetStartColumn = promptEnhancerWidget.endColumn + 1;
44
+ if (draftQueueWidget)
45
+ nextWidgetStartColumn = draftQueueWidget.endColumn + 1;
46
+ let promptEnhancerWidget;
47
+ let userJumpWidget;
48
+ let terminalBellSoundWidget;
49
+ let thinkingExpandWidget;
50
+ let compactToolsWidget;
51
+ const appendPromptEnhancerWidget = () => {
52
+ promptEnhancerWidget = leftWidth < contentWidth && promptEnhancerWidgetText.length > 0
53
+ ? this.widgetLayout(nextWidgetStartColumn, promptEnhancerWidgetText)
54
+ : undefined;
55
+ if (promptEnhancerWidget)
56
+ nextWidgetStartColumn = promptEnhancerWidget.endColumn + 1;
57
+ };
58
+ const appendCoreStatusWidgets = () => {
59
+ userJumpWidget = leftWidth < contentWidth
60
+ ? this.widgetLayout(nextWidgetStartColumn, userJumpButton)
61
+ : undefined;
62
+ if (userJumpWidget)
63
+ nextWidgetStartColumn = userJumpWidget.endColumn + 1;
64
+ terminalBellSoundWidget = leftWidth < contentWidth && terminalBellSoundWidgetText.length > 0
65
+ ? this.widgetLayout(nextWidgetStartColumn, terminalBellSoundWidgetText)
66
+ : undefined;
67
+ if (terminalBellSoundWidget)
68
+ nextWidgetStartColumn = terminalBellSoundWidget.endColumn + 1;
69
+ thinkingExpandWidget = leftWidth < contentWidth
70
+ ? this.widgetLayout(nextWidgetStartColumn, thinkingExpandButton)
71
+ : undefined;
72
+ if (thinkingExpandWidget)
73
+ nextWidgetStartColumn = thinkingExpandWidget.endColumn + 1;
74
+ compactToolsWidget = leftWidth < contentWidth
75
+ ? this.widgetLayout(nextWidgetStartColumn, compactToolsButton)
76
+ : undefined;
77
+ if (compactToolsWidget)
78
+ nextWidgetStartColumn = compactToolsWidget.endColumn + 1;
79
+ };
80
+ if (draftQueueWidget) {
81
+ appendPromptEnhancerWidget();
82
+ appendCoreStatusWidgets();
83
+ }
84
+ else {
85
+ appendCoreStatusWidgets();
86
+ appendPromptEnhancerWidget();
87
+ }
62
88
  const voiceWidget = leftWidth < contentWidth && voiceWidgetText.length > 0 ? this.voiceWidgetLayout(nextWidgetStartColumn, voiceWidgetText) : undefined;
63
89
  return {
64
90
  details,
65
91
  text,
66
92
  sessionLabel,
67
93
  workspaceLabel,
94
+ ...(draftQueueWidget ? { draftQueueWidget } : {}),
68
95
  ...(userJumpWidget ? { userJumpWidget } : {}),
69
96
  ...(thinkingExpandWidget ? { thinkingExpandWidget } : {}),
70
97
  ...(compactToolsWidget ? { compactToolsWidget } : {}),
@@ -157,6 +184,12 @@ export class StatusLineRenderer {
157
184
  return undefined;
158
185
  return { row, startColumn: widget.startColumn, endColumn: widget.endColumn };
159
186
  }
187
+ draftQueueTarget(layout, row) {
188
+ const widget = layout.draftQueueWidget;
189
+ if (!widget)
190
+ return undefined;
191
+ return { row, startColumn: widget.startColumn, endColumn: widget.endColumn };
192
+ }
160
193
  thinkingExpandTarget(layout, row) {
161
194
  const widget = layout.thinkingExpandWidget;
162
195
  if (!widget)
@@ -195,6 +228,7 @@ export class StatusLineRenderer {
195
228
  end: statusDotStart + APP_ICONS.record.length,
196
229
  foreground: this.statusDotColor(),
197
230
  }] : [];
231
+ this.pushDraftQueueWidgetSegment(segments, statusText);
198
232
  this.pushUserJumpWidgetSegment(segments, statusText);
199
233
  this.pushThinkingExpandWidgetSegment(segments, statusText);
200
234
  this.pushCompactToolsWidgetSegment(segments, statusText);
@@ -248,6 +282,16 @@ export class StatusLineRenderer {
248
282
  : this.host.theme.colors.muted;
249
283
  this.pushSegment(segments, start, buttonText.length, foreground);
250
284
  }
285
+ pushDraftQueueWidgetSegment(segments, statusText) {
286
+ const buttonText = this.draftQueueWidgetText();
287
+ const start = statusText.indexOf(buttonText);
288
+ if (start < 0 || buttonText.length <= 0)
289
+ return;
290
+ this.pushSegment(segments, start, buttonText.length, this.host.theme.colors.info);
291
+ }
292
+ draftQueueWidgetText() {
293
+ return this.host.queueableInputActive?.() ? APP_ICONS.timerSand : "";
294
+ }
251
295
  pushThinkingExpandWidgetSegment(segments, statusText) {
252
296
  const buttonText = APP_ICONS.thinkingExpanded;
253
297
  const start = statusText.indexOf(buttonText);
@@ -1,6 +1,6 @@
1
- import type { Theme } from "../theme.js";
2
- import type { ScreenStyler } from "./screen-styler.js";
3
- import type { SessionTab, TabLineLayout } from "./types.js";
1
+ import type { Theme } from "../../theme.js";
2
+ import type { ScreenStyler } from "../screen/screen-styler.js";
3
+ import type { SessionTab, TabLineLayout } from "../types.js";
4
4
  export type TabLineRendererHost = {
5
5
  readonly theme: Theme;
6
6
  readonly screenStyler: ScreenStyler;
@@ -1,5 +1,5 @@
1
- import { stringDisplayWidth } from "../terminal-width.js";
2
- import { APP_ICONS } from "./icons.js";
1
+ import { stringDisplayWidth } from "../../terminal-width.js";
2
+ import { APP_ICONS } from "../icons.js";
3
3
  import { ellipsizeDisplay } from "./render-text.js";
4
4
  const TAB_SEPARATOR = " │ ";
5
5
  const EMPTY_NEW_TAB_PREFIX = "│ ";
@@ -1,4 +1,4 @@
1
- import { Toast, type ToastKind, type ToastVariant } from "../ui.js";
1
+ import { Toast, type ToastKind, type ToastVariant } from "../../ui.js";
2
2
  export type AppToastControllerHost = {
3
3
  render(): void;
4
4
  };
@@ -1,5 +1,5 @@
1
- import { Toast } from "../ui.js";
2
- import { TOAST_DURATION_MS } from "./constants.js";
1
+ import { Toast } from "../../ui.js";
2
+ import { TOAST_DURATION_MS } from "../constants.js";
3
3
  export class AppToastController {
4
4
  host;
5
5
  toast = new Toast();
@@ -1,6 +1,6 @@
1
- import { type Theme } from "../theme.js";
2
- import type { ToastEntry } from "../ui.js";
3
- import type { ToastLineTarget } from "./types.js";
1
+ import { type Theme } from "../../theme.js";
2
+ import type { ToastEntry } from "../../ui.js";
3
+ import type { ToastLineTarget } from "../types.js";
4
4
  export type ToastOverlay = {
5
5
  id: number;
6
6
  row: number;
@@ -1,6 +1,6 @@
1
- import { colorLine } from "../theme.js";
2
- import { stringDisplayWidth, wrapDisplayLine } from "../terminal-width.js";
3
- import { APP_ICONS } from "./icons.js";
1
+ import { colorLine } from "../../theme.js";
2
+ import { stringDisplayWidth, wrapDisplayLine } from "../../terminal-width.js";
3
+ import { APP_ICONS } from "../icons.js";
4
4
  import { padOrTrimPlain, sanitizeText } from "./render-text.js";
5
5
  export function renderToastOverlays(states, width, maxRows, theme) {
6
6
  if (maxRows <= 0)
@@ -1,8 +1,8 @@
1
- import { type ResolvedToolRule } from "../config.js";
2
- import type { ToolBodySyntaxHighlights } from "../syntax-highlight.js";
3
- import type { Theme } from "../theme.js";
4
- import type { RenderedLine } from "./types.js";
5
- import type { ToolBodyLineStyle, ToolHeaderSegment } from "../tool-renderers/types.js";
1
+ import { type ResolvedToolRule } from "../../config.js";
2
+ import type { ToolBodySyntaxHighlights } from "../../syntax-highlight.js";
3
+ import type { Theme } from "../../theme.js";
4
+ import type { RenderedLine } from "../types.js";
5
+ import type { ToolBodyLineStyle, ToolHeaderSegment } from "../../tool-renderers/types.js";
6
6
  export type ToolBlockEntry = {
7
7
  id: string;
8
8
  toolName: string;
@@ -1,12 +1,12 @@
1
- import { resolveColor } from "../config.js";
2
- import { expandTabs, sliceByDisplayWidth, stringDisplayWidth, wrapDisplayLineByWords } from "../terminal-width.js";
3
- import { hasToolLspDiagnosticsAfterMutation, sanitizeText, toolStatusIcon, toolStatusIconColor, wrapLine } from "./render-text.js";
1
+ import { resolveColor } from "../../config.js";
2
+ import { expandTabs, sliceByDisplayWidth, stringDisplayWidth, wrapDisplayLineByWords } from "../../terminal-width.js";
3
+ import { alertIconPrefixLength, hasToolLspDiagnosticsAfterMutation, lspDiagnosticSeverityForLine, sanitizeText, toolStatusIcon, toolStatusIconColor, wrapLine } from "./render-text.js";
4
4
  const TRUNCATED_PREVIEW_MARKER = "… ";
5
5
  export function renderToolBlock(entry, rule, width, colors, options = {}) {
6
6
  if (rule.hidden)
7
7
  return [];
8
8
  const hasLspDiagnostics = hasToolLspDiagnosticsAfterMutation(entry);
9
- const expanded = entry.expanded && !options.superCompact;
9
+ const expanded = entry.expanded;
10
10
  const stateIcon = toolStatusIcon(entry);
11
11
  const toolColor = resolveColor(rule.color, colors);
12
12
  const toolOutputColor = colors.statusForeground;
@@ -31,7 +31,7 @@ export function renderToolBlock(entry, rule, width, colors, options = {}) {
31
31
  headerLines.push(...renderToolBodyLines(entry.expandedText, width, target, toolOutputColor, entry.bodyStyle, colors, entry.syntaxHighlight, entry.bodyWrap, hasLspDiagnostics, entry.bodyLineStyles, entry.preserveAnsi));
32
32
  return headerLines;
33
33
  }
34
- if (rule.compactHidden || rule.defaultExpanded === true)
34
+ if (rule.compactHidden || (rule.defaultExpanded === true && !options.superCompact))
35
35
  return headerLines;
36
36
  const body = entry.collapsedBody.trimEnd();
37
37
  if (!body || rule.previewLines === 0)
@@ -111,7 +111,10 @@ function renderToolBodyLines(text, width, target, color, style, colors, syntaxHi
111
111
  segment.bold = diffStyle.bold;
112
112
  line.segments = [segment];
113
113
  }
114
- else if (lspDiagnosticStyle) {
114
+ else if (lspDiagnosticStyle?.kind === "alert" && wrapIndex === 0) {
115
+ line.segments = [{ start: 2, end: 2 + lspDiagnosticStyle.length, foreground: colors.warning, bold: true }];
116
+ }
117
+ else if (lspDiagnosticStyle?.kind === "severity") {
115
118
  line.segments = [{ start: 2, end: line.text.length, foreground: lspDiagnosticStyle.foreground }];
116
119
  }
117
120
  else if (bodyLineStyle && line.text.length > 2) {
@@ -348,37 +351,16 @@ function bodyLineStyleForLine(styles, lineIndex, colors) {
348
351
  return resolvedForeground ? { ...segment, foreground: resolvedForeground } : segment;
349
352
  }
350
353
  function lspDiagnosticLineStyle(line, colors) {
354
+ const alertLength = alertIconPrefixLength(line);
355
+ if (alertLength != null)
356
+ return { kind: "alert", length: alertLength };
351
357
  const severity = lspDiagnosticSeverityForLine(line);
352
358
  if (severity === "error")
353
- return { foreground: colors.error };
359
+ return { kind: "severity", foreground: colors.error };
354
360
  if (severity === "warning")
355
- return { foreground: colors.warning };
361
+ return { kind: "severity", foreground: colors.warning };
356
362
  if (severity === "hint")
357
- return { foreground: colors.muted };
358
- return undefined;
359
- }
360
- function lspDiagnosticSeverityForLine(line) {
361
- const countSeverity = lspDiagnosticCountSeverity(line);
362
- if (countSeverity)
363
- return countSeverity;
364
- const severityMatch = /(?:^|[^\p{L}\p{N}_])(?:diagnosticseverity\.)?(errors?|warnings?|warn|hints?)(?=$|[^\p{L}\p{N}_])/iu.exec(line);
365
- const severity = severityMatch?.[1]?.toLowerCase();
366
- if (!severity)
367
- return undefined;
368
- if (severity.startsWith("error"))
369
- return "error";
370
- if (severity.startsWith("warn"))
371
- return "warning";
372
- return "hint";
373
- }
374
- function lspDiagnosticCountSeverity(line) {
375
- const counts = [...line.matchAll(/\b(\d+)\s+(errors?|warnings?|hints?)\b/giu)];
376
- if (counts.length === 0)
377
- return undefined;
378
- for (const severity of ["error", "warning", "hint"]) {
379
- if (counts.some((match) => Number(match[1]) > 0 && match[2]?.toLowerCase().startsWith(severity)))
380
- return severity;
381
- }
363
+ return { kind: "severity", foreground: colors.muted };
382
364
  return undefined;
383
365
  }
384
366
  function syntaxHighlightForLine(highlights, lineIndex) {
@@ -1,4 +1,5 @@
1
- import { type EventBus, type AgentSessionRuntime, type LoadExtensionsResult } from "@earendil-works/pi-coding-agent";
1
+ import { SessionManager, type EventBus, type AgentSessionRuntime, type LoadExtensionsResult, type SessionEntry } from "@earendil-works/pi-coding-agent";
2
+ import { type PixConfig } from "../config.js";
2
3
  import type { AppOptions } from "./types.js";
3
4
  export type PiToolsSuiteInstallAction = "installed" | "already-installed" | "existing-kept" | "missing-source";
4
5
  export type PiToolsSuiteInstallResult = {
@@ -36,4 +37,8 @@ export declare function prioritizeBundledQuestionExtension(base: LoadExtensionsR
36
37
  export type CreatePixRuntimeOptions = {
37
38
  eventBus?: EventBus;
38
39
  };
40
+ type RuntimeSessionManagerModelState = Pick<SessionManager, "getEntries" | "getBranch">;
41
+ export declare function resolvePixRuntimeModelRef(options: Pick<AppOptions, "modelRef">, sessionManager: RuntimeSessionManagerModelState, config?: PixConfig): string | undefined;
42
+ export declare function resolveSessionModelRefFromTail(entries: readonly SessionEntry[]): string | undefined;
39
43
  export declare function createPixRuntime(options: AppOptions, runtimeOptions?: CreatePixRuntimeOptions): Promise<AgentSessionRuntime>;
44
+ export {};
@@ -4,8 +4,9 @@ import { homedir } from "node:os";
4
4
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, getAgentDir, SessionManager, } from "@earendil-works/pi-coding-agent";
7
+ import { loadPixConfig, resolveDefaultModelRef } from "../config.js";
7
8
  import { PI_FAVORITE_MODEL_REFS } from "./constants.js";
8
- import { parseModelRef, parseScopedModelRef } from "./model-ref.js";
9
+ import { isThinkingLevel, parseModelRef, parseScopedModelRef } from "./model/model-ref.js";
9
10
  const BUNDLED_QUESTION_EXTENSION_NAME = "question";
10
11
  const PI_TOOLS_SUITE_EXTENSION_NAME = "pi-tools-suite";
11
12
  const BUNDLED_EXTENSIONS_DIR = resolve(dirname(fileURLToPath(import.meta.url)), "../..", "extensions");
@@ -131,10 +132,42 @@ function isBundledQuestionConflict(error, bundledExtensionPaths) {
131
132
  }
132
133
  return false;
133
134
  }
135
+ export function resolvePixRuntimeModelRef(options, sessionManager, config = loadPixConfig()) {
136
+ if (options.modelRef)
137
+ return options.modelRef;
138
+ const existingEntryCount = sessionManager.getEntries().length;
139
+ if (existingEntryCount > 0)
140
+ return resolveSessionModelRefFromTail(sessionManager.getBranch());
141
+ return resolveDefaultModelRef(config);
142
+ }
143
+ export function resolveSessionModelRefFromTail(entries) {
144
+ let modelRef;
145
+ let thinkingLevel;
146
+ for (let index = entries.length - 1; index >= 0 && (modelRef === undefined || thinkingLevel === undefined); index--) {
147
+ const entry = entries[index];
148
+ if (!entry)
149
+ continue;
150
+ if (thinkingLevel === undefined && entry.type === "thinking_level_change" && isThinkingLevel(entry.thinkingLevel)) {
151
+ thinkingLevel = entry.thinkingLevel;
152
+ }
153
+ if (modelRef !== undefined)
154
+ continue;
155
+ if (entry.type === "model_change") {
156
+ modelRef = `${entry.provider}/${entry.modelId}`;
157
+ }
158
+ else if (entry.type === "message" && entry.message.role === "assistant") {
159
+ modelRef = `${entry.message.provider}/${entry.message.model}`;
160
+ }
161
+ }
162
+ if (!modelRef)
163
+ return undefined;
164
+ return thinkingLevel ? `${modelRef}:${thinkingLevel}` : modelRef;
165
+ }
134
166
  export async function createPixRuntime(options, runtimeOptions = {}) {
135
- const parsedModel = options.modelRef ? parseModelRef(options.modelRef) : undefined;
136
167
  const agentDir = getAgentDir();
137
168
  const createRuntime = async ({ cwd, sessionManager, sessionStartEvent }) => {
169
+ const effectiveModelRef = resolvePixRuntimeModelRef(options, sessionManager);
170
+ const parsedModel = effectiveModelRef ? parseModelRef(effectiveModelRef) : undefined;
138
171
  await ensureBundledSkillsInstalled();
139
172
  await ensurePiToolsSuiteExtensionInstalled({ agentDir });
140
173
  const bundledExtensionPaths = getBundledExtensionPaths();
@@ -1,4 +1,4 @@
1
- import { STATUS_BLINK_INTERVAL_MS } from "./constants.js";
1
+ import { STATUS_BLINK_INTERVAL_MS } from "../constants.js";
2
2
  export class AppBlinkController {
3
3
  host;
4
4
  consumers = new Map();
@@ -1,4 +1,4 @@
1
- export declare function copyTextToClipboard(text: string): void;
2
- export declare function clipboardSupportAvailable(env?: NodeJS.ProcessEnv): boolean;
1
+ export declare function copyTextToClipboard(text: string): Promise<void>;
2
+ export declare function clipboardSupportAvailable(env?: NodeJS.ProcessEnv): Promise<boolean>;
3
3
  export declare function clipboardInstallHint(): string;
4
4
  export declare function osc52ClipboardSequence(text: string, env?: NodeJS.ProcessEnv): string;
@@ -1,22 +1,24 @@
1
- import { spawnSync } from "node:child_process";
2
1
  import { createRequire } from "node:module";
2
+ import { commandExists, runProcess } from "../process.js";
3
3
  const require = createRequire(import.meta.url);
4
- export function copyTextToClipboard(text) {
4
+ export async function copyTextToClipboard(text) {
5
5
  const commands = clipboardCommands();
6
6
  for (const [command, args] of commands) {
7
- const result = spawnSync(command, args, { input: text, stdio: ["pipe", "ignore", "ignore"] });
7
+ const result = await runProcess(command, args, { input: text, maxBufferBytes: 1024 });
8
8
  if (!result.error && result.status === 0)
9
9
  return;
10
10
  }
11
- if (copyWithNativeClipboard(text))
11
+ if (await copyWithNativeClipboard(text))
12
12
  return;
13
13
  if (copyWithOsc52(text))
14
14
  return;
15
15
  throw new Error(`No clipboard command found. ${clipboardInstallHint()}`);
16
16
  }
17
- export function clipboardSupportAvailable(env = process.env) {
18
- if (clipboardCommands().some(([command]) => commandExists(command, env)))
19
- return true;
17
+ export async function clipboardSupportAvailable(env = process.env) {
18
+ for (const [command] of clipboardCommands()) {
19
+ if (await commandExists(command, env))
20
+ return true;
21
+ }
20
22
  return resolveNativeClipboardEntrypoint() !== undefined;
21
23
  }
22
24
  export function clipboardInstallHint() {
@@ -44,7 +46,7 @@ function clipboardCommands() {
44
46
  ];
45
47
  }
46
48
  }
47
- function copyWithNativeClipboard(text) {
49
+ async function copyWithNativeClipboard(text) {
48
50
  const entrypoint = resolveNativeClipboardEntrypoint();
49
51
  if (!entrypoint)
50
52
  return false;
@@ -55,10 +57,10 @@ function copyWithNativeClipboard(text) {
55
57
  const clipboard = require(${JSON.stringify(entrypoint)});
56
58
  await clipboard.setText(readFileSync(0, "utf8"));
57
59
  `;
58
- const result = spawnSync(process.execPath, ["--input-type=module", "-e", script], {
60
+ const result = await runProcess(process.execPath, ["--input-type=module", "-e", script], {
59
61
  input: text,
60
- stdio: ["pipe", "ignore", "ignore"],
61
- timeout: 3_000,
62
+ timeoutMs: 3_000,
63
+ maxBufferBytes: 1024,
62
64
  });
63
65
  return !result.error && result.status === 0;
64
66
  }
@@ -84,10 +86,3 @@ function resolveNativeClipboardEntrypoint() {
84
86
  return undefined;
85
87
  }
86
88
  }
87
- function commandExists(command, env) {
88
- const names = process.platform === "win32" ? [command, command.replace(/\.exe$/iu, ".cmd"), command.replace(/\.exe$/iu, ".bat")] : [command];
89
- return names.some((name) => spawnSync(process.platform === "win32" ? "where" : "sh", process.platform === "win32" ? [name] : ["-lc", `command -v ${shellQuote(name)}`], { env, stdio: "ignore" }).status === 0);
90
- }
91
- function shellQuote(value) {
92
- return `'${value.replaceAll("'", `'\\''`)}'`;
93
- }
@@ -1,5 +1,5 @@
1
- import type { ImageContent } from "../input-editor.js";
2
- import type { RenderedLine, StyledSegment } from "./types.js";
1
+ import type { ImageContent } from "../../input-editor.js";
2
+ import type { RenderedLine, StyledSegment } from "../types.js";
3
3
  type ImageLabelStyle = Omit<StyledSegment, "start" | "end">;
4
4
  export declare function attachImageClickTargets(lines: RenderedLine[], entryId: string, images: readonly ImageContent[] | undefined, style?: ImageLabelStyle): RenderedLine[];
5
5
  export {};
@@ -1,2 +1,2 @@
1
- import type { ImageContent } from "../input-editor.js";
1
+ import type { ImageContent } from "../../input-editor.js";
2
2
  export declare function openImageContent(image: ImageContent): boolean;
@@ -1,12 +1,12 @@
1
- import type { AppCommandController } from "./command-controller.js";
2
- import type { ConversationViewport } from "./conversation-viewport.js";
3
- import type { EditorLayoutRenderer } from "./editor-layout-renderer.js";
4
- import type { ImageContent, InputEditor } from "../input-editor.js";
5
- import type { ToastEntry, ToastVariant } from "../ui.js";
6
- import type { AppPopupActionController } from "./popup-action-controller.js";
7
- import type { AppPopupMenuController } from "./popup-menu-controller.js";
1
+ import type { AppCommandController } from "../commands/command-controller.js";
2
+ import type { ConversationViewport } from "../rendering/conversation-viewport.js";
3
+ import type { EditorLayoutRenderer } from "../rendering/editor-layout-renderer.js";
4
+ import type { ImageContent, InputEditor } from "../../input-editor.js";
5
+ import type { ToastEntry, ToastVariant } from "../../ui.js";
6
+ import type { AppPopupActionController } from "../popup/popup-action-controller.js";
7
+ import type { AppPopupMenuController } from "../popup/popup-menu-controller.js";
8
8
  import type { AppScrollController } from "./scroll-controller.js";
9
- import type { Entry, ImageClickTarget, MouseEvent, MouseSelection, StatusContextTarget, StatusCompactToolsTarget, StatusModelTarget, StatusModelUsageTarget, StatusPromptEnhancerTarget, StatusSessionTarget, StatusTerminalBellSoundTarget, TabLineMouseTarget, StatusThinkingExpandTarget, StatusThinkingTarget, StatusUserJumpTarget, StatusVoiceLanguageTarget, StatusVoiceMicTarget } from "./types.js";
9
+ import type { Entry, ImageClickTarget, MouseEvent, MouseSelection, StatusContextTarget, StatusCompactToolsTarget, StatusDraftQueueTarget, StatusModelTarget, StatusModelUsageTarget, StatusPromptEnhancerTarget, StatusSessionTarget, StatusTerminalBellSoundTarget, TabLineMouseTarget, StatusThinkingExpandTarget, StatusThinkingTarget, StatusUserJumpTarget, StatusVoiceLanguageTarget, StatusVoiceMicTarget } from "../types.js";
10
10
  import { type RenderedLink } from "./file-links.js";
11
11
  import type { AgentSession } from "@earendil-works/pi-coding-agent";
12
12
  type ClickFlash = {
@@ -56,10 +56,11 @@ export type AppMouseControllerHost = {
56
56
  }): void;
57
57
  dismissToast(toastId: number): void;
58
58
  refreshModelUsageStatus(): void | Promise<void>;
59
+ queueInputFromStatus?(): void | Promise<void>;
59
60
  toggleAllThinkingExpanded?(): void;
60
61
  toggleSuperCompactTools?(): void;
61
62
  toggleTerminalBellSound?(): void;
62
- copyTextToClipboard?(text: string): void;
63
+ copyTextToClipboard?(text: string): void | Promise<void>;
63
64
  handleExtensionInputMouse(event: MouseEvent & {
64
65
  localRow: number;
65
66
  localColumn: number;
@@ -91,7 +92,7 @@ export declare class AppMouseController {
91
92
  } | {
92
93
  kind: "queue-message";
93
94
  id: string;
94
- } | import("./types.js").ToastLineTarget | undefined>;
95
+ } | import("../types.js").ToastLineTarget | undefined>;
95
96
  readonly renderedRowTexts: Map<number, string>;
96
97
  readonly renderedRowBackgrounds: Map<number, string>;
97
98
  readonly renderedImageTargets: Map<number, readonly ImageClickTarget[]>;
@@ -100,6 +101,7 @@ export declare class AppMouseController {
100
101
  statusContextTarget: StatusContextTarget | undefined;
101
102
  statusModelUsageTarget: StatusModelUsageTarget | undefined;
102
103
  statusUserJumpTarget: StatusUserJumpTarget | undefined;
104
+ statusDraftQueueTarget: StatusDraftQueueTarget | undefined;
103
105
  statusThinkingExpandTarget: StatusThinkingExpandTarget | undefined;
104
106
  statusCompactToolsTarget: StatusCompactToolsTarget | undefined;
105
107
  statusTerminalBellSoundTarget: StatusTerminalBellSoundTarget | undefined;
@@ -117,6 +119,7 @@ export declare class AppMouseController {
117
119
  private autoScrollAccumulator;
118
120
  private autoScrollLastTick;
119
121
  private autoScrollCursorX;
122
+ private leftEdgeReleaseFallbackTimer;
120
123
  private clickFlash;
121
124
  private clickFlashTimer;
122
125
  private clickFlashDirty;
@@ -152,6 +155,7 @@ export declare class AppMouseController {
152
155
  private handleStatusContextClick;
153
156
  private handleStatusModelUsageClick;
154
157
  private handleStatusUserJumpClick;
158
+ private handleStatusDraftQueueClick;
155
159
  private handleStatusThinkingExpandClick;
156
160
  private handleStatusCompactToolsClick;
157
161
  private handleStatusTerminalBellSoundClick;
@@ -165,6 +169,9 @@ export declare class AppMouseController {
165
169
  private openQueueMessageMenu;
166
170
  private copyErrorToast;
167
171
  private handleMouseSelection;
172
+ private finishMouseSelection;
173
+ private updateLeftEdgeReleaseFallback;
174
+ private cancelLeftEdgeReleaseFallback;
168
175
  syncConversationSelectionForRender(startLine: number, bodyHeight: number, topReservedRows: number, width: number): void;
169
176
  private updateSelectionCurrentFromMouse;
170
177
  private getSelectedText;