pi-agent-flow 1.8.1 → 1.8.3

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 (154) hide show
  1. package/README.md +4 -30
  2. package/agents/audit.md +1 -2
  3. package/agents/build.md +1 -0
  4. package/agents/craft.md +12 -8
  5. package/agents/debug.md +2 -2
  6. package/agents/ideas.md +1 -0
  7. package/agents/scout.md +1 -0
  8. package/dist/agents.d.ts +41 -0
  9. package/dist/agents.d.ts.map +1 -0
  10. package/dist/agents.js +283 -0
  11. package/dist/agents.js.map +1 -0
  12. package/dist/batch/batch-bash.d.ts +87 -0
  13. package/dist/batch/batch-bash.d.ts.map +1 -0
  14. package/dist/batch/batch-bash.js +369 -0
  15. package/dist/batch/batch-bash.js.map +1 -0
  16. package/dist/batch/constants.d.ts +100 -0
  17. package/dist/batch/constants.d.ts.map +1 -0
  18. package/dist/batch/constants.js +15 -0
  19. package/dist/batch/constants.js.map +1 -0
  20. package/dist/batch/execute.d.ts +21 -0
  21. package/dist/batch/execute.d.ts.map +1 -0
  22. package/dist/batch/execute.js +440 -0
  23. package/dist/batch/execute.js.map +1 -0
  24. package/dist/batch/fuzzy-edit.d.ts +29 -0
  25. package/dist/batch/fuzzy-edit.d.ts.map +1 -0
  26. package/dist/batch/fuzzy-edit.js +257 -0
  27. package/dist/batch/fuzzy-edit.js.map +1 -0
  28. package/dist/batch/index.d.ts +85 -0
  29. package/dist/batch/index.d.ts.map +1 -0
  30. package/dist/batch/index.js +422 -0
  31. package/dist/batch/index.js.map +1 -0
  32. package/dist/batch/render.d.ts +14 -0
  33. package/dist/batch/render.d.ts.map +1 -0
  34. package/dist/batch/render.js +74 -0
  35. package/dist/batch/render.js.map +1 -0
  36. package/dist/batch/symbols.d.ts +9 -0
  37. package/dist/batch/symbols.d.ts.map +1 -0
  38. package/dist/batch/symbols.js +310 -0
  39. package/dist/batch/symbols.js.map +1 -0
  40. package/dist/batch.d.ts +12 -0
  41. package/dist/batch.d.ts.map +1 -0
  42. package/dist/batch.js +11 -0
  43. package/dist/batch.js.map +1 -0
  44. package/dist/cli-args.d.ts +27 -0
  45. package/dist/cli-args.d.ts.map +1 -0
  46. package/dist/cli-args.js +265 -0
  47. package/dist/cli-args.js.map +1 -0
  48. package/dist/config.d.ts +58 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +296 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/depth.d.ts +25 -0
  53. package/dist/depth.d.ts.map +1 -0
  54. package/dist/depth.js +160 -0
  55. package/dist/depth.js.map +1 -0
  56. package/dist/executor.d.ts +87 -0
  57. package/dist/executor.d.ts.map +1 -0
  58. package/dist/executor.js +295 -0
  59. package/dist/executor.js.map +1 -0
  60. package/dist/flow-prompt.d.ts +23 -0
  61. package/dist/flow-prompt.d.ts.map +1 -0
  62. package/dist/flow-prompt.js +99 -0
  63. package/dist/flow-prompt.js.map +1 -0
  64. package/dist/flow.d.ts +76 -0
  65. package/dist/flow.d.ts.map +1 -0
  66. package/dist/flow.js +704 -0
  67. package/dist/flow.js.map +1 -0
  68. package/dist/index.d.ts +10 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +327 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/reasoning-strip.d.ts +26 -0
  73. package/dist/reasoning-strip.d.ts.map +1 -0
  74. package/dist/reasoning-strip.js +58 -0
  75. package/dist/reasoning-strip.js.map +1 -0
  76. package/dist/render-utils.d.ts +42 -0
  77. package/dist/render-utils.d.ts.map +1 -0
  78. package/dist/render-utils.js +182 -0
  79. package/dist/render-utils.js.map +1 -0
  80. package/dist/render.d.ts +24 -0
  81. package/dist/render.d.ts.map +1 -0
  82. package/dist/render.js +409 -0
  83. package/dist/render.js.map +1 -0
  84. package/dist/runner-events.d.ts +59 -0
  85. package/dist/runner-events.d.ts.map +1 -0
  86. package/dist/runner-events.js +539 -0
  87. package/dist/runner-events.js.map +1 -0
  88. package/dist/session-mode.d.ts +10 -0
  89. package/dist/session-mode.d.ts.map +1 -0
  90. package/dist/session-mode.js +25 -0
  91. package/dist/session-mode.js.map +1 -0
  92. package/dist/settings-resolver.d.ts +28 -0
  93. package/dist/settings-resolver.d.ts.map +1 -0
  94. package/dist/settings-resolver.js +148 -0
  95. package/dist/settings-resolver.js.map +1 -0
  96. package/dist/sliding-prompt.d.ts +40 -0
  97. package/dist/sliding-prompt.d.ts.map +1 -0
  98. package/dist/sliding-prompt.js +121 -0
  99. package/dist/sliding-prompt.js.map +1 -0
  100. package/dist/snapshot.d.ts +29 -0
  101. package/dist/snapshot.d.ts.map +1 -0
  102. package/dist/snapshot.js +199 -0
  103. package/dist/snapshot.js.map +1 -0
  104. package/dist/structured-output.d.ts +36 -0
  105. package/dist/structured-output.d.ts.map +1 -0
  106. package/dist/structured-output.js +244 -0
  107. package/dist/structured-output.js.map +1 -0
  108. package/dist/timed-bash.d.ts +45 -0
  109. package/dist/timed-bash.d.ts.map +1 -0
  110. package/dist/timed-bash.js +219 -0
  111. package/dist/timed-bash.js.map +1 -0
  112. package/dist/tool-utils.d.ts +20 -0
  113. package/dist/tool-utils.d.ts.map +1 -0
  114. package/dist/tool-utils.js +38 -0
  115. package/dist/tool-utils.js.map +1 -0
  116. package/dist/transitions.d.ts +39 -0
  117. package/dist/transitions.d.ts.map +1 -0
  118. package/dist/transitions.js +59 -0
  119. package/dist/transitions.js.map +1 -0
  120. package/dist/types.d.ts +207 -0
  121. package/dist/types.d.ts.map +1 -0
  122. package/dist/types.js +143 -0
  123. package/dist/types.js.map +1 -0
  124. package/dist/web-tool.d.ts +35 -0
  125. package/dist/web-tool.d.ts.map +1 -0
  126. package/dist/web-tool.js +545 -0
  127. package/dist/web-tool.js.map +1 -0
  128. package/package.json +7 -5
  129. package/src/agents.ts +0 -299
  130. package/src/ambient.d.ts +0 -107
  131. package/src/batch/batch-bash.ts +0 -443
  132. package/src/batch/constants.ts +0 -128
  133. package/src/batch/execute.ts +0 -551
  134. package/src/batch/fuzzy-edit.ts +0 -323
  135. package/src/batch/index.ts +0 -494
  136. package/src/batch/render.ts +0 -81
  137. package/src/batch/symbols.ts +0 -341
  138. package/src/batch.ts +0 -28
  139. package/src/cli-args.ts +0 -315
  140. package/src/config.ts +0 -391
  141. package/src/executor.ts +0 -445
  142. package/src/flow.ts +0 -834
  143. package/src/hooks.ts +0 -294
  144. package/src/index.ts +0 -1132
  145. package/src/render-utils.ts +0 -205
  146. package/src/render.ts +0 -524
  147. package/src/runner-events.ts +0 -692
  148. package/src/session-mode.ts +0 -33
  149. package/src/sliding-prompt.ts +0 -144
  150. package/src/structured-output.ts +0 -195
  151. package/src/timed-bash.ts +0 -270
  152. package/src/transitions.ts +0 -86
  153. package/src/types.ts +0 -386
  154. package/src/web-tool.ts +0 -663
@@ -0,0 +1,545 @@
1
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, truncateHead } from "@mariozechner/pi-coding-agent";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { createHash } from "node:crypto";
4
+ import { execFile } from "node:child_process";
5
+ import { mkdir, writeFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { JSDOM } from "jsdom";
8
+ import TurndownService from "turndown";
9
+ import { appendStrategicHint } from "./tool-utils.js";
10
+ // ---------------------------------------------------------------------------
11
+ // Schema
12
+ // ---------------------------------------------------------------------------
13
+ const searchOp = Type.Object({
14
+ o: Type.Literal("search"),
15
+ q: Type.String({ minLength: 1, description: "Search query" }),
16
+ });
17
+ const fetchOp = Type.Object({
18
+ o: Type.Literal("fetch"),
19
+ u: Type.String({ minLength: 1, description: "URL to fetch" }),
20
+ f: Type.Optional(Type.Union([Type.Literal("markdown"), Type.Literal("text"), Type.Literal("html")], {
21
+ description: "Output format (default: markdown)",
22
+ })),
23
+ });
24
+ export const webSchema = Type.Object({
25
+ op: Type.Array(Type.Union([searchOp, fetchOp]), {
26
+ minItems: 1,
27
+ description: "Array of web operations to perform",
28
+ }),
29
+ });
30
+ // ---------------------------------------------------------------------------
31
+ // Constants
32
+ // ---------------------------------------------------------------------------
33
+ const MAX_SEARCH_RESULTS = 4;
34
+ const MAX_SEARCH_SNIPPET_CHARS = 160;
35
+ const MAX_MARKDOWN_CHARS = 200_000;
36
+ const MAX_FETCH_BYTES = 5_000_000;
37
+ const PREVIEW_CHARS = 500;
38
+ const ALLOWED_CONTENT_TYPES = [
39
+ "text/html",
40
+ "application/xhtml+xml",
41
+ "text/plain",
42
+ "application/xml",
43
+ "text/xml",
44
+ ];
45
+ // ---------------------------------------------------------------------------
46
+ // Tool factory
47
+ // ---------------------------------------------------------------------------
48
+ export function createWebTool() {
49
+ return {
50
+ name: "web",
51
+ label: "Web",
52
+ description: "Perform web operations: search or fetch pages. Pass an array of ops: [{ o: 'search', q: '...' }] or [{ o: 'fetch', u: '...', f: 'markdown' }].",
53
+ promptSnippet: "Search the web or fetch a webpage when local files are insufficient",
54
+ promptGuidelines: [
55
+ "Pass ops as an array: [{ o: 'search', q: '<query>' }] to find pages.",
56
+ "Pass ops as an array: [{ o: 'fetch', u: '<url>', f: 'markdown' }] to download a URL. Content is saved to a temp file — use the read tool to access it in chunks.",
57
+ "The tool returns the file path, title, content length, and a short preview of the content when fetching.",
58
+ "Do NOT ask the web tool a question directly. Search or fetch first, then read the results or file to find what you need.",
59
+ ],
60
+ parameters: webSchema,
61
+ async execute(_toolCallId, params, signal, _onUpdate, ctx) {
62
+ return runWebOps(params, ctx, signal);
63
+ },
64
+ };
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Active tool management
68
+ // ---------------------------------------------------------------------------
69
+ export function setWebToolsActive(pi, enabled) {
70
+ const active = new Set(pi.getActiveTools());
71
+ if (enabled)
72
+ active.add("web");
73
+ else
74
+ active.delete("web");
75
+ pi.setActiveTools([...active]);
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Core dispatch
79
+ // ---------------------------------------------------------------------------
80
+ async function runWebOps(params, ctx, signal) {
81
+ const parts = [];
82
+ const details = [];
83
+ for (const op of params.op) {
84
+ if (op.o === "search") {
85
+ const result = await runWebSearch({ query: op.q }, ctx, signal);
86
+ parts.push(result.content[0].text);
87
+ details.push({ o: "search", q: op.q, ...result.details });
88
+ }
89
+ else {
90
+ const result = await runWebFetch({ url: op.u, format: op.f }, ctx, signal);
91
+ parts.push(result.content[0].text);
92
+ details.push({ o: "fetch", u: op.u, f: op.f, ...result.details });
93
+ }
94
+ }
95
+ const text = parts.join("\n\n---\n\n");
96
+ const truncated = truncateHead(text, {
97
+ maxLines: DEFAULT_MAX_LINES,
98
+ maxBytes: DEFAULT_MAX_BYTES,
99
+ }).content;
100
+ const webResult = {
101
+ content: [{ type: "text", text: truncated }],
102
+ details: { ops: details },
103
+ };
104
+ appendStrategicHint(webResult);
105
+ return webResult;
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Search
109
+ // ---------------------------------------------------------------------------
110
+ async function runWebSearch(params, _ctx, signal) {
111
+ const { results, errors } = await searchKeyless(params.query, signal);
112
+ let text;
113
+ if (results.length > 0) {
114
+ text = results
115
+ .map((result, index) => {
116
+ const snippet = result.snippet ? `\n ${result.snippet}` : "";
117
+ return `${index + 1}. ${result.title}\n ${result.url}${snippet}`;
118
+ })
119
+ .join("\n\n");
120
+ }
121
+ else if (errors.length > 0) {
122
+ text = `Search failed for: ${params.query}\n\nAll search providers returned errors:\n${errors.map((e) => `- ${e}`).join("\n")}`;
123
+ }
124
+ else {
125
+ text = `No results found for: ${params.query}`;
126
+ }
127
+ text = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES }).content;
128
+ return {
129
+ content: [{ type: "text", text }],
130
+ details: {
131
+ query: params.query,
132
+ results,
133
+ errors: errors.length > 0 ? errors : undefined,
134
+ },
135
+ };
136
+ }
137
+ async function searchKeyless(query, signal) {
138
+ const errors = [];
139
+ try {
140
+ const brave = await braveSearchHtml(query, signal);
141
+ if (brave.length > 0)
142
+ return { results: brave, errors: [] };
143
+ }
144
+ catch (err) {
145
+ errors.push(`Brave: ${err instanceof Error ? err.message : String(err)}`);
146
+ }
147
+ try {
148
+ const ddg = await duckDuckGoHtmlSearch(query, signal);
149
+ if (ddg.length > 0)
150
+ return { results: ddg, errors: [] };
151
+ }
152
+ catch (err) {
153
+ errors.push(`DuckDuckGo: ${err instanceof Error ? err.message : String(err)}`);
154
+ }
155
+ if (errors.length > 0) {
156
+ console.warn(`[web] searchKeyless failed:\n${errors.join("\n")}`);
157
+ }
158
+ return { results: [], errors };
159
+ }
160
+ async function braveSearchHtml(query, signal) {
161
+ const url = new URL("https://search.brave.com/search");
162
+ url.searchParams.set("q", query);
163
+ url.searchParams.set("source", "web");
164
+ const response = await fetch(url.toString(), {
165
+ redirect: "follow",
166
+ signal,
167
+ headers: browserHeaders(),
168
+ });
169
+ if (!response.ok) {
170
+ throw new Error(`Brave search failed with status ${response.status}`);
171
+ }
172
+ const html = await response.text();
173
+ const dom = new JSDOM(html, { url: url.toString() });
174
+ const document = dom.window.document;
175
+ const anchors = Array.from(document.querySelectorAll([
176
+ "a[data-testid='result-title-a']",
177
+ ".snippet.fdb a",
178
+ ".result h2 a",
179
+ "a.heading-serpresult",
180
+ ].join(", ")));
181
+ const results = [];
182
+ const seen = new Set();
183
+ for (const anchor of anchors) {
184
+ const href = anchor.href?.trim();
185
+ const title = anchor.textContent?.replace(/\s+/g, " ").trim() ?? "";
186
+ if (!href || !title)
187
+ continue;
188
+ if (!/^https?:\/\//i.test(href))
189
+ continue;
190
+ if (href.includes("search.brave.com"))
191
+ continue;
192
+ if (seen.has(href))
193
+ continue;
194
+ const container = anchor.closest("[data-type='web']") ??
195
+ anchor.closest(".snippet") ??
196
+ anchor.closest(".fdb") ??
197
+ anchor.parentElement;
198
+ const snippet = extractSnippet(container?.textContent ?? "", title);
199
+ seen.add(href);
200
+ results.push({
201
+ title,
202
+ url: href,
203
+ snippet,
204
+ source: "brave",
205
+ });
206
+ if (results.length >= MAX_SEARCH_RESULTS)
207
+ break;
208
+ }
209
+ return results;
210
+ }
211
+ async function duckDuckGoHtmlSearch(query, signal) {
212
+ const url = new URL("https://html.duckduckgo.com/html/");
213
+ url.searchParams.set("q", query);
214
+ const response = await fetch(url.toString(), {
215
+ method: "GET",
216
+ redirect: "follow",
217
+ signal,
218
+ headers: browserHeaders(),
219
+ });
220
+ if (!response.ok) {
221
+ throw new Error(`DuckDuckGo search failed with status ${response.status}`);
222
+ }
223
+ const html = await response.text();
224
+ const dom = new JSDOM(html, { url: url.toString() });
225
+ const document = dom.window.document;
226
+ const results = [];
227
+ const seen = new Set();
228
+ const items = Array.from(document.querySelectorAll(".result"));
229
+ for (const item of items) {
230
+ const titleAnchor = item.querySelector(".result__title a, a.result__a");
231
+ if (!titleAnchor)
232
+ continue;
233
+ const href = titleAnchor.href?.trim();
234
+ const title = titleAnchor.textContent?.replace(/\s+/g, " ").trim() ?? "";
235
+ if (!href || !title)
236
+ continue;
237
+ if (!/^https?:\/\//i.test(href))
238
+ continue;
239
+ if (seen.has(href))
240
+ continue;
241
+ const snippetNode = item.querySelector(".result__snippet") ??
242
+ item.querySelector(".result__body") ??
243
+ item.querySelector(".result__extras");
244
+ const snippet = extractSnippet(snippetNode?.textContent ?? "", title);
245
+ seen.add(href);
246
+ results.push({
247
+ title,
248
+ url: href,
249
+ snippet,
250
+ source: "duckduckgo",
251
+ });
252
+ if (results.length >= MAX_SEARCH_RESULTS)
253
+ break;
254
+ }
255
+ return results;
256
+ }
257
+ // ---------------------------------------------------------------------------
258
+ // Fetch
259
+ // ---------------------------------------------------------------------------
260
+ async function runWebFetch(params, ctx, signal) {
261
+ validateFetchUrl(params.url);
262
+ const format = params.format ?? "markdown";
263
+ const html = await fetchHtml(params.url, signal);
264
+ let content;
265
+ let title;
266
+ let ext;
267
+ if (format === "html") {
268
+ content = html;
269
+ title = extractTitle(html, params.url);
270
+ ext = ".html";
271
+ }
272
+ else if (format === "text") {
273
+ const result = htmlToMarkdown(html, params.url);
274
+ title = result.title;
275
+ content = stripMarkdownFormatting(result.markdown);
276
+ ext = ".txt";
277
+ }
278
+ else {
279
+ const result = htmlToMarkdown(html, params.url);
280
+ title = result.title;
281
+ content = result.markdown;
282
+ ext = ".md";
283
+ }
284
+ if (content.length > MAX_MARKDOWN_CHARS) {
285
+ content = trimLargeDocument(content, MAX_MARKDOWN_CHARS);
286
+ }
287
+ const sessionDir = ctx.sessionManager.getSessionDir();
288
+ const filePath = await writeTempFile(sessionDir, params.url, content, ext);
289
+ const preview = content.slice(0, PREVIEW_CHARS).trim();
290
+ let warning;
291
+ if (content.length === 0) {
292
+ warning = "Warning: no readable content was extracted from this page.";
293
+ }
294
+ else if (content.length < 100) {
295
+ warning = "Warning: very little content was extracted from this page.";
296
+ }
297
+ const text = [
298
+ warning,
299
+ `File: ${filePath}`,
300
+ title ? `Title: ${title}` : undefined,
301
+ `Content length: ${content.length} chars`,
302
+ "",
303
+ "Preview:",
304
+ preview,
305
+ ]
306
+ .filter((line) => line != null)
307
+ .join("\n");
308
+ const truncated = truncateHead(text, {
309
+ maxLines: DEFAULT_MAX_LINES,
310
+ maxBytes: DEFAULT_MAX_BYTES,
311
+ }).content;
312
+ return {
313
+ content: [{ type: "text", text: truncated }],
314
+ details: {
315
+ url: params.url,
316
+ title,
317
+ filePath,
318
+ contentLength: content.length,
319
+ format,
320
+ },
321
+ };
322
+ }
323
+ async function fetchHtml(url, signal) {
324
+ // Tier 1: direct fetch
325
+ try {
326
+ const response = await fetch(url, {
327
+ redirect: "follow",
328
+ signal,
329
+ headers: browserHeaders(),
330
+ });
331
+ if (response.ok) {
332
+ const contentType = (response.headers.get("content-type") ?? "").toLowerCase();
333
+ if (!contentType || ALLOWED_CONTENT_TYPES.some((t) => contentType.includes(t))) {
334
+ const contentLength = Number(response.headers.get("content-length") || "0");
335
+ if (contentLength <= MAX_FETCH_BYTES) {
336
+ const text = await response.text();
337
+ if (text.length <= MAX_FETCH_BYTES && text.length >= 100) {
338
+ return text;
339
+ }
340
+ }
341
+ }
342
+ }
343
+ }
344
+ catch {
345
+ // Fall through to jina.ai
346
+ }
347
+ // Tier 2: jina.ai summarizer/extractor
348
+ try {
349
+ const jinaUrl = `https://r.jina.ai/http://${url.replace(/^https?:\/\//, "")}`;
350
+ const jinaResponse = await fetch(jinaUrl, {
351
+ redirect: "follow",
352
+ signal,
353
+ headers: browserHeaders(),
354
+ });
355
+ if (jinaResponse.ok) {
356
+ const text = await jinaResponse.text();
357
+ if (text.length <= MAX_FETCH_BYTES && text.length >= 100) {
358
+ return text;
359
+ }
360
+ }
361
+ }
362
+ catch {
363
+ // Fall through to curl
364
+ }
365
+ // Tier 3: curl subprocess (last effort)
366
+ const curlText = await fetchWithCurl(url, signal);
367
+ if (curlText.length >= 100) {
368
+ return curlText;
369
+ }
370
+ throw new Error(`Failed to fetch URL (direct + jina.ai + curl all failed). URL: ${url}`);
371
+ }
372
+ function fetchWithCurl(url, signal) {
373
+ return new Promise((resolve, reject) => {
374
+ const child = execFile("curl", ["-sL", "--max-time", "30", "-A", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36", url], { maxBuffer: MAX_FETCH_BYTES }, (error, stdout, stderr) => {
375
+ if (error) {
376
+ reject(error);
377
+ return;
378
+ }
379
+ resolve(stdout);
380
+ });
381
+ if (signal) {
382
+ signal.addEventListener("abort", () => {
383
+ child.kill("SIGTERM");
384
+ reject(new Error("Aborted"));
385
+ });
386
+ }
387
+ });
388
+ }
389
+ // ---------------------------------------------------------------------------
390
+ // Utilities (exported for testing)
391
+ // ---------------------------------------------------------------------------
392
+ export function extractSnippet(raw, title) {
393
+ let text = raw.replace(/\s+/g, " ").trim();
394
+ if (!text || text === title)
395
+ return "";
396
+ if (text.startsWith(title))
397
+ text = text.slice(title.length).trim();
398
+ if (!text)
399
+ return "";
400
+ return text.slice(0, MAX_SEARCH_SNIPPET_CHARS);
401
+ }
402
+ export function validateFetchUrl(url) {
403
+ let parsed;
404
+ try {
405
+ parsed = new URL(url);
406
+ }
407
+ catch {
408
+ throw new Error(`Invalid URL: ${url}`);
409
+ }
410
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
411
+ throw new Error(`Unsupported URL scheme "${parsed.protocol}" — only http: and https: are allowed`);
412
+ }
413
+ const hostname = parsed.hostname;
414
+ if (hostname === "localhost" ||
415
+ hostname === "127.0.0.1" ||
416
+ hostname === "0.0.0.0" ||
417
+ hostname === "[::1]" ||
418
+ hostname.startsWith("169.254.") ||
419
+ hostname.startsWith("10.") ||
420
+ hostname.startsWith("192.168.") ||
421
+ /^172\.(1[6-9]|2\d|3[01])\./.test(hostname) ||
422
+ hostname.endsWith(".local") ||
423
+ hostname.endsWith(".internal")) {
424
+ throw new Error(`Blocked: "${hostname}" looks like a private or internal address`);
425
+ }
426
+ }
427
+ export function htmlToMarkdown(html, baseUrl) {
428
+ const dom = new JSDOM(html, { url: baseUrl });
429
+ const document = dom.window.document;
430
+ for (const selector of [
431
+ "script",
432
+ "style",
433
+ "noscript",
434
+ "iframe",
435
+ "svg",
436
+ "canvas",
437
+ "form",
438
+ "nav",
439
+ "aside",
440
+ "footer",
441
+ "header",
442
+ ]) {
443
+ document.querySelectorAll(selector).forEach((el) => el.remove());
444
+ }
445
+ const main = document.querySelector("main") ??
446
+ document.querySelector("article") ??
447
+ document.querySelector("[role='main']") ??
448
+ document.body;
449
+ const turndown = new TurndownService({
450
+ headingStyle: "atx",
451
+ codeBlockStyle: "fenced",
452
+ bulletListMarker: "-",
453
+ });
454
+ turndown.remove(["script", "style", "noscript", "iframe", "canvas"]);
455
+ const title = (document.title || "").trim();
456
+ const markdown = turndown.turndown(main?.innerHTML || "");
457
+ return {
458
+ title,
459
+ markdown: markdown.replace(/\n{3,}/g, "\n\n").trim(),
460
+ };
461
+ }
462
+ export function trimLargeDocument(markdown, maxChars) {
463
+ if (markdown.length <= maxChars)
464
+ return markdown;
465
+ const marker = "\n\n[...content trimmed...]\n\n";
466
+ const budget = maxChars - marker.length;
467
+ const headSize = Math.floor(budget * 0.75);
468
+ const tailSize = budget - headSize;
469
+ const head = markdown.slice(0, headSize).trimEnd();
470
+ const tail = markdown.slice(-tailSize).trimStart();
471
+ return `${head}${marker}${tail}`.slice(0, maxChars);
472
+ }
473
+ function extractTitle(html, _baseUrl) {
474
+ const match = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
475
+ return match ? match[1].replace(/\s+/g, " ").trim() : "";
476
+ }
477
+ export function stripMarkdownFormatting(markdown) {
478
+ return markdown
479
+ .replace(/^#{1,6}\s+/gm, "") // headings
480
+ .replace(/```[\s\S]*?```/g, (m) => m.replace(/```\w*\n?/g, "").trim()) // fenced code blocks
481
+ .replace(/\*\*([^*]+)\*\*/g, "$1") // bold
482
+ .replace(/\*([^*]+)\*/g, "$1") // italic
483
+ .replace(/`([^`]+)`/g, "$1") // inline code
484
+ .replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1") // images
485
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // links
486
+ .replace(/^\d+\.\s+/gm, "") // numbered lists
487
+ .replace(/^[-*+]\s+/gm, "") // unordered list markers
488
+ .replace(/^>\s+/gm, "") // blockquotes
489
+ .replace(/^---+$/gm, "") // horizontal rules
490
+ .replace(/^\|.*\|$/gm, (row) => /^[\s|:-]+$/.test(row)
491
+ ? ""
492
+ : row
493
+ .replace(/^\||\|$/g, "")
494
+ .replace(/\|/g, " — ")
495
+ .trim()) // tables
496
+ .replace(/&amp;/g, "&")
497
+ .replace(/&lt;/g, "<")
498
+ .replace(/&gt;/g, ">")
499
+ .replace(/&quot;/g, '"')
500
+ .replace(/&#39;/g, "'")
501
+ .replace(/\n{3,}/g, "\n\n")
502
+ .trim();
503
+ }
504
+ export function urlToHash(url) {
505
+ return createHash("sha256").update(url).digest("hex").slice(0, 12);
506
+ }
507
+ async function writeTempFile(sessionDir, url, content, ext) {
508
+ const dir = join(sessionDir, "tmp");
509
+ await mkdir(dir, { recursive: true });
510
+ const hash = urlToHash(url);
511
+ const filePath = join(dir, `fetch-${hash}${ext}`);
512
+ await writeFile(filePath, content, "utf-8");
513
+ return filePath;
514
+ }
515
+ export function looksLikeUrlPrompt(prompt) {
516
+ if (!prompt)
517
+ return false;
518
+ return /(https?:\/\/\S+|www\.\S+)/i.test(prompt);
519
+ }
520
+ export function looksLikeWebSearchPrompt(prompt) {
521
+ if (!prompt)
522
+ return false;
523
+ const text = prompt.toLowerCase();
524
+ const patterns = [
525
+ /\b(search the web|look online|find online|search online|web search)\b/,
526
+ /\b(official documentation|official docs|api docs|api reference)\b/,
527
+ /\b(latest version|latest release|release notes|what's new)\b/,
528
+ /\b(current price|current status|today's|yesterday's|this week's)\b/,
529
+ /\bnews about\b/,
530
+ /\bwhat changed in\b/,
531
+ /\bup to date\b/,
532
+ /\bon the web\b/,
533
+ /\bgoogle\s+(for|how|what|why|when)\b/,
534
+ /\b(find|look up|check)\s+.{0,20}\b(online|on the web|on the internet)\b/,
535
+ ];
536
+ return patterns.some((re) => re.test(text));
537
+ }
538
+ function browserHeaders() {
539
+ return {
540
+ "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
541
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
542
+ "Accept-Language": "en-US,en;q=0.9",
543
+ };
544
+ }
545
+ //# sourceMappingURL=web-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-tool.js","sourceRoot":"","sources":["../src/web-tool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "pi-agent-flow",
3
- "version": "1.8.1",
3
+ "version": "1.8.3",
4
4
  "description": "Flow-state delegation extension for Pi coding agent.",
5
5
  "type": "module",
6
- "main": "src/index.ts",
6
+ "main": "dist/index.js",
7
7
  "files": [
8
- "src/",
8
+ "dist/",
9
9
  "agents/",
10
10
  "README.md"
11
11
  ],
12
12
  "pi": {
13
13
  "extensions": [
14
- "./src/index.ts"
14
+ "./dist/index.js"
15
15
  ]
16
16
  },
17
17
  "keywords": [
@@ -29,8 +29,10 @@
29
29
  "node": ">=20.19.0"
30
30
  },
31
31
  "scripts": {
32
+ "build": "tsc",
32
33
  "lint": "tsc --noEmit",
33
- "test": "vitest run"
34
+ "test": "vitest run",
35
+ "prepublishOnly": "npm run build"
34
36
  },
35
37
  "devDependencies": {
36
38
  "typescript": "^5.0.0",