@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 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.
@@ -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,CAyB/C"}
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;QAAE,OAAO;IAEpB,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;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
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, _signal, onUpdate, ctx) {
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;AACpE,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,OAAO,EAAE,QAAQ,EAAE,GAAG;YACvD,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,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC5D,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
+ {"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"}
@@ -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, _signal, onUpdate, ctx) {
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;AACpE,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,OAAO,EAAE,QAAQ,EAAE,GAAG;YACvD,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,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC3D,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"}
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.3.1",
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": "bun run build && npm publish --access public",
61
- "release:dry-run": "bun run build && npm publish --dry-run"
60
+ "release": "semantic-release",
61
+ "release:dry-run": "semantic-release --dry-run"
62
62
  },
63
63
  "devDependencies": {
64
- "@mariozechner/pi-ai": "^0.65.2",
65
- "@mariozechner/pi-coding-agent": "^0.65.2",
66
- "@mariozechner/pi-tui": "^0.65.2",
67
- "@sinclair/typebox": "^0.34.49",
68
- "@types/bun": "^1.3.11",
69
- "@types/node": "^25.5.2",
70
- "@typescript-eslint/eslint-plugin": "^8.58.0",
71
- "@typescript-eslint/parser": "^8.58.0",
72
- "eslint": "^10.2.0",
73
- "eslint-config-prettier": "^10.1.8",
74
- "prettier": "^3.8.1",
75
- "prettier-plugin-organize-imports": "^4.3.0",
76
- "typescript": "^6.0.2"
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": "^0.7.2",
80
- "temporal-polyfill": "^0.3.2"
86
+ "@tavily/core": "0.7.2",
87
+ "temporal-polyfill": "0.3.2"
81
88
  }
82
89
  }