@tyvm/knowhow 0.0.90 → 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/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/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/conversion.ts +24 -54
- package/src/index.ts +8 -1
- 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/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/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/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 +7 -1
- 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/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/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/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/leaderboard/package.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "leaderboard",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"scripts": {
|
|
6
|
-
"dev": "next dev -p 3333",
|
|
7
|
-
"build": "next build",
|
|
8
|
-
"start": "next start",
|
|
9
|
-
"lint": "next lint"
|
|
10
|
-
},
|
|
11
|
-
"dependencies": {
|
|
12
|
-
"next": "^14.2.31",
|
|
13
|
-
"react": "^18",
|
|
14
|
-
"react-dom": "^18",
|
|
15
|
-
"recharts": "^2.8.0"
|
|
16
|
-
},
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@types/node": "^20",
|
|
19
|
-
"@types/react": "^18",
|
|
20
|
-
"@types/react-dom": "^18",
|
|
21
|
-
"autoprefixer": "^10.0.1",
|
|
22
|
-
"eslint": "^8",
|
|
23
|
-
"eslint-config-next": "14.0.0",
|
|
24
|
-
"postcss": "^8",
|
|
25
|
-
"tailwindcss": "^3.3.0",
|
|
26
|
-
"typescript": "^5"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/** @type {import('tailwindcss').Config} */
|
|
2
|
-
module.exports = {
|
|
3
|
-
content: [
|
|
4
|
-
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
|
|
5
|
-
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
6
|
-
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
7
|
-
],
|
|
8
|
-
theme: {
|
|
9
|
-
extend: {
|
|
10
|
-
colors: {
|
|
11
|
-
background: 'var(--background)',
|
|
12
|
-
foreground: 'var(--foreground)',
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
plugins: [],
|
|
17
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "es5",
|
|
4
|
-
"lib": ["dom", "dom.iterable", "es6"],
|
|
5
|
-
"allowJs": true,
|
|
6
|
-
"skipLibCheck": true,
|
|
7
|
-
"strict": true,
|
|
8
|
-
"noEmit": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"module": "esnext",
|
|
11
|
-
"moduleResolution": "bundler",
|
|
12
|
-
"resolveJsonModule": true,
|
|
13
|
-
"isolatedModules": true,
|
|
14
|
-
"jsx": "preserve",
|
|
15
|
-
"incremental": true,
|
|
16
|
-
"plugins": [
|
|
17
|
-
{
|
|
18
|
-
"name": "next"
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"baseUrl": ".",
|
|
22
|
-
"paths": {
|
|
23
|
-
"@/*": ["./*"]
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
27
|
-
"exclude": ["node_modules"]
|
|
28
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
export interface BenchmarkConfig {
|
|
2
|
-
language: string;
|
|
3
|
-
maxExercises: number;
|
|
4
|
-
model: string;
|
|
5
|
-
provider: string;
|
|
6
|
-
agent?: string;
|
|
7
|
-
limits: BenchmarkLimits;
|
|
8
|
-
outputFile: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface BenchmarkLimits {
|
|
12
|
-
maxTurns: number;
|
|
13
|
-
maxTime: number;
|
|
14
|
-
maxCost: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface ExerciseResult {
|
|
18
|
-
exerciseName: string;
|
|
19
|
-
status: 'success' | 'failure' | 'timeout' | 'cost_limit' | 'turn_limit';
|
|
20
|
-
testResult?: any;
|
|
21
|
-
turns: number;
|
|
22
|
-
timeElapsed: number;
|
|
23
|
-
cost: number;
|
|
24
|
-
startTime: string;
|
|
25
|
-
endTime: string;
|
|
26
|
-
errorMessage?: string;
|
|
27
|
-
finalOutput?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface BenchmarkResults {
|
|
31
|
-
config: BenchmarkConfig;
|
|
32
|
-
commitHash?: string;
|
|
33
|
-
exercises: ExerciseResult[];
|
|
34
|
-
summary: {
|
|
35
|
-
totalExercises: number;
|
|
36
|
-
testableExercises?: number;
|
|
37
|
-
testsPassedCount?: number;
|
|
38
|
-
testsFailedCount?: number;
|
|
39
|
-
testPassRate?: number;
|
|
40
|
-
agentSuccessRate?: number;
|
|
41
|
-
successCount: number;
|
|
42
|
-
failureCount: number;
|
|
43
|
-
timeoutCount: number;
|
|
44
|
-
costLimitCount: number;
|
|
45
|
-
turnLimitCount: number;
|
|
46
|
-
totalTime: number;
|
|
47
|
-
totalCost: number;
|
|
48
|
-
averageTurns: number;
|
|
49
|
-
averageTime: number;
|
|
50
|
-
successRate: number;
|
|
51
|
-
};
|
|
52
|
-
startTime: string;
|
|
53
|
-
endTime: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface LeaderboardEntry {
|
|
57
|
-
model: string;
|
|
58
|
-
provider: string;
|
|
59
|
-
language: string;
|
|
60
|
-
successRate: number;
|
|
61
|
-
totalExercises: number;
|
|
62
|
-
averageCost: number;
|
|
63
|
-
averageTime: number;
|
|
64
|
-
averageTurns: number;
|
|
65
|
-
totalRuns: number;
|
|
66
|
-
lastRun: string;
|
|
67
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { LeaderboardEntry } from '@/types/benchmark';
|
|
2
|
-
|
|
3
|
-
export async function loadLeaderboardData(): Promise<LeaderboardEntry[]> {
|
|
4
|
-
try {
|
|
5
|
-
const response = await fetch('/api/benchmark-data');
|
|
6
|
-
const data = await response.json();
|
|
7
|
-
return data;
|
|
8
|
-
} catch (error) {
|
|
9
|
-
console.error('Error loading benchmark results:', error);
|
|
10
|
-
return [];
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function formatPercentage(value: number): string {
|
|
15
|
-
return `${value.toFixed(1)}%`;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function formatCurrency(value: number): string {
|
|
19
|
-
return `$${value.toFixed(3)}`;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function formatTime(seconds: number): string {
|
|
23
|
-
if (seconds < 60) {
|
|
24
|
-
return `${seconds.toFixed(1)}s`;
|
|
25
|
-
}
|
|
26
|
-
const minutes = Math.floor(seconds / 60);
|
|
27
|
-
const remainingSeconds = seconds % 60;
|
|
28
|
-
return `${minutes}m ${remainingSeconds.toFixed(1)}s`;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function formatNumber(value: number): string {
|
|
32
|
-
return value.toFixed(1);
|
|
33
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
export const definitions = [
|
|
2
|
-
{
|
|
3
|
-
type: "function",
|
|
4
|
-
function: {
|
|
5
|
-
name: "createTask",
|
|
6
|
-
description: "Create a new task in Asana",
|
|
7
|
-
parameters: {
|
|
8
|
-
type: "object",
|
|
9
|
-
positional: true,
|
|
10
|
-
properties: {
|
|
11
|
-
projectId: {
|
|
12
|
-
type: "string",
|
|
13
|
-
description: "The ID of the project where the task will be created",
|
|
14
|
-
},
|
|
15
|
-
taskName: {
|
|
16
|
-
type: "string",
|
|
17
|
-
description: "The name of the task to be created",
|
|
18
|
-
},
|
|
19
|
-
taskNotes: {
|
|
20
|
-
type: "string",
|
|
21
|
-
description: "The notes or description of the task",
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
required: ["projectId", "taskName", "taskNotes"],
|
|
25
|
-
},
|
|
26
|
-
returns: {
|
|
27
|
-
type: "object",
|
|
28
|
-
description: "The created task object",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
type: "function",
|
|
34
|
-
function: {
|
|
35
|
-
name: "updateTask",
|
|
36
|
-
description: "Update an existing task in Asana",
|
|
37
|
-
parameters: {
|
|
38
|
-
type: "object",
|
|
39
|
-
positional: true,
|
|
40
|
-
properties: {
|
|
41
|
-
taskId: {
|
|
42
|
-
type: "string",
|
|
43
|
-
description: "The ID of the task to be updated",
|
|
44
|
-
},
|
|
45
|
-
updates: {
|
|
46
|
-
type: "object",
|
|
47
|
-
description:
|
|
48
|
-
"An object containing the updates to be applied to the task",
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
required: ["taskId", "updates"],
|
|
52
|
-
},
|
|
53
|
-
returns: {
|
|
54
|
-
type: "object",
|
|
55
|
-
description: "The updated task object",
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
type: "function",
|
|
61
|
-
function: {
|
|
62
|
-
name: "searchTasks",
|
|
63
|
-
description: "Search for tasks in Asana based on a search term",
|
|
64
|
-
parameters: {
|
|
65
|
-
type: "object",
|
|
66
|
-
positional: true,
|
|
67
|
-
properties: {
|
|
68
|
-
searchTerm: {
|
|
69
|
-
type: "string",
|
|
70
|
-
description: "The term to search for in task names and notes",
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
required: ["searchTerm"],
|
|
74
|
-
},
|
|
75
|
-
returns: {
|
|
76
|
-
type: "array",
|
|
77
|
-
description: "An array of tasks that match the search term",
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
type: "function",
|
|
83
|
-
function: {
|
|
84
|
-
name: "listProjects",
|
|
85
|
-
description: "List all projects in Asana",
|
|
86
|
-
parameters: {
|
|
87
|
-
type: "object",
|
|
88
|
-
positional: true,
|
|
89
|
-
properties: {},
|
|
90
|
-
required: [],
|
|
91
|
-
},
|
|
92
|
-
returns: {
|
|
93
|
-
type: "array",
|
|
94
|
-
description: "An array of project objects",
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
{
|
|
100
|
-
type: "function",
|
|
101
|
-
function: {
|
|
102
|
-
name: "findTask",
|
|
103
|
-
description: "Find a specific task in Asana by its ID",
|
|
104
|
-
parameters: {
|
|
105
|
-
type: "object",
|
|
106
|
-
positional: true,
|
|
107
|
-
properties: {
|
|
108
|
-
taskId: {
|
|
109
|
-
type: "string",
|
|
110
|
-
description: "The ID of the task to be found",
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
required: ["taskId"],
|
|
114
|
-
},
|
|
115
|
-
returns: {
|
|
116
|
-
type: "object",
|
|
117
|
-
description: "The task object that matches the given ID",
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
type: "function",
|
|
123
|
-
function: {
|
|
124
|
-
name: "myTasks",
|
|
125
|
-
description:
|
|
126
|
-
"Retrieve tasks assigned to the current user in Asana, only shows the uncompleted ones",
|
|
127
|
-
parameters: {
|
|
128
|
-
type: "object",
|
|
129
|
-
positional: true,
|
|
130
|
-
properties: {
|
|
131
|
-
project: {
|
|
132
|
-
type: "string",
|
|
133
|
-
description: "The ID of the project to filter tasks by (optional)",
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
required: [],
|
|
137
|
-
},
|
|
138
|
-
returns: {
|
|
139
|
-
type: "array",
|
|
140
|
-
description: "An array of tasks assigned to the current user",
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
type: "function",
|
|
146
|
-
function: {
|
|
147
|
-
name: "getSubtasks",
|
|
148
|
-
description: "Retrieve all subtasks for a given Asana task.",
|
|
149
|
-
parameters: {
|
|
150
|
-
type: "object",
|
|
151
|
-
positional: true,
|
|
152
|
-
properties: {
|
|
153
|
-
taskId: {
|
|
154
|
-
type: "string",
|
|
155
|
-
description:
|
|
156
|
-
"The ID of the parent task for which to retrieve subtasks.",
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
required: ["taskId"],
|
|
160
|
-
},
|
|
161
|
-
returns: {
|
|
162
|
-
type: "array",
|
|
163
|
-
description:
|
|
164
|
-
"An array of subtasks associated with the specified parent task.",
|
|
165
|
-
},
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
type: "function",
|
|
170
|
-
function: {
|
|
171
|
-
name: "createSubtask",
|
|
172
|
-
description: "Create a new subtask under a given Asana task.",
|
|
173
|
-
parameters: {
|
|
174
|
-
type: "object",
|
|
175
|
-
positional: true,
|
|
176
|
-
properties: {
|
|
177
|
-
taskId: {
|
|
178
|
-
type: "string",
|
|
179
|
-
description:
|
|
180
|
-
"The ID of the parent task under which the subtask will be created.",
|
|
181
|
-
},
|
|
182
|
-
taskName: {
|
|
183
|
-
type: "string",
|
|
184
|
-
description: "The name of the subtask to be created.",
|
|
185
|
-
},
|
|
186
|
-
taskNotes: {
|
|
187
|
-
type: "string",
|
|
188
|
-
description: "The optional notes or description of the subtask.",
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
required: ["taskId", "taskName"],
|
|
192
|
-
},
|
|
193
|
-
returns: {
|
|
194
|
-
type: "object",
|
|
195
|
-
description: "The created subtask object.",
|
|
196
|
-
},
|
|
197
|
-
},
|
|
198
|
-
},
|
|
199
|
-
];
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
const workspace = process.env.ASANA_WORKSPACE;
|
|
2
|
-
class AsanaTools {
|
|
3
|
-
private client = require("asana").ApiClient.instance;
|
|
4
|
-
|
|
5
|
-
constructor(private accessToken: string) {
|
|
6
|
-
this.client.authentications.token = process.env.ASANA_TOKEN;
|
|
7
|
-
this.client.defaultHeaders = {
|
|
8
|
-
"Asana-Enable": "new_user_task_lists,new_goal_memberships",
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async createTask(projectId: string, taskName: string, taskNotes: string) {
|
|
13
|
-
if (!workspace) {
|
|
14
|
-
throw new Error("Need to set ENV Variable ASANA Workspace");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const task = await this.client.tasks.create({
|
|
18
|
-
workspace,
|
|
19
|
-
projects: [projectId],
|
|
20
|
-
name: taskName,
|
|
21
|
-
notes: taskNotes,
|
|
22
|
-
});
|
|
23
|
-
console.log(`Task created: ${task.permalink_url}`);
|
|
24
|
-
return task;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async updateTask(taskId: string, updates: object) {
|
|
28
|
-
const task = await this.client.tasks.updateTask(taskId, updates);
|
|
29
|
-
console.log(`Task updated: ${task.permalink_url}`);
|
|
30
|
-
return task;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async searchTasks(searchTerm: string) {
|
|
34
|
-
if (!workspace) {
|
|
35
|
-
throw new Error("Need to set ENV Variable ASANA Workspace");
|
|
36
|
-
}
|
|
37
|
-
searchTerm = searchTerm.toLowerCase();
|
|
38
|
-
const allTasks = await this.client.tasks.findAll({
|
|
39
|
-
opt_expand: "notes",
|
|
40
|
-
workspace,
|
|
41
|
-
});
|
|
42
|
-
const found = allTasks.data.filter(
|
|
43
|
-
(t) =>
|
|
44
|
-
t.notes.toLowerCase().includes(searchTerm) ||
|
|
45
|
-
t.name.toLowerCase().includes(searchTerm)
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
console.log("Found", found.length, "tasks");
|
|
49
|
-
return found;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async findTask(taskId: string) {
|
|
53
|
-
const task = await this.client.tasks.findById(taskId);
|
|
54
|
-
console.log(`Task found: ${task.permalink_url}`);
|
|
55
|
-
return task;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async getSubtasks(taskId: string) {
|
|
59
|
-
const tasks = await this.client.tasks.subtasks(taskId);
|
|
60
|
-
return tasks.data;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async createSubtask(taskId: string, taskName: string, taskNotes = "") {
|
|
64
|
-
const task = await this.client.tasks.addSubtask(taskId, {
|
|
65
|
-
name: taskName,
|
|
66
|
-
notes: taskNotes,
|
|
67
|
-
});
|
|
68
|
-
return task;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async myTasks(project?: string) {
|
|
72
|
-
const me = await this.client.users.me();
|
|
73
|
-
const tasks = await this.client.tasks.findAll({
|
|
74
|
-
assignee: Number(me.gid),
|
|
75
|
-
project,
|
|
76
|
-
workspace,
|
|
77
|
-
opt_expand: "completed",
|
|
78
|
-
});
|
|
79
|
-
return tasks.data.filter((t) => !t.completed);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async listProjects() {
|
|
83
|
-
if (!workspace) {
|
|
84
|
-
throw new Error("Need to set ENV Variable ASANA Workspace");
|
|
85
|
-
}
|
|
86
|
-
const allData = [];
|
|
87
|
-
let projects = await this.client.projects.findAll({
|
|
88
|
-
workspace,
|
|
89
|
-
archived: false,
|
|
90
|
-
});
|
|
91
|
-
do {
|
|
92
|
-
allData.push(...projects.data);
|
|
93
|
-
projects = await projects.nextPage();
|
|
94
|
-
} while (projects && projects?.data?.length);
|
|
95
|
-
|
|
96
|
-
return allData;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const asana = new AsanaTools(process.env.ASANA_TOKEN);
|
|
101
|
-
export const createTask = asana.createTask.bind(asana);
|
|
102
|
-
export const updateTask = asana.updateTask.bind(asana);
|
|
103
|
-
export const searchTasks = asana.searchTasks.bind(asana);
|
|
104
|
-
export const findTask = asana.findTask.bind(asana);
|
|
105
|
-
export const getSubtasks = asana.getSubtasks.bind(asana);
|
|
106
|
-
export const createSubtask = asana.createSubtask.bind(asana);
|
|
107
|
-
export const myTasks = asana.myTasks.bind(asana);
|
|
108
|
-
export const listProjects = asana.listProjects.bind(asana);
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import { fileExists } from "../../../utils";
|
|
3
|
-
import { services, ToolsService } from "../../../services";
|
|
4
|
-
import { LanguageAgnosticParser } from "../../../plugins/tree-sitter/parser";
|
|
5
|
-
import { TreeEditor } from "../../../plugins/tree-sitter/editor";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Append a child node to a specific path in a file using tree-sitter AST parsing
|
|
9
|
-
*/
|
|
10
|
-
export async function astAppendNode(filePath: string, parentPath: string, newContent: string): Promise<string> {
|
|
11
|
-
// Get context from bound ToolsService
|
|
12
|
-
const toolService = (
|
|
13
|
-
this instanceof ToolsService ? this : services().Tools
|
|
14
|
-
) as ToolsService;
|
|
15
|
-
|
|
16
|
-
const context = toolService.getContext();
|
|
17
|
-
|
|
18
|
-
const exists = await fileExists(filePath);
|
|
19
|
-
if (!exists) {
|
|
20
|
-
throw new Error(`File not found: ${filePath}`);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Read original content for event emission
|
|
24
|
-
let originalContent = "";
|
|
25
|
-
try {
|
|
26
|
-
originalContent = fs.readFileSync(filePath, "utf8");
|
|
27
|
-
} catch (error) {
|
|
28
|
-
throw new Error(`Failed to read file ${filePath}: ${error.message}`);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Emit pre-edit blocking event
|
|
32
|
-
if (context.Events) {
|
|
33
|
-
await context.Events.emitBlocking("file:pre-edit", {
|
|
34
|
-
filePath,
|
|
35
|
-
operation: "ast-append-node",
|
|
36
|
-
content: newContent,
|
|
37
|
-
originalContent,
|
|
38
|
-
astParentPath: parentPath,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
if (!LanguageAgnosticParser.supportsFile(filePath)) {
|
|
44
|
-
throw new Error(`Unsupported file type for AST parsing: ${filePath}`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const parser = LanguageAgnosticParser.createParserForFile(filePath);
|
|
48
|
-
const editor = new TreeEditor(parser, originalContent);
|
|
49
|
-
const updatedEditor = editor.appendChild(parentPath, newContent);
|
|
50
|
-
const updatedContent = updatedEditor.getCurrentText();
|
|
51
|
-
|
|
52
|
-
// Write the updated content back to the file
|
|
53
|
-
fs.writeFileSync(filePath, updatedContent, "utf8");
|
|
54
|
-
|
|
55
|
-
// Emit post-edit blocking event (only on success)
|
|
56
|
-
let eventResults: any[] = [];
|
|
57
|
-
if (context.Events) {
|
|
58
|
-
eventResults = await context.Events.emitBlocking("file:post-edit", {
|
|
59
|
-
filePath,
|
|
60
|
-
operation: "ast-append-node",
|
|
61
|
-
content: newContent,
|
|
62
|
-
originalContent,
|
|
63
|
-
updatedContent,
|
|
64
|
-
astParentPath: parentPath,
|
|
65
|
-
success: true,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const result = {
|
|
70
|
-
file: filePath,
|
|
71
|
-
parentPath,
|
|
72
|
-
action: "appendChild",
|
|
73
|
-
success: true,
|
|
74
|
-
message: `Successfully appended child node to path: ${parentPath}`,
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// Format event results
|
|
78
|
-
let eventResultsText = "";
|
|
79
|
-
if (eventResults && eventResults.length > 0) {
|
|
80
|
-
eventResultsText =
|
|
81
|
-
"\n\nAdditional Information:\n" +
|
|
82
|
-
JSON.stringify(eventResults, null, 2);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return JSON.stringify(result, null, 2) + eventResultsText;
|
|
86
|
-
} catch (error: any) {
|
|
87
|
-
// Do NOT emit post-edit event on error
|
|
88
|
-
throw new Error(`Failed to append node in ${filePath}: ${error.message}`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import { fileExists } from "../../../utils";
|
|
3
|
-
import { services, ToolsService } from "../../../services";
|
|
4
|
-
import { LanguageAgnosticParser } from "../../../plugins/tree-sitter/parser";
|
|
5
|
-
import { TreeEditor } from "../../../plugins/tree-sitter/editor";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Delete a node at a specific path in a file using tree-sitter AST parsing
|
|
9
|
-
*/
|
|
10
|
-
export async function astDeleteNode(filePath: string, path: string): Promise<string> {
|
|
11
|
-
// Get context from bound ToolsService
|
|
12
|
-
const toolService = (
|
|
13
|
-
this instanceof ToolsService ? this : services().Tools
|
|
14
|
-
) as ToolsService;
|
|
15
|
-
|
|
16
|
-
const context = toolService.getContext();
|
|
17
|
-
|
|
18
|
-
const exists = await fileExists(filePath);
|
|
19
|
-
if (!exists) {
|
|
20
|
-
throw new Error(`File not found: ${filePath}`);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Read original content for event emission
|
|
24
|
-
let originalContent = "";
|
|
25
|
-
try {
|
|
26
|
-
originalContent = fs.readFileSync(filePath, "utf8");
|
|
27
|
-
} catch (error) {
|
|
28
|
-
throw new Error(`Failed to read file ${filePath}: ${error.message}`);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Emit pre-edit blocking event
|
|
32
|
-
if (context.Events) {
|
|
33
|
-
await context.Events.emitBlocking("file:pre-edit", {
|
|
34
|
-
filePath,
|
|
35
|
-
operation: "ast-delete-node",
|
|
36
|
-
originalContent,
|
|
37
|
-
astPath: path,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
if (!LanguageAgnosticParser.supportsFile(filePath)) {
|
|
43
|
-
throw new Error(`Unsupported file type for AST parsing: ${filePath}`);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const parser = LanguageAgnosticParser.createParserForFile(filePath);
|
|
47
|
-
const editor = new TreeEditor(parser, originalContent);
|
|
48
|
-
const updatedEditor = editor.deleteNodeByPath(path);
|
|
49
|
-
const updatedContent = updatedEditor.getCurrentText();
|
|
50
|
-
|
|
51
|
-
// Write the updated content back to the file
|
|
52
|
-
fs.writeFileSync(filePath, updatedContent, "utf8");
|
|
53
|
-
|
|
54
|
-
// Emit post-edit blocking event (only on success)
|
|
55
|
-
let eventResults: any[] = [];
|
|
56
|
-
if (context.Events) {
|
|
57
|
-
eventResults = await context.Events.emitBlocking("file:post-edit", {
|
|
58
|
-
filePath,
|
|
59
|
-
operation: "ast-delete-node",
|
|
60
|
-
originalContent,
|
|
61
|
-
updatedContent,
|
|
62
|
-
astPath: path,
|
|
63
|
-
success: true,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const result = {
|
|
68
|
-
file: filePath,
|
|
69
|
-
path,
|
|
70
|
-
action: "delete",
|
|
71
|
-
success: true,
|
|
72
|
-
message: `Successfully deleted node at path: ${path}`,
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
// Format event results
|
|
76
|
-
let eventResultsText = "";
|
|
77
|
-
if (eventResults && eventResults.length > 0) {
|
|
78
|
-
eventResultsText =
|
|
79
|
-
"\n\nAdditional Information:\n" +
|
|
80
|
-
JSON.stringify(eventResults, null, 2);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return JSON.stringify(result, null, 2) + eventResultsText;
|
|
84
|
-
} catch (error: any) {
|
|
85
|
-
// Do NOT emit post-edit event on error
|
|
86
|
-
throw new Error(`Failed to delete node in ${filePath}: ${error.message}`);
|
|
87
|
-
}
|
|
88
|
-
}
|