@x-code-cli/core 0.1.0 → 0.1.4
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/agent/api-errors.d.ts +11 -0
- package/dist/agent/api-errors.d.ts.map +1 -0
- package/dist/agent/api-errors.js +134 -0
- package/dist/agent/api-errors.js.map +1 -0
- package/dist/agent/context-window.d.ts +26 -0
- package/dist/agent/context-window.d.ts.map +1 -0
- package/dist/agent/context-window.js +126 -0
- package/dist/agent/context-window.js.map +1 -0
- package/dist/agent/loop-state.d.ts +14 -0
- package/dist/agent/loop-state.d.ts.map +1 -0
- package/dist/agent/loop-state.js +12 -0
- package/dist/agent/loop-state.js.map +1 -0
- package/dist/agent/loop.d.ts +11 -15
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +213 -381
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/messages.d.ts +0 -2
- package/dist/agent/messages.d.ts.map +1 -1
- package/dist/agent/messages.js +0 -32
- package/dist/agent/messages.js.map +1 -1
- package/dist/agent/provider-compat.d.ts +17 -0
- package/dist/agent/provider-compat.d.ts.map +1 -0
- package/dist/agent/provider-compat.js +31 -0
- package/dist/agent/provider-compat.js.map +1 -0
- package/dist/agent/stream-utils.d.ts +33 -0
- package/dist/agent/stream-utils.d.ts.map +1 -0
- package/dist/agent/stream-utils.js +14 -0
- package/dist/agent/stream-utils.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +1 -3
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +35 -24
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-execution.d.ts +11 -0
- package/dist/agent/tool-execution.d.ts.map +1 -0
- package/dist/agent/tool-execution.js +171 -0
- package/dist/agent/tool-execution.js.map +1 -0
- package/dist/config/index.d.ts +19 -8
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +66 -32
- package/dist/config/index.js.map +1 -1
- package/dist/index.d.ts +7 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/knowledge/auto-memory.d.ts +1 -1
- package/dist/knowledge/auto-memory.d.ts.map +1 -1
- package/dist/knowledge/auto-memory.js +56 -17
- package/dist/knowledge/auto-memory.js.map +1 -1
- package/dist/knowledge/init.d.ts +1 -2
- package/dist/knowledge/init.d.ts.map +1 -1
- package/dist/knowledge/init.js +84 -70
- package/dist/knowledge/init.js.map +1 -1
- package/dist/knowledge/loader.d.ts +0 -9
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +54 -99
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/session.d.ts +1 -1
- package/dist/knowledge/session.d.ts.map +1 -1
- package/dist/knowledge/session.js +3 -2
- package/dist/knowledge/session.js.map +1 -1
- package/dist/permissions/index.d.ts +2 -0
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +36 -15
- package/dist/permissions/index.js.map +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/tools/ask-user.js +1 -1
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/edit.js +1 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +4 -2
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +8 -3
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +2 -6
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -6
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-dir.d.ts.map +1 -1
- package/dist/tools/list-dir.js +4 -2
- package/dist/tools/list-dir.js.map +1 -1
- package/dist/tools/progress.d.ts +6 -0
- package/dist/tools/progress.d.ts.map +1 -0
- package/dist/tools/progress.js +14 -0
- package/dist/tools/progress.js.map +1 -0
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +4 -2
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/save-knowledge.d.ts +1 -1
- package/dist/tools/save-knowledge.d.ts.map +1 -1
- package/dist/tools/save-knowledge.js +31 -6
- package/dist/tools/save-knowledge.js.map +1 -1
- package/dist/tools/shell-utils.d.ts.map +1 -1
- package/dist/tools/shell-utils.js +8 -1
- package/dist/tools/shell-utils.js.map +1 -1
- package/dist/tools/shell.js +1 -1
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +88 -19
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +85 -12
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write-file.js +1 -1
- package/dist/tools/write-file.js.map +1 -1
- package/dist/types/index.d.ts +60 -21
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +64 -6
- package/dist/types/index.js.map +1 -1
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -1
- package/dist/utils.js.map +1 -1
- package/package.json +6 -1
- package/dist/agent/plan-mode.d.ts +0 -11
- package/dist/agent/plan-mode.d.ts.map +0 -1
- package/dist/agent/plan-mode.js +0 -37
- package/dist/agent/plan-mode.js.map +0 -1
- package/dist/agent/pricing.d.ts +0 -9
- package/dist/agent/pricing.d.ts.map +0 -1
- package/dist/agent/pricing.js +0 -47
- package/dist/agent/pricing.js.map +0 -1
- package/dist/knowledge/hooks.d.ts +0 -3
- package/dist/knowledge/hooks.d.ts.map +0 -1
- package/dist/knowledge/hooks.js +0 -59
- package/dist/knowledge/hooks.js.map +0 -1
- package/dist/tools/enter-plan-mode.d.ts +0 -2
- package/dist/tools/enter-plan-mode.d.ts.map +0 -1
- package/dist/tools/enter-plan-mode.js +0 -11
- package/dist/tools/enter-plan-mode.js.map +0 -1
- package/dist/tools/exit-plan-mode.d.ts +0 -2
- package/dist/tools/exit-plan-mode.d.ts.map +0 -1
- package/dist/tools/exit-plan-mode.js +0 -9
- package/dist/tools/exit-plan-mode.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,2FAA2F;IACxG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC/D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;YAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACzC,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAA;YAC7B,CAAC,CAAC,CAAA;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAA;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,4BAA4B,GAAG,EAAE,CAAA;QAC1C,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type ProgressReporter = (message: string) => void;
|
|
2
|
+
export declare function setProgressReporter(toolCallId: string, fn: ProgressReporter): void;
|
|
3
|
+
export declare function clearProgressReporter(toolCallId: string): void;
|
|
4
|
+
/** No-op if no reporter is registered. Safe to call from anywhere. */
|
|
5
|
+
export declare function reportProgress(toolCallId: string | undefined, message: string): void;
|
|
6
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAIxD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAElF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGpF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const reporters = new Map();
|
|
2
|
+
export function setProgressReporter(toolCallId, fn) {
|
|
3
|
+
reporters.set(toolCallId, fn);
|
|
4
|
+
}
|
|
5
|
+
export function clearProgressReporter(toolCallId) {
|
|
6
|
+
reporters.delete(toolCallId);
|
|
7
|
+
}
|
|
8
|
+
/** No-op if no reporter is registered. Safe to call from anywhere. */
|
|
9
|
+
export function reportProgress(toolCallId, message) {
|
|
10
|
+
if (!toolCallId)
|
|
11
|
+
return;
|
|
12
|
+
reporters.get(toolCallId)?.(message);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAmBA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAA;AAErD,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,EAAoB;IAC1E,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;AAC9B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,UAA8B,EAAE,OAAe;IAC5E,IAAI,CAAC,UAAU;QAAE,OAAM;IACvB,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,QAAQ;;;;UAsBnB,CAAA"}
|
package/dist/tools/read-file.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
// @x-code/core — readFile tool
|
|
1
|
+
// @x-code-cli/core — readFile tool
|
|
2
2
|
import fs from 'node:fs/promises';
|
|
3
3
|
import { tool } from 'ai';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
+
import { reportProgress } from './progress.js';
|
|
5
6
|
export const readFile = tool({
|
|
6
7
|
description: 'Read the contents of a file at the given path. Returns the file content with line numbers.',
|
|
7
8
|
inputSchema: z.object({
|
|
@@ -9,8 +10,9 @@ export const readFile = tool({
|
|
|
9
10
|
offset: z.number().optional().describe('Start line (1-based)'),
|
|
10
11
|
limit: z.number().optional().describe('Max lines to read'),
|
|
11
12
|
}),
|
|
12
|
-
execute: async ({ filePath, offset, limit }) => {
|
|
13
|
+
execute: async ({ filePath, offset, limit }, { toolCallId }) => {
|
|
13
14
|
try {
|
|
15
|
+
reportProgress(toolCallId, `Reading ${filePath}`);
|
|
14
16
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
15
17
|
const lines = content.split('\n');
|
|
16
18
|
const start = (offset ?? 1) - 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,4FAA4F;IACzG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,EAAE,WAAW,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,uBAAuB,GAAG,EAAE,CAAA;QACrC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export declare const saveKnowledge: import("ai").Tool<{
|
|
2
|
+
category: "user" | "feedback" | "project" | "reference";
|
|
2
3
|
action: "add" | "delete";
|
|
3
4
|
key: string;
|
|
4
5
|
fact: string;
|
|
5
6
|
scope: "project" | "global";
|
|
6
|
-
category: "tech-stack" | "commands" | "conventions" | "preferences" | "context";
|
|
7
7
|
}, string>;
|
|
8
8
|
//# sourceMappingURL=save-knowledge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/save-knowledge.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa;;;;;;
|
|
1
|
+
{"version":3,"file":"save-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/save-knowledge.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa;;;;;;UAyDxB,CAAA"}
|
|
@@ -1,19 +1,44 @@
|
|
|
1
|
-
// @x-code/core — saveKnowledge tool (
|
|
1
|
+
// @x-code-cli/core — saveKnowledge tool (AI-written persistent memory)
|
|
2
2
|
import { tool } from 'ai';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { getAutoMemory } from '../knowledge/auto-memory.js';
|
|
5
5
|
export const saveKnowledge = tool({
|
|
6
|
-
description:
|
|
6
|
+
description: `Save or delete a persistent memory that should survive across sessions.
|
|
7
|
+
|
|
8
|
+
Before calling this tool, ask yourself: **"Will a future session plausibly act better because I save this?"** If not — do NOT call the tool. No-op is the default; saving is the exception. This tool is strictly for durable, cross-session knowledge.
|
|
9
|
+
|
|
10
|
+
Every memory MUST be filed under one of four categories — pick the one that describes the TYPE of knowledge, not the topic:
|
|
11
|
+
|
|
12
|
+
user — Facts about the human user: their role, expertise, goals, long-term constraints. Example: "user is a senior Go engineer new to this frontend".
|
|
13
|
+
feedback — Corrections or validated approaches the user has given. Save both when the user corrects you AND when they confirm a non-obvious choice worked. Include WHY so edge cases are judgeable. Example: "integration tests must hit real DB, not mocks — prior incident where mocks masked broken migration".
|
|
14
|
+
project — Ongoing work, initiatives, deadlines, non-obvious project state that would NOT be derivable from reading code or git log. Example: "merge freeze begins 2026-03-05 for mobile release cut".
|
|
15
|
+
reference — Pointers to external systems. Example: "pipeline bugs tracked in Linear project INGEST".
|
|
16
|
+
|
|
17
|
+
Do NOT save any of these (these are the common failure modes):
|
|
18
|
+
- The user's current task or request ("user asked me to build a snake game") — this is transient, not durable
|
|
19
|
+
- Summaries of code you just wrote, bugs you just fixed, or findings from the current turn
|
|
20
|
+
- Anything derivable from the code or git log (tech stack, package.json scripts, dependencies, directory layout) — future sessions can read the code
|
|
21
|
+
- Content already in AGENTS.md / CLAUDE.md
|
|
22
|
+
- Debugging solutions (the fix is in the code; the commit has the context)
|
|
23
|
+
- Duplicates or near-duplicates of an existing memory — update the existing one instead
|
|
24
|
+
|
|
25
|
+
Even if the user says "remember X" — if X is one-off task context (a specific request, a game they wanted), still decline. Ask yourself what is *surprising* or *durable* about it; if nothing, no-op.
|
|
26
|
+
|
|
27
|
+
Scope: project = this repo only; global = applies across all repos.`,
|
|
7
28
|
inputSchema: z.object({
|
|
8
29
|
action: z
|
|
9
30
|
.enum(['add', 'delete'])
|
|
10
31
|
.describe('add = create or update (auto-replaces conflicting old fact), delete = remove outdated fact'),
|
|
11
32
|
key: z
|
|
12
33
|
.string()
|
|
13
|
-
.describe('
|
|
14
|
-
fact: z
|
|
15
|
-
|
|
16
|
-
|
|
34
|
+
.describe('Short unique slug identifying this fact. Same key under same category auto-replaces. Example: "testing-db-policy", "user-role".'),
|
|
35
|
+
fact: z
|
|
36
|
+
.string()
|
|
37
|
+
.describe('The fact itself. For feedback, lead with the rule and include a one-line reason so future edge cases are judgeable.'),
|
|
38
|
+
scope: z.enum(['project', 'global']).describe('project = this repo (.x-code/), global = all repos (~/.x-code/)'),
|
|
39
|
+
category: z
|
|
40
|
+
.enum(['user', 'feedback', 'project', 'reference'])
|
|
41
|
+
.describe('user | feedback | project | reference — see tool description for when to pick each'),
|
|
17
42
|
}),
|
|
18
43
|
execute: ({ action, key, fact, scope, category }) => {
|
|
19
44
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-knowledge.js","sourceRoot":"","sources":["../../src/tools/save-knowledge.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"save-knowledge.js","sourceRoot":"","sources":["../../src/tools/save-knowledge.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;oEAqBqD;IAClE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;aACvB,QAAQ,CAAC,4FAA4F,CAAC;QACzG,GAAG,EAAE,CAAC;aACH,MAAM,EAAE;aACR,QAAQ,CACP,iIAAiI,CAClI;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CACP,qHAAqH,CACtH;QACH,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QAChH,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;aAClD,QAAQ,CAAC,oFAAoF,CAAC;KAClG,CAAC;IACF,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;YACnC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;gBAChF,OAAO,qBAAqB,QAAQ,KAAK,GAAG,KAAK,IAAI,EAAE,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;gBAC5B,OAAO,uBAAuB,QAAQ,KAAK,GAAG,EAAE,CAAA;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,2BAA2B,GAAG,EAAE,CAAA;QACzC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-utils.d.ts","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,KAAK,CAAA;AAErD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,wBAAgB,cAAc,IAAI,WAAW,
|
|
1
|
+
{"version":3,"file":"shell-utils.d.ts","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,KAAK,CAAA;AAErD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,wBAAgB,cAAc,IAAI,WAAW,CAc5C;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA0CxD;AAkDD,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlD"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
// @x-code/core — Cross-platform shell detection and abstraction
|
|
1
|
+
// @x-code-cli/core — Cross-platform shell detection and abstraction
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
export function getShellConfig() {
|
|
4
4
|
if (os.platform() === 'win32') {
|
|
5
|
+
// Git Bash / MSYS2 / Cygwin set SHELL to a Unix-style path (e.g. /usr/bin/bash).
|
|
6
|
+
// Prefer that shell when available so the Unix tool ecosystem works as expected.
|
|
7
|
+
const shell = process.env.SHELL;
|
|
8
|
+
if (shell && /\b(bash|zsh)$/i.test(shell)) {
|
|
9
|
+
const type = shell.endsWith('zsh') ? 'zsh' : 'bash';
|
|
10
|
+
return { executable: shell, args: ['-c'], type };
|
|
11
|
+
}
|
|
5
12
|
return { executable: 'powershell.exe', args: ['-NoProfile', '-Command'], type: 'powershell' };
|
|
6
13
|
}
|
|
7
14
|
const userShell = process.env.SHELL ?? '/bin/bash';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-utils.js","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"shell-utils.js","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/shell.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// @x-code/core — shell tool (cross-platform command execution, no execute — needs permission check)
|
|
1
|
+
// @x-code-cli/core — shell tool (cross-platform command execution, no execute — needs permission check)
|
|
2
2
|
import { tool } from 'ai';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
export const shell = tool({
|
package/dist/tools/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC;IACxB,WAAW,EACT,kHAAkH;IACpH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACpF,CAAC;IACF,sGAAsG;CACvG,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAmFA,eAAO,MAAM,QAAQ;;;UAsEnB,CAAA"}
|
package/dist/tools/web-fetch.js
CHANGED
|
@@ -1,40 +1,111 @@
|
|
|
1
|
-
// @x-code/core — webFetch tool (HTTP fetch + HTML→Markdown)
|
|
1
|
+
// @x-code-cli/core — webFetch tool (HTTP fetch + HTML→Markdown, with LRU cache + CF fallback)
|
|
2
2
|
import * as cheerio from 'cheerio';
|
|
3
3
|
// @ts-expect-error turndown has no types
|
|
4
4
|
import TurndownService from 'turndown';
|
|
5
5
|
import { tool } from 'ai';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
//
|
|
7
|
+
import { reportProgress } from './progress.js';
|
|
8
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
9
|
+
// Markdown returned to the model. Bumped from 30 KB (which cut docs pages in half)
|
|
10
|
+
// but kept well under the model's context budget: ~100 KB ≈ ~25 K tokens, roughly
|
|
11
|
+
// 12% of a Sonnet 200 K window, so a single fetch can't blow context.
|
|
12
|
+
// This is a per-call cap; the model can always fetch again with a narrower prompt.
|
|
13
|
+
const MAX_CONTENT_CHARS = 100_000;
|
|
14
|
+
// Raw HTML ceiling before turndown. 10 MB is comfortable for any real doc page;
|
|
15
|
+
// enforced via content-length header (best-effort — chunked responses skip this,
|
|
16
|
+
// in which case the 15 s fetch timeout bounds the download).
|
|
17
|
+
const MAX_HTTP_BYTES = 10 * 1024 * 1024;
|
|
18
|
+
const CACHE_TTL_MS = 15 * 60 * 1000;
|
|
19
|
+
const CACHE_MAX_ENTRIES = 50;
|
|
20
|
+
const BROWSER_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36';
|
|
21
|
+
// Used as Cloudflare fallback: aggressive bot rules often let honest CLI UAs through
|
|
22
|
+
// while blocking browser impersonators that fail TLS-fingerprint checks.
|
|
23
|
+
const FALLBACK_UA = 'x-code-cli/0.1 (+https://github.com/woai3c/x-code-cli)';
|
|
24
|
+
const YEAR = new Date().getFullYear();
|
|
25
|
+
const fetchCache = new Map();
|
|
26
|
+
function cacheGet(url) {
|
|
27
|
+
const entry = fetchCache.get(url);
|
|
28
|
+
if (!entry)
|
|
29
|
+
return null;
|
|
30
|
+
if (Date.now() - entry.at > CACHE_TTL_MS) {
|
|
31
|
+
fetchCache.delete(url);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
// LRU: re-insert to move this entry to the tail (most-recently-used)
|
|
35
|
+
fetchCache.delete(url);
|
|
36
|
+
fetchCache.set(url, entry);
|
|
37
|
+
return entry.markdown;
|
|
38
|
+
}
|
|
39
|
+
function cacheSet(url, markdown) {
|
|
40
|
+
if (fetchCache.size >= CACHE_MAX_ENTRIES) {
|
|
41
|
+
const oldest = fetchCache.keys().next().value;
|
|
42
|
+
if (oldest !== undefined)
|
|
43
|
+
fetchCache.delete(oldest);
|
|
44
|
+
}
|
|
45
|
+
fetchCache.set(url, { markdown, at: Date.now() });
|
|
46
|
+
}
|
|
10
47
|
const turndown = new TurndownService({
|
|
11
48
|
headingStyle: 'atx',
|
|
12
49
|
codeBlockStyle: 'fenced',
|
|
13
50
|
});
|
|
51
|
+
async function doFetch(url, userAgent) {
|
|
52
|
+
return fetch(url, {
|
|
53
|
+
headers: {
|
|
54
|
+
'User-Agent': userAgent,
|
|
55
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5',
|
|
56
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
57
|
+
},
|
|
58
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function formatOutput(url, markdown, prompt) {
|
|
62
|
+
if (prompt) {
|
|
63
|
+
return `# Content from ${url}\n\n${markdown}\n\n---\nExtract instruction: ${prompt}`;
|
|
64
|
+
}
|
|
65
|
+
return markdown;
|
|
66
|
+
}
|
|
14
67
|
export const webFetch = tool({
|
|
15
|
-
description:
|
|
68
|
+
description: `Fetch a web page and extract its content as markdown. No API key needed. ` +
|
|
69
|
+
`When summarizing the returned content for the user, preserve key details, concrete examples, ` +
|
|
70
|
+
`section structure, and numbers — don't over-compress. ` +
|
|
71
|
+
`Results are cached for 15 minutes per URL, so repeated reads of the same page are free. ` +
|
|
72
|
+
`The current year is ${YEAR} — use it whenever the user asks for recent/latest/current information.`,
|
|
16
73
|
inputSchema: z.object({
|
|
17
74
|
url: z.string().url().describe('The URL to fetch'),
|
|
18
75
|
prompt: z.string().optional().describe('What information to extract from the page'),
|
|
19
76
|
}),
|
|
20
|
-
execute: async ({ url, prompt }) => {
|
|
77
|
+
execute: async ({ url, prompt }, { toolCallId }) => {
|
|
21
78
|
try {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
79
|
+
const cached = cacheGet(url);
|
|
80
|
+
if (cached) {
|
|
81
|
+
reportProgress(toolCallId, 'Using cached copy');
|
|
82
|
+
return formatOutput(url, cached, prompt);
|
|
83
|
+
}
|
|
84
|
+
reportProgress(toolCallId, `Fetching ${url}`);
|
|
85
|
+
let response = await doFetch(url, BROWSER_UA);
|
|
86
|
+
// Cloudflare bot-challenge fallback: on 403 + cf-mitigated header, retry with
|
|
87
|
+
// an honest CLI UA. Many CF rules whitelist identified crawlers while blocking
|
|
88
|
+
// anything that fails the browser TLS fingerprint check.
|
|
89
|
+
if (response.status === 403 && response.headers.get('cf-mitigated') !== null) {
|
|
90
|
+
response = await doFetch(url, FALLBACK_UA);
|
|
91
|
+
}
|
|
29
92
|
if (!response.ok) {
|
|
30
93
|
return `Error: HTTP ${response.status} ${response.statusText}`;
|
|
31
94
|
}
|
|
95
|
+
// Best-effort size guard: content-length is optional under chunked encoding,
|
|
96
|
+
// so we also rely on fetch's 15s timeout to bound pathological pages.
|
|
97
|
+
const contentLength = Number(response.headers.get('content-length') ?? '0');
|
|
98
|
+
if (contentLength > MAX_HTTP_BYTES) {
|
|
99
|
+
const mb = Math.round(contentLength / 1024 / 1024);
|
|
100
|
+
return `Error: Content too large (${mb} MB, limit ${MAX_HTTP_BYTES / 1024 / 1024} MB)`;
|
|
101
|
+
}
|
|
32
102
|
const contentType = response.headers.get('content-type') ?? '';
|
|
33
103
|
const body = await response.text();
|
|
34
104
|
if (contentType.includes('application/json')) {
|
|
35
|
-
|
|
105
|
+
const json = body.slice(0, MAX_CONTENT_CHARS);
|
|
106
|
+
cacheSet(url, json);
|
|
107
|
+
return formatOutput(url, json, prompt);
|
|
36
108
|
}
|
|
37
|
-
// HTML → Markdown
|
|
38
109
|
const $ = cheerio.load(body);
|
|
39
110
|
$('script, style, nav, footer, header, aside, .sidebar, .nav, .menu, .ads, .advertisement').remove();
|
|
40
111
|
const mainContent = $('main, article, .content, .post, #content').first();
|
|
@@ -45,10 +116,8 @@ export const webFetch = tool({
|
|
|
45
116
|
if (markdown.length > MAX_CONTENT_CHARS) {
|
|
46
117
|
markdown = markdown.slice(0, MAX_CONTENT_CHARS) + '\n\n... [content truncated]';
|
|
47
118
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
return markdown;
|
|
119
|
+
cacheSet(url, markdown);
|
|
120
|
+
return formatOutput(url, markdown, prompt);
|
|
52
121
|
}
|
|
53
122
|
catch (err) {
|
|
54
123
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AA6FA,eAAO,MAAM,SAAS;;;UAyBpB,CAAA"}
|
package/dist/tools/web-search.js
CHANGED
|
@@ -1,26 +1,99 @@
|
|
|
1
|
-
// @x-code/core — webSearch tool (Tavily
|
|
1
|
+
// @x-code-cli/core — webSearch tool (Tavily primary, Brave fallback)
|
|
2
2
|
import { tool } from 'ai';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
+
import { reportProgress } from './progress.js';
|
|
5
|
+
import { getShellConfig } from './shell-utils.js';
|
|
6
|
+
const YEAR = new Date().getFullYear();
|
|
7
|
+
const BRAVE_TIMEOUT_MS = 15_000;
|
|
8
|
+
async function searchWithTavily(query, maxResults) {
|
|
9
|
+
const { tavily } = await import('@tavily/core');
|
|
10
|
+
const client = tavily({ apiKey: process.env.TAVILY_API_KEY });
|
|
11
|
+
const response = await client.search(query, { maxResults });
|
|
12
|
+
return response.results.map((r) => ({ title: r.title, url: r.url, content: r.content }));
|
|
13
|
+
}
|
|
14
|
+
async function searchWithBrave(query, maxResults) {
|
|
15
|
+
const url = new URL('https://api.search.brave.com/res/v1/web/search');
|
|
16
|
+
url.searchParams.set('q', query);
|
|
17
|
+
url.searchParams.set('count', String(Math.min(maxResults, 20)));
|
|
18
|
+
const res = await fetch(url, {
|
|
19
|
+
headers: {
|
|
20
|
+
'X-Subscription-Token': process.env.BRAVE_API_KEY,
|
|
21
|
+
Accept: 'application/json',
|
|
22
|
+
},
|
|
23
|
+
signal: AbortSignal.timeout(BRAVE_TIMEOUT_MS),
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
throw new Error(`Brave API returned HTTP ${res.status} ${res.statusText}`);
|
|
27
|
+
}
|
|
28
|
+
const data = (await res.json());
|
|
29
|
+
return (data.web?.results ?? []).map((r) => ({ title: r.title, url: r.url, content: r.description }));
|
|
30
|
+
}
|
|
31
|
+
function buildMissingKeyError() {
|
|
32
|
+
const { type } = getShellConfig();
|
|
33
|
+
let setupBlock;
|
|
34
|
+
if (type === 'powershell') {
|
|
35
|
+
setupBlock = [
|
|
36
|
+
' # current session:',
|
|
37
|
+
' $env:TAVILY_API_KEY = "tvly-xxx"',
|
|
38
|
+
' $env:BRAVE_API_KEY = "BSA-xxx"',
|
|
39
|
+
' # persistent (new shells):',
|
|
40
|
+
' [Environment]::SetEnvironmentVariable("TAVILY_API_KEY","tvly-xxx","User")',
|
|
41
|
+
' [Environment]::SetEnvironmentVariable("BRAVE_API_KEY", "BSA-xxx", "User")',
|
|
42
|
+
].join('\n');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const rc = type === 'zsh' ? '~/.zshrc' : '~/.bashrc';
|
|
46
|
+
setupBlock = [
|
|
47
|
+
' # current session:',
|
|
48
|
+
' export TAVILY_API_KEY="tvly-xxx"',
|
|
49
|
+
' export BRAVE_API_KEY="BSA-xxx"',
|
|
50
|
+
' # persistent (new shells):',
|
|
51
|
+
` echo 'export TAVILY_API_KEY="tvly-xxx"' >> ${rc}`,
|
|
52
|
+
` echo 'export BRAVE_API_KEY="BSA-xxx"' >> ${rc}`,
|
|
53
|
+
].join('\n');
|
|
54
|
+
}
|
|
55
|
+
return [
|
|
56
|
+
'Error: WebSearch requires an API key. Two free options (set either one):',
|
|
57
|
+
'',
|
|
58
|
+
' 1. Tavily — 1000 searches/month, recommended',
|
|
59
|
+
' Sign up: https://tavily.com → copy API key from dashboard',
|
|
60
|
+
'',
|
|
61
|
+
' 2. Brave — 2000 searches/month (requires credit card, no charge)',
|
|
62
|
+
' Sign up: https://api.search.brave.com → create API key',
|
|
63
|
+
'',
|
|
64
|
+
`Setup (${type}):`,
|
|
65
|
+
setupBlock,
|
|
66
|
+
'',
|
|
67
|
+
'After setting, restart this shell for the variable to take effect.',
|
|
68
|
+
].join('\n');
|
|
69
|
+
}
|
|
70
|
+
function formatResults(results) {
|
|
71
|
+
if (results.length === 0)
|
|
72
|
+
return 'No results found.';
|
|
73
|
+
return results.map((r) => `### ${r.title}\n${r.url}\n${r.content}`).join('\n\n');
|
|
74
|
+
}
|
|
4
75
|
export const webSearch = tool({
|
|
5
|
-
description:
|
|
76
|
+
description: `Search the web for information. Useful for looking up documentation, error messages, or current information. ` +
|
|
77
|
+
`The current year is ${YEAR} — use it whenever the user asks for recent/latest/current information ` +
|
|
78
|
+
`(e.g. prefer "React 19 release notes ${YEAR}" over "React latest release notes").`,
|
|
6
79
|
inputSchema: z.object({
|
|
7
80
|
query: z.string().describe('The search query'),
|
|
8
81
|
maxResults: z.number().optional().describe('Max results (default: 5)'),
|
|
9
82
|
}),
|
|
10
|
-
execute: async ({ query, maxResults }) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
83
|
+
execute: async ({ query, maxResults }, { toolCallId }) => {
|
|
84
|
+
const n = maxResults ?? 5;
|
|
85
|
+
const hasTavily = !!process.env.TAVILY_API_KEY;
|
|
86
|
+
const hasBrave = !!process.env.BRAVE_API_KEY;
|
|
87
|
+
if (!hasTavily && !hasBrave)
|
|
88
|
+
return buildMissingKeyError();
|
|
89
|
+
reportProgress(toolCallId, `Searching: ${query}`);
|
|
14
90
|
try {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
const response = await client.search(query, { maxResults: maxResults ?? 5 });
|
|
18
|
-
const results = response.results.map((r) => `### ${r.title}\n${r.url}\n${r.content}`);
|
|
19
|
-
return results.join('\n\n') || 'No results found.';
|
|
91
|
+
const results = hasTavily ? await searchWithTavily(query, n) : await searchWithBrave(query, n);
|
|
92
|
+
return formatResults(results);
|
|
20
93
|
}
|
|
21
94
|
catch (err) {
|
|
22
95
|
const msg = err instanceof Error ? err.message : String(err);
|
|
23
|
-
return `Error searching: ${msg}`;
|
|
96
|
+
return `Error searching (${hasTavily ? 'Tavily' : 'Brave'}): ${msg}`;
|
|
24
97
|
}
|
|
25
98
|
},
|
|
26
99
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;AACrC,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAQ/B,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkB;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAe,EAAE,CAAC,CAAA;IAC9D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC3D,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACxG,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,UAAkB;IAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gDAAgD,CAAC,CAAA;IACrE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAE/D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE;YACP,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,aAAc;YAClD,MAAM,EAAE,kBAAkB;SAC3B;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;KAC9C,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AACvG,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;IACjC,IAAI,UAAkB,CAAA;IAEtB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,UAAU,GAAG;YACX,sBAAsB;YACtB,oCAAoC;YACpC,mCAAmC;YACnC,8BAA8B;YAC9B,6EAA6E;YAC7E,6EAA6E;SAC9E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAA;QACpD,UAAU,GAAG;YACX,sBAAsB;YACtB,oCAAoC;YACpC,kCAAkC;YAClC,8BAA8B;YAC9B,gDAAgD,EAAE,EAAE;YACpD,8CAA8C,EAAE,EAAE;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;IAED,OAAO;QACL,0EAA0E;QAC1E,EAAE;QACF,gDAAgD;QAChD,gEAAgE;QAChE,EAAE;QACF,qEAAqE;QACrE,6DAA6D;QAC7D,EAAE;QACF,UAAU,IAAI,IAAI;QAClB,UAAU;QACV,EAAE;QACF,oEAAoE;KACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,aAAa,CAAC,OAAuB;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAA;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EACT,+GAA+G;QAC/G,uBAAuB,IAAI,yEAAyE;QACpG,wCAAwC,IAAI,uCAAuC;IACrF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACvE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvD,MAAM,CAAC,GAAG,UAAU,IAAI,CAAC,CAAA;QACzB,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAC9C,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;QAE5C,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;YAAE,OAAO,oBAAoB,EAAE,CAAA;QAE1D,cAAc,CAAC,UAAU,EAAE,cAAc,KAAK,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC9F,OAAO,aAAa,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,oBAAoB,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,MAAM,GAAG,EAAE,CAAA;QACtE,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|
package/dist/tools/write-file.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EACT,oIAAoI;IACtI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC1D,CAAC;IACF,mEAAmE;CACpE,CAAC,CAAA"}
|