@tyvm/knowhow 0.0.33 → 0.0.34
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/autodoc/plugins/downloader/downloader.mdx +2 -2
- package/benchmarks/.dockerignore +7 -0
- package/benchmarks/README.md +166 -0
- package/benchmarks/docker/Dockerfile +68 -0
- package/benchmarks/example-config.yml +27 -0
- package/benchmarks/jest.config.js +13 -0
- package/benchmarks/package-lock.json +4297 -0
- package/benchmarks/package.json +39 -0
- package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +2814 -0
- package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +2014 -0
- package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +3121 -0
- package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +98 -0
- package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +3256 -0
- package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +4298 -0
- package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3031 -0
- package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +2990 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3256 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3007 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +3256 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +3036 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +3280 -0
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +1920 -0
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +3281 -0
- package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +2896 -0
- package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3011 -0
- package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +3003 -0
- package/benchmarks/scripts/build-and-run.sh +47 -0
- package/benchmarks/scripts/clone-exercism.sh +92 -0
- package/benchmarks/scripts/validate.sh +48 -0
- package/benchmarks/src/__tests__/runner.test.ts +27 -0
- package/benchmarks/src/cli.ts +90 -0
- package/benchmarks/src/evaluators/EvaluatorRegistry.ts +64 -0
- package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +183 -0
- package/benchmarks/src/evaluators/index.ts +3 -0
- package/benchmarks/src/evaluators/types.ts +22 -0
- package/benchmarks/src/index.ts +3 -0
- package/benchmarks/src/providers.ts +13 -0
- package/benchmarks/src/runner.ts +824 -0
- package/benchmarks/src/types.ts +63 -0
- package/benchmarks/tsconfig.json +19 -0
- package/jest.config.js +2 -1
- package/leaderboard/README.md +148 -0
- package/leaderboard/app/api/benchmark-data/route.ts +131 -0
- package/leaderboard/app/api/benchmark-detail/route.ts +172 -0
- package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +501 -0
- package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +375 -0
- package/leaderboard/app/globals.css +27 -0
- package/leaderboard/app/layout.tsx +21 -0
- package/leaderboard/app/page.tsx +170 -0
- package/leaderboard/components/LeaderboardTable.tsx +168 -0
- package/leaderboard/components/PerformanceChart.tsx +109 -0
- package/leaderboard/next-env.d.ts +5 -0
- package/leaderboard/next.config.js +4 -0
- package/leaderboard/package-lock.json +6363 -0
- package/leaderboard/package.json +28 -0
- package/leaderboard/postcss.config.js +6 -0
- package/leaderboard/tailwind.config.js +17 -0
- package/leaderboard/tsconfig.json +28 -0
- package/leaderboard/types/benchmark.ts +67 -0
- package/leaderboard/utils/dataProcessor.ts +33 -0
- package/package.json +2 -1
- package/src/agents/base/base.ts +147 -21
- package/src/agents/base/prompt.ts +28 -0
- package/src/agents/index.ts +3 -0
- package/src/agents/patcher/patcher.ts +6 -4
- package/src/agents/setup/setup.ts +56 -0
- package/src/agents/tools/agentCall.ts +6 -2
- package/src/agents/tools/aiClient.ts +74 -8
- package/src/agents/tools/execCommand.ts +13 -14
- package/src/agents/tools/executeScript/README.md +16 -0
- package/src/agents/tools/index.ts +2 -0
- package/src/agents/tools/list.ts +73 -16
- package/src/agents/tools/startAgentTask.ts +109 -0
- package/src/agents/tools/textSearch.ts +1 -1
- package/src/agents/tools/visionTool.ts +31 -2
- package/src/agents/tools/ycmd/client.ts +608 -0
- package/src/agents/tools/ycmd/definitions.ts +294 -0
- package/src/agents/tools/ycmd/detection.ts +211 -0
- package/src/agents/tools/ycmd/index.ts +11 -0
- package/src/agents/tools/ycmd/installer.ts +251 -0
- package/src/agents/tools/ycmd/server.ts +535 -0
- package/src/agents/tools/ycmd/serverManager.ts +316 -0
- package/src/agents/tools/ycmd/tools/completion.ts +113 -0
- package/src/agents/tools/ycmd/tools/diagnostics.ts +155 -0
- package/src/agents/tools/ycmd/tools/getLocations.ts +173 -0
- package/src/agents/tools/ycmd/tools/goto.ts +169 -0
- package/src/agents/tools/ycmd/tools/refactor.ts +204 -0
- package/src/agents/tools/ycmd/tools/signature.ts +174 -0
- package/src/agents/tools/ycmd/tools/start.ts +95 -0
- package/src/agents/tools/ycmd/utils/pathUtils.ts +59 -0
- package/src/ai.ts +15 -0
- package/src/chat/CliChatService.ts +277 -0
- package/src/chat/modules/AgentModule.ts +980 -0
- package/src/chat/modules/AskModule.ts +98 -0
- package/src/chat/modules/BaseChatModule.ts +66 -0
- package/src/chat/modules/InternalChatModule.ts +174 -0
- package/src/chat/modules/SearchModule.ts +166 -0
- package/src/chat/modules/SetupModule.ts +185 -0
- package/src/chat/modules/SystemModule.ts +120 -0
- package/src/chat/modules/VoiceModule.ts +70 -0
- package/src/chat/modules/index.js +5 -0
- package/src/chat/types.ts +97 -0
- package/src/chat.ts +9 -1
- package/src/chat2.ts +62 -0
- package/src/cli.ts +264 -35
- package/src/clients/anthropic.ts +14 -7
- package/src/clients/gemini.ts +15 -7
- package/src/clients/http.ts +17 -7
- package/src/clients/index.ts +117 -4
- package/src/clients/knowhow.ts +7 -2
- package/src/clients/knowhowMcp.ts +118 -0
- package/src/clients/openai.ts +32 -8
- package/src/clients/types.ts +1 -0
- package/src/clients/xai.ts +17 -5
- package/src/config.ts +30 -5
- package/src/conversion.ts +4 -1
- package/src/login.ts +26 -9
- package/src/microphone.ts +0 -1
- package/src/plugins/downloader/downloader.ts +72 -24
- package/src/plugins/downloader/plugin.ts +3 -1
- package/src/plugins/plugins.ts +3 -0
- package/src/processors/CustomVariables.ts +425 -0
- package/src/processors/HarmonyToolProcessor.ts +264 -0
- package/src/processors/XmlToolCallProcessor.ts +533 -0
- package/src/processors/index.ts +3 -0
- package/src/prompts/KnowhowConfigExamples.ts +376 -0
- package/src/services/KnowhowClient.ts +49 -3
- package/src/services/Mcp.ts +42 -3
- package/src/services/McpServer.ts +14 -4
- package/src/services/McpWebsocketTransport.ts +21 -7
- package/src/services/MessageProcessor.ts +10 -5
- package/src/services/index.ts +5 -0
- package/src/services/script-execution/ScriptExecutor.ts +34 -1
- package/src/services/types.ts +17 -14
- package/src/types.ts +17 -0
- package/src/utils/index.ts +138 -0
- package/tests/XmlToolCallProcessor.test.ts +468 -0
- package/tests/manual/ycmd/debug_diagnostics_test.ts +127 -0
- package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +26 -0
- package/tests/manual/ycmd/fixtures/file_change_test.ts +17 -0
- package/tests/manual/ycmd/minimal_advanced_test.ts +108 -0
- package/tests/manual/ycmd/simple_diagnostics_test.ts +61 -0
- package/tests/manual/ycmd/simple_test.ts +74 -0
- package/tests/manual/ycmd/test-typescript-sample.ts +34 -0
- package/tests/manual/ycmd/test_advanced_features.ts +407 -0
- package/tests/manual/ycmd/test_advanced_with_tools.ts +320 -0
- package/tests/manual/ycmd/test_comprehensive_typescript.ts +179 -0
- package/tests/manual/ycmd/test_diagnostics_file_changes.ts +249 -0
- package/tests/manual/ycmd/test_diagnostics_fix.ts +99 -0
- package/tests/manual/ycmd/test_diagnostics_simple.ts +100 -0
- package/tests/manual/ycmd/test_diagnostics_timing.ts +120 -0
- package/tests/manual/ycmd/test_discover_commands.ts +310 -0
- package/tests/manual/ycmd/test_endpoints.ts +115 -0
- package/tests/manual/ycmd/test_final_comprehensive.ts +218 -0
- package/tests/manual/ycmd/test_final_validation.ts +150 -0
- package/tests/manual/ycmd/test_implementation.js +42 -0
- package/tests/manual/ycmd/test_individual_ycmd_tool.ts +39 -0
- package/tests/manual/ycmd/test_server_manager.ts +52 -0
- package/tests/manual/ycmd/test_simple_debug.ts +86 -0
- package/tests/manual/ycmd/test_tsserver_workflow.js +83 -0
- package/tests/manual/ycmd/test_tsserver_workflow.ts +122 -0
- package/tests/manual/ycmd/test_typescript_simple.ts +48 -0
- package/tests/manual/ycmd/test_typescript_ycmd.ts +105 -0
- package/tests/manual/ycmd/test_workspace_config.ts +90 -0
- package/tests/manual/ycmd/test_ycmd_auto_start.ts +137 -0
- package/tests/manual/ycmd/test_ycmd_comprehensive.ts +73 -0
- package/tests/manual/ycmd/test_ycmd_connection.py +10 -0
- package/tests/manual/ycmd/test_ycmd_direct.ts +142 -0
- package/tests/manual/ycmd/test_ycmd_experiment.ts +48 -0
- package/tests/manual/ycmd/test_ycmd_final.ts +200 -0
- package/tests/manual/ycmd/test_ycmd_fixed.py +18 -0
- package/tests/manual/ycmd/test_ycmd_integration.ts +112 -0
- package/tests/manual/ycmd/test_ycmd_simple.ts +45 -0
- package/tests/manual/ycmd/test_ycmd_usage.py +27 -0
- package/tests/manual/ycmd/working_simple_test.ts +134 -0
- package/ts_build/src/agents/base/base.d.ts +14 -1
- package/ts_build/src/agents/base/base.js +91 -17
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/agents/base/prompt.d.ts +1 -1
- package/ts_build/src/agents/base/prompt.js +28 -0
- package/ts_build/src/agents/base/prompt.js.map +1 -1
- package/ts_build/src/agents/index.d.ts +2 -0
- package/ts_build/src/agents/index.js +2 -0
- package/ts_build/src/agents/index.js.map +1 -1
- package/ts_build/src/agents/patcher/patcher.js +6 -3
- package/ts_build/src/agents/patcher/patcher.js.map +1 -1
- package/ts_build/src/agents/setup/setup.d.ts +8 -0
- package/ts_build/src/agents/setup/setup.js +59 -0
- package/ts_build/src/agents/setup/setup.js.map +1 -0
- package/ts_build/src/agents/tools/agentCall.js +5 -2
- package/ts_build/src/agents/tools/agentCall.js.map +1 -1
- package/ts_build/src/agents/tools/aiClient.d.ts +6 -5
- package/ts_build/src/agents/tools/aiClient.js +37 -6
- package/ts_build/src/agents/tools/aiClient.js.map +1 -1
- package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
- package/ts_build/src/agents/tools/execCommand.js +5 -6
- package/ts_build/src/agents/tools/execCommand.js.map +1 -1
- package/ts_build/src/agents/tools/executeScript/index.d.ts +1 -1
- package/ts_build/src/agents/tools/index.d.ts +2 -0
- package/ts_build/src/agents/tools/index.js +2 -0
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +66 -16
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/startAgentTask.d.ts +13 -0
- package/ts_build/src/agents/tools/startAgentTask.js +74 -0
- package/ts_build/src/agents/tools/startAgentTask.js.map +1 -0
- package/ts_build/src/agents/tools/startChatTask.d.ts +13 -0
- package/ts_build/src/agents/tools/startChatTask.js +73 -0
- package/ts_build/src/agents/tools/startChatTask.js.map +1 -0
- package/ts_build/src/agents/tools/textSearch.js +1 -1
- package/ts_build/src/agents/tools/textSearch.js.map +1 -1
- package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
- package/ts_build/src/agents/tools/visionTool.js +23 -3
- package/ts_build/src/agents/tools/visionTool.js.map +1 -1
- package/ts_build/src/agents/tools/ycmd/client.d.ts +93 -0
- package/ts_build/src/agents/tools/ycmd/client.js +355 -0
- package/ts_build/src/agents/tools/ycmd/client.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/definitions.d.ts +345 -0
- package/ts_build/src/agents/tools/ycmd/definitions.js +298 -0
- package/ts_build/src/agents/tools/ycmd/definitions.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/detection.d.ts +11 -0
- package/ts_build/src/agents/tools/ycmd/detection.js +175 -0
- package/ts_build/src/agents/tools/ycmd/detection.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/index.d.ts +8 -0
- package/ts_build/src/agents/tools/ycmd/index.js +20 -0
- package/ts_build/src/agents/tools/ycmd/index.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/installer.d.ts +19 -0
- package/ts_build/src/agents/tools/ycmd/installer.js +196 -0
- package/ts_build/src/agents/tools/ycmd/installer.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/server.d.ts +35 -0
- package/ts_build/src/agents/tools/ycmd/server.js +363 -0
- package/ts_build/src/agents/tools/ycmd/server.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/serverManager.d.ts +39 -0
- package/ts_build/src/agents/tools/ycmd/serverManager.js +210 -0
- package/ts_build/src/agents/tools/ycmd/serverManager.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/completion.d.ts +22 -0
- package/ts_build/src/agents/tools/ycmd/tools/completion.js +72 -0
- package/ts_build/src/agents/tools/ycmd/tools/completion.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/diagnostics.d.ts +42 -0
- package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js +88 -0
- package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/getLocations.d.ts +22 -0
- package/ts_build/src/agents/tools/ycmd/tools/getLocations.js +142 -0
- package/ts_build/src/agents/tools/ycmd/tools/getLocations.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/goto.d.ts +20 -0
- package/ts_build/src/agents/tools/ycmd/tools/goto.js +101 -0
- package/ts_build/src/agents/tools/ycmd/tools/goto.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/refactor.d.ts +32 -0
- package/ts_build/src/agents/tools/ycmd/tools/refactor.js +123 -0
- package/ts_build/src/agents/tools/ycmd/tools/refactor.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/signature.d.ts +25 -0
- package/ts_build/src/agents/tools/ycmd/tools/signature.js +110 -0
- package/ts_build/src/agents/tools/ycmd/tools/signature.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/start.d.ts +17 -0
- package/ts_build/src/agents/tools/ycmd/tools/start.js +65 -0
- package/ts_build/src/agents/tools/ycmd/tools/start.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/utils/pathUtils.d.ts +4 -0
- package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js +67 -0
- package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js.map +1 -0
- package/ts_build/src/ai.d.ts +1 -0
- package/ts_build/src/ai.js +40 -1
- package/ts_build/src/ai.js.map +1 -1
- package/ts_build/src/chat/ChatCommandHandler.d.ts +36 -0
- package/ts_build/src/chat/ChatCommandHandler.js +268 -0
- package/ts_build/src/chat/ChatCommandHandler.js.map +1 -0
- package/ts_build/src/chat/ChatInputManager.d.ts +22 -0
- package/ts_build/src/chat/ChatInputManager.js +85 -0
- package/ts_build/src/chat/ChatInputManager.js.map +1 -0
- package/ts_build/src/chat/ChatManager.d.ts +49 -0
- package/ts_build/src/chat/ChatManager.js +271 -0
- package/ts_build/src/chat/ChatManager.js.map +1 -0
- package/ts_build/src/chat/ChatSession.d.ts +32 -0
- package/ts_build/src/chat/ChatSession.js +3 -0
- package/ts_build/src/chat/ChatSession.js.map +1 -0
- package/ts_build/src/chat/ChatSessionManager.d.ts +19 -0
- package/ts_build/src/chat/ChatSessionManager.js +188 -0
- package/ts_build/src/chat/ChatSessionManager.js.map +1 -0
- package/ts_build/src/chat/ChatStateManager.d.ts +58 -0
- package/ts_build/src/chat/ChatStateManager.js +156 -0
- package/ts_build/src/chat/ChatStateManager.js.map +1 -0
- package/ts_build/src/chat/CliChatService.d.ts +35 -0
- package/ts_build/src/chat/CliChatService.js +201 -0
- package/ts_build/src/chat/CliChatService.js.map +1 -0
- package/ts_build/src/chat/InterruptibleInput.d.ts +20 -0
- package/ts_build/src/chat/InterruptibleInput.js +109 -0
- package/ts_build/src/chat/InterruptibleInput.js.map +1 -0
- package/ts_build/src/chat/interfaces/ChatModule.d.ts +6 -0
- package/ts_build/src/chat/interfaces/ChatModule.js +3 -0
- package/ts_build/src/chat/interfaces/ChatModule.js.map +1 -0
- package/ts_build/src/chat/modules/AgentModule.d.ts +56 -0
- package/ts_build/src/chat/modules/AgentModule.js +705 -0
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -0
- package/ts_build/src/chat/modules/AskModule.d.ts +10 -0
- package/ts_build/src/chat/modules/AskModule.js +63 -0
- package/ts_build/src/chat/modules/AskModule.js.map +1 -0
- package/ts_build/src/chat/modules/BaseChatModule.d.ts +14 -0
- package/ts_build/src/chat/modules/BaseChatModule.js +32 -0
- package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -0
- package/ts_build/src/chat/modules/InternalChatModule.d.ts +24 -0
- package/ts_build/src/chat/modules/InternalChatModule.js +127 -0
- package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -0
- package/ts_build/src/chat/modules/SearchModule.d.ts +12 -0
- package/ts_build/src/chat/modules/SearchModule.js +119 -0
- package/ts_build/src/chat/modules/SearchModule.js.map +1 -0
- package/ts_build/src/chat/modules/SetupModule.d.ts +15 -0
- package/ts_build/src/chat/modules/SetupModule.js +147 -0
- package/ts_build/src/chat/modules/SetupModule.js.map +1 -0
- package/ts_build/src/chat/modules/SystemModule.d.ts +14 -0
- package/ts_build/src/chat/modules/SystemModule.js +90 -0
- package/ts_build/src/chat/modules/SystemModule.js.map +1 -0
- package/ts_build/src/chat/modules/VoiceModule.d.ts +11 -0
- package/ts_build/src/chat/modules/VoiceModule.js +57 -0
- package/ts_build/src/chat/modules/VoiceModule.js.map +1 -0
- package/ts_build/src/chat/types.d.ts +83 -0
- package/ts_build/src/chat/types.js +3 -0
- package/ts_build/src/chat/types.js.map +1 -0
- package/ts_build/src/chat.js +7 -1
- package/ts_build/src/chat.js.map +1 -1
- package/ts_build/src/chat2.d.ts +3 -0
- package/ts_build/src/chat2.js +47 -0
- package/ts_build/src/chat2.js.map +1 -0
- package/ts_build/src/cli.js +218 -37
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/anthropic.d.ts +5 -2
- package/ts_build/src/clients/anthropic.js +12 -7
- package/ts_build/src/clients/anthropic.js.map +1 -1
- package/ts_build/src/clients/gemini.d.ts +6 -3
- package/ts_build/src/clients/gemini.js +13 -7
- package/ts_build/src/clients/gemini.js.map +1 -1
- package/ts_build/src/clients/http.d.ts +1 -0
- package/ts_build/src/clients/http.js +12 -5
- package/ts_build/src/clients/http.js.map +1 -1
- package/ts_build/src/clients/index.d.ts +10 -0
- package/ts_build/src/clients/index.js +74 -4
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/clients/knowhow.d.ts +3 -1
- package/ts_build/src/clients/knowhow.js +8 -2
- package/ts_build/src/clients/knowhow.js.map +1 -1
- package/ts_build/src/clients/knowhowMcp.d.ts +20 -0
- package/ts_build/src/clients/knowhowMcp.js +86 -0
- package/ts_build/src/clients/knowhowMcp.js.map +1 -0
- package/ts_build/src/clients/openai.d.ts +5 -2
- package/ts_build/src/clients/openai.js +29 -8
- package/ts_build/src/clients/openai.js.map +1 -1
- package/ts_build/src/clients/types.d.ts +1 -0
- package/ts_build/src/clients/xai.d.ts +5 -2
- package/ts_build/src/clients/xai.js +15 -5
- package/ts_build/src/clients/xai.js.map +1 -1
- package/ts_build/src/config.js +24 -3
- package/ts_build/src/config.js.map +1 -1
- package/ts_build/src/conversion.js +6 -4
- package/ts_build/src/conversion.js.map +1 -1
- package/ts_build/src/login.d.ts +1 -1
- package/ts_build/src/login.js +21 -7
- package/ts_build/src/login.js.map +1 -1
- package/ts_build/src/microphone.js.map +1 -1
- package/ts_build/src/plugins/downloader/downloader.d.ts +4 -5
- package/ts_build/src/plugins/downloader/downloader.js +55 -26
- package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
- package/ts_build/src/plugins/downloader/plugin.js +5 -3
- package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
- package/ts_build/src/plugins/plugins.js +3 -0
- package/ts_build/src/plugins/plugins.js.map +1 -1
- package/ts_build/src/processors/CustomVariables.d.ts +32 -0
- package/ts_build/src/processors/CustomVariables.js +297 -0
- package/ts_build/src/processors/CustomVariables.js.map +1 -0
- package/ts_build/src/processors/HarmonyToolProcessor.d.ts +15 -0
- package/ts_build/src/processors/HarmonyToolProcessor.js +154 -0
- package/ts_build/src/processors/HarmonyToolProcessor.js.map +1 -0
- package/ts_build/src/processors/XmlToolCallProcessor.d.ts +14 -0
- package/ts_build/src/processors/XmlToolCallProcessor.js +357 -0
- package/ts_build/src/processors/XmlToolCallProcessor.js.map +1 -0
- package/ts_build/src/processors/index.d.ts +3 -0
- package/ts_build/src/processors/index.js +7 -1
- package/ts_build/src/processors/index.js.map +1 -1
- package/ts_build/src/prompts/KnowhowConfigExamples.d.ts +2 -0
- package/ts_build/src/prompts/KnowhowConfigExamples.js +379 -0
- package/ts_build/src/prompts/KnowhowConfigExamples.js.map +1 -0
- package/ts_build/src/services/KnowhowClient.d.ts +22 -0
- package/ts_build/src/services/KnowhowClient.js +14 -2
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/Mcp.d.ts +1 -0
- package/ts_build/src/services/Mcp.js +20 -3
- package/ts_build/src/services/Mcp.js.map +1 -1
- package/ts_build/src/services/McpServer.d.ts +1 -1
- package/ts_build/src/services/McpServer.js +8 -4
- package/ts_build/src/services/McpServer.js.map +1 -1
- package/ts_build/src/services/McpWebsocketTransport.js +17 -7
- package/ts_build/src/services/McpWebsocketTransport.js.map +1 -1
- package/ts_build/src/services/MessageProcessor.d.ts +1 -1
- package/ts_build/src/services/MessageProcessor.js +4 -4
- package/ts_build/src/services/MessageProcessor.js.map +1 -1
- package/ts_build/src/services/index.d.ts +2 -0
- package/ts_build/src/services/index.js +4 -0
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +1 -0
- package/ts_build/src/services/script-execution/ScriptExecutor.js +23 -0
- package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
- package/ts_build/src/services/types.d.ts +2 -6
- package/ts_build/src/services/types.js +4 -4
- package/ts_build/src/services/types.js.map +1 -1
- package/ts_build/src/types.d.ts +11 -0
- package/ts_build/src/types.js +8 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/index.d.ts +2 -0
- package/ts_build/src/utils/index.js +102 -1
- package/ts_build/src/utils/index.js.map +1 -1
- package/ts_build/tests/XmlToolCallProcessor.test.d.ts +1 -0
- package/ts_build/tests/XmlToolCallProcessor.test.js +376 -0
- package/ts_build/tests/XmlToolCallProcessor.test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +114 -0
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +104 -0
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +74 -0
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/simple_test.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/simple_test.js +82 -0
- package/ts_build/tests/manual/ycmd/simple_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +14 -0
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js +20 -0
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_advanced_features.js +297 -0
- package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +3 -0
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +262 -0
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +186 -0
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +174 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +106 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +104 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +119 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_discover_commands.js +243 -0
- package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_endpoints.js +120 -0
- package/ts_build/tests/manual/ycmd/test_endpoints.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +221 -0
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_final_validation.js +160 -0
- package/ts_build/tests/manual/ycmd/test_final_validation.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +37 -0
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_server_manager.js +38 -0
- package/ts_build/tests/manual/ycmd/test_server_manager.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_simple_debug.js +99 -0
- package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +128 -0
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js +66 -0
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +105 -0
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_workspace_config.js +89 -0
- package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +130 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +83 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +149 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +15 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +58 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js +195 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +3 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +110 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +36 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +1 -0
- package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/working_simple_test.js +134 -0
- package/ts_build/tests/manual/ycmd/working_simple_test.js.map +1 -0
- package/tsconfig.json +3 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ask Chat Module - Handles basic AI question/answer functionality
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { BaseChatModule } from "./BaseChatModule";
|
|
6
|
+
import { ChatCommand, ChatMode, ChatContext } from "../types";
|
|
7
|
+
import { ChatInteraction } from "../../types";
|
|
8
|
+
import { Models } from "../../ai";
|
|
9
|
+
import { services } from "../../services/index";
|
|
10
|
+
import { Plugins } from "../../plugins/plugins";
|
|
11
|
+
import { Marked } from "../../utils/index";
|
|
12
|
+
import { formatChatInput } from "../../chat";
|
|
13
|
+
|
|
14
|
+
export class AskModule extends BaseChatModule {
|
|
15
|
+
name = "ask";
|
|
16
|
+
description = "Basic AI question/answer functionality";
|
|
17
|
+
|
|
18
|
+
getCommands(): ChatCommand[] {
|
|
19
|
+
return [
|
|
20
|
+
// AskModule provides chat functionality, commands are handled by SystemModule
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
getModes(): ChatMode[] {
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
name: "chat",
|
|
28
|
+
description: "Basic AI chat mode",
|
|
29
|
+
active: true,
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async handleInput(input: string, context: ChatContext): Promise<boolean> {
|
|
35
|
+
// AskModule is the default handler - it handles input when no other module does
|
|
36
|
+
// Skip if in agent mode (let AgentModule handle it)
|
|
37
|
+
if (context.mode === "agent") {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// This is the default handler for all non-command input
|
|
42
|
+
return await this.processAIQuery(input, context);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Process AI query with full chat functionality (like original chat.ts)
|
|
47
|
+
*/
|
|
48
|
+
public async processAIQuery(
|
|
49
|
+
input: string,
|
|
50
|
+
context: ChatContext
|
|
51
|
+
): Promise<boolean> {
|
|
52
|
+
try {
|
|
53
|
+
const { Clients } = services();
|
|
54
|
+
const provider = context.currentProvider || "openai";
|
|
55
|
+
const model = context.currentModel || Models.openai.GPT_4o;
|
|
56
|
+
|
|
57
|
+
// Format the input with plugin context and chat history like original chat.ts
|
|
58
|
+
const formattedPrompt = await formatChatInput(
|
|
59
|
+
input,
|
|
60
|
+
context.plugins || [],
|
|
61
|
+
context.chatHistory || []
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Get AI response using the same pattern as original chat.ts
|
|
65
|
+
const response = await Clients.createCompletion(provider, {
|
|
66
|
+
messages: [
|
|
67
|
+
{
|
|
68
|
+
role: "system",
|
|
69
|
+
content:
|
|
70
|
+
"Helpful Codebase assistant. Answer users questions using the embedding data that is provided with the user's question. You have limited access to the codebase based off of how similar the codebase is to the user's question. You may reference file paths by using the IDs present in the embedding data, but be sure to remove the chunk from the end of the filepaths.",
|
|
71
|
+
},
|
|
72
|
+
{ role: "user", content: formattedPrompt },
|
|
73
|
+
],
|
|
74
|
+
model,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const result =
|
|
78
|
+
response.choices[0].message.content || "No response from the AI";
|
|
79
|
+
|
|
80
|
+
// Create interaction with proper ChatInteraction structure (input/output)
|
|
81
|
+
const interaction: ChatInteraction = {
|
|
82
|
+
input,
|
|
83
|
+
output: result,
|
|
84
|
+
} as ChatInteraction;
|
|
85
|
+
|
|
86
|
+
context.chatHistory?.push(interaction);
|
|
87
|
+
|
|
88
|
+
// Display the result using Marked parser like in original chat.ts
|
|
89
|
+
console.log(Marked.parse(result));
|
|
90
|
+
|
|
91
|
+
return true;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
console.error("Error getting AI response:", error);
|
|
94
|
+
console.log("Failed to get AI response. Please try again.");
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Chat Module - Abstract base class for all chat modules
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
ChatModule,
|
|
7
|
+
ChatService,
|
|
8
|
+
ChatCommand,
|
|
9
|
+
ChatMode,
|
|
10
|
+
ChatContext,
|
|
11
|
+
} from "../types";
|
|
12
|
+
|
|
13
|
+
export abstract class BaseChatModule implements ChatModule {
|
|
14
|
+
public abstract name: string;
|
|
15
|
+
public abstract description: string;
|
|
16
|
+
public commands: ChatCommand[] = [];
|
|
17
|
+
public modes: ChatMode[] = [];
|
|
18
|
+
|
|
19
|
+
protected chatService!: ChatService;
|
|
20
|
+
|
|
21
|
+
async initialize(service: ChatService): Promise<void> {
|
|
22
|
+
this.chatService = service;
|
|
23
|
+
this.commands = this.getCommands();
|
|
24
|
+
this.modes = this.getModes();
|
|
25
|
+
|
|
26
|
+
// Register all commands with the ChatService
|
|
27
|
+
for (const command of this.commands) {
|
|
28
|
+
this.chatService.registerCommand(command);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Override this method to provide commands
|
|
34
|
+
*/
|
|
35
|
+
public getCommands(): ChatCommand[] {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Override this method to provide modes
|
|
41
|
+
*/
|
|
42
|
+
public getModes(): ChatMode[] {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Override this method to handle non-command input
|
|
48
|
+
*/
|
|
49
|
+
async handleInput(input: string, context: ChatContext): Promise<boolean> {
|
|
50
|
+
return false; // Default: don't handle input
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Override this method for cleanup
|
|
55
|
+
*/
|
|
56
|
+
async cleanup(): Promise<void> {
|
|
57
|
+
// Default: no cleanup needed
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Helper method to update context
|
|
62
|
+
*/
|
|
63
|
+
protected updateContext(updates: Partial<ChatContext>): void {
|
|
64
|
+
this.chatService.setContext(updates);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { ChatModule } from "../types";
|
|
2
|
+
import { CliChatService } from "../CliChatService";
|
|
3
|
+
import { AgentModule } from "./AgentModule";
|
|
4
|
+
import { ChatCommand, ChatMode, ChatContext } from "../types";
|
|
5
|
+
import { AskModule } from "./AskModule";
|
|
6
|
+
import { SearchModule } from "./SearchModule";
|
|
7
|
+
import { VoiceModule } from "./VoiceModule";
|
|
8
|
+
import { SystemModule } from "./SystemModule";
|
|
9
|
+
import { SetupModule } from "./SetupModule";
|
|
10
|
+
|
|
11
|
+
export class InternalChatModule implements ChatModule {
|
|
12
|
+
private chatService?: CliChatService;
|
|
13
|
+
name = "internal";
|
|
14
|
+
description = "Internal chat module aggregating all functionality";
|
|
15
|
+
commands: ChatCommand[] = [];
|
|
16
|
+
modes: ChatMode[] = [];
|
|
17
|
+
private agentModule = new AgentModule();
|
|
18
|
+
private askModule = new AskModule();
|
|
19
|
+
private searchModule = new SearchModule();
|
|
20
|
+
private voiceModule = new VoiceModule();
|
|
21
|
+
private systemModule = new SystemModule();
|
|
22
|
+
private setupModule = new SetupModule();
|
|
23
|
+
|
|
24
|
+
async initialize(chatService: CliChatService): Promise<void> {
|
|
25
|
+
this.chatService = chatService;
|
|
26
|
+
|
|
27
|
+
// Register this module first so it gets called for input handling
|
|
28
|
+
chatService.registerModule(this);
|
|
29
|
+
|
|
30
|
+
// Initialize all sub-modules
|
|
31
|
+
await this.agentModule.initialize(chatService);
|
|
32
|
+
await this.askModule.initialize(chatService);
|
|
33
|
+
await this.searchModule.initialize(chatService);
|
|
34
|
+
await this.voiceModule.initialize(chatService);
|
|
35
|
+
await this.systemModule.initialize(chatService);
|
|
36
|
+
await this.setupModule.initialize(chatService);
|
|
37
|
+
|
|
38
|
+
// Register our own commands (exit and multi) - not duplicated by BaseChatModule
|
|
39
|
+
chatService.registerCommand({
|
|
40
|
+
name: "exit",
|
|
41
|
+
description: "Exit the chat",
|
|
42
|
+
handler: this.handleExitCommand.bind(this),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
chatService.registerCommand({
|
|
46
|
+
name: "multi",
|
|
47
|
+
description: "Toggle multiline mode",
|
|
48
|
+
handler: this.handleMultiCommand.bind(this),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
for (const mode of this.getModes()) {
|
|
53
|
+
chatService.registerMode(mode);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
getCommands(): ChatCommand[] {
|
|
58
|
+
const commands: ChatCommand[] = [
|
|
59
|
+
...this.agentModule.getCommands(),
|
|
60
|
+
...this.askModule.getCommands(),
|
|
61
|
+
...this.searchModule.getCommands(),
|
|
62
|
+
...this.voiceModule.getCommands(),
|
|
63
|
+
...this.systemModule.getCommands(),
|
|
64
|
+
...this.setupModule.getCommands(),
|
|
65
|
+
{
|
|
66
|
+
name: "exit",
|
|
67
|
+
description: "Exit the chat",
|
|
68
|
+
handler: this.handleExitCommand.bind(this),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "multi",
|
|
72
|
+
description: "Toggle multiline mode",
|
|
73
|
+
handler: this.handleMultiCommand.bind(this),
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
return commands;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
getModes(): ChatMode[] {
|
|
80
|
+
return [
|
|
81
|
+
...this.agentModule.getModes(),
|
|
82
|
+
...this.askModule.getModes(),
|
|
83
|
+
...this.searchModule.getModes(),
|
|
84
|
+
...this.voiceModule.getModes(),
|
|
85
|
+
...this.systemModule.getModes(),
|
|
86
|
+
...this.setupModule.getModes(),
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async handleExitCommand(args: string[]): Promise<void> {
|
|
91
|
+
console.log("Goodbye!");
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async handleMultiCommand(args: string[]): Promise<void> {
|
|
96
|
+
const context = this.chatService?.getContext();
|
|
97
|
+
const newMultiMode = !context?.multilineMode;
|
|
98
|
+
this.chatService?.setContext({ multilineMode: newMultiMode });
|
|
99
|
+
console.log(`Multiline mode: ${newMultiMode ? "enabled" : "disabled"}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Check if input matches a known command without prefix and suggest using the prefix
|
|
104
|
+
*/
|
|
105
|
+
private checkForFuzzyCommand(input: string): boolean {
|
|
106
|
+
if (!this.chatService) return false;
|
|
107
|
+
|
|
108
|
+
const trimmedInput = input.toLowerCase().trim();
|
|
109
|
+
const availableCommands = this.chatService.getCommands();
|
|
110
|
+
|
|
111
|
+
// Check if the input matches any command name exactly (case-insensitive)
|
|
112
|
+
const matchingCommand = availableCommands.find(
|
|
113
|
+
(cmd) =>
|
|
114
|
+
cmd.name.toLowerCase() === trimmedInput ||
|
|
115
|
+
trimmedInput.startsWith(cmd.name.toLowerCase() + " ")
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
if (matchingCommand) {
|
|
119
|
+
console.log(
|
|
120
|
+
`Did you mean "/${matchingCommand.name}"? Commands must start with "/"`
|
|
121
|
+
);
|
|
122
|
+
console.log(
|
|
123
|
+
`Available commands: ${availableCommands
|
|
124
|
+
.map((cmd) => `/${cmd.name}`)
|
|
125
|
+
.join(", ")}`
|
|
126
|
+
);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async handleInput(input: string, context: ChatContext): Promise<boolean> {
|
|
134
|
+
// Check for fuzzy command matches first to prevent agent calls
|
|
135
|
+
// This prevents accidental agent calls when user types commands without "/"
|
|
136
|
+
if (this.checkForFuzzyCommand(input)) {
|
|
137
|
+
return true; // Command suggestion shown, input handled
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// If in agent mode, check if this looks like a command before calling agent
|
|
141
|
+
if (
|
|
142
|
+
context.agentMode &&
|
|
143
|
+
input
|
|
144
|
+
.toLowerCase()
|
|
145
|
+
.match(
|
|
146
|
+
/^(multi|agent|ask|search|voice|system|exit|setup|help|clear)(\s|$)/i
|
|
147
|
+
)
|
|
148
|
+
) {
|
|
149
|
+
return this.checkForFuzzyCommand(input); // Will show suggestion and return true
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Try agent module first (handles agent mode)
|
|
153
|
+
if (await this.agentModule.handleInput(input, context)) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Try search module
|
|
158
|
+
if (await this.searchModule.handleInput(input, context)) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Try voice module
|
|
163
|
+
if (await this.voiceModule.handleInput(input, context)) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Default to ask module (handles all non-command input when not in agent mode)
|
|
168
|
+
return await this.askModule.handleInput(input, context);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async cleanup(): Promise<void> {
|
|
172
|
+
// No cleanup needed
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { BaseChatModule } from "./BaseChatModule";
|
|
2
|
+
import { ChatContext, ChatCommand } from "../types";
|
|
3
|
+
import { getConfiguredEmbeddingMap, queryEmbedding } from "../../embeddings";
|
|
4
|
+
import { getConfig } from "../../config";
|
|
5
|
+
import { ask } from "../../utils";
|
|
6
|
+
import { marked } from "marked";
|
|
7
|
+
|
|
8
|
+
export class SearchModule extends BaseChatModule {
|
|
9
|
+
name = "Search";
|
|
10
|
+
description = "Search through embeddings for relevant information";
|
|
11
|
+
|
|
12
|
+
getCommands(): ChatCommand[] {
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
name: "search",
|
|
16
|
+
description: "Search embeddings",
|
|
17
|
+
handler: this.handleSearchCommand.bind(this),
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async handleSearchCommand(args: string[]): Promise<void> {
|
|
23
|
+
await this.askEmbedding("searching");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async executeCommand(command: string, context: ChatContext): Promise<void> {
|
|
27
|
+
if (command === "search") {
|
|
28
|
+
await this.askEmbedding("searching");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async askEmbedding(promptText: string) {
|
|
33
|
+
const options = ["next", "exit", "embeddings", "use"];
|
|
34
|
+
console.log(`Commands: ${options.join(", ")}`);
|
|
35
|
+
let input = await ask(promptText + ": ", options);
|
|
36
|
+
let answer: any | undefined;
|
|
37
|
+
let results = new Array<any>();
|
|
38
|
+
let embedMap = await getConfiguredEmbeddingMap();
|
|
39
|
+
const config = await getConfig();
|
|
40
|
+
const files = Object.keys(embedMap);
|
|
41
|
+
|
|
42
|
+
while (input !== "exit") {
|
|
43
|
+
const embeddings = Object.values(embedMap).flat();
|
|
44
|
+
|
|
45
|
+
switch (input) {
|
|
46
|
+
case "next":
|
|
47
|
+
answer = results.shift();
|
|
48
|
+
break;
|
|
49
|
+
case "embeddings":
|
|
50
|
+
console.log(files);
|
|
51
|
+
break;
|
|
52
|
+
case "use":
|
|
53
|
+
const searchOptions = ["all", ...files];
|
|
54
|
+
console.log(searchOptions);
|
|
55
|
+
const embeddingName = await ask(
|
|
56
|
+
"Embedding to search: ",
|
|
57
|
+
searchOptions
|
|
58
|
+
);
|
|
59
|
+
if (embeddingName === "all") {
|
|
60
|
+
embedMap = await getConfiguredEmbeddingMap();
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
embedMap = { ...{ [embeddingName]: embedMap[embeddingName] } };
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
results = await queryEmbedding(
|
|
68
|
+
input,
|
|
69
|
+
embeddings,
|
|
70
|
+
config.embeddingModel
|
|
71
|
+
);
|
|
72
|
+
answer = results.shift();
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (answer) {
|
|
76
|
+
console.log(
|
|
77
|
+
marked.parse(
|
|
78
|
+
"### TEXT \n" +
|
|
79
|
+
answer.text +
|
|
80
|
+
"\n### METADATA \n" +
|
|
81
|
+
JSON.stringify(answer.metadata, null, 2)
|
|
82
|
+
)
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
input = await ask(promptText + ": ");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Search embeddings for CLI usage
|
|
92
|
+
*/
|
|
93
|
+
public async searchEmbeddingsCLI(
|
|
94
|
+
query: string,
|
|
95
|
+
embeddingPath?: string
|
|
96
|
+
): Promise<void> {
|
|
97
|
+
try {
|
|
98
|
+
const config = await getConfig();
|
|
99
|
+
let embedMap = await getConfiguredEmbeddingMap();
|
|
100
|
+
|
|
101
|
+
console.log(`🔍 Searching embeddings for: "${query}"`);
|
|
102
|
+
console.log(`📂 Embedding scope: ${embeddingPath || "all"}`);
|
|
103
|
+
console.log("─".repeat(50));
|
|
104
|
+
|
|
105
|
+
// If specific embedding path is requested, filter to that one
|
|
106
|
+
if (embeddingPath && embeddingPath !== "all") {
|
|
107
|
+
if (embedMap[embeddingPath]) {
|
|
108
|
+
embedMap = { [embeddingPath]: embedMap[embeddingPath] };
|
|
109
|
+
} else {
|
|
110
|
+
console.log("No results found.");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const embeddings = Object.values(embedMap).flat();
|
|
116
|
+
|
|
117
|
+
const results = await queryEmbedding(
|
|
118
|
+
query,
|
|
119
|
+
embeddings,
|
|
120
|
+
config.embeddingModel
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
if (results && results.length > 0) {
|
|
124
|
+
results.slice(0, 5).forEach((result, index) => {
|
|
125
|
+
const metadata = result.metadata as any;
|
|
126
|
+
console.log(`\n${index + 1}. ${result.id}`);
|
|
127
|
+
console.log(
|
|
128
|
+
` Metadata: ${JSON.stringify(
|
|
129
|
+
result.metadata || {},
|
|
130
|
+
null,
|
|
131
|
+
2
|
|
132
|
+
).slice(0, 100)}`
|
|
133
|
+
);
|
|
134
|
+
console.log(
|
|
135
|
+
`Content: \n${result.text?.substring(0, 500)}${
|
|
136
|
+
result.text?.length > 500 ? "..." : ""
|
|
137
|
+
}`
|
|
138
|
+
);
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
console.log("No results found.");
|
|
142
|
+
}
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error("Error searching embeddings:", error);
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Show embedding selection menu
|
|
151
|
+
*/
|
|
152
|
+
private async showEmbeddingSelectionMenu(): Promise<string[]> {
|
|
153
|
+
const embedMap = await getConfiguredEmbeddingMap();
|
|
154
|
+
const files = Object.keys(embedMap);
|
|
155
|
+
const searchOptions = ["all", ...files];
|
|
156
|
+
|
|
157
|
+
console.log("Available embeddings:");
|
|
158
|
+
searchOptions.forEach((option, index) => {
|
|
159
|
+
console.log(` ${index + 1}. ${option}`);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
const embeddingName = await ask("Embedding to search: ", searchOptions);
|
|
163
|
+
|
|
164
|
+
return embeddingName === "all" ? files : [embeddingName];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { services } from "../../services";
|
|
2
|
+
import { login } from "../../login";
|
|
3
|
+
import { ask } from "../../utils";
|
|
4
|
+
import { CliChatService } from "../CliChatService";
|
|
5
|
+
import { ChatCommand, ChatMode } from "../types";
|
|
6
|
+
import { AgentModule } from "./AgentModule";
|
|
7
|
+
import { BaseChatModule } from "./BaseChatModule";
|
|
8
|
+
|
|
9
|
+
export class SetupModule extends BaseChatModule {
|
|
10
|
+
name = "setup";
|
|
11
|
+
description = "Setup commands";
|
|
12
|
+
private agentModule?: AgentModule;
|
|
13
|
+
|
|
14
|
+
getCommands(): ChatCommand[] {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
name: "setup",
|
|
18
|
+
description: "Check environment setup and run Setup agent",
|
|
19
|
+
handler: this.handleSetupCommand.bind(this),
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
getModes(): ChatMode[] {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async initialize(chatService: CliChatService): Promise<void> {
|
|
29
|
+
await super.initialize(chatService);
|
|
30
|
+
// We'll need access to AgentModule for launching Setup agent
|
|
31
|
+
this.agentModule = new AgentModule();
|
|
32
|
+
await this.agentModule.initialize(chatService);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Check environment variables and show setup status
|
|
37
|
+
*/
|
|
38
|
+
private async checkEnvironmentSetup(): Promise<{
|
|
39
|
+
available: string[];
|
|
40
|
+
missing: string[];
|
|
41
|
+
setupNeeded: boolean;
|
|
42
|
+
}> {
|
|
43
|
+
const envCheck = (varName: string): boolean => {
|
|
44
|
+
return !!process.env[varName];
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const envChecks = [
|
|
48
|
+
{
|
|
49
|
+
name: "OpenAI",
|
|
50
|
+
vars: ["OPENAI_KEY"],
|
|
51
|
+
feature: "OpenAI models (GPT-4o, etc.)",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "Anthropic",
|
|
55
|
+
vars: ["ANTHROPIC_API_KEY"],
|
|
56
|
+
feature: "Claude models",
|
|
57
|
+
},
|
|
58
|
+
{ name: "Google", vars: ["GEMINI_API_KEY"], feature: "Gemini models" },
|
|
59
|
+
{ name: "XAI", vars: ["XAI_API_KEY"], feature: "Grok models" },
|
|
60
|
+
{
|
|
61
|
+
name: "GitHub",
|
|
62
|
+
vars: ["GITHUB_TOKEN"],
|
|
63
|
+
feature: "GitHub integration (PRs, issues, repos)",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "Linear",
|
|
67
|
+
vars: ["LINEAR_API_KEY"],
|
|
68
|
+
feature: "Linear integration",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "Asana",
|
|
72
|
+
vars: ["ASANA_ACCESS_TOKEN"],
|
|
73
|
+
feature: "Asana integration",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "Jira",
|
|
77
|
+
vars: ["JIRA_HOST", "JIRA_USER", "JIRA_PASSWORD"],
|
|
78
|
+
feature: "Jira integration",
|
|
79
|
+
},
|
|
80
|
+
{ name: "Notion", vars: ["NOTION_TOKEN"], feature: "Notion integration" },
|
|
81
|
+
{
|
|
82
|
+
name: "Google Search",
|
|
83
|
+
vars: ["GOOGLE_SEARCH_API_KEY"],
|
|
84
|
+
feature: "Google Search",
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
const available: string[] = [];
|
|
89
|
+
const missing: string[] = [];
|
|
90
|
+
|
|
91
|
+
for (const check of envChecks) {
|
|
92
|
+
const missingEnv = check.vars.filter((varName) => !process.env[varName]);
|
|
93
|
+
if (!missingEnv.length) {
|
|
94
|
+
available.push(`✅ ${check.name}: ${check.feature}`);
|
|
95
|
+
} else {
|
|
96
|
+
missing.push(
|
|
97
|
+
`❌ ${check.name}: ${check.feature} (missing: ${missingEnv.join(
|
|
98
|
+
" and "
|
|
99
|
+
)})`
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const canLogin = await this.checkKnowhowLogin();
|
|
105
|
+
if (canLogin) {
|
|
106
|
+
available.push("✅ Knowhow: Logged in successfully");
|
|
107
|
+
} else {
|
|
108
|
+
missing.push("❌ Knowhow: Not logged in");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const models = await this.canGetKnowhowModels();
|
|
112
|
+
if (models && models.length > 0) {
|
|
113
|
+
available.push(
|
|
114
|
+
`✅ Knowhow: ${models.length} Models available: ${models
|
|
115
|
+
.slice(0, 3)
|
|
116
|
+
.join(", ")}...`
|
|
117
|
+
);
|
|
118
|
+
} else {
|
|
119
|
+
missing.push("❌ Knowhow: No models available");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return { available, missing, setupNeeded: missing.length > 0 };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async checkKnowhowLogin(): Promise<boolean> {
|
|
126
|
+
try {
|
|
127
|
+
const canLogin = await login();
|
|
128
|
+
return true;
|
|
129
|
+
} catch (error) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async canGetKnowhowModels() {
|
|
135
|
+
const { Clients } = services();
|
|
136
|
+
const models = await Clients.loadProviderModels("knowhow");
|
|
137
|
+
return Clients.getRegisteredModels("knowhow");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async handleSetupCommand(args: string[]): Promise<void> {
|
|
141
|
+
console.log("\n🔧 Knowhow Environment Setup Status\n");
|
|
142
|
+
|
|
143
|
+
const { available, missing, setupNeeded } =
|
|
144
|
+
await this.checkEnvironmentSetup();
|
|
145
|
+
|
|
146
|
+
console.log("📋 Available Features:");
|
|
147
|
+
available.forEach((item) => console.log(` ${item}`));
|
|
148
|
+
|
|
149
|
+
if (missing.length > 0) {
|
|
150
|
+
console.log("\n⚠️ Missing Features:");
|
|
151
|
+
missing.forEach((item) => console.log(` ${item}`));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (setupNeeded) {
|
|
155
|
+
console.log(
|
|
156
|
+
"\n💡 To enable missing features, set the required environment variables."
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const proceedSetup = await ask(
|
|
160
|
+
"\nWould you like me to help you set up your configuration? (y/n): ",
|
|
161
|
+
["y", "n"]
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
if (
|
|
165
|
+
proceedSetup.toLowerCase() === "y" ||
|
|
166
|
+
proceedSetup.toLowerCase() === "yes"
|
|
167
|
+
) {
|
|
168
|
+
// Launch Setup agent to guide user through configuration
|
|
169
|
+
if (this.agentModule) {
|
|
170
|
+
const { taskId, agent } = await this.agentModule.setupAgent({
|
|
171
|
+
agentName: "Setup",
|
|
172
|
+
run: true,
|
|
173
|
+
input:
|
|
174
|
+
"Help me set up my Knowhow configuration with the missing features and optimize my setup.",
|
|
175
|
+
});
|
|
176
|
+
await this.agentModule.attachedAgentChatLoop(taskId, agent);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
console.log(
|
|
181
|
+
"\n🎉 Great! All major features are available. Your setup looks good!"
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|