amenbo 0.1.5 → 0.3.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 (56) hide show
  1. package/README.en.md +11 -1
  2. package/README.md +11 -1
  3. package/dist/cache.d.ts +48 -2
  4. package/dist/cache.js +164 -53
  5. package/dist/cache.js.map +1 -1
  6. package/dist/cli.d.ts +3 -1
  7. package/dist/cli.js +59 -4
  8. package/dist/cli.js.map +1 -1
  9. package/dist/core.d.ts +6 -0
  10. package/dist/core.js +134 -44
  11. package/dist/core.js.map +1 -1
  12. package/dist/diff.d.ts +1 -1
  13. package/dist/diff.js +29 -9
  14. package/dist/diff.js.map +1 -1
  15. package/dist/errors.d.ts +11 -0
  16. package/dist/errors.js +13 -0
  17. package/dist/errors.js.map +1 -1
  18. package/dist/extract/dataSources.js +17 -4
  19. package/dist/extract/dataSources.js.map +1 -1
  20. package/dist/extract/markdown.d.ts +44 -0
  21. package/dist/extract/markdown.js +181 -2
  22. package/dist/extract/markdown.js.map +1 -1
  23. package/dist/extract/outline.d.ts +18 -0
  24. package/dist/extract/outline.js +37 -4
  25. package/dist/extract/outline.js.map +1 -1
  26. package/dist/extract/pdf.js +2 -2
  27. package/dist/extract/pruning.d.ts +4 -2
  28. package/dist/extract/pruning.js +36 -7
  29. package/dist/extract/pruning.js.map +1 -1
  30. package/dist/extract/qualityScore.d.ts +3 -2
  31. package/dist/extract/qualityScore.js +8 -3
  32. package/dist/extract/qualityScore.js.map +1 -1
  33. package/dist/fetcher/browser.js +15 -1
  34. package/dist/fetcher/browser.js.map +1 -1
  35. package/dist/fetcher/http.d.ts +11 -1
  36. package/dist/fetcher/http.js +6 -1
  37. package/dist/fetcher/http.js.map +1 -1
  38. package/dist/fetcher/index.d.ts +6 -0
  39. package/dist/fetcher/index.js +18 -13
  40. package/dist/fetcher/index.js.map +1 -1
  41. package/dist/installBrowser.d.ts +11 -0
  42. package/dist/installBrowser.js +30 -0
  43. package/dist/installBrowser.js.map +1 -0
  44. package/dist/links.d.ts +12 -0
  45. package/dist/links.js +32 -17
  46. package/dist/links.js.map +1 -1
  47. package/dist/politeness.d.ts +23 -3
  48. package/dist/politeness.js +27 -6
  49. package/dist/politeness.js.map +1 -1
  50. package/dist/screenshot.d.ts +2 -0
  51. package/dist/screenshot.js +14 -4
  52. package/dist/screenshot.js.map +1 -1
  53. package/dist/server.d.ts +2 -0
  54. package/dist/server.js +55 -26
  55. package/dist/server.js.map +1 -1
  56. package/package.json +3 -6
package/dist/cli.js CHANGED
@@ -8,6 +8,8 @@
8
8
  * - `amenbo fetch/links/screenshot <url> [options]` は対応するcore.tsのハンドラを呼び、
9
9
  * TextBlockはそのまま標準出力へ、ImageBlock(スクリーンショット/スキャンPDF画像)は
10
10
  * --out-dir配下へファイル保存しパスを列挙する(エージェント/ユーザーがそのまま開けるように)。
11
+ * - `amenbo install-browser` はChromium遅延化(postinstall廃止)対応で追加したコマンド。
12
+ * core.tsは経由せず、installBrowser.tsが同梱playwrightのCLIをspawnする。
11
13
  * - 引数パース(parseCliArgs)は純関数として切り出し、ユニットテストできるようにしている。
12
14
  * - キャッシュ・差分応答・レート制御の状態はMCPサーバーと同じ ~/.cache/amenbo (cache.ts)を
13
15
  * 共有する。CLIは1コマンド=1プロセスのため、politenessのドメイン毎レート制御は
@@ -17,10 +19,13 @@ import { mkdirSync, realpathSync, writeFileSync } from "node:fs";
17
19
  import { join } from "node:path";
18
20
  import { parseArgs } from "node:util";
19
21
  import { fileURLToPath } from "node:url";
22
+ import { resolveCacheDir } from "./cache.js";
20
23
  import { cache, formatLinksResponse, handleFetchTool, handleScreenshotTool, politeness, resolvePackageVersion, } from "./core.js";
21
24
  import { AmenboError } from "./errors.js";
22
25
  import { closeBrowser } from "./fetcher/browser.js";
26
+ import { installBrowser } from "./installBrowser.js";
23
27
  import { discoverLinks } from "./links.js";
28
+ import { MAX_SCALE, MIN_SCALE } from "./screenshot.js";
24
29
  import { runServer } from "./server.js";
25
30
  // ---- 引数パース(純関数。ユニットテスト対象) ----
26
31
  /** 引数の使い方が不正な場合に投げる(cli.ts側でusageを表示しexit code 2にする)。 */
@@ -41,6 +46,18 @@ function parsePositiveFloat(raw, flag) {
41
46
  }
42
47
  return n;
43
48
  }
49
+ /**
50
+ * レビュー指摘対応(Low): --scaleはparsePositiveFloatを通すだけで[0.5,1.0]範囲を検証しておらず、
51
+ * `--scale 3.0`のような範囲外値がscreenshot.ts clampScaleで黙って1.0にクランプされていた。
52
+ * MCP側はzod .min(0.5).max(1.0)で明示的にエラーになるため、CLIも同じ強度の検証で揃える。
53
+ */
54
+ function parseScreenshotScale(raw) {
55
+ const n = parsePositiveFloat(raw, "--scale");
56
+ if (n < MIN_SCALE || n > MAX_SCALE) {
57
+ throw new CliUsageError(`--scaleは${MIN_SCALE}〜${MAX_SCALE}の範囲で指定してください: ${raw}`);
58
+ }
59
+ return n;
60
+ }
44
61
  function requireUrl(positionals, command) {
45
62
  const url = positionals[0];
46
63
  if (!url) {
@@ -122,10 +139,19 @@ function parseScreenshotArgs(args) {
122
139
  url,
123
140
  ...(values["viewport-only"] ? { viewportOnly: true } : {}),
124
141
  ...(values.width !== undefined ? { width: parsePositiveInt(values.width, "--width") } : {}),
125
- ...(values.scale !== undefined ? { scale: parsePositiveFloat(values.scale, "--scale") } : {}),
142
+ ...(values.scale !== undefined ? { scale: parseScreenshotScale(values.scale) } : {}),
126
143
  ...(values["out-dir"] !== undefined ? { outDir: values["out-dir"] } : {}),
127
144
  };
128
145
  }
146
+ function parseInstallBrowserArgs(args) {
147
+ const { values, positionals } = safeParseArgs(args, "install-browser", { help: { type: "boolean", short: "h" } });
148
+ if (values.help)
149
+ return { kind: "help", topic: "install-browser" };
150
+ if (positionals.length > 0) {
151
+ throw new CliUsageError(`install-browser: 不明な引数です: ${positionals[0]}`);
152
+ }
153
+ return { kind: "install-browser" };
154
+ }
129
155
  /** CLI引数(process.argv.slice(2)相当)をコマンドへパースする純関数。 */
130
156
  export function parseCliArgs(argv) {
131
157
  if (argv.length === 0)
@@ -143,6 +169,8 @@ export function parseCliArgs(argv) {
143
169
  return parseLinksArgs(rest);
144
170
  if (first === "screenshot")
145
171
  return parseScreenshotArgs(rest);
172
+ if (first === "install-browser")
173
+ return parseInstallBrowserArgs(rest);
146
174
  throw new CliUsageError(`不明なコマンドです: ${first}`);
147
175
  }
148
176
  // ---- ヘルプ/usage文言 ----
@@ -155,6 +183,7 @@ function usageText() {
155
183
  " fetch <url> [options] ページをMarkdownとして取得する",
156
184
  " links <url> [options] ページ内のリンクを列挙する(sitemap/RSS優先)",
157
185
  " screenshot <url> [options] ページのスクリーンショットを撮影する",
186
+ " install-browser スクリーンショット/SPA取得に必要なChromiumをインストールする(初回のみ)",
158
187
  "",
159
188
  "Options:",
160
189
  " -h, --help ヘルプを表示する",
@@ -174,7 +203,7 @@ function fetchHelpText() {
174
203
  " --page <n> ページ番号(既定 1)",
175
204
  " --max-tokens <n> 1ページの概算トークン上限(既定 8000)",
176
205
  " --force-full 差分応答(unchanged/diff)と定型ブロック除去を無効化し常に全文を返す",
177
- " --out-dir <dir> screenshot切替時の画像保存先(既定 カレントディレクトリ)",
206
+ " --out-dir <dir> screenshot切替時の画像保存先(既定 $AMENBO_CACHE_DIR/screenshots-cli/、未設定時は ~/.cache/amenbo/screenshots-cli/)",
178
207
  ].join("\n");
179
208
  }
180
209
  function linksHelpText() {
@@ -187,10 +216,20 @@ function screenshotHelpText() {
187
216
  "Options:",
188
217
  " --viewport-only 最初のビューポート分のみ撮影する(既定はfullPage)",
189
218
  " --width <n> タイル幅px(既定 1280)",
190
- " --scale <x> 解像度スケール(既定 1.0)。小さいほど画像トークンが減る",
219
+ " --scale <x> 解像度スケール(0.5〜1.0、既定 1.0)。小さいほど画像トークンが減る",
191
220
  " --out-dir <dir> 画像保存先(既定 カレントディレクトリ)",
192
221
  ].join("\n");
193
222
  }
223
+ function installBrowserHelpText() {
224
+ return [
225
+ "amenbo install-browser",
226
+ "",
227
+ "スクリーンショット撮影やSPA(JavaScriptレンダリング必須)ページの取得に必要なChromiumを",
228
+ "インストールする(初回のみ、約170MBのダウンロード)。通常のHTTP取得(fetch/linksの大半)は",
229
+ "この操作なしで動作する。amenboに同梱されたバージョンのplaywright CLIを使うため、",
230
+ "バージョン不一致は起こらない。",
231
+ ].join("\n");
232
+ }
194
233
  function helpText(topic) {
195
234
  if (topic === "fetch")
196
235
  return fetchHelpText();
@@ -198,9 +237,22 @@ function helpText(topic) {
198
237
  return linksHelpText();
199
238
  if (topic === "screenshot")
200
239
  return screenshotHelpText();
240
+ if (topic === "install-browser")
241
+ return installBrowserHelpText();
201
242
  return usageText();
202
243
  }
203
244
  // ---- 出力(TextBlockはstdout、ImageBlockはファイル保存) ----
245
+ /**
246
+ * レビュー指摘対応(Medium・ユーザー確定仕様): `amenbo fetch`(mode auto)が品質低下でscreenshotへ
247
+ * 自動切替した場合の画像既定保存先。以前はoutDir未指定時にprocess.cwd()を使っており、
248
+ * リポジトリ直下等カレントディレクトリを黙って汚していた。cache.tsのキャッシュディレクトリ
249
+ * 解決ロジック(AMENBO_CACHE_DIR ?? ~/.cache/amenbo)を再利用し、その配下のscreenshots-cli/へ
250
+ * 保存する(実撮影キャッシュのscreenshots/とは別ディレクトリ)。screenshotサブコマンドは
251
+ * 明示的な視覚確認用途のため対象外(--out-dir未指定時は従来通りcwd)。
252
+ */
253
+ function resolveFetchScreenshotDir() {
254
+ return join(resolveCacheDir(), "screenshots-cli");
255
+ }
204
256
  /** ファイル名として安全なホスト名(取れなければ"page")。amenbo-<hostname>-<連番>.pngの命名に使う。 */
205
257
  function hostnameForFilename(url) {
206
258
  try {
@@ -246,7 +298,7 @@ async function dispatch(command) {
246
298
  ...(command.forceFull !== undefined ? { force_full: command.forceFull } : {}),
247
299
  };
248
300
  const blocks = await handleFetchTool(input);
249
- writeBlocks(blocks, command.url, command.outDir ?? process.cwd());
301
+ writeBlocks(blocks, command.url, command.outDir ?? resolveFetchScreenshotDir());
250
302
  return;
251
303
  }
252
304
  if (command.kind === "links") {
@@ -291,6 +343,9 @@ export async function run(argv) {
291
343
  return 0;
292
344
  }
293
345
  try {
346
+ if (command.kind === "install-browser") {
347
+ return await installBrowser();
348
+ }
294
349
  await dispatch(command);
295
350
  return 0;
296
351
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -8,6 +8,8 @@ export declare function resolvePackageVersion(): string;
8
8
  export declare function resolveCacheTtlMs(): number | undefined;
9
9
  export declare const cache: PageCache;
10
10
  export declare const politeness: PolitenessManager;
11
+ /** サーバー常駐プロセス向けの終了処理(exit/SIGINT/SIGTERM)を登録する。多重登録は行わない(冪等)。 */
12
+ export declare function registerCoreShutdownHandlers(): void;
11
13
  interface ScreenshotTileData {
12
14
  data: Buffer;
13
15
  }
@@ -66,6 +68,8 @@ export interface FetchToolInput {
66
68
  page?: number | undefined;
67
69
  max_tokens?: number | undefined;
68
70
  force_full?: boolean | undefined;
71
+ /** MCP progress notifications用(server.tsがprogressToken有無に応じて組み立てて渡す。CLIは渡さない)。 */
72
+ onProgress?: ((message: string) => void) | undefined;
69
73
  }
70
74
  export declare function handleFetchTool(input: FetchToolInput): Promise<Array<TextBlock | ImageBlock>>;
71
75
  export interface ScreenshotToolInput {
@@ -73,6 +77,8 @@ export interface ScreenshotToolInput {
73
77
  fullPage?: boolean | undefined;
74
78
  width?: number | undefined;
75
79
  scale?: number | undefined;
80
+ /** MCP progress notifications用(server.tsがprogressToken有無に応じて組み立てて渡す)。 */
81
+ onProgress?: ((message: string) => void) | undefined;
76
82
  }
77
83
  export declare function handleScreenshotTool(input: ScreenshotToolInput): Promise<Array<TextBlock | ImageBlock>>;
78
84
  export {};
package/dist/core.js CHANGED
@@ -15,7 +15,7 @@ import { diffMarkdown } from "./diff.js";
15
15
  import { AmenboError, SectionNotFoundError } from "./errors.js";
16
16
  import { detectDataSources } from "./extract/dataSources.js";
17
17
  import { extractMarkdown } from "./extract/markdown.js";
18
- import { buildOutline, extractSection } from "./extract/outline.js";
18
+ import { buildOutline, findSection, formatBreadcrumb } from "./extract/outline.js";
19
19
  import { DEFAULT_PDF_MAX_BYTES, extractPdfText, looksLikePdf, markdownFromPdfText, renderPdfPages } from "./extract/pdf.js";
20
20
  import { buildHandoffPreview } from "./extract/preview.js";
21
21
  import { evaluateQuality } from "./extract/qualityScore.js";
@@ -57,29 +57,50 @@ export const cache = new PageCache(cacheTtlMs !== undefined ? { ttlMs: cacheTtlM
57
57
  // code-reviewer指摘: MCPサーバー単体運用時(CLIを使わない場合)でも、このstore注入により
58
58
  // waitTurn毎にSQLite I/O(host_requestsの読み取り+書き込み)が発生する。CLIとの
59
59
  // プロセス間共有が不要な単一プロセス運用ではインメモリのlastRequestAtだけで十分だったところに、
60
- // 常時わずかなディスクI/Oコストを払うトレードオフになる(better-sqlite3は同期I/Oで
60
+ // 常時わずかなディスクI/Oコストを払うトレードオフになる(node:sqliteも同期I/Oで
61
61
  // 小さな1行read/writeのため実測上は無視できるレベルだが、"低負荷優先"の設計原則上は
62
62
  // 意図的なトレードオフとして明記しておく)。
63
+ // レビュー指摘対応: robots.txtの取得結果もcache.ts(robots_cacheテーブル)へ永続化し、
64
+ // プロセス間で共有する(CLIバルク収集時にコマンド毎にrobots.txtを再取得する低負荷原則違反への対応)。
63
65
  export const politeness = new PolitenessManager({
64
66
  store: {
65
67
  getLastRequestAt: (host) => cache.getHostLastRequestAt(host),
66
68
  setLastRequestAt: (host, at) => cache.setHostLastRequestAt(host, at),
67
69
  },
70
+ robotsStore: {
71
+ get: (origin) => cache.getRobotsCache(origin),
72
+ set: (origin, body, fetchedAt) => cache.setRobotsCache(origin, body, fetchedAt),
73
+ },
68
74
  });
69
75
  // M2: cache.close()は同期処理なので'exit'イベント(非同期処理を待てない)内でも安全に呼べる。
70
76
  // 一方でSIGINT/SIGTERMはブラウザのクリーンアップ(非同期)を待ってから明示的にprocess.exit()する
71
77
  // 必要がある(fetcher/browser.tsのregisterCleanupHandlersと同様の理由。あちらは
72
78
  // getBrowser()が一度も呼ばれない=chromium未起動のセッションではリスナー登録自体が行われない
73
79
  // ため、ここでサーバー起点の終了処理として独立して登録しておく)。
74
- process.once("exit", () => {
75
- cache.close();
76
- });
77
- process.once("SIGINT", () => {
78
- void closeBrowser().finally(() => process.exit(0));
79
- });
80
- process.once("SIGTERM", () => {
81
- void closeBrowser().finally(() => process.exit(0));
82
- });
80
+ //
81
+ // レビュー指摘対応(Medium): 以前はこの登録をモジュールトップレベルで即時実行していたため、
82
+ // core.tsをimportするだけの全テスト(vitestワーカープロセス)にもSIGINT/SIGTERMハンドラ
83
+ // (closeBrowser().finally(() => process.exit(0)))が仕込まれてしまい、テスト中断時にvitestの
84
+ // クリーンアップより先にprocess.exit(0)を呼びうる副作用があった。登録処理を関数へ切り出し、
85
+ // MCPサーバー起動経路(server.ts runServer())からのみ呼ぶことで、importするだけでは
86
+ // ホストプロセスに影響しないようにする。CLI(cli.ts)はrun()のfinallyでclosBrowser/cache.close済み
87
+ // のため、この登録は不要(サーバー常駐プロセスのみが対象)。
88
+ let coreShutdownHandlersRegistered = false;
89
+ /** サーバー常駐プロセス向けの終了処理(exit/SIGINT/SIGTERM)を登録する。多重登録は行わない(冪等)。 */
90
+ export function registerCoreShutdownHandlers() {
91
+ if (coreShutdownHandlersRegistered)
92
+ return;
93
+ coreShutdownHandlersRegistered = true;
94
+ process.once("exit", () => {
95
+ cache.close();
96
+ });
97
+ process.once("SIGINT", () => {
98
+ void closeBrowser().finally(() => process.exit(0));
99
+ });
100
+ process.once("SIGTERM", () => {
101
+ void closeBrowser().finally(() => process.exit(0));
102
+ });
103
+ }
83
104
  const DEFAULT_MAX_TOKENS = 8000;
84
105
  const DEFAULT_PAGE = 1;
85
106
  const DEFAULT_SCREENSHOT_SCALE = 1.0;
@@ -100,8 +121,12 @@ class UnexpectedNotModifiedError extends AmenboError {
100
121
  }
101
122
  }
102
123
  /** URLとselectorの組から、新規取得・変換したMarkdownと品質スコア/pruning/アダプタ/ジオメトリ結果を作る。 */
103
- async function fetchAndExtract(url, selector, conditionalHeaders) {
104
- const fetchResult = await fetchPage(url, conditionalHeaders ? { headers: conditionalHeaders } : {});
124
+ async function fetchAndExtract(url, selector, conditionalHeaders, onProgress) {
125
+ // レビュー指摘対応: リダイレクトで別オリジンへ着地した場合、その着地先のrobots.txtも
126
+ // 確認する(guardedFetch内で着地先オリジンが変わった場合のみ呼ばれる。同一オリジン内
127
+ // リダイレクトや初回URLは呼び出し元のpoliteness.guardで確認済みのため二重チェックしない)。
128
+ const checkRobots = (targetUrl) => politeness.checkRobotsAllowed(targetUrl);
129
+ const fetchResult = await fetchPage(url, conditionalHeaders ? { headers: conditionalHeaders, onProgress, checkRobots } : { onProgress, checkRobots });
105
130
  if ("notModified" in fetchResult) {
106
131
  return { status: "not_modified" };
107
132
  }
@@ -123,8 +148,8 @@ async function fetchAndExtract(url, selector, conditionalHeaders) {
123
148
  // ジオメトリでも改善しなかった場合はHTTP tierの結果(body-fallback)をそのまま使う。
124
149
  if (!selector && fetchResult.tier === "http" && extracted.extractionMethod === "body-fallback") {
125
150
  try {
126
- await politeness.waitTurn(url); // 追加のブラウザ遷移が発生するため、律速のため再度順番を待つ
127
- const browserFetchResult = await fetchPage(url, { forceBrowser: true });
151
+ await politeness.waitTurn(url, onProgress); // 追加のブラウザ遷移が発生するため、律速のため再度順番を待つ
152
+ const browserFetchResult = await fetchPage(url, { forceBrowser: true, onProgress, checkRobots });
128
153
  if (!("notModified" in browserFetchResult) && !("handoff" in browserFetchResult)) {
129
154
  const browserExtracted = extractMarkdown(browserFetchResult.html, { url: browserFetchResult.finalUrl, geometry: browserFetchResult.geometry });
130
155
  if (browserExtracted.extractionMethod === "geometry") {
@@ -182,10 +207,16 @@ function pageFromCacheEntry(url, cached, cacheStatus) {
182
207
  * (同一URLでも抽出結果がselector毎に変わるため)。品質スコア/アダプタ判定結果もキャッシュ
183
208
  * メタデータへ保存し、'fresh'なキャッシュ応答時にも再フェッチ無しでmode:autoの判定を再現する。
184
209
  * 機能B: 非HTMLコンテンツ(ハンドオフ対象)を取得した場合は { kind: "handoff" } を返す。
210
+ *
211
+ * レビュー指摘対応: politeness.guard(robots.txt確認+レート制御待機)は「実際にサイトへ
212
+ * 取得しに行く」直前でのみ呼ぶ。キャッシュfresh応答時は実ネットワークアクセスが発生しない
213
+ * ため、outline→sectionの推奨フロー等でキャッシュヒットするたびに待機・robots再判定という
214
+ * 自己ペナルティが発生していた不具合の修正。selector指定時は必ずfetchするため常にguardする。
185
215
  */
186
- async function resolvePage(url, selector) {
216
+ async function resolvePage(url, selector, onProgress) {
187
217
  if (selector) {
188
- const result = await fetchAndExtract(url, selector, undefined);
218
+ await politeness.guard(url, onProgress);
219
+ const result = await fetchAndExtract(url, selector, undefined, onProgress);
189
220
  if (result.status === "not_modified") {
190
221
  throw new UnexpectedNotModifiedError(url);
191
222
  }
@@ -211,12 +242,15 @@ async function resolvePage(url, selector) {
211
242
  if (cached && cache.isFresh(cached)) {
212
243
  return pageFromCacheEntry(url, cached, "fresh");
213
244
  }
245
+ // 条件付きGET(304)も含め実際にサーバーへ通信するため、ここでguardする
246
+ // (キャッシュfresh応答で早期returnした場合はguardしない=上のコメント参照)。
247
+ await politeness.guard(url, onProgress);
214
248
  const conditionalHeaders = {};
215
249
  if (cached?.etag)
216
250
  conditionalHeaders["If-None-Match"] = cached.etag;
217
251
  if (cached?.lastModified)
218
252
  conditionalHeaders["If-Modified-Since"] = cached.lastModified;
219
- const result = await fetchAndExtract(url, undefined, Object.keys(conditionalHeaders).length > 0 ? conditionalHeaders : undefined);
253
+ const result = await fetchAndExtract(url, undefined, Object.keys(conditionalHeaders).length > 0 ? conditionalHeaders : undefined, onProgress);
220
254
  if (result.status === "not_modified") {
221
255
  if (!cached)
222
256
  throw new UnexpectedNotModifiedError(url);
@@ -287,16 +321,13 @@ async function resolveScreenshot(url, options) {
287
321
  // このあとcaptureTiledScreenshot内のnavigateSafelyでも検証するが、それより前段で
288
322
  // クリーンな型付きエラーとして早期に弾く)。
289
323
  assertHttpScheme(url);
290
- // 実URLへの独立したブラウザ遷移が発生するため、markdown抽出時とは別にpolitenessの順番待ちを行う。
291
- // ただし呼び出し元(handleFetchTool)で既にguard済みの場合はskipGuardで二重待機を避ける。
292
- if (!options.skipGuard) {
293
- await politeness.guard(url);
294
- }
295
324
  const cacheKey = computeScreenshotCacheKey(url, options.width, options.scale, options.fullPage);
296
325
  const cached = cache.getScreenshot(cacheKey);
297
326
  if (cached && cache.isFresh(cached)) {
298
327
  const tiles = readCachedTiles(cached.tilePaths);
299
328
  if (tiles) {
329
+ // レビュー指摘対応(#4と同型): キャッシュ済みタイルを返すだけならサイトへ取得しに行かない
330
+ // ため、guard(robots確認+レート制御待機)を行わない。実撮影に進む場合のみ下でguardする。
300
331
  return {
301
332
  finalUrl: cached.url,
302
333
  tiles,
@@ -308,6 +339,10 @@ async function resolveScreenshot(url, options) {
308
339
  }
309
340
  // PNGファイル欠損: キャッシュmiss扱いで下の再撮影へフォールスルーする
310
341
  }
342
+ // レビュー指摘対応: 実URLへの独立したブラウザ遷移が発生する直前でguardする(markdown取得時の
343
+ // guardとは別枠。handleFetchTool冒頭の共通guardは撤去済み)。キャッシュfresh返却時は通らない。
344
+ await politeness.guard(url, options.onProgress);
345
+ options.onProgress?.("スクリーンショットを撮影しています…");
311
346
  const captured = await captureTiledScreenshot(url, options);
312
347
  cache.setScreenshot({
313
348
  cacheKey,
@@ -347,12 +382,14 @@ function budgetExceededLine(paginated) {
347
382
  export function dataSourcesSection(hints) {
348
383
  return hints.length > 0 ? `\n\ndata_sources:\n${hints.join("\n")}` : "";
349
384
  }
350
- function formatMarkdownResponse(page, paginated, sectionId, templateRemovedCount) {
385
+ function formatMarkdownResponse(page, paginated, sectionId, templateRemovedCount, breadcrumb = null) {
351
386
  const header = [
352
387
  `title: ${page.title ?? "(なし)"}`,
353
388
  `url: ${page.finalUrl}`,
354
389
  `mode_used: markdown`,
355
390
  ...(sectionId ? [`section: ${sectionId}`] : []),
391
+ // leaf節を単独取得したとき、この節が属する上位見出しの連なりを補い文脈喪失を防ぐ。
392
+ ...(breadcrumb ? [`section_path: ${breadcrumb}`] : []),
356
393
  `cache: ${page.cacheStatus}`,
357
394
  `tokens: ${paginated.tokens}`,
358
395
  `page: ${paginated.page} of ${paginated.totalPages}`,
@@ -437,7 +474,13 @@ export function buildScreenshotContent(page, screenshot, reason) {
437
474
  export function formatLinksResponse(url, result) {
438
475
  const header = [`url: ${url}`, `source: ${result.source}`, `count: ${result.links.length}${result.truncated ? " (truncated)" : ""}`].join("\n");
439
476
  const body = result.links.map((link) => (link.title ? `- ${link.title} — ${link.url}` : `- ${link.url}`)).join("\n");
440
- return `${header}\n\n${body || "(リンクが見つかりませんでした)"}`;
477
+ // レビュー指摘対応: 0件のとき、フィルタで全部落ちたのか(preFilterCount>0)、
478
+ // sitemap/RSS/ページ自体が空だったのか(preFilterCount===0)をエージェントが判別できるようにする。
479
+ // filter未指定時はpreFilterCount===links.lengthのためこの分岐には入らない。
480
+ const empty = result.preFilterCount > 0
481
+ ? `(リンクが見つかりませんでした。フィルタ前 ${result.preFilterCount} 件。filterに一致しませんでした)`
482
+ : "(リンクが見つかりませんでした)";
483
+ return `${header}\n\n${body || empty}`;
441
484
  }
442
485
  // ---- 機能B: 非HTMLコンテンツのハンドオフ応答 ----
443
486
  /**
@@ -507,17 +550,46 @@ function formatPdfTextResponse(title, finalUrl, cacheStatus, pdfPageCount, pagin
507
550
  ].join("\n");
508
551
  return `${header}\n\n${paginated.content}`;
509
552
  }
553
+ /** キャッシュ済みPDFエントリからテキスト応答を組み立てる(fresh応答/304再検証後の応答で共用)。 */
554
+ function formatPdfResponseFromCache(url, cached, maxTokens, page) {
555
+ const paginated = paginateMarkdown(cached.markdown, maxTokens, page);
556
+ const title = cached.metadata.title ?? null;
557
+ const finalUrl = cached.metadata.finalUrl ?? url;
558
+ const pdfPageCount = Number(cached.metadata.pdfPageCount ?? 0);
559
+ return formatPdfTextResponse(title, finalUrl, "fresh", pdfPageCount, paginated);
560
+ }
510
561
  /** PDFはキャッシュ層(§3-3等)を流用しつつ独立した経路で扱う。テキスト層があればMarkdown、無ければ画像タイル。 */
511
- async function handlePdfFetch(url, page, maxTokens) {
562
+ async function handlePdfFetch(url, page, maxTokens, onProgress) {
512
563
  const cached = cache.get(url);
513
564
  if (cached && cache.isFresh(cached)) {
514
- const paginated = paginateMarkdown(cached.markdown, maxTokens, page);
515
- const title = cached.metadata.title ?? null;
516
- const finalUrl = cached.metadata.finalUrl ?? url;
517
- const pdfPageCount = Number(cached.metadata.pdfPageCount ?? 0);
518
- return [{ type: "text", text: formatPdfTextResponse(title, finalUrl, "fresh", pdfPageCount, paginated) }];
565
+ return [{ type: "text", text: formatPdfResponseFromCache(url, cached, maxTokens, page) }];
566
+ }
567
+ // レビュー指摘対応: キャッシュfresh応答時は実ネットワークアクセスが発生しないため
568
+ // guardしない(resolvePageと同じ方針)。実際にPDFを取得しに行く直前でのみguardする。
569
+ await politeness.guard(url, onProgress);
570
+ // 低負荷原則対応: TTL失効後もキャッシュ(etag/last-modified)があれば条件付きGETで再検証する。
571
+ // HTML経路(resolvePage)は既にこの流儀で304時のフルDL+再パースを回避しているのに対し、
572
+ // PDF経路はTTL失効後は常にフルDL+全ページ再パースを行っており、20MB級の官公庁PDFで
573
+ // 内容不変でも毎回無駄なコストを払っていた不整合の修正。
574
+ const conditionalHeaders = {};
575
+ if (cached?.etag)
576
+ conditionalHeaders["If-None-Match"] = cached.etag;
577
+ if (cached?.lastModified)
578
+ conditionalHeaders["If-Modified-Since"] = cached.lastModified;
579
+ const binary = await httpGetBinary(url, {
580
+ maxBytes: DEFAULT_PDF_MAX_BYTES,
581
+ checkRobots: (targetUrl) => politeness.checkRobotsAllowed(targetUrl),
582
+ ...(Object.keys(conditionalHeaders).length > 0 ? { headers: conditionalHeaders } : {}),
583
+ });
584
+ if (binary.status === 304) {
585
+ if (!cached)
586
+ throw new UnexpectedNotModifiedError(url);
587
+ cache.touch(url);
588
+ // PDF応答フォーマットのcacheStatus型は"fresh"|"miss"のみのため、304再検証も
589
+ // "fresh"として表示する(HTML応答の"revalidated"相当だが、既存フォーマットは変更しない)。
590
+ return [{ type: "text", text: formatPdfResponseFromCache(url, cached, maxTokens, page) }];
519
591
  }
520
- const binary = await httpGetBinary(url, { maxBytes: DEFAULT_PDF_MAX_BYTES });
592
+ onProgress?.("PDFを解析しています…");
521
593
  const textResult = await extractPdfText(binary.bytes);
522
594
  if (textResult.hasTextLayer) {
523
595
  const markdown = markdownFromPdfText(textResult);
@@ -555,10 +627,15 @@ export async function handleFetchTool(input) {
555
627
  // 公開品質バグ修正: robots.txt取得(politeness.guard)より前にスキームを検証する(理由は
556
628
  // resolveScreenshotのコメント参照)。zodの.url()はスキームを制限しないため、ここでの
557
629
  // 検証が実質的な最初の関門になる。
630
+ //
631
+ // レビュー指摘対応: 以前はここで全mode共通の無条件politeness.guardを実行していたが、
632
+ // キャッシュfresh応答(実ネットワークアクセスが発生しない)でも毎回レート制御の待機と
633
+ // robots.txt再判定が走る自己ペナルティになっていた。guardは実際にサイトへ取得しに行く
634
+ // 各経路(resolvePage/handlePdfFetch/resolveScreenshot)の内部で、必要な箇所にのみ
635
+ // 個別に行う設計へ変更した(このファイル内の各所コメント参照)。
558
636
  assertHttpScheme(input.url);
559
- await politeness.guard(input.url);
560
637
  if (looksLikePdf(input.url, null)) {
561
- return handlePdfFetch(input.url, page, maxTokens);
638
+ return handlePdfFetch(input.url, page, maxTokens, input.onProgress);
562
639
  }
563
640
  // 公開品質バグ修正: mode: screenshot(section未指定時)はMarkdown抽出結果を一切使わないため、
564
641
  // resolvePage(素のHTTP GETを含む二段フェッチ)を経由せずブラウザへ直行する。
@@ -571,15 +648,25 @@ export async function handleFetchTool(input) {
571
648
  fullPage: true,
572
649
  width: DEFAULT_TILE_WIDTH,
573
650
  scale: DEFAULT_SCREENSHOT_SCALE,
574
- skipGuard: true, // 直前でこの関数冒頭のpoliteness.guard(input.url)を既に実行済み
651
+ onProgress: input.onProgress,
575
652
  });
576
653
  return buildScreenshotContent({ title: null }, screenshot, null);
577
654
  }
578
- const resolvedOrHandoff = await resolvePage(input.url, input.selector);
655
+ const resolvedOrHandoff = await resolvePage(input.url, input.selector, input.onProgress);
579
656
  // 機能B: 非HTMLコンテンツはMarkdown抽出・キャッシュ・mode/selector/section等を適用せず、
580
657
  // メタデータ+プレビュー+curl誘導のハンドオフ応答を返す(PDFのURL判定と同様の独立経路)。
658
+ //
659
+ // レビュー指摘対応: ただしcontent-typeでPDFと判明した場合(URL拡張子には現れない
660
+ // 官公庁の`/download?id=123`型ダウンロードエンドポイント等)は、行き止まりのハンドオフ
661
+ // 応答にせずhandlePdfFetch(既存のPDF専用経路)へ合流させる。関数冒頭のlooksLikePdf(input.url, null)
662
+ // はURL拡張子で早期判明する場合の経路であり、ここはcontent-type確定後にのみ判明する
663
+ // 場合の救済経路のため、拡張子ありのPDFが二重処理されることはない。
581
664
  if ("kind" in resolvedOrHandoff) {
582
- return [{ type: "text", text: formatHandoffResponse(resolvedOrHandoff.handoff, maxTokens) }];
665
+ const { handoff } = resolvedOrHandoff;
666
+ if (looksLikePdf(handoff.finalUrl, handoff.contentType)) {
667
+ return handlePdfFetch(input.url, page, maxTokens, input.onProgress);
668
+ }
669
+ return [{ type: "text", text: formatHandoffResponse(handoff, maxTokens) }];
583
670
  }
584
671
  const resolved = resolvedOrHandoff;
585
672
  // Phase 4 テンプレート学習: 定型ブロック(ヘッダ/フッタ/定型ナビ等)を表示直前に除去する。
@@ -591,12 +678,13 @@ export async function handleFetchTool(input) {
591
678
  const view = { ...resolved, markdown: displayMarkdown, previousMarkdown: previousDisplayMarkdown };
592
679
  // sectionが指定された場合は、mode指定に関わらずその節のMarkdownのみを返す(差分応答は適用しない)
593
680
  if (input.section) {
594
- const sectionMarkdown = extractSection(view.markdown, input.section);
595
- if (sectionMarkdown === null) {
681
+ const section = findSection(view.markdown, input.section);
682
+ if (section === null) {
596
683
  throw new SectionNotFoundError(input.url, input.section);
597
684
  }
598
- const paginated = paginateMarkdown(sectionMarkdown, maxTokens, page);
599
- return [{ type: "text", text: formatMarkdownResponse(view, paginated, input.section, templateRemovedCount) }];
685
+ const paginated = paginateMarkdown(section.content, maxTokens, page);
686
+ const breadcrumb = formatBreadcrumb(section.ancestors);
687
+ return [{ type: "text", text: formatMarkdownResponse(view, paginated, input.section, templateRemovedCount, breadcrumb) }];
600
688
  }
601
689
  if (mode === "outline") {
602
690
  const outline = buildOutline(view.markdown);
@@ -611,11 +699,13 @@ export async function handleFetchTool(input) {
611
699
  // 二重に撮影・保存されてしまうため、両経路で必ずinput.urlを渡すよう統一する
612
700
  // (resolveScreenshot自身のブラウザナビゲーションが同じリダイレクトを辿るため実害は無い)。
613
701
  if (mode === "auto" && resolved.lowQuality) {
702
+ // レビュー指摘対応: resolvePage内のmarkdown取得guardとは別の、screenshotナビゲーションの
703
+ // ための独立したguardがresolveScreenshot内で行われる(=より正確な礼儀)。
614
704
  const screenshot = await resolveScreenshot(input.url, {
615
705
  fullPage: true,
616
706
  width: DEFAULT_TILE_WIDTH,
617
707
  scale: DEFAULT_SCREENSHOT_SCALE,
618
- skipGuard: true, // この関数冒頭のpoliteness.guard(input.url)を既に実行済み
708
+ onProgress: input.onProgress,
619
709
  });
620
710
  return buildScreenshotContent(resolved, screenshot, resolved.qualityReason);
621
711
  }
@@ -636,13 +726,13 @@ export async function handleFetchTool(input) {
636
726
  return [{ type: "text", text: formatMarkdownResponse(view, paginated, null, templateRemovedCount) }];
637
727
  }
638
728
  // テスト用export(既存スタイルに合わせた最小のテスト可能化。politeness.guard呼び出し回数の検証用)。
639
- // 独立screenshotツールは(fetchツールのmode: screenshot早期returnと異なり)事前guardを
640
- // 行わないため、resolveScreenshot自身が既定でguardする(skipGuard未指定)。
729
+ // 独立screenshotツールも含め、resolveScreenshotは常に自身でguardする。
641
730
  export async function handleScreenshotTool(input) {
642
731
  const screenshot = await resolveScreenshot(input.url, {
643
732
  fullPage: input.fullPage ?? true,
644
733
  width: input.width ?? DEFAULT_TILE_WIDTH,
645
734
  scale: input.scale ?? DEFAULT_SCREENSHOT_SCALE,
735
+ onProgress: input.onProgress,
646
736
  });
647
737
  return buildScreenshotContent({ title: null }, screenshot, null);
648
738
  }