@tyvm/knowhow 0.0.1
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/.vscode/launch.json +14 -0
- package/CONFIG.md +336 -0
- package/README.md +49 -0
- package/autodoc/chat.mdx +20 -0
- package/autodoc/cli.mdx +11 -0
- package/autodoc/plugins/asana.mdx +47 -0
- package/autodoc/plugins/downloader/downloader.mdx +38 -0
- package/autodoc/plugins/downloader/plugin.mdx +37 -0
- package/autodoc/plugins/downloader/types.mdx +42 -0
- package/autodoc/plugins/embedding.mdx +41 -0
- package/autodoc/plugins/figma.mdx +45 -0
- package/autodoc/plugins/github.mdx +40 -0
- package/autodoc/plugins/jira.mdx +46 -0
- package/autodoc/plugins/language.mdx +37 -0
- package/autodoc/plugins/linear.mdx +35 -0
- package/autodoc/plugins/notion.mdx +38 -0
- package/autodoc/plugins/plugins.mdx +59 -0
- package/autodoc/plugins/types.mdx +51 -0
- package/autodoc/plugins/vim.mdx +39 -0
- package/autodoc/tools/addInternalTools.mdx +1 -0
- package/autodoc/tools/agentCall.mdx +1 -0
- package/autodoc/tools/asana/definitions.mdx +10 -0
- package/autodoc/tools/asana/index.mdx +12 -0
- package/autodoc/tools/askHuman.mdx +1 -0
- package/autodoc/tools/callPlugin.mdx +1 -0
- package/autodoc/tools/embeddingSearch.mdx +1 -0
- package/autodoc/tools/execCommand.mdx +1 -0
- package/autodoc/tools/fileSearch.mdx +1 -0
- package/autodoc/tools/finalAnswer.mdx +1 -0
- package/autodoc/tools/github/definitions.mdx +6 -0
- package/autodoc/tools/github/index.mdx +8 -0
- package/autodoc/tools/index.mdx +14 -0
- package/autodoc/tools/lintFile.mdx +7 -0
- package/autodoc/tools/list.mdx +16 -0
- package/autodoc/tools/modifyFile.mdx +7 -0
- package/autodoc/tools/patch.mdx +9 -0
- package/autodoc/tools/readBlocks.mdx +1 -0
- package/autodoc/tools/readFile.mdx +1 -0
- package/autodoc/tools/scanFile.mdx +1 -0
- package/autodoc/tools/textSearch.mdx +6 -0
- package/autodoc/tools/types/fileblock.mdx +1 -0
- package/autodoc/tools/visionTool.mdx +1 -0
- package/autodoc/tools/writeFile.mdx +1 -0
- package/jest.config.js +18 -0
- package/package.json +89 -0
- package/src/agents/base/base.ts +619 -0
- package/src/agents/base/prompt.ts +26 -0
- package/src/agents/configurable/ConfigAgent.ts +23 -0
- package/src/agents/developer/developer.ts +69 -0
- package/src/agents/index.ts +8 -0
- package/src/agents/interface.ts +11 -0
- package/src/agents/patcher/codebase.md +27 -0
- package/src/agents/patcher/patcher.ts +110 -0
- package/src/agents/researcher/researcher.ts +109 -0
- package/src/agents/tools/addInternalTools.ts +21 -0
- package/src/agents/tools/agentCall.ts +18 -0
- package/src/agents/tools/aiClient.ts +36 -0
- package/src/agents/tools/asana/definitions.ts +199 -0
- package/src/agents/tools/asana/index.ts +108 -0
- package/src/agents/tools/askHuman.ts +8 -0
- package/src/agents/tools/callPlugin.ts +4 -0
- package/src/agents/tools/embeddingSearch.ts +5 -0
- package/src/agents/tools/execCommand.ts +26 -0
- package/src/agents/tools/fileSearch.ts +33 -0
- package/src/agents/tools/finalAnswer.ts +4 -0
- package/src/agents/tools/github/definitions.ts +89 -0
- package/src/agents/tools/github/index.ts +67 -0
- package/src/agents/tools/googleSearch.ts +242 -0
- package/src/agents/tools/index.ts +24 -0
- package/src/agents/tools/language/definitions.ts +97 -0
- package/src/agents/tools/language/index.ts +19 -0
- package/src/agents/tools/lintFile.ts +17 -0
- package/src/agents/tools/list.ts +514 -0
- package/src/agents/tools/loadWebpage.ts +129 -0
- package/src/agents/tools/modifyFile.ts +53 -0
- package/src/agents/tools/patch.ts +672 -0
- package/src/agents/tools/readBlocks.ts +41 -0
- package/src/agents/tools/readFile.ts +39 -0
- package/src/agents/tools/scanFile.ts +16 -0
- package/src/agents/tools/textSearch.ts +21 -0
- package/src/agents/tools/types/fileblock.ts +5 -0
- package/src/agents/tools/visionTool.ts +5 -0
- package/src/agents/tools/writeFile.ts +46 -0
- package/src/agents/vim/vim.ts +153 -0
- package/src/ai.ts +167 -0
- package/src/chat.ts +412 -0
- package/src/cli.ts +85 -0
- package/src/clients/anthropic.ts +399 -0
- package/src/clients/gemini.ts +486 -0
- package/src/clients/http.ts +107 -0
- package/src/clients/index.ts +183 -0
- package/src/clients/knowhow.ts +33 -0
- package/src/clients/openai.ts +253 -0
- package/src/clients/types.ts +91 -0
- package/src/clients/xai.ts +132 -0
- package/src/config.ts +211 -0
- package/src/conversion.ts +140 -0
- package/src/dataset/diffs/README.md +12 -0
- package/src/dataset/diffs/debug-errors.ts +29 -0
- package/src/dataset/diffs/debug.ts +64 -0
- package/src/dataset/diffs/generate.ts +71 -0
- package/src/dataset/diffs/jsonl.ts +54 -0
- package/src/dataset/diffs/test.ts +193 -0
- package/src/embeddings.ts +411 -0
- package/src/hashes.ts +67 -0
- package/src/index.ts +376 -0
- package/src/login.ts +78 -0
- package/src/microphone.ts +136 -0
- package/src/modules/index.ts +37 -0
- package/src/modules/types.ts +48 -0
- package/src/plugins/asana.ts +134 -0
- package/src/plugins/downloader/downloader.ts +204 -0
- package/src/plugins/downloader/plugin.ts +85 -0
- package/src/plugins/downloader/types.ts +85 -0
- package/src/plugins/embedding.ts +42 -0
- package/src/plugins/figma.ts +137 -0
- package/src/plugins/github.ts +153 -0
- package/src/plugins/jira.ts +104 -0
- package/src/plugins/language.ts +100 -0
- package/src/plugins/linear.ts +219 -0
- package/src/plugins/notion.ts +170 -0
- package/src/plugins/plugins.ts +56 -0
- package/src/plugins/types.ts +5 -0
- package/src/plugins/url.ts +63 -0
- package/src/plugins/vim.ts +73 -0
- package/src/prompts/BasicCodeDocumenter.ts +1 -0
- package/src/prompts/BasicProjectDocumenter.ts +1 -0
- package/src/prompts/EmbeddingSeachHelper.ts +1 -0
- package/src/prompts/index.ts +9 -0
- package/src/server/index.ts +14 -0
- package/src/services/AgentService.ts +98 -0
- package/src/services/EmbeddingService.ts +410 -0
- package/src/services/EventService.ts +20 -0
- package/src/services/GitHub.ts +60 -0
- package/src/services/KnowhowClient.ts +113 -0
- package/src/services/Mcp.ts +270 -0
- package/src/services/McpServer.ts +119 -0
- package/src/services/McpWebsocketTransport.ts +64 -0
- package/src/services/S3.ts +126 -0
- package/src/services/Tools.ts +65 -0
- package/src/services/flags.ts +52 -0
- package/src/services/index.ts +8 -0
- package/src/types.ts +225 -0
- package/src/utils/index.ts +108 -0
- package/src/worker.ts +80 -0
- package/tests/integration/figma.test.ts +70 -0
- package/tests/integration/fileblocks/readwrite.test.ts +95 -0
- package/tests/integration/patching/input.txt +145 -0
- package/tests/integration/patching/output.txt +145 -0
- package/tests/integration/patching/patch.txt +15 -0
- package/tests/integration/patching/unseen.txt +80 -0
- package/tests/integration/patching.test.ts +136 -0
- package/tests/languagePlugin.test.ts +74 -0
- package/tests/patching/corrupted.test.ts +78 -0
- package/tests/patching/imports.patch.txt +11 -0
- package/tests/patching/imports.test.ts +43 -0
- package/tests/patching/imports.txt +11 -0
- package/tests/patching/interface.patch.txt +15 -0
- package/tests/patching/interface.txt +7 -0
- package/tests/test.spec.ts +132 -0
- package/ts_build/src/agents/base/base.d.ts +88 -0
- package/ts_build/src/agents/base/base.js +464 -0
- package/ts_build/src/agents/base/base.js.map +1 -0
- package/ts_build/src/agents/base/prompt.d.ts +1 -0
- package/ts_build/src/agents/base/prompt.js +30 -0
- package/ts_build/src/agents/base/prompt.js.map +1 -0
- package/ts_build/src/agents/configurable/ConfigAgent.d.ts +10 -0
- package/ts_build/src/agents/configurable/ConfigAgent.js +25 -0
- package/ts_build/src/agents/configurable/ConfigAgent.js.map +1 -0
- package/ts_build/src/agents/configurable/OpenAIAgent.d.ts +0 -0
- package/ts_build/src/agents/configurable/OpenAIAgent.js +1 -0
- package/ts_build/src/agents/configurable/OpenAIAgent.js.map +1 -0
- package/ts_build/src/agents/developer/developer.d.ts +9 -0
- package/ts_build/src/agents/developer/developer.js +69 -0
- package/ts_build/src/agents/developer/developer.js.map +1 -0
- package/ts_build/src/agents/index.d.ts +7 -0
- package/ts_build/src/agents/index.js +38 -0
- package/ts_build/src/agents/index.js.map +1 -0
- package/ts_build/src/agents/interface.d.ts +10 -0
- package/ts_build/src/agents/interface.js +3 -0
- package/ts_build/src/agents/interface.js.map +1 -0
- package/ts_build/src/agents/patcher/patcher.d.ts +9 -0
- package/ts_build/src/agents/patcher/patcher.js +106 -0
- package/ts_build/src/agents/patcher/patcher.js.map +1 -0
- package/ts_build/src/agents/researcher/researcher.d.ts +9 -0
- package/ts_build/src/agents/researcher/researcher.js +107 -0
- package/ts_build/src/agents/researcher/researcher.js.map +1 -0
- package/ts_build/src/agents/tools/addInternalTools.d.ts +5 -0
- package/ts_build/src/agents/tools/addInternalTools.js +18 -0
- package/ts_build/src/agents/tools/addInternalTools.js.map +1 -0
- package/ts_build/src/agents/tools/agentCall.d.ts +1 -0
- package/ts_build/src/agents/tools/agentCall.js +21 -0
- package/ts_build/src/agents/tools/agentCall.js.map +1 -0
- package/ts_build/src/agents/tools/aiClient.d.ts +6 -0
- package/ts_build/src/agents/tools/aiClient.js +25 -0
- package/ts_build/src/agents/tools/aiClient.js.map +1 -0
- package/ts_build/src/agents/tools/asana/definitions.d.ts +202 -0
- package/ts_build/src/agents/tools/asana/definitions.js +197 -0
- package/ts_build/src/agents/tools/asana/definitions.js.map +1 -0
- package/ts_build/src/agents/tools/asana/index.d.ts +8 -0
- package/ts_build/src/agents/tools/asana/index.js +98 -0
- package/ts_build/src/agents/tools/asana/index.js.map +1 -0
- package/ts_build/src/agents/tools/askHuman.d.ts +1 -0
- package/ts_build/src/agents/tools/askHuman.js +15 -0
- package/ts_build/src/agents/tools/askHuman.js.map +1 -0
- package/ts_build/src/agents/tools/callPlugin.d.ts +1 -0
- package/ts_build/src/agents/tools/callPlugin.js +9 -0
- package/ts_build/src/agents/tools/callPlugin.js.map +1 -0
- package/ts_build/src/agents/tools/client.d.ts +5 -0
- package/ts_build/src/agents/tools/client.js +21 -0
- package/ts_build/src/agents/tools/client.js.map +1 -0
- package/ts_build/src/agents/tools/embeddingSearch.d.ts +1 -0
- package/ts_build/src/agents/tools/embeddingSearch.js +9 -0
- package/ts_build/src/agents/tools/embeddingSearch.js.map +1 -0
- package/ts_build/src/agents/tools/execCommand.d.ts +1 -0
- package/ts_build/src/agents/tools/execCommand.js +25 -0
- package/ts_build/src/agents/tools/execCommand.js.map +1 -0
- package/ts_build/src/agents/tools/fileSearch.d.ts +1 -0
- package/ts_build/src/agents/tools/fileSearch.js +31 -0
- package/ts_build/src/agents/tools/fileSearch.js.map +1 -0
- package/ts_build/src/agents/tools/finalAnswer.d.ts +1 -0
- package/ts_build/src/agents/tools/finalAnswer.js +8 -0
- package/ts_build/src/agents/tools/finalAnswer.js.map +1 -0
- package/ts_build/src/agents/tools/github/definitions.d.ts +47 -0
- package/ts_build/src/agents/tools/github/definitions.js +86 -0
- package/ts_build/src/agents/tools/github/definitions.js.map +1 -0
- package/ts_build/src/agents/tools/github/index.d.ts +789 -0
- package/ts_build/src/agents/tools/github/index.js +56 -0
- package/ts_build/src/agents/tools/github/index.js.map +1 -0
- package/ts_build/src/agents/tools/googleSearch.d.ts +93 -0
- package/ts_build/src/agents/tools/googleSearch.js +117 -0
- package/ts_build/src/agents/tools/googleSearch.js.map +1 -0
- package/ts_build/src/agents/tools/googleSearchTypes.d.ts +74 -0
- package/ts_build/src/agents/tools/googleSearchTypes.js +3 -0
- package/ts_build/src/agents/tools/googleSearchTypes.js.map +1 -0
- package/ts_build/src/agents/tools/index.d.ts +24 -0
- package/ts_build/src/agents/tools/index.js +41 -0
- package/ts_build/src/agents/tools/index.js.map +1 -0
- package/ts_build/src/agents/tools/language/definitions.d.ts +89 -0
- package/ts_build/src/agents/tools/language/definitions.js +95 -0
- package/ts_build/src/agents/tools/language/definitions.js.map +1 -0
- package/ts_build/src/agents/tools/language/index.d.ts +4 -0
- package/ts_build/src/agents/tools/language/index.js +22 -0
- package/ts_build/src/agents/tools/language/index.js.map +1 -0
- package/ts_build/src/agents/tools/lintFile.d.ts +1 -0
- package/ts_build/src/agents/tools/lintFile.js +22 -0
- package/ts_build/src/agents/tools/lintFile.js.map +1 -0
- package/ts_build/src/agents/tools/list.d.ts +2 -0
- package/ts_build/src/agents/tools/list.js +505 -0
- package/ts_build/src/agents/tools/list.js.map +1 -0
- package/ts_build/src/agents/tools/loadWebpage.d.ts +8 -0
- package/ts_build/src/agents/tools/loadWebpage.js +97 -0
- package/ts_build/src/agents/tools/loadWebpage.js.map +1 -0
- package/ts_build/src/agents/tools/modifyFile.d.ts +2 -0
- package/ts_build/src/agents/tools/modifyFile.js +74 -0
- package/ts_build/src/agents/tools/modifyFile.js.map +1 -0
- package/ts_build/src/agents/tools/patch.d.ts +21 -0
- package/ts_build/src/agents/tools/patch.js +443 -0
- package/ts_build/src/agents/tools/patch.js.map +1 -0
- package/ts_build/src/agents/tools/readBlocks.d.ts +2 -0
- package/ts_build/src/agents/tools/readBlocks.js +59 -0
- package/ts_build/src/agents/tools/readBlocks.js.map +1 -0
- package/ts_build/src/agents/tools/readFile.d.ts +1 -0
- package/ts_build/src/agents/tools/readFile.js +46 -0
- package/ts_build/src/agents/tools/readFile.js.map +1 -0
- package/ts_build/src/agents/tools/scanFile.d.ts +1 -0
- package/ts_build/src/agents/tools/scanFile.js +36 -0
- package/ts_build/src/agents/tools/scanFile.js.map +1 -0
- package/ts_build/src/agents/tools/textSearch.d.ts +1 -0
- package/ts_build/src/agents/tools/textSearch.js +22 -0
- package/ts_build/src/agents/tools/textSearch.js.map +1 -0
- package/ts_build/src/agents/tools/types/fileblock.d.ts +5 -0
- package/ts_build/src/agents/tools/types/fileblock.js +3 -0
- package/ts_build/src/agents/tools/types/fileblock.js.map +1 -0
- package/ts_build/src/agents/tools/visionTool.d.ts +1 -0
- package/ts_build/src/agents/tools/visionTool.js +9 -0
- package/ts_build/src/agents/tools/visionTool.js.map +1 -0
- package/ts_build/src/agents/tools/writeFile.d.ts +2 -0
- package/ts_build/src/agents/tools/writeFile.js +61 -0
- package/ts_build/src/agents/tools/writeFile.js.map +1 -0
- package/ts_build/src/agents/vim/vim.d.ts +14 -0
- package/ts_build/src/agents/vim/vim.js +171 -0
- package/ts_build/src/agents/vim/vim.js.map +1 -0
- package/ts_build/src/ai.d.ts +10 -0
- package/ts_build/src/ai.js +102 -0
- package/ts_build/src/ai.js.map +1 -0
- package/ts_build/src/chat.d.ts +13 -0
- package/ts_build/src/chat.js +319 -0
- package/ts_build/src/chat.js.map +1 -0
- package/ts_build/src/cli.d.ts +2 -0
- package/ts_build/src/cli.js +98 -0
- package/ts_build/src/cli.js.map +1 -0
- package/ts_build/src/clients/anthropic.d.ts +31 -0
- package/ts_build/src/clients/anthropic.js +344 -0
- package/ts_build/src/clients/anthropic.js.map +1 -0
- package/ts_build/src/clients/gemini.d.ts +20 -0
- package/ts_build/src/clients/gemini.js +347 -0
- package/ts_build/src/clients/gemini.js.map +1 -0
- package/ts_build/src/clients/http.d.ts +12 -0
- package/ts_build/src/clients/http.js +91 -0
- package/ts_build/src/clients/http.js.map +1 -0
- package/ts_build/src/clients/index.d.ts +47 -0
- package/ts_build/src/clients/index.js +143 -0
- package/ts_build/src/clients/index.js.map +1 -0
- package/ts_build/src/clients/knowhow.d.ts +10 -0
- package/ts_build/src/clients/knowhow.js +24 -0
- package/ts_build/src/clients/knowhow.js.map +1 -0
- package/ts_build/src/clients/openai.d.ts +20 -0
- package/ts_build/src/clients/openai.js +221 -0
- package/ts_build/src/clients/openai.js.map +1 -0
- package/ts_build/src/clients/types.d.ts +89 -0
- package/ts_build/src/clients/types.js +3 -0
- package/ts_build/src/clients/types.js.map +1 -0
- package/ts_build/src/clients/xai.d.ts +22 -0
- package/ts_build/src/clients/xai.js +108 -0
- package/ts_build/src/clients/xai.js.map +1 -0
- package/ts_build/src/config.d.ts +9 -0
- package/ts_build/src/config.js +216 -0
- package/ts_build/src/config.js.map +1 -0
- package/ts_build/src/conversion.d.ts +7 -0
- package/ts_build/src/conversion.js +114 -0
- package/ts_build/src/conversion.js.map +1 -0
- package/ts_build/src/dataset/diffs/debug-errors.d.ts +1 -0
- package/ts_build/src/dataset/diffs/debug-errors.js +28 -0
- package/ts_build/src/dataset/diffs/debug-errors.js.map +1 -0
- package/ts_build/src/dataset/diffs/debug.d.ts +1 -0
- package/ts_build/src/dataset/diffs/debug.js +50 -0
- package/ts_build/src/dataset/diffs/debug.js.map +1 -0
- package/ts_build/src/dataset/diffs/generate.d.ts +1 -0
- package/ts_build/src/dataset/diffs/generate.js +70 -0
- package/ts_build/src/dataset/diffs/generate.js.map +1 -0
- package/ts_build/src/dataset/diffs/jsonl.d.ts +1 -0
- package/ts_build/src/dataset/diffs/jsonl.js +47 -0
- package/ts_build/src/dataset/diffs/jsonl.js.map +1 -0
- package/ts_build/src/dataset/diffs/test.d.ts +1 -0
- package/ts_build/src/dataset/diffs/test.js +114 -0
- package/ts_build/src/dataset/diffs/test.js.map +1 -0
- package/ts_build/src/embeddings.d.ts +19 -0
- package/ts_build/src/embeddings.js +322 -0
- package/ts_build/src/embeddings.js.map +1 -0
- package/ts_build/src/hashes.d.ts +6 -0
- package/ts_build/src/hashes.js +78 -0
- package/ts_build/src/hashes.js.map +1 -0
- package/ts_build/src/index.d.ts +14 -0
- package/ts_build/src/index.js +258 -0
- package/ts_build/src/index.js.map +1 -0
- package/ts_build/src/login.d.ts +2 -0
- package/ts_build/src/login.js +63 -0
- package/ts_build/src/login.js.map +1 -0
- package/ts_build/src/microphone.d.ts +9 -0
- package/ts_build/src/microphone.js +131 -0
- package/ts_build/src/microphone.js.map +1 -0
- package/ts_build/src/modules/index.d.ts +3 -0
- package/ts_build/src/modules/index.js +34 -0
- package/ts_build/src/modules/index.js.map +1 -0
- package/ts_build/src/modules/types.d.ts +37 -0
- package/ts_build/src/modules/types.js +3 -0
- package/ts_build/src/modules/types.js.map +1 -0
- package/ts_build/src/plugins/asana.d.ts +16 -0
- package/ts_build/src/plugins/asana.js +114 -0
- package/ts_build/src/plugins/asana.js.map +1 -0
- package/ts_build/src/plugins/downloader/downloader.d.ts +12 -0
- package/ts_build/src/plugins/downloader/downloader.js +174 -0
- package/ts_build/src/plugins/downloader/downloader.js.map +1 -0
- package/ts_build/src/plugins/downloader/index.d.ts +3 -0
- package/ts_build/src/plugins/downloader/index.js +41 -0
- package/ts_build/src/plugins/downloader/index.js.map +1 -0
- package/ts_build/src/plugins/downloader/plugin.d.ts +8 -0
- package/ts_build/src/plugins/downloader/plugin.js +83 -0
- package/ts_build/src/plugins/downloader/plugin.js.map +1 -0
- package/ts_build/src/plugins/downloader/types.d.ts +82 -0
- package/ts_build/src/plugins/downloader/types.js +79 -0
- package/ts_build/src/plugins/downloader/types.js.map +1 -0
- package/ts_build/src/plugins/embedding.d.ts +5 -0
- package/ts_build/src/plugins/embedding.js +28 -0
- package/ts_build/src/plugins/embedding.js.map +1 -0
- package/ts_build/src/plugins/figma.d.ts +20 -0
- package/ts_build/src/plugins/figma.js +94 -0
- package/ts_build/src/plugins/figma.js.map +1 -0
- package/ts_build/src/plugins/github.d.ts +1223 -0
- package/ts_build/src/plugins/github.js +115 -0
- package/ts_build/src/plugins/github.js.map +1 -0
- package/ts_build/src/plugins/jira.d.ts +15 -0
- package/ts_build/src/plugins/jira.js +94 -0
- package/ts_build/src/plugins/jira.js.map +1 -0
- package/ts_build/src/plugins/language.d.ts +8 -0
- package/ts_build/src/plugins/language.js +69 -0
- package/ts_build/src/plugins/language.js.map +1 -0
- package/ts_build/src/plugins/linear.d.ts +23 -0
- package/ts_build/src/plugins/linear.js +184 -0
- package/ts_build/src/plugins/linear.js.map +1 -0
- package/ts_build/src/plugins/notion.d.ts +32 -0
- package/ts_build/src/plugins/notion.js +131 -0
- package/ts_build/src/plugins/notion.js.map +1 -0
- package/ts_build/src/plugins/plugins.d.ts +11 -0
- package/ts_build/src/plugins/plugins.js +51 -0
- package/ts_build/src/plugins/plugins.js.map +1 -0
- package/ts_build/src/plugins/types.d.ts +5 -0
- package/ts_build/src/plugins/types.js +3 -0
- package/ts_build/src/plugins/types.js.map +1 -0
- package/ts_build/src/plugins/url.d.ts +8 -0
- package/ts_build/src/plugins/url.js +50 -0
- package/ts_build/src/plugins/url.js.map +1 -0
- package/ts_build/src/plugins/vim.d.ts +11 -0
- package/ts_build/src/plugins/vim.js +63 -0
- package/ts_build/src/plugins/vim.js.map +1 -0
- package/ts_build/src/prompts/BasicCodeDocumenter.d.ts +2 -0
- package/ts_build/src/prompts/BasicCodeDocumenter.js +4 -0
- package/ts_build/src/prompts/BasicCodeDocumenter.js.map +1 -0
- package/ts_build/src/prompts/BasicProjectDocumenter.d.ts +2 -0
- package/ts_build/src/prompts/BasicProjectDocumenter.js +4 -0
- package/ts_build/src/prompts/BasicProjectDocumenter.js.map +1 -0
- package/ts_build/src/prompts/EmbeddingSeachHelper.d.ts +2 -0
- package/ts_build/src/prompts/EmbeddingSeachHelper.js +4 -0
- package/ts_build/src/prompts/EmbeddingSeachHelper.js.map +1 -0
- package/ts_build/src/prompts/index.d.ts +13 -0
- package/ts_build/src/prompts/index.js +15 -0
- package/ts_build/src/prompts/index.js.map +1 -0
- package/ts_build/src/server/index.d.ts +1 -0
- package/ts_build/src/server/index.js +17 -0
- package/ts_build/src/server/index.js.map +1 -0
- package/ts_build/src/services/AgentService.d.ts +14 -0
- package/ts_build/src/services/AgentService.js +87 -0
- package/ts_build/src/services/AgentService.js.map +1 -0
- package/ts_build/src/services/EmbeddingService.d.ts +39 -0
- package/ts_build/src/services/EmbeddingService.js +307 -0
- package/ts_build/src/services/EmbeddingService.js.map +1 -0
- package/ts_build/src/services/EventService.d.ts +9 -0
- package/ts_build/src/services/EventService.js +20 -0
- package/ts_build/src/services/EventService.js.map +1 -0
- package/ts_build/src/services/GitHub.d.ts +11 -0
- package/ts_build/src/services/GitHub.js +52 -0
- package/ts_build/src/services/GitHub.js.map +1 -0
- package/ts_build/src/services/KnowhowClient.d.ts +18 -0
- package/ts_build/src/services/KnowhowClient.js +85 -0
- package/ts_build/src/services/KnowhowClient.js.map +1 -0
- package/ts_build/src/services/Mcp.d.ts +377 -0
- package/ts_build/src/services/Mcp.js +221 -0
- package/ts_build/src/services/Mcp.js.map +1 -0
- package/ts_build/src/services/McpServer.d.ts +19 -0
- package/ts_build/src/services/McpServer.js +104 -0
- package/ts_build/src/services/McpServer.js.map +1 -0
- package/ts_build/src/services/McpWebsocketTransport.d.ts +13 -0
- package/ts_build/src/services/McpWebsocketTransport.js +59 -0
- package/ts_build/src/services/McpWebsocketTransport.js.map +1 -0
- package/ts_build/src/services/S3.d.ts +9 -0
- package/ts_build/src/services/S3.js +116 -0
- package/ts_build/src/services/S3.js.map +1 -0
- package/ts_build/src/services/Tools.d.ts +19 -0
- package/ts_build/src/services/Tools.js +51 -0
- package/ts_build/src/services/Tools.js.map +1 -0
- package/ts_build/src/services/flags.d.ts +13 -0
- package/ts_build/src/services/flags.js +48 -0
- package/ts_build/src/services/flags.js.map +1 -0
- package/ts_build/src/services/index.d.ts +8 -0
- package/ts_build/src/services/index.js +38 -0
- package/ts_build/src/services/index.js.map +1 -0
- package/ts_build/src/terminal.d.ts +1 -0
- package/ts_build/src/terminal.js +35 -0
- package/ts_build/src/terminal.js.map +1 -0
- package/ts_build/src/types.d.ts +181 -0
- package/ts_build/src/types.js +94 -0
- package/ts_build/src/types.js.map +1 -0
- package/ts_build/src/utils/index.d.ts +24 -0
- package/ts_build/src/utils/index.js +116 -0
- package/ts_build/src/utils/index.js.map +1 -0
- package/ts_build/src/worker.d.ts +1 -0
- package/ts_build/src/worker.js +68 -0
- package/ts_build/src/worker.js.map +1 -0
- package/ts_build/tests/integration/figma.test.d.ts +1 -0
- package/ts_build/tests/integration/figma.test.js +47 -0
- package/ts_build/tests/integration/figma.test.js.map +1 -0
- package/ts_build/tests/integration/fileblocks/readwrite.test.d.ts +1 -0
- package/ts_build/tests/integration/fileblocks/readwrite.test.js +95 -0
- package/ts_build/tests/integration/fileblocks/readwrite.test.js.map +1 -0
- package/ts_build/tests/integration/patching.test.d.ts +1 -0
- package/ts_build/tests/integration/patching.test.js +117 -0
- package/ts_build/tests/integration/patching.test.js.map +1 -0
- package/ts_build/tests/languagePlugin.test.d.ts +1 -0
- package/ts_build/tests/languagePlugin.test.js +78 -0
- package/ts_build/tests/languagePlugin.test.js.map +1 -0
- package/ts_build/tests/patching/corrupted.test.d.ts +1 -0
- package/ts_build/tests/patching/corrupted.test.js +53 -0
- package/ts_build/tests/patching/corrupted.test.js.map +1 -0
- package/ts_build/tests/patching/imports.test.d.ts +1 -0
- package/ts_build/tests/patching/imports.test.js +61 -0
- package/ts_build/tests/patching/imports.test.js.map +1 -0
- package/ts_build/tests/test.spec.d.ts +1 -0
- package/ts_build/tests/test.spec.js +101 -0
- package/ts_build/tests/test.spec.js.map +1 -0
- package/tsconfig.json +31 -0
- package/tslint.json +11 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { summarizeFiles, summarizeFile } from "./ai";
|
|
2
|
+
import {
|
|
3
|
+
saveAllFileHashes,
|
|
4
|
+
saveHashes,
|
|
5
|
+
getHashes,
|
|
6
|
+
checkNoFilesChanged,
|
|
7
|
+
} from "./hashes";
|
|
8
|
+
import axios from "axios";
|
|
9
|
+
import * as fs from "fs";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
import * as crypto from "crypto";
|
|
12
|
+
import { promisify } from "util";
|
|
13
|
+
import glob from "glob";
|
|
14
|
+
|
|
15
|
+
import { Prompts } from "./prompts";
|
|
16
|
+
import { Config, Hashes, Embeddable, GenerationSource } from "./types";
|
|
17
|
+
import { readFile, writeFile, fileExists } from "./utils";
|
|
18
|
+
import {
|
|
19
|
+
getConfig,
|
|
20
|
+
loadPrompt,
|
|
21
|
+
updateConfig,
|
|
22
|
+
getIgnorePattern,
|
|
23
|
+
} from "./config";
|
|
24
|
+
import {
|
|
25
|
+
embedJson,
|
|
26
|
+
embedKind,
|
|
27
|
+
getConfiguredEmbeddings,
|
|
28
|
+
pruneEmbedding,
|
|
29
|
+
loadEmbedding,
|
|
30
|
+
saveEmbedding,
|
|
31
|
+
embedSource,
|
|
32
|
+
getConfiguredEmbeddingMap,
|
|
33
|
+
} from "./embeddings";
|
|
34
|
+
|
|
35
|
+
import { abort } from "process";
|
|
36
|
+
import { chatLoop } from "./chat";
|
|
37
|
+
import { convertToText } from "./conversion";
|
|
38
|
+
import { Plugins } from "./plugins/plugins";
|
|
39
|
+
import { AwsS3 } from "./services/S3";
|
|
40
|
+
import { GitHub } from "./services/GitHub";
|
|
41
|
+
import { knowhowMcpClient } from "./services/Mcp";
|
|
42
|
+
import { knowhowApiClient } from "./services/KnowhowClient";
|
|
43
|
+
import { Models } from "./types";
|
|
44
|
+
|
|
45
|
+
export * as clients from "./clients";
|
|
46
|
+
export * as agents from "./agents";
|
|
47
|
+
export * as ai from "./ai";
|
|
48
|
+
export * as services from "./services";
|
|
49
|
+
export * as embeddings from "./embeddings";
|
|
50
|
+
export * as types from "./types";
|
|
51
|
+
|
|
52
|
+
const OPENAI_KEY = process.env.OPENAI_KEY;
|
|
53
|
+
|
|
54
|
+
export async function embed() {
|
|
55
|
+
// load config
|
|
56
|
+
const config = await getConfig();
|
|
57
|
+
const ignorePattern = await getIgnorePattern();
|
|
58
|
+
|
|
59
|
+
const defaultModel = config.embeddingModel || Models.openai.EmbeddingAda2;
|
|
60
|
+
for (const source of config.embedSources) {
|
|
61
|
+
await embedSource(defaultModel, source, ignorePattern);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function purge(globPath: string) {
|
|
66
|
+
const files = glob.sync(globPath);
|
|
67
|
+
const embeddings = await getConfiguredEmbeddingMap();
|
|
68
|
+
const config = await getConfig();
|
|
69
|
+
const chunkSizes = config.embedSources.reduce((acc, source) => {
|
|
70
|
+
acc[source.output] = source.chunkSize;
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
|
|
74
|
+
for (const file of Object.keys(embeddings)) {
|
|
75
|
+
let pruned = embeddings[file];
|
|
76
|
+
for (const filePath of files) {
|
|
77
|
+
const before = pruned.length;
|
|
78
|
+
pruned = pruned
|
|
79
|
+
.filter((e) => !filePath || !e.id.startsWith("./" + filePath))
|
|
80
|
+
.filter((e) => e.text.length <= chunkSizes[file]);
|
|
81
|
+
const after = pruned.length;
|
|
82
|
+
|
|
83
|
+
if (after < before) {
|
|
84
|
+
console.log("Purging", filePath);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await saveEmbedding(file, pruned);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function upload() {
|
|
92
|
+
const config = await getConfig();
|
|
93
|
+
|
|
94
|
+
for (const source of config.embedSources) {
|
|
95
|
+
const bucketName = source.remote;
|
|
96
|
+
|
|
97
|
+
if (!source.remoteType) {
|
|
98
|
+
console.log(
|
|
99
|
+
"Skipping",
|
|
100
|
+
source.output,
|
|
101
|
+
"because no remoteType is configured"
|
|
102
|
+
);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const items = JSON.parse(await readFile(source.output, "utf8"));
|
|
106
|
+
const { name: embeddingName } = path.parse(source.output);
|
|
107
|
+
const data = {
|
|
108
|
+
embeddingName,
|
|
109
|
+
items,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
if (source.remoteType === "s3") {
|
|
113
|
+
console.log(
|
|
114
|
+
"Uploading",
|
|
115
|
+
source.output,
|
|
116
|
+
"to",
|
|
117
|
+
`${bucketName}/${embeddingName}.json`
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const s3Key = `${embeddingName}.json`;
|
|
121
|
+
await AwsS3.uploadFile(source.output, bucketName, s3Key);
|
|
122
|
+
} else if (source.remoteType === "knowhow") {
|
|
123
|
+
if (!source.remoteId) {
|
|
124
|
+
throw new Error("remoteId is required for knowhow uploads");
|
|
125
|
+
}
|
|
126
|
+
const url = await knowhowApiClient.getPresignedUploadUrl(source);
|
|
127
|
+
console.log("Uploading to", url);
|
|
128
|
+
await AwsS3.uploadToPresignedUrl(url, source.output);
|
|
129
|
+
} else {
|
|
130
|
+
console.log(
|
|
131
|
+
"Skipping upload to",
|
|
132
|
+
source.remoteType,
|
|
133
|
+
"for",
|
|
134
|
+
source.remote
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export async function generate(): Promise<void> {
|
|
141
|
+
const config = await getConfig();
|
|
142
|
+
for (const source of config.sources) {
|
|
143
|
+
console.log("Generating", source.input, "to", source.output);
|
|
144
|
+
if (source.kind === "file" || !source.kind) {
|
|
145
|
+
const files = glob.sync(source.input);
|
|
146
|
+
const prompt = await loadPrompt(source.prompt);
|
|
147
|
+
|
|
148
|
+
if (source.output.endsWith("/")) {
|
|
149
|
+
await handleMultiOutputGeneration(
|
|
150
|
+
source.model,
|
|
151
|
+
source.input,
|
|
152
|
+
files,
|
|
153
|
+
prompt,
|
|
154
|
+
source.output,
|
|
155
|
+
source.outputExt,
|
|
156
|
+
source.outputName,
|
|
157
|
+
source.kind,
|
|
158
|
+
source.agent
|
|
159
|
+
);
|
|
160
|
+
} else {
|
|
161
|
+
await handleSingleOutputGeneration(
|
|
162
|
+
source.model,
|
|
163
|
+
files,
|
|
164
|
+
prompt,
|
|
165
|
+
source.output,
|
|
166
|
+
source.kind,
|
|
167
|
+
source.agent
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
await handleAllKindsGeneration(source);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async function handleAllKindsGeneration(source: GenerationSource) {
|
|
177
|
+
const { kind, input } = source;
|
|
178
|
+
if (Plugins.isPlugin(kind)) {
|
|
179
|
+
const data = await Plugins.call(kind, input);
|
|
180
|
+
if (source.output.endsWith("/")) {
|
|
181
|
+
throw new Error(`Plugin ${kind} can only output to a single file`);
|
|
182
|
+
}
|
|
183
|
+
await writeFile(source.output, data);
|
|
184
|
+
}
|
|
185
|
+
return handleFileKindGeneration(source);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function handleFileKindGeneration(source: GenerationSource) {
|
|
189
|
+
const prompt = await loadPrompt(source.prompt);
|
|
190
|
+
const files = glob.sync(source.input);
|
|
191
|
+
console.log("Analyzing files: ", files);
|
|
192
|
+
|
|
193
|
+
if (source.output.endsWith("/")) {
|
|
194
|
+
await handleMultiOutputGeneration(
|
|
195
|
+
source.model,
|
|
196
|
+
source.input,
|
|
197
|
+
files,
|
|
198
|
+
prompt,
|
|
199
|
+
source.output,
|
|
200
|
+
source.outputExt,
|
|
201
|
+
source.outputName,
|
|
202
|
+
source.kind,
|
|
203
|
+
source.agent
|
|
204
|
+
);
|
|
205
|
+
} else {
|
|
206
|
+
await handleSingleOutputGeneration(
|
|
207
|
+
source.model,
|
|
208
|
+
files,
|
|
209
|
+
prompt,
|
|
210
|
+
source.output,
|
|
211
|
+
source.kind,
|
|
212
|
+
source.agent
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export async function handleMultiOutputGeneration(
|
|
217
|
+
model: string,
|
|
218
|
+
inputPattern: string,
|
|
219
|
+
files: string[],
|
|
220
|
+
prompt: string,
|
|
221
|
+
output: string,
|
|
222
|
+
outputExt = "mdx",
|
|
223
|
+
outputName?: string,
|
|
224
|
+
kind?: string,
|
|
225
|
+
agent?: string
|
|
226
|
+
) {
|
|
227
|
+
// get the hash of the prompt
|
|
228
|
+
const promptHash = crypto.createHash("md5").update(prompt).digest("hex");
|
|
229
|
+
|
|
230
|
+
// get the files matching the input pattern
|
|
231
|
+
const hashes = await getHashes();
|
|
232
|
+
|
|
233
|
+
const inputPath = inputPattern.includes("**")
|
|
234
|
+
? inputPattern.split("**")[0]
|
|
235
|
+
: "";
|
|
236
|
+
|
|
237
|
+
for (const file of files) {
|
|
238
|
+
// get the hash of the file
|
|
239
|
+
const fileContent = await convertToText(file);
|
|
240
|
+
const fileHash = crypto.createHash("md5").update(fileContent).digest("hex");
|
|
241
|
+
|
|
242
|
+
if (!hashes[file]) {
|
|
243
|
+
hashes[file] = { promptHash: "", fileHash: "" };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// summarize the file
|
|
247
|
+
console.log("Summarizing", file);
|
|
248
|
+
const summary = prompt
|
|
249
|
+
? await summarizeFile(file, prompt, model, agent)
|
|
250
|
+
: fileContent;
|
|
251
|
+
|
|
252
|
+
// write the summary to the output file
|
|
253
|
+
const { name, ext, dir } = path.parse(file);
|
|
254
|
+
const nestedFolder = inputPath ? (dir + "/").replace(inputPath, "") : "";
|
|
255
|
+
const outputFolder = path.join(output, nestedFolder);
|
|
256
|
+
|
|
257
|
+
if (!fs.existsSync(outputFolder)) {
|
|
258
|
+
fs.mkdirSync(outputFolder, { recursive: true });
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const outputFileName = outputName || name;
|
|
262
|
+
const outputFile = path.join(outputFolder, outputFileName + "." + outputExt);
|
|
263
|
+
console.log({ dir, inputPath, nestedFolder, outputFile });
|
|
264
|
+
|
|
265
|
+
const toCheck = [file, outputFile];
|
|
266
|
+
const noChanges = await checkNoFilesChanged(toCheck, promptHash, hashes);
|
|
267
|
+
if (noChanges) {
|
|
268
|
+
console.log("Skipping file", file, "because it hasn't changed");
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
console.log("Writing summary to", outputFile);
|
|
273
|
+
await writeFile(outputFile, summary);
|
|
274
|
+
|
|
275
|
+
await saveAllFileHashes(toCheck, promptHash);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export async function handleSingleOutputGeneration(
|
|
280
|
+
model: string,
|
|
281
|
+
files: string[],
|
|
282
|
+
prompt: string,
|
|
283
|
+
outputFile: string,
|
|
284
|
+
kind?: string,
|
|
285
|
+
agent?: string
|
|
286
|
+
) {
|
|
287
|
+
const hashes = await getHashes();
|
|
288
|
+
const promptHash = crypto.createHash("md5").update(prompt).digest("hex");
|
|
289
|
+
|
|
290
|
+
const filesToCheck = [outputFile, ...files];
|
|
291
|
+
const noChanges = await checkNoFilesChanged(filesToCheck, promptHash, hashes);
|
|
292
|
+
if (noChanges) {
|
|
293
|
+
console.log(`Skipping ${files.length} files because they haven't changed`);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
console.log("Summarizing", files.length, "files");
|
|
298
|
+
const summary = prompt
|
|
299
|
+
? await summarizeFiles(files, prompt, model, agent)
|
|
300
|
+
: (await Promise.all(files.map(convertToText))).join("\n\n");
|
|
301
|
+
|
|
302
|
+
const fileHash = crypto.createHash("md5").update(summary).digest("hex");
|
|
303
|
+
|
|
304
|
+
console.log("Writing summary to", outputFile);
|
|
305
|
+
await writeFile(outputFile, summary);
|
|
306
|
+
|
|
307
|
+
await saveAllFileHashes(filesToCheck, promptHash);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export async function chat() {
|
|
311
|
+
const config = await getConfig();
|
|
312
|
+
const embeddings = await getConfiguredEmbeddings();
|
|
313
|
+
await chatLoop("knowhow", embeddings, config.plugins);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export async function download() {
|
|
317
|
+
const config = await getConfig();
|
|
318
|
+
|
|
319
|
+
for (const source of config.embedSources) {
|
|
320
|
+
const { remote, remoteType } = source;
|
|
321
|
+
|
|
322
|
+
if (!remoteType) {
|
|
323
|
+
console.log(
|
|
324
|
+
"Skipping",
|
|
325
|
+
source.output,
|
|
326
|
+
"because no remoteType is configured"
|
|
327
|
+
);
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const { name } = path.parse(source.output);
|
|
332
|
+
const fileName = `${name}.json`;
|
|
333
|
+
const destinationPath = source.output;
|
|
334
|
+
|
|
335
|
+
if (remoteType === "s3") {
|
|
336
|
+
const bucketName = remote;
|
|
337
|
+
console.log(
|
|
338
|
+
"Downloading",
|
|
339
|
+
fileName,
|
|
340
|
+
`from ${remoteType}`,
|
|
341
|
+
bucketName,
|
|
342
|
+
"to",
|
|
343
|
+
destinationPath
|
|
344
|
+
);
|
|
345
|
+
await AwsS3.downloadFile(bucketName, fileName, destinationPath);
|
|
346
|
+
} else if (remoteType === "github") {
|
|
347
|
+
console.log(
|
|
348
|
+
"Downloading",
|
|
349
|
+
fileName,
|
|
350
|
+
"from GitHub repo",
|
|
351
|
+
remote,
|
|
352
|
+
"to",
|
|
353
|
+
destinationPath
|
|
354
|
+
);
|
|
355
|
+
const embeddingPath = ".knowhow/embeddings/" + fileName;
|
|
356
|
+
await GitHub.downloadFile(remote, embeddingPath, destinationPath);
|
|
357
|
+
} else if (remoteType === "knowhow") {
|
|
358
|
+
if (!source.remoteId) {
|
|
359
|
+
throw new Error("remoteId is required for knowhow downloads");
|
|
360
|
+
}
|
|
361
|
+
console.log(
|
|
362
|
+
"Downloading",
|
|
363
|
+
fileName,
|
|
364
|
+
"from Knowhow",
|
|
365
|
+
"to",
|
|
366
|
+
destinationPath
|
|
367
|
+
);
|
|
368
|
+
const preSignedUrl = await knowhowApiClient.getPresignedDownloadUrl(
|
|
369
|
+
source
|
|
370
|
+
);
|
|
371
|
+
await AwsS3.downloadFromPresignedUrl(preSignedUrl, destinationPath);
|
|
372
|
+
} else {
|
|
373
|
+
console.log("Unsupported remote type for", source.output);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
package/src/login.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { chmod } from "fs/promises";
|
|
5
|
+
import { ask } from "./utils";
|
|
6
|
+
|
|
7
|
+
const API_URL = process.env.KNOWHOW_API_URL;
|
|
8
|
+
|
|
9
|
+
export async function login(): Promise<void> {
|
|
10
|
+
if (!API_URL) {
|
|
11
|
+
throw new Error("Error: KNOWHOW_API_URL environment variable not set.");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const [flag] = process.argv.slice(3);
|
|
15
|
+
|
|
16
|
+
if (flag === "--jwt") {
|
|
17
|
+
const jwt = await ask("Enter your JWT: ");
|
|
18
|
+
|
|
19
|
+
// Update the JWT file
|
|
20
|
+
const configDir = path.join(process.cwd(), ".knowhow");
|
|
21
|
+
const jwtFile = path.join(configDir, ".jwt");
|
|
22
|
+
|
|
23
|
+
if (!fs.existsSync(configDir)) {
|
|
24
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
fs.writeFileSync(jwtFile, jwt);
|
|
27
|
+
fs.chmodSync(jwtFile, 0o600);
|
|
28
|
+
console.log("JWT updated successfully.");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Get current user/org information
|
|
32
|
+
try {
|
|
33
|
+
const storedJwt = await loadJwt();
|
|
34
|
+
const response = await axios.get(`${API_URL}/api/users/me`, {
|
|
35
|
+
headers: {
|
|
36
|
+
Authorization: `Bearer ${storedJwt}`,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const user = response.data.user;
|
|
40
|
+
const orgs = user.orgs;
|
|
41
|
+
const orgId = response.data.orgId;
|
|
42
|
+
|
|
43
|
+
const currentOrg = orgs.find((org) => {
|
|
44
|
+
return org.organizationId === orgId;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
console.log(
|
|
48
|
+
`Current user: ${user.email}, \nOrganization: ${currentOrg?.organization?.name} - ${orgId}`
|
|
49
|
+
);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
if (axios.isAxiosError(error) && error.response) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Error: ${error.response.status} - ${
|
|
54
|
+
error.response.data.message || "Unknown error"
|
|
55
|
+
}`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
console.log(
|
|
59
|
+
"Error: Unable to fetch user information. Please check your JWT and try again.",
|
|
60
|
+
error
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function loadJwt(): Promise<string> {
|
|
66
|
+
const jwtFile = path.join(process.cwd(), ".knowhow", ".jwt");
|
|
67
|
+
if (!fs.existsSync(jwtFile)) {
|
|
68
|
+
throw new Error("Error: JWT file not found.");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const jwt = fs.readFileSync(jwtFile, "utf-8").trim();
|
|
72
|
+
|
|
73
|
+
if (!jwt) {
|
|
74
|
+
throw new Error("Error: JWT is empty. Re-login with knowhow login --jwt.");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return jwt;
|
|
78
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { exec } from "child_process";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { openai } from "./ai";
|
|
5
|
+
import { execAsync, ask } from "./utils";
|
|
6
|
+
import { Downloader } from "./plugins/downloader/downloader";
|
|
7
|
+
import { convertToText, convertAudioToText } from "./conversion";
|
|
8
|
+
|
|
9
|
+
interface MicrophoneConfig {
|
|
10
|
+
defaultMic: string | null;
|
|
11
|
+
micCommand?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const CONFIG_DIR = ".knowhow/tools/microphone";
|
|
15
|
+
const CONFIG_FILE = "config.json";
|
|
16
|
+
const CONFIG_PATH = path.join(CONFIG_DIR, CONFIG_FILE);
|
|
17
|
+
|
|
18
|
+
function ensureConfigDirectoryExists() {
|
|
19
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
20
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function readMicrophoneConfig(): MicrophoneConfig {
|
|
25
|
+
ensureConfigDirectoryExists();
|
|
26
|
+
if (!fs.existsSync(CONFIG_PATH)) {
|
|
27
|
+
const defaultConfig: MicrophoneConfig = { defaultMic: null };
|
|
28
|
+
fs.writeFileSync(CONFIG_PATH, JSON.stringify(defaultConfig, null, 2));
|
|
29
|
+
return defaultConfig;
|
|
30
|
+
}
|
|
31
|
+
const configContent = fs.readFileSync(CONFIG_PATH, "utf-8");
|
|
32
|
+
return JSON.parse(configContent);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function writeMicrophoneConfig(config: MicrophoneConfig) {
|
|
36
|
+
ensureConfigDirectoryExists();
|
|
37
|
+
fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function getDefaultMic(): string | null {
|
|
41
|
+
const config = readMicrophoneConfig();
|
|
42
|
+
return config.defaultMic;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function setDefaultMic(micName: string) {
|
|
46
|
+
const config = readMicrophoneConfig();
|
|
47
|
+
config.defaultMic = micName;
|
|
48
|
+
writeMicrophoneConfig(config);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function getMicCommand(): string | undefined {
|
|
52
|
+
const config = readMicrophoneConfig();
|
|
53
|
+
return config.micCommand;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function setMicCommand(command: string) {
|
|
57
|
+
const config = readMicrophoneConfig();
|
|
58
|
+
config.micCommand = command;
|
|
59
|
+
writeMicrophoneConfig(config);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function listMicrophones() {
|
|
63
|
+
const regex = /\n\s{8}(\w.*):\n\n/gm;
|
|
64
|
+
|
|
65
|
+
const output = await execAsync(
|
|
66
|
+
`system_profiler SPAudioDataType | grep "Input Source: " -B 7 -A 1`
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const matches = output.stdout.match(regex) || [];
|
|
70
|
+
|
|
71
|
+
const options = matches.map((m) => m.trim().slice(0, -1));
|
|
72
|
+
console.log({ options });
|
|
73
|
+
|
|
74
|
+
return options;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// This isn't likely to work for everyone
|
|
78
|
+
export async function recordAudio() {
|
|
79
|
+
const filePath = "/tmp/knowhow.wav";
|
|
80
|
+
const audioFile = fs.createWriteStream(filePath, { encoding: "binary" });
|
|
81
|
+
const defaultMic = getDefaultMic();
|
|
82
|
+
const hasSox = await execAsync("which sox");
|
|
83
|
+
|
|
84
|
+
if (!hasSox && !defaultMic) {
|
|
85
|
+
console.error("Sox is required to record audio");
|
|
86
|
+
console.log(`
|
|
87
|
+
For Mac OS
|
|
88
|
+
brew install sox
|
|
89
|
+
|
|
90
|
+
For most linux disto's
|
|
91
|
+
sudo apt-get install sox libsox-fmt-all
|
|
92
|
+
`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!defaultMic) {
|
|
97
|
+
const options = await listMicrophones();
|
|
98
|
+
const mic = await ask(
|
|
99
|
+
`Select a microphone (${options.join()}) : `,
|
|
100
|
+
options
|
|
101
|
+
);
|
|
102
|
+
setDefaultMic(mic);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const currentDefaultMic = getDefaultMic();
|
|
106
|
+
|
|
107
|
+
const defaultCommand = `sox -t coreaudio "$1" -r 16000 -c 1 /tmp/knowhow.wav`;
|
|
108
|
+
const micCommand = getMicCommand();
|
|
109
|
+
const defaulted = micCommand || defaultCommand;
|
|
110
|
+
const recordCommand = defaulted.replace("$1", currentDefaultMic);
|
|
111
|
+
|
|
112
|
+
if (!micCommand) {
|
|
113
|
+
setMicCommand(defaultCommand);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const task = exec(recordCommand);
|
|
117
|
+
|
|
118
|
+
return { stop: () => task.kill() };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function voiceToText() {
|
|
122
|
+
const input = await ask(
|
|
123
|
+
"Press Enter to Start Recording, or exit to quit...: "
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
if (input === "exit") {
|
|
127
|
+
return "voice";
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const recording = await recordAudio();
|
|
131
|
+
console.log("Recording audio...");
|
|
132
|
+
await ask("Press Enter to Stop...");
|
|
133
|
+
recording.stop();
|
|
134
|
+
console.log("Stopped recording");
|
|
135
|
+
return convertAudioToText("/tmp/knowhow.wav", false);
|
|
136
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Clients } from "src/clients";
|
|
2
|
+
import { Plugins } from "src/plugins/plugins";
|
|
3
|
+
import { Agents } from "src/services/AgentService";
|
|
4
|
+
import { Tools } from "src/services/Tools";
|
|
5
|
+
import { getConfig } from "../config";
|
|
6
|
+
import { KnowhowModule } from "./types";
|
|
7
|
+
|
|
8
|
+
export class ModulesService {
|
|
9
|
+
async loadModulesFromConfig() {
|
|
10
|
+
const config = await getConfig();
|
|
11
|
+
|
|
12
|
+
const modules = config.modules || [];
|
|
13
|
+
|
|
14
|
+
for (const modulePath of modules) {
|
|
15
|
+
const importedModule = require(modulePath) as KnowhowModule;
|
|
16
|
+
await importedModule.init({ config, cwd: process.cwd() });
|
|
17
|
+
|
|
18
|
+
for (const agent of importedModule.agents) {
|
|
19
|
+
Agents.registerAgent(agent);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
for (const tool of importedModule.tools) {
|
|
23
|
+
Tools.addTool(tool.definition);
|
|
24
|
+
Tools.setFunction(tool.definition.function.name, tool.handler);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for (const plugin of importedModule.plugins) {
|
|
28
|
+
Plugins.registerPlugin(plugin.name, plugin.plugin);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
for (const client of importedModule.clients) {
|
|
32
|
+
Clients.registerClient(client.provider, client.client);
|
|
33
|
+
Clients.registerModels(client.provider, client.models);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Plugin } from "../plugins/types";
|
|
2
|
+
import { IAgent } from "../agents/interface";
|
|
3
|
+
import { Tool } from "../clients/types";
|
|
4
|
+
import { Config } from "../types";
|
|
5
|
+
import { GenericClient } from "../clients/types";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
*
|
|
9
|
+
* A a module should allow the dynamic composition of npm modules that are installed globally by referencing an array of config
|
|
10
|
+
*
|
|
11
|
+
* A module can add new commands to the chat loop, new tools, new agents, new plugins, new clients, new server features etc.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
export interface ModuleChatCommand {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
handler: (ctx: any) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ModuleTool {
|
|
21
|
+
name: string;
|
|
22
|
+
handler: (...args: any[]) => any;
|
|
23
|
+
definition: Tool;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type ModuleAgent = IAgent;
|
|
27
|
+
|
|
28
|
+
export type ModulePlugin = { name: string; plugin: Plugin };
|
|
29
|
+
|
|
30
|
+
export type ModuleClient = {
|
|
31
|
+
client: GenericClient;
|
|
32
|
+
provider: string;
|
|
33
|
+
models: string[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export type InitParams = {
|
|
37
|
+
config: Config;
|
|
38
|
+
cwd: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export interface KnowhowModule {
|
|
42
|
+
init: (params: InitParams) => Promise<void>;
|
|
43
|
+
commands: ModuleChatCommand[];
|
|
44
|
+
tools: ModuleTool[];
|
|
45
|
+
agents: ModuleAgent[];
|
|
46
|
+
plugins: ModulePlugin[];
|
|
47
|
+
clients: ModuleClient[];
|
|
48
|
+
}
|