@tyvm/knowhow 0.0.90 → 0.0.92
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 +30 -0
- package/bin/knowhow.js +1 -1
- package/package.json +8 -34
- package/src/agents/configurable/ConfigAgent.ts +2 -2
- 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/chat/modules/AgentModule.ts +0 -1
- package/src/chat/types.ts +1 -1
- 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 +15 -20
- 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/EmbeddingsService.ts +70 -0
- package/src/services/KnowhowClient.ts +34 -34
- package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
- package/src/services/S3.ts +19 -87
- package/src/services/index.ts +8 -8
- package/src/services/modules/index.ts +12 -3
- package/src/services/modules/types.ts +8 -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 +12 -4
- package/tests/unit/plugins/pluginLoading.test.ts +6 -6
- package/ts_build/package.json +8 -34
- 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/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/types.d.ts +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 +15 -14
- 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/EmbeddingsService.d.ts +14 -0
- package/ts_build/src/services/EmbeddingsService.js +33 -0
- package/ts_build/src/services/EmbeddingsService.js.map +1 -0
- 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.d.ts +0 -4
- package/ts_build/src/services/S3.js +14 -60
- package/ts_build/src/services/S3.js.map +1 -1
- package/ts_build/src/services/index.d.ts +6 -5
- package/ts_build/src/services/index.js +6 -6
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/modules/index.js +12 -3
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/services/modules/types.d.ts +8 -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 +11 -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/src/services/GitHub.ts +0 -59
- 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/plugins/linear.ts
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { LinearClient } from "@linear/sdk";
|
|
2
|
-
import { PluginBase, PluginMeta } from "./PluginBase";
|
|
3
|
-
import { PluginContext } from "./types";
|
|
4
|
-
import { MinimalEmbedding } from "../types";
|
|
5
|
-
|
|
6
|
-
export class LinearPlugin extends PluginBase {
|
|
7
|
-
static readonly meta: PluginMeta = {
|
|
8
|
-
key: "linear",
|
|
9
|
-
name: "Linear Plugin",
|
|
10
|
-
requires: ["LINEAR_API_KEY"],
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
meta = LinearPlugin.meta;
|
|
14
|
-
linearClient: LinearClient;
|
|
15
|
-
|
|
16
|
-
constructor(context: PluginContext) {
|
|
17
|
-
super(context);
|
|
18
|
-
|
|
19
|
-
if (!this.isEnabled()) return;
|
|
20
|
-
this.linearClient = new LinearClient({
|
|
21
|
-
apiKey: process.env.LINEAR_API_KEY,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async embed(userPrompt: string): Promise<MinimalEmbedding[]> {
|
|
26
|
-
const urls = this.extractTaskUrls(userPrompt);
|
|
27
|
-
const tasksData = await this.getTasksFromUrls(urls);
|
|
28
|
-
const tasksDataFiltered = tasksData.filter((task) => task !== null);
|
|
29
|
-
|
|
30
|
-
const tasksEmbeddings = tasksDataFiltered.map((task) => {
|
|
31
|
-
return {
|
|
32
|
-
id: task.url,
|
|
33
|
-
text: this.getTaskString(task),
|
|
34
|
-
metadata: {
|
|
35
|
-
task: JSON.stringify(task),
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const projectUrls = this.extractProjectUrls(userPrompt);
|
|
41
|
-
const projectTasks = await this.getTasksFromProjectUrls(projectUrls);
|
|
42
|
-
const projectTasksFiltered = projectTasks.filter((t) => t !== null);
|
|
43
|
-
|
|
44
|
-
const projectTaskEmbeddings = projectTasksFiltered
|
|
45
|
-
.map((t) => {
|
|
46
|
-
return {
|
|
47
|
-
id: t.url,
|
|
48
|
-
text: this.getTaskString(t),
|
|
49
|
-
metadata: {
|
|
50
|
-
task: JSON.stringify(t),
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
})
|
|
54
|
-
.flat();
|
|
55
|
-
|
|
56
|
-
const teamUrls = this.extractTeamUrls(userPrompt);
|
|
57
|
-
const teamTasks = await this.getTasksFromTeamUrls(teamUrls);
|
|
58
|
-
const teamTasksFiltered = teamTasks.filter((t) => t !== null);
|
|
59
|
-
|
|
60
|
-
const teamTaskEmbeddings = teamTasksFiltered
|
|
61
|
-
.map((t) => {
|
|
62
|
-
return {
|
|
63
|
-
id: t.url,
|
|
64
|
-
text: this.getTaskString(t),
|
|
65
|
-
metadata: {
|
|
66
|
-
task: JSON.stringify(t),
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
})
|
|
70
|
-
.flat();
|
|
71
|
-
|
|
72
|
-
return tasksEmbeddings
|
|
73
|
-
.concat(projectTaskEmbeddings)
|
|
74
|
-
.concat(teamTaskEmbeddings);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async getIssueData(issueId: string) {
|
|
78
|
-
try {
|
|
79
|
-
const issue = await this.linearClient.issue(issueId);
|
|
80
|
-
return issue;
|
|
81
|
-
} catch (error) {
|
|
82
|
-
this.log(`Error fetching Linear issue: ${error}`, "error");
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async getTaskFromUrl(url: string) {
|
|
88
|
-
const issueId = this.getIdFromUrl(url);
|
|
89
|
-
if (issueId) {
|
|
90
|
-
this.log(`Fetching Linear issue ${issueId}`);
|
|
91
|
-
return await this.getIssueData(issueId);
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async getTasksFromUrls(urls: string[]) {
|
|
97
|
-
const tasks = await Promise.all(
|
|
98
|
-
urls.map(async (url) => {
|
|
99
|
-
return this.getTaskFromUrl(url);
|
|
100
|
-
})
|
|
101
|
-
);
|
|
102
|
-
return tasks;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
extractTeamUrls(userPrompt: string): string[] {
|
|
106
|
-
const urlRegex = /https:\/\/linear\.app\/[^\/]+\/team\/[^\/]+\/[^\/]+/g;
|
|
107
|
-
const matches = userPrompt.match(urlRegex);
|
|
108
|
-
return matches || [];
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
getTeamIdFromUrl(url: string): string {
|
|
112
|
-
const urlRegex = /https:\/\/linear\.app\/[^\/]+\/team\/([^\/]+)\/[^\/]+/g;
|
|
113
|
-
const match = urlRegex.exec(url);
|
|
114
|
-
if (match && match[1]) {
|
|
115
|
-
return match[1];
|
|
116
|
-
}
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
extractProjectUrls(userPrompt: string): string[] {
|
|
121
|
-
const urlRegex = /https:\/\/linear\.app\/[^\/]+\/project\/[^\/]+\/[^\/]+/g;
|
|
122
|
-
const matches = userPrompt.match(urlRegex);
|
|
123
|
-
return matches || [];
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
getProjectIdFromUrl(url: string): string {
|
|
127
|
-
const urlRegex =
|
|
128
|
-
/https:\/\/linear\.app\/[^\/]+\/project\/([^\/]+)\/[^\/]+/g;
|
|
129
|
-
const match = urlRegex.exec(url);
|
|
130
|
-
if (match && match[1]) {
|
|
131
|
-
const parts = match[1].split("-");
|
|
132
|
-
return parts[parts.length - 1];
|
|
133
|
-
}
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async getTasksForProject(projectId: string) {
|
|
138
|
-
this.log(`Project ID: ${projectId}`);
|
|
139
|
-
let tasks = await this.linearClient.issues({
|
|
140
|
-
filter: {
|
|
141
|
-
project: { slugId: { eq: projectId } },
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
let allTasks = tasks.nodes;
|
|
145
|
-
|
|
146
|
-
while (tasks.pageInfo.hasNextPage) {
|
|
147
|
-
tasks = await tasks.fetchNext();
|
|
148
|
-
allTasks = allTasks.concat(tasks.nodes);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return allTasks;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async getTasksFromProjectUrls(urls: string[]) {
|
|
155
|
-
const tasks = await Promise.all(
|
|
156
|
-
urls.map(async (url) => {
|
|
157
|
-
return this.getTasksForProject(this.getProjectIdFromUrl(url));
|
|
158
|
-
})
|
|
159
|
-
);
|
|
160
|
-
return tasks.flat();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
async getTasksForTeam(teamId: string) {
|
|
164
|
-
this.log(`Team ID: ${teamId}`);
|
|
165
|
-
let tasks = await this.linearClient.issues({
|
|
166
|
-
filter: {
|
|
167
|
-
team: { key: { eq: teamId } },
|
|
168
|
-
},
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
let allTasks = tasks.nodes;
|
|
172
|
-
|
|
173
|
-
while (tasks.pageInfo.hasNextPage) {
|
|
174
|
-
tasks = await tasks.fetchNext();
|
|
175
|
-
allTasks = allTasks.concat(tasks.nodes);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
return allTasks;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
async getTasksFromTeamUrls(urls: string[]) {
|
|
182
|
-
const tasks = await Promise.all(
|
|
183
|
-
urls.map(async (url) => {
|
|
184
|
-
return this.getTasksForTeam(this.getTeamIdFromUrl(url));
|
|
185
|
-
})
|
|
186
|
-
);
|
|
187
|
-
return tasks.flat();
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
extractTaskUrls(userPrompt: string): string[] {
|
|
191
|
-
const urlRegex = /https:\/\/linear\.app\/[^\/]+\/issue\/[^\/]+\/[^\/]+/g;
|
|
192
|
-
const matches = userPrompt.match(urlRegex);
|
|
193
|
-
if (!matches) {
|
|
194
|
-
return [];
|
|
195
|
-
}
|
|
196
|
-
return matches;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
getIdFromUrl(url: string): string {
|
|
200
|
-
const urlRegex = /https:\/\/linear\.app\/[^\/]+\/issue\/([^\/]+)\/[^\/]+/g;
|
|
201
|
-
const match = urlRegex.exec(url);
|
|
202
|
-
if (match && match[1]) {
|
|
203
|
-
return match[1];
|
|
204
|
-
}
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
getTaskString(task: any): string {
|
|
209
|
-
return `Issue: ${task.identifier}\nTitle: ${task.title}\nURL: ${task.url} \nDescription: ${task.description}`;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
async call(userPrompt: string): Promise<string> {
|
|
213
|
-
const urls = this.extractTaskUrls(userPrompt);
|
|
214
|
-
if (!urls) {
|
|
215
|
-
return "LINEAR PLUGIN: No issues found";
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const issuesData = await this.getTasksFromUrls(urls);
|
|
219
|
-
const issuesDataFiltered = issuesData.filter((issue) => issue !== null);
|
|
220
|
-
|
|
221
|
-
if (issuesDataFiltered.length === 0) {
|
|
222
|
-
return "LINEAR PLUGIN: No issues found";
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const markdownIssues = issuesDataFiltered
|
|
226
|
-
.map((issue) => this.getTaskString(issue))
|
|
227
|
-
.join("\n\n");
|
|
228
|
-
return `LINEAR PLUGIN: The following issues were loaded:\n\n${markdownIssues}`;
|
|
229
|
-
}
|
|
230
|
-
}
|
package/src/plugins/notion.ts
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { Client } from "@notionhq/client";
|
|
2
|
-
import { PluginBase, PluginMeta } from "./PluginBase";
|
|
3
|
-
import { PluginContext } from "./types";
|
|
4
|
-
import { PageObjectResponse } from "@notionhq/client/build/src/api-endpoints";
|
|
5
|
-
import { Embeddable, MinimalEmbedding } from "../types";
|
|
6
|
-
|
|
7
|
-
export class NotionPlugin extends PluginBase {
|
|
8
|
-
static readonly meta: PluginMeta = {
|
|
9
|
-
key: "notion",
|
|
10
|
-
name: "Notion Plugin",
|
|
11
|
-
requires: ["NOTION_TOKEN"]
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
meta = NotionPlugin.meta;
|
|
15
|
-
notionClient: Client;
|
|
16
|
-
|
|
17
|
-
constructor(context: PluginContext) {
|
|
18
|
-
super(context);
|
|
19
|
-
|
|
20
|
-
if (!this.isEnabled()) return;
|
|
21
|
-
this.notionClient = new Client({
|
|
22
|
-
auth: process.env.NOTION_TOKEN,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
extractUrls(userPrompt: string): string[] {
|
|
27
|
-
const notionUrlRegex = /https:\/\/www\.notion\.so\/[^\s]+/g;
|
|
28
|
-
const matches = userPrompt.match(notionUrlRegex);
|
|
29
|
-
return matches || [];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
getIdFromUrl(url: string): string {
|
|
33
|
-
return url.split("-").pop() || "";
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
findKeyInObject<T>(obj: T, searchKey = "plain_text") {
|
|
37
|
-
if (!obj) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
const keys = Object.keys(obj);
|
|
41
|
-
for (const key of keys) {
|
|
42
|
-
if (key === searchKey) {
|
|
43
|
-
return obj[key];
|
|
44
|
-
} else if (typeof obj[key] === "object") {
|
|
45
|
-
const result = this.findKeyInObject(obj[key], searchKey);
|
|
46
|
-
if (result) {
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
async getAllChildBlocks(
|
|
53
|
-
pageId: string,
|
|
54
|
-
maxDepth = 1,
|
|
55
|
-
currentDepth = 1,
|
|
56
|
-
processed = {}
|
|
57
|
-
) {
|
|
58
|
-
if (processed[pageId] || currentDepth > maxDepth) {
|
|
59
|
-
return { results: [] };
|
|
60
|
-
}
|
|
61
|
-
this.log(`Fetching all blocks for page ${pageId} at depth ${currentDepth}`);
|
|
62
|
-
processed[pageId] = true;
|
|
63
|
-
const response = await this.notionClient.blocks.children.list({
|
|
64
|
-
block_id: pageId,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
let cursor = response.next_cursor;
|
|
68
|
-
while (cursor) {
|
|
69
|
-
this.log("Fetching more blocks");
|
|
70
|
-
const childResponse = await this.notionClient.blocks.children.list({
|
|
71
|
-
block_id: pageId,
|
|
72
|
-
start_cursor: cursor,
|
|
73
|
-
});
|
|
74
|
-
response.results.push(...childResponse.results);
|
|
75
|
-
cursor = childResponse.next_cursor;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
for (const block of response.results) {
|
|
79
|
-
if ("has_children" in block && block.has_children) {
|
|
80
|
-
const childBlocks = await this.getAllChildBlocks(
|
|
81
|
-
block.id,
|
|
82
|
-
maxDepth,
|
|
83
|
-
currentDepth + 1,
|
|
84
|
-
processed
|
|
85
|
-
);
|
|
86
|
-
response.results.push(...childBlocks.results);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
response.has_more = false;
|
|
91
|
-
response.next_cursor = null;
|
|
92
|
-
|
|
93
|
-
return response;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async embed(user_input: string) {
|
|
97
|
-
const embeddings = new Array<MinimalEmbedding>();
|
|
98
|
-
const urls = this.extractUrls(user_input);
|
|
99
|
-
const results = await this.getPagesFromUrls(urls);
|
|
100
|
-
if (!results) {
|
|
101
|
-
return embeddings;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
for (const result of results) {
|
|
105
|
-
let { page, blocks } = result;
|
|
106
|
-
const childPages = blocks.results.filter(
|
|
107
|
-
(b) => "has_children" in b && b.has_children
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
this.log(JSON.stringify(results, null, 2));
|
|
111
|
-
|
|
112
|
-
const childBlocks = await Promise.all(
|
|
113
|
-
childPages.map(async (childPage) => {
|
|
114
|
-
const blocks = await this.getAllChildBlocks(childPage.id);
|
|
115
|
-
return { childPage, blocks };
|
|
116
|
-
})
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
for (const child of childBlocks) {
|
|
120
|
-
const title =
|
|
121
|
-
"child_page" in child.childPage && child.childPage.child_page;
|
|
122
|
-
embeddings.push({
|
|
123
|
-
id: child.childPage.id,
|
|
124
|
-
text: JSON.stringify(
|
|
125
|
-
child.blocks.results.map((b) => this.findKeyInObject(b))
|
|
126
|
-
),
|
|
127
|
-
metadata: {
|
|
128
|
-
...title,
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
this.log(JSON.stringify(embeddings, null, 2));
|
|
135
|
-
return embeddings;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async getPageEmbedding(page: PageObjectResponse) {
|
|
139
|
-
let id = page.id;
|
|
140
|
-
let content = JSON.stringify(page);
|
|
141
|
-
|
|
142
|
-
return { id, content };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async getPageFromUrl(url: string) {
|
|
146
|
-
const pageId = url.split("-").pop();
|
|
147
|
-
if (pageId) {
|
|
148
|
-
this.log(`Fetching Notion page ${pageId}`);
|
|
149
|
-
const page = await this.notionClient.pages.retrieve({ page_id: pageId });
|
|
150
|
-
const blocks = await this.getAllChildBlocks(page.id);
|
|
151
|
-
return { page, blocks };
|
|
152
|
-
}
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
async getPagesFromUrls(urls: string[]) {
|
|
157
|
-
const pages = await Promise.all(
|
|
158
|
-
urls.map(async (url) => {
|
|
159
|
-
return this.getPageFromUrl(url);
|
|
160
|
-
})
|
|
161
|
-
);
|
|
162
|
-
return pages;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async call(userPrompt: string): Promise<string> {
|
|
166
|
-
const urls = this.extractUrls(userPrompt);
|
|
167
|
-
const pages = await this.getPagesFromUrls(urls);
|
|
168
|
-
const pagesDataFiltered = pages.filter((page) => page !== null);
|
|
169
|
-
if (pagesDataFiltered.length === 0) {
|
|
170
|
-
return "NOTION PLUGIN: No pages found";
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const markdownPages = pagesDataFiltered
|
|
174
|
-
.map((page) => `### Page: ${JSON.stringify(page, null, 2)}\n-`)
|
|
175
|
-
.join("\n\n");
|
|
176
|
-
this.log(markdownPages);
|
|
177
|
-
return `NOTION PLUGIN: The following pages were loaded:\n\n${markdownPages}`;
|
|
178
|
-
}
|
|
179
|
-
}
|