@minpeter/pss-coding-agent 0.0.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/README.md +18 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/tinyfish.d.ts +59 -0
- package/dist/integrations/tinyfish.d.ts.map +1 -0
- package/dist/integrations/tinyfish.js +221 -0
- package/dist/integrations/tinyfish.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +6 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +69 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +5 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +37 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tui-tool-printer.d.ts +16 -0
- package/dist/tui-tool-printer.d.ts.map +1 -0
- package/dist/tui-tool-printer.js +122 -0
- package/dist/tui-tool-printer.js.map +1 -0
- package/dist/tui.d.ts +2 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +91 -0
- package/dist/tui.js.map +1 -0
- package/dist/utils/unknown.d.ts +9 -0
- package/dist/utils/unknown.d.ts.map +1 -0
- package/dist/utils/unknown.js +42 -0
- package/dist/utils/unknown.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# @minpeter/pss-coding-agent
|
|
2
|
+
|
|
3
|
+
Coding-agent product package for pss-next. It provides TinyFish-backed web tools
|
|
4
|
+
and keeps TUI startup isolated from the side-effect-free root import.
|
|
5
|
+
|
|
6
|
+
```ts
|
|
7
|
+
import { tools, webFetchTool, webSearchTool } from "@minpeter/pss-coding-agent";
|
|
8
|
+
import { Agent } from "@minpeter/pss-runtime";
|
|
9
|
+
|
|
10
|
+
const agent = new Agent({ tools });
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Set `TINYFISH_API_KEY` before invoking `web_search` or `web_fetch`. Token pools
|
|
14
|
+
can be provided as semicolon-delimited values.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
node --conditions=@minpeter/pss-source --import tsx packages/coding-agent/src/tui.ts
|
|
18
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { DefaultTools } from "./tools";
|
|
2
|
+
export { tools } from "./tools";
|
|
3
|
+
export type { WebFetchError, WebFetchOutput, WebFetchResult, } from "./tools/web-fetch";
|
|
4
|
+
export { webFetchTool } from "./tools/web-fetch";
|
|
5
|
+
export type { WebSearchOutput, WebSearchResult, } from "./tools/web-search";
|
|
6
|
+
export { webSearchTool } from "./tools/web-search";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EACV,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACV,eAAe,EACf,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAMhC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type TinyFishFetchFormat = "markdown" | "html" | "json";
|
|
2
|
+
export type JsonValue = boolean | null | number | string | JsonValue[] | {
|
|
3
|
+
[key: string]: JsonValue;
|
|
4
|
+
};
|
|
5
|
+
export interface TinyFishFetchRequest {
|
|
6
|
+
format: TinyFishFetchFormat;
|
|
7
|
+
image_links: boolean;
|
|
8
|
+
links: boolean;
|
|
9
|
+
urls: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface TinyFishFetchResult {
|
|
12
|
+
author?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
final_url: string;
|
|
15
|
+
format: string;
|
|
16
|
+
image_links?: string[];
|
|
17
|
+
language?: string;
|
|
18
|
+
latency_ms?: number;
|
|
19
|
+
links?: string[];
|
|
20
|
+
published_date?: string;
|
|
21
|
+
text: JsonValue;
|
|
22
|
+
title?: string;
|
|
23
|
+
url: string;
|
|
24
|
+
}
|
|
25
|
+
export interface TinyFishFetchError {
|
|
26
|
+
error: string;
|
|
27
|
+
status?: number;
|
|
28
|
+
url: string;
|
|
29
|
+
}
|
|
30
|
+
export interface TinyFishFetchOutput {
|
|
31
|
+
errors: TinyFishFetchError[];
|
|
32
|
+
results: TinyFishFetchResult[];
|
|
33
|
+
}
|
|
34
|
+
export interface TinyFishSearchRequest {
|
|
35
|
+
language: string;
|
|
36
|
+
location: string;
|
|
37
|
+
page: number;
|
|
38
|
+
query: string;
|
|
39
|
+
}
|
|
40
|
+
export interface TinyFishSearchResult {
|
|
41
|
+
position: number;
|
|
42
|
+
site_name: string;
|
|
43
|
+
snippet: string;
|
|
44
|
+
title: string;
|
|
45
|
+
url: string;
|
|
46
|
+
}
|
|
47
|
+
export interface TinyFishSearchOutput {
|
|
48
|
+
page: number;
|
|
49
|
+
query: string;
|
|
50
|
+
results: TinyFishSearchResult[];
|
|
51
|
+
total_results: number;
|
|
52
|
+
}
|
|
53
|
+
interface TinyFishRequestOptions {
|
|
54
|
+
signal?: AbortSignal;
|
|
55
|
+
}
|
|
56
|
+
export declare function fetchTinyFishPages(request: TinyFishFetchRequest, options?: TinyFishRequestOptions): Promise<TinyFishFetchOutput>;
|
|
57
|
+
export declare function searchTinyFishWeb(request: TinyFishSearchRequest, options?: TinyFishRequestOptions): Promise<TinyFishSearchOutput>;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=tinyfish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinyfish.d.ts","sourceRoot":"","sources":["../../src/integrations/tinyfish.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/D,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,IAAI,GACJ,MAAM,GACN,MAAM,GACN,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAOD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AASD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,sBAAsB;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAKD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAkB/B"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readObject, readOptionalNumber, readOptionalString, readRequiredArray, readRequiredNumber, readRequiredString, readStringArray, } from "../utils/unknown.js";
|
|
3
|
+
const fetchEndpoint = "https://api.fetch.tinyfish.ai";
|
|
4
|
+
const requiredApiKeyError = "TINYFISH_API_KEY is required to use the built-in TinyFish web tools.";
|
|
5
|
+
const searchEndpoint = "https://api.search.tinyfish.ai";
|
|
6
|
+
const tinyFishApiKeyPoolSchema = z
|
|
7
|
+
.string()
|
|
8
|
+
.default("")
|
|
9
|
+
.transform((value) => value
|
|
10
|
+
.split(";")
|
|
11
|
+
.map((segment) => segment.trim())
|
|
12
|
+
.filter((segment) => segment.length > 0));
|
|
13
|
+
let tinyFishApiKeyPoolSource;
|
|
14
|
+
let tinyFishApiKeyIndex = 0;
|
|
15
|
+
export async function fetchTinyFishPages(request, options = {}) {
|
|
16
|
+
const body = await requestTinyFishJson("fetch", (apiKey) => fetch(fetchEndpoint, {
|
|
17
|
+
body: JSON.stringify(request),
|
|
18
|
+
headers: {
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
"X-API-Key": apiKey,
|
|
21
|
+
},
|
|
22
|
+
method: "POST",
|
|
23
|
+
signal: options.signal,
|
|
24
|
+
}));
|
|
25
|
+
return sanitizeFetchResponse(body);
|
|
26
|
+
}
|
|
27
|
+
export async function searchTinyFishWeb(request, options = {}) {
|
|
28
|
+
const url = new URL(searchEndpoint);
|
|
29
|
+
url.searchParams.set("query", request.query);
|
|
30
|
+
url.searchParams.set("location", request.location);
|
|
31
|
+
url.searchParams.set("language", request.language);
|
|
32
|
+
url.searchParams.set("page", String(request.page));
|
|
33
|
+
const body = await requestTinyFishJson("search", (apiKey) => fetch(url.toString(), {
|
|
34
|
+
headers: { "X-API-Key": apiKey },
|
|
35
|
+
method: "GET",
|
|
36
|
+
signal: options.signal,
|
|
37
|
+
}));
|
|
38
|
+
return sanitizeSearchResponse(body);
|
|
39
|
+
}
|
|
40
|
+
function getTinyFishApiKeyAttemptOrder() {
|
|
41
|
+
const apiKeys = getTinyFishApiKeyPool();
|
|
42
|
+
const startIndex = tinyFishApiKeyIndex % apiKeys.length;
|
|
43
|
+
tinyFishApiKeyIndex = (startIndex + 1) % apiKeys.length;
|
|
44
|
+
return [...apiKeys.slice(startIndex), ...apiKeys.slice(0, startIndex)];
|
|
45
|
+
}
|
|
46
|
+
function getTinyFishApiKeyPool() {
|
|
47
|
+
const apiKeyPoolSource = process.env.TINYFISH_API_KEY;
|
|
48
|
+
if (apiKeyPoolSource !== tinyFishApiKeyPoolSource) {
|
|
49
|
+
tinyFishApiKeyPoolSource = apiKeyPoolSource;
|
|
50
|
+
tinyFishApiKeyIndex = 0;
|
|
51
|
+
}
|
|
52
|
+
const apiKeys = tinyFishApiKeyPoolSchema.parse(apiKeyPoolSource);
|
|
53
|
+
if (apiKeys.length === 0) {
|
|
54
|
+
throw new Error(requiredApiKeyError);
|
|
55
|
+
}
|
|
56
|
+
return apiKeys;
|
|
57
|
+
}
|
|
58
|
+
async function parseTinyFishJsonResponse(response, serviceName) {
|
|
59
|
+
const bodyText = await response.text();
|
|
60
|
+
const { parseError, value } = parseJsonBody(bodyText);
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw createTinyFishHttpError(response, serviceName, value, parseError);
|
|
63
|
+
}
|
|
64
|
+
if (parseError) {
|
|
65
|
+
throw new Error(`TinyFish returned invalid JSON: ${parseError}`);
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
async function requestTinyFishJson(serviceName, requestWithApiKey) {
|
|
70
|
+
const [firstApiKey, ...remainingApiKeys] = getTinyFishApiKeyAttemptOrder();
|
|
71
|
+
const firstResponse = await requestWithApiKey(firstApiKey);
|
|
72
|
+
if (firstResponse.status !== 429) {
|
|
73
|
+
return parseTinyFishJsonResponse(firstResponse, serviceName);
|
|
74
|
+
}
|
|
75
|
+
let lastRateLimitError = await readTinyFishHttpError(firstResponse, serviceName);
|
|
76
|
+
for (const apiKey of remainingApiKeys) {
|
|
77
|
+
const response = await requestWithApiKey(apiKey);
|
|
78
|
+
if (response.status !== 429) {
|
|
79
|
+
return parseTinyFishJsonResponse(response, serviceName);
|
|
80
|
+
}
|
|
81
|
+
lastRateLimitError = await readTinyFishHttpError(response, serviceName);
|
|
82
|
+
}
|
|
83
|
+
if (remainingApiKeys.length === 0) {
|
|
84
|
+
throw lastRateLimitError;
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`${lastRateLimitError.message} (all ${remainingApiKeys.length + 1} configured TinyFish API keys returned HTTP 429)`);
|
|
87
|
+
}
|
|
88
|
+
async function readTinyFishHttpError(response, serviceName) {
|
|
89
|
+
const bodyText = await response.text();
|
|
90
|
+
const { parseError, value } = parseJsonBody(bodyText);
|
|
91
|
+
return createTinyFishHttpError(response, serviceName, value, parseError);
|
|
92
|
+
}
|
|
93
|
+
function createTinyFishHttpError(response, serviceName, body, parseError) {
|
|
94
|
+
const retryAfter = response.headers.get("retry-after");
|
|
95
|
+
const retryAfterMessage = retryAfter ? ` Retry-After: ${retryAfter}.` : "";
|
|
96
|
+
return new Error(`TinyFish ${serviceName} request failed with HTTP ${response.status}: ${readErrorMessage(body, parseError)}.${retryAfterMessage}`);
|
|
97
|
+
}
|
|
98
|
+
function sanitizeFetchResponse(response) {
|
|
99
|
+
const results = readRequiredArray(response.results, "TinyFish fetch results");
|
|
100
|
+
const errors = readRequiredArray(response.errors, "TinyFish fetch errors");
|
|
101
|
+
return {
|
|
102
|
+
results: results.map(sanitizeFetchResult),
|
|
103
|
+
errors: errors.map(sanitizeFetchError),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function sanitizeFetchResult(value) {
|
|
107
|
+
const object = readObject(value);
|
|
108
|
+
assertHasField(object, "text", "fetch results[].text");
|
|
109
|
+
const result = {
|
|
110
|
+
final_url: readRequiredString(object.final_url, "TinyFish fetch results[].final_url"),
|
|
111
|
+
format: readRequiredString(object.format, "TinyFish fetch results[].format"),
|
|
112
|
+
text: normalizeJsonValue(object.text),
|
|
113
|
+
url: readRequiredString(object.url, "TinyFish fetch results[].url"),
|
|
114
|
+
};
|
|
115
|
+
const optionalStrings = {
|
|
116
|
+
author: readOptionalString(object.author),
|
|
117
|
+
description: readOptionalString(object.description),
|
|
118
|
+
language: readOptionalString(object.language),
|
|
119
|
+
published_date: readOptionalString(object.published_date),
|
|
120
|
+
title: readOptionalString(object.title),
|
|
121
|
+
};
|
|
122
|
+
const latencyMs = readOptionalNumber(object.latency_ms);
|
|
123
|
+
const links = readStringArray(object.links);
|
|
124
|
+
const imageLinks = readStringArray(object.image_links);
|
|
125
|
+
for (const [key, optionalValue] of Object.entries(optionalStrings)) {
|
|
126
|
+
if (optionalValue !== undefined) {
|
|
127
|
+
result[key] = optionalValue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (latencyMs !== undefined) {
|
|
131
|
+
result.latency_ms = latencyMs;
|
|
132
|
+
}
|
|
133
|
+
if (links !== undefined) {
|
|
134
|
+
result.links = links;
|
|
135
|
+
}
|
|
136
|
+
if (imageLinks !== undefined) {
|
|
137
|
+
result.image_links = imageLinks;
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
function sanitizeFetchError(value) {
|
|
142
|
+
const object = readObject(value);
|
|
143
|
+
const error = {
|
|
144
|
+
error: readRequiredString(object.error, "TinyFish fetch errors[].error"),
|
|
145
|
+
url: readRequiredString(object.url, "TinyFish fetch errors[].url"),
|
|
146
|
+
};
|
|
147
|
+
const status = readOptionalNumber(object.status);
|
|
148
|
+
if (status !== undefined) {
|
|
149
|
+
error.status = status;
|
|
150
|
+
}
|
|
151
|
+
return error;
|
|
152
|
+
}
|
|
153
|
+
function sanitizeSearchResponse(response) {
|
|
154
|
+
const results = readRequiredArray(response.results, "TinyFish search results");
|
|
155
|
+
return {
|
|
156
|
+
page: readRequiredNumber(response.page, "TinyFish search page"),
|
|
157
|
+
query: readRequiredString(response.query, "TinyFish search query"),
|
|
158
|
+
results: results.map(sanitizeSearchResult),
|
|
159
|
+
total_results: readRequiredNumber(response.total_results, "TinyFish search total_results"),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function sanitizeSearchResult(value) {
|
|
163
|
+
const object = readObject(value);
|
|
164
|
+
return {
|
|
165
|
+
position: readRequiredNumber(object.position, "TinyFish search results[].position"),
|
|
166
|
+
site_name: readRequiredString(object.site_name, "TinyFish search results[].site_name"),
|
|
167
|
+
snippet: readRequiredString(object.snippet, "TinyFish search results[].snippet"),
|
|
168
|
+
title: readRequiredString(object.title, "TinyFish search results[].title"),
|
|
169
|
+
url: readRequiredString(object.url, "TinyFish search results[].url"),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function assertHasField(object, key, fieldName) {
|
|
173
|
+
if (!Object.hasOwn(object, key)) {
|
|
174
|
+
throw new Error(`Expected TinyFish ${fieldName} to be present.`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function normalizeJsonValue(value) {
|
|
178
|
+
if (value === null ||
|
|
179
|
+
typeof value === "boolean" ||
|
|
180
|
+
typeof value === "number" ||
|
|
181
|
+
typeof value === "string") {
|
|
182
|
+
return value;
|
|
183
|
+
}
|
|
184
|
+
if (Array.isArray(value)) {
|
|
185
|
+
return value.map(normalizeJsonValue);
|
|
186
|
+
}
|
|
187
|
+
if (typeof value === "object" && value !== null) {
|
|
188
|
+
const normalized = {};
|
|
189
|
+
for (const [key, nestedValue] of Object.entries(value)) {
|
|
190
|
+
normalized[key] = normalizeJsonValue(nestedValue);
|
|
191
|
+
}
|
|
192
|
+
return normalized;
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
function parseJsonBody(bodyText) {
|
|
197
|
+
if (!bodyText.trim()) {
|
|
198
|
+
return { value: {} };
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
return { value: JSON.parse(bodyText) };
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
return {
|
|
205
|
+
parseError: error instanceof Error ? error.message : String(error),
|
|
206
|
+
value: bodyText,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function readErrorMessage(body, parseError) {
|
|
211
|
+
if (parseError) {
|
|
212
|
+
return `invalid JSON response body: ${parseError}`;
|
|
213
|
+
}
|
|
214
|
+
const error = readObject(readObject(body).error);
|
|
215
|
+
const message = readOptionalString(error.message);
|
|
216
|
+
if (message) {
|
|
217
|
+
return message;
|
|
218
|
+
}
|
|
219
|
+
return JSON.stringify(body);
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=tinyfish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinyfish.js","sourceRoot":"","sources":["../../src/integrations/tinyfish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,eAAO,MAAM,KAAK,EAAE,UAGnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { webFetchTool as defaultWebFetchTool } from "./web-fetch.js";
|
|
2
|
+
import { webSearchTool as defaultWebSearchTool } from "./web-search.js";
|
|
3
|
+
export const tools = {
|
|
4
|
+
web_fetch: defaultWebFetchTool,
|
|
5
|
+
web_search: defaultWebSearchTool,
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,CAAC,MAAM,KAAK,GAAe;IAC/B,SAAS,EAAE,mBAAmB;IAC9B,UAAU,EAAE,oBAAoB;CACjC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TinyFishFetchError, type TinyFishFetchOutput, type TinyFishFetchResult } from "../integrations/tinyfish";
|
|
2
|
+
export type WebFetchResult = TinyFishFetchResult;
|
|
3
|
+
export type WebFetchError = TinyFishFetchError;
|
|
4
|
+
export type WebFetchOutput = TinyFishFetchOutput;
|
|
5
|
+
export declare const webFetchTool: unknown;
|
|
6
|
+
//# sourceMappingURL=web-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAExB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AACjD,MAAM,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAC/C,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAQjD,eAAO,MAAM,YAAY,EAAE,OA6BzB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsonSchema, tool } from "ai";
|
|
2
|
+
import { fetchTinyFishPages, } from "../integrations/tinyfish.js";
|
|
3
|
+
import { readObject, readString } from "../utils/unknown.js";
|
|
4
|
+
const fetchDefaults = {
|
|
5
|
+
format: "markdown",
|
|
6
|
+
image_links: false,
|
|
7
|
+
links: false,
|
|
8
|
+
};
|
|
9
|
+
export const webFetchTool = tool({
|
|
10
|
+
description: "Fetch and extract readable content from up to 10 absolute HTTP(S) URLs. Use after web_search or when the user provides URLs; markdown is the best default format for LLM context.",
|
|
11
|
+
execute: (input, options) => {
|
|
12
|
+
const request = parseWebFetchInput(input);
|
|
13
|
+
return fetchTinyFishPages(request, { signal: options?.abortSignal });
|
|
14
|
+
},
|
|
15
|
+
inputSchema: jsonSchema({
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
description: "URLs to fetch. Format and link extraction are intentionally managed by the tool.",
|
|
18
|
+
properties: {
|
|
19
|
+
urls: {
|
|
20
|
+
description: "Absolute http or https URLs to fetch. Maximum 10 URLs per request.",
|
|
21
|
+
items: {
|
|
22
|
+
description: "Absolute http or https URL.",
|
|
23
|
+
format: "uri",
|
|
24
|
+
type: "string",
|
|
25
|
+
},
|
|
26
|
+
maxItems: 10,
|
|
27
|
+
minItems: 1,
|
|
28
|
+
type: "array",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ["urls"],
|
|
32
|
+
type: "object",
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
function parseWebFetchInput(input) {
|
|
36
|
+
const object = readObject(input);
|
|
37
|
+
const urls = readUrls(object.urls);
|
|
38
|
+
return {
|
|
39
|
+
...fetchDefaults,
|
|
40
|
+
urls,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function readUrls(value) {
|
|
44
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
45
|
+
throw new Error("web_fetch requires at least one URL.");
|
|
46
|
+
}
|
|
47
|
+
if (value.length > 10) {
|
|
48
|
+
throw new Error("web_fetch accepts at most 10 URLs per request.");
|
|
49
|
+
}
|
|
50
|
+
return value.map((item) => readHttpUrl(item));
|
|
51
|
+
}
|
|
52
|
+
function readHttpUrl(value) {
|
|
53
|
+
const url = readString(value).trim();
|
|
54
|
+
if (!url) {
|
|
55
|
+
throw new Error("web_fetch URLs must be non-empty strings.");
|
|
56
|
+
}
|
|
57
|
+
let parsedUrl;
|
|
58
|
+
try {
|
|
59
|
+
parsedUrl = new URL(url);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new Error("web_fetch URLs must be valid absolute http or https URLs.");
|
|
63
|
+
}
|
|
64
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
65
|
+
throw new Error("web_fetch only accepts http and https URLs.");
|
|
66
|
+
}
|
|
67
|
+
return parsedUrl.href;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EACL,kBAAkB,GAKnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM1D,MAAM,aAAa,GAAG;IACpB,MAAM,EAAE,UAAU;IAClB,WAAW,EAAE,KAAK;IAClB,KAAK,EAAE,KAAK;CAC4D,CAAC;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAY,IAAI,CAAC;IACxC,WAAW,EACT,mLAAmL;IACrL,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAA2B,EAAE;QACnD,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,WAAW,EAAE,UAAU,CAAC;QACtB,oBAAoB,EAAE,KAAK;QAC3B,WAAW,EACT,kFAAkF;QACpF,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,WAAW,EACT,oEAAoE;gBACtE,KAAK,EAAE;oBACL,WAAW,EAAE,6BAA6B;oBAC1C,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,QAAQ;iBACf;gBACD,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,CAAC;gBACX,IAAI,EAAE,OAAO;aACd;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,QAAQ;KACf,CAAC;CACH,CAAC,CAAC;AAEH,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnC,OAAO;QACL,GAAG,aAAa;QAChB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAErC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,SAAc,CAAC;IAEnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type TinyFishSearchOutput, type TinyFishSearchResult } from "../integrations/tinyfish";
|
|
2
|
+
export type WebSearchResult = TinyFishSearchResult;
|
|
3
|
+
export type WebSearchOutput = TinyFishSearchOutput;
|
|
4
|
+
export declare const webSearchTool: unknown;
|
|
5
|
+
//# 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":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEnD,eAAO,MAAM,aAAa,EAAE,OAuB1B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsonSchema, tool } from "ai";
|
|
2
|
+
import { searchTinyFishWeb, } from "../integrations/tinyfish.js";
|
|
3
|
+
import { readObject, readString } from "../utils/unknown.js";
|
|
4
|
+
export const webSearchTool = tool({
|
|
5
|
+
description: "Search the public web for current or external information. Returns ranked results with titles, snippets, and URLs; use web_fetch afterward to read full page content.",
|
|
6
|
+
execute: (input, options) => {
|
|
7
|
+
const request = parseWebSearchInput(input);
|
|
8
|
+
return searchTinyFishWeb(request, { signal: options?.abortSignal });
|
|
9
|
+
},
|
|
10
|
+
inputSchema: jsonSchema({
|
|
11
|
+
additionalProperties: false,
|
|
12
|
+
description: "Search query. Locale and pagination are intentionally managed by the tool.",
|
|
13
|
+
properties: {
|
|
14
|
+
query: {
|
|
15
|
+
description: "Non-empty search query. Search operators such as site:example.com or -site:example.com may be included.",
|
|
16
|
+
minLength: 1,
|
|
17
|
+
type: "string",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
required: ["query"],
|
|
21
|
+
type: "object",
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
function parseWebSearchInput(input) {
|
|
25
|
+
const object = readObject(input);
|
|
26
|
+
const query = readString(object.query).trim();
|
|
27
|
+
if (!query) {
|
|
28
|
+
throw new Error("web_search requires a non-empty query string.");
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
language: "en",
|
|
32
|
+
location: "US",
|
|
33
|
+
page: 0,
|
|
34
|
+
query,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# 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,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EACL,iBAAiB,GAIlB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK1D,MAAM,CAAC,MAAM,aAAa,GAAY,IAAI,CAAC;IACzC,WAAW,EACT,uKAAuK;IACzK,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAA4B,EAAE;QACpD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE3C,OAAO,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,WAAW,EAAE,UAAU,CAAC;QACtB,oBAAoB,EAAE,KAAK;QAC3B,WAAW,EACT,4EAA4E;QAC9E,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,WAAW,EACT,yGAAyG;gBAC3G,SAAS,EAAE,CAAC;gBACZ,IAAI,EAAE,QAAQ;aACf;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,IAAI,EAAE,QAAQ;KACf,CAAC;CACH,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,CAAC;QACP,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface TuiToolCallView {
|
|
2
|
+
input: unknown;
|
|
3
|
+
toolCallId: string;
|
|
4
|
+
toolName: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TuiToolResultView {
|
|
7
|
+
output: unknown;
|
|
8
|
+
toolCallId: string;
|
|
9
|
+
toolName: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const safeText: (text: string) => string;
|
|
12
|
+
export declare const safeInlineText: (text: string) => string;
|
|
13
|
+
export declare const truncateDetail: (text: string, maxLength?: number) => string;
|
|
14
|
+
export declare function formatToolCallForTui(event: TuiToolCallView): string;
|
|
15
|
+
export declare function formatToolResultForTui(event: TuiToolResultView): string;
|
|
16
|
+
//# sourceMappingURL=tui-tool-printer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-tool-printer.d.ts","sourceRoot":"","sources":["../src/tui-tool-printer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAWD,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAG3B,CAAC;AAEd,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MACS,CAAC;AAExD,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,kBAA2B,KAC1B,MACqE,CAAC;AAEzE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAEnE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAEvE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const defaultJsonLength = 220;
|
|
2
|
+
const darkGrayText = "\x1b[90m";
|
|
3
|
+
const errorPrefixPattern = /^Error: /;
|
|
4
|
+
const maxDetailLength = 600;
|
|
5
|
+
const resetText = "\x1b[0m";
|
|
6
|
+
const toolCallIdDisplayEnd = 13;
|
|
7
|
+
const toolCallIdDisplayStart = 5;
|
|
8
|
+
const whitespacePattern = /\s+/g;
|
|
9
|
+
export const safeText = (text) => Array.from(text)
|
|
10
|
+
.filter((value) => !isTerminalControlCharacter(value))
|
|
11
|
+
.join("");
|
|
12
|
+
export const safeInlineText = (text) => safeText(text).replace(whitespacePattern, " ").trim();
|
|
13
|
+
export const truncateDetail = (text, maxLength = maxDetailLength) => text.length <= maxLength ? text : `${text.slice(0, maxLength - 3)}...`;
|
|
14
|
+
export function formatToolCallForTui(event) {
|
|
15
|
+
return `${formatToolLabel(event)} ${formatToolInput(event.input)}`;
|
|
16
|
+
}
|
|
17
|
+
export function formatToolResultForTui(event) {
|
|
18
|
+
return `${formatToolLabel(event)} ${formatToolOutput(event.output)}`;
|
|
19
|
+
}
|
|
20
|
+
function formatToolLabel(event) {
|
|
21
|
+
return `${safeInlineText(event.toolName)}${darkGrayText}#${shortToolCallId(event.toolCallId)}${resetText}`;
|
|
22
|
+
}
|
|
23
|
+
function isTerminalControlCharacter(value) {
|
|
24
|
+
const code = value.codePointAt(0);
|
|
25
|
+
return (code !== undefined &&
|
|
26
|
+
(code <= 0x08 ||
|
|
27
|
+
(code >= 0x0b && code <= 0x1f) ||
|
|
28
|
+
(code >= 0x7f && code <= 0x9f)));
|
|
29
|
+
}
|
|
30
|
+
function safeJson(value, maxLength = maxDetailLength) {
|
|
31
|
+
try {
|
|
32
|
+
return truncateDetail(safeInlineText(JSON.stringify(value) ?? "undefined"), maxLength);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return truncateDetail(safeInlineText(String(value)), maxLength);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function shortToolCallId(toolCallId) {
|
|
39
|
+
// Fixed display window: do not parse separators; AI SDK call IDs usually put
|
|
40
|
+
// the useful unique block after "call-", while other providers still render consistently.
|
|
41
|
+
return safeInlineText(toolCallId.slice(toolCallIdDisplayStart, toolCallIdDisplayEnd));
|
|
42
|
+
}
|
|
43
|
+
function isRecord(value) {
|
|
44
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
45
|
+
}
|
|
46
|
+
function quoted(value, maxLength = 80) {
|
|
47
|
+
return `"${truncateDetail(safeInlineText(value), maxLength)}"`;
|
|
48
|
+
}
|
|
49
|
+
function formatToolInput(input) {
|
|
50
|
+
if (isRecord(input)) {
|
|
51
|
+
const knownInput = formatKnownToolInput(input);
|
|
52
|
+
if (knownInput) {
|
|
53
|
+
return knownInput;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return `input=${safeJson(input, 120)}`;
|
|
57
|
+
}
|
|
58
|
+
function formatKnownToolInput(input) {
|
|
59
|
+
if (typeof input.query === "string") {
|
|
60
|
+
return `query=${quoted(input.query)}`;
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(input.urls)) {
|
|
63
|
+
return formatUrls(input.urls);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function formatUrls(urls) {
|
|
67
|
+
const first = urls[0];
|
|
68
|
+
const label = typeof first === "string" ? first : String(first);
|
|
69
|
+
return `urls=${urls.length} first=${quoted(label, 40)}`;
|
|
70
|
+
}
|
|
71
|
+
function formatToolOutput(output) {
|
|
72
|
+
if (!isRecord(output) || typeof output.type !== "string") {
|
|
73
|
+
return `output=${safeJson(output, defaultJsonLength)}`;
|
|
74
|
+
}
|
|
75
|
+
if (output.type === "json") {
|
|
76
|
+
return `json ${formatJsonOutputValue(output.value)}`;
|
|
77
|
+
}
|
|
78
|
+
if (typeof output.value === "string") {
|
|
79
|
+
return `${output.type}=${quoted(output.value.replace(errorPrefixPattern, ""), 72)}`;
|
|
80
|
+
}
|
|
81
|
+
if (output.type === "execution-denied") {
|
|
82
|
+
return `denied=${quoted(String(output.reason ?? "no reason"), 100)}`;
|
|
83
|
+
}
|
|
84
|
+
return `${output.type} ${safeJson(output, 160)}`;
|
|
85
|
+
}
|
|
86
|
+
function formatJsonOutputValue(value) {
|
|
87
|
+
if (!isRecord(value)) {
|
|
88
|
+
return safeJson(value, defaultJsonLength);
|
|
89
|
+
}
|
|
90
|
+
const knownOutput = formatKnownJsonOutputValue(value);
|
|
91
|
+
return knownOutput ?? safeJson(value, defaultJsonLength);
|
|
92
|
+
}
|
|
93
|
+
function formatKnownJsonOutputValue(value) {
|
|
94
|
+
const parts = [];
|
|
95
|
+
if (Array.isArray(value.results)) {
|
|
96
|
+
parts.push(`results=${value.results.length}`);
|
|
97
|
+
const title = firstResultTitle(value.results);
|
|
98
|
+
if (title) {
|
|
99
|
+
parts.push(`top=${quoted(title, 36)}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (Array.isArray(value.errors)) {
|
|
103
|
+
parts.push(`errors=${value.errors.length}`);
|
|
104
|
+
}
|
|
105
|
+
return parts.length > 0 ? parts.join(" ") : undefined;
|
|
106
|
+
}
|
|
107
|
+
function firstResultTitle(results) {
|
|
108
|
+
const first = results.find(isRecord);
|
|
109
|
+
if (!first) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (typeof first.title === "string") {
|
|
113
|
+
return first.title;
|
|
114
|
+
}
|
|
115
|
+
if (typeof first.final_url === "string") {
|
|
116
|
+
return first.final_url;
|
|
117
|
+
}
|
|
118
|
+
if (typeof first.url === "string") {
|
|
119
|
+
return first.url;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=tui-tool-printer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-tool-printer.js","sourceRoot":"","sources":["../src/tui-tool-printer.ts"],"names":[],"mappings":"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"}
|
package/dist/tui.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":""}
|
package/dist/tui.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Container, Input, matchesKey, ProcessTerminal, Text, TUI, } from "@earendil-works/pi-tui";
|
|
2
|
+
import { Agent } from "@minpeter/pss-runtime";
|
|
3
|
+
import { tools } from "./tools/index.js";
|
|
4
|
+
import { formatToolCallForTui, formatToolResultForTui, safeInlineText, safeText, truncateDetail, } from "./tui-tool-printer.js";
|
|
5
|
+
const agent = new Agent({
|
|
6
|
+
instructions: "Answer in 2 short sentences and 280 characters or fewer unless the user explicitly asks for detail. Avoid headings.",
|
|
7
|
+
tools,
|
|
8
|
+
});
|
|
9
|
+
const session = agent.createSession();
|
|
10
|
+
const terminal = new ProcessTerminal();
|
|
11
|
+
const tui = new TUI(terminal);
|
|
12
|
+
const chat = new Container();
|
|
13
|
+
const input = new Input();
|
|
14
|
+
tui.addChild(new Text("\x1b[1mpss-next\x1b[0m \x1b[2m(Esc to interrupt · Ctrl-C to quit)\x1b[0m", 1, 0));
|
|
15
|
+
tui.addChild(chat);
|
|
16
|
+
tui.addChild(input);
|
|
17
|
+
tui.setFocus(input);
|
|
18
|
+
let finish;
|
|
19
|
+
const done = new Promise((resolve) => {
|
|
20
|
+
finish = resolve;
|
|
21
|
+
});
|
|
22
|
+
const addLine = (text) => {
|
|
23
|
+
chat.addChild(new Text(text, 1, 0));
|
|
24
|
+
tui.requestRender();
|
|
25
|
+
};
|
|
26
|
+
const formatEvent = (event) => {
|
|
27
|
+
switch (event.type) {
|
|
28
|
+
case "user-text":
|
|
29
|
+
return `\x1b[36myou\x1b[0m: ${safeText(event.text)}`;
|
|
30
|
+
case "assistant-text":
|
|
31
|
+
return `\x1b[32massistant\x1b[0m: ${safeText(event.text)}`;
|
|
32
|
+
case "assistant-reasoning":
|
|
33
|
+
return `\x1b[35mreasoning\x1b[0m: ${truncateDetail(safeInlineText(event.text), 240)}`;
|
|
34
|
+
case "tool-call":
|
|
35
|
+
return `\x1b[33mtool\x1b[0m ${formatToolCallForTui(event)}`;
|
|
36
|
+
case "tool-result":
|
|
37
|
+
return `\x1b[33mtool result\x1b[0m ${formatToolResultForTui(event)}`;
|
|
38
|
+
case "turn-start":
|
|
39
|
+
return "\x1b[2mrunning...\x1b[0m";
|
|
40
|
+
case "turn-abort":
|
|
41
|
+
return "\x1b[2minterrupted\x1b[0m";
|
|
42
|
+
case "turn-error":
|
|
43
|
+
return `\x1b[31merror\x1b[0m: ${safeText(event.message)}`;
|
|
44
|
+
case "turn-end":
|
|
45
|
+
return "\x1b[2mdone\x1b[0m";
|
|
46
|
+
case "step-start":
|
|
47
|
+
case "step-end":
|
|
48
|
+
return;
|
|
49
|
+
default:
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
session.subscribe((event) => {
|
|
54
|
+
const line = formatEvent(event);
|
|
55
|
+
if (line) {
|
|
56
|
+
addLine(line);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
input.onSubmit = (text) => {
|
|
60
|
+
input.setValue("");
|
|
61
|
+
const trimmed = text.trim();
|
|
62
|
+
if (!trimmed) {
|
|
63
|
+
tui.requestRender();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
session
|
|
67
|
+
.submit({ type: "user-text", text: trimmed })
|
|
68
|
+
.catch((error) => {
|
|
69
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
70
|
+
addLine(`\x1b[31merror\x1b[0m: ${safeText(message)}`);
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
const removeInputListener = tui.addInputListener((data) => {
|
|
74
|
+
// Avoid input.onEscape because pi-tui maps both Escape and Ctrl-C to it.
|
|
75
|
+
if (matchesKey(data, "escape")) {
|
|
76
|
+
session.interrupt();
|
|
77
|
+
return { consume: true };
|
|
78
|
+
}
|
|
79
|
+
if (!matchesKey(data, "ctrl+c")) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
removeInputListener();
|
|
83
|
+
session.kill();
|
|
84
|
+
tui.stop();
|
|
85
|
+
finish();
|
|
86
|
+
return { consume: true };
|
|
87
|
+
});
|
|
88
|
+
tui.start();
|
|
89
|
+
tui.requestRender();
|
|
90
|
+
await done;
|
|
91
|
+
//# sourceMappingURL=tui.js.map
|
package/dist/tui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function readObject(value: unknown): Record<string, unknown>;
|
|
2
|
+
export declare function readString(value: unknown): string;
|
|
3
|
+
export declare function readRequiredString(value: unknown, fieldName: string): string;
|
|
4
|
+
export declare function readOptionalString(value: unknown): string | undefined;
|
|
5
|
+
export declare function readRequiredNumber(value: unknown, fieldName: string): number;
|
|
6
|
+
export declare function readRequiredArray(value: unknown, fieldName: string): unknown[];
|
|
7
|
+
export declare function readOptionalNumber(value: unknown): number | undefined;
|
|
8
|
+
export declare function readStringArray(value: unknown): string[] | undefined;
|
|
9
|
+
//# sourceMappingURL=unknown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unknown.d.ts","sourceRoot":"","sources":["../../src/utils/unknown.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAErE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,EAAE,CAMX;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIrE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAMpE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function readObject(value) {
|
|
2
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
3
|
+
return {};
|
|
4
|
+
}
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
export function readString(value) {
|
|
8
|
+
return typeof value === "string" ? value : "";
|
|
9
|
+
}
|
|
10
|
+
export function readRequiredString(value, fieldName) {
|
|
11
|
+
if (typeof value !== "string") {
|
|
12
|
+
throw new Error(`Expected ${fieldName} to be a string.`);
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function readOptionalString(value) {
|
|
17
|
+
return typeof value === "string" ? value : undefined;
|
|
18
|
+
}
|
|
19
|
+
export function readRequiredNumber(value, fieldName) {
|
|
20
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
21
|
+
throw new Error(`Expected ${fieldName} to be a finite number.`);
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
export function readRequiredArray(value, fieldName) {
|
|
26
|
+
if (!Array.isArray(value)) {
|
|
27
|
+
throw new Error(`Expected ${fieldName} to be an array.`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
export function readOptionalNumber(value) {
|
|
32
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
33
|
+
? value
|
|
34
|
+
: undefined;
|
|
35
|
+
}
|
|
36
|
+
export function readStringArray(value) {
|
|
37
|
+
if (!Array.isArray(value)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
return value.filter((item) => typeof item === "string");
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=unknown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unknown.js","sourceRoot":"","sources":["../../src/utils/unknown.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,SAAiB;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,SAAiB;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,yBAAyB,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,SAAiB;IAEjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACxD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@minpeter/pss-coding-agent",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Coding-agent product tools and TUI wiring for pss-next.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"@minpeter/pss-source": "./src/index.ts",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./tui": {
|
|
15
|
+
"@minpeter/pss-source": "./src/tui.ts",
|
|
16
|
+
"types": "./dist/tui.d.ts",
|
|
17
|
+
"import": "./dist/tui.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/minpeter/pss-next.git",
|
|
27
|
+
"directory": "packages/coding-agent"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public",
|
|
31
|
+
"provenance": true
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@earendil-works/pi-tui": "^0.74.1",
|
|
35
|
+
"ai": "7.0.0-canary.142",
|
|
36
|
+
"zod": "^4.4.3",
|
|
37
|
+
"@minpeter/pss-runtime": "0.0.0"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/fix-esm-imports.mjs dist",
|
|
41
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"lint": "ultracite check ."
|
|
44
|
+
}
|
|
45
|
+
}
|