@alexanderfortin/pi-tavily-tools 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -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 +13 -0
- package/dist/tools/shared/execute.d.ts.map +1 -1
- package/dist/tools/shared/execute.js +41 -0
- package/dist/tools/shared/execute.js.map +1 -1
- package/dist/tools/web-extract.d.ts.map +1 -1
- package/dist/tools/web-extract.js +9 -3
- package/dist/tools/web-extract.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +9 -3
- package/dist/tools/web-search.js.map +1 -1
- package/package.json +25 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
## [0.4.1](https://github.com/shaftoe/pi-tavily-tools/compare/v0.4.0...v0.4.1) (2026-04-08)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* sanitize provider errors to prevent credential leakage ([#7](https://github.com/shaftoe/pi-tavily-tools/issues/7)) ([792a0a2](https://github.com/shaftoe/pi-tavily-tools/commit/792a0a28dcfb8e82a2711db16c492769b1361504))
|
|
7
|
+
|
|
8
|
+
# [0.4.0](https://github.com/shaftoe/pi-tavily-tools/compare/v0.3.1...v0.4.0) (2026-04-08)
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
- 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))
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- add semantic release to automate releases ([ae572b0](https://github.com/shaftoe/pi-tavily-tools/commit/ae572b0c2c2529e8b9abc2b70268390bb226aba8))
|
|
17
|
+
|
|
1
18
|
# Changelog
|
|
2
19
|
|
|
3
20
|
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,19 @@
|
|
|
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>;
|
|
16
|
+
/**
|
|
17
|
+
* Sanitize a provider error before surfacing it.
|
|
18
|
+
* Strips Tavily API keys and auth header values from error messages
|
|
19
|
+
* to prevent credential leakage in tool output or logs.
|
|
20
|
+
*/
|
|
21
|
+
export declare function sanitizeError(error: unknown): Error;
|
|
9
22
|
/**
|
|
10
23
|
* Send a progress update to the TUI during tool execution.
|
|
11
24
|
* 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;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAMnD;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,47 @@
|
|
|
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
|
+
// ============================================================================
|
|
36
|
+
// Error Sanitization
|
|
37
|
+
// ============================================================================
|
|
38
|
+
/**
|
|
39
|
+
* Sanitize a provider error before surfacing it.
|
|
40
|
+
* Strips Tavily API keys and auth header values from error messages
|
|
41
|
+
* to prevent credential leakage in tool output or logs.
|
|
42
|
+
*/
|
|
43
|
+
export function sanitizeError(error) {
|
|
44
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
45
|
+
const sanitized = message
|
|
46
|
+
.replace(/tvly-[a-zA-Z0-9_-]+/gi, "[REDACTED]")
|
|
47
|
+
.replace(/(authorization|x-api-key)[^\n]*/gi, "$1: [REDACTED]");
|
|
48
|
+
return new Error(sanitized);
|
|
49
|
+
}
|
|
50
|
+
// ============================================================================
|
|
10
51
|
// Progress Update
|
|
11
52
|
// ============================================================================
|
|
12
53
|
/**
|
|
@@ -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,qBAAqB;AACrB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,uBAAuB,EAAE,YAAY,CAAC;SAC9C,OAAO,CAAC,mCAAmC,EAAE,gBAAgB,CAAC,CAAC;IAClE,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9B,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-extract.d.ts","sourceRoot":"","sources":["../../src/tools/web-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAajD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"web-extract.d.ts","sourceRoot":"","sources":["../../src/tools/web-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAajD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiEnF"}
|
|
@@ -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, sanitizeError, 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,19 @@ 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
|
-
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
response = await raceAbort(client.extract(urls, extractOptions), signal);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw sanitizeError(error);
|
|
55
|
+
}
|
|
50
56
|
const { results, failedResults } = extractExtractResults(response);
|
|
51
57
|
const fullOutput = formatExtractResponse(results, failedResults, extractOptions.includeImages ?? false);
|
|
52
58
|
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,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9F,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,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAajD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAajD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAmElF"}
|
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, sanitizeError, 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,17 @@ 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
|
-
|
|
45
|
+
let response;
|
|
46
|
+
try {
|
|
47
|
+
response = await raceAbort(client.search(query, searchOptions), signal);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw sanitizeError(error);
|
|
51
|
+
}
|
|
46
52
|
const { answer, results, images } = extractSearchResults(response);
|
|
47
53
|
const fullOutput = formatWebSearchResponse(answer, results, images, searchOptions.includeImages);
|
|
48
54
|
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,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9F,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,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,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.1",
|
|
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.66.0",
|
|
65
|
+
"@mariozechner/pi-coding-agent": "0.66.0",
|
|
66
|
+
"@mariozechner/pi-tui": "0.66.0",
|
|
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
|
}
|