@alexanderfortin/pi-tavily-tools 0.3.1 → 0.4.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/CHANGELOG.md +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/shared/execute.d.ts +7 -0
- package/dist/tools/shared/execute.d.ts.map +1 -1
- package/dist/tools/shared/execute.js +26 -0
- package/dist/tools/shared/execute.js.map +1 -1
- package/dist/tools/web-extract.js +3 -3
- package/dist/tools/web-extract.js.map +1 -1
- package/dist/tools/web-search.js +3 -3
- package/dist/tools/web-search.js.map +1 -1
- package/package.json +25 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# [0.4.0](https://github.com/shaftoe/pi-tavily-tools/compare/v0.3.1...v0.4.0) (2026-04-08)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* forward abort signal, clean temp files, warn on missing API key ([#6](https://github.com/shaftoe/pi-tavily-tools/issues/6)) ([d18529c](https://github.com/shaftoe/pi-tavily-tools/commit/d18529cc8c48ae1575e2405fd89e93233b4ddb7e))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* add semantic release to automate releases ([ae572b0](https://github.com/shaftoe/pi-tavily-tools/commit/ae572b0c2c2529e8b9abc2b70268390bb226aba8))
|
|
12
|
+
|
|
1
13
|
# Changelog
|
|
2
14
|
|
|
3
15
|
All notable changes to this project will be documented in this file.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CAiC/C"}
|
package/dist/index.js
CHANGED
|
@@ -21,8 +21,12 @@ import { TavilyUsageCache } from "./usage/status.js";
|
|
|
21
21
|
*/
|
|
22
22
|
export default function (pi) {
|
|
23
23
|
const apiKey = process.env.TAVILY_API_KEY?.trim();
|
|
24
|
-
if (!apiKey)
|
|
24
|
+
if (!apiKey) {
|
|
25
|
+
pi.on("session_start", (_event, ctx) => {
|
|
26
|
+
ctx.ui.notify("Web Search · TAVILY_API_KEY not set. Get a free key at tavily.com", "warning");
|
|
27
|
+
});
|
|
25
28
|
return;
|
|
29
|
+
}
|
|
26
30
|
let registered = false;
|
|
27
31
|
const usageCache = new TavilyUsageCache(apiKey);
|
|
28
32
|
pi.on("session_start", async (_event, ctx) => {
|
|
@@ -39,6 +43,9 @@ export default function (pi) {
|
|
|
39
43
|
});
|
|
40
44
|
pi.on("session_shutdown", (_event, ctx) => {
|
|
41
45
|
usageCache.clear(ctx);
|
|
46
|
+
import("node:fs/promises")
|
|
47
|
+
.then(({ rm }) => rm(`${ctx.cwd}/.pi-tavily-temp`, { recursive: true, force: true }))
|
|
48
|
+
.catch(() => { }); // best-effort
|
|
42
49
|
});
|
|
43
50
|
}
|
|
44
51
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,WAAW,EAAgB;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,WAAW,EAAgB;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACrC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mEAAmE,EAAE,SAAS,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEhD,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,UAAU;YAAE,OAAO;QACvB,UAAU,GAAG,IAAI,CAAC;QAElB,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAClC,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEnC,MAAM,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACtC,MAAM,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACxC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,kBAAkB,CAAC;aACvB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACpF,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,cAAc;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
* - Truncation + result assembly
|
|
7
7
|
*/
|
|
8
8
|
import type { AgentToolUpdateCallback, ExtensionContext, TruncationResult } from "@mariozechner/pi-coding-agent";
|
|
9
|
+
/**
|
|
10
|
+
* Race a promise against an AbortSignal.
|
|
11
|
+
* The SDK doesn't natively support signal, so we wrap the call.
|
|
12
|
+
* The underlying HTTP request still completes on Tavily's side,
|
|
13
|
+
* but the tool call rejects immediately on cancellation.
|
|
14
|
+
*/
|
|
15
|
+
export declare function raceAbort<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T>;
|
|
9
16
|
/**
|
|
10
17
|
* Send a progress update to the TUI during tool execution.
|
|
11
18
|
* Wraps the common `onUpdate?.({ content: [...], details: {} })` pattern.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/tools/shared/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAQvC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjG;AAMD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAC5C,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CACZ,UAAU,EAAE,gBAAgB,GAAG,SAAS,EACxC,cAAc,EAAE,MAAM,GAAG,SAAS,KAC/B,QAAQ,GACZ,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC,CAWD"}
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/tools/shared/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAQvC;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAiB7F;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjG;AAMD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAC5C,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CACZ,UAAU,EAAE,gBAAgB,GAAG,SAAS,EACxC,cAAc,EAAE,MAAM,GAAG,SAAS,KAC/B,QAAQ,GACZ,OAAO,CAAC;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC,CAWD"}
|
|
@@ -7,6 +7,32 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { applyTruncation } from "./truncation.js";
|
|
9
9
|
// ============================================================================
|
|
10
|
+
// Abort Signal
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Race a promise against an AbortSignal.
|
|
14
|
+
* The SDK doesn't natively support signal, so we wrap the call.
|
|
15
|
+
* The underlying HTTP request still completes on Tavily's side,
|
|
16
|
+
* but the tool call rejects immediately on cancellation.
|
|
17
|
+
*/
|
|
18
|
+
export function raceAbort(promise, signal) {
|
|
19
|
+
if (!signal)
|
|
20
|
+
return promise;
|
|
21
|
+
if (signal.aborted)
|
|
22
|
+
return Promise.reject(new Error("Tool call aborted"));
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const onAbort = () => reject(new Error("Tool call aborted"));
|
|
25
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
26
|
+
promise.then((value) => {
|
|
27
|
+
signal.removeEventListener("abort", onAbort);
|
|
28
|
+
resolve(value);
|
|
29
|
+
}, (error) => {
|
|
30
|
+
signal.removeEventListener("abort", onAbort);
|
|
31
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
10
36
|
// Progress Update
|
|
11
37
|
// ============================================================================
|
|
12
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/tools/shared/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAA6C,EAAE,OAAe;IACzF,QAAQ,EAAE,CAAC;QACT,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,GAAqB,EACrB,QAAgB,EAChB,YAGa;IAKb,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,eAAe,CACnE,UAAU,EACV,GAAG,CAAC,GAAG,EACP,QAAQ,CACT,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,cAAc,CAAC;KAClD,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/tools/shared/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAI,OAAmB,EAAE,MAA+B;IAC/E,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1E,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAA6C,EAAE,OAAe;IACzF,QAAQ,EAAE,CAAC;QACT,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,GAAqB,EACrB,QAAgB,EAChB,YAGa;IAKb,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,eAAe,CACnE,UAAU,EACV,GAAG,CAAC,GAAG,EACP,QAAQ,CACT,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,cAAc,CAAC;KAClD,CAAC;AACJ,CAAC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - Custom TUI rendering
|
|
12
12
|
* - Robust error handling
|
|
13
13
|
*/
|
|
14
|
-
import { buildToolResult, sendProgress } from "./shared/execute.js";
|
|
14
|
+
import { buildToolResult, raceAbort, sendProgress } from "./shared/execute.js";
|
|
15
15
|
import { buildExtractOptions, validateUrls } from "./tavily/client.js";
|
|
16
16
|
import { buildExtractSuccessDetails } from "./tavily/details.js";
|
|
17
17
|
import { extractExtractResults, formatExtractResponse } from "./tavily/formatters.js";
|
|
@@ -40,13 +40,13 @@ export function registerWebExtractTool(pi, client) {
|
|
|
40
40
|
],
|
|
41
41
|
parameters: WebExtractParamsSchema,
|
|
42
42
|
// Pi catches thrown errors and reports them to the LLM with isError: true
|
|
43
|
-
async execute(_toolCallId, params,
|
|
43
|
+
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
44
44
|
const urls = validateUrls(params.urls);
|
|
45
45
|
const extractOptions = buildExtractOptions(params);
|
|
46
46
|
const urlCount = urls.length;
|
|
47
47
|
const urlText = urlCount === 1 ? "URL" : "URLs";
|
|
48
48
|
sendProgress(onUpdate, `Extracting content from ${urlCount} ${urlText}...`);
|
|
49
|
-
const response = await client.extract(urls, extractOptions);
|
|
49
|
+
const response = await raceAbort(client.extract(urls, extractOptions), signal);
|
|
50
50
|
const { results, failedResults } = extractExtractResults(response);
|
|
51
51
|
const fullOutput = formatExtractResponse(results, failedResults, extractOptions.includeImages ?? false);
|
|
52
52
|
return buildToolResult(fullOutput, ctx, "extract", (truncation, fullOutputPath) => buildExtractSuccessDetails({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-extract.js","sourceRoot":"","sources":["../../src/tools/web-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"web-extract.js","sourceRoot":"","sources":["../../src/tools/web-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,MAAM,UAAU,sBAAsB,CAAC,EAAgB,EAAE,MAAoB;IAC3E,EAAE,CAAC,YAAY,CAAC;QACd,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,2DAA2D;YAC3D,sEAAsE;YACtE,4FAA4F;QAE9F,aAAa,EAAE,iDAAiD;QAChE,gBAAgB,EAAE;YAChB,6EAA6E;YAC7E,4EAA4E;YAC5E,+DAA+D;YAC/D,+DAA+D;YAC/D,uDAAuD;YACvD,6DAA6D;YAC7D,iEAAiE;YACjE,iEAAiE;SAClE;QAED,UAAU,EAAE,sBAAsB;QAElC,0EAA0E;QAC1E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;YACtD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAEhD,YAAY,CAAC,QAAQ,EAAE,2BAA2B,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;YAE5E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/E,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,qBAAqB,CACtC,OAAO,EACP,aAAa,EACb,cAAc,CAAC,aAAa,IAAI,KAAK,CACtC,CAAC;YACF,OAAO,eAAe,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,CAChF,0BAA0B,CAAC;gBACzB,QAAQ;gBACR,OAAO,EAAE,cAAc;gBACvB,OAAO;gBACP,aAAa;gBACb,UAAU;gBACV,cAAc;aACf,CAAC,CACH,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,IAAI,EAAE,KAAK;YACpB,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAgD,CAAC,CAAC;QACnF,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK;YAC/B,OAAO,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAkD,CAAC,CAAC;QAChG,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools/web-search.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - Custom TUI rendering
|
|
11
11
|
* - Robust error handling
|
|
12
12
|
*/
|
|
13
|
-
import { buildToolResult, sendProgress } from "./shared/execute.js";
|
|
13
|
+
import { buildToolResult, raceAbort, sendProgress } from "./shared/execute.js";
|
|
14
14
|
import { buildSearchOptions, validateQuery } from "./tavily/client.js";
|
|
15
15
|
import { buildSuccessDetails } from "./tavily/details.js";
|
|
16
16
|
import { extractSearchResults, formatWebSearchResponse } from "./tavily/formatters.js";
|
|
@@ -38,11 +38,11 @@ export function registerWebSearchTool(pi, client) {
|
|
|
38
38
|
],
|
|
39
39
|
parameters: WebSearchParamsSchema,
|
|
40
40
|
// Pi catches thrown errors and reports them to the LLM with isError: true
|
|
41
|
-
async execute(_toolCallId, params,
|
|
41
|
+
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
42
42
|
const query = validateQuery(params.query);
|
|
43
43
|
const searchOptions = buildSearchOptions(params);
|
|
44
44
|
sendProgress(onUpdate, `Searching for: ${query}`);
|
|
45
|
-
const response = await client.search(query, searchOptions);
|
|
45
|
+
const response = await raceAbort(client.search(query, searchOptions), signal);
|
|
46
46
|
const { answer, results, images } = extractSearchResults(response);
|
|
47
47
|
const fullOutput = formatWebSearchResponse(answer, results, images, searchOptions.includeImages);
|
|
48
48
|
return buildToolResult(fullOutput, ctx, "search", (truncation, fullOutputPath) => buildSuccessDetails({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,MAAM,UAAU,qBAAqB,CAAC,EAAgB,EAAE,MAAoB;IAC1E,EAAE,CAAC,YAAY,CAAC;QACd,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,yDAAyD;YACzD,sEAAsE;YACtE,mFAAmF;QAErF,aAAa,EACX,sFAAsF;QACxF,gBAAgB,EAAE;YAChB,8FAA8F;YAC9F,4EAA4E;YAC5E,2DAA2D;YAC3D,uFAAuF;YACvF,6DAA6D;YAC7D,4DAA4D;YAC5D,oEAAoE;SACrE;QAED,UAAU,EAAE,qBAAqB;QAEjC,0EAA0E;QAC1E,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;YACtD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAEjD,YAAY,CAAC,QAAQ,EAAE,kBAAkB,KAAK,EAAE,CAAC,CAAC;YAElD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,uBAAuB,CACxC,MAAM,EACN,OAAO,EACP,MAAM,EACN,aAAa,CAAC,aAAa,CAC5B,CAAC;YACF,OAAO,eAAe,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,CAC/E,mBAAmB,CAAC;gBAClB,KAAK;gBACL,OAAO,EAAE,aAAa;gBACtB,MAAM;gBACN,OAAO;gBACP,UAAU;gBACV,cAAc;aACf,CAAC,CACH,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,IAAI,EAAE,KAAK;YACpB,OAAO,mBAAmB,CAAC,IAAI,EAAE,KAAkD,CAAC,CAAC;QACvF,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK;YAC/B,OAAO,qBAAqB,CAC1B,MAAM,EACN,KAAK,EACL,KAAoD,CACrD,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alexanderfortin/pi-tavily-tools",
|
|
3
3
|
"author": "Alexander Fortin",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"description": "Pi coding agent extension for web search and content extraction using Tavily",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"pi-package",
|
|
@@ -57,26 +57,33 @@
|
|
|
57
57
|
"test": "bun test",
|
|
58
58
|
"test:coverage": "bun test --coverage --coverage-reporter=lcov",
|
|
59
59
|
"test:watch": "bun test --watch",
|
|
60
|
-
"release": "
|
|
61
|
-
"release:dry-run": "
|
|
60
|
+
"release": "semantic-release",
|
|
61
|
+
"release:dry-run": "semantic-release --dry-run"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@mariozechner/pi-ai": "
|
|
65
|
-
"@mariozechner/pi-coding-agent": "
|
|
66
|
-
"@mariozechner/pi-tui": "
|
|
67
|
-
"@
|
|
68
|
-
"@
|
|
69
|
-
"@
|
|
70
|
-
"@
|
|
71
|
-
"@
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"typescript": "
|
|
64
|
+
"@mariozechner/pi-ai": "0.65.2",
|
|
65
|
+
"@mariozechner/pi-coding-agent": "0.65.2",
|
|
66
|
+
"@mariozechner/pi-tui": "0.65.2",
|
|
67
|
+
"@semantic-release/changelog": "6.0.3",
|
|
68
|
+
"@semantic-release/commit-analyzer": "13.0.1",
|
|
69
|
+
"@semantic-release/git": "10.0.1",
|
|
70
|
+
"@semantic-release/github": "12.0.6",
|
|
71
|
+
"@semantic-release/npm": "13.1.5",
|
|
72
|
+
"@semantic-release/release-notes-generator": "14.1.0",
|
|
73
|
+
"@sinclair/typebox": "0.34.49",
|
|
74
|
+
"@types/bun": "1.3.11",
|
|
75
|
+
"@types/node": "25.5.2",
|
|
76
|
+
"@typescript-eslint/eslint-plugin": "8.58.1",
|
|
77
|
+
"@typescript-eslint/parser": "8.58.1",
|
|
78
|
+
"eslint": "10.2.0",
|
|
79
|
+
"eslint-config-prettier": "10.1.8",
|
|
80
|
+
"prettier": "3.8.1",
|
|
81
|
+
"prettier-plugin-organize-imports": "4.3.0",
|
|
82
|
+
"semantic-release": "25.0.3",
|
|
83
|
+
"typescript": "6.0.2"
|
|
77
84
|
},
|
|
78
85
|
"dependencies": {
|
|
79
|
-
"@tavily/core": "
|
|
80
|
-
"temporal-polyfill": "
|
|
86
|
+
"@tavily/core": "0.7.2",
|
|
87
|
+
"temporal-polyfill": "0.3.2"
|
|
81
88
|
}
|
|
82
89
|
}
|