@splicr/mcp-server 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +30 -36
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +167 -20
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +0 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -22
- package/dist/config.js.map +1 -1
- package/dist/lib/api-client.d.ts +54 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +56 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/embedding.d.ts +3 -0
- package/dist/lib/embedding.d.ts.map +1 -0
- package/dist/lib/embedding.js +44 -0
- package/dist/lib/embedding.js.map +1 -0
- package/dist/lib/project-detector.d.ts.map +1 -1
- package/dist/lib/project-detector.js +122 -38
- package/dist/lib/project-detector.js.map +1 -1
- package/dist/tools/get-project-context.d.ts.map +1 -1
- package/dist/tools/get-project-context.js +13 -26
- package/dist/tools/get-project-context.js.map +1 -1
- package/dist/tools/get-recent-insights.d.ts.map +1 -1
- package/dist/tools/get-recent-insights.js +7 -28
- package/dist/tools/get-recent-insights.js.map +1 -1
- package/dist/tools/retry-failed.d.ts.map +1 -1
- package/dist/tools/retry-failed.js +5 -41
- package/dist/tools/retry-failed.js.map +1 -1
- package/dist/tools/save-from-agent.d.ts +1 -1
- package/dist/tools/save-from-agent.d.ts.map +1 -1
- package/dist/tools/save-from-agent.js +16 -58
- package/dist/tools/save-from-agent.js.map +1 -1
- package/dist/tools/search-knowledge.d.ts.map +1 -1
- package/dist/tools/search-knowledge.js +10 -96
- package/dist/tools/search-knowledge.js.map +1 -1
- package/package.json +1 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { geminiApiKey } from './supabase.js';
|
|
2
|
+
/** Generate a 768-dim embedding vector using Gemini. Retries once on 429/5xx. */
|
|
3
|
+
export async function generateEmbedding(text) {
|
|
4
|
+
if (!geminiApiKey) {
|
|
5
|
+
throw new Error('GEMINI_API_KEY is not configured. Set it in ~/.splicr/config.json or environment.');
|
|
6
|
+
}
|
|
7
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
8
|
+
try {
|
|
9
|
+
const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent';
|
|
10
|
+
const response = await fetch(url, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'x-goog-api-key': geminiApiKey,
|
|
15
|
+
},
|
|
16
|
+
signal: AbortSignal.timeout(10000),
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
model: 'models/gemini-embedding-001',
|
|
19
|
+
content: { parts: [{ text }] },
|
|
20
|
+
outputDimensionality: 768,
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const errText = await response.text();
|
|
25
|
+
if (attempt === 0 && (response.status === 429 || response.status >= 500)) {
|
|
26
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Gemini embedding failed (${response.status}): ${errText}`);
|
|
30
|
+
}
|
|
31
|
+
const result = await response.json();
|
|
32
|
+
return result.embedding.values;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (attempt === 0) {
|
|
36
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw new Error('Gemini embedding failed after retries');
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/lib/embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACvG,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,2FAA2F,CAAC;YACxG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,YAAY;iBAC/B;gBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;gBAClC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,6BAA6B;oBACpC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;oBAC9B,oBAAoB,EAAE,GAAG;iBAC1B,CAAC;aACH,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;oBACzE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC5C,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyC,CAAC;YAC5E,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5C,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../src/lib/project-detector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../src/lib/project-detector.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;CAClC;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmChF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO1D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAInD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { execSync } from 'child_process';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { resolveProject } from './api-client.js';
|
|
4
5
|
/** Normalize path for consistent DB lookups across Windows/WSL/Mac */
|
|
5
6
|
export function normalizePath(p) {
|
|
6
7
|
return p
|
|
@@ -9,46 +10,36 @@ export function normalizePath(p) {
|
|
|
9
10
|
.replace(/^([A-Z]):/, (_, d) => `${d.toLowerCase()}:`); // C: → c:
|
|
10
11
|
}
|
|
11
12
|
export async function detectProject(cwd) {
|
|
12
|
-
const { supabase, userId } = await getSupabase();
|
|
13
13
|
const normalizedCwd = normalizePath(cwd);
|
|
14
|
-
// 1. Direct path match (try both raw and normalized)
|
|
15
|
-
const { data: byPath } = await supabase
|
|
16
|
-
.from('projects')
|
|
17
|
-
.select('id, name')
|
|
18
|
-
.eq('user_id', userId)
|
|
19
|
-
.eq('local_path', normalizedCwd)
|
|
20
|
-
.single();
|
|
21
|
-
if (byPath)
|
|
22
|
-
return { ...byPath, confidence: 'exact' };
|
|
23
|
-
// 2. Git remote match
|
|
24
14
|
const gitRemote = getGitRemoteUrl(cwd);
|
|
25
|
-
|
|
26
|
-
const normalized = normalizeGitUrl(gitRemote);
|
|
27
|
-
const { data: byRepo } = await supabase
|
|
28
|
-
.from('projects')
|
|
29
|
-
.select('id, name')
|
|
30
|
-
.eq('user_id', userId)
|
|
31
|
-
.eq('github_repo_url', normalized)
|
|
32
|
-
.single();
|
|
33
|
-
if (byRepo)
|
|
34
|
-
return { ...byRepo, confidence: 'exact' };
|
|
35
|
-
}
|
|
36
|
-
// 3. Fuzzy match by directory name
|
|
15
|
+
const normalizedRemote = gitRemote ? normalizeGitUrl(gitRemote) : undefined;
|
|
37
16
|
const dirName = normalizedCwd.split('/').pop()?.toLowerCase();
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
17
|
+
// Build auto-register data from local files
|
|
18
|
+
const autoRegister = {
|
|
19
|
+
name: detectProjectName(cwd),
|
|
20
|
+
description: detectDescription(cwd),
|
|
21
|
+
tech_stack: detectTechStack(cwd),
|
|
22
|
+
local_path: normalizedCwd,
|
|
23
|
+
github_repo_url: normalizedRemote,
|
|
24
|
+
};
|
|
25
|
+
try {
|
|
26
|
+
const result = await resolveProject({
|
|
27
|
+
local_path: normalizedCwd,
|
|
28
|
+
git_remote_url: normalizedRemote,
|
|
29
|
+
dir_name: dirName,
|
|
30
|
+
auto_register: autoRegister,
|
|
31
|
+
});
|
|
32
|
+
if (result) {
|
|
33
|
+
return {
|
|
34
|
+
id: result.id,
|
|
35
|
+
name: result.name,
|
|
36
|
+
confidence: result.confidence,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// API unavailable — can't resolve project
|
|
47
42
|
}
|
|
48
|
-
// 4. Auto-register from local files
|
|
49
|
-
const registered = await autoRegisterProject(cwd);
|
|
50
|
-
if (registered)
|
|
51
|
-
return { ...registered, confidence: 'inferred' };
|
|
52
43
|
return null;
|
|
53
44
|
}
|
|
54
45
|
export function getGitRemoteUrl(cwd) {
|
|
@@ -65,4 +56,97 @@ export function normalizeGitUrl(url) {
|
|
|
65
56
|
.replace(/^git@github\.com:/, 'https://github.com/')
|
|
66
57
|
.replace(/\.git$/, '');
|
|
67
58
|
}
|
|
59
|
+
function detectProjectName(cwd) {
|
|
60
|
+
const pkgPath = join(cwd, 'package.json');
|
|
61
|
+
if (existsSync(pkgPath)) {
|
|
62
|
+
try {
|
|
63
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
64
|
+
if (pkg.name)
|
|
65
|
+
return pkg.name.replace(/^@[^/]+\//, '');
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore */ }
|
|
68
|
+
}
|
|
69
|
+
return cwd.replace(/\\/g, '/').split('/').pop() || 'unnamed-project';
|
|
70
|
+
}
|
|
71
|
+
function detectDescription(cwd) {
|
|
72
|
+
for (const file of ['CLAUDE.md', 'README.md']) {
|
|
73
|
+
const filePath = join(cwd, file);
|
|
74
|
+
if (existsSync(filePath)) {
|
|
75
|
+
try {
|
|
76
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
77
|
+
const desc = extractFirstParagraph(content);
|
|
78
|
+
if (desc)
|
|
79
|
+
return desc;
|
|
80
|
+
}
|
|
81
|
+
catch { /* ignore */ }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const pkgPath = join(cwd, 'package.json');
|
|
85
|
+
if (existsSync(pkgPath)) {
|
|
86
|
+
try {
|
|
87
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
88
|
+
if (pkg.description)
|
|
89
|
+
return pkg.description;
|
|
90
|
+
}
|
|
91
|
+
catch { /* ignore */ }
|
|
92
|
+
}
|
|
93
|
+
return `Local project at ${cwd}`;
|
|
94
|
+
}
|
|
95
|
+
function extractFirstParagraph(markdown) {
|
|
96
|
+
const lines = markdown.split('\n');
|
|
97
|
+
let paragraph = '';
|
|
98
|
+
let foundContent = false;
|
|
99
|
+
for (const line of lines) {
|
|
100
|
+
const trimmed = line.trim();
|
|
101
|
+
if (trimmed.startsWith('#') || trimmed.startsWith('---') || trimmed.startsWith('```')) {
|
|
102
|
+
if (foundContent)
|
|
103
|
+
break;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (trimmed === '') {
|
|
107
|
+
if (foundContent)
|
|
108
|
+
break;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (trimmed.startsWith('|'))
|
|
112
|
+
continue;
|
|
113
|
+
foundContent = true;
|
|
114
|
+
paragraph += (paragraph ? ' ' : '') + trimmed;
|
|
115
|
+
}
|
|
116
|
+
if (!paragraph)
|
|
117
|
+
return null;
|
|
118
|
+
return paragraph.length > 500 ? paragraph.substring(0, 497) + '...' : paragraph;
|
|
119
|
+
}
|
|
120
|
+
const KNOWN_TECH = [
|
|
121
|
+
'react', 'next', 'express', 'fastify', 'vue', 'angular', 'svelte',
|
|
122
|
+
'tailwindcss', 'prisma', '@supabase/supabase-js', 'typescript',
|
|
123
|
+
'react-native', 'expo', 'electron', '@modelcontextprotocol/sdk',
|
|
124
|
+
'zod', 'drizzle-orm', 'mongoose', 'graphql', 'trpc',
|
|
125
|
+
];
|
|
126
|
+
function detectTechStack(cwd) {
|
|
127
|
+
const techStack = [];
|
|
128
|
+
const pkgPath = join(cwd, 'package.json');
|
|
129
|
+
if (existsSync(pkgPath)) {
|
|
130
|
+
try {
|
|
131
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
132
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
133
|
+
for (const tech of KNOWN_TECH) {
|
|
134
|
+
if (allDeps[tech]) {
|
|
135
|
+
techStack.push(tech.replace('@supabase/supabase-js', 'supabase').replace('@modelcontextprotocol/sdk', 'mcp'));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (!allDeps['typescript'] && existsSync(join(cwd, 'tsconfig.json'))) {
|
|
139
|
+
techStack.push('typescript');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch { /* ignore */ }
|
|
143
|
+
}
|
|
144
|
+
if (existsSync(join(cwd, 'requirements.txt')) || existsSync(join(cwd, 'pyproject.toml')))
|
|
145
|
+
techStack.push('python');
|
|
146
|
+
if (existsSync(join(cwd, 'go.mod')))
|
|
147
|
+
techStack.push('go');
|
|
148
|
+
if (existsSync(join(cwd, 'Cargo.toml')))
|
|
149
|
+
techStack.push('rust');
|
|
150
|
+
return techStack;
|
|
151
|
+
}
|
|
68
152
|
//# sourceMappingURL=project-detector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/lib/project-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/lib/project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-project-context.d.ts","sourceRoot":"","sources":["../../src/tools/get-project-context.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;CAanC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"get-project-context.d.ts","sourceRoot":"","sources":["../../src/tools/get-project-context.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;CAanC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC5F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getProjectContext } from '../lib/api-client.js';
|
|
2
2
|
import { detectProject } from '../lib/project-detector.js';
|
|
3
3
|
export const getProjectContextSchema = {
|
|
4
4
|
name: 'get_project_context',
|
|
@@ -15,12 +15,10 @@ Uses a watermark system — only returns captures saved since the last time cont
|
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
17
|
export async function handleGetProjectContext(args) {
|
|
18
|
-
const { supabase, userId } = await getSupabase();
|
|
19
18
|
const projectArg = args.project;
|
|
20
19
|
const limit = Math.min(Math.max(1, Number(args.limit) || 20), 100);
|
|
21
|
-
// Resolve project
|
|
22
|
-
let projectId;
|
|
23
20
|
let projectName;
|
|
21
|
+
let projectId;
|
|
24
22
|
if (projectArg === 'auto') {
|
|
25
23
|
const detected = await detectProject(process.cwd());
|
|
26
24
|
if (!detected)
|
|
@@ -29,31 +27,20 @@ export async function handleGetProjectContext(args) {
|
|
|
29
27
|
projectName = detected.name;
|
|
30
28
|
}
|
|
31
29
|
else {
|
|
32
|
-
|
|
33
|
-
.from('projects')
|
|
34
|
-
.select('id, name')
|
|
35
|
-
.eq('user_id', userId)
|
|
36
|
-
.ilike('name', projectArg)
|
|
37
|
-
.limit(1);
|
|
38
|
-
if (lookupError || !data?.[0]?.id) {
|
|
39
|
-
return `Project "${projectArg}" not found.`;
|
|
40
|
-
}
|
|
41
|
-
projectId = data[0].id;
|
|
42
|
-
projectName = data[0].name;
|
|
30
|
+
projectName = projectArg;
|
|
43
31
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
p_limit: limit,
|
|
32
|
+
const data = await getProjectContext({
|
|
33
|
+
project_name: projectName,
|
|
34
|
+
project_id: projectId,
|
|
35
|
+
limit,
|
|
49
36
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (!
|
|
53
|
-
return `No new saves for ${
|
|
54
|
-
const items =
|
|
37
|
+
const results = data.results;
|
|
38
|
+
const name = data.project_name || projectName;
|
|
39
|
+
if (!results || results.length === 0)
|
|
40
|
+
return `No new saves for ${name} since last check.`;
|
|
41
|
+
const items = results.map((r, i) => `${i + 1}. **${r.title || 'Untitled'}** · splicr [${r.relevance}]\n` +
|
|
55
42
|
` ${r.insight}\n` +
|
|
56
43
|
` Tags: ${r.tags?.join(', ') || 'none'}${r.source_url ? ` | ${r.source_url}` : ''}`).join('\n\n');
|
|
57
|
-
return `*From Splicr — ${
|
|
44
|
+
return `*From Splicr — ${results.length} new save(s) for ${name}:*\n\n${items}`;
|
|
58
45
|
}
|
|
59
46
|
//# sourceMappingURL=get-project-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-project-context.js","sourceRoot":"","sources":["../../src/tools/get-project-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get-project-context.js","sourceRoot":"","sources":["../../src/tools/get-project-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,qBAA8B;IACpC,WAAW,EAAE;;gLAEiK;IAC9K,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,2CAA2C,EAAE;YAC9F,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,2BAA2B,EAAE;SAC7E;QACD,QAAQ,EAAE,CAAC,SAAkB,CAAC;KAC/B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA6B;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAiB,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAEnE,IAAI,WAA+B,CAAC;IACpC,IAAI,SAA6B,CAAC;IAElC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,OAAO,+EAA+E,CAAC;QACtG,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;QACxB,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,UAAU,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC;QACnC,YAAY,EAAE,WAAW;QACzB,UAAU,EAAE,SAAS;QACrB,KAAK;KACN,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;IAE9C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,oBAAoB,IAAI,oBAAoB,CAAC;IAE1F,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,CAAS,EAAE,EAAE,CAC9C,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,UAAU,gBAAgB,CAAC,CAAC,SAAS,KAAK;QACpE,MAAM,CAAC,CAAC,OAAO,IAAI;QACnB,YAAY,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACtF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,OAAO,kBAAkB,OAAO,CAAC,MAAM,oBAAoB,IAAI,SAAS,KAAK,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-recent-insights.d.ts","sourceRoot":"","sources":["../../src/tools/get-recent-insights.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAUnC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"get-recent-insights.d.ts","sourceRoot":"","sources":["../../src/tools/get-recent-insights.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAUnC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB5F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getRecentInsights } from '../lib/api-client.js';
|
|
2
2
|
export const getRecentInsightsSchema = {
|
|
3
3
|
name: 'get_recent_insights',
|
|
4
4
|
description: `Show everything the user saved recently across all projects in Splicr. Only call when the user explicitly asks to see their recent saves or wants a cross-project overview.`,
|
|
@@ -11,27 +11,12 @@ export const getRecentInsightsSchema = {
|
|
|
11
11
|
},
|
|
12
12
|
};
|
|
13
13
|
export async function handleGetRecentInsights(args) {
|
|
14
|
-
const { supabase, userId } = await getSupabase();
|
|
15
14
|
const days = Math.min(Math.max(1, Number(args.days) || 3), 365);
|
|
16
15
|
const limit = Math.min(Math.max(1, Number(args.limit) || 15), 100);
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
const { data, error } = await supabase
|
|
20
|
-
.from('captures')
|
|
21
|
-
.select(`
|
|
22
|
-
id, title, insight, source_url, source_type, content_category, tags, created_at,
|
|
23
|
-
project_captures ( project_id, relevance, projects:project_id ( name ) )
|
|
24
|
-
`)
|
|
25
|
-
.eq('user_id', userId)
|
|
26
|
-
.eq('status', 'complete')
|
|
27
|
-
.gte('created_at', since.toISOString())
|
|
28
|
-
.order('created_at', { ascending: false })
|
|
29
|
-
.limit(limit);
|
|
30
|
-
if (error)
|
|
31
|
-
return `Error: ${error.message}`;
|
|
32
|
-
if (!data || data.length === 0)
|
|
16
|
+
const data = await getRecentInsights({ days, limit });
|
|
17
|
+
if (!data.captures || data.captures.length === 0)
|
|
33
18
|
return `No saves in the last ${days} days.`;
|
|
34
|
-
const items = data.map((c, i) => {
|
|
19
|
+
const items = data.captures.map((c, i) => {
|
|
35
20
|
const projects = c.project_captures
|
|
36
21
|
?.map((pc) => pc.projects?.name)
|
|
37
22
|
.filter(Boolean)
|
|
@@ -40,15 +25,9 @@ export async function handleGetRecentInsights(args) {
|
|
|
40
25
|
` ${c.insight}\n` +
|
|
41
26
|
` ${c.content_category} | ${c.tags?.join(', ') || 'no tags'}`;
|
|
42
27
|
}).join('\n\n');
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
.
|
|
46
|
-
.select('*', { count: 'exact', head: true })
|
|
47
|
-
.eq('user_id', userId)
|
|
48
|
-
.eq('status', 'failed');
|
|
49
|
-
let output = `*From Splicr — ${data.length} recent save(s):*\n\n${items}`;
|
|
50
|
-
if (failedCount && failedCount > 0) {
|
|
51
|
-
output += `\n\n_Note: ${failedCount} capture(s) failed processing. Use retry_failed to reprocess._`;
|
|
28
|
+
let output = `*From Splicr — ${data.captures.length} recent save(s):*\n\n${items}`;
|
|
29
|
+
if (data.failed_count > 0) {
|
|
30
|
+
output += `\n\n_Note: ${data.failed_count} capture(s) failed processing. Use retry_failed to reprocess._`;
|
|
52
31
|
}
|
|
53
32
|
return output;
|
|
54
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-recent-insights.js","sourceRoot":"","sources":["../../src/tools/get-recent-insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get-recent-insights.js","sourceRoot":"","sources":["../../src/tools/get-recent-insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,qBAA8B;IACpC,WAAW,EAAE,6KAA6K;IAC1L,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,0BAA0B,EAAE;YAC1E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,2BAA2B,EAAE;SAC7E;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA6B;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,wBAAwB,IAAI,QAAQ,CAAC;IAE9F,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,CAAS,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,gBAAgB;YACjC,EAAE,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;aACpC,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QAC3B,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,UAAU,iBAAiB,QAAQ,IAAI;YACtE,MAAM,CAAC,CAAC,OAAO,IAAI;YACnB,MAAM,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,IAAI,MAAM,GAAG,kBAAkB,IAAI,CAAC,QAAQ,CAAC,MAAM,wBAAwB,KAAK,EAAE,CAAC;IACnF,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,IAAI,CAAC,YAAY,gEAAgE,CAAC;IAC5G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-failed.d.ts","sourceRoot":"","sources":["../../src/tools/retry-failed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry-failed.d.ts","sourceRoot":"","sources":["../../src/tools/retry-failed.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB;;;;;;;CAO7B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { loadConfig } from '../config.js';
|
|
1
|
+
import { retryFailed } from '../lib/api-client.js';
|
|
3
2
|
export const retryFailedSchema = {
|
|
4
3
|
name: 'retry_failed',
|
|
5
4
|
description: `Retry processing of failed captures in Splicr. Some captures may fail during AI processing (extraction, distillation, or routing). This tool requeues them for reprocessing. Returns the number of captures queued for retry.`,
|
|
@@ -9,45 +8,10 @@ export const retryFailedSchema = {
|
|
|
9
8
|
},
|
|
10
9
|
};
|
|
11
10
|
export async function handleRetryFailed(_args) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (hasAuth()) {
|
|
16
|
-
const auth = await loadAuth();
|
|
17
|
-
token = auth.accessToken;
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
return 'Not authenticated. Run `splicr login` first to enable retry.';
|
|
21
|
-
}
|
|
22
|
-
// Call API server's retry endpoint
|
|
23
|
-
const url = `${config.apiServerUrl}/captures/retry-failed`;
|
|
24
|
-
try {
|
|
25
|
-
const response = await fetch(url, {
|
|
26
|
-
method: 'POST',
|
|
27
|
-
headers: {
|
|
28
|
-
'Authorization': `Bearer ${token}`,
|
|
29
|
-
'Content-Type': 'application/json',
|
|
30
|
-
},
|
|
31
|
-
signal: AbortSignal.timeout(15000),
|
|
32
|
-
});
|
|
33
|
-
if (!response.ok) {
|
|
34
|
-
let body = '';
|
|
35
|
-
try {
|
|
36
|
-
body = await response.text();
|
|
37
|
-
}
|
|
38
|
-
catch { }
|
|
39
|
-
return `Retry request failed (${response.status}): ${body}`;
|
|
40
|
-
}
|
|
41
|
-
const result = await response.json();
|
|
42
|
-
if (result.data.retried === 0) {
|
|
43
|
-
return 'No failed captures to retry.';
|
|
44
|
-
}
|
|
45
|
-
return `*Splicr:* ${result.data.message}`;
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
if (err.name === 'TimeoutError')
|
|
49
|
-
return 'Retry request timed out after 15s.';
|
|
50
|
-
return `Retry request failed: ${err.message}`;
|
|
11
|
+
const result = await retryFailed();
|
|
12
|
+
if (result.retried === 0) {
|
|
13
|
+
return 'No failed captures to retry.';
|
|
51
14
|
}
|
|
15
|
+
return `*Splicr:* ${result.message}`;
|
|
52
16
|
}
|
|
53
17
|
//# sourceMappingURL=retry-failed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-failed.js","sourceRoot":"","sources":["../../src/tools/retry-failed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"retry-failed.js","sourceRoot":"","sources":["../../src/tools/retry-failed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,cAAuB;IAC7B,WAAW,EAAE,+NAA+N;IAC5O,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,8BAA8B,CAAC;IACxC,CAAC;IACD,OAAO,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -24,7 +24,7 @@ export declare const saveFromAgentSchema: {
|
|
|
24
24
|
description: string;
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
|
-
required: ("
|
|
27
|
+
required: ("content" | "title")[];
|
|
28
28
|
};
|
|
29
29
|
};
|
|
30
30
|
export declare function handleSaveFromAgent(args: Record<string, unknown>): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-from-agent.d.ts","sourceRoot":"","sources":["../../src/tools/save-from-agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save-from-agent.d.ts","sourceRoot":"","sources":["../../src/tools/save-from-agent.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAa/B,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BxF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getSupabase } from '../lib/supabase.js';
|
|
1
|
+
import { saveFromAgent } from '../lib/api-client.js';
|
|
3
2
|
import { detectProject } from '../lib/project-detector.js';
|
|
4
3
|
export const saveFromAgentSchema = {
|
|
5
4
|
name: 'save_from_agent',
|
|
@@ -16,69 +15,28 @@ export const saveFromAgentSchema = {
|
|
|
16
15
|
},
|
|
17
16
|
};
|
|
18
17
|
export async function handleSaveFromAgent(args) {
|
|
19
|
-
const { supabase, userId } = await getSupabase();
|
|
20
18
|
const content = args.content;
|
|
21
19
|
const title = args.title;
|
|
22
20
|
const projectArg = args.project;
|
|
23
21
|
const tags = args.tags || [];
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
// Resolve project name
|
|
23
|
+
let projectName;
|
|
24
|
+
if (projectArg === 'auto') {
|
|
25
|
+
const detected = await detectProject(process.cwd());
|
|
26
|
+
projectName = detected?.name;
|
|
27
|
+
}
|
|
28
|
+
else if (projectArg && projectArg !== 'all') {
|
|
29
|
+
projectName = projectArg;
|
|
30
|
+
}
|
|
31
|
+
const result = await saveFromAgent({
|
|
32
|
+
content,
|
|
33
33
|
title,
|
|
34
|
-
|
|
35
|
-
insight: content,
|
|
36
|
-
content_category: 'technique',
|
|
34
|
+
project_name: projectName,
|
|
37
35
|
tags,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
processed_at: new Date().toISOString(),
|
|
41
|
-
})
|
|
42
|
-
.select()
|
|
43
|
-
.single();
|
|
44
|
-
// Duplicate detected by DB constraint
|
|
45
|
-
if (error?.code === '23505' || error?.message?.includes('duplicate key')) {
|
|
36
|
+
});
|
|
37
|
+
if (result.duplicate) {
|
|
46
38
|
return `*Already saved in Splicr:* "${title}"`;
|
|
47
39
|
}
|
|
48
|
-
|
|
49
|
-
return `Error saving: ${error.message}`;
|
|
50
|
-
if (!capture)
|
|
51
|
-
return 'Error saving: no data returned from insert';
|
|
52
|
-
// Route to project if specified
|
|
53
|
-
if (projectArg && projectArg !== 'all') {
|
|
54
|
-
let projectId;
|
|
55
|
-
if (projectArg === 'auto') {
|
|
56
|
-
const detected = await detectProject(process.cwd());
|
|
57
|
-
projectId = detected?.id;
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
const { data, error: lookupError } = await supabase
|
|
61
|
-
.from('projects')
|
|
62
|
-
.select('id')
|
|
63
|
-
.eq('user_id', userId)
|
|
64
|
-
.ilike('name', projectArg)
|
|
65
|
-
.limit(1);
|
|
66
|
-
if (!lookupError) {
|
|
67
|
-
projectId = data?.[0]?.id;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (projectId) {
|
|
71
|
-
const { error: routeError } = await supabase.from('project_captures').insert({
|
|
72
|
-
project_id: projectId,
|
|
73
|
-
capture_id: capture.id,
|
|
74
|
-
relevance: 'high',
|
|
75
|
-
routed_by: 'agent',
|
|
76
|
-
});
|
|
77
|
-
if (routeError) {
|
|
78
|
-
return `*Saved to Splicr:* "${title}" (warning: routing to project failed)`;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return `*Saved to Splicr:* "${title}"${projectArg ? ` → routed to ${projectArg}` : ''}`;
|
|
40
|
+
return `*Saved to Splicr:* "${title}"${result.project_name ? ` → routed to ${result.project_name}` : ''}`;
|
|
83
41
|
}
|
|
84
42
|
//# sourceMappingURL=save-from-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-from-agent.js","sourceRoot":"","sources":["../../src/tools/save-from-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"save-from-agent.js","sourceRoot":"","sources":["../../src/tools/save-from-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,iBAA0B;IAChC,WAAW,EAAE,6NAA6N;IAC1O,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC1E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,aAAa,EAAE;YAC9D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,gCAAgC,EAAE;YACnF,IAAI,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;SAC1F;QACD,QAAQ,EAAE,CAAC,SAAkB,EAAE,OAAgB,CAAC;KACjD;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAA6B,CAAC;IACtD,MAAM,IAAI,GAAI,IAAI,CAAC,IAAiB,IAAI,EAAE,CAAC;IAE3C,uBAAuB;IACvB,IAAI,WAA+B,CAAC;IACpC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,WAAW,GAAG,QAAQ,EAAE,IAAI,CAAC;IAC/B,CAAC;SAAM,IAAI,UAAU,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAC9C,WAAW,GAAG,UAAU,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACjC,OAAO;QACP,KAAK;QACL,YAAY,EAAE,WAAW;QACzB,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,+BAA+B,KAAK,GAAG,CAAC;IACjD,CAAC;IAED,OAAO,uBAAuB,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5G,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CAsBjC,CAAC;
|
|
1
|
+
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CAsBjC,CAAC;AAeF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B1F"}
|