dmux 3.2.0 → 3.3.0
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/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +221 -1596
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.d.ts +10 -0
- package/dist/actions/implementations/closeAction.d.ts.map +1 -0
- package/dist/actions/implementations/closeAction.js +197 -0
- package/dist/actions/implementations/closeAction.js.map +1 -0
- package/dist/actions/implementations/copyPathAction.d.ts +10 -0
- package/dist/actions/implementations/copyPathAction.d.ts.map +1 -0
- package/dist/actions/implementations/copyPathAction.js +34 -0
- package/dist/actions/implementations/copyPathAction.js.map +1 -0
- package/dist/actions/implementations/duplicateAction.d.ts +10 -0
- package/dist/actions/implementations/duplicateAction.d.ts.map +1 -0
- package/dist/actions/implementations/duplicateAction.js +25 -0
- package/dist/actions/implementations/duplicateAction.js.map +1 -0
- package/dist/actions/implementations/index.d.ts +14 -0
- package/dist/actions/implementations/index.d.ts.map +1 -0
- package/dist/actions/implementations/index.js +14 -0
- package/dist/actions/implementations/index.js.map +1 -0
- package/dist/actions/implementations/mergeAction.d.ts +14 -0
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -0
- package/dist/actions/implementations/mergeAction.js +84 -0
- package/dist/actions/implementations/mergeAction.js.map +1 -0
- package/dist/actions/implementations/openInEditorAction.d.ts +12 -0
- package/dist/actions/implementations/openInEditorAction.d.ts.map +1 -0
- package/dist/actions/implementations/openInEditorAction.js +33 -0
- package/dist/actions/implementations/openInEditorAction.js.map +1 -0
- package/dist/actions/implementations/renameAction.d.ts +13 -0
- package/dist/actions/implementations/renameAction.d.ts.map +1 -0
- package/dist/actions/implementations/renameAction.js +18 -0
- package/dist/actions/implementations/renameAction.js.map +1 -0
- package/dist/actions/implementations/toggleAutopilotAction.d.ts +10 -0
- package/dist/actions/implementations/toggleAutopilotAction.d.ts.map +1 -0
- package/dist/actions/implementations/toggleAutopilotAction.js +33 -0
- package/dist/actions/implementations/toggleAutopilotAction.js.map +1 -0
- package/dist/actions/implementations/viewAction.d.ts +10 -0
- package/dist/actions/implementations/viewAction.d.ts.map +1 -0
- package/dist/actions/implementations/viewAction.js +26 -0
- package/dist/actions/implementations/viewAction.js.map +1 -0
- package/dist/actions/merge/commitMessageHandler.d.ts +27 -0
- package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -0
- package/dist/actions/merge/commitMessageHandler.js +131 -0
- package/dist/actions/merge/commitMessageHandler.js.map +1 -0
- package/dist/actions/merge/conflictResolution.d.ts +13 -0
- package/dist/actions/merge/conflictResolution.d.ts.map +1 -0
- package/dist/actions/merge/conflictResolution.js +134 -0
- package/dist/actions/merge/conflictResolution.js.map +1 -0
- package/dist/actions/merge/issueHandlers/index.d.ts +11 -0
- package/dist/actions/merge/issueHandlers/index.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/index.js +8 -0
- package/dist/actions/merge/issueHandlers/index.js.map +1 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts +13 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +72 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts +13 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.js +52 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.js.map +1 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts +7 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js +12 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js.map +1 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +13 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +49 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -0
- package/dist/actions/merge/mergeExecution.d.ts +22 -0
- package/dist/actions/merge/mergeExecution.d.ts.map +1 -0
- package/dist/actions/merge/mergeExecution.js +180 -0
- package/dist/actions/merge/mergeExecution.js.map +1 -0
- package/dist/actions/paneActions.d.ts +3 -40
- package/dist/actions/paneActions.d.ts.map +1 -1
- package/dist/actions/paneActions.js +4 -1038
- package/dist/actions/paneActions.js.map +1 -1
- package/dist/actions/types.d.ts +1 -0
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js.map +1 -1
- package/dist/components/{ActionChoiceDialog.d.ts → dialogs/ActionChoiceDialog.d.ts} +1 -1
- package/dist/components/dialogs/ActionChoiceDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ActionChoiceDialog.js.map +1 -0
- package/dist/components/dialogs/ActionConfirmDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ActionConfirmDialog.js.map +1 -0
- package/dist/components/dialogs/ActionInputDialog.d.ts.map +1 -0
- package/dist/components/{ActionInputDialog.js → dialogs/ActionInputDialog.js} +2 -2
- package/dist/components/dialogs/ActionInputDialog.js.map +1 -0
- package/dist/components/dialogs/ActionProgressDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ActionProgressDialog.js.map +1 -0
- package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -0
- package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -0
- package/dist/components/{CloseOptionsDialog.d.ts → dialogs/CloseOptionsDialog.d.ts} +1 -1
- package/dist/components/dialogs/CloseOptionsDialog.d.ts.map +1 -0
- package/dist/components/dialogs/CloseOptionsDialog.js.map +1 -0
- package/dist/components/dialogs/CommandPromptDialog.d.ts.map +1 -0
- package/dist/components/{CommandPromptDialog.js → dialogs/CommandPromptDialog.js} +1 -1
- package/dist/components/dialogs/CommandPromptDialog.js.map +1 -0
- package/dist/components/dialogs/DialogBox.d.ts.map +1 -0
- package/dist/components/dialogs/DialogBox.js.map +1 -0
- package/dist/components/dialogs/HooksDialog.d.ts.map +1 -0
- package/dist/components/dialogs/HooksDialog.js.map +1 -0
- package/dist/components/{MergeConfirmationDialog.d.ts → dialogs/MergeConfirmationDialog.d.ts} +1 -1
- package/dist/components/dialogs/MergeConfirmationDialog.d.ts.map +1 -0
- package/dist/components/dialogs/MergeConfirmationDialog.js.map +1 -0
- package/dist/components/{SettingsDialog.d.ts → dialogs/SettingsDialog.d.ts} +1 -1
- package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -0
- package/dist/components/dialogs/SettingsDialog.js.map +1 -0
- package/dist/components/dialogs/UpdateDialog.d.ts.map +1 -0
- package/dist/components/dialogs/UpdateDialog.js.map +1 -0
- package/dist/components/indicators/CreatingIndicator.d.ts.map +1 -0
- package/dist/components/indicators/CreatingIndicator.js.map +1 -0
- package/dist/components/indicators/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/indicators/LoadingIndicator.js.map +1 -0
- package/dist/components/indicators/RunningIndicator.d.ts.map +1 -0
- package/dist/components/indicators/RunningIndicator.js.map +1 -0
- package/dist/components/indicators/Spinner.d.ts.map +1 -0
- package/dist/components/indicators/Spinner.js.map +1 -0
- package/dist/components/indicators/UpdatingIndicator.d.ts.map +1 -0
- package/dist/components/indicators/UpdatingIndicator.js.map +1 -0
- package/dist/components/indicators/index.d.ts +6 -0
- package/dist/components/indicators/index.d.ts.map +1 -0
- package/dist/components/indicators/index.js +6 -0
- package/dist/components/indicators/index.js.map +1 -0
- package/dist/components/inputs/CleanTextInput.d.ts.map +1 -0
- package/dist/{CleanTextInput.js → components/inputs/CleanTextInput.js} +2 -144
- package/dist/components/inputs/CleanTextInput.js.map +1 -0
- package/dist/components/inputs/StyledTextInput.d.ts.map +1 -0
- package/dist/components/inputs/StyledTextInput.js.map +1 -0
- package/dist/components/inputs/index.d.ts +3 -0
- package/dist/components/inputs/index.d.ts.map +1 -0
- package/dist/components/inputs/index.js +3 -0
- package/dist/components/inputs/index.js.map +1 -0
- package/dist/components/{KebabMenu.d.ts → panes/KebabMenu.d.ts} +1 -1
- package/dist/components/panes/KebabMenu.d.ts.map +1 -0
- package/dist/components/panes/KebabMenu.js.map +1 -0
- package/dist/components/panes/MergePane.d.ts.map +1 -0
- package/dist/{MergePane.js → components/panes/MergePane.js} +1 -1
- package/dist/components/panes/MergePane.js.map +1 -0
- package/dist/components/{PaneCard.d.ts → panes/PaneCard.d.ts} +1 -1
- package/dist/components/panes/PaneCard.d.ts.map +1 -0
- package/dist/components/{PaneCard.js → panes/PaneCard.js} +1 -1
- package/dist/components/panes/PaneCard.js.map +1 -0
- package/dist/components/{PanesGrid.d.ts → panes/PanesGrid.d.ts} +2 -2
- package/dist/components/panes/PanesGrid.d.ts.map +1 -0
- package/dist/components/{PanesGrid.js → panes/PanesGrid.js} +1 -1
- package/dist/components/panes/PanesGrid.js.map +1 -0
- package/dist/components/panes/index.d.ts +5 -0
- package/dist/components/panes/index.d.ts.map +1 -0
- package/dist/components/panes/index.js +5 -0
- package/dist/components/panes/index.js.map +1 -0
- package/dist/components/popups/agentChoicePopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/agentChoicePopup.js +1 -1
- package/dist/components/popups/agentChoicePopup.js.map +1 -0
- package/dist/components/popups/choicePopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/choicePopup.js +3 -3
- package/dist/components/popups/choicePopup.js.map +1 -0
- package/dist/components/popups/config.d.ts.map +1 -0
- package/dist/{popups → components/popups}/config.js +1 -1
- package/dist/components/popups/config.js.map +1 -0
- package/dist/components/popups/confirmPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/confirmPopup.js +2 -3
- package/dist/components/popups/confirmPopup.js.map +1 -0
- package/dist/components/popups/hooksPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/hooksPopup.js +1 -1
- package/dist/components/popups/hooksPopup.js.map +1 -0
- package/dist/components/popups/inputPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/inputPopup.js +3 -4
- package/dist/components/popups/inputPopup.js.map +1 -0
- package/dist/components/popups/kebabMenuPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/kebabMenuPopup.js +1 -1
- package/dist/components/popups/kebabMenuPopup.js.map +1 -0
- package/dist/components/popups/logsPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/logsPopup.js +15 -7
- package/dist/components/popups/logsPopup.js.map +1 -0
- package/dist/components/popups/mergePopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/mergePopup.js +6 -6
- package/dist/components/popups/mergePopup.js.map +1 -0
- package/dist/components/popups/newPanePopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/newPanePopup.js +3 -3
- package/dist/components/popups/newPanePopup.js.map +1 -0
- package/dist/components/popups/progressPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/progressPopup.js +1 -2
- package/dist/components/popups/progressPopup.js.map +1 -0
- package/dist/components/popups/remotePopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/remotePopup.js +1 -1
- package/dist/components/popups/remotePopup.js.map +1 -0
- package/dist/components/popups/settingsPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/settingsPopup.js +1 -1
- package/dist/components/popups/settingsPopup.js.map +1 -0
- package/dist/components/popups/shared/FileList.d.ts.map +1 -0
- package/dist/components/popups/shared/FileList.js.map +1 -0
- package/dist/components/popups/shared/PopupContainer.d.ts.map +1 -0
- package/dist/components/popups/shared/PopupContainer.js.map +1 -0
- package/dist/components/popups/shared/PopupInputBox.d.ts.map +1 -0
- package/dist/components/popups/shared/PopupInputBox.js.map +1 -0
- package/dist/components/popups/shared/PopupWrapper.d.ts.map +1 -0
- package/dist/components/popups/shared/PopupWrapper.js.map +1 -0
- package/dist/components/popups/shared/index.d.ts.map +1 -0
- package/dist/components/popups/shared/index.js.map +1 -0
- package/dist/components/popups/shortcutsPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/shortcutsPopup.js +1 -1
- package/dist/components/popups/shortcutsPopup.js.map +1 -0
- package/dist/components/popups/templates/SimpleInputPopup.d.ts.map +1 -0
- package/dist/{popups → components/popups}/templates/SimpleInputPopup.js +2 -2
- package/dist/components/popups/templates/SimpleInputPopup.js.map +1 -0
- package/dist/components/ui/FileCopyPrompt.d.ts.map +1 -0
- package/dist/components/ui/FileCopyPrompt.js.map +1 -0
- package/dist/components/ui/FooterHelp.d.ts.map +1 -0
- package/dist/components/ui/FooterHelp.js.map +1 -0
- package/dist/components/ui/QRCode.d.ts.map +1 -0
- package/dist/components/ui/QRCode.js.map +1 -0
- package/dist/components/ui/index.d.ts +4 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +4 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/constants/timing.d.ts +22 -0
- package/dist/constants/timing.d.ts.map +1 -0
- package/dist/constants/timing.js +26 -0
- package/dist/constants/timing.js.map +1 -0
- package/dist/hooks/useActionSystem.d.ts +5 -4
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +120 -114
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useDebugInfo.d.ts +11 -0
- package/dist/hooks/useDebugInfo.d.ts.map +1 -0
- package/dist/hooks/useDebugInfo.js +34 -0
- package/dist/hooks/useDebugInfo.js.map +1 -0
- package/dist/hooks/useDialogState.d.ts +22 -0
- package/dist/hooks/useDialogState.d.ts.map +1 -0
- package/dist/hooks/useDialogState.js +62 -0
- package/dist/hooks/useDialogState.js.map +1 -0
- package/dist/hooks/useInputHandling.d.ts +60 -0
- package/dist/hooks/useInputHandling.d.ts.map +1 -0
- package/dist/hooks/useInputHandling.js +280 -0
- package/dist/hooks/useInputHandling.js.map +1 -0
- package/dist/hooks/useLayoutManagement.d.ts +12 -0
- package/dist/hooks/useLayoutManagement.d.ts.map +1 -0
- package/dist/hooks/useLayoutManagement.js +58 -0
- package/dist/hooks/useLayoutManagement.js.map +1 -0
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +4 -9
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneLoading.d.ts +45 -0
- package/dist/hooks/usePaneLoading.d.ts.map +1 -0
- package/dist/hooks/usePaneLoading.js +188 -0
- package/dist/hooks/usePaneLoading.js.map +1 -0
- package/dist/hooks/usePaneRunner.d.ts.map +1 -1
- package/dist/hooks/usePaneRunner.js +9 -6
- package/dist/hooks/usePaneRunner.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +34 -0
- package/dist/hooks/usePaneSync.d.ts.map +1 -0
- package/dist/hooks/usePaneSync.js +182 -0
- package/dist/hooks/usePaneSync.js.map +1 -0
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +55 -405
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useServices.d.ts +24 -0
- package/dist/hooks/useServices.d.ts.map +1 -0
- package/dist/hooks/useServices.js +39 -0
- package/dist/hooks/useServices.js.map +1 -0
- package/dist/hooks/useShellDetection.d.ts +10 -0
- package/dist/hooks/useShellDetection.d.ts.map +1 -0
- package/dist/hooks/useShellDetection.js +53 -0
- package/dist/hooks/useShellDetection.js.map +1 -0
- package/dist/hooks/useStatusMessages.d.ts +11 -0
- package/dist/hooks/useStatusMessages.d.ts.map +1 -0
- package/dist/hooks/useStatusMessages.js +32 -0
- package/dist/hooks/useStatusMessages.js.map +1 -0
- package/dist/hooks/useTemporaryStatus.d.ts +13 -0
- package/dist/hooks/useTemporaryStatus.d.ts.map +1 -0
- package/dist/hooks/useTemporaryStatus.js +30 -0
- package/dist/hooks/useTemporaryStatus.js.map +1 -0
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +7 -12
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useTunnelManagement.d.ts +18 -0
- package/dist/hooks/useTunnelManagement.d.ts.map +1 -0
- package/dist/hooks/useTunnelManagement.js +55 -0
- package/dist/hooks/useTunnelManagement.js.map +1 -0
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +18 -13
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +75 -57
- package/dist/index.js.map +1 -1
- package/dist/layout/LayoutCalculator.d.ts +62 -0
- package/dist/layout/LayoutCalculator.d.ts.map +1 -0
- package/dist/layout/LayoutCalculator.js +143 -0
- package/dist/layout/LayoutCalculator.js.map +1 -0
- package/dist/layout/SpacerManager.d.ts +64 -0
- package/dist/layout/SpacerManager.d.ts.map +1 -0
- package/dist/layout/SpacerManager.js +148 -0
- package/dist/layout/SpacerManager.js.map +1 -0
- package/dist/layout/TmuxLayoutApplier.d.ts +59 -0
- package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -0
- package/dist/layout/TmuxLayoutApplier.js +135 -0
- package/dist/layout/TmuxLayoutApplier.js.map +1 -0
- package/dist/panes/decorative-pane.d.ts.map +1 -0
- package/dist/{decorative-pane.js → panes/decorative-pane.js} +1 -1
- package/dist/panes/decorative-pane.js.map +1 -0
- package/dist/panes/spacer-pane.d.ts.map +1 -0
- package/dist/panes/spacer-pane.js.map +1 -0
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +636 -5637
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/server/routes/actionsRoutes.d.ts +2 -0
- package/dist/server/routes/actionsRoutes.d.ts.map +1 -0
- package/dist/server/routes/actionsRoutes.js +110 -0
- package/dist/server/routes/actionsRoutes.js.map +1 -0
- package/dist/server/routes/healthRoutes.d.ts +13 -0
- package/dist/server/routes/healthRoutes.d.ts.map +1 -0
- package/dist/server/routes/healthRoutes.js +70 -0
- package/dist/server/routes/healthRoutes.js.map +1 -0
- package/dist/server/routes/index.d.ts +8 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +67 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/keysRoutes.d.ts +20 -0
- package/dist/server/routes/keysRoutes.d.ts.map +1 -0
- package/dist/server/routes/keysRoutes.js +111 -0
- package/dist/server/routes/keysRoutes.js.map +1 -0
- package/dist/server/routes/panesRoutes.d.ts +2 -0
- package/dist/server/routes/panesRoutes.d.ts.map +1 -0
- package/dist/server/routes/panesRoutes.js +373 -0
- package/dist/server/routes/panesRoutes.js.map +1 -0
- package/dist/server/routes/settingsRoutes.d.ts +94 -0
- package/dist/server/routes/settingsRoutes.d.ts.map +1 -0
- package/dist/server/routes/settingsRoutes.js +159 -0
- package/dist/server/routes/settingsRoutes.js.map +1 -0
- package/dist/server/routes/streamRoutes.d.ts +18 -0
- package/dist/server/routes/streamRoutes.d.ts.map +1 -0
- package/dist/server/routes/streamRoutes.js +87 -0
- package/dist/server/routes/streamRoutes.js.map +1 -0
- package/dist/server/routes/tunnelRoutes.d.ts +11 -0
- package/dist/server/routes/tunnelRoutes.d.ts.map +1 -0
- package/dist/server/routes/tunnelRoutes.js +28 -0
- package/dist/server/routes/tunnelRoutes.js.map +1 -0
- package/dist/server/routes.d.ts +16 -2
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +16 -878
- package/dist/server/routes.js.map +1 -1
- package/dist/{AutoUpdater.d.ts → services/AutoUpdater.d.ts} +1 -0
- package/dist/services/AutoUpdater.d.ts.map +1 -0
- package/dist/{AutoUpdater.js → services/AutoUpdater.js} +42 -9
- package/dist/services/AutoUpdater.js.map +1 -0
- package/dist/services/PaneAnalyzer.d.ts.map +1 -0
- package/dist/{PaneAnalyzer.js → services/PaneAnalyzer.js} +1 -1
- package/dist/services/PaneAnalyzer.js.map +1 -0
- package/dist/services/PaneLifecycleManager.d.ts +60 -0
- package/dist/services/PaneLifecycleManager.d.ts.map +1 -0
- package/dist/services/PaneLifecycleManager.js +119 -0
- package/dist/services/PaneLifecycleManager.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +6 -3
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/PopupManager.d.ts +68 -0
- package/dist/services/PopupManager.d.ts.map +1 -0
- package/dist/services/PopupManager.js +415 -0
- package/dist/services/PopupManager.js.map +1 -0
- package/dist/services/StatusDetector.js +1 -1
- package/dist/services/StatusDetector.js.map +1 -1
- package/dist/services/TerminalStreamer.d.ts +1 -0
- package/dist/services/TerminalStreamer.d.ts.map +1 -1
- package/dist/services/TerminalStreamer.js +22 -16
- package/dist/services/TerminalStreamer.js.map +1 -1
- package/dist/services/TmuxService.d.ts +298 -0
- package/dist/services/TmuxService.d.ts.map +1 -0
- package/dist/services/TmuxService.js +768 -0
- package/dist/services/TmuxService.js.map +1 -0
- package/dist/services/TunnelService.d.ts.map +1 -1
- package/dist/services/TunnelService.js +2 -1
- package/dist/services/TunnelService.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/asciiArt.d.ts.map +1 -1
- package/dist/utils/asciiArt.js +6 -19
- package/dist/utils/asciiArt.js.map +1 -1
- package/dist/utils/conflictMonitor.d.ts +20 -0
- package/dist/utils/conflictMonitor.d.ts.map +1 -0
- package/dist/utils/conflictMonitor.js +113 -0
- package/dist/utils/conflictMonitor.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +70 -79
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/errorHandling.d.ts +37 -0
- package/dist/utils/errorHandling.d.ts.map +1 -0
- package/dist/utils/errorHandling.js +112 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/git.d.ts +4 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +15 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/layoutManager.d.ts +20 -16
- package/dist/utils/layoutManager.d.ts.map +1 -1
- package/dist/utils/layoutManager.js +116 -367
- package/dist/utils/layoutManager.js.map +1 -1
- package/dist/utils/mergeExecution.d.ts.map +1 -1
- package/dist/utils/mergeExecution.js +8 -1
- package/dist/utils/mergeExecution.js.map +1 -1
- package/dist/utils/mergeValidation.d.ts.map +1 -1
- package/dist/utils/mergeValidation.js +42 -13
- package/dist/utils/mergeValidation.js.map +1 -1
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +111 -103
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/paneRebinding.d.ts +14 -0
- package/dist/utils/paneRebinding.d.ts.map +1 -0
- package/dist/utils/paneRebinding.js +28 -0
- package/dist/utils/paneRebinding.js.map +1 -0
- package/dist/utils/popup.d.ts.map +1 -1
- package/dist/utils/popup.js +11 -17
- package/dist/utils/popup.js.map +1 -1
- package/dist/utils/postPaneCleanup.d.ts.map +1 -1
- package/dist/utils/postPaneCleanup.js +4 -3
- package/dist/utils/postPaneCleanup.js.map +1 -1
- package/dist/utils/shellPaneDetection.d.ts +3 -3
- package/dist/utils/shellPaneDetection.d.ts.map +1 -1
- package/dist/utils/shellPaneDetection.js +10 -6
- package/dist/utils/shellPaneDetection.js.map +1 -1
- package/dist/utils/systemCheck.d.ts +19 -0
- package/dist/utils/systemCheck.d.ts.map +1 -0
- package/dist/utils/systemCheck.js +160 -0
- package/dist/utils/systemCheck.js.map +1 -0
- package/dist/utils/tmux.d.ts +26 -7
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +66 -64
- package/dist/utils/tmux.js.map +1 -1
- package/dist/utils/welcomePane.d.ts +2 -2
- package/dist/utils/welcomePane.d.ts.map +1 -1
- package/dist/utils/welcomePane.js +20 -28
- package/dist/utils/welcomePane.js.map +1 -1
- package/dist/utils/welcomePaneManager.js +1 -1
- package/dist/utils/welcomePaneManager.js.map +1 -1
- package/dist/workers/PaneWorker.js +7 -9
- package/dist/workers/PaneWorker.js.map +1 -1
- package/dist/workers/updateChecker.js +1 -1
- package/dist/workers/updateChecker.js.map +1 -1
- package/package.json +3 -1
- package/dist/AutoUpdater.d.ts.map +0 -1
- package/dist/AutoUpdater.js.map +0 -1
- package/dist/BetterTextInput.d.ts +0 -10
- package/dist/BetterTextInput.d.ts.map +0 -1
- package/dist/BetterTextInput.js +0 -177
- package/dist/BetterTextInput.js.map +0 -1
- package/dist/CleanTextInput.d.ts.map +0 -1
- package/dist/CleanTextInput.js.map +0 -1
- package/dist/EnhancedTextInput.d.ts +0 -13
- package/dist/EnhancedTextInput.d.ts.map +0 -1
- package/dist/EnhancedTextInput.js +0 -443
- package/dist/EnhancedTextInput.js.map +0 -1
- package/dist/GeminiTextInput.d.ts +0 -12
- package/dist/GeminiTextInput.d.ts.map +0 -1
- package/dist/GeminiTextInput.js +0 -210
- package/dist/GeminiTextInput.js.map +0 -1
- package/dist/MergePane.d.ts.map +0 -1
- package/dist/MergePane.js.map +0 -1
- package/dist/MultilineTextInput.d.ts +0 -10
- package/dist/MultilineTextInput.d.ts.map +0 -1
- package/dist/MultilineTextInput.js +0 -184
- package/dist/MultilineTextInput.js.map +0 -1
- package/dist/PaneAnalyzer.d.ts.map +0 -1
- package/dist/PaneAnalyzer.js.map +0 -1
- package/dist/SimpleEnhancedInput.d.ts +0 -13
- package/dist/SimpleEnhancedInput.d.ts.map +0 -1
- package/dist/SimpleEnhancedInput.js +0 -639
- package/dist/SimpleEnhancedInput.js.map +0 -1
- package/dist/SimpleGeminiInput.d.ts +0 -12
- package/dist/SimpleGeminiInput.d.ts.map +0 -1
- package/dist/SimpleGeminiInput.js +0 -223
- package/dist/SimpleGeminiInput.js.map +0 -1
- package/dist/StyledTextInput.d.ts.map +0 -1
- package/dist/StyledTextInput.js.map +0 -1
- package/dist/components/ActionChoiceDialog.d.ts.map +0 -1
- package/dist/components/ActionChoiceDialog.js.map +0 -1
- package/dist/components/ActionConfirmDialog.d.ts.map +0 -1
- package/dist/components/ActionConfirmDialog.js.map +0 -1
- package/dist/components/ActionInputDialog.d.ts.map +0 -1
- package/dist/components/ActionInputDialog.js.map +0 -1
- package/dist/components/ActionProgressDialog.d.ts.map +0 -1
- package/dist/components/ActionProgressDialog.js.map +0 -1
- package/dist/components/AgentChoiceDialog.d.ts.map +0 -1
- package/dist/components/AgentChoiceDialog.js.map +0 -1
- package/dist/components/CloseOptionsDialog.d.ts.map +0 -1
- package/dist/components/CloseOptionsDialog.js.map +0 -1
- package/dist/components/CommandPromptDialog.d.ts.map +0 -1
- package/dist/components/CommandPromptDialog.js.map +0 -1
- package/dist/components/CreatingIndicator.d.ts.map +0 -1
- package/dist/components/CreatingIndicator.js.map +0 -1
- package/dist/components/DialogBox.d.ts.map +0 -1
- package/dist/components/DialogBox.js.map +0 -1
- package/dist/components/FileCopyPrompt.d.ts.map +0 -1
- package/dist/components/FileCopyPrompt.js.map +0 -1
- package/dist/components/FooterHelp.d.ts.map +0 -1
- package/dist/components/FooterHelp.js.map +0 -1
- package/dist/components/HooksDialog.d.ts.map +0 -1
- package/dist/components/HooksDialog.js.map +0 -1
- package/dist/components/KebabMenu.d.ts.map +0 -1
- package/dist/components/KebabMenu.js.map +0 -1
- package/dist/components/LoadingIndicator.d.ts.map +0 -1
- package/dist/components/LoadingIndicator.js.map +0 -1
- package/dist/components/MergeConfirmationDialog.d.ts.map +0 -1
- package/dist/components/MergeConfirmationDialog.js.map +0 -1
- package/dist/components/PaneCard.d.ts.map +0 -1
- package/dist/components/PaneCard.js.map +0 -1
- package/dist/components/PanesGrid.d.ts.map +0 -1
- package/dist/components/PanesGrid.js.map +0 -1
- package/dist/components/QRCode.d.ts.map +0 -1
- package/dist/components/QRCode.js.map +0 -1
- package/dist/components/RunningIndicator.d.ts.map +0 -1
- package/dist/components/RunningIndicator.js.map +0 -1
- package/dist/components/SettingsDialog.d.ts.map +0 -1
- package/dist/components/SettingsDialog.js.map +0 -1
- package/dist/components/Spinner.d.ts.map +0 -1
- package/dist/components/Spinner.js.map +0 -1
- package/dist/components/UpdateDialog.d.ts.map +0 -1
- package/dist/components/UpdateDialog.js.map +0 -1
- package/dist/components/UpdatingIndicator.d.ts.map +0 -1
- package/dist/components/UpdatingIndicator.js.map +0 -1
- package/dist/decorative-pane.d.ts.map +0 -1
- package/dist/decorative-pane.js.map +0 -1
- package/dist/popups/agentChoicePopup.d.ts.map +0 -1
- package/dist/popups/agentChoicePopup.js.map +0 -1
- package/dist/popups/choicePopup.d.ts.map +0 -1
- package/dist/popups/choicePopup.js.map +0 -1
- package/dist/popups/components/FileList.d.ts.map +0 -1
- package/dist/popups/components/FileList.js.map +0 -1
- package/dist/popups/components/PopupContainer.d.ts.map +0 -1
- package/dist/popups/components/PopupContainer.js.map +0 -1
- package/dist/popups/components/PopupInputBox.d.ts.map +0 -1
- package/dist/popups/components/PopupInputBox.js.map +0 -1
- package/dist/popups/components/PopupWrapper.d.ts.map +0 -1
- package/dist/popups/components/PopupWrapper.js.map +0 -1
- package/dist/popups/components/index.d.ts.map +0 -1
- package/dist/popups/components/index.js.map +0 -1
- package/dist/popups/config.d.ts.map +0 -1
- package/dist/popups/config.js.map +0 -1
- package/dist/popups/confirmPopup.d.ts.map +0 -1
- package/dist/popups/confirmPopup.js.map +0 -1
- package/dist/popups/hooksPopup.d.ts.map +0 -1
- package/dist/popups/hooksPopup.js.map +0 -1
- package/dist/popups/inputPopup.d.ts.map +0 -1
- package/dist/popups/inputPopup.js.map +0 -1
- package/dist/popups/kebabMenuPopup.d.ts.map +0 -1
- package/dist/popups/kebabMenuPopup.js.map +0 -1
- package/dist/popups/logsPopup.d.ts.map +0 -1
- package/dist/popups/logsPopup.js.map +0 -1
- package/dist/popups/mergePopup.d.ts.map +0 -1
- package/dist/popups/mergePopup.js.map +0 -1
- package/dist/popups/newPanePopup.d.ts.map +0 -1
- package/dist/popups/newPanePopup.js.map +0 -1
- package/dist/popups/progressPopup.d.ts.map +0 -1
- package/dist/popups/progressPopup.js.map +0 -1
- package/dist/popups/remotePopup.d.ts.map +0 -1
- package/dist/popups/remotePopup.js.map +0 -1
- package/dist/popups/settingsPopup.d.ts.map +0 -1
- package/dist/popups/settingsPopup.js.map +0 -1
- package/dist/popups/shortcutsPopup.d.ts.map +0 -1
- package/dist/popups/shortcutsPopup.js.map +0 -1
- package/dist/popups/templates/SimpleInputPopup.d.ts.map +0 -1
- package/dist/popups/templates/SimpleInputPopup.js.map +0 -1
- package/dist/server/static.d.ts +0 -6
- package/dist/server/static.d.ts.map +0 -1
- package/dist/server/static.js +0 -3040
- package/dist/server/static.js.map +0 -1
- package/dist/spacer-pane.d.ts.map +0 -1
- package/dist/spacer-pane.js.map +0 -1
- /package/dist/components/{ActionChoiceDialog.js → dialogs/ActionChoiceDialog.js} +0 -0
- /package/dist/components/{ActionConfirmDialog.d.ts → dialogs/ActionConfirmDialog.d.ts} +0 -0
- /package/dist/components/{ActionConfirmDialog.js → dialogs/ActionConfirmDialog.js} +0 -0
- /package/dist/components/{ActionInputDialog.d.ts → dialogs/ActionInputDialog.d.ts} +0 -0
- /package/dist/components/{ActionProgressDialog.d.ts → dialogs/ActionProgressDialog.d.ts} +0 -0
- /package/dist/components/{ActionProgressDialog.js → dialogs/ActionProgressDialog.js} +0 -0
- /package/dist/components/{AgentChoiceDialog.d.ts → dialogs/AgentChoiceDialog.d.ts} +0 -0
- /package/dist/components/{AgentChoiceDialog.js → dialogs/AgentChoiceDialog.js} +0 -0
- /package/dist/components/{CloseOptionsDialog.js → dialogs/CloseOptionsDialog.js} +0 -0
- /package/dist/components/{CommandPromptDialog.d.ts → dialogs/CommandPromptDialog.d.ts} +0 -0
- /package/dist/components/{DialogBox.d.ts → dialogs/DialogBox.d.ts} +0 -0
- /package/dist/components/{DialogBox.js → dialogs/DialogBox.js} +0 -0
- /package/dist/components/{HooksDialog.d.ts → dialogs/HooksDialog.d.ts} +0 -0
- /package/dist/components/{HooksDialog.js → dialogs/HooksDialog.js} +0 -0
- /package/dist/components/{MergeConfirmationDialog.js → dialogs/MergeConfirmationDialog.js} +0 -0
- /package/dist/components/{SettingsDialog.js → dialogs/SettingsDialog.js} +0 -0
- /package/dist/components/{UpdateDialog.d.ts → dialogs/UpdateDialog.d.ts} +0 -0
- /package/dist/components/{UpdateDialog.js → dialogs/UpdateDialog.js} +0 -0
- /package/dist/components/{CreatingIndicator.d.ts → indicators/CreatingIndicator.d.ts} +0 -0
- /package/dist/components/{CreatingIndicator.js → indicators/CreatingIndicator.js} +0 -0
- /package/dist/components/{LoadingIndicator.d.ts → indicators/LoadingIndicator.d.ts} +0 -0
- /package/dist/components/{LoadingIndicator.js → indicators/LoadingIndicator.js} +0 -0
- /package/dist/components/{RunningIndicator.d.ts → indicators/RunningIndicator.d.ts} +0 -0
- /package/dist/components/{RunningIndicator.js → indicators/RunningIndicator.js} +0 -0
- /package/dist/components/{Spinner.d.ts → indicators/Spinner.d.ts} +0 -0
- /package/dist/components/{Spinner.js → indicators/Spinner.js} +0 -0
- /package/dist/components/{UpdatingIndicator.d.ts → indicators/UpdatingIndicator.d.ts} +0 -0
- /package/dist/components/{UpdatingIndicator.js → indicators/UpdatingIndicator.js} +0 -0
- /package/dist/{CleanTextInput.d.ts → components/inputs/CleanTextInput.d.ts} +0 -0
- /package/dist/{StyledTextInput.d.ts → components/inputs/StyledTextInput.d.ts} +0 -0
- /package/dist/{StyledTextInput.js → components/inputs/StyledTextInput.js} +0 -0
- /package/dist/components/{KebabMenu.js → panes/KebabMenu.js} +0 -0
- /package/dist/{MergePane.d.ts → components/panes/MergePane.d.ts} +0 -0
- /package/dist/{popups → components/popups}/agentChoicePopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/choicePopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/config.d.ts +0 -0
- /package/dist/{popups → components/popups}/confirmPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/hooksPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/inputPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/kebabMenuPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/logsPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/mergePopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/newPanePopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/progressPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/remotePopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/settingsPopup.d.ts +0 -0
- /package/dist/{popups/components → components/popups/shared}/FileList.d.ts +0 -0
- /package/dist/{popups/components → components/popups/shared}/FileList.js +0 -0
- /package/dist/{popups/components → components/popups/shared}/PopupContainer.d.ts +0 -0
- /package/dist/{popups/components → components/popups/shared}/PopupContainer.js +0 -0
- /package/dist/{popups/components → components/popups/shared}/PopupInputBox.d.ts +0 -0
- /package/dist/{popups/components → components/popups/shared}/PopupInputBox.js +0 -0
- /package/dist/{popups/components → components/popups/shared}/PopupWrapper.d.ts +0 -0
- /package/dist/{popups/components → components/popups/shared}/PopupWrapper.js +0 -0
- /package/dist/{popups/components → components/popups/shared}/index.d.ts +0 -0
- /package/dist/{popups/components → components/popups/shared}/index.js +0 -0
- /package/dist/{popups → components/popups}/shortcutsPopup.d.ts +0 -0
- /package/dist/{popups → components/popups}/templates/SimpleInputPopup.d.ts +0 -0
- /package/dist/components/{FileCopyPrompt.d.ts → ui/FileCopyPrompt.d.ts} +0 -0
- /package/dist/components/{FileCopyPrompt.js → ui/FileCopyPrompt.js} +0 -0
- /package/dist/components/{FooterHelp.d.ts → ui/FooterHelp.d.ts} +0 -0
- /package/dist/components/{FooterHelp.js → ui/FooterHelp.js} +0 -0
- /package/dist/components/{QRCode.d.ts → ui/QRCode.d.ts} +0 -0
- /package/dist/components/{QRCode.js → ui/QRCode.js} +0 -0
- /package/dist/{decorative-pane.d.ts → panes/decorative-pane.d.ts} +0 -0
- /package/dist/{spacer-pane.d.ts → panes/spacer-pane.d.ts} +0 -0
- /package/dist/{spacer-pane.js → panes/spacer-pane.js} +0 -0
- /package/dist/{PaneAnalyzer.d.ts → services/PaneAnalyzer.d.ts} +0 -0
|
@@ -1,639 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { Box, Text, useInput, useStdout } from 'ink';
|
|
3
|
-
import { execSync } from 'child_process';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import stringWidth from 'string-width';
|
|
6
|
-
import chalk from 'chalk';
|
|
7
|
-
const SimpleEnhancedInput = ({ value, onChange, placeholder = '', onSubmit, onCancel, isActive = true, workingDirectory = process.cwd() }) => {
|
|
8
|
-
const [cursorPosition, setCursorPosition] = useState(0);
|
|
9
|
-
const [showAutocomplete, setShowAutocomplete] = useState(false);
|
|
10
|
-
const [autocompleteQuery, setAutocompleteQuery] = useState('');
|
|
11
|
-
const [autocompleteStartPos, setAutocompleteStartPos] = useState(0);
|
|
12
|
-
const [fileMatches, setFileMatches] = useState([]);
|
|
13
|
-
const [selectedMatchIndex, setSelectedMatchIndex] = useState(0);
|
|
14
|
-
const [displayValue, setDisplayValue] = useState(value);
|
|
15
|
-
const { stdout } = useStdout();
|
|
16
|
-
const terminalWidth = stdout?.columns || 80;
|
|
17
|
-
const [pastedContent, setPastedContent] = useState(new Map());
|
|
18
|
-
// Update cursor when value changes externally
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
// Only update cursor to end if value actually changed and we're not already editing
|
|
21
|
-
if (value.length > 0 && cursorPosition === 0) {
|
|
22
|
-
// This is initial value, keep cursor at 0
|
|
23
|
-
}
|
|
24
|
-
else if (value === '') {
|
|
25
|
-
setCursorPosition(0);
|
|
26
|
-
}
|
|
27
|
-
}, [value]);
|
|
28
|
-
// Helper function to check if text looks like a paste that should be formatted
|
|
29
|
-
const shouldFormatPaste = (text) => {
|
|
30
|
-
// Only format if it's a large paste, not single newlines
|
|
31
|
-
// Single newline = user pressing shift+enter
|
|
32
|
-
// Multiple lines with content = likely a paste
|
|
33
|
-
if (text === '\n')
|
|
34
|
-
return false; // Single newline is never a paste
|
|
35
|
-
const hasMultipleLines = text.includes('\n') && text.length > 1;
|
|
36
|
-
const isVeryLong = text.length > 100;
|
|
37
|
-
// Check for code-like patterns that might break display
|
|
38
|
-
const hasSpecialChars = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/.test(text);
|
|
39
|
-
const hasAnsiCodes = /\x1b\[[0-9;]*[a-zA-Z]/.test(text);
|
|
40
|
-
return hasMultipleLines || isVeryLong || hasSpecialChars || hasAnsiCodes;
|
|
41
|
-
};
|
|
42
|
-
// Helper function to process pasted text
|
|
43
|
-
const processPastedText = (text) => {
|
|
44
|
-
if (!shouldFormatPaste(text)) {
|
|
45
|
-
return text;
|
|
46
|
-
}
|
|
47
|
-
// Generate a unique ID for this paste
|
|
48
|
-
const pasteId = pastedContent.size + 1;
|
|
49
|
-
// Store the actual content
|
|
50
|
-
const newPastedContent = new Map(pastedContent);
|
|
51
|
-
newPastedContent.set(pasteId, text);
|
|
52
|
-
setPastedContent(newPastedContent);
|
|
53
|
-
// Count lines in the pasted content
|
|
54
|
-
const lineCount = (text.match(/\n/g) || []).length + 1;
|
|
55
|
-
// Return placeholder text
|
|
56
|
-
return `[#${pasteId} pasted ${lineCount} lines]`;
|
|
57
|
-
};
|
|
58
|
-
// Helper function to get the actual value with pasted content restored
|
|
59
|
-
const getActualValue = () => {
|
|
60
|
-
let actualValue = displayValue;
|
|
61
|
-
// Replace all placeholders with actual content
|
|
62
|
-
pastedContent.forEach((content, id) => {
|
|
63
|
-
const placeholder = `[#${id} pasted ${(content.match(/\n/g) || []).length + 1} lines]`;
|
|
64
|
-
actualValue = actualValue.replace(placeholder, content);
|
|
65
|
-
});
|
|
66
|
-
return actualValue;
|
|
67
|
-
};
|
|
68
|
-
// Update display value when value prop changes
|
|
69
|
-
useEffect(() => {
|
|
70
|
-
setDisplayValue(value);
|
|
71
|
-
// Clear pasted content when value is cleared
|
|
72
|
-
if (value === '') {
|
|
73
|
-
setPastedContent(new Map());
|
|
74
|
-
}
|
|
75
|
-
}, [value]);
|
|
76
|
-
// Search for files when autocomplete query changes or when @ is typed
|
|
77
|
-
useEffect(() => {
|
|
78
|
-
if (showAutocomplete) {
|
|
79
|
-
searchFiles(autocompleteQuery);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
setFileMatches([]);
|
|
83
|
-
}
|
|
84
|
-
}, [autocompleteQuery, showAutocomplete]);
|
|
85
|
-
const searchFiles = async (query) => {
|
|
86
|
-
try {
|
|
87
|
-
// Directories to exclude from search
|
|
88
|
-
const excludeDirs = [
|
|
89
|
-
'node_modules',
|
|
90
|
-
'.git',
|
|
91
|
-
'dist',
|
|
92
|
-
'build',
|
|
93
|
-
'.next',
|
|
94
|
-
'.nuxt',
|
|
95
|
-
'.cache',
|
|
96
|
-
'coverage',
|
|
97
|
-
'.vscode',
|
|
98
|
-
'.idea',
|
|
99
|
-
'vendor',
|
|
100
|
-
'target',
|
|
101
|
-
'.pnpm-store',
|
|
102
|
-
'__pycache__',
|
|
103
|
-
'.pytest_cache',
|
|
104
|
-
'.tox',
|
|
105
|
-
'venv',
|
|
106
|
-
'.venv',
|
|
107
|
-
'env',
|
|
108
|
-
'.env'
|
|
109
|
-
];
|
|
110
|
-
// Build exclude arguments for find command
|
|
111
|
-
const excludeArgs = excludeDirs.map(dir => `-path "*/${dir}" -prune -o`).join(' ');
|
|
112
|
-
// If query is empty, show root directory files
|
|
113
|
-
let searchCmd;
|
|
114
|
-
let dirSearchCmd;
|
|
115
|
-
// Check if query is a directory path (ends with /)
|
|
116
|
-
const isDirectoryPath = query.endsWith('/');
|
|
117
|
-
if (query === '') {
|
|
118
|
-
// Show files and directories in the root of the working directory (excluding common dirs)
|
|
119
|
-
searchCmd = `find "${workingDirectory}" -maxdepth 1 \\( ${excludeArgs} -type f -print \\) 2>/dev/null | head -20`;
|
|
120
|
-
dirSearchCmd = `find "${workingDirectory}" -maxdepth 1 \\( ${excludeArgs} -type d -print \\) 2>/dev/null | grep -v "^${workingDirectory}$" | head -10`;
|
|
121
|
-
}
|
|
122
|
-
else if (isDirectoryPath) {
|
|
123
|
-
// Navigate into directory - show contents of the specified directory
|
|
124
|
-
const dirPath = path.join(workingDirectory, query.slice(0, -1)); // Remove trailing slash
|
|
125
|
-
searchCmd = `find "${dirPath}" -maxdepth 1 \\( ${excludeArgs} -type f -print \\) 2>/dev/null | head -20`;
|
|
126
|
-
dirSearchCmd = `find "${dirPath}" -maxdepth 1 \\( ${excludeArgs} -type d -print \\) 2>/dev/null | grep -v "^${dirPath}$" | head -10`;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
// Search for files matching the query (excluding common dirs)
|
|
130
|
-
searchCmd = `find "${workingDirectory}" \\( ${excludeArgs} -type f -name "*${query}*" -print \\) 2>/dev/null | head -20`;
|
|
131
|
-
dirSearchCmd = `find "${workingDirectory}" \\( ${excludeArgs} -type d -name "*${query}*" -print \\) 2>/dev/null | head -10`;
|
|
132
|
-
}
|
|
133
|
-
let fileResults = [];
|
|
134
|
-
let dirResults = [];
|
|
135
|
-
try {
|
|
136
|
-
fileResults = execSync(searchCmd, { encoding: 'utf-8' }).trim().split('\n').filter(Boolean);
|
|
137
|
-
}
|
|
138
|
-
catch { }
|
|
139
|
-
try {
|
|
140
|
-
dirResults = execSync(dirSearchCmd, { encoding: 'utf-8' }).trim().split('\n').filter(Boolean);
|
|
141
|
-
}
|
|
142
|
-
catch { }
|
|
143
|
-
const matches = [];
|
|
144
|
-
// Helper to check if path contains excluded directories
|
|
145
|
-
const isExcluded = (filepath) => {
|
|
146
|
-
const excludedPatterns = [
|
|
147
|
-
'node_modules', '.git', 'dist', 'build', '.next', '.nuxt',
|
|
148
|
-
'.cache', 'coverage', '.vscode', '.idea', 'vendor', 'target',
|
|
149
|
-
'.pnpm-store', '__pycache__', '.pytest_cache', '.tox',
|
|
150
|
-
'venv', '.venv', 'env', '.env'
|
|
151
|
-
];
|
|
152
|
-
return excludedPatterns.some(pattern => filepath.includes(`/${pattern}/`) || filepath.endsWith(`/${pattern}`));
|
|
153
|
-
};
|
|
154
|
-
// Process directory matches
|
|
155
|
-
for (const dirPath of dirResults) {
|
|
156
|
-
if (isExcluded(dirPath))
|
|
157
|
-
continue;
|
|
158
|
-
const relativePath = path.relative(workingDirectory, dirPath);
|
|
159
|
-
if (relativePath && !relativePath.startsWith('..')) {
|
|
160
|
-
// When browsing within a directory, adjust the display path
|
|
161
|
-
let displayPath = relativePath;
|
|
162
|
-
if (isDirectoryPath && query) {
|
|
163
|
-
// We're inside a subdirectory, show just the item name
|
|
164
|
-
displayPath = path.basename(dirPath);
|
|
165
|
-
}
|
|
166
|
-
matches.push({
|
|
167
|
-
path: dirPath,
|
|
168
|
-
displayPath: displayPath + '/',
|
|
169
|
-
type: 'directory'
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// Process file matches
|
|
174
|
-
for (const filePath of fileResults) {
|
|
175
|
-
if (isExcluded(filePath))
|
|
176
|
-
continue;
|
|
177
|
-
const relativePath = path.relative(workingDirectory, filePath);
|
|
178
|
-
if (relativePath && !relativePath.startsWith('..')) {
|
|
179
|
-
// When browsing within a directory, adjust the display path
|
|
180
|
-
let displayPath = relativePath;
|
|
181
|
-
if (isDirectoryPath && query) {
|
|
182
|
-
// We're inside a subdirectory, show just the item name
|
|
183
|
-
displayPath = path.basename(filePath);
|
|
184
|
-
}
|
|
185
|
-
matches.push({
|
|
186
|
-
path: filePath,
|
|
187
|
-
displayPath: displayPath,
|
|
188
|
-
type: 'file'
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// Sort by relevance
|
|
193
|
-
matches.sort((a, b) => {
|
|
194
|
-
const aScore = a.displayPath.length;
|
|
195
|
-
const bScore = b.displayPath.length;
|
|
196
|
-
return aScore - bScore;
|
|
197
|
-
});
|
|
198
|
-
setFileMatches(matches.slice(0, 10));
|
|
199
|
-
setSelectedMatchIndex(0);
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
setFileMatches([]);
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
const insertText = (text, position, isPaste = false) => {
|
|
206
|
-
// Process text if it's a paste
|
|
207
|
-
const processedText = isPaste ? processPastedText(text) : text;
|
|
208
|
-
const before = displayValue.slice(0, position);
|
|
209
|
-
const after = displayValue.slice(position);
|
|
210
|
-
const newDisplayValue = before + processedText + after;
|
|
211
|
-
setDisplayValue(newDisplayValue);
|
|
212
|
-
// Update the actual value with processed text (placeholder for pastes)
|
|
213
|
-
const newValue = before + processedText + after;
|
|
214
|
-
onChange(newValue);
|
|
215
|
-
// Update cursor position - just move by the length of inserted text
|
|
216
|
-
// Don't add any special handling for wrapping
|
|
217
|
-
const newCursorPos = position + processedText.length;
|
|
218
|
-
setCursorPosition(newCursorPos);
|
|
219
|
-
};
|
|
220
|
-
const deleteText = (start, end) => {
|
|
221
|
-
const before = displayValue.slice(0, start);
|
|
222
|
-
const after = displayValue.slice(end);
|
|
223
|
-
const newDisplayValue = before + after;
|
|
224
|
-
setDisplayValue(newDisplayValue);
|
|
225
|
-
onChange(newDisplayValue);
|
|
226
|
-
setCursorPosition(start);
|
|
227
|
-
};
|
|
228
|
-
const moveCursor = (position) => {
|
|
229
|
-
const clampedPosition = Math.max(0, Math.min(displayValue.length, position));
|
|
230
|
-
setCursorPosition(clampedPosition);
|
|
231
|
-
};
|
|
232
|
-
// Gemini CLI-style buffer system with proper line tracking
|
|
233
|
-
const getBuffer = (text, width) => {
|
|
234
|
-
const lines = [];
|
|
235
|
-
let charPosition = 0;
|
|
236
|
-
const charToLineMap = [];
|
|
237
|
-
// Split by actual newlines first
|
|
238
|
-
const logicalLines = text.split('\n');
|
|
239
|
-
for (let logicalIdx = 0; logicalIdx < logicalLines.length; logicalIdx++) {
|
|
240
|
-
const logicalLine = logicalLines[logicalIdx];
|
|
241
|
-
if (logicalLine.length === 0) {
|
|
242
|
-
// Empty line
|
|
243
|
-
lines.push('');
|
|
244
|
-
charToLineMap[charPosition] = { line: lines.length - 1, col: 0 };
|
|
245
|
-
charPosition += 1; // for the newline
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
// Break this logical line into visual lines
|
|
249
|
-
let remaining = logicalLine;
|
|
250
|
-
let isFirstWrap = true;
|
|
251
|
-
while (remaining.length > 0) {
|
|
252
|
-
let lineContent = '';
|
|
253
|
-
let charsUsed = 0;
|
|
254
|
-
// Try to fit as many complete words as possible
|
|
255
|
-
const words = remaining.split(' ');
|
|
256
|
-
let wordIndex = 0;
|
|
257
|
-
while (wordIndex < words.length) {
|
|
258
|
-
const word = words[wordIndex];
|
|
259
|
-
const separator = (wordIndex === 0 || lineContent === '') ? '' : ' ';
|
|
260
|
-
const testContent = lineContent + separator + word;
|
|
261
|
-
if (stringWidth(testContent) <= width) {
|
|
262
|
-
lineContent = testContent;
|
|
263
|
-
charsUsed += (separator + word).length;
|
|
264
|
-
wordIndex++;
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
// This word doesn't fit
|
|
268
|
-
if (lineContent === '') {
|
|
269
|
-
// Word is longer than line width, break it
|
|
270
|
-
let charCount = 0;
|
|
271
|
-
for (let i = 0; i < word.length; i++) {
|
|
272
|
-
const testChar = word.slice(0, i + 1);
|
|
273
|
-
if (stringWidth(testChar) <= width) {
|
|
274
|
-
charCount = i + 1;
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
lineContent = word.slice(0, Math.max(1, charCount));
|
|
281
|
-
charsUsed = lineContent.length;
|
|
282
|
-
}
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
// Add this visual line
|
|
287
|
-
lines.push(lineContent);
|
|
288
|
-
// Map character positions to line/col
|
|
289
|
-
for (let i = 0; i < charsUsed; i++) {
|
|
290
|
-
charToLineMap[charPosition + i] = {
|
|
291
|
-
line: lines.length - 1,
|
|
292
|
-
col: i
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
// Move to next part
|
|
296
|
-
remaining = remaining.slice(charsUsed).trimStart();
|
|
297
|
-
charPosition += charsUsed;
|
|
298
|
-
// Skip spaces that were trimmed
|
|
299
|
-
const originalRemaining = logicalLine.slice(charPosition - (logicalIdx === 0 ? 0 : logicalIdx));
|
|
300
|
-
const spacesToSkip = originalRemaining.length - remaining.length - charsUsed;
|
|
301
|
-
if (spacesToSkip > 0 && !isFirstWrap) {
|
|
302
|
-
charPosition += spacesToSkip;
|
|
303
|
-
}
|
|
304
|
-
isFirstWrap = false;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
// Add newline mapping if not last logical line
|
|
308
|
-
if (logicalIdx < logicalLines.length - 1) {
|
|
309
|
-
charToLineMap[charPosition] = {
|
|
310
|
-
line: lines.length - 1,
|
|
311
|
-
col: lines[lines.length - 1]?.length || 0
|
|
312
|
-
};
|
|
313
|
-
charPosition += 1;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
// Handle cursor at end
|
|
317
|
-
if (charPosition <= text.length) {
|
|
318
|
-
charToLineMap[text.length] = {
|
|
319
|
-
line: Math.max(0, lines.length - 1),
|
|
320
|
-
col: lines[lines.length - 1]?.length || 0
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
return { lines, charToLineMap };
|
|
324
|
-
};
|
|
325
|
-
const findWordBoundary = (text, position, direction) => {
|
|
326
|
-
const wordRegex = /\w/;
|
|
327
|
-
let pos = position;
|
|
328
|
-
if (direction === 'left') {
|
|
329
|
-
// Skip any non-word chars
|
|
330
|
-
while (pos > 0 && !wordRegex.test(text[pos - 1])) {
|
|
331
|
-
pos--;
|
|
332
|
-
}
|
|
333
|
-
// Skip the word
|
|
334
|
-
while (pos > 0 && wordRegex.test(text[pos - 1])) {
|
|
335
|
-
pos--;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
// Skip any non-word chars
|
|
340
|
-
while (pos < text.length && !wordRegex.test(text[pos])) {
|
|
341
|
-
pos++;
|
|
342
|
-
}
|
|
343
|
-
// Skip the word
|
|
344
|
-
while (pos < text.length && wordRegex.test(text[pos])) {
|
|
345
|
-
pos++;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
return pos;
|
|
349
|
-
};
|
|
350
|
-
const completeFileReference = (match) => {
|
|
351
|
-
const before = displayValue.slice(0, autocompleteStartPos);
|
|
352
|
-
const after = displayValue.slice(cursorPosition);
|
|
353
|
-
// Build the complete path to insert
|
|
354
|
-
let completePath;
|
|
355
|
-
if (autocompleteQuery.endsWith('/')) {
|
|
356
|
-
// We're in a subdirectory, need to build the full path
|
|
357
|
-
completePath = autocompleteQuery + match.displayPath.replace(/\/$/, ''); // Remove trailing slash from directories
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
// Use the relative path from working directory
|
|
361
|
-
completePath = path.relative(workingDirectory, match.path);
|
|
362
|
-
}
|
|
363
|
-
const newDisplayValue = before + completePath + after;
|
|
364
|
-
setDisplayValue(newDisplayValue);
|
|
365
|
-
onChange(newDisplayValue);
|
|
366
|
-
setCursorPosition(autocompleteStartPos + completePath.length);
|
|
367
|
-
setShowAutocomplete(false);
|
|
368
|
-
setAutocompleteQuery('');
|
|
369
|
-
};
|
|
370
|
-
useInput((input, key) => {
|
|
371
|
-
// Only handle input when active
|
|
372
|
-
if (!isActive)
|
|
373
|
-
return;
|
|
374
|
-
// Handle autocomplete navigation
|
|
375
|
-
if (showAutocomplete) {
|
|
376
|
-
if (key.escape) {
|
|
377
|
-
setShowAutocomplete(false);
|
|
378
|
-
setAutocompleteQuery('');
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
else if (key.upArrow) {
|
|
382
|
-
setSelectedMatchIndex(Math.max(0, selectedMatchIndex - 1));
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
else if (key.downArrow) {
|
|
386
|
-
setSelectedMatchIndex(Math.min(fileMatches.length - 1, selectedMatchIndex + 1));
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
else if (key.rightArrow) {
|
|
390
|
-
// Navigate into directory with right arrow
|
|
391
|
-
if (fileMatches.length > 0) {
|
|
392
|
-
const selectedMatch = fileMatches[selectedMatchIndex];
|
|
393
|
-
if (selectedMatch.type === 'directory') {
|
|
394
|
-
// Build the full path for navigation
|
|
395
|
-
let newQuery;
|
|
396
|
-
if (autocompleteQuery.endsWith('/')) {
|
|
397
|
-
// We're already in a directory, append the selected subdirectory
|
|
398
|
-
newQuery = autocompleteQuery + selectedMatch.displayPath;
|
|
399
|
-
}
|
|
400
|
-
else if (autocompleteQuery) {
|
|
401
|
-
// We have a search query, replace it with the full path
|
|
402
|
-
const relativePath = path.relative(workingDirectory, selectedMatch.path);
|
|
403
|
-
newQuery = relativePath + '/';
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
// We're at root, use the display path
|
|
407
|
-
newQuery = selectedMatch.displayPath;
|
|
408
|
-
}
|
|
409
|
-
setAutocompleteQuery(newQuery);
|
|
410
|
-
// Trigger a new search within this directory
|
|
411
|
-
searchFiles(newQuery);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
else if (key.leftArrow) {
|
|
417
|
-
// Navigate back/up one directory level with left arrow
|
|
418
|
-
if (autocompleteQuery.includes('/')) {
|
|
419
|
-
// Remove the last directory segment
|
|
420
|
-
const segments = autocompleteQuery.split('/');
|
|
421
|
-
segments.pop(); // Remove last segment
|
|
422
|
-
if (segments.length > 0) {
|
|
423
|
-
segments.pop(); // Remove the directory we're going back from
|
|
424
|
-
const newQuery = segments.length > 0 ? segments.join('/') + '/' : '';
|
|
425
|
-
setAutocompleteQuery(newQuery);
|
|
426
|
-
searchFiles(newQuery);
|
|
427
|
-
}
|
|
428
|
-
else {
|
|
429
|
-
// Go back to root
|
|
430
|
-
setAutocompleteQuery('');
|
|
431
|
-
searchFiles('');
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
else if (autocompleteQuery !== '') {
|
|
435
|
-
// Go back to root if we have a query but no slashes
|
|
436
|
-
setAutocompleteQuery('');
|
|
437
|
-
searchFiles('');
|
|
438
|
-
}
|
|
439
|
-
return;
|
|
440
|
-
}
|
|
441
|
-
else if (key.return || key.tab) {
|
|
442
|
-
if (fileMatches.length > 0) {
|
|
443
|
-
completeFileReference(fileMatches[selectedMatchIndex]);
|
|
444
|
-
}
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
// Handle special keys
|
|
449
|
-
if (key.escape) {
|
|
450
|
-
onCancel?.();
|
|
451
|
-
return;
|
|
452
|
-
}
|
|
453
|
-
if (key.shift && key.return) {
|
|
454
|
-
// Insert newline for multiline input
|
|
455
|
-
// Force insert a newline character directly into the value
|
|
456
|
-
const before = displayValue.slice(0, cursorPosition);
|
|
457
|
-
const after = displayValue.slice(cursorPosition);
|
|
458
|
-
const newValue = before + '\n' + after;
|
|
459
|
-
setDisplayValue(newValue);
|
|
460
|
-
onChange(newValue);
|
|
461
|
-
setCursorPosition(cursorPosition + 1);
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
if (key.return && !key.shift) {
|
|
465
|
-
// Get the actual value with pasted content restored before submitting
|
|
466
|
-
const actualValue = getActualValue();
|
|
467
|
-
onChange(actualValue);
|
|
468
|
-
onSubmit?.();
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
// Buffer-based navigation like Gemini CLI
|
|
472
|
-
if (!showAutocomplete && key.upArrow) {
|
|
473
|
-
const inputWidth = Math.max(1, terminalWidth - 4);
|
|
474
|
-
const buffer = getBuffer(displayValue, inputWidth);
|
|
475
|
-
const currentPos = buffer.charToLineMap[cursorPosition] || { line: 0, col: 0 };
|
|
476
|
-
if (currentPos.line > 0) {
|
|
477
|
-
const targetLine = currentPos.line - 1;
|
|
478
|
-
const targetLineLength = buffer.lines[targetLine].length;
|
|
479
|
-
const targetColumn = Math.min(currentPos.col, targetLineLength);
|
|
480
|
-
// Find character position for this line/column
|
|
481
|
-
let newCursorPos = 0;
|
|
482
|
-
for (let charPos = 0; charPos < displayValue.length; charPos++) {
|
|
483
|
-
const mapped = buffer.charToLineMap[charPos];
|
|
484
|
-
if (mapped && mapped.line === targetLine && mapped.col === targetColumn) {
|
|
485
|
-
newCursorPos = charPos;
|
|
486
|
-
break;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
moveCursor(newCursorPos);
|
|
490
|
-
}
|
|
491
|
-
return;
|
|
492
|
-
}
|
|
493
|
-
if (!showAutocomplete && key.downArrow) {
|
|
494
|
-
const inputWidth = Math.max(1, terminalWidth - 4);
|
|
495
|
-
const buffer = getBuffer(displayValue, inputWidth);
|
|
496
|
-
const currentPos = buffer.charToLineMap[cursorPosition] || { line: 0, col: 0 };
|
|
497
|
-
if (currentPos.line < buffer.lines.length - 1) {
|
|
498
|
-
const targetLine = currentPos.line + 1;
|
|
499
|
-
const targetLineLength = buffer.lines[targetLine].length;
|
|
500
|
-
const targetColumn = Math.min(currentPos.col, targetLineLength);
|
|
501
|
-
// Find character position for this line/column
|
|
502
|
-
let newCursorPos = displayValue.length;
|
|
503
|
-
for (let charPos = 0; charPos <= displayValue.length; charPos++) {
|
|
504
|
-
const mapped = buffer.charToLineMap[charPos];
|
|
505
|
-
if (mapped && mapped.line === targetLine && mapped.col === targetColumn) {
|
|
506
|
-
newCursorPos = charPos;
|
|
507
|
-
break;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
moveCursor(newCursorPos);
|
|
511
|
-
}
|
|
512
|
-
else {
|
|
513
|
-
// At last line, move to end
|
|
514
|
-
moveCursor(displayValue.length);
|
|
515
|
-
}
|
|
516
|
-
return;
|
|
517
|
-
}
|
|
518
|
-
// Cursor movement
|
|
519
|
-
if (key.leftArrow) {
|
|
520
|
-
if (key.meta || key.alt || key.option) {
|
|
521
|
-
// Move to previous word
|
|
522
|
-
const newPos = findWordBoundary(displayValue, cursorPosition, 'left');
|
|
523
|
-
moveCursor(newPos);
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
// Regular left movement - skip over newlines
|
|
527
|
-
if (cursorPosition > 0) {
|
|
528
|
-
moveCursor(cursorPosition - 1);
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
return;
|
|
532
|
-
}
|
|
533
|
-
if (key.rightArrow) {
|
|
534
|
-
if (key.meta || key.alt || key.option) {
|
|
535
|
-
// Move to next word
|
|
536
|
-
const newPos = findWordBoundary(displayValue, cursorPosition, 'right');
|
|
537
|
-
moveCursor(newPos);
|
|
538
|
-
}
|
|
539
|
-
else {
|
|
540
|
-
// Regular right movement - skip over newlines
|
|
541
|
-
if (cursorPosition < displayValue.length) {
|
|
542
|
-
moveCursor(cursorPosition + 1);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
return;
|
|
546
|
-
}
|
|
547
|
-
// Home/End keys - Ctrl+A / Ctrl+E
|
|
548
|
-
if (key.ctrl && input === 'a') {
|
|
549
|
-
moveCursor(0);
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
|
-
if (key.ctrl && input === 'e') {
|
|
553
|
-
moveCursor(displayValue.length);
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
// Deletion
|
|
557
|
-
if (key.backspace || key.delete) {
|
|
558
|
-
if (key.meta || key.alt || key.option) {
|
|
559
|
-
// Delete word
|
|
560
|
-
const wordStart = findWordBoundary(displayValue, cursorPosition, 'left');
|
|
561
|
-
deleteText(wordStart, cursorPosition);
|
|
562
|
-
}
|
|
563
|
-
else if (cursorPosition > 0) {
|
|
564
|
-
deleteText(cursorPosition - 1, cursorPosition);
|
|
565
|
-
}
|
|
566
|
-
return;
|
|
567
|
-
}
|
|
568
|
-
// Text input
|
|
569
|
-
if (input && !key.ctrl && !key.meta) {
|
|
570
|
-
// Detect paste by checking if input is unusually long or contains special characters
|
|
571
|
-
const isPaste = input.length > 1 && shouldFormatPaste(input);
|
|
572
|
-
// Use input as-is - terminal wrapping is visual only, not actual newlines
|
|
573
|
-
const filteredInput = input;
|
|
574
|
-
// Check for @ symbol to trigger autocomplete
|
|
575
|
-
if (filteredInput === '@') {
|
|
576
|
-
setShowAutocomplete(true);
|
|
577
|
-
setAutocompleteStartPos(cursorPosition + 1);
|
|
578
|
-
setAutocompleteQuery('');
|
|
579
|
-
insertText(filteredInput, cursorPosition, false);
|
|
580
|
-
}
|
|
581
|
-
else if (showAutocomplete) {
|
|
582
|
-
// Update autocomplete query
|
|
583
|
-
insertText(filteredInput, cursorPosition, isPaste);
|
|
584
|
-
const newQuery = displayValue.slice(autocompleteStartPos, cursorPosition + 1) + filteredInput;
|
|
585
|
-
setAutocompleteQuery(newQuery);
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
insertText(filteredInput, cursorPosition, isPaste);
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
});
|
|
592
|
-
// Gemini CLI-style display with proper buffer-based cursor calculation
|
|
593
|
-
const getDisplayWithCursor = () => {
|
|
594
|
-
const inputWidth = Math.max(1, terminalWidth - 4);
|
|
595
|
-
const buffer = getBuffer(displayValue, inputWidth);
|
|
596
|
-
// Get cursor position from the character map
|
|
597
|
-
const cursorPos = buffer.charToLineMap[cursorPosition] || { line: 0, col: 0 };
|
|
598
|
-
const cursorLine = cursorPos.line;
|
|
599
|
-
const cursorColumn = cursorPos.col;
|
|
600
|
-
// Handle empty input
|
|
601
|
-
if (buffer.lines.length === 0 || (buffer.lines.length === 1 && buffer.lines[0] === '')) {
|
|
602
|
-
return (React.createElement(Box, null,
|
|
603
|
-
React.createElement(Text, null, chalk.inverse(' ')),
|
|
604
|
-
placeholder && React.createElement(Text, { dimColor: true }, placeholder)));
|
|
605
|
-
}
|
|
606
|
-
return (React.createElement(Box, { flexDirection: "column" }, buffer.lines.map((line, idx) => {
|
|
607
|
-
if (idx === cursorLine) {
|
|
608
|
-
// Line with cursor - exact Gemini CLI approach
|
|
609
|
-
const beforeCursor = line.slice(0, cursorColumn);
|
|
610
|
-
const atCursor = line[cursorColumn] || ' ';
|
|
611
|
-
const afterCursor = line.slice(cursorColumn + 1);
|
|
612
|
-
return (React.createElement(Box, { key: idx },
|
|
613
|
-
React.createElement(Text, null, beforeCursor),
|
|
614
|
-
React.createElement(Text, null, chalk.inverse(atCursor)),
|
|
615
|
-
React.createElement(Text, null, afterCursor)));
|
|
616
|
-
}
|
|
617
|
-
else {
|
|
618
|
-
return React.createElement(Text, { key: idx }, line);
|
|
619
|
-
}
|
|
620
|
-
})));
|
|
621
|
-
};
|
|
622
|
-
return (React.createElement(Box, { flexDirection: "column" },
|
|
623
|
-
React.createElement(Box, null, displayValue ? (getDisplayWithCursor()) : (React.createElement(React.Fragment, null,
|
|
624
|
-
React.createElement(Text, { inverse: true }, " "),
|
|
625
|
-
placeholder && React.createElement(Text, { dimColor: true }, placeholder)))),
|
|
626
|
-
showAutocomplete && fileMatches.length > 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1, borderStyle: "single", borderColor: "cyan", paddingX: 1 },
|
|
627
|
-
React.createElement(Text, { color: "cyan", dimColor: true }, autocompleteQuery.endsWith('/')
|
|
628
|
-
? `Browsing: @${autocompleteQuery}`
|
|
629
|
-
: autocompleteQuery
|
|
630
|
-
? `Files matching: @${autocompleteQuery}`
|
|
631
|
-
: 'Files in current directory:'),
|
|
632
|
-
fileMatches.map((match, index) => (React.createElement(Box, { key: match.path },
|
|
633
|
-
React.createElement(Text, { color: index === selectedMatchIndex ? 'cyan' : 'gray' },
|
|
634
|
-
index === selectedMatchIndex ? '▶ ' : ' ',
|
|
635
|
-
match.displayPath)))),
|
|
636
|
-
React.createElement(Text, { dimColor: true, italic: true }, "\u2191\u2193 select \u2022 \u2192 enter directory \u2022 \u2190 go back \u2022 Tab/Enter complete \u2022 Esc cancel")))));
|
|
637
|
-
};
|
|
638
|
-
export default SimpleEnhancedInput;
|
|
639
|
-
//# sourceMappingURL=SimpleEnhancedInput.js.map
|