@tyvm/knowhow 0.0.89 → 0.0.91
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/.depcheckrc +31 -0
- package/CONFIG.md +52 -0
- package/README.md +344 -29
- package/WORKER.md +169 -334
- package/autodoc/chat-guide.md +540 -0
- package/autodoc/cli-reference.md +765 -0
- package/autodoc/config-reference.md +541 -0
- package/autodoc/embeddings-guide.md +566 -0
- package/autodoc/generate-guide.md +477 -0
- package/autodoc/language-plugin-guide.md +443 -0
- package/autodoc/modules-guide.md +352 -0
- package/autodoc/plugins-guide.md +720 -0
- package/autodoc/quickstart-guide.md +129 -0
- package/autodoc/skills-guide.md +468 -0
- package/autodoc/worker-guide.md +526 -0
- package/bin/knowhow.js +1 -1
- package/package.json +4 -32
- package/src/agents/tools/executeScript/index.ts +5 -0
- package/src/agents/tools/googleSearch.ts +2 -2
- package/src/agents/tools/index.ts +0 -3
- package/src/agents/tools/list.ts +0 -147
- package/src/agents/tools/loadWebpage.ts +3 -113
- package/src/ai.ts +33 -2
- package/src/auth/browserLogin.ts +10 -13
- package/src/cli.ts +63 -3
- package/src/clients/gemini.ts +96 -25
- package/src/clients/http.ts +7 -11
- package/src/clients/pricing/google.ts +122 -26
- package/src/config.ts +28 -4
- package/src/conversion.ts +24 -54
- package/src/index.ts +30 -3
- package/src/login.ts +5 -6
- package/src/plugins/language.ts +0 -4
- package/src/plugins/plugins.ts +0 -14
- package/src/plugins/url.ts +31 -12
- package/src/processors/TokenCompressor.ts +2 -2
- package/src/processors/ToolResponseCache.ts +3 -3
- package/src/processors/tools/grepToolResponse.ts +9 -4
- package/src/processors/tools/jqToolResponse.ts +11 -6
- package/src/processors/tools/listStoredToolResponses.ts +1 -1
- package/src/processors/tools/tailToolResponse.ts +9 -4
- package/src/services/GitHub.ts +2 -2
- package/src/services/KnowhowClient.ts +34 -34
- package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
- package/src/services/S3.ts +16 -16
- package/src/services/index.ts +4 -4
- package/src/services/modules/index.ts +10 -2
- package/src/services/modules/types.ts +5 -2
- package/src/services/script-execution/ScriptExecutor.ts +29 -10
- package/src/services/script-execution/ScriptPolicy.ts +6 -2
- package/src/types.ts +1 -0
- package/src/utils/http.ts +127 -0
- package/src/workers/auth/PasskeySetup.ts +7 -11
- package/tests/clients/AIClient.test.ts +24 -21
- package/tests/manual/file-edits/figma.test.ts +3 -70
- package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
- package/tests/plugins/language/languagePlugin.test.ts +2 -0
- package/tests/processors/ToolResponseCache.test.ts +2 -2
- package/tests/test.spec.ts +0 -14
- package/tests/unit/modules/moduleLoading.test.ts +7 -4
- package/tests/unit/plugins/pluginLoading.test.ts +6 -6
- package/ts_build/package.json +4 -32
- package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
- package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
- package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
- package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
- package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
- package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
- package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
- package/ts_build/src/agents/tools/executeScript/index.js +4 -1
- package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
- package/ts_build/src/agents/tools/googleSearch.js +2 -2
- package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
- package/ts_build/src/agents/tools/index.d.ts +0 -3
- package/ts_build/src/agents/tools/index.js +0 -3
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +0 -138
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/loadWebpage.js +1 -89
- package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
- package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
- package/ts_build/src/ai.js +18 -1
- package/ts_build/src/ai.js.map +1 -1
- package/ts_build/src/auth/browserLogin.js +7 -7
- package/ts_build/src/auth/browserLogin.js.map +1 -1
- package/ts_build/src/cli.d.ts +1 -1
- package/ts_build/src/cli.js +47 -1
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/gemini.d.ts +1 -73
- package/ts_build/src/clients/gemini.js +57 -19
- package/ts_build/src/clients/gemini.js.map +1 -1
- package/ts_build/src/clients/http.js +5 -9
- package/ts_build/src/clients/http.js.map +1 -1
- package/ts_build/src/clients/pricing/google.d.ts +17 -73
- package/ts_build/src/clients/pricing/google.js +47 -10
- package/ts_build/src/clients/pricing/google.js.map +1 -1
- package/ts_build/src/config.js +17 -2
- package/ts_build/src/config.js.map +1 -1
- package/ts_build/src/conversion.d.ts +1 -4
- package/ts_build/src/conversion.js +12 -27
- package/ts_build/src/conversion.js.map +1 -1
- package/ts_build/src/index.d.ts +4 -0
- package/ts_build/src/index.js +19 -3
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/login.js +5 -4
- package/ts_build/src/login.js.map +1 -1
- package/ts_build/src/plugins/downloader/downloader.js +3 -3
- package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
- package/ts_build/src/plugins/language.js.map +1 -1
- package/ts_build/src/plugins/plugins.js +0 -14
- package/ts_build/src/plugins/plugins.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
- package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
- package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
- package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
- package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
- package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
- package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
- package/ts_build/src/plugins/url.js +27 -8
- package/ts_build/src/plugins/url.js.map +1 -1
- package/ts_build/src/processors/TokenCompressor.js +2 -2
- package/ts_build/src/processors/TokenCompressor.js.map +1 -1
- package/ts_build/src/processors/ToolResponseCache.js +3 -3
- package/ts_build/src/processors/ToolResponseCache.js.map +1 -1
- package/ts_build/src/processors/tools/grepToolResponse.d.ts +3 -1
- package/ts_build/src/processors/tools/grepToolResponse.js +8 -2
- package/ts_build/src/processors/tools/grepToolResponse.js.map +1 -1
- package/ts_build/src/processors/tools/jqToolResponse.d.ts +3 -1
- package/ts_build/src/processors/tools/jqToolResponse.js +10 -4
- package/ts_build/src/processors/tools/jqToolResponse.js.map +1 -1
- package/ts_build/src/processors/tools/listStoredToolResponses.js +1 -1
- package/ts_build/src/processors/tools/listStoredToolResponses.js.map +1 -1
- package/ts_build/src/processors/tools/tailToolResponse.d.ts +3 -1
- package/ts_build/src/processors/tools/tailToolResponse.js +8 -2
- package/ts_build/src/processors/tools/tailToolResponse.js.map +1 -1
- package/ts_build/src/services/GitHub.js +2 -2
- package/ts_build/src/services/GitHub.js.map +1 -1
- package/ts_build/src/services/KnowhowClient.d.ts +29 -29
- package/ts_build/src/services/KnowhowClient.js +33 -33
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
- package/ts_build/src/services/MediaProcessorService.js +215 -0
- package/ts_build/src/services/MediaProcessorService.js.map +1 -0
- package/ts_build/src/services/S3.js +12 -18
- package/ts_build/src/services/S3.js.map +1 -1
- package/ts_build/src/services/index.d.ts +3 -2
- package/ts_build/src/services/index.js +3 -3
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/modules/index.js +10 -2
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/services/modules/types.d.ts +5 -2
- package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
- package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
- package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
- package/ts_build/src/types.d.ts +1 -0
- package/ts_build/src/types.js +1 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/http.d.ts +27 -0
- package/ts_build/src/utils/http.js +98 -0
- package/ts_build/src/utils/http.js.map +1 -0
- package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
- package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
- package/ts_build/tests/clients/AIClient.test.js +11 -14
- package/ts_build/tests/clients/AIClient.test.js.map +1 -1
- package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
- package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
- package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
- package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
- package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
- package/ts_build/tests/test.spec.js +0 -14
- package/ts_build/tests/test.spec.js.map +1 -1
- package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
- package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
- package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +6 -4
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
- package/autodoc/chat.mdx +0 -20
- package/autodoc/cli.mdx +0 -11
- package/autodoc/plugins/asana.mdx +0 -47
- package/autodoc/plugins/downloader/downloader.mdx +0 -38
- package/autodoc/plugins/downloader/plugin.mdx +0 -37
- package/autodoc/plugins/downloader/types.mdx +0 -42
- package/autodoc/plugins/embedding.mdx +0 -41
- package/autodoc/plugins/figma.mdx +0 -45
- package/autodoc/plugins/github.mdx +0 -40
- package/autodoc/plugins/jira.mdx +0 -46
- package/autodoc/plugins/language.mdx +0 -37
- package/autodoc/plugins/linear.mdx +0 -35
- package/autodoc/plugins/notion.mdx +0 -38
- package/autodoc/plugins/plugins.mdx +0 -59
- package/autodoc/plugins/types.mdx +0 -51
- package/autodoc/plugins/vim.mdx +0 -39
- package/autodoc/tools/addInternalTools.mdx +0 -1
- package/autodoc/tools/agentCall.mdx +0 -1
- package/autodoc/tools/asana/definitions.mdx +0 -10
- package/autodoc/tools/asana/index.mdx +0 -12
- package/autodoc/tools/askHuman.mdx +0 -1
- package/autodoc/tools/callPlugin.mdx +0 -1
- package/autodoc/tools/embeddingSearch.mdx +0 -1
- package/autodoc/tools/execCommand.mdx +0 -1
- package/autodoc/tools/fileSearch.mdx +0 -1
- package/autodoc/tools/finalAnswer.mdx +0 -1
- package/autodoc/tools/github/definitions.mdx +0 -6
- package/autodoc/tools/github/index.mdx +0 -8
- package/autodoc/tools/index.mdx +0 -14
- package/autodoc/tools/lintFile.mdx +0 -7
- package/autodoc/tools/list.mdx +0 -16
- package/autodoc/tools/modifyFile.mdx +0 -7
- package/autodoc/tools/patch.mdx +0 -9
- package/autodoc/tools/readBlocks.mdx +0 -1
- package/autodoc/tools/readFile.mdx +0 -1
- package/autodoc/tools/scanFile.mdx +0 -1
- package/autodoc/tools/textSearch.mdx +0 -6
- package/autodoc/tools/types/fileblock.mdx +0 -1
- package/autodoc/tools/visionTool.mdx +0 -1
- package/autodoc/tools/writeFile.mdx +0 -1
- package/benchmarks/.dockerignore +0 -7
- package/benchmarks/README.md +0 -166
- package/benchmarks/docker/Dockerfile +0 -68
- package/benchmarks/example-config.yml +0 -27
- package/benchmarks/jest.config.js +0 -13
- package/benchmarks/package-lock.json +0 -4297
- package/benchmarks/package.json +0 -39
- package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
- package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
- package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
- package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
- package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
- package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
- package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
- package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
- package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
- package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
- package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
- package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
- package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
- package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
- package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
- package/benchmarks/scripts/build-and-run.sh +0 -47
- package/benchmarks/scripts/clone-exercism.sh +0 -92
- package/benchmarks/scripts/validate.sh +0 -48
- package/benchmarks/src/__tests__/runner.test.ts +0 -27
- package/benchmarks/src/cli.ts +0 -90
- package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
- package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
- package/benchmarks/src/evaluators/index.ts +0 -3
- package/benchmarks/src/evaluators/types.ts +0 -22
- package/benchmarks/src/index.ts +0 -3
- package/benchmarks/src/providers.ts +0 -13
- package/benchmarks/src/runner.ts +0 -824
- package/benchmarks/src/types.ts +0 -63
- package/benchmarks/tsconfig.json +0 -19
- package/leaderboard/README.md +0 -148
- package/leaderboard/app/api/benchmark-data/route.ts +0 -131
- package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
- package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
- package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
- package/leaderboard/app/globals.css +0 -27
- package/leaderboard/app/layout.tsx +0 -21
- package/leaderboard/app/page.tsx +0 -170
- package/leaderboard/components/LeaderboardTable.tsx +0 -168
- package/leaderboard/components/PerformanceChart.tsx +0 -109
- package/leaderboard/next-env.d.ts +0 -5
- package/leaderboard/next.config.js +0 -4
- package/leaderboard/package-lock.json +0 -6363
- package/leaderboard/package.json +0 -28
- package/leaderboard/postcss.config.js +0 -6
- package/leaderboard/tailwind.config.js +0 -17
- package/leaderboard/tsconfig.json +0 -28
- package/leaderboard/types/benchmark.ts +0 -67
- package/leaderboard/utils/dataProcessor.ts +0 -33
- package/src/agents/tools/asana/definitions.ts +0 -199
- package/src/agents/tools/asana/index.ts +0 -108
- package/src/agents/tools/ast/astAppendNode.ts +0 -90
- package/src/agents/tools/ast/astDeleteNode.ts +0 -88
- package/src/agents/tools/ast/astEditNode.ts +0 -95
- package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
- package/src/agents/tools/ast/astListPaths.ts +0 -66
- package/src/agents/tools/ast/index.ts +0 -7
- package/src/agents/tools/github/definitions.ts +0 -89
- package/src/agents/tools/github/index.ts +0 -67
- package/src/chat-old.ts +0 -446
- package/src/plugins/asana.ts +0 -146
- package/src/plugins/downloader/plugin.ts +0 -103
- package/src/plugins/downloader/types.ts +0 -92
- package/src/plugins/figma.ts +0 -158
- package/src/plugins/github.ts +0 -219
- package/src/plugins/jira.ts +0 -115
- package/src/plugins/linear.ts +0 -230
- package/src/plugins/notion.ts +0 -179
- package/src/plugins/tree-sitter/editor.ts +0 -369
- package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
- package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
- package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
- package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
- package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
- package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
- package/src/plugins/tree-sitter/parser.ts +0 -470
- package/src/plugins/tree-sitter/simple-paths.ts +0 -467
- package/test-comprehensive.ts +0 -31
- package/tests/tree-sitter/editor.test.ts +0 -113
- package/tests/tree-sitter/invalid.test.ts +0 -299
- package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
- package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
- package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
- package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
- package/tests/tree-sitter/paths/paths.test.ts +0 -170
- package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
- package/tests/tree-sitter/sample-after.ts +0 -48
- package/tests/tree-sitter/sample-before.ts +0 -25
- package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
- package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
- package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
- package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
- package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
- package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
- package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
- package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
- package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
- package/tests/tree-sitter/tree-sitter.test.ts +0 -251
package/src/index.ts
CHANGED
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
getHashes,
|
|
6
6
|
checkNoFilesChanged,
|
|
7
7
|
} from "./hashes";
|
|
8
|
-
import axios from "axios";
|
|
9
8
|
import * as fs from "fs";
|
|
10
9
|
import * as path from "path";
|
|
11
10
|
import * as crypto from "crypto";
|
|
@@ -52,6 +51,14 @@ export * as types from "./types";
|
|
|
52
51
|
export * as processors from "./processors";
|
|
53
52
|
export * as ai from "./ai";
|
|
54
53
|
|
|
54
|
+
// Export module system types for external modules
|
|
55
|
+
export * from "./services/modules/types";
|
|
56
|
+
// Export plugin types for external plugins
|
|
57
|
+
export { PluginBase } from "./plugins/PluginBase";
|
|
58
|
+
export { PluginMeta, Plugin, PluginContext } from "./plugins/types";
|
|
59
|
+
// Export embedding types
|
|
60
|
+
export { MinimalEmbedding, Embeddable } from "./types";
|
|
61
|
+
|
|
55
62
|
export async function embed() {
|
|
56
63
|
// load config
|
|
57
64
|
const config = await getConfig();
|
|
@@ -154,12 +161,32 @@ export async function upload() {
|
|
|
154
161
|
}
|
|
155
162
|
}
|
|
156
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Normalizes an input pattern to a valid glob pattern.
|
|
166
|
+
* Supports:
|
|
167
|
+
* - Standard glob patterns (e.g. "src/**\/*.ts")
|
|
168
|
+
* - Brace expansion (e.g. "{src/a.ts,src/b.ts}")
|
|
169
|
+
* - Comma-separated file paths (e.g. "src/a.ts,src/b.ts") — auto-converted to brace expansion
|
|
170
|
+
*/
|
|
171
|
+
function normalizeInputPattern(input: string): string {
|
|
172
|
+
// If it already has braces or glob chars other than comma, use as-is
|
|
173
|
+
if (input.includes("{") || input.includes("*") || input.includes("?")) {
|
|
174
|
+
return input;
|
|
175
|
+
}
|
|
176
|
+
// If it contains commas, treat as comma-separated list and wrap in braces
|
|
177
|
+
if (input.includes(",")) {
|
|
178
|
+
const parts = input.split(",").map((p) => p.trim());
|
|
179
|
+
return `{${parts.join(",")}}`;
|
|
180
|
+
}
|
|
181
|
+
return input;
|
|
182
|
+
}
|
|
183
|
+
|
|
157
184
|
export async function generate(): Promise<void> {
|
|
158
185
|
const config = await getConfig();
|
|
159
186
|
for (const source of config.sources) {
|
|
160
187
|
console.log("Generating", source.input, "to", source.output);
|
|
161
188
|
if (source.kind === "file" || !source.kind) {
|
|
162
|
-
const files = globSync(source.input);
|
|
189
|
+
const files = globSync(normalizeInputPattern(source.input));
|
|
163
190
|
const prompt = await loadPrompt(source.prompt);
|
|
164
191
|
|
|
165
192
|
if (source.output.endsWith("/")) {
|
|
@@ -205,7 +232,7 @@ async function handleAllKindsGeneration(source: GenerationSource) {
|
|
|
205
232
|
|
|
206
233
|
async function handleFileKindGeneration(source: GenerationSource) {
|
|
207
234
|
const prompt = await loadPrompt(source.prompt);
|
|
208
|
-
const files = globSync(source.input);
|
|
235
|
+
const files = globSync(normalizeInputPattern(source.input));
|
|
209
236
|
console.log("Analyzing files: ", files);
|
|
210
237
|
|
|
211
238
|
if (source.output.endsWith("/")) {
|
package/src/login.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import http from "./utils/http";
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { chmod } from "fs/promises";
|
|
@@ -68,11 +68,10 @@ export async function login(jwtFlag?: boolean): Promise<void> {
|
|
|
68
68
|
await updateConfig(config);
|
|
69
69
|
}
|
|
70
70
|
} catch (error) {
|
|
71
|
-
if (
|
|
71
|
+
if (http.isHttpError(error) && error.response) {
|
|
72
|
+
const errData = await error.response.json().catch(() => ({ message: "Unknown error" }));
|
|
72
73
|
throw new Error(
|
|
73
|
-
`Error: ${error.
|
|
74
|
-
error.response.data.message || "Unknown error"
|
|
75
|
-
}`
|
|
74
|
+
`Error: ${error.status} - ${errData.message || "Unknown error"}`
|
|
76
75
|
);
|
|
77
76
|
}
|
|
78
77
|
console.log(
|
|
@@ -98,7 +97,7 @@ export async function loadJwt(): Promise<string> {
|
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
export async function checkJwt(storedJwt: string) {
|
|
101
|
-
const response = await
|
|
100
|
+
const response = await http.get(`${KNOWHOW_API_URL}/api/users/me`, {
|
|
102
101
|
headers: {
|
|
103
102
|
Authorization: `Bearer ${storedJwt}`,
|
|
104
103
|
},
|
package/src/plugins/language.ts
CHANGED
|
@@ -6,10 +6,6 @@ import { getConfig, getLanguageConfig } from "../config";
|
|
|
6
6
|
import { getEnabledPlugins } from "../types";
|
|
7
7
|
import { PluginBase, PluginMeta } from "./PluginBase";
|
|
8
8
|
import { Plugin, PluginContext } from "./types";
|
|
9
|
-
import { GitHubPlugin } from "./github";
|
|
10
|
-
import { AsanaPlugin } from "./asana";
|
|
11
|
-
import { JiraPlugin } from "./jira";
|
|
12
|
-
import { LinearPlugin } from "./linear";
|
|
13
9
|
import { PluginService } from "./plugins";
|
|
14
10
|
|
|
15
11
|
/**
|
package/src/plugins/plugins.ts
CHANGED
|
@@ -4,13 +4,6 @@ import { VimPlugin } from "./vim";
|
|
|
4
4
|
import { LinterPlugin } from "./LinterPlugin";
|
|
5
5
|
import { LanguagePlugin } from "./language";
|
|
6
6
|
import { EmbeddingPlugin } from "./embedding";
|
|
7
|
-
import { GitHubPlugin } from "./github";
|
|
8
|
-
import { AsanaPlugin } from "./asana";
|
|
9
|
-
import { LinearPlugin } from "./linear";
|
|
10
|
-
import { JiraPlugin } from "./jira";
|
|
11
|
-
import { NotionPlugin } from "./notion";
|
|
12
|
-
import { DownloaderPlugin } from "./downloader/plugin";
|
|
13
|
-
import { FigmaPlugin } from "./figma";
|
|
14
7
|
import { UrlPlugin } from "./url";
|
|
15
8
|
import { GitPlugin } from "./GitPlugin";
|
|
16
9
|
import { TmuxPlugin } from "./tmux";
|
|
@@ -33,13 +26,6 @@ export class PluginService {
|
|
|
33
26
|
this.pluginMap.set("embeddings", new EmbeddingPlugin(context));
|
|
34
27
|
this.pluginMap.set("vim", new VimPlugin(context));
|
|
35
28
|
this.pluginMap.set("linter", new LinterPlugin(context));
|
|
36
|
-
this.pluginMap.set("github", new GitHubPlugin(context));
|
|
37
|
-
this.pluginMap.set("asana", new AsanaPlugin(context));
|
|
38
|
-
this.pluginMap.set("linear", new LinearPlugin(context));
|
|
39
|
-
this.pluginMap.set("jira", new JiraPlugin(context));
|
|
40
|
-
this.pluginMap.set("notion", new NotionPlugin(context));
|
|
41
|
-
this.pluginMap.set("download", new DownloaderPlugin(context));
|
|
42
|
-
this.pluginMap.set("figma", new FigmaPlugin(context));
|
|
43
29
|
this.pluginMap.set("language", new LanguagePlugin(context));
|
|
44
30
|
this.pluginMap.set("url", new UrlPlugin(context));
|
|
45
31
|
this.pluginMap.set("git", new GitPlugin(context));
|
package/src/plugins/url.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { PluginBase, PluginMeta } from "./PluginBase";
|
|
2
2
|
import { Plugin, PluginContext } from "./types";
|
|
3
3
|
import { MinimalEmbedding } from "../types";
|
|
4
|
-
import axios from "axios";
|
|
5
|
-
import * as cheerio from "cheerio";
|
|
6
|
-
import loadWebpage from "../agents/tools/loadWebpage";
|
|
7
4
|
|
|
8
5
|
export class UrlPlugin extends PluginBase implements Plugin {
|
|
9
6
|
static readonly meta: PluginMeta = {
|
|
@@ -20,22 +17,47 @@ export class UrlPlugin extends PluginBase implements Plugin {
|
|
|
20
17
|
|
|
21
18
|
async embed(userPrompt: string): Promise<MinimalEmbedding[]> {
|
|
22
19
|
const urls = this.extractUrls(userPrompt);
|
|
23
|
-
const embeddings = await Promise.all(urls.map(this.fetchAndParseUrl));
|
|
20
|
+
const embeddings = await Promise.all(urls.map((url) => this.fetchAndParseUrl(url)));
|
|
24
21
|
return embeddings.filter((e): e is MinimalEmbedding => e !== null);
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
extractUrls(userPrompt: string): string[] {
|
|
28
25
|
const urlRegex = /(https?:\/\/[^\s]+)/g;
|
|
29
26
|
const urls = userPrompt.match(urlRegex) || [];
|
|
30
|
-
|
|
31
27
|
return Array.from(new Set(urls));
|
|
32
28
|
}
|
|
33
29
|
|
|
34
30
|
async fetchAndParseUrl(url: string): Promise<MinimalEmbedding | null> {
|
|
35
31
|
try {
|
|
36
|
-
const
|
|
32
|
+
const response = await fetch(url, {
|
|
33
|
+
headers: {
|
|
34
|
+
"User-Agent": "Mozilla/5.0 (compatible; KnowhowBot/1.0)",
|
|
35
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
this.log(`URL PLUGIN: Failed to fetch ${url}: ${response.status}`, "warn");
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const contentType = response.headers.get("content-type") || "";
|
|
45
|
+
let text = "";
|
|
46
|
+
|
|
47
|
+
if (contentType.includes("text/html") || contentType.includes("text/plain")) {
|
|
48
|
+
const html = await response.text();
|
|
49
|
+
// Simple HTML to text: strip tags
|
|
50
|
+
text = html
|
|
51
|
+
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "")
|
|
52
|
+
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "")
|
|
53
|
+
.replace(/<[^>]+>/g, " ")
|
|
54
|
+
.replace(/\s+/g, " ")
|
|
55
|
+
.trim();
|
|
56
|
+
} else {
|
|
57
|
+
text = await response.text();
|
|
58
|
+
}
|
|
37
59
|
|
|
38
|
-
this.log(`URL PLUGIN: Fetched content from ${url}: ${text}`);
|
|
60
|
+
this.log(`URL PLUGIN: Fetched content from ${url}: ${text.substring(0, 100)}`);
|
|
39
61
|
|
|
40
62
|
return {
|
|
41
63
|
id: url + "-url",
|
|
@@ -58,7 +80,7 @@ export class UrlPlugin extends PluginBase implements Plugin {
|
|
|
58
80
|
return "URL PLUGIN: Too many URLs detected. Skipping like unintentional bulk browse.";
|
|
59
81
|
}
|
|
60
82
|
|
|
61
|
-
const results = await Promise.all(urls.map(this.fetchAndParseUrl));
|
|
83
|
+
const results = await Promise.all(urls.map((url) => this.fetchAndParseUrl(url)));
|
|
62
84
|
const validResults = results.filter(
|
|
63
85
|
(r): r is MinimalEmbedding => r !== null
|
|
64
86
|
);
|
|
@@ -70,10 +92,7 @@ export class UrlPlugin extends PluginBase implements Plugin {
|
|
|
70
92
|
const formattedResults = validResults
|
|
71
93
|
.map(
|
|
72
94
|
(result) =>
|
|
73
|
-
`URL: ${result.metadata.url}\n\nContent:\n${result.text.substring(
|
|
74
|
-
0,
|
|
75
|
-
500
|
|
76
|
-
)}...`
|
|
95
|
+
`URL: ${result.metadata.url}\n\nContent:\n${result.text.substring(0, 500)}...`
|
|
77
96
|
)
|
|
78
97
|
.join("\n\n---\n\n");
|
|
79
98
|
|
|
@@ -131,7 +131,7 @@ export class TokenCompressor implements JsonCompressorStorage {
|
|
|
131
131
|
200
|
|
132
132
|
)}...\n[Use ${
|
|
133
133
|
this.toolName
|
|
134
|
-
} tool with key "${firstKey}" to retrieve content. Follow NEXT_CHUNK_KEY references for complete content]`;
|
|
134
|
+
} tool with key "${firstKey}" to retrieve content. Follow NEXT_CHUNK_KEY references for complete content]\n[TIP: If this is JSON data, prefer using the jqToolResponse tool with the toolCallId instead — it parses ._data automatically and lets you filter/search without repeated expandTokens calls]`;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
/**
|
|
@@ -413,7 +413,7 @@ export const expandTokensDefinition: Tool = {
|
|
|
413
413
|
function: {
|
|
414
414
|
name: "expandTokens",
|
|
415
415
|
description:
|
|
416
|
-
"Retrieve a chunk of compressed data that was stored during message processing. The returned content may contain a `NEXT_CHUNK_KEY` to retrieve subsequent chunks.",
|
|
416
|
+
"Retrieve a chunk of compressed data that was stored during message processing. The returned content may contain a `NEXT_CHUNK_KEY` to retrieve subsequent chunks. NOTE: If the compressed data is JSON (e.g. a tool response), prefer using jqToolResponse instead — it lets you query the data directly using JQ without repeatedly calling expandTokens. Use expandTokens only for plain text/string data or when you need the raw content.",
|
|
417
417
|
parameters: {
|
|
418
418
|
type: "object",
|
|
419
419
|
positional: true,
|
|
@@ -200,7 +200,7 @@ export class ToolResponseCache {
|
|
|
200
200
|
): Promise<string> {
|
|
201
201
|
const data = this.storage[toolCallId];
|
|
202
202
|
const availableIds = Object.keys(this.storage);
|
|
203
|
-
return executeJqQuery(data, toolCallId, jqQuery, availableIds);
|
|
203
|
+
return executeJqQuery(data, toolCallId, jqQuery, availableIds, this.toolNameMap);
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
/**
|
|
@@ -213,7 +213,7 @@ export class ToolResponseCache {
|
|
|
213
213
|
): Promise<string> {
|
|
214
214
|
const data = this.storage[toolCallId];
|
|
215
215
|
const availableIds = Object.keys(this.storage);
|
|
216
|
-
return executeGrep(data, toolCallId, pattern, availableIds, options);
|
|
216
|
+
return executeGrep(data, toolCallId, pattern, availableIds, options, this.toolNameMap);
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
/**
|
|
@@ -225,7 +225,7 @@ export class ToolResponseCache {
|
|
|
225
225
|
): Promise<string> {
|
|
226
226
|
const data = this.storage[toolCallId];
|
|
227
227
|
const availableIds = Object.keys(this.storage);
|
|
228
|
-
return executeTail(data, toolCallId, availableIds, options);
|
|
228
|
+
return executeTail(data, toolCallId, availableIds, options, this.toolNameMap);
|
|
229
229
|
}
|
|
230
230
|
|
|
231
231
|
/**
|
|
@@ -16,12 +16,17 @@ export async function executeGrep(
|
|
|
16
16
|
toolCallId: string,
|
|
17
17
|
pattern: string,
|
|
18
18
|
availableIds: string[],
|
|
19
|
-
options?: GrepOptions
|
|
19
|
+
options?: GrepOptions,
|
|
20
|
+
toolNameMap?: { [toolCallId: string]: string }
|
|
20
21
|
): Promise<string> {
|
|
21
22
|
if (!data) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const idList = availableIds
|
|
24
|
+
.map((id) => {
|
|
25
|
+
const name = toolNameMap?.[id];
|
|
26
|
+
return name ? `${id} (${name})` : id;
|
|
27
|
+
})
|
|
28
|
+
.join("\n - ");
|
|
29
|
+
return `Error: No tool response found for toolCallId "${toolCallId}". Call listStoredToolResponses to see all available responses with their tool names.\n\nAvailable toolCallIds:\n - ${idList || "(none)"}`;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
try {
|
|
@@ -46,12 +46,17 @@ export async function executeJqQuery(
|
|
|
46
46
|
data: string,
|
|
47
47
|
toolCallId: string,
|
|
48
48
|
jqQuery: string,
|
|
49
|
-
availableIds: string[]
|
|
49
|
+
availableIds: string[],
|
|
50
|
+
toolNameMap?: { [toolCallId: string]: string }
|
|
50
51
|
): Promise<string> {
|
|
51
52
|
if (!data) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
const idList = availableIds
|
|
54
|
+
.map((id) => {
|
|
55
|
+
const name = toolNameMap?.[id];
|
|
56
|
+
return name ? `${id} (${name})` : id;
|
|
57
|
+
})
|
|
58
|
+
.join("\n - ");
|
|
59
|
+
return `Error: No tool response found for toolCallId "${toolCallId}". Call listStoredToolResponses to see all available responses with their tool names.\n\nAvailable toolCallIds:\n - ${idList || "(none)"}`;
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
try {
|
|
@@ -103,7 +108,7 @@ export const jqToolResponseDefinition: Tool = {
|
|
|
103
108
|
function: {
|
|
104
109
|
name: "jqToolResponse",
|
|
105
110
|
description:
|
|
106
|
-
"Execute a JQ query on a stored tool response to extract specific data. Use this when you need to extract specific information from any tool response that has been stored.
|
|
111
|
+
"Execute a JQ query on a stored tool response to extract specific data. Use this when you need to extract specific information from any tool response that has been stored. This is the preferred way to search or filter compressed JSON tool responses — it parses the data automatically without requiring repeated expandTokens calls. IMPORTANT: You do NOT know the toolCallId at the time you call a tool — you must call listStoredToolResponses first to discover the correct toolCallId. The listStoredToolResponses output shows each response's tool name so you can identify which response belongs to which call. How to determine the correct JQ query: (1) For mcp_* tool responses (external MCP tools like mcp_1_*): the response is stored as a raw JSON object — use '.' to access the root directly, e.g. '.children | map(.name)' or '.state'. Do NOT use .content[0].text | fromjson for these. (2) For compressed MCP tool responses (._mcp_format === true): use '._data' e.g. '._data.children | map(.name)'. (3) For standard built-in tool responses: data may be nested under '.content[0].text | fromjson'. Use jqToolResponse instead of expandTokens whenever the stored data is JSON.",
|
|
107
112
|
parameters: {
|
|
108
113
|
type: "object",
|
|
109
114
|
positional: true,
|
|
@@ -115,7 +120,7 @@ export const jqToolResponseDefinition: Tool = {
|
|
|
115
120
|
jqQuery: {
|
|
116
121
|
type: "string",
|
|
117
122
|
description:
|
|
118
|
-
"The JQ query to execute on the tool response data.
|
|
123
|
+
"The JQ query to execute on the tool response data. For mcp_* tool responses (raw JSON object): '.children | map({id: .id, name: .name})' (extract fields from children array), '.children | map(select(.state == \"PENDING\")) | length' (count pending children), '.name' (get a top-level field). For compressed responses (._mcp_format true): '._data.children | map(.name)' or '._data | map(select(.state == \"PENDING\")) | length'. For standard built-in tool responses: '.content[0].text | fromjson | map(.title)' (extract titles from standard MCP array), '.content[0].text | fromjson | map(select(.createdAt > \"2025-01-01\"))' (filter by date).",
|
|
119
124
|
},
|
|
120
125
|
},
|
|
121
126
|
required: ["toolCallId", "jqQuery"],
|
|
@@ -72,7 +72,7 @@ export const listStoredToolResponsesDefinition: Tool = {
|
|
|
72
72
|
function: {
|
|
73
73
|
name: "listStoredToolResponses",
|
|
74
74
|
description:
|
|
75
|
-
"List all stored tool responses with metadata including tool call ID, tool name, size, timestamp, and a preview of the content.
|
|
75
|
+
"List all stored tool responses with metadata including tool call ID, tool name, size, timestamp, and a preview of the content. ALWAYS call this before using jqToolResponse, grepToolResponse, or tailToolResponse — you need the toolCallId from this list to query a specific response. The tool name shown here corresponds to the tool that produced the response (e.g. 'mcp_1_knowhow-web_GetOrgUserTask'), making it easy to identify which response you want.",
|
|
76
76
|
parameters: {
|
|
77
77
|
type: "object",
|
|
78
78
|
positional: false,
|
|
@@ -11,12 +11,17 @@ export async function executeTail(
|
|
|
11
11
|
data: string,
|
|
12
12
|
toolCallId: string,
|
|
13
13
|
availableIds: string[],
|
|
14
|
-
options?: TailOptions
|
|
14
|
+
options?: TailOptions,
|
|
15
|
+
toolNameMap?: { [toolCallId: string]: string }
|
|
15
16
|
): Promise<string> {
|
|
16
17
|
if (data === null || data === undefined) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
const idList = availableIds
|
|
19
|
+
.map((id) => {
|
|
20
|
+
const name = toolNameMap?.[id];
|
|
21
|
+
return name ? `${id} (${name})` : id;
|
|
22
|
+
})
|
|
23
|
+
.join("\n - ");
|
|
24
|
+
return `Error: No tool response found for toolCallId "${toolCallId}". Call listStoredToolResponses to see all available responses with their tool names.\n\nAvailable toolCallIds:\n - ${idList || "(none)"}`;
|
|
20
25
|
}
|
|
21
26
|
|
|
22
27
|
try {
|
package/src/services/GitHub.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Octokit } from "@octokit/rest";
|
|
2
|
-
import
|
|
2
|
+
import http from "../utils/http";
|
|
3
3
|
|
|
4
4
|
export class GitHubService {
|
|
5
5
|
octokit: Octokit;
|
|
@@ -22,7 +22,7 @@ export class GitHubService {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
private async getLfsContent(downloadUrl: string): Promise<string> {
|
|
25
|
-
const response = await
|
|
25
|
+
const response = await http.get(downloadUrl);
|
|
26
26
|
return JSON.stringify(response.data);
|
|
27
27
|
}
|
|
28
28
|
|