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.
- package/README.md +57 -2
- package/bin/pix.mjs +4 -4
- package/dist/app/app.d.ts +4 -0
- package/dist/app/app.js +112 -45
- package/dist/app/{cli.d.ts → cli/cli.d.ts} +1 -1
- package/dist/app/{cli.js → cli/cli.js} +1 -1
- package/dist/app/{install.d.ts → cli/install.d.ts} +2 -0
- package/dist/app/{install.js → cli/install.js} +18 -3
- package/dist/app/{command-controller.d.ts → commands/command-controller.d.ts} +1 -1
- package/dist/app/{command-controller.js → commands/command-controller.js} +4 -0
- package/dist/app/{command-host.d.ts → commands/command-host.d.ts} +7 -3
- package/dist/app/{command-model-actions.d.ts → commands/command-model-actions.d.ts} +6 -1
- package/dist/app/{command-model-actions.js → commands/command-model-actions.js} +106 -2
- package/dist/app/{command-navigation-actions.d.ts → commands/command-navigation-actions.d.ts} +7 -2
- package/dist/app/{command-navigation-actions.js → commands/command-navigation-actions.js} +42 -19
- package/dist/app/{command-registry.d.ts → commands/command-registry.d.ts} +5 -1
- package/dist/app/{command-registry.js → commands/command-registry.js} +32 -0
- package/dist/app/{command-runtime.js → commands/command-runtime.js} +1 -1
- package/dist/app/{command-session-actions.d.ts → commands/command-session-actions.d.ts} +1 -0
- package/dist/app/{command-session-actions.js → commands/command-session-actions.js} +18 -8
- package/dist/app/{shell-controller.d.ts → commands/shell-controller.d.ts} +2 -1
- package/dist/app/{shell-controller.js → commands/shell-controller.js} +2 -2
- package/dist/app/{slash-commands.d.ts → commands/slash-commands.d.ts} +2 -2
- package/dist/app/{slash-commands.js → commands/slash-commands.js} +1 -1
- package/dist/app/constants.d.ts +1 -1
- package/dist/app/constants.js +1 -1
- package/dist/app/{extension-actions-controller.d.ts → extensions/extension-actions-controller.d.ts} +1 -1
- package/dist/app/{extension-actions-controller.js → extensions/extension-actions-controller.js} +1 -1
- package/dist/app/{extension-ui-controller.d.ts → extensions/extension-ui-controller.d.ts} +3 -3
- package/dist/app/{extension-ui-controller.js → extensions/extension-ui-controller.js} +3 -3
- package/dist/app/icons.js +1 -1
- package/dist/app/input/autocomplete-controller.d.ts +52 -0
- package/dist/app/input/autocomplete-controller.js +352 -0
- package/dist/app/{input-action-controller.d.ts → input/input-action-controller.d.ts} +8 -7
- package/dist/app/{input-action-controller.js → input/input-action-controller.js} +24 -3
- package/dist/app/{input-controller.d.ts → input/input-controller.d.ts} +4 -3
- package/dist/app/{input-controller.js → input/input-controller.js} +3 -1
- package/dist/app/{input-paste-handler.d.ts → input/input-paste-handler.d.ts} +2 -1
- package/dist/app/{input-paste-handler.js → input/input-paste-handler.js} +25 -21
- package/dist/app/{native-modifiers.js → input/native-modifiers.js} +2 -2
- package/dist/app/{prompt-enhancer-controller.d.ts → input/prompt-enhancer-controller.d.ts} +5 -5
- package/dist/app/{prompt-enhancer-controller.js → input/prompt-enhancer-controller.js} +3 -3
- package/dist/app/{voice-controller.d.ts → input/voice-controller.d.ts} +3 -1
- package/dist/app/{voice-controller.js → input/voice-controller.js} +29 -17
- package/dist/app/{model-ref.d.ts → model/model-ref.d.ts} +1 -1
- package/dist/app/{model-ref.js → model/model-ref.js} +1 -1
- package/dist/app/{model-usage-controller.js → model/model-usage-controller.js} +1 -1
- package/dist/app/{model-usage-status.d.ts → model/model-usage-status.d.ts} +10 -1
- package/dist/app/{model-usage-status.js → model/model-usage-status.js} +125 -35
- package/dist/app/{menu-items-controller.d.ts → popup/menu-items-controller.d.ts} +4 -4
- package/dist/app/{menu-items-controller.js → popup/menu-items-controller.js} +5 -5
- package/dist/app/{popup-action-controller.d.ts → popup/popup-action-controller.d.ts} +4 -4
- package/dist/app/{popup-action-controller.js → popup/popup-action-controller.js} +3 -3
- package/dist/app/{popup-menu-controller.d.ts → popup/popup-menu-controller.d.ts} +4 -4
- package/dist/app/{popup-menu-controller.js → popup/popup-menu-controller.js} +7 -7
- package/dist/app/process.d.ts +17 -0
- package/dist/app/process.js +68 -0
- package/dist/app/{conversation-entry-renderer.d.ts → rendering/conversation-entry-renderer.d.ts} +3 -3
- package/dist/app/{conversation-entry-renderer.js → rendering/conversation-entry-renderer.js} +20 -9
- package/dist/app/{conversation-shell-renderer.d.ts → rendering/conversation-shell-renderer.d.ts} +1 -1
- package/dist/app/{conversation-shell-renderer.js → rendering/conversation-shell-renderer.js} +1 -1
- package/dist/app/{conversation-tool-renderer.d.ts → rendering/conversation-tool-renderer.d.ts} +3 -3
- package/dist/app/{conversation-tool-renderer.js → rendering/conversation-tool-renderer.js} +10 -9
- package/dist/app/{conversation-viewport.d.ts → rendering/conversation-viewport.d.ts} +3 -3
- package/dist/app/{dcp-stats.js → rendering/dcp-stats.js} +1 -1
- package/dist/app/{editor-layout-renderer.d.ts → rendering/editor-layout-renderer.d.ts} +4 -3
- package/dist/app/{editor-layout-renderer.js → rendering/editor-layout-renderer.js} +13 -3
- package/dist/app/{editor-panels.d.ts → rendering/editor-panels.d.ts} +2 -2
- package/dist/app/{editor-panels.js → rendering/editor-panels.js} +4 -4
- package/dist/app/{message-content.d.ts → rendering/message-content.d.ts} +1 -1
- package/dist/app/{message-content.js → rendering/message-content.js} +66 -8
- package/dist/app/{render-controller.d.ts → rendering/render-controller.d.ts} +6 -6
- package/dist/app/{render-controller.js → rendering/render-controller.js} +11 -6
- package/dist/app/{render-text.d.ts → rendering/render-text.d.ts} +5 -2
- package/dist/app/{render-text.js → rendering/render-text.js} +53 -5
- package/dist/app/{status-line-renderer.d.ts → rendering/status-line-renderer.d.ts} +8 -4
- package/dist/app/{status-line-renderer.js → rendering/status-line-renderer.js} +73 -29
- package/dist/app/{tab-line-renderer.d.ts → rendering/tab-line-renderer.d.ts} +3 -3
- package/dist/app/{tab-line-renderer.js → rendering/tab-line-renderer.js} +2 -2
- package/dist/app/{toast-controller.d.ts → rendering/toast-controller.d.ts} +1 -1
- package/dist/app/{toast-controller.js → rendering/toast-controller.js} +2 -2
- package/dist/app/{toast-renderer.d.ts → rendering/toast-renderer.d.ts} +3 -3
- package/dist/app/{toast-renderer.js → rendering/toast-renderer.js} +3 -3
- package/dist/app/{tool-block-renderer.d.ts → rendering/tool-block-renderer.d.ts} +5 -5
- package/dist/app/{tool-block-renderer.js → rendering/tool-block-renderer.js} +15 -33
- package/dist/app/runtime.d.ts +6 -1
- package/dist/app/runtime.js +35 -2
- package/dist/app/{blink-controller.js → screen/blink-controller.js} +1 -1
- package/dist/app/{clipboard.d.ts → screen/clipboard.d.ts} +2 -2
- package/dist/app/{clipboard.js → screen/clipboard.js} +13 -18
- package/dist/app/{image-click-targets.d.ts → screen/image-click-targets.d.ts} +2 -2
- package/dist/app/{image-opener.d.ts → screen/image-opener.d.ts} +1 -1
- package/dist/app/{mouse-controller.d.ts → screen/mouse-controller.d.ts} +17 -10
- package/dist/app/{mouse-controller.js → screen/mouse-controller.js} +72 -29
- package/dist/app/{screen-selection.d.ts → screen/screen-selection.d.ts} +1 -1
- package/dist/app/{screen-styler.d.ts → screen/screen-styler.d.ts} +6 -3
- package/dist/app/{screen-styler.js → screen/screen-styler.js} +7 -6
- package/dist/app/{scroll-controller.d.ts → screen/scroll-controller.d.ts} +3 -3
- package/dist/app/{scroll-controller.js → screen/scroll-controller.js} +1 -1
- package/dist/app/{status-controller.d.ts → screen/status-controller.d.ts} +5 -2
- package/dist/app/{status-controller.js → screen/status-controller.js} +24 -9
- package/dist/app/{queued-message-controller.d.ts → session/queued-message-controller.d.ts} +9 -3
- package/dist/app/{queued-message-controller.js → session/queued-message-controller.js} +34 -23
- package/dist/app/{request-history.js → session/request-history.js} +2 -2
- package/dist/app/session/resume-session-loader.d.ts +15 -0
- package/dist/app/session/resume-session-loader.js +204 -0
- package/dist/app/{session-event-controller.d.ts → session/session-event-controller.d.ts} +8 -4
- package/dist/app/{session-event-controller.js → session/session-event-controller.js} +75 -8
- package/dist/app/{session-history.d.ts → session/session-history.d.ts} +1 -1
- package/dist/app/{session-history.js → session/session-history.js} +7 -6
- package/dist/app/{session-lifecycle-controller.d.ts → session/session-lifecycle-controller.d.ts} +7 -2
- package/dist/app/{session-lifecycle-controller.js → session/session-lifecycle-controller.js} +13 -5
- package/dist/app/{session-search.d.ts → session/session-search.d.ts} +1 -1
- package/dist/app/{session-search.js → session/session-search.js} +3 -3
- package/dist/app/{tabs-controller.d.ts → session/tabs-controller.d.ts} +11 -2
- package/dist/app/{tabs-controller.js → session/tabs-controller.js} +105 -9
- package/dist/app/{subagents-files.d.ts → subagents/subagents-files.d.ts} +1 -1
- package/dist/app/{subagents-files.js → subagents/subagents-files.js} +1 -1
- package/dist/app/{subagents-model.d.ts → subagents/subagents-model.d.ts} +1 -1
- package/dist/app/{subagents-model.js → subagents/subagents-model.js} +4 -4
- package/dist/app/{subagents-widget-controller.d.ts → subagents/subagents-widget-controller.d.ts} +1 -1
- package/dist/app/{subagents-widget-controller.js → subagents/subagents-widget-controller.js} +2 -2
- package/dist/app/{nerd-font-controller.js → terminal/nerd-font-controller.js} +16 -17
- package/dist/app/{terminal-bell-sound-controller.js → terminal/terminal-bell-sound-controller.js} +1 -1
- package/dist/app/{terminal-controller.d.ts → terminal/terminal-controller.d.ts} +1 -0
- package/dist/app/{terminal-controller.js → terminal/terminal-controller.js} +3 -2
- package/dist/app/{todo-model.d.ts → todo/todo-model.d.ts} +1 -1
- package/dist/app/{todo-model.js → todo/todo-model.js} +3 -3
- package/dist/app/{todo-widget-controller.d.ts → todo/todo-widget-controller.d.ts} +1 -1
- package/dist/app/{todo-widget-controller.js → todo/todo-widget-controller.js} +2 -2
- package/dist/app/types.d.ts +16 -2
- package/dist/app/{workspace-actions-controller.d.ts → workspace/workspace-actions-controller.d.ts} +2 -2
- package/dist/app/{workspace-actions-controller.js → workspace/workspace-actions-controller.js} +6 -6
- package/dist/app/{workspace-undo.d.ts → workspace/workspace-undo.d.ts} +1 -1
- package/dist/app/{workspace-undo.js → workspace/workspace-undo.js} +22 -20
- package/dist/config.d.ts +27 -0
- package/dist/config.js +174 -1
- package/dist/default-pix-config.js +38 -353
- package/dist/input-editor.d.ts +7 -1
- package/dist/input-editor.js +47 -6
- package/dist/main.js +2 -2
- package/dist/markdown-format.d.ts +1 -0
- package/dist/markdown-format.js +26 -1
- package/external/pi-tools-suite/README.md +78 -0
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +4 -0
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +6 -1
- package/external/pi-tools-suite/src/dcp/compression-blocks.ts +1 -0
- package/external/pi-tools-suite/src/dcp/prompts.ts +5 -0
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +314 -193
- package/external/pi-tools-suite/src/index.ts +1 -0
- package/external/pi-tools-suite/src/lib/lsp.ts +2 -1
- package/external/pi-tools-suite/src/lsp/_shared/output.ts +8 -7
- package/external/pi-tools-suite/src/lsp/manager.ts +4 -4
- package/external/pi-tools-suite/src/opencode-import/commands.ts +86 -0
- package/external/pi-tools-suite/src/opencode-import/importer.ts +208 -0
- package/external/pi-tools-suite/src/opencode-import/index.ts +25 -0
- package/external/pi-tools-suite/src/repo-discovery/index.ts +49 -2
- package/external/pi-tools-suite/src/todo/tool/response-envelope.ts +9 -1
- package/external/pi-tools-suite/src/tool-descriptions.ts +1 -1
- package/package.json +1 -1
- /package/dist/app/{startup-checks.d.ts → cli/startup-checks.d.ts} +0 -0
- /package/dist/app/{startup-checks.js → cli/startup-checks.js} +0 -0
- /package/dist/app/{startup-info.d.ts → cli/startup-info.d.ts} +0 -0
- /package/dist/app/{startup-info.js → cli/startup-info.js} +0 -0
- /package/dist/app/{update.d.ts → cli/update.d.ts} +0 -0
- /package/dist/app/{update.js → cli/update.js} +0 -0
- /package/dist/app/{command-host.js → commands/command-host.js} +0 -0
- /package/dist/app/{command-runtime.d.ts → commands/command-runtime.d.ts} +0 -0
- /package/dist/app/{shell-command.d.ts → commands/shell-command.d.ts} +0 -0
- /package/dist/app/{shell-command.js → commands/shell-command.js} +0 -0
- /package/dist/app/{extension-event-bus.d.ts → extensions/extension-event-bus.d.ts} +0 -0
- /package/dist/app/{extension-event-bus.js → extensions/extension-event-bus.js} +0 -0
- /package/dist/app/{native-modifiers.d.ts → input/native-modifiers.d.ts} +0 -0
- /package/dist/app/{terminal-edit-shortcuts.d.ts → input/terminal-edit-shortcuts.d.ts} +0 -0
- /package/dist/app/{terminal-edit-shortcuts.js → input/terminal-edit-shortcuts.js} +0 -0
- /package/dist/app/{model-usage-controller.d.ts → model/model-usage-controller.d.ts} +0 -0
- /package/dist/app/{conversation-viewport.js → rendering/conversation-viewport.js} +0 -0
- /package/dist/app/{dcp-stats.d.ts → rendering/dcp-stats.d.ts} +0 -0
- /package/dist/app/{blink-controller.d.ts → screen/blink-controller.d.ts} +0 -0
- /package/dist/app/{file-link-opener.d.ts → screen/file-link-opener.d.ts} +0 -0
- /package/dist/app/{file-link-opener.js → screen/file-link-opener.js} +0 -0
- /package/dist/app/{file-links.d.ts → screen/file-links.d.ts} +0 -0
- /package/dist/app/{file-links.js → screen/file-links.js} +0 -0
- /package/dist/app/{image-click-targets.js → screen/image-click-targets.js} +0 -0
- /package/dist/app/{image-opener.js → screen/image-opener.js} +0 -0
- /package/dist/app/{screen-selection.js → screen/screen-selection.js} +0 -0
- /package/dist/app/{request-history.d.ts → session/request-history.d.ts} +0 -0
- /package/dist/app/{nerd-font-controller.d.ts → terminal/nerd-font-controller.d.ts} +0 -0
- /package/dist/app/{terminal-bell-sound-controller.d.ts → terminal/terminal-bell-sound-controller.d.ts} +0 -0
- /package/dist/app/{terminal-output-buffer.d.ts → terminal/terminal-output-buffer.d.ts} +0 -0
- /package/dist/app/{terminal-output-buffer.js → terminal/terminal-output-buffer.js} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { compactProgressBarSegments, formatCompactProgressBar } from "
|
|
1
|
+
import { compactProgressBarSegments, formatCompactProgressBar } from "../../context-progress-bar.js";
|
|
2
2
|
import { padOrTrimPlain } from "./render-text.js";
|
|
3
|
-
import { stringDisplayWidth } from "
|
|
4
|
-
import { APP_ICONS } from "
|
|
5
|
-
import { resolveColor, resolveModelColor } from "
|
|
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
|
|
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
|
-
|
|
38
|
-
? this.widgetLayout(nextWidgetStartColumn,
|
|
41
|
+
let draftQueueWidget = leftWidth < contentWidth && draftQueueButton.length > 0
|
|
42
|
+
? this.widgetLayout(nextWidgetStartColumn, draftQueueButton)
|
|
39
43
|
: undefined;
|
|
40
|
-
if (
|
|
41
|
-
nextWidgetStartColumn =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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 "
|
|
2
|
-
import type { ScreenStyler } from "
|
|
3
|
-
import type { SessionTab, TabLineLayout } from "
|
|
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 "
|
|
2
|
-
import { APP_ICONS } from "
|
|
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,6 +1,6 @@
|
|
|
1
|
-
import { type Theme } from "
|
|
2
|
-
import type { ToastEntry } from "
|
|
3
|
-
import type { ToastLineTarget } from "
|
|
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 "
|
|
2
|
-
import { stringDisplayWidth, wrapDisplayLine } from "
|
|
3
|
-
import { APP_ICONS } from "
|
|
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 "
|
|
2
|
-
import type { ToolBodySyntaxHighlights } from "
|
|
3
|
-
import type { Theme } from "
|
|
4
|
-
import type { RenderedLine } from "
|
|
5
|
-
import type { ToolBodyLineStyle, ToolHeaderSegment } from "
|
|
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 "
|
|
2
|
-
import { expandTabs, sliceByDisplayWidth, stringDisplayWidth, wrapDisplayLineByWords } from "
|
|
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
|
|
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) {
|
package/dist/app/runtime.d.ts
CHANGED
|
@@ -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 {};
|
package/dist/app/runtime.js
CHANGED
|
@@ -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
|
-
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 =
|
|
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
|
-
|
|
19
|
-
|
|
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 =
|
|
60
|
+
const result = await runProcess(process.execPath, ["--input-type=module", "-e", script], {
|
|
59
61
|
input: text,
|
|
60
|
-
|
|
61
|
-
|
|
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 "
|
|
2
|
-
import type { RenderedLine, StyledSegment } from "
|
|
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 "
|
|
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 "
|
|
2
|
-
import type { ConversationViewport } from "
|
|
3
|
-
import type { EditorLayoutRenderer } from "
|
|
4
|
-
import type { ImageContent, InputEditor } from "
|
|
5
|
-
import type { ToastEntry, ToastVariant } from "
|
|
6
|
-
import type { AppPopupActionController } from "
|
|
7
|
-
import type { AppPopupMenuController } from "
|
|
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 "
|
|
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("
|
|
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;
|