turboflux 1.0.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/LICENSE +21 -0
- package/README.md +177 -0
- package/bin/turboflux.mjs +28 -0
- package/dist/cli/brand.d.ts +7 -0
- package/dist/cli/brand.js +33 -0
- package/dist/cli/brand.js.map +1 -0
- package/dist/cli/commands/index.d.ts +4 -0
- package/dist/cli/commands/index.js +671 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/registry.d.ts +24 -0
- package/dist/cli/commands/registry.js +124 -0
- package/dist/cli/commands/registry.js.map +1 -0
- package/dist/cli/commands/types.d.ts +69 -0
- package/dist/cli/commands/types.js +2 -0
- package/dist/cli/commands/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +15 -0
- package/dist/cli/components/App.js +1738 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/ConversationHistory.d.ts +15 -0
- package/dist/cli/components/ConversationHistory.js +92 -0
- package/dist/cli/components/ConversationHistory.js.map +1 -0
- package/dist/cli/components/TranscriptViewport.d.ts +25 -0
- package/dist/cli/components/TranscriptViewport.js +77 -0
- package/dist/cli/components/TranscriptViewport.js.map +1 -0
- package/dist/cli/components/agentActivityModel.d.ts +24 -0
- package/dist/cli/components/agentActivityModel.js +45 -0
- package/dist/cli/components/agentActivityModel.js.map +1 -0
- package/dist/cli/components/appHelpers.d.ts +34 -0
- package/dist/cli/components/appHelpers.js +209 -0
- package/dist/cli/components/appHelpers.js.map +1 -0
- package/dist/cli/components/design-system/StatusIcon.d.ts +5 -0
- package/dist/cli/components/design-system/StatusIcon.js +25 -0
- package/dist/cli/components/design-system/StatusIcon.js.map +1 -0
- package/dist/cli/components/developerFlowModel.d.ts +36 -0
- package/dist/cli/components/developerFlowModel.js +88 -0
- package/dist/cli/components/developerFlowModel.js.map +1 -0
- package/dist/cli/components/diff/DiffCard.d.ts +16 -0
- package/dist/cli/components/diff/DiffCard.js +30 -0
- package/dist/cli/components/diff/DiffCard.js.map +1 -0
- package/dist/cli/components/diff/DiffHunks.d.ts +11 -0
- package/dist/cli/components/diff/DiffHunks.js +58 -0
- package/dist/cli/components/diff/DiffHunks.js.map +1 -0
- package/dist/cli/components/header/Header.d.ts +13 -0
- package/dist/cli/components/header/Header.js +25 -0
- package/dist/cli/components/header/Header.js.map +1 -0
- package/dist/cli/components/header/Mascot.d.ts +4 -0
- package/dist/cli/components/header/Mascot.js +53 -0
- package/dist/cli/components/header/Mascot.js.map +1 -0
- package/dist/cli/components/header/StatusLine.d.ts +21 -0
- package/dist/cli/components/header/StatusLine.js +110 -0
- package/dist/cli/components/header/StatusLine.js.map +1 -0
- package/dist/cli/components/input/EffortPicker.d.ts +30 -0
- package/dist/cli/components/input/EffortPicker.js +126 -0
- package/dist/cli/components/input/EffortPicker.js.map +1 -0
- package/dist/cli/components/input/ModelPicker.d.ts +15 -0
- package/dist/cli/components/input/ModelPicker.js +95 -0
- package/dist/cli/components/input/ModelPicker.js.map +1 -0
- package/dist/cli/components/input/PromptInput.d.ts +79 -0
- package/dist/cli/components/input/PromptInput.js +496 -0
- package/dist/cli/components/input/PromptInput.js.map +1 -0
- package/dist/cli/components/input/RewindSelector.d.ts +8 -0
- package/dist/cli/components/input/RewindSelector.js +45 -0
- package/dist/cli/components/input/RewindSelector.js.map +1 -0
- package/dist/cli/components/input/pasteState.d.ts +6 -0
- package/dist/cli/components/input/pasteState.js +42 -0
- package/dist/cli/components/input/pasteState.js.map +1 -0
- package/dist/cli/components/input/terminalInputStateMachine.d.ts +29 -0
- package/dist/cli/components/input/terminalInputStateMachine.js +67 -0
- package/dist/cli/components/input/terminalInputStateMachine.js.map +1 -0
- package/dist/cli/components/layout/CockpitRails.d.ts +6 -0
- package/dist/cli/components/layout/CockpitRails.js +13 -0
- package/dist/cli/components/layout/CockpitRails.js.map +1 -0
- package/dist/cli/components/layout/LandingView.d.ts +15 -0
- package/dist/cli/components/layout/LandingView.js +12 -0
- package/dist/cli/components/layout/LandingView.js.map +1 -0
- package/dist/cli/components/layout/SessionSidebar.d.ts +18 -0
- package/dist/cli/components/layout/SessionSidebar.js +70 -0
- package/dist/cli/components/layout/SessionSidebar.js.map +1 -0
- package/dist/cli/components/layout/StartupAnimation.d.ts +14 -0
- package/dist/cli/components/layout/StartupAnimation.js +30 -0
- package/dist/cli/components/layout/StartupAnimation.js.map +1 -0
- package/dist/cli/components/markdown/highlighter.d.ts +1 -0
- package/dist/cli/components/markdown/highlighter.js +110 -0
- package/dist/cli/components/markdown/highlighter.js.map +1 -0
- package/dist/cli/components/markdown/index.d.ts +11 -0
- package/dist/cli/components/markdown/index.js +86 -0
- package/dist/cli/components/markdown/index.js.map +1 -0
- package/dist/cli/components/messages/MessageList.d.ts +16 -0
- package/dist/cli/components/messages/MessageList.js +56 -0
- package/dist/cli/components/messages/MessageList.js.map +1 -0
- package/dist/cli/components/messages/Messages.d.ts +26 -0
- package/dist/cli/components/messages/Messages.js +32 -0
- package/dist/cli/components/messages/Messages.js.map +1 -0
- package/dist/cli/components/messages/ThinkingBlock.d.ts +9 -0
- package/dist/cli/components/messages/ThinkingBlock.js +51 -0
- package/dist/cli/components/messages/ThinkingBlock.js.map +1 -0
- package/dist/cli/components/messages/WindowedMessageList.d.ts +21 -0
- package/dist/cli/components/messages/WindowedMessageList.js +44 -0
- package/dist/cli/components/messages/WindowedMessageList.js.map +1 -0
- package/dist/cli/components/permissions/PermissionDialog.d.ts +23 -0
- package/dist/cli/components/permissions/PermissionDialog.js +83 -0
- package/dist/cli/components/permissions/PermissionDialog.js.map +1 -0
- package/dist/cli/components/spinner/SpinnerGlyph.d.ts +6 -0
- package/dist/cli/components/spinner/SpinnerGlyph.js +55 -0
- package/dist/cli/components/spinner/SpinnerGlyph.js.map +1 -0
- package/dist/cli/components/spinner/constants.d.ts +4 -0
- package/dist/cli/components/spinner/constants.js +5 -0
- package/dist/cli/components/spinner/constants.js.map +1 -0
- package/dist/cli/components/tools/ActiveWorkPanel.d.ts +22 -0
- package/dist/cli/components/tools/ActiveWorkPanel.js +70 -0
- package/dist/cli/components/tools/ActiveWorkPanel.js.map +1 -0
- package/dist/cli/components/tools/AgentActivityLine.d.ts +13 -0
- package/dist/cli/components/tools/AgentActivityLine.js +88 -0
- package/dist/cli/components/tools/AgentActivityLine.js.map +1 -0
- package/dist/cli/components/tools/QueuedPromptList.d.ts +10 -0
- package/dist/cli/components/tools/QueuedPromptList.js +26 -0
- package/dist/cli/components/tools/QueuedPromptList.js.map +1 -0
- package/dist/cli/components/tools/TaskFlowHud.d.ts +15 -0
- package/dist/cli/components/tools/TaskFlowHud.js +55 -0
- package/dist/cli/components/tools/TaskFlowHud.js.map +1 -0
- package/dist/cli/components/tools/TerminalSessionsFooter.d.ts +6 -0
- package/dist/cli/components/tools/TerminalSessionsFooter.js +36 -0
- package/dist/cli/components/tools/TerminalSessionsFooter.js.map +1 -0
- package/dist/cli/components/tools/ToolActivityList.d.ts +11 -0
- package/dist/cli/components/tools/ToolActivityList.js +73 -0
- package/dist/cli/components/tools/ToolActivityList.js.map +1 -0
- package/dist/cli/components/tools/ToolCallTree.d.ts +11 -0
- package/dist/cli/components/tools/ToolCallTree.js +14 -0
- package/dist/cli/components/tools/ToolCallTree.js.map +1 -0
- package/dist/cli/components/tools/toolLifecycleModel.d.ts +16 -0
- package/dist/cli/components/tools/toolLifecycleModel.js +30 -0
- package/dist/cli/components/tools/toolLifecycleModel.js.map +1 -0
- package/dist/cli/components/tools/toolPresentation.d.ts +9 -0
- package/dist/cli/components/tools/toolPresentation.js +171 -0
- package/dist/cli/components/tools/toolPresentation.js.map +1 -0
- package/dist/cli/components/tools/toolTypes.d.ts +16 -0
- package/dist/cli/components/tools/toolTypes.js +2 -0
- package/dist/cli/components/tools/toolTypes.js.map +1 -0
- package/dist/cli/components/transcriptWindowing.d.ts +19 -0
- package/dist/cli/components/transcriptWindowing.js +81 -0
- package/dist/cli/components/transcriptWindowing.js.map +1 -0
- package/dist/cli/config.d.ts +1 -0
- package/dist/cli/config.js +2 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/conversations/journalWriter.d.ts +50 -0
- package/dist/cli/conversations/journalWriter.js +191 -0
- package/dist/cli/conversations/journalWriter.js.map +1 -0
- package/dist/cli/conversations/manager.d.ts +65 -0
- package/dist/cli/conversations/manager.js +435 -0
- package/dist/cli/conversations/manager.js.map +1 -0
- package/dist/cli/conversations/recoveryExport.d.ts +18 -0
- package/dist/cli/conversations/recoveryExport.js +39 -0
- package/dist/cli/conversations/recoveryExport.js.map +1 -0
- package/dist/cli/conversations/recoveryMessages.d.ts +2 -0
- package/dist/cli/conversations/recoveryMessages.js +3 -0
- package/dist/cli/conversations/recoveryMessages.js.map +1 -0
- package/dist/cli/conversations/store.d.ts +14 -0
- package/dist/cli/conversations/store.js +603 -0
- package/dist/cli/conversations/store.js.map +1 -0
- package/dist/cli/conversations/types.d.ts +142 -0
- package/dist/cli/conversations/types.js +2 -0
- package/dist/cli/conversations/types.js.map +1 -0
- package/dist/cli/globalConfiguration.d.ts +13 -0
- package/dist/cli/globalConfiguration.js +61 -0
- package/dist/cli/globalConfiguration.js.map +1 -0
- package/dist/cli/hooks/useMessageCursor.d.ts +16 -0
- package/dist/cli/hooks/useMessageCursor.js +75 -0
- package/dist/cli/hooks/useMessageCursor.js.map +1 -0
- package/dist/cli/hooks/useOverlayStack.d.ts +9 -0
- package/dist/cli/hooks/useOverlayStack.js +26 -0
- package/dist/cli/hooks/useOverlayStack.js.map +1 -0
- package/dist/cli/hooks/useTerminalSize.d.ts +16 -0
- package/dist/cli/hooks/useTerminalSize.js +37 -0
- package/dist/cli/hooks/useTerminalSize.js.map +1 -0
- package/dist/cli/i18n/index.d.ts +15 -0
- package/dist/cli/i18n/index.js +32 -0
- package/dist/cli/i18n/index.js.map +1 -0
- package/dist/cli/i18n/messages.d.ts +1305 -0
- package/dist/cli/i18n/messages.js +1305 -0
- package/dist/cli/i18n/messages.js.map +1 -0
- package/dist/cli/imageAttachments.d.ts +22 -0
- package/dist/cli/imageAttachments.js +329 -0
- package/dist/cli/imageAttachments.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +146 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/platform/terminalAttention.d.ts +46 -0
- package/dist/cli/platform/terminalAttention.js +152 -0
- package/dist/cli/platform/terminalAttention.js.map +1 -0
- package/dist/cli/platform/terminalTransparency.d.ts +11 -0
- package/dist/cli/platform/terminalTransparency.js +193 -0
- package/dist/cli/platform/terminalTransparency.js.map +1 -0
- package/dist/cli/repl.d.ts +15 -0
- package/dist/cli/repl.js +38 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/setup.d.ts +17 -0
- package/dist/cli/setup.js +991 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/singleShot.d.ts +30 -0
- package/dist/cli/singleShot.js +167 -0
- package/dist/cli/singleShot.js.map +1 -0
- package/dist/cli/state/adaptiveStreamScheduler.d.ts +53 -0
- package/dist/cli/state/adaptiveStreamScheduler.js +136 -0
- package/dist/cli/state/adaptiveStreamScheduler.js.map +1 -0
- package/dist/cli/state/agentFlowController.d.ts +37 -0
- package/dist/cli/state/agentFlowController.js +402 -0
- package/dist/cli/state/agentFlowController.js.map +1 -0
- package/dist/cli/state/approvalPresentationScheduler.d.ts +28 -0
- package/dist/cli/state/approvalPresentationScheduler.js +72 -0
- package/dist/cli/state/approvalPresentationScheduler.js.map +1 -0
- package/dist/cli/state/flowFeatureFlags.d.ts +18 -0
- package/dist/cli/state/flowFeatureFlags.js +45 -0
- package/dist/cli/state/flowFeatureFlags.js.map +1 -0
- package/dist/cli/state/flowReducer.d.ts +120 -0
- package/dist/cli/state/flowReducer.js +535 -0
- package/dist/cli/state/flowReducer.js.map +1 -0
- package/dist/cli/state/flowSelectors.d.ts +45 -0
- package/dist/cli/state/flowSelectors.js +144 -0
- package/dist/cli/state/flowSelectors.js.map +1 -0
- package/dist/cli/state/flowStore.d.ts +19 -0
- package/dist/cli/state/flowStore.js +51 -0
- package/dist/cli/state/flowStore.js.map +1 -0
- package/dist/cli/state/globalCommandActivity.d.ts +25 -0
- package/dist/cli/state/globalCommandActivity.js +57 -0
- package/dist/cli/state/globalCommandActivity.js.map +1 -0
- package/dist/cli/state/goldenTraces.d.ts +2 -0
- package/dist/cli/state/goldenTraces.js +15 -0
- package/dist/cli/state/goldenTraces.js.map +1 -0
- package/dist/cli/state/notificationCoordinator.d.ts +38 -0
- package/dist/cli/state/notificationCoordinator.js +101 -0
- package/dist/cli/state/notificationCoordinator.js.map +1 -0
- package/dist/cli/stateProvider.d.ts +5 -0
- package/dist/cli/stateProvider.js +7 -0
- package/dist/cli/stateProvider.js.map +1 -0
- package/dist/cli/telemetry/localFlowTelemetry.d.ts +42 -0
- package/dist/cli/telemetry/localFlowTelemetry.js +131 -0
- package/dist/cli/telemetry/localFlowTelemetry.js.map +1 -0
- package/dist/cli/telemetry/terminalBaseline.d.ts +93 -0
- package/dist/cli/telemetry/terminalBaseline.js +199 -0
- package/dist/cli/telemetry/terminalBaseline.js.map +1 -0
- package/dist/cli/telemetry/terminalLatencyTracker.d.ts +24 -0
- package/dist/cli/telemetry/terminalLatencyTracker.js +59 -0
- package/dist/cli/telemetry/terminalLatencyTracker.js.map +1 -0
- package/dist/cli/terminalLayout.d.ts +2 -0
- package/dist/cli/terminalLayout.js +16 -0
- package/dist/cli/terminalLayout.js.map +1 -0
- package/dist/cli/terminalMouse.d.ts +10 -0
- package/dist/cli/terminalMouse.js +29 -0
- package/dist/cli/terminalMouse.js.map +1 -0
- package/dist/cli/theme/ThemeProvider.d.ts +9 -0
- package/dist/cli/theme/ThemeProvider.js +26 -0
- package/dist/cli/theme/ThemeProvider.js.map +1 -0
- package/dist/cli/theme/dark.d.ts +2 -0
- package/dist/cli/theme/dark.js +27 -0
- package/dist/cli/theme/dark.js.map +1 -0
- package/dist/cli/theme/index.d.ts +5 -0
- package/dist/cli/theme/index.js +5 -0
- package/dist/cli/theme/index.js.map +1 -0
- package/dist/cli/theme/light.d.ts +2 -0
- package/dist/cli/theme/light.js +26 -0
- package/dist/cli/theme/light.js.map +1 -0
- package/dist/cli/theme/palette.d.ts +7 -0
- package/dist/cli/theme/palette.js +8 -0
- package/dist/cli/theme/palette.js.map +1 -0
- package/dist/cli/theme/resolveColor.d.ts +4 -0
- package/dist/cli/theme/resolveColor.js +43 -0
- package/dist/cli/theme/resolveColor.js.map +1 -0
- package/dist/cli/theme/types.d.ts +27 -0
- package/dist/cli/theme/types.js +2 -0
- package/dist/cli/theme/types.js.map +1 -0
- package/dist/cli/toolExecutor.d.ts +1 -0
- package/dist/cli/toolExecutor.js +2 -0
- package/dist/cli/toolExecutor.js.map +1 -0
- package/dist/core/agentEngine.d.ts +425 -0
- package/dist/core/agentEngine.js +5170 -0
- package/dist/core/agentEngine.js.map +1 -0
- package/dist/core/agents/loader.d.ts +9 -0
- package/dist/core/agents/loader.js +144 -0
- package/dist/core/agents/loader.js.map +1 -0
- package/dist/core/applyPatch.d.ts +24 -0
- package/dist/core/applyPatch.js +158 -0
- package/dist/core/applyPatch.js.map +1 -0
- package/dist/core/cacheMonitor.d.ts +24 -0
- package/dist/core/cacheMonitor.js +211 -0
- package/dist/core/cacheMonitor.js.map +1 -0
- package/dist/core/clientIdentity.d.ts +6 -0
- package/dist/core/clientIdentity.js +44 -0
- package/dist/core/clientIdentity.js.map +1 -0
- package/dist/core/config.d.ts +99 -0
- package/dist/core/config.js +715 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextCompaction.d.ts +20 -0
- package/dist/core/contextCompaction.js +158 -0
- package/dist/core/contextCompaction.js.map +1 -0
- package/dist/core/contextManager.d.ts +44 -0
- package/dist/core/contextManager.js +590 -0
- package/dist/core/contextManager.js.map +1 -0
- package/dist/core/contextPolicy.d.ts +18 -0
- package/dist/core/contextPolicy.js +39 -0
- package/dist/core/contextPolicy.js.map +1 -0
- package/dist/core/credentialStore.d.ts +8 -0
- package/dist/core/credentialStore.js +37 -0
- package/dist/core/credentialStore.js.map +1 -0
- package/dist/core/diffCompute.d.ts +31 -0
- package/dist/core/diffCompute.js +116 -0
- package/dist/core/diffCompute.js.map +1 -0
- package/dist/core/editHelpers.d.ts +8 -0
- package/dist/core/editHelpers.js +35 -0
- package/dist/core/editHelpers.js.map +1 -0
- package/dist/core/fileIO.d.ts +12 -0
- package/dist/core/fileIO.js +199 -0
- package/dist/core/fileIO.js.map +1 -0
- package/dist/core/gitService.d.ts +83 -0
- package/dist/core/gitService.js +522 -0
- package/dist/core/gitService.js.map +1 -0
- package/dist/core/index.d.ts +30 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/mcp/client.d.ts +32 -0
- package/dist/core/mcp/client.js +186 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/settings.d.ts +2 -0
- package/dist/core/mcp/settings.js +26 -0
- package/dist/core/mcp/settings.js.map +1 -0
- package/dist/core/mcp/toolBridge.d.ts +20 -0
- package/dist/core/mcp/toolBridge.js +74 -0
- package/dist/core/mcp/toolBridge.js.map +1 -0
- package/dist/core/mcp/types.d.ts +29 -0
- package/dist/core/mcp/types.js +2 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/modelDiscovery.d.ts +14 -0
- package/dist/core/modelDiscovery.js +566 -0
- package/dist/core/modelDiscovery.js.map +1 -0
- package/dist/core/modelProtocol.d.ts +43 -0
- package/dist/core/modelProtocol.js +238 -0
- package/dist/core/modelProtocol.js.map +1 -0
- package/dist/core/modelRegistry.d.ts +56 -0
- package/dist/core/modelRegistry.js +308 -0
- package/dist/core/modelRegistry.js.map +1 -0
- package/dist/core/networkProxy.d.ts +20 -0
- package/dist/core/networkProxy.js +145 -0
- package/dist/core/networkProxy.js.map +1 -0
- package/dist/core/normalizeBaseUrl.d.ts +1 -0
- package/dist/core/normalizeBaseUrl.js +9 -0
- package/dist/core/normalizeBaseUrl.js.map +1 -0
- package/dist/core/pathUtils.d.ts +3 -0
- package/dist/core/pathUtils.js +46 -0
- package/dist/core/pathUtils.js.map +1 -0
- package/dist/core/permissions.d.ts +29 -0
- package/dist/core/permissions.js +245 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/persona/voiceProfile.d.ts +7 -0
- package/dist/core/persona/voiceProfile.js +14 -0
- package/dist/core/persona/voiceProfile.js.map +1 -0
- package/dist/core/profile.d.ts +35 -0
- package/dist/core/profile.js +373 -0
- package/dist/core/profile.js.map +1 -0
- package/dist/core/requestCompatibility.d.ts +13 -0
- package/dist/core/requestCompatibility.js +181 -0
- package/dist/core/requestCompatibility.js.map +1 -0
- package/dist/core/runtime/agentRuntime.d.ts +43 -0
- package/dist/core/runtime/agentRuntime.js +137 -0
- package/dist/core/runtime/agentRuntime.js.map +1 -0
- package/dist/core/runtime/approvalCoordinator.d.ts +36 -0
- package/dist/core/runtime/approvalCoordinator.js +113 -0
- package/dist/core/runtime/approvalCoordinator.js.map +1 -0
- package/dist/core/runtime/capabilityBoundary.d.ts +18 -0
- package/dist/core/runtime/capabilityBoundary.js +89 -0
- package/dist/core/runtime/capabilityBoundary.js.map +1 -0
- package/dist/core/runtime/nodeToolExecutor.d.ts +200 -0
- package/dist/core/runtime/nodeToolExecutor.js +2446 -0
- package/dist/core/runtime/nodeToolExecutor.js.map +1 -0
- package/dist/core/runtime/runtimeLogWriter.d.ts +32 -0
- package/dist/core/runtime/runtimeLogWriter.js +129 -0
- package/dist/core/runtime/runtimeLogWriter.js.map +1 -0
- package/dist/core/runtime/runtimeTaskManager.d.ts +78 -0
- package/dist/core/runtime/runtimeTaskManager.js +374 -0
- package/dist/core/runtime/runtimeTaskManager.js.map +1 -0
- package/dist/core/runtime/sessionRegistry.d.ts +19 -0
- package/dist/core/runtime/sessionRegistry.js +41 -0
- package/dist/core/runtime/sessionRegistry.js.map +1 -0
- package/dist/core/runtime/stateProvider.d.ts +69 -0
- package/dist/core/runtime/stateProvider.js +131 -0
- package/dist/core/runtime/stateProvider.js.map +1 -0
- package/dist/core/runtime/subAgentTaskManager.d.ts +111 -0
- package/dist/core/runtime/subAgentTaskManager.js +386 -0
- package/dist/core/runtime/subAgentTaskManager.js.map +1 -0
- package/dist/core/schemaValidation.d.ts +5 -0
- package/dist/core/schemaValidation.js +153 -0
- package/dist/core/schemaValidation.js.map +1 -0
- package/dist/core/skills/loader.d.ts +7 -0
- package/dist/core/skills/loader.js +91 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills/runtime.d.ts +19 -0
- package/dist/core/skills/runtime.js +61 -0
- package/dist/core/skills/runtime.js.map +1 -0
- package/dist/core/subAgent.d.ts +50 -0
- package/dist/core/subAgent.js +1258 -0
- package/dist/core/subAgent.js.map +1 -0
- package/dist/core/systemPrompt.d.ts +27 -0
- package/dist/core/systemPrompt.js +219 -0
- package/dist/core/systemPrompt.js.map +1 -0
- package/dist/core/taskManager.d.ts +105 -0
- package/dist/core/taskManager.js +617 -0
- package/dist/core/taskManager.js.map +1 -0
- package/dist/core/tokenCompressor.d.ts +14 -0
- package/dist/core/tokenCompressor.js +161 -0
- package/dist/core/tokenCompressor.js.map +1 -0
- package/dist/core/tokenCounter.d.ts +28 -0
- package/dist/core/tokenCounter.js +101 -0
- package/dist/core/tokenCounter.js.map +1 -0
- package/dist/core/toolDispatcher.d.ts +11 -0
- package/dist/core/toolDispatcher.js +38 -0
- package/dist/core/toolDispatcher.js.map +1 -0
- package/dist/core/toolExecutionLedger.d.ts +9 -0
- package/dist/core/toolExecutionLedger.js +84 -0
- package/dist/core/toolExecutionLedger.js.map +1 -0
- package/dist/core/toolRegistry.d.ts +19 -0
- package/dist/core/toolRegistry.js +820 -0
- package/dist/core/toolRegistry.js.map +1 -0
- package/dist/core/turnStrategy.d.ts +20 -0
- package/dist/core/turnStrategy.js +103 -0
- package/dist/core/turnStrategy.js.map +1 -0
- package/dist/platform/process.d.ts +14 -0
- package/dist/platform/process.js +28 -0
- package/dist/platform/process.js.map +1 -0
- package/dist/platform/runtime.d.ts +8 -0
- package/dist/platform/runtime.js +21 -0
- package/dist/platform/runtime.js.map +1 -0
- package/dist/server/adminPage.d.ts +1 -0
- package/dist/server/adminPage.js +755 -0
- package/dist/server/adminPage.js.map +1 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.js +566 -0
- package/dist/server/index.js.map +1 -0
- package/dist/shared/agentTypes.d.ts +227 -0
- package/dist/shared/agentTypes.js +79 -0
- package/dist/shared/agentTypes.js.map +1 -0
- package/dist/shared/codeIndexTypes.d.ts +32 -0
- package/dist/shared/codeIndexTypes.js +2 -0
- package/dist/shared/codeIndexTypes.js.map +1 -0
- package/dist/shared/flowEvents.d.ts +192 -0
- package/dist/shared/flowEvents.js +37 -0
- package/dist/shared/flowEvents.js.map +1 -0
- package/dist/shared/memoryTypes.d.ts +100 -0
- package/dist/shared/memoryTypes.js +2 -0
- package/dist/shared/memoryTypes.js.map +1 -0
- package/dist/shared/pluginTypes.d.ts +345 -0
- package/dist/shared/pluginTypes.js +2 -0
- package/dist/shared/pluginTypes.js.map +1 -0
- package/dist/shared/runtimeTaskTypes.d.ts +43 -0
- package/dist/shared/runtimeTaskTypes.js +2 -0
- package/dist/shared/runtimeTaskTypes.js.map +1 -0
- package/dist/shared/skillTypes.d.ts +1 -0
- package/dist/shared/skillTypes.js +2 -0
- package/dist/shared/skillTypes.js.map +1 -0
- package/dist/shared/subAgentTypes.d.ts +99 -0
- package/dist/shared/subAgentTypes.js +2 -0
- package/dist/shared/subAgentTypes.js.map +1 -0
- package/dist/shared/terminalTypes.d.ts +102 -0
- package/dist/shared/terminalTypes.js +2 -0
- package/dist/shared/terminalTypes.js.map +1 -0
- package/dist/shared/toolCallMarkup.d.ts +10 -0
- package/dist/shared/toolCallMarkup.js +107 -0
- package/dist/shared/toolCallMarkup.js.map +1 -0
- package/dist/shared/toolTypes.d.ts +24 -0
- package/dist/shared/toolTypes.js +2 -0
- package/dist/shared/toolTypes.js.map +1 -0
- package/dist/shared/types.d.ts +81 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/state/types.d.ts +69 -0
- package/dist/state/types.js +2 -0
- package/dist/state/types.js.map +1 -0
- package/dist/tools/executor.d.ts +133 -0
- package/dist/tools/executor.js +2 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/memory/loaders.d.ts +6 -0
- package/dist/tools/memory/loaders.js +292 -0
- package/dist/tools/memory/loaders.js.map +1 -0
- package/dist/tools/memory/sanitizer.d.ts +6 -0
- package/dist/tools/memory/sanitizer.js +48 -0
- package/dist/tools/memory/sanitizer.js.map +1 -0
- package/dist/tools/memory/service.d.ts +24 -0
- package/dist/tools/memory/service.js +273 -0
- package/dist/tools/memory/service.js.map +1 -0
- package/dist/tools/memory/writer.d.ts +17 -0
- package/dist/tools/memory/writer.js +192 -0
- package/dist/tools/memory/writer.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,991 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_TOKENS, PROVIDER_PRESETS, createApiConfigProfile, createEmptyConfig, deleteApiConfigProfile, getActiveApiConfigProfile, getApiConfigProfiles, getProviderPreset, loadConfig, saveApiConfigProfile, saveConfig, setConfigValue, switchActiveApiConfig, } from '../core/config';
|
|
4
|
+
import { formatNativeReasoningSetting, getSupportedModelSpec, normalizeNativeReasoningConfig, } from '../core/modelRegistry';
|
|
5
|
+
import { normalizeApprovalPolicy, } from '../shared/agentTypes';
|
|
6
|
+
import { TURBOFLUX_VERSION, TURBOFLUX_WORDMARK_LINES } from './brand';
|
|
7
|
+
import { createTranslator } from './i18n/index';
|
|
8
|
+
import { TURBOFLUX_ACCENTS } from './theme/palette';
|
|
9
|
+
import { DEFAULT_PROFILE, PERSONA_DEFINITIONS, getPersonaDefinition, getProfileFile, loadProfile, resetProfile, saveProfile, } from '../core/profile';
|
|
10
|
+
const MAIN_ACTIONS = new Set([
|
|
11
|
+
'menu',
|
|
12
|
+
'init',
|
|
13
|
+
'api',
|
|
14
|
+
'language',
|
|
15
|
+
'persona',
|
|
16
|
+
'custom',
|
|
17
|
+
'approval',
|
|
18
|
+
'show',
|
|
19
|
+
'reset',
|
|
20
|
+
'exit',
|
|
21
|
+
]);
|
|
22
|
+
function setupText(key, values, profile = loadProfile()) {
|
|
23
|
+
return createTranslator(profile.interfaceLanguage)(key, values);
|
|
24
|
+
}
|
|
25
|
+
const PROMPT_PREFIX = chalk.gray('›');
|
|
26
|
+
const PROMPT_DONE_PREFIX = chalk.green('✓');
|
|
27
|
+
const PROMPT_THEME = {
|
|
28
|
+
prefix: {
|
|
29
|
+
idle: PROMPT_PREFIX,
|
|
30
|
+
done: PROMPT_DONE_PREFIX,
|
|
31
|
+
},
|
|
32
|
+
style: {
|
|
33
|
+
answer: (text) => chalk.cyan(text),
|
|
34
|
+
message: (text) => chalk.white.bold(text),
|
|
35
|
+
error: (text) => chalk.red(` ${text}`),
|
|
36
|
+
defaultAnswer: (text) => chalk.dim(`(${text})`),
|
|
37
|
+
help: (text) => chalk.dim(text),
|
|
38
|
+
highlight: (text) => chalk.cyan.bold(text),
|
|
39
|
+
key: (text) => chalk.cyan(`<${text}>`),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
function promptConfig(question) {
|
|
43
|
+
return {
|
|
44
|
+
prefix: PROMPT_PREFIX,
|
|
45
|
+
theme: PROMPT_THEME,
|
|
46
|
+
...question,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function settlePromptInput() {
|
|
50
|
+
if (!process.stdin.isTTY)
|
|
51
|
+
return;
|
|
52
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
53
|
+
while (process.stdin.read() !== null) { }
|
|
54
|
+
}
|
|
55
|
+
function maskKey(key) {
|
|
56
|
+
if (!key)
|
|
57
|
+
return `(${setupText('common.notSet')})`;
|
|
58
|
+
if (key.length <= 8)
|
|
59
|
+
return '***';
|
|
60
|
+
return `${key.slice(0, 4)}...${key.slice(-4)}`;
|
|
61
|
+
}
|
|
62
|
+
function normalizeAction(action) {
|
|
63
|
+
const normalized = (action || 'menu').trim().toLowerCase();
|
|
64
|
+
if (!normalized)
|
|
65
|
+
return 'menu';
|
|
66
|
+
if (['1', 'i', 'init', 'full', 'start'].includes(normalized))
|
|
67
|
+
return 'init';
|
|
68
|
+
if (['2', 'api', 'model', 'provider', 'providers', 'config'].includes(normalized))
|
|
69
|
+
return 'api';
|
|
70
|
+
if (['3', 'lang', 'language'].includes(normalized))
|
|
71
|
+
return 'language';
|
|
72
|
+
if (['4', 'persona', 'style', 'output-style', 'output'].includes(normalized))
|
|
73
|
+
return 'persona';
|
|
74
|
+
if (['5', 'custom', 'instructions', 'prompt'].includes(normalized))
|
|
75
|
+
return 'custom';
|
|
76
|
+
if (['6', 'approval', 'permissions', 'permission'].includes(normalized))
|
|
77
|
+
return 'approval';
|
|
78
|
+
if (['7', 'show', 'current', 'status'].includes(normalized))
|
|
79
|
+
return 'show';
|
|
80
|
+
if (['8', 'reset', 'clear'].includes(normalized))
|
|
81
|
+
return 'reset';
|
|
82
|
+
if (['q', 'quit', 'exit'].includes(normalized))
|
|
83
|
+
return 'exit';
|
|
84
|
+
if (MAIN_ACTIONS.has(normalized))
|
|
85
|
+
return normalized;
|
|
86
|
+
return 'menu';
|
|
87
|
+
}
|
|
88
|
+
function renderSetupLogoLine(line) {
|
|
89
|
+
let out = '';
|
|
90
|
+
for (const ch of line) {
|
|
91
|
+
if ('_/\\'.includes(ch)) {
|
|
92
|
+
out += chalk.hex('#D6D6D6').bold(ch);
|
|
93
|
+
}
|
|
94
|
+
else if ('-`.\''.includes(ch)) {
|
|
95
|
+
out += chalk.hex('#777777')(ch);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
out += ch;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
function printBanner(profile = loadProfile()) {
|
|
104
|
+
const subtitle = setupText('setup.banner.subtitle', undefined, profile);
|
|
105
|
+
const title = setupText('setup.banner.title', undefined, profile);
|
|
106
|
+
console.log('');
|
|
107
|
+
console.log(` ${chalk.dim('─'.repeat(72))}`);
|
|
108
|
+
console.log('');
|
|
109
|
+
console.log(TURBOFLUX_WORDMARK_LINES.map(line => ` ${renderSetupLogoLine(line)}`).join('\n'));
|
|
110
|
+
console.log('');
|
|
111
|
+
console.log(` ${chalk.hex(TURBOFLUX_ACCENTS.neonGreen).bold('TurboFlux Setup')} ${chalk.hex(TURBOFLUX_ACCENTS.cyan)(`v${TURBOFLUX_VERSION}`)} ${chalk.gray(`- ${title}`)}`);
|
|
112
|
+
console.log(` ${chalk.gray(subtitle)}`);
|
|
113
|
+
console.log(` ${chalk.dim('─'.repeat(72))}`);
|
|
114
|
+
console.log('');
|
|
115
|
+
}
|
|
116
|
+
function printSeparator() {
|
|
117
|
+
console.log('');
|
|
118
|
+
console.log(chalk.dim('-'.repeat(62)));
|
|
119
|
+
console.log('');
|
|
120
|
+
}
|
|
121
|
+
function profileLine(item, currentId) {
|
|
122
|
+
const marker = item.id === currentId ? chalk.green('*') : ' ';
|
|
123
|
+
const model = item.model || `(${setupText('common.notSet')})`;
|
|
124
|
+
const key = item.apiKey ? maskKey(item.apiKey) : `(${setupText('common.notSet')})`;
|
|
125
|
+
return `${marker} ${item.name} [${item.id}] ${item.provider} / ${model} / ${key}`;
|
|
126
|
+
}
|
|
127
|
+
function printApiProfiles(config) {
|
|
128
|
+
const profiles = getApiConfigProfiles(config);
|
|
129
|
+
if (profiles.length === 0) {
|
|
130
|
+
console.log(chalk.yellow(` ${setupText('setup.current.noApiProfiles')}`));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const item of profiles) {
|
|
134
|
+
console.log(` ${profileLine(item, config.activeApiConfigId)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function printSummary(config, profile) {
|
|
138
|
+
const t = createTranslator(profile.interfaceLanguage);
|
|
139
|
+
const knownModel = getSupportedModelSpec(config.model);
|
|
140
|
+
const persona = getPersonaDefinition(profile.defaultPersonaId);
|
|
141
|
+
const personaName = profile.defaultPersonaId === 'custom'
|
|
142
|
+
? (profile.customPersonaName || t('setup.persona.customFallback'))
|
|
143
|
+
: (profile.interfaceLanguage === 'en' ? persona?.nameEn : persona?.nameZh) || profile.defaultPersonaId;
|
|
144
|
+
const outputLanguage = getOutputLanguageLabel(profile, t);
|
|
145
|
+
const profiles = getApiConfigProfiles(config);
|
|
146
|
+
const activeProfile = getActiveApiConfigProfile(config);
|
|
147
|
+
console.log(chalk.bold(t('setup.current.title')));
|
|
148
|
+
console.log(` ${t('setup.current.activeApiConfig')}: ${activeProfile ? `${activeProfile.name} (${activeProfile.id})` : `(${t('common.notSet')})`}`);
|
|
149
|
+
console.log(` ${t('setup.current.apiConfigCount')}: ${profiles.length}`);
|
|
150
|
+
console.log(` ${t('setup.current.provider')}: ${config.provider}`);
|
|
151
|
+
console.log(` ${t('setup.current.baseUrl')}: ${config.baseUrl || `(${t('common.notSet')})`}`);
|
|
152
|
+
console.log(` ${t('setup.current.model')}: ${config.model || `(${t('common.notSet')})`}${knownModel ? ` (${knownModel.name})` : ''}`);
|
|
153
|
+
console.log(` ${t('setup.current.apiKey')}: ${maskKey(config.apiKey)}`);
|
|
154
|
+
console.log(` ${t('setup.current.contextWindow')}: ${config.contextWindow.toLocaleString()}`);
|
|
155
|
+
console.log(` ${t('setup.current.maxTokens')}: ${config.maxTokens.toLocaleString()}`);
|
|
156
|
+
console.log(` ${t('setup.current.reasoning')}: ${formatNativeReasoningSetting(config.model, config.reasoning, config.provider) || `(${t('common.providerDefault')})`}`);
|
|
157
|
+
console.log(` ${t('setup.current.approvalPolicy')}: ${approvalPolicyLabel(config.approvalPolicy, t)} (${config.approvalPolicy})`);
|
|
158
|
+
console.log(` ${t('setup.current.interfaceLanguage')}: ${profile.interfaceLanguage}`);
|
|
159
|
+
console.log(` ${t('setup.current.aiOutputLanguage')}: ${outputLanguage}`);
|
|
160
|
+
console.log(` ${t('setup.current.persona')}: ${personaName} (${profile.defaultPersonaId})`);
|
|
161
|
+
console.log(` ${t('setup.current.customInstructions')}:${profile.customInstructions ? ` ${t('setup.current.customInstructionsSet')}` : ` (${t('common.notSet')})`}`);
|
|
162
|
+
console.log(` ${t('setup.current.profileFile')}: ${getProfileFile()}`);
|
|
163
|
+
}
|
|
164
|
+
function getOutputLanguageLabel(profile, t) {
|
|
165
|
+
if (profile.aiOutputLanguage === 'follow-user')
|
|
166
|
+
return t('setup.language.followUser');
|
|
167
|
+
if (profile.aiOutputLanguage === 'zh-CN')
|
|
168
|
+
return t('setup.language.simplifiedChinese');
|
|
169
|
+
if (profile.aiOutputLanguage === 'en')
|
|
170
|
+
return t('setup.language.english');
|
|
171
|
+
if (profile.aiOutputLanguage === 'ja')
|
|
172
|
+
return t('setup.language.japanese');
|
|
173
|
+
if (profile.aiOutputLanguage === 'ko')
|
|
174
|
+
return t('setup.language.korean');
|
|
175
|
+
return profile.customAiOutputLanguage || t('setup.language.customLabel');
|
|
176
|
+
}
|
|
177
|
+
function approvalPolicyLabel(policy, t) {
|
|
178
|
+
if (policy === 'ask')
|
|
179
|
+
return t('command.approval.ask');
|
|
180
|
+
if (policy === 'agent')
|
|
181
|
+
return t('command.approval.agent');
|
|
182
|
+
return t('command.approval.full');
|
|
183
|
+
}
|
|
184
|
+
async function promptInput(message, options = {}) {
|
|
185
|
+
const answer = await inquirer.prompt(promptConfig({
|
|
186
|
+
type: 'input',
|
|
187
|
+
name: 'value',
|
|
188
|
+
message,
|
|
189
|
+
default: options.default,
|
|
190
|
+
validate: (value) => {
|
|
191
|
+
const trimmed = value.trim();
|
|
192
|
+
if (options.required && !trimmed)
|
|
193
|
+
return setupText('setup.prompt.required');
|
|
194
|
+
return options.validate?.(trimmed) ?? true;
|
|
195
|
+
},
|
|
196
|
+
}));
|
|
197
|
+
await settlePromptInput();
|
|
198
|
+
return answer.value.trim();
|
|
199
|
+
}
|
|
200
|
+
async function promptPassword(message) {
|
|
201
|
+
const answer = await inquirer.prompt(promptConfig({
|
|
202
|
+
type: 'password',
|
|
203
|
+
name: 'value',
|
|
204
|
+
message,
|
|
205
|
+
mask: '*',
|
|
206
|
+
}));
|
|
207
|
+
await settlePromptInput();
|
|
208
|
+
return answer.value.trim();
|
|
209
|
+
}
|
|
210
|
+
async function promptConfirm(message, defaultValue = false) {
|
|
211
|
+
const answer = await inquirer.prompt(promptConfig({
|
|
212
|
+
type: 'confirm',
|
|
213
|
+
name: 'ok',
|
|
214
|
+
message,
|
|
215
|
+
default: defaultValue,
|
|
216
|
+
}));
|
|
217
|
+
await settlePromptInput();
|
|
218
|
+
return answer.ok;
|
|
219
|
+
}
|
|
220
|
+
async function promptEditor(message, defaultValue) {
|
|
221
|
+
const answer = await inquirer.prompt(promptConfig({
|
|
222
|
+
type: 'editor',
|
|
223
|
+
name: 'value',
|
|
224
|
+
message,
|
|
225
|
+
default: defaultValue,
|
|
226
|
+
}));
|
|
227
|
+
await settlePromptInput();
|
|
228
|
+
return answer.value.trim();
|
|
229
|
+
}
|
|
230
|
+
async function promptChoice(message, valid, fallback = '') {
|
|
231
|
+
const lowerValid = new Set(valid.map(item => item.toLowerCase()));
|
|
232
|
+
const answer = await promptInput(message, {
|
|
233
|
+
default: fallback,
|
|
234
|
+
validate: value => {
|
|
235
|
+
const normalized = value.trim().toLowerCase();
|
|
236
|
+
return lowerValid.has(normalized) || setupText('setup.prompt.chooseFrom', { values: valid.join(', ') });
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
return answer.toLowerCase();
|
|
240
|
+
}
|
|
241
|
+
async function promptSelect(message, choices, fallback) {
|
|
242
|
+
const answer = await inquirer.prompt(promptConfig({
|
|
243
|
+
type: 'select',
|
|
244
|
+
name: 'value',
|
|
245
|
+
message,
|
|
246
|
+
default: fallback,
|
|
247
|
+
choices,
|
|
248
|
+
pageSize: Math.min(12, Math.max(5, choices.length)),
|
|
249
|
+
}));
|
|
250
|
+
await settlePromptInput();
|
|
251
|
+
return answer.value;
|
|
252
|
+
}
|
|
253
|
+
async function promptCheckbox(message, choices) {
|
|
254
|
+
const answer = await inquirer.prompt(promptConfig({
|
|
255
|
+
type: 'checkbox',
|
|
256
|
+
name: 'value',
|
|
257
|
+
message,
|
|
258
|
+
choices,
|
|
259
|
+
pageSize: Math.min(14, Math.max(6, choices.length)),
|
|
260
|
+
}));
|
|
261
|
+
await settlePromptInput();
|
|
262
|
+
return answer.value;
|
|
263
|
+
}
|
|
264
|
+
async function promptContinue(profile) {
|
|
265
|
+
return promptConfirm(setupText('setup.returnToMenu', undefined, profile), true);
|
|
266
|
+
}
|
|
267
|
+
async function promptMenuChoice(message, valid) {
|
|
268
|
+
if (!process.stdin.isTTY || typeof process.stdin.setRawMode !== 'function') {
|
|
269
|
+
return promptChoice(message, valid);
|
|
270
|
+
}
|
|
271
|
+
const stdin = process.stdin;
|
|
272
|
+
const wasRaw = stdin.isRaw;
|
|
273
|
+
return new Promise(resolve => {
|
|
274
|
+
let value = '';
|
|
275
|
+
let settled = false;
|
|
276
|
+
const cleanup = () => {
|
|
277
|
+
stdin.removeListener('data', onData);
|
|
278
|
+
stdin.setRawMode(Boolean(wasRaw));
|
|
279
|
+
stdin.resume();
|
|
280
|
+
};
|
|
281
|
+
const finish = (choice) => {
|
|
282
|
+
if (settled)
|
|
283
|
+
return;
|
|
284
|
+
settled = true;
|
|
285
|
+
cleanup();
|
|
286
|
+
process.stdout.write('\n');
|
|
287
|
+
resolve(choice);
|
|
288
|
+
};
|
|
289
|
+
const onData = (chunk) => {
|
|
290
|
+
for (const character of chunk.toString('utf8')) {
|
|
291
|
+
const normalized = character.toLowerCase();
|
|
292
|
+
if (normalized === 'q') {
|
|
293
|
+
finish('q');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (character === '\u0003') {
|
|
297
|
+
finish('q');
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if (character === '\r' || character === '\n') {
|
|
301
|
+
if (valid.includes(value))
|
|
302
|
+
finish(value);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (character === '\u007f') {
|
|
306
|
+
if (value) {
|
|
307
|
+
value = '';
|
|
308
|
+
process.stdout.write('\b \b');
|
|
309
|
+
}
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (valid.includes(normalized)) {
|
|
313
|
+
value = normalized;
|
|
314
|
+
process.stdout.write(character);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
process.stdout.write(`${PROMPT_PREFIX} ${message}: `);
|
|
319
|
+
stdin.setRawMode(true);
|
|
320
|
+
stdin.resume();
|
|
321
|
+
stdin.on('data', onData);
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
function resolveProvider(value) {
|
|
325
|
+
const trimmed = value.trim();
|
|
326
|
+
const index = Number(trimmed);
|
|
327
|
+
if (Number.isInteger(index) && index >= 1 && index <= PROVIDER_PRESETS.length) {
|
|
328
|
+
return PROVIDER_PRESETS[index - 1];
|
|
329
|
+
}
|
|
330
|
+
return getProviderPreset(trimmed);
|
|
331
|
+
}
|
|
332
|
+
function providerLabel(preset) {
|
|
333
|
+
return `${preset.name} (${preset.id})`;
|
|
334
|
+
}
|
|
335
|
+
function defaultProviderForOptions(options, current) {
|
|
336
|
+
if (options.provider)
|
|
337
|
+
return resolveProvider(options.provider);
|
|
338
|
+
if (current.baseUrl) {
|
|
339
|
+
return PROVIDER_PRESETS.find(p => p.baseUrl.replace(/\/+$/, '') === current.baseUrl.replace(/\/+$/, ''));
|
|
340
|
+
}
|
|
341
|
+
return getProviderPreset(current.provider);
|
|
342
|
+
}
|
|
343
|
+
function hasApiOptions(options) {
|
|
344
|
+
return Boolean(options.provider || options.apiKey !== undefined || options.baseUrl || options.model);
|
|
345
|
+
}
|
|
346
|
+
function hasLanguageOptions(options) {
|
|
347
|
+
return Boolean(options.lang || options.allLang || options.configLang || options.aiOutputLang);
|
|
348
|
+
}
|
|
349
|
+
function hasPersonaOptions(options) {
|
|
350
|
+
return Boolean(options.outputStyle || options.defaultOutputStyle);
|
|
351
|
+
}
|
|
352
|
+
function hasDirectOptions(options) {
|
|
353
|
+
return hasApiOptions(options) || hasLanguageOptions(options) || hasPersonaOptions(options) || options.customInstructions !== undefined || options.approvalPolicy !== undefined;
|
|
354
|
+
}
|
|
355
|
+
function shouldKeepCurrentApiKey(current, preset, baseUrl) {
|
|
356
|
+
if (!current.apiKey)
|
|
357
|
+
return false;
|
|
358
|
+
const currentBaseUrl = current.baseUrl.replace(/\/+$/, '');
|
|
359
|
+
const nextBaseUrl = baseUrl.replace(/\/+$/, '');
|
|
360
|
+
return current.provider === preset.provider && currentBaseUrl === nextBaseUrl;
|
|
361
|
+
}
|
|
362
|
+
function normalizeInterfaceLanguage(value) {
|
|
363
|
+
if (!value)
|
|
364
|
+
return undefined;
|
|
365
|
+
const normalized = value.trim().toLowerCase();
|
|
366
|
+
if (['zh', 'zh-cn', 'cn', 'chinese', '中文', '简体中文'].includes(normalized))
|
|
367
|
+
return 'zh-CN';
|
|
368
|
+
if (['en', 'english'].includes(normalized))
|
|
369
|
+
return 'en';
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
function normalizeOutputLanguage(value) {
|
|
373
|
+
if (!value)
|
|
374
|
+
return {};
|
|
375
|
+
const trimmed = value.trim();
|
|
376
|
+
const lower = trimmed.toLowerCase();
|
|
377
|
+
if (['follow', 'follow-user', 'auto', 'user'].includes(lower))
|
|
378
|
+
return { language: 'follow-user' };
|
|
379
|
+
if (['zh', 'zh-cn', 'cn', 'chinese', '中文', '简体中文'].includes(lower))
|
|
380
|
+
return { language: 'zh-CN' };
|
|
381
|
+
if (['en', 'english'].includes(lower))
|
|
382
|
+
return { language: 'en' };
|
|
383
|
+
if (['ja', 'jp', 'japanese'].includes(lower))
|
|
384
|
+
return { language: 'ja' };
|
|
385
|
+
if (['ko', 'kr', 'korean'].includes(lower))
|
|
386
|
+
return { language: 'ko' };
|
|
387
|
+
if (lower === 'custom')
|
|
388
|
+
return { language: 'custom' };
|
|
389
|
+
return { language: 'custom', custom: trimmed };
|
|
390
|
+
}
|
|
391
|
+
function parseStyleList(value) {
|
|
392
|
+
if (!value)
|
|
393
|
+
return undefined;
|
|
394
|
+
const trimmed = value.trim();
|
|
395
|
+
if (!trimmed)
|
|
396
|
+
return undefined;
|
|
397
|
+
const normalized = trimmed.toLowerCase();
|
|
398
|
+
if (normalized === 'skip' || normalized === 'none')
|
|
399
|
+
return 'skip';
|
|
400
|
+
if (normalized === 'all')
|
|
401
|
+
return PERSONA_DEFINITIONS.filter(p => !p.isCustom).map(p => p.id);
|
|
402
|
+
return trimmed.split(',').map(item => item.trim().toLowerCase()).filter(Boolean);
|
|
403
|
+
}
|
|
404
|
+
function validateUrl(value) {
|
|
405
|
+
if (!value.trim())
|
|
406
|
+
return setupText('setup.url.required');
|
|
407
|
+
try {
|
|
408
|
+
new URL(value);
|
|
409
|
+
return true;
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
return setupText('setup.url.invalid');
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function uniqueProfileName(baseName, profiles) {
|
|
416
|
+
const names = new Set(profiles.map(item => item.name.toLowerCase()));
|
|
417
|
+
if (!names.has(baseName.toLowerCase()))
|
|
418
|
+
return baseName;
|
|
419
|
+
let suffix = 2;
|
|
420
|
+
while (names.has(`${baseName} ${suffix}`.toLowerCase()))
|
|
421
|
+
suffix++;
|
|
422
|
+
return `${baseName} ${suffix}`;
|
|
423
|
+
}
|
|
424
|
+
function findProfileByInput(config, value) {
|
|
425
|
+
const profiles = getApiConfigProfiles(config);
|
|
426
|
+
const trimmed = value.trim();
|
|
427
|
+
const index = Number(trimmed);
|
|
428
|
+
if (Number.isInteger(index) && index >= 1 && index <= profiles.length)
|
|
429
|
+
return profiles[index - 1];
|
|
430
|
+
const lower = trimmed.toLowerCase();
|
|
431
|
+
return profiles.find(item => item.id.toLowerCase() === lower || item.name.toLowerCase() === lower);
|
|
432
|
+
}
|
|
433
|
+
async function promptProfile(config, message = setupText('setup.api.chooseAction')) {
|
|
434
|
+
const profiles = getApiConfigProfiles(config);
|
|
435
|
+
if (profiles.length === 0) {
|
|
436
|
+
console.log(chalk.yellow(setupText('setup.api.noSelectableProfiles')));
|
|
437
|
+
return undefined;
|
|
438
|
+
}
|
|
439
|
+
const selectedId = await promptSelect(message, profiles.map(item => ({
|
|
440
|
+
name: profileLine(item, config.activeApiConfigId),
|
|
441
|
+
value: item.id,
|
|
442
|
+
short: item.name,
|
|
443
|
+
})), config.activeApiConfigId || profiles[0]?.id);
|
|
444
|
+
return profiles.find(item => item.id === selectedId);
|
|
445
|
+
}
|
|
446
|
+
function modelLimits(model) {
|
|
447
|
+
const spec = getSupportedModelSpec(model);
|
|
448
|
+
return {
|
|
449
|
+
contextWindow: spec?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
450
|
+
maxTokens: spec?.defaultRequestTokens ?? DEFAULT_MAX_TOKENS,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
async function promptProvider(current) {
|
|
454
|
+
const defaultPreset = current ? getProviderPreset(current.provider) : undefined;
|
|
455
|
+
const providerId = await promptSelect(setupText('setup.api.selectProvider'), PROVIDER_PRESETS.map(item => ({
|
|
456
|
+
name: `${providerLabel(item)} ${chalk.gray(`- ${item.description}`)}`,
|
|
457
|
+
value: item.id,
|
|
458
|
+
short: item.name,
|
|
459
|
+
})), defaultPreset?.id || 'custom');
|
|
460
|
+
return resolveProvider(providerId);
|
|
461
|
+
}
|
|
462
|
+
async function promptProfileFields(options) {
|
|
463
|
+
const { currentConfig, existing, copyFrom, cliOptions = {}, directMode = false } = options;
|
|
464
|
+
const source = existing || copyFrom || currentConfig;
|
|
465
|
+
let preset = directMode ? defaultProviderForOptions(cliOptions, currentConfig) : undefined;
|
|
466
|
+
if (directMode && cliOptions.provider && !preset) {
|
|
467
|
+
throw new Error(setupText('setup.api.unknownProvider', { provider: cliOptions.provider }));
|
|
468
|
+
}
|
|
469
|
+
if (!preset)
|
|
470
|
+
preset = await promptProvider(source);
|
|
471
|
+
if (!preset)
|
|
472
|
+
throw new Error(setupText('setup.api.unknownProvider', { provider: cliOptions.provider || '' }));
|
|
473
|
+
const providerWasExplicit = Boolean(cliOptions.provider?.trim());
|
|
474
|
+
const providerChanged = source.provider !== preset.provider;
|
|
475
|
+
const defaultBaseUrl = cliOptions.baseUrl
|
|
476
|
+
|| (providerChanged || providerWasExplicit ? preset.baseUrl : source.baseUrl)
|
|
477
|
+
|| preset.baseUrl;
|
|
478
|
+
const baseUrl = directMode
|
|
479
|
+
? defaultBaseUrl
|
|
480
|
+
: await promptInput('Base URL', {
|
|
481
|
+
default: defaultBaseUrl,
|
|
482
|
+
required: true,
|
|
483
|
+
validate: validateUrl,
|
|
484
|
+
});
|
|
485
|
+
const sameConnection = source.provider === preset.provider
|
|
486
|
+
&& source.baseUrl.replace(/\/+$/, '') === baseUrl.replace(/\/+$/, '');
|
|
487
|
+
const model = cliOptions.model?.trim()
|
|
488
|
+
|| (sameConnection ? source.model : preset.defaultModel);
|
|
489
|
+
let apiKey = cliOptions.apiKey;
|
|
490
|
+
if (apiKey === undefined) {
|
|
491
|
+
if (directMode) {
|
|
492
|
+
apiKey = shouldKeepCurrentApiKey(currentConfig, preset, baseUrl) ? currentConfig.apiKey : '';
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
const keepCurrent = sameConnection && Boolean(source.apiKey);
|
|
496
|
+
const entered = await promptPassword(setupText(keepCurrent ? 'setup.api.keepKey' : 'setup.api.newKey'));
|
|
497
|
+
apiKey = entered || (keepCurrent ? source.apiKey : '');
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (!baseUrl)
|
|
501
|
+
throw new Error(setupText('setup.api.baseUrlRequired'));
|
|
502
|
+
const urlValidation = validateUrl(baseUrl);
|
|
503
|
+
if (urlValidation !== true)
|
|
504
|
+
throw new Error(urlValidation);
|
|
505
|
+
const modelUnchanged = sameConnection && model === source.model;
|
|
506
|
+
const limits = modelLimits(model);
|
|
507
|
+
const modelSpec = getSupportedModelSpec(model);
|
|
508
|
+
const reasoning = model
|
|
509
|
+
? normalizeNativeReasoningConfig(model, modelUnchanged ? source.reasoning : undefined, preset.provider)
|
|
510
|
+
: undefined;
|
|
511
|
+
const profiles = getApiConfigProfiles(currentConfig).filter(item => item.id !== existing?.id);
|
|
512
|
+
const defaultName = existing?.name
|
|
513
|
+
|| uniqueProfileName(preset.id === 'custom' ? setupText('setup.api.customName') : preset.name, profiles);
|
|
514
|
+
const name = directMode
|
|
515
|
+
? defaultName
|
|
516
|
+
: await promptInput(setupText('setup.api.profileName'), {
|
|
517
|
+
default: defaultName,
|
|
518
|
+
required: true,
|
|
519
|
+
});
|
|
520
|
+
return createApiConfigProfile({
|
|
521
|
+
id: existing?.id,
|
|
522
|
+
name,
|
|
523
|
+
provider: preset.provider,
|
|
524
|
+
apiKey,
|
|
525
|
+
baseUrl,
|
|
526
|
+
model,
|
|
527
|
+
contextWindow: modelUnchanged ? source.contextWindow : limits.contextWindow,
|
|
528
|
+
maxTokens: modelUnchanged ? source.maxTokens : limits.maxTokens,
|
|
529
|
+
maxOutputTokens: modelUnchanged ? source.maxOutputTokens : modelSpec?.maxOutputTokens,
|
|
530
|
+
modelCapabilities: modelUnchanged ? source.modelCapabilities : modelSpec ? {
|
|
531
|
+
vision: modelSpec.supportsVision,
|
|
532
|
+
reasoning: Boolean(reasoning),
|
|
533
|
+
} : undefined,
|
|
534
|
+
modelMetadataSources: modelUnchanged ? source.modelMetadataSources : modelSpec ? ['builtin'] : ['default'],
|
|
535
|
+
reasoning,
|
|
536
|
+
createdAt: existing?.createdAt,
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
async function configureApiDirect(options = {}) {
|
|
540
|
+
const current = await loadConfig();
|
|
541
|
+
const directMode = options.yes || hasApiOptions(options);
|
|
542
|
+
if (!directMode)
|
|
543
|
+
return configureApiProfiles();
|
|
544
|
+
const profile = await promptProfileFields({
|
|
545
|
+
currentConfig: current,
|
|
546
|
+
existing: getActiveApiConfigProfile(current),
|
|
547
|
+
cliOptions: options,
|
|
548
|
+
directMode: true,
|
|
549
|
+
});
|
|
550
|
+
const next = saveApiConfigProfile(current, profile, true);
|
|
551
|
+
const saved = saveConfig(next);
|
|
552
|
+
console.log(chalk.green(setupText('setup.api.saved')));
|
|
553
|
+
console.log(` name: ${profile.name}`);
|
|
554
|
+
console.log(` provider: ${saved.provider}`);
|
|
555
|
+
console.log(` baseUrl: ${saved.baseUrl}`);
|
|
556
|
+
console.log(` model: ${saved.model || `(${setupText('setup.api.modelLater')})`}`);
|
|
557
|
+
console.log(` apiKey: ${maskKey(saved.apiKey)}`);
|
|
558
|
+
return saved;
|
|
559
|
+
}
|
|
560
|
+
async function addApiProfile(config) {
|
|
561
|
+
const profile = await promptProfileFields({ currentConfig: config });
|
|
562
|
+
const makeActive = await promptConfirm(setupText('setup.api.makeActive'), getApiConfigProfiles(config).length === 0);
|
|
563
|
+
const next = saveApiConfigProfile(config, profile, makeActive);
|
|
564
|
+
const saved = saveConfig(next);
|
|
565
|
+
console.log(chalk.green(setupText('setup.api.added', { name: profile.name })));
|
|
566
|
+
return saved;
|
|
567
|
+
}
|
|
568
|
+
async function switchApiProfile(config) {
|
|
569
|
+
const selected = await promptProfile(config, setupText('setup.api.selectSwitch'));
|
|
570
|
+
if (!selected)
|
|
571
|
+
return config;
|
|
572
|
+
const next = switchActiveApiConfig(config, selected.id);
|
|
573
|
+
const saved = saveConfig(next);
|
|
574
|
+
console.log(chalk.green(setupText('setup.api.switched', { name: selected.name })));
|
|
575
|
+
return saved;
|
|
576
|
+
}
|
|
577
|
+
async function editApiProfile(config) {
|
|
578
|
+
const selected = await promptProfile(config, setupText('setup.api.selectEdit'));
|
|
579
|
+
if (!selected)
|
|
580
|
+
return config;
|
|
581
|
+
const profile = await promptProfileFields({ currentConfig: config, existing: selected });
|
|
582
|
+
const makeActive = selected.id === config.activeApiConfigId;
|
|
583
|
+
const next = saveApiConfigProfile(config, profile, makeActive);
|
|
584
|
+
const saved = saveConfig(next);
|
|
585
|
+
console.log(chalk.green(setupText('setup.api.updated', { name: profile.name })));
|
|
586
|
+
return saved;
|
|
587
|
+
}
|
|
588
|
+
async function copyApiProfile(config) {
|
|
589
|
+
const selected = await promptProfile(config, setupText('setup.api.selectCopy'));
|
|
590
|
+
if (!selected)
|
|
591
|
+
return config;
|
|
592
|
+
const profiles = getApiConfigProfiles(config);
|
|
593
|
+
const copied = createApiConfigProfile({
|
|
594
|
+
...selected,
|
|
595
|
+
id: undefined,
|
|
596
|
+
name: uniqueProfileName(`${selected.name} Copy`, profiles),
|
|
597
|
+
createdAt: undefined,
|
|
598
|
+
updatedAt: undefined,
|
|
599
|
+
});
|
|
600
|
+
const next = saveApiConfigProfile(config, copied, false);
|
|
601
|
+
const saved = saveConfig(next);
|
|
602
|
+
console.log(chalk.green(setupText('setup.api.copied', { name: copied.name })));
|
|
603
|
+
return saved;
|
|
604
|
+
}
|
|
605
|
+
async function deleteApiProfile(config) {
|
|
606
|
+
const selected = await promptProfile(config, setupText('setup.api.selectDelete'));
|
|
607
|
+
if (!selected)
|
|
608
|
+
return config;
|
|
609
|
+
const ok = await promptConfirm(setupText('setup.api.confirmDelete', { name: selected.name }), false);
|
|
610
|
+
if (!ok) {
|
|
611
|
+
console.log(chalk.yellow(setupText('common.cancelled')));
|
|
612
|
+
return config;
|
|
613
|
+
}
|
|
614
|
+
const next = deleteApiConfigProfile(config, selected.id);
|
|
615
|
+
const saved = saveConfig(next);
|
|
616
|
+
console.log(chalk.green(setupText('setup.api.deleted', { name: selected.name })));
|
|
617
|
+
return saved;
|
|
618
|
+
}
|
|
619
|
+
async function configureApiProfiles() {
|
|
620
|
+
let config = await loadConfig();
|
|
621
|
+
let done = false;
|
|
622
|
+
while (!done) {
|
|
623
|
+
console.log(chalk.cyan(setupText('setup.api.profilesTitle')));
|
|
624
|
+
printApiProfiles(config);
|
|
625
|
+
console.log('');
|
|
626
|
+
const choice = await promptSelect(setupText('setup.api.chooseAction'), [
|
|
627
|
+
{ name: setupText('setup.api.actionAdd'), value: '1' },
|
|
628
|
+
{ name: setupText('setup.api.actionSwitch'), value: '2', disabled: getApiConfigProfiles(config).length === 0 && setupText('setup.api.noSwitch') },
|
|
629
|
+
{ name: setupText('setup.api.actionEdit'), value: '3', disabled: getApiConfigProfiles(config).length === 0 && setupText('setup.api.noEdit') },
|
|
630
|
+
{ name: setupText('setup.api.actionCopy'), value: '4', disabled: getApiConfigProfiles(config).length === 0 && setupText('setup.api.noCopy') },
|
|
631
|
+
{ name: setupText('setup.api.actionDelete'), value: '5', disabled: getApiConfigProfiles(config).length === 0 && setupText('setup.api.noDelete') },
|
|
632
|
+
{ name: setupText('setup.api.back'), value: 'q' },
|
|
633
|
+
]);
|
|
634
|
+
console.log('');
|
|
635
|
+
switch (choice) {
|
|
636
|
+
case '1':
|
|
637
|
+
config = await addApiProfile(config);
|
|
638
|
+
break;
|
|
639
|
+
case '2':
|
|
640
|
+
config = await switchApiProfile(config);
|
|
641
|
+
break;
|
|
642
|
+
case '3':
|
|
643
|
+
config = await editApiProfile(config);
|
|
644
|
+
break;
|
|
645
|
+
case '4':
|
|
646
|
+
config = await copyApiProfile(config);
|
|
647
|
+
break;
|
|
648
|
+
case '5':
|
|
649
|
+
config = await deleteApiProfile(config);
|
|
650
|
+
break;
|
|
651
|
+
case 'q':
|
|
652
|
+
done = true;
|
|
653
|
+
break;
|
|
654
|
+
}
|
|
655
|
+
if (!done)
|
|
656
|
+
printSeparator();
|
|
657
|
+
}
|
|
658
|
+
return config;
|
|
659
|
+
}
|
|
660
|
+
async function configureApi(options = {}) {
|
|
661
|
+
return configureApiDirect(options);
|
|
662
|
+
}
|
|
663
|
+
async function configureLanguage(options = {}) {
|
|
664
|
+
let profile = loadProfile();
|
|
665
|
+
const interfaceInput = options.allLang || options.configLang || options.lang;
|
|
666
|
+
const outputInput = options.allLang || options.aiOutputLang || options.lang;
|
|
667
|
+
const interfaceFromCli = normalizeInterfaceLanguage(interfaceInput);
|
|
668
|
+
const outputFromCli = normalizeOutputLanguage(outputInput);
|
|
669
|
+
if (options.configLang && !normalizeInterfaceLanguage(options.configLang)) {
|
|
670
|
+
throw new Error(setupText('setup.language.invalidInterface', { language: options.configLang }, profile));
|
|
671
|
+
}
|
|
672
|
+
if (options.allLang && !normalizeInterfaceLanguage(options.allLang)) {
|
|
673
|
+
throw new Error(setupText('setup.language.invalidShared', { language: options.allLang }, profile));
|
|
674
|
+
}
|
|
675
|
+
if (outputFromCli.language === 'custom' && !outputFromCli.custom && !profile.customAiOutputLanguage) {
|
|
676
|
+
throw new Error(setupText('setup.language.customRequired', undefined, profile));
|
|
677
|
+
}
|
|
678
|
+
if (options.yes || interfaceFromCli || outputFromCli.language) {
|
|
679
|
+
profile = saveProfile({
|
|
680
|
+
interfaceLanguage: interfaceFromCli || profile.interfaceLanguage,
|
|
681
|
+
aiOutputLanguage: outputFromCli.language || profile.aiOutputLanguage,
|
|
682
|
+
customAiOutputLanguage: outputFromCli.custom || profile.customAiOutputLanguage,
|
|
683
|
+
});
|
|
684
|
+
console.log(chalk.green(setupText('setup.language.saved', undefined, profile)));
|
|
685
|
+
return profile;
|
|
686
|
+
}
|
|
687
|
+
console.log(chalk.cyan(setupText('setup.language.title', undefined, profile)));
|
|
688
|
+
const interfaceLanguage = await promptSelect(setupText('setup.language.interface', undefined, profile), [
|
|
689
|
+
{ name: setupText('setup.language.simplifiedChinese', undefined, profile), value: 'zh-CN' },
|
|
690
|
+
{ name: 'English', value: 'en' },
|
|
691
|
+
], profile.interfaceLanguage);
|
|
692
|
+
profile = saveProfile({ interfaceLanguage });
|
|
693
|
+
console.log('');
|
|
694
|
+
const aiOutputLanguage = await promptSelect(setupText('setup.language.aiOutput', undefined, profile), [
|
|
695
|
+
{ name: setupText('setup.language.followUser', undefined, profile), value: 'follow-user' },
|
|
696
|
+
{ name: setupText('setup.language.simplifiedChinese', undefined, profile), value: 'zh-CN' },
|
|
697
|
+
{ name: 'English', value: 'en' },
|
|
698
|
+
{ name: 'Japanese', value: 'ja' },
|
|
699
|
+
{ name: 'Korean', value: 'ko' },
|
|
700
|
+
{ name: setupText('setup.language.custom', undefined, profile), value: 'custom' },
|
|
701
|
+
], profile.aiOutputLanguage);
|
|
702
|
+
let customAiOutputLanguage = profile.customAiOutputLanguage;
|
|
703
|
+
if (aiOutputLanguage === 'custom') {
|
|
704
|
+
customAiOutputLanguage = await promptInput(setupText('setup.language.customPrompt', undefined, profile), {
|
|
705
|
+
default: customAiOutputLanguage,
|
|
706
|
+
required: true,
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
profile = saveProfile({ aiOutputLanguage, customAiOutputLanguage });
|
|
710
|
+
console.log(chalk.green(setupText('setup.language.saved', undefined, profile)));
|
|
711
|
+
return profile;
|
|
712
|
+
}
|
|
713
|
+
async function configurePersona(options = {}) {
|
|
714
|
+
let profile = loadProfile();
|
|
715
|
+
const fromCli = parseStyleList(options.outputStyle);
|
|
716
|
+
const defaultFromCli = options.defaultOutputStyle?.trim().toLowerCase();
|
|
717
|
+
if (options.yes || fromCli || defaultFromCli) {
|
|
718
|
+
if (fromCli === 'skip' && !defaultFromCli) {
|
|
719
|
+
console.log(chalk.gray(setupText('setup.persona.skipped', undefined, profile)));
|
|
720
|
+
return profile;
|
|
721
|
+
}
|
|
722
|
+
if (Array.isArray(fromCli)) {
|
|
723
|
+
const unknown = fromCli.filter(id => !PERSONA_DEFINITIONS.some(p => p.id === id && !p.isCustom));
|
|
724
|
+
if (unknown.length > 0)
|
|
725
|
+
throw new Error(setupText('setup.persona.unknown', { personas: unknown.join(', ') }, profile));
|
|
726
|
+
if (fromCli.length === 0)
|
|
727
|
+
throw new Error(setupText('setup.persona.oneRequired', undefined, profile));
|
|
728
|
+
}
|
|
729
|
+
let enabledPersonaIds = Array.isArray(fromCli) ? fromCli : [...profile.enabledPersonaIds];
|
|
730
|
+
const defaultPersonaId = defaultFromCli || profile.defaultPersonaId;
|
|
731
|
+
if (defaultPersonaId !== 'custom' && !PERSONA_DEFINITIONS.some(p => p.id === defaultPersonaId)) {
|
|
732
|
+
throw new Error(setupText('setup.persona.unknownDefault', { persona: defaultPersonaId }, profile));
|
|
733
|
+
}
|
|
734
|
+
if (defaultPersonaId === 'custom' && !profile.customPersonaPrompt) {
|
|
735
|
+
throw new Error(setupText('setup.persona.customPromptRequired', undefined, profile));
|
|
736
|
+
}
|
|
737
|
+
if (defaultPersonaId !== 'custom' && !enabledPersonaIds.includes(defaultPersonaId)) {
|
|
738
|
+
enabledPersonaIds = [...enabledPersonaIds, defaultPersonaId];
|
|
739
|
+
}
|
|
740
|
+
profile = saveProfile({ enabledPersonaIds, defaultPersonaId });
|
|
741
|
+
console.log(chalk.green(setupText('setup.persona.saved', undefined, profile)));
|
|
742
|
+
return profile;
|
|
743
|
+
}
|
|
744
|
+
const available = PERSONA_DEFINITIONS.filter(persona => !persona.isCustom);
|
|
745
|
+
console.log(chalk.cyan(setupText('setup.persona.title', undefined, profile)));
|
|
746
|
+
const enabledPersonaIds = await promptCheckbox(setupText('setup.persona.selectEnabled', undefined, profile), available.map(persona => {
|
|
747
|
+
const name = profile.interfaceLanguage === 'en' ? persona.nameEn : persona.nameZh;
|
|
748
|
+
const desc = profile.interfaceLanguage === 'en' ? persona.descriptionEn : persona.descriptionZh;
|
|
749
|
+
return {
|
|
750
|
+
name: `${name} (${persona.id}) ${chalk.gray(`- ${desc}`)}`,
|
|
751
|
+
value: persona.id,
|
|
752
|
+
checked: profile.enabledPersonaIds.includes(persona.id),
|
|
753
|
+
};
|
|
754
|
+
}));
|
|
755
|
+
if (enabledPersonaIds.length === 0)
|
|
756
|
+
throw new Error(setupText('setup.persona.oneRequired', undefined, profile));
|
|
757
|
+
const defaultChoices = enabledPersonaIds.map(id => {
|
|
758
|
+
const persona = getPersonaDefinition(id);
|
|
759
|
+
const name = profile.interfaceLanguage === 'en' ? persona.nameEn : persona.nameZh;
|
|
760
|
+
return {
|
|
761
|
+
name: `${name} (${persona.id})`,
|
|
762
|
+
value: id,
|
|
763
|
+
};
|
|
764
|
+
});
|
|
765
|
+
const defaultPersonaId = await promptSelect(setupText('setup.persona.default', undefined, profile), [
|
|
766
|
+
...defaultChoices,
|
|
767
|
+
{ name: setupText('setup.persona.custom', undefined, profile), value: 'custom' },
|
|
768
|
+
], enabledPersonaIds.includes(profile.defaultPersonaId) || profile.defaultPersonaId === 'custom'
|
|
769
|
+
? profile.defaultPersonaId
|
|
770
|
+
: enabledPersonaIds[0]);
|
|
771
|
+
let customPersonaName = profile.customPersonaName;
|
|
772
|
+
let customPersonaPrompt = profile.customPersonaPrompt;
|
|
773
|
+
if (defaultPersonaId === 'custom') {
|
|
774
|
+
customPersonaName = await promptInput(setupText('setup.persona.customName', undefined, profile), {
|
|
775
|
+
default: customPersonaName || setupText('setup.persona.defaultCustomName', undefined, profile),
|
|
776
|
+
required: true,
|
|
777
|
+
});
|
|
778
|
+
customPersonaPrompt = await promptEditor(setupText('setup.persona.customPrompt', undefined, profile), customPersonaPrompt || setupText('setup.persona.defaultPrompt', undefined, profile));
|
|
779
|
+
if (!customPersonaPrompt)
|
|
780
|
+
throw new Error(setupText('setup.persona.customPromptEmpty', undefined, profile));
|
|
781
|
+
}
|
|
782
|
+
profile = saveProfile({ enabledPersonaIds, defaultPersonaId, customPersonaName, customPersonaPrompt });
|
|
783
|
+
console.log(chalk.green(setupText('setup.persona.saved', undefined, profile)));
|
|
784
|
+
return profile;
|
|
785
|
+
}
|
|
786
|
+
async function configureCustomInstructions(options = {}) {
|
|
787
|
+
const profile = loadProfile();
|
|
788
|
+
if (options.yes || options.customInstructions !== undefined) {
|
|
789
|
+
const next = saveProfile({ customInstructions: options.customInstructions ?? profile.customInstructions });
|
|
790
|
+
console.log(chalk.green(setupText('setup.instructions.saved', undefined, next)));
|
|
791
|
+
return next;
|
|
792
|
+
}
|
|
793
|
+
const customInstructions = await promptEditor(setupText('setup.instructions.edit', undefined, profile), profile.customInstructions);
|
|
794
|
+
const next = saveProfile({ customInstructions });
|
|
795
|
+
console.log(chalk.green(setupText('setup.instructions.saved', undefined, next)));
|
|
796
|
+
return next;
|
|
797
|
+
}
|
|
798
|
+
async function configureApprovalPolicy(options = {}) {
|
|
799
|
+
const config = await loadConfig();
|
|
800
|
+
const profile = loadProfile();
|
|
801
|
+
let approvalPolicy;
|
|
802
|
+
if (options.approvalPolicy) {
|
|
803
|
+
const normalized = options.approvalPolicy.trim().toLowerCase();
|
|
804
|
+
if (!['ask', 'agent', 'full', 'request', 'auto'].includes(normalized)) {
|
|
805
|
+
throw new Error(setupText('setup.approval.invalid', undefined, profile));
|
|
806
|
+
}
|
|
807
|
+
approvalPolicy = normalizeApprovalPolicy(normalized);
|
|
808
|
+
}
|
|
809
|
+
else if (options.yes) {
|
|
810
|
+
approvalPolicy = config.approvalPolicy;
|
|
811
|
+
}
|
|
812
|
+
else {
|
|
813
|
+
const labelKeys = {
|
|
814
|
+
ask: 'setup.approval.ask',
|
|
815
|
+
agent: 'setup.approval.agent',
|
|
816
|
+
full: 'setup.approval.full',
|
|
817
|
+
};
|
|
818
|
+
approvalPolicy = await promptSelect(setupText('setup.approval.title', undefined, profile), ['ask', 'agent', 'full'].map(policy => ({
|
|
819
|
+
name: setupText(labelKeys[policy], undefined, profile),
|
|
820
|
+
value: policy,
|
|
821
|
+
})), config.approvalPolicy);
|
|
822
|
+
}
|
|
823
|
+
const next = setConfigValue(config, 'approvalPolicy', approvalPolicy);
|
|
824
|
+
saveConfig(next);
|
|
825
|
+
console.log(chalk.green(setupText('setup.approval.saved', { policy: approvalPolicyLabel(approvalPolicy, createTranslator(profile.interfaceLanguage)) }, profile)));
|
|
826
|
+
return next;
|
|
827
|
+
}
|
|
828
|
+
async function runFullInitialization(options = {}) {
|
|
829
|
+
let profile = await configureLanguage(options);
|
|
830
|
+
await configureApi(options);
|
|
831
|
+
await configureApprovalPolicy(options);
|
|
832
|
+
profile = await configurePersona(options);
|
|
833
|
+
if (!options.yes) {
|
|
834
|
+
const editCustom = await promptConfirm(setupText('setup.init.editInstructions', undefined, profile), false);
|
|
835
|
+
if (editCustom)
|
|
836
|
+
profile = await configureCustomInstructions(options);
|
|
837
|
+
}
|
|
838
|
+
else if (options.customInstructions !== undefined) {
|
|
839
|
+
profile = await configureCustomInstructions(options);
|
|
840
|
+
}
|
|
841
|
+
const config = await loadConfig();
|
|
842
|
+
console.log('');
|
|
843
|
+
printSummary(config, profile);
|
|
844
|
+
console.log('');
|
|
845
|
+
console.log(chalk.cyan(setupText('setup.init.done', undefined, profile)));
|
|
846
|
+
}
|
|
847
|
+
async function showCurrentConfiguration() {
|
|
848
|
+
const [config, profile] = await Promise.all([loadConfig(), Promise.resolve(loadProfile())]);
|
|
849
|
+
printSummary(config, profile);
|
|
850
|
+
}
|
|
851
|
+
async function resetAllConfiguration(options = {}) {
|
|
852
|
+
let profile = loadProfile();
|
|
853
|
+
const ok = options.yes
|
|
854
|
+
? true
|
|
855
|
+
: await promptConfirm(setupText('setup.reset.confirm', undefined, profile), false);
|
|
856
|
+
if (!ok) {
|
|
857
|
+
console.log(chalk.yellow(setupText('common.cancelled', undefined, profile)));
|
|
858
|
+
return;
|
|
859
|
+
}
|
|
860
|
+
saveConfig(createEmptyConfig());
|
|
861
|
+
profile = resetProfile();
|
|
862
|
+
console.log(chalk.green(setupText('setup.reset.done', undefined, profile)));
|
|
863
|
+
}
|
|
864
|
+
async function promptMainAction(profile) {
|
|
865
|
+
console.log(chalk.cyan(setupText('setup.menu.title', undefined, profile)));
|
|
866
|
+
console.log(` ${setupText('setup.menu.init', undefined, profile)}`);
|
|
867
|
+
console.log(` ${setupText('setup.menu.api', undefined, profile)}`);
|
|
868
|
+
console.log(` ${setupText('setup.menu.language', undefined, profile)}`);
|
|
869
|
+
console.log(` ${setupText('setup.menu.persona', undefined, profile)}`);
|
|
870
|
+
console.log(` ${setupText('setup.menu.instructions', undefined, profile)}`);
|
|
871
|
+
console.log(` ${setupText('setup.menu.approval', undefined, profile)}`);
|
|
872
|
+
console.log(` ${setupText('setup.menu.show', undefined, profile)}`);
|
|
873
|
+
console.log(` ${setupText('setup.menu.reset', undefined, profile)}`);
|
|
874
|
+
console.log(` ${setupText('setup.menu.exit', undefined, profile)}`);
|
|
875
|
+
const choice = await promptMenuChoice(setupText('setup.menu.input', undefined, profile), ['1', '2', '3', '4', '5', '6', '7', '8', 'q']);
|
|
876
|
+
switch (choice) {
|
|
877
|
+
case '1': return 'init';
|
|
878
|
+
case '2': return 'api';
|
|
879
|
+
case '3': return 'language';
|
|
880
|
+
case '4': return 'persona';
|
|
881
|
+
case '5': return 'custom';
|
|
882
|
+
case '6': return 'approval';
|
|
883
|
+
case '7': return 'show';
|
|
884
|
+
case '8': return 'reset';
|
|
885
|
+
case 'q': return 'exit';
|
|
886
|
+
default: return 'menu';
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
async function runMenu(options = {}) {
|
|
890
|
+
let profile = loadProfile();
|
|
891
|
+
printBanner(profile);
|
|
892
|
+
let exit = false;
|
|
893
|
+
while (!exit) {
|
|
894
|
+
profile = loadProfile();
|
|
895
|
+
const action = await promptMainAction(profile);
|
|
896
|
+
console.log('');
|
|
897
|
+
switch (action) {
|
|
898
|
+
case 'init':
|
|
899
|
+
await runFullInitialization(options);
|
|
900
|
+
break;
|
|
901
|
+
case 'api':
|
|
902
|
+
await configureApi();
|
|
903
|
+
break;
|
|
904
|
+
case 'language':
|
|
905
|
+
profile = await configureLanguage();
|
|
906
|
+
break;
|
|
907
|
+
case 'persona':
|
|
908
|
+
profile = await configurePersona();
|
|
909
|
+
break;
|
|
910
|
+
case 'custom':
|
|
911
|
+
profile = await configureCustomInstructions();
|
|
912
|
+
break;
|
|
913
|
+
case 'approval':
|
|
914
|
+
await configureApprovalPolicy();
|
|
915
|
+
break;
|
|
916
|
+
case 'show':
|
|
917
|
+
await showCurrentConfiguration();
|
|
918
|
+
break;
|
|
919
|
+
case 'reset':
|
|
920
|
+
await resetAllConfiguration(options);
|
|
921
|
+
break;
|
|
922
|
+
case 'exit':
|
|
923
|
+
exit = true;
|
|
924
|
+
continue;
|
|
925
|
+
}
|
|
926
|
+
console.log('');
|
|
927
|
+
exit = !(await promptContinue(profile));
|
|
928
|
+
if (!exit)
|
|
929
|
+
printSeparator();
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
export async function runSetup(options = {}) {
|
|
933
|
+
const action = normalizeAction(options.action);
|
|
934
|
+
if (action === 'menu' && hasDirectOptions(options) && !options.yes) {
|
|
935
|
+
printBanner(loadProfile());
|
|
936
|
+
if (hasLanguageOptions(options))
|
|
937
|
+
await configureLanguage(options);
|
|
938
|
+
if (hasApiOptions(options))
|
|
939
|
+
await configureApi(options);
|
|
940
|
+
if (hasPersonaOptions(options))
|
|
941
|
+
await configurePersona(options);
|
|
942
|
+
if (options.customInstructions !== undefined)
|
|
943
|
+
await configureCustomInstructions(options);
|
|
944
|
+
if (options.approvalPolicy !== undefined)
|
|
945
|
+
await configureApprovalPolicy(options);
|
|
946
|
+
console.log('');
|
|
947
|
+
await showCurrentConfiguration();
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
950
|
+
if (options.yes || action !== 'menu') {
|
|
951
|
+
if (action !== 'show')
|
|
952
|
+
printBanner(loadProfile());
|
|
953
|
+
switch (action) {
|
|
954
|
+
case 'init':
|
|
955
|
+
await runFullInitialization(options);
|
|
956
|
+
return;
|
|
957
|
+
case 'api':
|
|
958
|
+
await configureApi(options);
|
|
959
|
+
return;
|
|
960
|
+
case 'language':
|
|
961
|
+
await configureLanguage(options);
|
|
962
|
+
return;
|
|
963
|
+
case 'persona':
|
|
964
|
+
await configurePersona(options);
|
|
965
|
+
return;
|
|
966
|
+
case 'custom':
|
|
967
|
+
await configureCustomInstructions(options);
|
|
968
|
+
return;
|
|
969
|
+
case 'approval':
|
|
970
|
+
await configureApprovalPolicy(options);
|
|
971
|
+
return;
|
|
972
|
+
case 'show':
|
|
973
|
+
await showCurrentConfiguration();
|
|
974
|
+
return;
|
|
975
|
+
case 'reset':
|
|
976
|
+
await resetAllConfiguration(options);
|
|
977
|
+
return;
|
|
978
|
+
case 'exit':
|
|
979
|
+
return;
|
|
980
|
+
case 'menu':
|
|
981
|
+
await runFullInitialization({
|
|
982
|
+
...options,
|
|
983
|
+
action: 'init',
|
|
984
|
+
lang: options.lang || DEFAULT_PROFILE.interfaceLanguage,
|
|
985
|
+
});
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
await runMenu(options);
|
|
990
|
+
}
|
|
991
|
+
//# sourceMappingURL=setup.js.map
|