@luckydraw/cumulus 0.27.40 → 0.28.0
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/gateway/adapters/webchat.d.ts +5 -7
- package/dist/gateway/adapters/webchat.d.ts.map +1 -1
- package/dist/gateway/adapters/webchat.js +204 -57
- package/dist/gateway/adapters/webchat.js.map +1 -1
- package/dist/gateway/config.d.ts +48 -0
- package/dist/gateway/config.d.ts.map +1 -1
- package/dist/gateway/config.js +90 -0
- package/dist/gateway/config.js.map +1 -1
- package/dist/gateway/daemon.d.ts.map +1 -1
- package/dist/gateway/daemon.js +268 -27
- package/dist/gateway/daemon.js.map +1 -1
- package/dist/gateway/gateway-agents-mcp.js +570 -31
- package/dist/gateway/gateway-agents-mcp.js.map +1 -1
- package/dist/gateway/hooks.d.ts +101 -0
- package/dist/gateway/hooks.d.ts.map +1 -0
- package/dist/gateway/hooks.js +200 -0
- package/dist/gateway/hooks.js.map +1 -0
- package/dist/gateway/scheduler.d.ts +50 -0
- package/dist/gateway/scheduler.d.ts.map +1 -0
- package/dist/gateway/scheduler.js +263 -0
- package/dist/gateway/scheduler.js.map +1 -0
- package/dist/gateway/server.d.ts +16 -1
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +451 -22
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/static/blex.min.js +74 -17
- package/dist/gateway/static/chat.html +1 -4
- package/dist/gateway/static/dashboard.html +151 -0
- package/dist/gateway/static/dashboard.js +229 -0
- package/dist/gateway/static/widget.js +656 -460
- package/dist/index.d.ts +13 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agentic-loop.d.ts +124 -0
- package/dist/lib/agentic-loop.d.ts.map +1 -0
- package/dist/lib/agentic-loop.js +338 -0
- package/dist/lib/agentic-loop.js.map +1 -0
- package/dist/lib/config.d.ts +28 -15
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +47 -41
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/gateway.d.ts +34 -3
- package/dist/lib/gateway.d.ts.map +1 -1
- package/dist/lib/gateway.js +584 -37
- package/dist/lib/gateway.js.map +1 -1
- package/dist/lib/huggingface-provider.d.ts +26 -0
- package/dist/lib/huggingface-provider.d.ts.map +1 -0
- package/dist/lib/huggingface-provider.js +338 -0
- package/dist/lib/huggingface-provider.js.map +1 -0
- package/dist/lib/provider.d.ts +71 -0
- package/dist/lib/provider.d.ts.map +1 -0
- package/dist/lib/provider.js +90 -0
- package/dist/lib/provider.js.map +1 -0
- package/dist/lib/tools/ask-user-question.d.ts +14 -0
- package/dist/lib/tools/ask-user-question.d.ts.map +1 -0
- package/dist/lib/tools/ask-user-question.js +74 -0
- package/dist/lib/tools/ask-user-question.js.map +1 -0
- package/dist/lib/tools/bash.d.ts +6 -0
- package/dist/lib/tools/bash.d.ts.map +1 -0
- package/dist/lib/tools/bash.js +85 -0
- package/dist/lib/tools/bash.js.map +1 -0
- package/dist/lib/tools/edit.d.ts +6 -0
- package/dist/lib/tools/edit.d.ts.map +1 -0
- package/dist/lib/tools/edit.js +79 -0
- package/dist/lib/tools/edit.js.map +1 -0
- package/dist/lib/tools/glob.d.ts +6 -0
- package/dist/lib/tools/glob.d.ts.map +1 -0
- package/dist/lib/tools/glob.js +91 -0
- package/dist/lib/tools/glob.js.map +1 -0
- package/dist/lib/tools/grep.d.ts +6 -0
- package/dist/lib/tools/grep.d.ts.map +1 -0
- package/dist/lib/tools/grep.js +110 -0
- package/dist/lib/tools/grep.js.map +1 -0
- package/dist/lib/tools/index.d.ts +29 -0
- package/dist/lib/tools/index.d.ts.map +1 -0
- package/dist/lib/tools/index.js +52 -0
- package/dist/lib/tools/index.js.map +1 -0
- package/dist/lib/tools/read.d.ts +6 -0
- package/dist/lib/tools/read.d.ts.map +1 -0
- package/dist/lib/tools/read.js +80 -0
- package/dist/lib/tools/read.js.map +1 -0
- package/dist/lib/tools/tool-search.d.ts +30 -0
- package/dist/lib/tools/tool-search.d.ts.map +1 -0
- package/dist/lib/tools/tool-search.js +108 -0
- package/dist/lib/tools/tool-search.js.map +1 -0
- package/dist/lib/tools/web-fetch.d.ts +9 -0
- package/dist/lib/tools/web-fetch.d.ts.map +1 -0
- package/dist/lib/tools/web-fetch.js +114 -0
- package/dist/lib/tools/web-fetch.js.map +1 -0
- package/dist/lib/tools/web-search.d.ts +12 -0
- package/dist/lib/tools/web-search.d.ts.map +1 -0
- package/dist/lib/tools/web-search.js +89 -0
- package/dist/lib/tools/web-search.js.map +1 -0
- package/dist/lib/tools/write.d.ts +6 -0
- package/dist/lib/tools/write.d.ts.map +1 -0
- package/dist/lib/tools/write.js +44 -0
- package/dist/lib/tools/write.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core tool implementations for the direct API agentic loop.
|
|
3
|
+
*
|
|
4
|
+
* Tools are classified as "eager" (included in every API call) or
|
|
5
|
+
* "deferred" (available via ToolSearch, schema fetched on demand).
|
|
6
|
+
*/
|
|
7
|
+
export { readTool } from './read.js';
|
|
8
|
+
export { writeTool } from './write.js';
|
|
9
|
+
export { editTool } from './edit.js';
|
|
10
|
+
export { bashTool } from './bash.js';
|
|
11
|
+
export { grepTool } from './grep.js';
|
|
12
|
+
export { globTool } from './glob.js';
|
|
13
|
+
export { toolSearchTool, setDeferredRegistry, getDeferredRegistry, buildDeferredToolList, } from './tool-search.js';
|
|
14
|
+
export type { DeferredToolEntry } from './tool-search.js';
|
|
15
|
+
export { webFetchTool } from './web-fetch.js';
|
|
16
|
+
export { webSearchTool, setBraveSearchApiKey } from './web-search.js';
|
|
17
|
+
export { askUserQuestionTool, ASK_USER_QUESTION_TOOL } from './ask-user-question.js';
|
|
18
|
+
import type { ToolDefinition } from '../provider.js';
|
|
19
|
+
export interface Tool {
|
|
20
|
+
definition: ToolDefinition;
|
|
21
|
+
execute: (input: Record<string, unknown>, cwd: string) => Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
/** Eager tools — included in every API call (10 tools). */
|
|
24
|
+
export declare function getEagerTools(): Tool[];
|
|
25
|
+
/** All tools (eager + deferred). For backward compat. */
|
|
26
|
+
export declare function getAllTools(): Tool[];
|
|
27
|
+
export declare function getToolDefinitions(): ToolDefinition[];
|
|
28
|
+
export declare function getToolByName(name: string): Tool | undefined;
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAarD,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3E;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,IAAI,EAAE,CAatC;AAED,yDAAyD;AACzD,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAEpC;AAED,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAErD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAE5D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core tool implementations for the direct API agentic loop.
|
|
3
|
+
*
|
|
4
|
+
* Tools are classified as "eager" (included in every API call) or
|
|
5
|
+
* "deferred" (available via ToolSearch, schema fetched on demand).
|
|
6
|
+
*/
|
|
7
|
+
export { readTool } from './read.js';
|
|
8
|
+
export { writeTool } from './write.js';
|
|
9
|
+
export { editTool } from './edit.js';
|
|
10
|
+
export { bashTool } from './bash.js';
|
|
11
|
+
export { grepTool } from './grep.js';
|
|
12
|
+
export { globTool } from './glob.js';
|
|
13
|
+
export { toolSearchTool, setDeferredRegistry, getDeferredRegistry, buildDeferredToolList, } from './tool-search.js';
|
|
14
|
+
export { webFetchTool } from './web-fetch.js';
|
|
15
|
+
export { webSearchTool, setBraveSearchApiKey } from './web-search.js';
|
|
16
|
+
export { askUserQuestionTool, ASK_USER_QUESTION_TOOL } from './ask-user-question.js';
|
|
17
|
+
import { askUserQuestionTool } from './ask-user-question.js';
|
|
18
|
+
import { bashTool } from './bash.js';
|
|
19
|
+
import { editTool } from './edit.js';
|
|
20
|
+
import { globTool } from './glob.js';
|
|
21
|
+
import { grepTool } from './grep.js';
|
|
22
|
+
import { readTool } from './read.js';
|
|
23
|
+
import { toolSearchTool } from './tool-search.js';
|
|
24
|
+
import { webFetchTool } from './web-fetch.js';
|
|
25
|
+
import { webSearchTool } from './web-search.js';
|
|
26
|
+
import { writeTool } from './write.js';
|
|
27
|
+
/** Eager tools — included in every API call (10 tools). */
|
|
28
|
+
export function getEagerTools() {
|
|
29
|
+
return [
|
|
30
|
+
readTool,
|
|
31
|
+
writeTool,
|
|
32
|
+
editTool,
|
|
33
|
+
bashTool,
|
|
34
|
+
grepTool,
|
|
35
|
+
globTool,
|
|
36
|
+
toolSearchTool,
|
|
37
|
+
webFetchTool,
|
|
38
|
+
webSearchTool,
|
|
39
|
+
askUserQuestionTool,
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
/** All tools (eager + deferred). For backward compat. */
|
|
43
|
+
export function getAllTools() {
|
|
44
|
+
return getEagerTools();
|
|
45
|
+
}
|
|
46
|
+
export function getToolDefinitions() {
|
|
47
|
+
return getAllTools().map(t => t.definition);
|
|
48
|
+
}
|
|
49
|
+
export function getToolByName(name) {
|
|
50
|
+
return getAllTools().find(t => t.definition.name === name);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAIrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAOvC,2DAA2D;AAC3D,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,aAAa;QACb,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,WAAW;IACzB,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,IAkEtB,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read tool — read files with optional line range.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
export const readTool = {
|
|
7
|
+
definition: {
|
|
8
|
+
name: 'Read',
|
|
9
|
+
description: 'Read a file from the filesystem. Returns the file contents with line numbers. ' +
|
|
10
|
+
'Use offset and limit to read specific sections of large files.',
|
|
11
|
+
input_schema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
file_path: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Absolute path to the file to read',
|
|
17
|
+
},
|
|
18
|
+
offset: {
|
|
19
|
+
type: 'number',
|
|
20
|
+
description: 'Line number to start reading from (1-based). Optional.',
|
|
21
|
+
},
|
|
22
|
+
limit: {
|
|
23
|
+
type: 'number',
|
|
24
|
+
description: 'Maximum number of lines to read. Optional, defaults to 2000.',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: ['file_path'],
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
async execute(input, cwd) {
|
|
31
|
+
const filePath = resolvePath(input.file_path, cwd);
|
|
32
|
+
const offset = input.offset || 1;
|
|
33
|
+
const limit = input.limit || 2000;
|
|
34
|
+
if (!fs.existsSync(filePath)) {
|
|
35
|
+
return `Error: File not found: ${filePath}`;
|
|
36
|
+
}
|
|
37
|
+
const stat = fs.statSync(filePath);
|
|
38
|
+
if (stat.isDirectory()) {
|
|
39
|
+
return `Error: ${filePath} is a directory, not a file. Use Bash with ls to list directory contents.`;
|
|
40
|
+
}
|
|
41
|
+
// Binary check (first 8KB)
|
|
42
|
+
const sample = Buffer.alloc(Math.min(8192, stat.size));
|
|
43
|
+
const fd = fs.openSync(filePath, 'r');
|
|
44
|
+
fs.readSync(fd, sample, 0, sample.length, 0);
|
|
45
|
+
fs.closeSync(fd);
|
|
46
|
+
if (isBinary(sample)) {
|
|
47
|
+
return `Error: ${filePath} appears to be a binary file (${stat.size} bytes)`;
|
|
48
|
+
}
|
|
49
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
50
|
+
const lines = content.split('\n');
|
|
51
|
+
const startIdx = Math.max(0, offset - 1);
|
|
52
|
+
const endIdx = Math.min(lines.length, startIdx + limit);
|
|
53
|
+
const selectedLines = lines.slice(startIdx, endIdx);
|
|
54
|
+
const numbered = selectedLines.map((line, i) => {
|
|
55
|
+
const lineNum = startIdx + i + 1;
|
|
56
|
+
return `${String(lineNum).padStart(6, ' ')}\t${line}`;
|
|
57
|
+
});
|
|
58
|
+
let result = numbered.join('\n');
|
|
59
|
+
if (endIdx < lines.length) {
|
|
60
|
+
result += `\n\n(${lines.length - endIdx} more lines not shown)`;
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
function resolvePath(filePath, cwd) {
|
|
66
|
+
if (path.isAbsolute(filePath))
|
|
67
|
+
return filePath;
|
|
68
|
+
return path.resolve(cwd, filePath);
|
|
69
|
+
}
|
|
70
|
+
function isBinary(buffer) {
|
|
71
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
72
|
+
const b = buffer[i];
|
|
73
|
+
// NULL bytes or most control chars (except tab, newline, carriage return)
|
|
74
|
+
if (b === 0 || b < 8 || (b > 13 && b < 32 && b !== 27)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/lib/tools/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToolSearch — deferred tool loading.
|
|
3
|
+
*
|
|
4
|
+
* Instead of sending all tool definitions every turn (~6k tokens),
|
|
5
|
+
* send only the 10 most-used eagerly. The rest are "deferred" —
|
|
6
|
+
* name + one-line description only. When the LLM needs one, it calls
|
|
7
|
+
* ToolSearch to get the full schema, then can call the tool on that turn.
|
|
8
|
+
*
|
|
9
|
+
* Supports two query modes:
|
|
10
|
+
* - "select:tool1,tool2" — exact name lookup, returns full schemas
|
|
11
|
+
* - "keyword search" — fuzzy match on name + description
|
|
12
|
+
*/
|
|
13
|
+
import type { ToolDefinition } from '../provider.js';
|
|
14
|
+
import type { Tool } from './index.js';
|
|
15
|
+
export interface DeferredToolEntry {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
definition: ToolDefinition;
|
|
19
|
+
}
|
|
20
|
+
/** Register tools that are available via ToolSearch (deferred tools). */
|
|
21
|
+
export declare function setDeferredRegistry(entries: DeferredToolEntry[]): void;
|
|
22
|
+
/** Get the current deferred registry (for introspection). */
|
|
23
|
+
export declare function getDeferredRegistry(): DeferredToolEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* Build the deferred tool list string for the system prompt.
|
|
26
|
+
* Each entry is just name + description — no schema.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildDeferredToolList(): string;
|
|
29
|
+
export declare const toolSearchTool: Tool;
|
|
30
|
+
//# sourceMappingURL=tool-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-search.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/tool-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAID,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAEtE;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,IAAI,iBAAiB,EAAE,CAEzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED,eAAO,MAAM,cAAc,EAAE,IAkF5B,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToolSearch — deferred tool loading.
|
|
3
|
+
*
|
|
4
|
+
* Instead of sending all tool definitions every turn (~6k tokens),
|
|
5
|
+
* send only the 10 most-used eagerly. The rest are "deferred" —
|
|
6
|
+
* name + one-line description only. When the LLM needs one, it calls
|
|
7
|
+
* ToolSearch to get the full schema, then can call the tool on that turn.
|
|
8
|
+
*
|
|
9
|
+
* Supports two query modes:
|
|
10
|
+
* - "select:tool1,tool2" — exact name lookup, returns full schemas
|
|
11
|
+
* - "keyword search" — fuzzy match on name + description
|
|
12
|
+
*/
|
|
13
|
+
let _registry = [];
|
|
14
|
+
/** Register tools that are available via ToolSearch (deferred tools). */
|
|
15
|
+
export function setDeferredRegistry(entries) {
|
|
16
|
+
_registry = entries;
|
|
17
|
+
}
|
|
18
|
+
/** Get the current deferred registry (for introspection). */
|
|
19
|
+
export function getDeferredRegistry() {
|
|
20
|
+
return _registry;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build the deferred tool list string for the system prompt.
|
|
24
|
+
* Each entry is just name + description — no schema.
|
|
25
|
+
*/
|
|
26
|
+
export function buildDeferredToolList() {
|
|
27
|
+
if (_registry.length === 0)
|
|
28
|
+
return '';
|
|
29
|
+
const lines = _registry.map(e => `- ${e.name}: ${e.description}`);
|
|
30
|
+
return 'The following deferred tools are available via ToolSearch:\n' + lines.join('\n');
|
|
31
|
+
}
|
|
32
|
+
export const toolSearchTool = {
|
|
33
|
+
definition: {
|
|
34
|
+
name: 'ToolSearch',
|
|
35
|
+
description: 'Fetch full schema definitions for deferred tools so they can be called. ' +
|
|
36
|
+
'Use "select:tool1,tool2" for exact name lookup, or keywords to search by name/description. ' +
|
|
37
|
+
'Returns matched tool schemas as JSON.',
|
|
38
|
+
input_schema: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
query: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'Query to find deferred tools. Use "select:<tool_name>,<tool_name>" for exact lookup, ' +
|
|
44
|
+
'or keywords to search by name and description.',
|
|
45
|
+
},
|
|
46
|
+
max_results: {
|
|
47
|
+
type: 'number',
|
|
48
|
+
description: 'Maximum number of results to return (default: 5).',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
required: ['query'],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
async execute(input) {
|
|
55
|
+
const query = input.query || '';
|
|
56
|
+
const maxResults = input.max_results || 5;
|
|
57
|
+
if (_registry.length === 0) {
|
|
58
|
+
return 'No deferred tools registered.';
|
|
59
|
+
}
|
|
60
|
+
let matched;
|
|
61
|
+
if (query.startsWith('select:')) {
|
|
62
|
+
// Exact name lookup
|
|
63
|
+
const names = query
|
|
64
|
+
.slice(7)
|
|
65
|
+
.split(',')
|
|
66
|
+
.map(n => n.trim().toLowerCase());
|
|
67
|
+
matched = _registry.filter(e => names.includes(e.name.toLowerCase()));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Keyword search — score by term matches in name + description
|
|
71
|
+
const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
72
|
+
if (terms.length === 0) {
|
|
73
|
+
matched = _registry.slice(0, maxResults);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const scored = _registry.map(e => {
|
|
77
|
+
const haystack = `${e.name} ${e.description}`.toLowerCase();
|
|
78
|
+
let score = 0;
|
|
79
|
+
for (const term of terms) {
|
|
80
|
+
if (haystack.includes(term))
|
|
81
|
+
score++;
|
|
82
|
+
// Bonus for name match
|
|
83
|
+
if (e.name.toLowerCase().includes(term))
|
|
84
|
+
score += 2;
|
|
85
|
+
}
|
|
86
|
+
return { entry: e, score };
|
|
87
|
+
});
|
|
88
|
+
scored.sort((a, b) => b.score - a.score);
|
|
89
|
+
matched = scored
|
|
90
|
+
.filter(s => s.score > 0)
|
|
91
|
+
.slice(0, maxResults)
|
|
92
|
+
.map(s => s.entry);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (matched.length === 0) {
|
|
96
|
+
return (`No tools matched query "${query}". Available deferred tools:\n` +
|
|
97
|
+
_registry.map(e => `- ${e.name}`).join('\n'));
|
|
98
|
+
}
|
|
99
|
+
// Return full schemas as JSON
|
|
100
|
+
const schemas = matched.map(e => ({
|
|
101
|
+
name: e.definition.name,
|
|
102
|
+
description: e.definition.description,
|
|
103
|
+
input_schema: e.definition.input_schema,
|
|
104
|
+
}));
|
|
105
|
+
return JSON.stringify(schemas, null, 2);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=tool-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../../../src/lib/tools/tool-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,IAAI,SAAS,GAAwB,EAAE,CAAC;AAExC,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,OAA4B;IAC9D,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,mBAAmB;IACjC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAClE,OAAO,8DAA8D,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,0EAA0E;YAC1E,6FAA6F;YAC7F,uCAAuC;QACzC,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,uFAAuF;wBACvF,gDAAgD;iBACnD;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mDAAmD;iBACjE;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAA8B;QAC1C,MAAM,KAAK,GAAI,KAAK,CAAC,KAAgB,IAAI,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAI,KAAK,CAAC,WAAsB,IAAI,CAAC,CAAC;QAEtD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,+BAA+B,CAAC;QACzC,CAAC;QAED,IAAI,OAA4B,CAAC;QAEjC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,oBAAoB;YACpB,MAAM,KAAK,GAAG,KAAK;iBAChB,KAAK,CAAC,CAAC,CAAC;iBACR,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACpC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,+DAA+D;YAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;oBAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;oBACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAAE,KAAK,EAAE,CAAC;wBACrC,uBAAuB;wBACvB,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAAE,KAAK,IAAI,CAAC,CAAC;oBACtD,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;gBACzC,OAAO,GAAG,MAAM;qBACb,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;qBACxB,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;qBACpB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CACL,2BAA2B,KAAK,gCAAgC;gBAChE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7C,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI;YACvB,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW;YACrC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC,YAAY;SACxC,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebFetch — HTTP GET/POST with response truncation.
|
|
3
|
+
*
|
|
4
|
+
* Fetches a URL and returns status, headers, and (truncated) body.
|
|
5
|
+
* Follows redirects. 30s timeout. Max 100k chars of response body.
|
|
6
|
+
*/
|
|
7
|
+
import type { Tool } from './index.js';
|
|
8
|
+
export declare const webFetchTool: Tool;
|
|
9
|
+
//# sourceMappingURL=web-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/web-fetch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKvC,eAAO,MAAM,YAAY,EAAE,IAkH1B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebFetch — HTTP GET/POST with response truncation.
|
|
3
|
+
*
|
|
4
|
+
* Fetches a URL and returns status, headers, and (truncated) body.
|
|
5
|
+
* Follows redirects. 30s timeout. Max 100k chars of response body.
|
|
6
|
+
*/
|
|
7
|
+
const MAX_BODY_LENGTH = 100_000;
|
|
8
|
+
const TIMEOUT_MS = 30_000;
|
|
9
|
+
export const webFetchTool = {
|
|
10
|
+
definition: {
|
|
11
|
+
name: 'WebFetch',
|
|
12
|
+
description: 'Fetch a URL via HTTP. Returns status code, selected headers, and response body (truncated to 100k chars). ' +
|
|
13
|
+
'Supports GET and POST. Follows redirects.',
|
|
14
|
+
input_schema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
url: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'The URL to fetch.',
|
|
20
|
+
},
|
|
21
|
+
method: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
|
|
24
|
+
description: 'HTTP method. Default: GET.',
|
|
25
|
+
},
|
|
26
|
+
headers: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
description: 'Optional HTTP headers as key-value pairs.',
|
|
29
|
+
additionalProperties: { type: 'string' },
|
|
30
|
+
},
|
|
31
|
+
body: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Request body (for POST/PUT/PATCH).',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ['url'],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
async execute(input) {
|
|
40
|
+
const url = input.url;
|
|
41
|
+
if (!url)
|
|
42
|
+
return 'Error: url is required.';
|
|
43
|
+
// Basic URL validation
|
|
44
|
+
try {
|
|
45
|
+
new URL(url);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return `Error: Invalid URL "${url}".`;
|
|
49
|
+
}
|
|
50
|
+
const method = input.method || 'GET';
|
|
51
|
+
const headers = input.headers || {};
|
|
52
|
+
const body = input.body;
|
|
53
|
+
try {
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
56
|
+
const fetchOpts = {
|
|
57
|
+
method,
|
|
58
|
+
headers,
|
|
59
|
+
signal: controller.signal,
|
|
60
|
+
redirect: 'follow',
|
|
61
|
+
};
|
|
62
|
+
if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {
|
|
63
|
+
fetchOpts.body = body;
|
|
64
|
+
if (!headers['content-type'] && !headers['Content-Type']) {
|
|
65
|
+
fetchOpts.headers['Content-Type'] = 'application/json';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const response = await fetch(url, fetchOpts);
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
// Collect relevant headers
|
|
71
|
+
const relevantHeaders = {};
|
|
72
|
+
for (const key of ['content-type', 'content-length', 'location', 'x-ratelimit-remaining']) {
|
|
73
|
+
const val = response.headers.get(key);
|
|
74
|
+
if (val)
|
|
75
|
+
relevantHeaders[key] = val;
|
|
76
|
+
}
|
|
77
|
+
// Read body
|
|
78
|
+
let responseBody;
|
|
79
|
+
const contentType = response.headers.get('content-type') || '';
|
|
80
|
+
if (contentType.includes('application/json') || contentType.includes('text/')) {
|
|
81
|
+
responseBody = await response.text();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Binary content — just report metadata
|
|
85
|
+
const contentLength = response.headers.get('content-length');
|
|
86
|
+
responseBody = `[Binary content: ${contentType}, ${contentLength || 'unknown'} bytes]`;
|
|
87
|
+
}
|
|
88
|
+
// Truncate
|
|
89
|
+
let truncated = false;
|
|
90
|
+
if (responseBody.length > MAX_BODY_LENGTH) {
|
|
91
|
+
responseBody = responseBody.slice(0, MAX_BODY_LENGTH);
|
|
92
|
+
truncated = true;
|
|
93
|
+
}
|
|
94
|
+
const parts = [
|
|
95
|
+
`Status: ${response.status} ${response.statusText}`,
|
|
96
|
+
`Headers: ${JSON.stringify(relevantHeaders)}`,
|
|
97
|
+
'',
|
|
98
|
+
responseBody,
|
|
99
|
+
];
|
|
100
|
+
if (truncated) {
|
|
101
|
+
parts.push('', `[Response truncated at ${MAX_BODY_LENGTH} chars]`);
|
|
102
|
+
}
|
|
103
|
+
return parts.join('\n');
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
const error = err;
|
|
107
|
+
if (error.name === 'AbortError') {
|
|
108
|
+
return `Error: Request timed out after ${TIMEOUT_MS / 1000}s.`;
|
|
109
|
+
}
|
|
110
|
+
return `Error: ${error.message}`;
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../../src/lib/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSearch — web search via Brave Search API.
|
|
3
|
+
*
|
|
4
|
+
* Returns structured search results. Requires BRAVE_SEARCH_API_KEY
|
|
5
|
+
* environment variable or config. Falls back to a helpful error message
|
|
6
|
+
* suggesting WebFetch as alternative.
|
|
7
|
+
*/
|
|
8
|
+
import type { Tool } from './index.js';
|
|
9
|
+
/** Set the Brave Search API key programmatically. */
|
|
10
|
+
export declare function setBraveSearchApiKey(key: string): void;
|
|
11
|
+
export declare const webSearchTool: Tool;
|
|
12
|
+
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQvC,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtD;AAMD,eAAO,MAAM,aAAa,EAAE,IA0F3B,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSearch — web search via Brave Search API.
|
|
3
|
+
*
|
|
4
|
+
* Returns structured search results. Requires BRAVE_SEARCH_API_KEY
|
|
5
|
+
* environment variable or config. Falls back to a helpful error message
|
|
6
|
+
* suggesting WebFetch as alternative.
|
|
7
|
+
*/
|
|
8
|
+
const BRAVE_API_URL = 'https://api.search.brave.com/res/v1/web/search';
|
|
9
|
+
const TIMEOUT_MS = 15_000;
|
|
10
|
+
const MAX_RESULTS = 10;
|
|
11
|
+
let _braveApiKey = null;
|
|
12
|
+
/** Set the Brave Search API key programmatically. */
|
|
13
|
+
export function setBraveSearchApiKey(key) {
|
|
14
|
+
_braveApiKey = key;
|
|
15
|
+
}
|
|
16
|
+
function getApiKey() {
|
|
17
|
+
return _braveApiKey || process.env.BRAVE_SEARCH_API_KEY || null;
|
|
18
|
+
}
|
|
19
|
+
export const webSearchTool = {
|
|
20
|
+
definition: {
|
|
21
|
+
name: 'WebSearch',
|
|
22
|
+
description: 'Search the web using Brave Search. Returns titles, URLs, and snippets for the top results. ' +
|
|
23
|
+
'Use for finding documentation, current information, or discovering URLs to fetch with WebFetch.',
|
|
24
|
+
input_schema: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
query: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'The search query.',
|
|
30
|
+
},
|
|
31
|
+
count: {
|
|
32
|
+
type: 'number',
|
|
33
|
+
description: `Number of results to return (default: 5, max: ${MAX_RESULTS}).`,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ['query'],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
async execute(input) {
|
|
40
|
+
const query = input.query;
|
|
41
|
+
if (!query)
|
|
42
|
+
return 'Error: query is required.';
|
|
43
|
+
const apiKey = getApiKey();
|
|
44
|
+
if (!apiKey) {
|
|
45
|
+
return ('Error: No Brave Search API key configured. ' +
|
|
46
|
+
'Set BRAVE_SEARCH_API_KEY environment variable or configure via gateway config.\n\n' +
|
|
47
|
+
'Alternative: Use WebFetch to fetch a specific URL directly (e.g., a documentation page).');
|
|
48
|
+
}
|
|
49
|
+
const count = Math.min(input.count || 5, MAX_RESULTS);
|
|
50
|
+
try {
|
|
51
|
+
const controller = new AbortController();
|
|
52
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
53
|
+
const params = new URLSearchParams({
|
|
54
|
+
q: query,
|
|
55
|
+
count: String(count),
|
|
56
|
+
});
|
|
57
|
+
const response = await fetch(`${BRAVE_API_URL}?${params}`, {
|
|
58
|
+
headers: {
|
|
59
|
+
Accept: 'application/json',
|
|
60
|
+
'Accept-Encoding': 'gzip',
|
|
61
|
+
'X-Subscription-Token': apiKey,
|
|
62
|
+
},
|
|
63
|
+
signal: controller.signal,
|
|
64
|
+
});
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const text = await response.text();
|
|
68
|
+
return `Error: Brave Search returned ${response.status}: ${text.slice(0, 500)}`;
|
|
69
|
+
}
|
|
70
|
+
const data = (await response.json());
|
|
71
|
+
const results = data.web?.results || [];
|
|
72
|
+
if (results.length === 0) {
|
|
73
|
+
return `No results found for "${query}".`;
|
|
74
|
+
}
|
|
75
|
+
const formatted = results.map((r, i) => {
|
|
76
|
+
return `${i + 1}. **${r.title}**\n ${r.url}\n ${r.description}`;
|
|
77
|
+
});
|
|
78
|
+
return `Web search results for "${query}":\n\n${formatted.join('\n\n')}`;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const error = err;
|
|
82
|
+
if (error.name === 'AbortError') {
|
|
83
|
+
return `Error: Search timed out after ${TIMEOUT_MS / 1000}s.`;
|
|
84
|
+
}
|
|
85
|
+
return `Error: ${error.message}`;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=web-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/lib/tools/web-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/write.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,SAAS,EAAE,IAqCvB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write tool — create or overwrite files.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
export const writeTool = {
|
|
7
|
+
definition: {
|
|
8
|
+
name: 'Write',
|
|
9
|
+
description: 'Write content to a file. Creates the file if it does not exist, ' +
|
|
10
|
+
'or overwrites it if it does. Creates parent directories as needed.',
|
|
11
|
+
input_schema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
file_path: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Absolute path to the file to write',
|
|
17
|
+
},
|
|
18
|
+
content: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'The content to write to the file',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
required: ['file_path', 'content'],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
async execute(input, cwd) {
|
|
27
|
+
const filePath = resolvePath(input.file_path, cwd);
|
|
28
|
+
const content = input.content;
|
|
29
|
+
// Create parent directories
|
|
30
|
+
const dir = path.dirname(filePath);
|
|
31
|
+
if (!fs.existsSync(dir)) {
|
|
32
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
35
|
+
const lines = content.split('\n').length;
|
|
36
|
+
return `File written: ${filePath} (${lines} lines, ${content.length} bytes)`;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
function resolvePath(filePath, cwd) {
|
|
40
|
+
if (path.isAbsolute(filePath))
|
|
41
|
+
return filePath;
|
|
42
|
+
return path.resolve(cwd, filePath);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=write.js.map
|