@alexanderfortin/pi-tavily-tools 0.1.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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +366 -0
  3. package/dist/index.d.ts +17 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +38 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tools/index.d.ts +7 -0
  8. package/dist/tools/index.d.ts.map +1 -0
  9. package/dist/tools/index.js +7 -0
  10. package/dist/tools/index.js.map +1 -0
  11. package/dist/tools/shared/truncation.d.ts +21 -0
  12. package/dist/tools/shared/truncation.d.ts.map +1 -0
  13. package/dist/tools/shared/truncation.js +55 -0
  14. package/dist/tools/shared/truncation.js.map +1 -0
  15. package/dist/tools/tavily/client.d.ts +27 -0
  16. package/dist/tools/tavily/client.d.ts.map +1 -0
  17. package/dist/tools/tavily/client.js +62 -0
  18. package/dist/tools/tavily/client.js.map +1 -0
  19. package/dist/tools/tavily/formatters.d.ts +21 -0
  20. package/dist/tools/tavily/formatters.d.ts.map +1 -0
  21. package/dist/tools/tavily/formatters.js +108 -0
  22. package/dist/tools/tavily/formatters.js.map +1 -0
  23. package/dist/tools/tavily/renderers.d.ts +28 -0
  24. package/dist/tools/tavily/renderers.d.ts.map +1 -0
  25. package/dist/tools/tavily/renderers.js +116 -0
  26. package/dist/tools/tavily/renderers.js.map +1 -0
  27. package/dist/tools/tavily/schemas.d.ts +24 -0
  28. package/dist/tools/tavily/schemas.d.ts.map +1 -0
  29. package/dist/tools/tavily/schemas.js +36 -0
  30. package/dist/tools/tavily/schemas.js.map +1 -0
  31. package/dist/tools/tavily/types.d.ts +53 -0
  32. package/dist/tools/tavily/types.d.ts.map +1 -0
  33. package/dist/tools/tavily/types.js +5 -0
  34. package/dist/tools/tavily/types.js.map +1 -0
  35. package/dist/tools/web-search.d.ts +16 -0
  36. package/dist/tools/web-search.d.ts.map +1 -0
  37. package/dist/tools/web-search.js +120 -0
  38. package/dist/tools/web-search.js.map +1 -0
  39. package/package.json +77 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../src/tools/tavily/formatters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAMlF;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,EAAE,OAAO,GAAG,SAAS,GACjC,MAAM,CAyCR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,EAAE,OAAO,GACrB,oBAAoB,CAiCtB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG;IACvD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CA4CA"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Response formatters for Tavily tools
3
+ */
4
+ // ============================================================================
5
+ // Web Search Formatting
6
+ // ============================================================================
7
+ /**
8
+ * Format Tavily search response into human-readable text
9
+ */
10
+ export function formatWebSearchResponse(answer, results, images, includeImages) {
11
+ const parts = [];
12
+ // Add AI answer if available
13
+ if (answer) {
14
+ parts.push(`AI Answer: ${answer}\n`);
15
+ }
16
+ // Add sources
17
+ if (results.length > 0) {
18
+ parts.push("Sources:");
19
+ results.forEach((result, index) => {
20
+ parts.push(`\n${index + 1}. ${result.title}`, ` URL: ${result.url}`, ` Score: ${result.score.toFixed(2)}`);
21
+ // Add content/snippet if available
22
+ const contentToShow = result.rawContent || result.content;
23
+ if (contentToShow) {
24
+ const snippet = contentToShow.slice(0, 300);
25
+ parts.push(` Content: ${snippet}${contentToShow.length > 300 ? "..." : ""}`);
26
+ }
27
+ });
28
+ }
29
+ else {
30
+ parts.push("No results found.");
31
+ }
32
+ // Add image results if available
33
+ if (includeImages && images.length > 0) {
34
+ parts.push("\nImages:");
35
+ images.slice(0, 5).forEach((image, index) => {
36
+ parts.push(`\n${index + 1}. ${image.url}`);
37
+ if (image.description) {
38
+ parts.push(` ${image.description}`);
39
+ }
40
+ });
41
+ }
42
+ return parts.join("\n");
43
+ }
44
+ /**
45
+ * Format Tavily search results into compact parts structure
46
+ */
47
+ export function formatSearchResults(answer, results, images, includeImages) {
48
+ const parts = {
49
+ answer: answer ?? undefined,
50
+ sources: [],
51
+ };
52
+ // Add sources
53
+ results.forEach((result, index) => {
54
+ parts.sources.push(`\n${index + 1}. ${result.title}`, ` URL: ${result.url}`, ` Score: ${result.score.toFixed(2)}`);
55
+ const contentToShow = result.rawContent || result.content;
56
+ if (contentToShow) {
57
+ const snippet = contentToShow.slice(0, 300);
58
+ parts.sources.push(` Content: ${snippet}${contentToShow.length > 300 ? "..." : ""}`);
59
+ }
60
+ });
61
+ // Add image results if available
62
+ if (includeImages && images.length > 0) {
63
+ parts.images = [];
64
+ images.slice(0, 5).forEach((image, index) => {
65
+ parts.images.push(`\n${index + 1}. ${image.url}`);
66
+ if (image.description) {
67
+ parts.images.push(` ${image.description}`);
68
+ }
69
+ });
70
+ }
71
+ return parts;
72
+ }
73
+ /**
74
+ * Extract and type-safe Tavily response data
75
+ */
76
+ export function extractSearchResults(response) {
77
+ const resp = response;
78
+ // Extract results
79
+ const results = (resp.results || [])
80
+ .filter((r) => r !== null && typeof r === "object")
81
+ .map((r) => {
82
+ const result = r;
83
+ const scoreValue = typeof result.score === "number" ? result.score : Number(result.score);
84
+ return {
85
+ title: typeof result.title === "string" ? result.title : "Untitled",
86
+ url: typeof result.url === "string" ? result.url : "",
87
+ score: Number.isNaN(scoreValue) ? 0 : scoreValue,
88
+ content: result.content,
89
+ rawContent: result.rawContent,
90
+ };
91
+ });
92
+ // Extract images
93
+ const images = (resp.images || [])
94
+ .filter((img) => img !== null && typeof img === "object")
95
+ .map((img) => {
96
+ const image = img;
97
+ return {
98
+ url: typeof image.url === "string" ? image.url : "",
99
+ description: image.description,
100
+ };
101
+ });
102
+ return {
103
+ answer: resp.answer ?? null,
104
+ results,
105
+ images,
106
+ };
107
+ }
108
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../src/tools/tavily/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * TUI renderers for Tavily tools
3
+ */
4
+ import { Text } from "@mariozechner/pi-tui";
5
+ export type ToolCallResult = {
6
+ details?: unknown;
7
+ content: Array<{
8
+ type: string;
9
+ text?: string;
10
+ }>;
11
+ };
12
+ type Theme = {
13
+ fg: (color: string, text: string) => string;
14
+ bold: (text: string) => string;
15
+ };
16
+ /**
17
+ * Render a web search tool call
18
+ */
19
+ export declare function renderWebSearchCall(args: Record<string, unknown>, theme: Theme): Text;
20
+ /**
21
+ * Render a web search tool result
22
+ */
23
+ export declare function renderWebSearchResult(result: ToolCallResult, state: {
24
+ expanded: boolean;
25
+ isPartial: boolean;
26
+ }, theme: Theme): Text;
27
+ export {};
28
+ //# sourceMappingURL=renderers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../src/tools/tavily/renderers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAmB,MAAM,sBAAsB,CAAC;AAO7D,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC,CAAC;AAMF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CA8BrF;AAuBD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAChD,KAAK,EAAE,KAAK,GACX,IAAI,CAeN"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * TUI renderers for Tavily tools
3
+ */
4
+ import { Text, truncateToWidth } from "@mariozechner/pi-tui";
5
+ // ============================================================================
6
+ // Render Call (function invocation display)
7
+ // ============================================================================
8
+ /**
9
+ * Render a web search tool call
10
+ */
11
+ export function renderWebSearchCall(args, theme) {
12
+ let text = theme.fg("toolTitle", theme.bold("web_search "));
13
+ const query = typeof args.query === "string" ? args.query : "(no query)";
14
+ text += theme.fg("accent", `"${query}"`);
15
+ const options = [];
16
+ if (typeof args.max_results === "number" && args.max_results !== 5) {
17
+ options.push(`max=${args.max_results}`);
18
+ }
19
+ if (args.search_depth === "advanced") {
20
+ options.push("advanced");
21
+ }
22
+ if (args.include_answer === false) {
23
+ options.push("no-answer");
24
+ }
25
+ if (args.include_raw_content === true) {
26
+ options.push("raw-content");
27
+ }
28
+ if (args.include_images === true) {
29
+ options.push("images");
30
+ }
31
+ if (args.days && typeof args.days === "number") {
32
+ options.push(`${args.days}d`);
33
+ }
34
+ if (options.length > 0) {
35
+ text += ` ${theme.fg("dim", `[${options.join(", ")}]`)}`;
36
+ }
37
+ return new Text(truncateToWidth(text, 100), 0, 0);
38
+ }
39
+ /**
40
+ * Render options badge for search tools
41
+ */
42
+ function renderOptionsBadge(details, theme) {
43
+ const options = [];
44
+ if (details.searchDepth === "advanced") {
45
+ options.push("advanced");
46
+ }
47
+ if ("includeImages" in details && details.includeImages) {
48
+ options.push("images");
49
+ }
50
+ if (details.days) {
51
+ options.push(`${details.days}d`);
52
+ }
53
+ return options.length > 0 ? theme.fg("dim", ` (${options.join(", ")})`) : "";
54
+ }
55
+ // ============================================================================
56
+ // Render Result (outcome display)
57
+ // ============================================================================
58
+ /**
59
+ * Render a web search tool result
60
+ */
61
+ export function renderWebSearchResult(result, state, theme) {
62
+ const details = result.details;
63
+ // Show loading state
64
+ if (state.isPartial) {
65
+ return new Text(theme.fg("warning", "Searching..."), 0, 0);
66
+ }
67
+ // Show error state
68
+ if (details?.error) {
69
+ return new Text(theme.fg("error", `Error: ${details.error}`), 0, 0);
70
+ }
71
+ // Build result display
72
+ return renderSearchResultCommon(details, state.expanded, theme, true);
73
+ }
74
+ /**
75
+ * Common result renderer for search tools
76
+ */
77
+ function renderSearchResultCommon(details, expanded, theme, includeAnswer) {
78
+ let text = "";
79
+ if (details) {
80
+ // Main summary
81
+ text += theme.fg("success", `${details.resultCount} result${details.resultCount !== 1 ? "s" : ""}`);
82
+ // Show options
83
+ text += renderOptionsBadge(details, theme);
84
+ // Show truncation warning
85
+ if (details.truncation?.truncated) {
86
+ text += " " + theme.fg("warning", "(truncated)");
87
+ }
88
+ // Expanded view: show sources
89
+ if (expanded && details.sources.length > 0) {
90
+ text += "\n\n";
91
+ const displaySources = details.sources.slice(0, 5);
92
+ for (let i = 0; i < displaySources.length; i++) {
93
+ const source = displaySources[i];
94
+ if (source) {
95
+ text += `${theme.fg("accent", `${i + 1}.`)} ${source.title}\n`;
96
+ text += ` ${theme.fg("dim", source.url)}\n`;
97
+ }
98
+ }
99
+ if (details.sources.length > 5) {
100
+ text += `\n${theme.fg("dim", `... ${details.sources.length - 5} more`)}`;
101
+ }
102
+ // Show temp file path if truncated
103
+ if (details.fullOutputPath) {
104
+ text += `\n\n${theme.fg("dim", `Full output: ${details.fullOutputPath}`)}`;
105
+ }
106
+ }
107
+ // Show AI answer in expanded view if available
108
+ if (expanded && includeAnswer && "answer" in details && details.answer) {
109
+ text += "\n\n";
110
+ text += theme.fg("accent", "AI Answer: ");
111
+ text += theme.fg("text", details.answer);
112
+ }
113
+ }
114
+ return new Text(text, 0, 0);
115
+ }
116
+ //# sourceMappingURL=renderers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../src/tools/tavily/renderers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Schemas for Tavily tools
3
+ */
4
+ export declare const WebSearchParamsSchema: import("@sinclair/typebox").TObject<{
5
+ query: import("@sinclair/typebox").TString;
6
+ max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
7
+ search_depth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnsafe<"basic" | "advanced">>;
8
+ include_answer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
9
+ include_raw_content: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
10
+ include_images: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
11
+ days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
12
+ }>;
13
+ export declare const BaseSearchParamsSchema: {
14
+ query: import("@sinclair/typebox").TString;
15
+ max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
16
+ search_depth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnsafe<"basic" | "advanced">>;
17
+ days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
18
+ };
19
+ export declare const IncludeOptionsSchema: {
20
+ include_answer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
21
+ include_raw_content: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
22
+ include_images: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
23
+ };
24
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/tools/tavily/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,eAAO,MAAM,qBAAqB;;;;;;;;EAsBhC,CAAC;AAMH,eAAO,MAAM,sBAAsB;;;;;CAalC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;CAUhC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Schemas for Tavily tools
3
+ */
4
+ import { StringEnum } from "@mariozechner/pi-ai";
5
+ import { Type } from "@sinclair/typebox";
6
+ // ============================================================================
7
+ // Web Search Schema
8
+ // ============================================================================
9
+ export const WebSearchParamsSchema = Type.Object({
10
+ query: Type.String({ description: "Search query string" }),
11
+ max_results: Type.Optional(Type.Number({ description: "Number of results to return (1-20, default: 5)" })),
12
+ search_depth: Type.Optional(StringEnum(["basic", "advanced"], {
13
+ description: "Search depth: 'basic' or 'advanced' (default: 'basic')",
14
+ })),
15
+ include_answer: Type.Optional(Type.Boolean({ description: "Include AI-generated answer (default: true)" })),
16
+ include_raw_content: Type.Optional(Type.Boolean({ description: "Include raw page content in results (default: false)" })),
17
+ include_images: Type.Optional(Type.Boolean({ description: "Include relevant images in results (default: false)" })),
18
+ days: Type.Optional(Type.Number({ description: "Limit results to last N days (e.g., 7 for last week)" })),
19
+ });
20
+ // ============================================================================
21
+ // Common Schema Parts
22
+ // ============================================================================
23
+ export const BaseSearchParamsSchema = {
24
+ query: Type.String({ description: "Search query string" }),
25
+ max_results: Type.Optional(Type.Number({ description: "Number of results to return (1-20, default: 5)" })),
26
+ search_depth: Type.Optional(StringEnum(["basic", "advanced"], {
27
+ description: "Search depth: 'basic' or 'advanced' (default: 'basic')",
28
+ })),
29
+ days: Type.Optional(Type.Number({ description: "Limit results to last N days (e.g., 7 for last week)" })),
30
+ };
31
+ export const IncludeOptionsSchema = {
32
+ include_answer: Type.Optional(Type.Boolean({ description: "Include AI-generated answer (default: true)" })),
33
+ include_raw_content: Type.Optional(Type.Boolean({ description: "Include raw page content in results (default: false)" })),
34
+ include_images: Type.Optional(Type.Boolean({ description: "Include relevant images in results (default: false)" })),
35
+ };
36
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/tools/tavily/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC1D,WAAW,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC,CAC/E;IACD,YAAY,EAAE,IAAI,CAAC,QAAQ,CACzB,UAAU,CAAC,CAAC,OAAO,EAAE,UAAU,CAAU,EAAE;QACzC,WAAW,EAAE,wDAAwD;KACtE,CAAC,CACH;IACD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC,CAC7E;IACD,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAChC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CACtF;IACD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC,CACrF;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CACrF;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC1D,WAAW,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC,CAC/E;IACD,YAAY,EAAE,IAAI,CAAC,QAAQ,CACzB,UAAU,CAAC,CAAC,OAAO,EAAE,UAAU,CAAU,EAAE;QACzC,WAAW,EAAE,wDAAwD;KACtE,CAAC,CACH;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CACrF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC,CAC7E;IACD,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAChC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CACtF;IACD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC,CACrF;CACF,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Shared types for Tavily tools
3
+ */
4
+ import type { TruncationResult } from "@mariozechner/pi-coding-agent";
5
+ export interface BaseSearchParams {
6
+ query: string;
7
+ max_results?: number;
8
+ search_depth?: "basic" | "advanced";
9
+ days?: number;
10
+ }
11
+ export interface SearchResponseDetails {
12
+ query: string;
13
+ maxResults: number;
14
+ searchDepth: string;
15
+ days?: number;
16
+ answer?: string;
17
+ resultCount: number;
18
+ sources: Array<{
19
+ title: string;
20
+ url: string;
21
+ score: number;
22
+ }>;
23
+ truncation?: TruncationResult;
24
+ fullOutputPath?: string;
25
+ error?: string;
26
+ }
27
+ export interface WebSearchParams extends BaseSearchParams {
28
+ include_answer?: boolean;
29
+ include_raw_content?: boolean;
30
+ include_images?: boolean;
31
+ }
32
+ export interface WebSearchDetails extends SearchResponseDetails {
33
+ includeAnswer: boolean;
34
+ includeRawContent: boolean;
35
+ includeImages: boolean;
36
+ }
37
+ export interface SearchResult {
38
+ title: string;
39
+ url: string;
40
+ score: number;
41
+ content?: string;
42
+ rawContent?: string;
43
+ }
44
+ export interface ImageResult {
45
+ url: string;
46
+ description?: string;
47
+ }
48
+ export interface FormattedOutputParts {
49
+ answer?: string;
50
+ sources: string[];
51
+ images?: string[];
52
+ }
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/tavily/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAMtE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared types for Tavily tools
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/tavily/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Web Search Tool - Provides web search capabilities using Tavily SDK
3
+ *
4
+ * Features:
5
+ * - Search the web using Tavily's search API
6
+ * - Configurable search depth (basic/advanced)
7
+ * - Time-limited searches with days parameter
8
+ * - AI-generated answers
9
+ * - Proper output truncation (50KB / 2000 lines)
10
+ * - Custom TUI rendering
11
+ * - Robust error handling
12
+ */
13
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
14
+ import type { TavilyClient } from "@tavily/core";
15
+ export declare function registerWebSearchTool(pi: ExtensionAPI, client: TavilyClient): void;
16
+ //# sourceMappingURL=web-search.d.ts.map
@@ -0,0 +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,CA6HlF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Web Search Tool - Provides web search capabilities using Tavily SDK
3
+ *
4
+ * Features:
5
+ * - Search the web using Tavily's search API
6
+ * - Configurable search depth (basic/advanced)
7
+ * - Time-limited searches with days parameter
8
+ * - AI-generated answers
9
+ * - Proper output truncation (50KB / 2000 lines)
10
+ * - Custom TUI rendering
11
+ * - Robust error handling
12
+ */
13
+ import { applyTruncation, createErrorOutput } from "./shared/truncation.js";
14
+ import { buildSearchOptions, validateQuery } from "./tavily/client.js";
15
+ import { extractSearchResults, formatWebSearchResponse } from "./tavily/formatters.js";
16
+ import { renderWebSearchCall, renderWebSearchResult } from "./tavily/renderers.js";
17
+ import { WebSearchParamsSchema } from "./tavily/schemas.js";
18
+ // ============================================================================
19
+ // Web Search Tool Registration
20
+ // ============================================================================
21
+ export function registerWebSearchTool(pi, client) {
22
+ pi.registerTool({
23
+ name: "web_search",
24
+ label: "Web Search",
25
+ description: `Searches the web for current information using Tavily. ` +
26
+ `Output is truncated to 2000 lines or 50KB (whichever is hit first). ` +
27
+ `Useful for finding recent news, documentation, or any time-sensitive information.`,
28
+ promptSnippet: "Search the web for current information, news, documentation, or time-sensitive data.",
29
+ promptGuidelines: [
30
+ "Use this tool when the user asks for recent news, current events, or up-to-date information.",
31
+ "Use this tool to search for documentation, APIs, or technical information.",
32
+ "Use this tool to verify facts or find current statistics.",
33
+ "Use the days parameter to limit results to recent timeframes (e.g., 7 for last week).",
34
+ "Use include_images to find relevant images for your search.",
35
+ "Use include_raw_content to get more detailed page content.",
36
+ "Use search_depth advanced for deeper, more comprehensive searches.",
37
+ ],
38
+ parameters: WebSearchParamsSchema,
39
+ async execute(_toolCallId, params, _signal, onUpdate, ctx) {
40
+ try {
41
+ // Validate and normalize parameters
42
+ const query = validateQuery(params.query);
43
+ const searchOptions = buildSearchOptions(params);
44
+ // Notify user we're searching
45
+ onUpdate?.({
46
+ content: [{ type: "text", text: `Searching for: ${query}` }],
47
+ details: {},
48
+ });
49
+ // Perform search using the provided client
50
+ const response = await client.search(query, searchOptions);
51
+ // Extract and format search results
52
+ const { answer, results, images } = extractSearchResults(response);
53
+ const fullOutput = formatWebSearchResponse(answer, results, images, searchOptions.includeImages);
54
+ // Apply truncation
55
+ const { content, truncation, fullOutputPath } = await applyTruncation(fullOutput, ctx.cwd, "search");
56
+ // Build details with proper defaults
57
+ const maxResults = searchOptions.maxResults ?? 5;
58
+ const searchDepth = String(searchOptions.searchDepth ?? "basic");
59
+ const includeImages = searchOptions.includeImages ?? false;
60
+ const days = searchOptions.days;
61
+ const details = {
62
+ query,
63
+ maxResults,
64
+ searchDepth,
65
+ includeAnswer: searchOptions.includeAnswer !== false,
66
+ includeRawContent: typeof searchOptions.includeRawContent === "string",
67
+ includeImages,
68
+ days,
69
+ answer: answer ?? undefined,
70
+ resultCount: results.length,
71
+ sources: results.map((r) => ({
72
+ title: r.title,
73
+ url: r.url,
74
+ score: r.score,
75
+ })),
76
+ truncation,
77
+ fullOutputPath,
78
+ };
79
+ return {
80
+ content: [{ type: "text", text: content }],
81
+ details,
82
+ };
83
+ }
84
+ catch (error) {
85
+ const errorMessage = error instanceof Error ? error.message : String(error);
86
+ const errorOutput = createErrorOutput(errorMessage, {
87
+ query: params.query,
88
+ maxResults: params.max_results ?? 5,
89
+ searchDepth: params.search_depth ?? "basic",
90
+ includeAnswer: params.include_answer ?? true,
91
+ includeRawContent: params.include_raw_content ?? false,
92
+ includeImages: params.include_images ?? false,
93
+ days: params.days,
94
+ });
95
+ return {
96
+ content: [{ type: "text", text: errorOutput.content }],
97
+ details: {
98
+ query: params.query,
99
+ maxResults: params.max_results ?? 5,
100
+ searchDepth: params.search_depth ?? "basic",
101
+ includeAnswer: params.include_answer ?? true,
102
+ includeRawContent: params.include_raw_content ?? false,
103
+ includeImages: params.include_images ?? false,
104
+ days: params.days,
105
+ resultCount: 0,
106
+ sources: [],
107
+ error: errorMessage,
108
+ },
109
+ };
110
+ }
111
+ },
112
+ renderCall(args, theme) {
113
+ return renderWebSearchCall(args, theme);
114
+ },
115
+ renderResult(result, state, theme) {
116
+ return renderWebSearchResult(result, state, theme);
117
+ },
118
+ });
119
+ }
120
+ //# sourceMappingURL=web-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,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,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG;YACvD,IAAI,CAAC;gBACH,oCAAoC;gBACpC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAEjD,8BAA8B;gBAC9B,QAAQ,EAAE,CAAC;oBACT,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,EAAE,EAAE,CAAC;oBAC5D,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAC;gBAEH,2CAA2C;gBAC3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;gBAE3D,oCAAoC;gBACpC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACnE,MAAM,UAAU,GAAG,uBAAuB,CACxC,MAAM,EACN,OAAO,EACP,MAAM,EACN,aAAa,CAAC,aAAa,CAC5B,CAAC;gBAEF,mBAAmB;gBACnB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,eAAe,CACnE,UAAU,EACV,GAAG,CAAC,GAAG,EACP,QAAQ,CACT,CAAC;gBAEF,qCAAqC;gBACrC,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,IAAI,CAAC,CAAC;gBACjD,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;gBACjE,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,IAAI,KAAK,CAAC;gBAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;gBAEhC,MAAM,OAAO,GAAqB;oBAChC,KAAK;oBACL,UAAU;oBACV,WAAW;oBACX,aAAa,EAAE,aAAa,CAAC,aAAa,KAAK,KAAK;oBACpD,iBAAiB,EAAE,OAAO,aAAa,CAAC,iBAAiB,KAAK,QAAQ;oBACtE,aAAa;oBACb,IAAI;oBACJ,MAAM,EAAE,MAAM,IAAI,SAAS;oBAC3B,WAAW,EAAE,OAAO,CAAC,MAAM;oBAC3B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,GAAG,EAAE,CAAC,CAAC,GAAG;wBACV,KAAK,EAAE,CAAC,CAAC,KAAK;qBACf,CAAC,CAAC;oBACH,UAAU;oBACV,cAAc;iBACf,CAAC;gBAEF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBAC1C,OAAO;iBACR,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,EAAE;oBAClD,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;oBACnC,WAAW,EAAE,MAAM,CAAC,YAAY,IAAI,OAAO;oBAC3C,aAAa,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;oBAC5C,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;oBACtD,aAAa,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;oBAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;oBACtD,OAAO,EAAE;wBACP,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;wBACnC,WAAW,EAAE,MAAM,CAAC,YAAY,IAAI,OAAO;wBAC3C,aAAa,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;wBAC5C,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,IAAI,KAAK;wBACtD,aAAa,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;wBAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,WAAW,EAAE,CAAC;wBACd,OAAO,EAAE,EAAE;wBACX,KAAK,EAAE,YAAY;qBACA;iBACtB,CAAC;YACJ,CAAC;QACH,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 ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@alexanderfortin/pi-tavily-tools",
3
+ "author": "Alexander Fortin",
4
+ "version": "0.1.0",
5
+ "description": "Pi coding agent extension for web search using Tavily",
6
+ "keywords": [
7
+ "pi-package",
8
+ "tavily",
9
+ "web-search",
10
+ "search"
11
+ ],
12
+ "type": "module",
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "license": "MIT",
22
+ "pi": {
23
+ "extensions": [
24
+ "./dist/index.js"
25
+ ]
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "package.json",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "peerDependencies": {
37
+ "@mariozechner/pi-coding-agent": "*",
38
+ "@mariozechner/pi-ai": "*",
39
+ "@mariozechner/pi-tui": "*",
40
+ "@sinclair/typebox": "*"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/shaftoe/pi-tavily-tools"
45
+ },
46
+ "scripts": {
47
+ "build": "bun run check && tsc",
48
+ "check": "tsc --noEmit --project tsconfig.test.json",
49
+ "check:watch": "tsc --noEmit --watch",
50
+ "lint": "eslint . --ext .ts",
51
+ "lint:fix": "eslint . --ext .ts --fix",
52
+ "format": "prettier --check .",
53
+ "format:fix": "prettier --write .",
54
+ "test": "bun test",
55
+ "test:watch": "bun test --watch",
56
+ "release": "bun run build && npm publish --access public",
57
+ "release:dry-run": "bun run build && npm publish --dry-run"
58
+ },
59
+ "devDependencies": {
60
+ "@mariozechner/pi-ai": "*",
61
+ "@mariozechner/pi-coding-agent": "*",
62
+ "@mariozechner/pi-tui": "*",
63
+ "@sinclair/typebox": "*",
64
+ "@types/bun": "^1.3.11",
65
+ "@types/node": "^25.5.2",
66
+ "@typescript-eslint/eslint-plugin": "^8.20.0",
67
+ "@typescript-eslint/parser": "^8.20.0",
68
+ "eslint": "^10.2.0",
69
+ "eslint-config-prettier": "^10.1.8",
70
+ "prettier": "^3.4.2",
71
+ "prettier-plugin-organize-imports": "^4.1.0",
72
+ "typescript": "^6.0.0"
73
+ },
74
+ "dependencies": {
75
+ "@tavily/core": "^0.7.2"
76
+ }
77
+ }