@shuji-bonji/pdf-reader-mcp 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.ja.md +45 -0
- package/README.md +45 -0
- package/dist/constants.d.ts +12 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -1
- package/dist/constants.js.map +1 -1
- package/dist/errors.d.ts +83 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +75 -0
- package/dist/errors.js.map +1 -0
- package/dist/schemas/tier1.d.ts +1 -1
- package/dist/services/url-fetcher.d.ts +13 -0
- package/dist/services/url-fetcher.d.ts.map +1 -1
- package/dist/services/url-fetcher.js +19 -1
- package/dist/services/url-fetcher.js.map +1 -1
- package/dist/tools/tier1/get-metadata.d.ts.map +1 -1
- package/dist/tools/tier1/get-metadata.js +4 -2
- package/dist/tools/tier1/get-metadata.js.map +1 -1
- package/dist/tools/tier1/get-page-count.d.ts.map +1 -1
- package/dist/tools/tier1/get-page-count.js +4 -2
- package/dist/tools/tier1/get-page-count.js.map +1 -1
- package/dist/tools/tier1/read-images.d.ts.map +1 -1
- package/dist/tools/tier1/read-images.js +4 -2
- package/dist/tools/tier1/read-images.js.map +1 -1
- package/dist/tools/tier1/read-text.d.ts.map +1 -1
- package/dist/tools/tier1/read-text.js +4 -2
- package/dist/tools/tier1/read-text.js.map +1 -1
- package/dist/tools/tier1/read-url.d.ts.map +1 -1
- package/dist/tools/tier1/read-url.js +4 -2
- package/dist/tools/tier1/read-url.js.map +1 -1
- package/dist/tools/tier1/search-text.d.ts.map +1 -1
- package/dist/tools/tier1/search-text.js +4 -2
- package/dist/tools/tier1/search-text.js.map +1 -1
- package/dist/tools/tier1/summarize.d.ts.map +1 -1
- package/dist/tools/tier1/summarize.js +4 -2
- package/dist/tools/tier1/summarize.js.map +1 -1
- package/dist/tools/tier2/extract-tables.d.ts.map +1 -1
- package/dist/tools/tier2/extract-tables.js +6 -2
- package/dist/tools/tier2/extract-tables.js.map +1 -1
- package/dist/tools/tier2/inspect-annotations.d.ts.map +1 -1
- package/dist/tools/tier2/inspect-annotations.js +6 -2
- package/dist/tools/tier2/inspect-annotations.js.map +1 -1
- package/dist/tools/tier2/inspect-fonts.d.ts.map +1 -1
- package/dist/tools/tier2/inspect-fonts.js +6 -2
- package/dist/tools/tier2/inspect-fonts.js.map +1 -1
- package/dist/tools/tier2/inspect-signatures.d.ts.map +1 -1
- package/dist/tools/tier2/inspect-signatures.js +6 -2
- package/dist/tools/tier2/inspect-signatures.js.map +1 -1
- package/dist/tools/tier2/inspect-structure.d.ts.map +1 -1
- package/dist/tools/tier2/inspect-structure.js +6 -2
- package/dist/tools/tier2/inspect-structure.js.map +1 -1
- package/dist/tools/tier2/inspect-tags.d.ts.map +1 -1
- package/dist/tools/tier2/inspect-tags.js +6 -2
- package/dist/tools/tier2/inspect-tags.js.map +1 -1
- package/dist/tools/tier3/compare-structure.d.ts.map +1 -1
- package/dist/tools/tier3/compare-structure.js +6 -2
- package/dist/tools/tier3/compare-structure.js.map +1 -1
- package/dist/tools/tier3/validate-metadata.d.ts.map +1 -1
- package/dist/tools/tier3/validate-metadata.js +6 -2
- package/dist/tools/tier3/validate-metadata.js.map +1 -1
- package/dist/tools/tier3/validate-tagged.d.ts.map +1 -1
- package/dist/tools/tier3/validate-tagged.js +6 -2
- package/dist/tools/tier3/validate-tagged.js.map +1 -1
- package/dist/utils/concurrency.d.ts +25 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +53 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/error-handler.d.ts +40 -3
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +210 -31
- package/dist/utils/error-handler.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,41 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.6.1] - 2026-05-08
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`read_url` の同時実行数制限 (concurrency limit)** — module-level の shared limiter を `src/services/url-fetcher.ts` に導入。LLM が複数 `read_url` を並列に呼んでも、リモートホストへの過剰負荷とレート制限の発火を防ぎます。
|
|
13
|
+
- 新規 `src/utils/concurrency.ts`: 軽量な FIFO ベース limit ヘルパー (`createLimit`)。houki-egov-mcp v0.2.1 の同名実装を移植 (外部依存なし、約 30 行)。
|
|
14
|
+
- 既定 4 並列。環境変数 `PDF_READER_CONCURRENCY` で上書き可。
|
|
15
|
+
- `fetchPdfFromUrl(url)` は内部で limit を経由するように変更。limit を経由しない素の実装は `fetchPdfFromUrlUnlimited(url)` として再エクスポート (テスト・特殊用途用)。
|
|
16
|
+
- **`tests/tier1/concurrency.test.ts`**: limit が cap を超えないこと、戻り値・順序を保つこと、エラー伝播の単体テスト 5 件。
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- **`SERVER_VERSION` 定数を `0.6.0` → `0.6.1` へ同期**。`User-Agent` ヘッダで送信される値もこれに追従。
|
|
21
|
+
|
|
22
|
+
## [0.6.0] - 2026-05-07
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **houki-hub family-compatible 構造化エラー応答** (Issue #9): すべての tool がエラー時に `LawServiceError` を JSON 文字列化したものを `content[0].text` に入れ、`isError: true` を立てて返すように変更しました。`code` 文字列は houki-hub family (houki-egov-mcp / houki-nta-mcp) と語彙を共有するため、LLM や Skill 層が一貫した解釈ロジックでエラーを処理できます。
|
|
27
|
+
- 新規 `src/errors.ts`: `LawErrorCode` / `LawServiceError` / `makeError` / `isLawServiceError` / `NEXT_ACTIONS` を定義 (houki-egov-mcp の `src/errors.ts` をリファレンスとし、`houki-abbreviations` 等への依存はなし)。
|
|
28
|
+
- 新規 `handleStructuredError(error)`: `unknown` を `LawServiceError` に正規化。`PdfReaderError` の legacy `code` を family 語彙にマッピング、汎用 `Error` のメッセージから `DOC_NOT_FOUND` / `INVALID_PDF` / `ENCRYPTED_PDF` / `FILE_TOO_LARGE` / `SOURCE_*` を推定。
|
|
29
|
+
- 採用 `code` 一覧: `INVALID_ARGUMENT` / `DOC_NOT_FOUND` / `INVALID_PDF` / `ENCRYPTED_PDF` / `UNSUPPORTED_PDF_FEATURE` / `FILE_TOO_LARGE` / `SOURCE_API_ERROR` / `SOURCE_TIMEOUT` / `SOURCE_UNAVAILABLE` / `INTERNAL_ERROR`。
|
|
30
|
+
- `PdfReaderError` を拡張: 直接 `familyCode` / `nextActions` / `retryable` / `detail` を渡せる第 4〜7 引数を追加 (既存呼び出しは変更なし、後方互換)。
|
|
31
|
+
- **`tests/tier1/errors.test.ts`**: makeError / isLawServiceError / NEXT_ACTIONS / handleStructuredError の単体テストを追加 (28 ケース)。
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **全 16 tool のエラーパス**: tier1 (7) / tier2 (6) / tier3 (3) すべてが `handleStructuredError(error)` を呼び、JSON 文字列 + `isError: true` を返す形に統一。`content[0].text` は人間可読文字列ではなく **JSON** になります。
|
|
36
|
+
- **README.md / README.ja.md** の Error Contract セクション: 「方針」記述を「v0.6.0 で実装済み」に更新し、`code` 一覧テーブル / 移行ノート (v0.5.x → v0.6.0) を追記。
|
|
37
|
+
- **`handleError(error)` (deprecated)**: 後方互換のため引き続き人間可読な文字列を返しますが、内部実装は `formatStructuredErrorForHumans(handleStructuredError(error))` に置き換わりました。新規 tool では `handleStructuredError()` を直接利用してください。
|
|
38
|
+
|
|
39
|
+
### Migration
|
|
40
|
+
|
|
41
|
+
LLM クライアントや Skill 層で `content[0].text` を文字列として解釈していた場合、v0.6.0 以降は `JSON.parse(content[0].text)` で `LawServiceError` として解釈してください。`isError: true` フラグで構造化エラーかどうかを判定できます。詳細は README の「Error Contract (houki-hub family)」セクションを参照。
|
|
42
|
+
|
|
8
43
|
## [0.5.0] - 2026-05-07
|
|
9
44
|
|
|
10
45
|
### Added
|
package/README.ja.md
CHANGED
|
@@ -238,6 +238,51 @@ pdf-reader-mcp/
|
|
|
238
238
|
└── e2e/ # E2E tests (9 suites, 132 tests)
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
+
## エラー応答 (houki-hub family contract)
|
|
242
|
+
|
|
243
|
+
**v0.6.0** より、本 MCP のエラー応答は **houki-hub family 共通契約**に従う構造化レスポンスを返します。`code` 文字列は family 全体で統一された語彙を使用するため、`houki-egov-mcp` / `houki-nta-mcp` と併用しても LLM・Skill 層は一貫したロジックで解釈できます。
|
|
244
|
+
|
|
245
|
+
- [`docs/ERROR-CODES.md`](https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-CODES.md) — エラーコード語彙の正典 (houki-research-skill)
|
|
246
|
+
- [`docs/ERROR-HANDLING.md`](https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-HANDLING.md) — 解釈ポリシー / next_actions テンプレ
|
|
247
|
+
|
|
248
|
+
実装は **完全に独立** しており、`houki-abbreviations` 等の family パッケージに依存しません。リファレンス実装は [`houki-egov-mcp/src/errors.ts`](https://github.com/shuji-bonji/houki-egov-mcp/blob/main/src/errors.ts)、本 MCP のローカル定義は [`src/errors.ts`](./src/errors.ts) を参照してください。
|
|
249
|
+
|
|
250
|
+
エラー時は全 tool が `isError: true` を立て、`content[0].text` に `LawServiceError` を JSON 文字列化したものを入れて返します:
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"error": "The file does not appear to be a valid PDF.",
|
|
255
|
+
"code": "INVALID_PDF",
|
|
256
|
+
"hint": "ファイルが破損していないか確認してください。",
|
|
257
|
+
"next_actions": [
|
|
258
|
+
{
|
|
259
|
+
"action": "inspect_structure",
|
|
260
|
+
"reason": "PDF が壊れている可能性があります。Catalog / Pages 等の構造を確認してください"
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
"detail": { "cause": "Invalid PDF structure" }
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### 本 MCP で使用するコード
|
|
268
|
+
|
|
269
|
+
| code | 用途 |
|
|
270
|
+
|---|---|
|
|
271
|
+
| `INVALID_ARGUMENT` | パス・URL・ページ範囲などクライアント側引数の不正 |
|
|
272
|
+
| `DOC_NOT_FOUND` | ファイル未存在 (ENOENT) |
|
|
273
|
+
| `INVALID_PDF` | PDF として不正・破損 |
|
|
274
|
+
| `ENCRYPTED_PDF` | 暗号化 PDF (現状未対応) |
|
|
275
|
+
| `UNSUPPORTED_PDF_FEATURE` | サポート外の PDF 機能 |
|
|
276
|
+
| `FILE_TOO_LARGE` | 50MB 上限超過 (pdf-reader 固有) |
|
|
277
|
+
| `SOURCE_API_ERROR` | URL fetch の HTTP エラー (4xx/5xx) |
|
|
278
|
+
| `SOURCE_TIMEOUT` | リモート取得タイムアウト |
|
|
279
|
+
| `SOURCE_UNAVAILABLE` | DNS / 接続失敗 |
|
|
280
|
+
| `INTERNAL_ERROR` | パーミッション拒否を含むその他バグ |
|
|
281
|
+
|
|
282
|
+
### 移行ノート (v0.5.x → v0.6.0)
|
|
283
|
+
|
|
284
|
+
旧 v0.5.x までは `content[0].text` に `Error: ...\n\nSuggestion: ...` という人間可読な文字列を入れていました。v0.6.0 では同じ場所に **JSON 文字列** が入ります。LLM 側でテキスト解釈に依存していた場合は `JSON.parse(content[0].text)` での解釈に切り替えてください。`isError: true` フラグで構造化エラーかどうかを判定できます。
|
|
285
|
+
|
|
241
286
|
## pdf-spec-mcp との連携
|
|
242
287
|
|
|
243
288
|
[pdf-spec-mcp](https://github.com/shuji-bonji/pdf-spec-mcp) は PDF 仕様(ISO 32000-2 等)の知識を提供する MCP サーバーです。両方を有効にすることで、LLM は以下のような仕様知識ベースのワークフローを実行できます:
|
package/README.md
CHANGED
|
@@ -238,6 +238,51 @@ pdf-reader-mcp/
|
|
|
238
238
|
└── e2e/ # E2E tests (9 suites, 132 tests)
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
+
## Error Contract (houki-hub family)
|
|
242
|
+
|
|
243
|
+
Since **v0.6.0**, this MCP returns structured errors that follow the **houki-hub family error contract**, sharing a unified `code` vocabulary across the family. Combined with `houki-egov-mcp` / `houki-nta-mcp`, an LLM or Skill layer can interpret errors with consistent logic.
|
|
244
|
+
|
|
245
|
+
- [`docs/ERROR-CODES.md`](https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-CODES.md) — error code vocabulary (houki-research-skill)
|
|
246
|
+
- [`docs/ERROR-HANDLING.md`](https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-HANDLING.md) — handling policy / next_actions templates
|
|
247
|
+
|
|
248
|
+
Implementation is **independent** — no dependency on `houki-abbreviations` or other family packages. The reference implementation is [`houki-egov-mcp/src/errors.ts`](https://github.com/shuji-bonji/houki-egov-mcp/blob/main/src/errors.ts); pdf-reader-mcp's local definition is in [`src/errors.ts`](./src/errors.ts).
|
|
249
|
+
|
|
250
|
+
On error, every tool returns `isError: true` and the JSON-stringified `LawServiceError` in `content[0].text`:
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"error": "The file does not appear to be a valid PDF.",
|
|
255
|
+
"code": "INVALID_PDF",
|
|
256
|
+
"hint": "ファイルが破損していないか確認してください。",
|
|
257
|
+
"next_actions": [
|
|
258
|
+
{
|
|
259
|
+
"action": "inspect_structure",
|
|
260
|
+
"reason": "PDF が壊れている可能性があります。Catalog / Pages 等の構造を確認してください"
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
"detail": { "cause": "Invalid PDF structure" }
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Codes used by pdf-reader-mcp
|
|
268
|
+
|
|
269
|
+
| code | 用途 |
|
|
270
|
+
|---|---|
|
|
271
|
+
| `INVALID_ARGUMENT` | パス・URL・ページ範囲などクライアント側引数の不正 |
|
|
272
|
+
| `DOC_NOT_FOUND` | ファイル未存在 (ENOENT) |
|
|
273
|
+
| `INVALID_PDF` | PDF として不正・破損 |
|
|
274
|
+
| `ENCRYPTED_PDF` | 暗号化 PDF (現状未対応) |
|
|
275
|
+
| `UNSUPPORTED_PDF_FEATURE` | サポート外の PDF 機能 |
|
|
276
|
+
| `FILE_TOO_LARGE` | 50MB 上限超過 (pdf-reader 固有) |
|
|
277
|
+
| `SOURCE_API_ERROR` | URL fetch の HTTP エラー (4xx/5xx) |
|
|
278
|
+
| `SOURCE_TIMEOUT` | リモート取得タイムアウト |
|
|
279
|
+
| `SOURCE_UNAVAILABLE` | DNS / 接続失敗 |
|
|
280
|
+
| `INTERNAL_ERROR` | パーミッション拒否を含むその他バグ |
|
|
281
|
+
|
|
282
|
+
### Migration note (v0.5.x → v0.6.0)
|
|
283
|
+
|
|
284
|
+
旧 v0.5.x までは `content[0].text` に `Error: ...\n\nSuggestion: ...` という人間可読文字列を入れていました。v0.6.0 では同じ場所に **JSON 文字列** が入ります。LLM 側でテキスト解釈に依存していた場合は、`JSON.parse(content[0].text)` での解釈に切り替えてください。`isError: true` フラグで構造化エラーかどうかを判定できます。
|
|
285
|
+
|
|
241
286
|
## Pairing with pdf-spec-mcp
|
|
242
287
|
|
|
243
288
|
[pdf-spec-mcp](https://github.com/shuji-bonji/pdf-spec-mcp) provides PDF specification knowledge (ISO 32000-2, etc.). With both servers enabled, an LLM can perform specification-aware workflows:
|
package/dist/constants.d.ts
CHANGED
|
@@ -13,7 +13,18 @@ export declare const MAX_SEARCH_RESULTS = 100;
|
|
|
13
13
|
export declare const DEFAULT_SEARCH_CONTEXT = 80;
|
|
14
14
|
/** Server info */
|
|
15
15
|
export declare const SERVER_NAME = "pdf-reader-mcp";
|
|
16
|
-
export declare const SERVER_VERSION = "0.
|
|
16
|
+
export declare const SERVER_VERSION = "0.6.1";
|
|
17
|
+
/**
|
|
18
|
+
* Default concurrency cap for remote PDF fetches (`read_url`).
|
|
19
|
+
* Can be overridden with the `PDF_READER_CONCURRENCY` environment variable.
|
|
20
|
+
*
|
|
21
|
+
* 同一プロセス内で複数の `read_url` 呼び出しが並列に走った場合、
|
|
22
|
+
* 同時 fetch 数をこの値に制限することでリモートホストへの過剰負荷と
|
|
23
|
+
* レート制限の発火を防ぐ。
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_FETCH_CONCURRENCY = 4;
|
|
26
|
+
/** 環境変数で上書きされた fetch 同時実行数(無効値ならデフォルト) */
|
|
27
|
+
export declare const FETCH_CONCURRENCY: number;
|
|
17
28
|
/** Response format enum */
|
|
18
29
|
export declare enum ResponseFormat {
|
|
19
30
|
MARKDOWN = "markdown",
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0CAA0C;AAC1C,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,4CAA4C;AAC5C,eAAO,MAAM,aAAa,QAAmB,CAAC;AAE9C,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,uDAAuD;AACvD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,kBAAkB;AAClB,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAC5C,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,2BAA2B;AAC3B,oBAAY,cAAc;IACxB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0CAA0C;AAC1C,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,4CAA4C;AAC5C,eAAO,MAAM,aAAa,QAAmB,CAAC;AAE9C,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,uDAAuD;AACvD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,kBAAkB;AAClB,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAC5C,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,QAC8D,CAAC;AAE7F,2BAA2B;AAC3B,oBAAY,cAAc;IACxB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd"}
|
package/dist/constants.js
CHANGED
|
@@ -13,7 +13,18 @@ export const MAX_SEARCH_RESULTS = 100;
|
|
|
13
13
|
export const DEFAULT_SEARCH_CONTEXT = 80;
|
|
14
14
|
/** Server info */
|
|
15
15
|
export const SERVER_NAME = 'pdf-reader-mcp';
|
|
16
|
-
export const SERVER_VERSION = '0.
|
|
16
|
+
export const SERVER_VERSION = '0.6.1';
|
|
17
|
+
/**
|
|
18
|
+
* Default concurrency cap for remote PDF fetches (`read_url`).
|
|
19
|
+
* Can be overridden with the `PDF_READER_CONCURRENCY` environment variable.
|
|
20
|
+
*
|
|
21
|
+
* 同一プロセス内で複数の `read_url` 呼び出しが並列に走った場合、
|
|
22
|
+
* 同時 fetch 数をこの値に制限することでリモートホストへの過剰負荷と
|
|
23
|
+
* レート制限の発火を防ぐ。
|
|
24
|
+
*/
|
|
25
|
+
export const DEFAULT_FETCH_CONCURRENCY = 4;
|
|
26
|
+
/** 環境変数で上書きされた fetch 同時実行数(無効値ならデフォルト) */
|
|
27
|
+
export const FETCH_CONCURRENCY = Number.parseInt(process.env.PDF_READER_CONCURRENCY ?? '', 10) || DEFAULT_FETCH_CONCURRENCY;
|
|
17
28
|
/** Response format enum */
|
|
18
29
|
export var ResponseFormat;
|
|
19
30
|
(function (ResponseFormat) {
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,iDAAiD;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,uDAAuD;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,kBAAkB;AAClB,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,2BAA2B;AAC3B,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,uCAAqB,CAAA;IACrB,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,iDAAiD;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,uDAAuD;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,kBAAkB;AAClB,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,yBAAyB,CAAC;AAE7F,2BAA2B;AAC3B,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,uCAAqB,CAAA;IACrB,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* houki-hub family-compatible 構造化エラー応答 — pdf-reader-mcp 独自実装
|
|
3
|
+
*
|
|
4
|
+
* 設計指針:
|
|
5
|
+
* - houki-hub family の error contract に準拠 (`code` 文字列を共有)
|
|
6
|
+
* - 共通パッケージ依存を持たず独立実装 (pdf-reader-mcp は汎用 PDF ツールであり、
|
|
7
|
+
* houki-abbreviations 等の家族専用パッケージへ依存させない)
|
|
8
|
+
* - houki-egov-mcp / houki-nta-mcp の `src/errors.ts` をリファレンスとし、
|
|
9
|
+
* PDF 固有のコード (INVALID_PDF / ENCRYPTED_PDF 等) を追加
|
|
10
|
+
*
|
|
11
|
+
* family contract 仕様:
|
|
12
|
+
* @see https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-CODES.md
|
|
13
|
+
* @see https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-HANDLING.md
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* family 共通エラーコード — pdf-reader-mcp で使用する部分集合 + PDF 固有拡張。
|
|
17
|
+
*
|
|
18
|
+
* - 引数・入力 (クライアント側責任): `INVALID_ARGUMENT`
|
|
19
|
+
* - リソース未発見: `DOC_NOT_FOUND`
|
|
20
|
+
* - PDF コンテンツ: `INVALID_PDF` / `ENCRYPTED_PDF` / `UNSUPPORTED_PDF_FEATURE`
|
|
21
|
+
* - 外部ソース由来: `SOURCE_API_ERROR` / `SOURCE_TIMEOUT` / `SOURCE_UNAVAILABLE`
|
|
22
|
+
* - PDF 固有: `FILE_TOO_LARGE` (50MB 制限超過)
|
|
23
|
+
* - システム: `INTERNAL_ERROR`
|
|
24
|
+
*/
|
|
25
|
+
export type LawErrorCode = 'INVALID_ARGUMENT' | 'DOC_NOT_FOUND' | 'INVALID_PDF' | 'ENCRYPTED_PDF' | 'UNSUPPORTED_PDF_FEATURE' | 'SOURCE_API_ERROR' | 'SOURCE_TIMEOUT' | 'SOURCE_UNAVAILABLE' | 'FILE_TOO_LARGE' | 'INTERNAL_ERROR';
|
|
26
|
+
/**
|
|
27
|
+
* 次に取るべきアクションの提案。
|
|
28
|
+
* LLM がこれを読んで自律的に次のツールを呼ぶことを想定。
|
|
29
|
+
*/
|
|
30
|
+
export interface NextAction {
|
|
31
|
+
/** 推奨アクション (tool 名 or 自然言語) */
|
|
32
|
+
action: string;
|
|
33
|
+
/** どんなときに有効か */
|
|
34
|
+
reason: string;
|
|
35
|
+
/** 具体的な引数例 (任意) */
|
|
36
|
+
example?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* family-compatible 共通エラー応答。
|
|
40
|
+
*/
|
|
41
|
+
export interface LawServiceError {
|
|
42
|
+
/** 1文の人間可読メッセージ (LLM もここを読む) */
|
|
43
|
+
error: string;
|
|
44
|
+
/** プログラム判定用の安定したコード */
|
|
45
|
+
code: LawErrorCode;
|
|
46
|
+
/** 追加情報 (任意) */
|
|
47
|
+
hint?: string;
|
|
48
|
+
/** LLM が次に呼ぶべき tool / 取るべき手段の候補 */
|
|
49
|
+
next_actions?: NextAction[];
|
|
50
|
+
/** 一時的エラーかどうか (true なら時間をおいて再試行可) */
|
|
51
|
+
retryable?: boolean;
|
|
52
|
+
/** 元のエラー詳細 (debug 用) */
|
|
53
|
+
detail?: {
|
|
54
|
+
status?: number;
|
|
55
|
+
url?: string;
|
|
56
|
+
cause?: string;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* エラーレスポンスを構築するヘルパー。
|
|
61
|
+
* 必須フィールド (error, code) と任意フィールドを安全に組み立てる。
|
|
62
|
+
*/
|
|
63
|
+
export declare function makeError(code: LawErrorCode, message: string, options?: {
|
|
64
|
+
hint?: string;
|
|
65
|
+
next_actions?: NextAction[];
|
|
66
|
+
retryable?: boolean;
|
|
67
|
+
detail?: LawServiceError['detail'];
|
|
68
|
+
}): LawServiceError;
|
|
69
|
+
/** オブジェクトが LawServiceError かどうかの type guard */
|
|
70
|
+
export declare function isLawServiceError(value: unknown): value is LawServiceError;
|
|
71
|
+
/**
|
|
72
|
+
* よく使う next_actions のプリセット。
|
|
73
|
+
* pdf-reader-mcp 固有の tool 名を含む。
|
|
74
|
+
*/
|
|
75
|
+
export declare const NEXT_ACTIONS: {
|
|
76
|
+
readonly checkFilePath: (filePath?: string) => NextAction;
|
|
77
|
+
readonly useGetPageCount: (filePath?: string) => NextAction;
|
|
78
|
+
readonly useInspectStructure: (filePath?: string) => NextAction;
|
|
79
|
+
readonly splitPdf: () => NextAction;
|
|
80
|
+
readonly retryLater: () => NextAction;
|
|
81
|
+
readonly checkUrl: (url?: string) => NextAction;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAEpB,kBAAkB,GAElB,eAAe,GAEf,aAAa,GACb,eAAe,GACf,yBAAyB,GAEzB,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GAEpB,gBAAgB,GAEhB,gBAAgB,CAAC;AAErB;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;CAC/B,GACL,eAAe,CASjB;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAS1E;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY;wCACI,MAAM,KAAG,UAAU;0CAKjB,MAAM,KAAG,UAAU;8CAKf,MAAM,KAAG,UAAU;6BAKtC,UAAU;+BAIR,UAAU;8BAIT,MAAM,KAAG,UAAU;CAK5B,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* houki-hub family-compatible 構造化エラー応答 — pdf-reader-mcp 独自実装
|
|
3
|
+
*
|
|
4
|
+
* 設計指針:
|
|
5
|
+
* - houki-hub family の error contract に準拠 (`code` 文字列を共有)
|
|
6
|
+
* - 共通パッケージ依存を持たず独立実装 (pdf-reader-mcp は汎用 PDF ツールであり、
|
|
7
|
+
* houki-abbreviations 等の家族専用パッケージへ依存させない)
|
|
8
|
+
* - houki-egov-mcp / houki-nta-mcp の `src/errors.ts` をリファレンスとし、
|
|
9
|
+
* PDF 固有のコード (INVALID_PDF / ENCRYPTED_PDF 等) を追加
|
|
10
|
+
*
|
|
11
|
+
* family contract 仕様:
|
|
12
|
+
* @see https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-CODES.md
|
|
13
|
+
* @see https://github.com/shuji-bonji/houki-research-skill/blob/main/docs/ERROR-HANDLING.md
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* エラーレスポンスを構築するヘルパー。
|
|
17
|
+
* 必須フィールド (error, code) と任意フィールドを安全に組み立てる。
|
|
18
|
+
*/
|
|
19
|
+
export function makeError(code, message, options = {}) {
|
|
20
|
+
const err = { error: message, code };
|
|
21
|
+
if (options.hint)
|
|
22
|
+
err.hint = options.hint;
|
|
23
|
+
if (options.next_actions && options.next_actions.length > 0) {
|
|
24
|
+
err.next_actions = options.next_actions;
|
|
25
|
+
}
|
|
26
|
+
if (options.retryable !== undefined)
|
|
27
|
+
err.retryable = options.retryable;
|
|
28
|
+
if (options.detail)
|
|
29
|
+
err.detail = options.detail;
|
|
30
|
+
return err;
|
|
31
|
+
}
|
|
32
|
+
/** オブジェクトが LawServiceError かどうかの type guard */
|
|
33
|
+
export function isLawServiceError(value) {
|
|
34
|
+
return (typeof value === 'object' &&
|
|
35
|
+
value !== null &&
|
|
36
|
+
'error' in value &&
|
|
37
|
+
'code' in value &&
|
|
38
|
+
typeof value.error === 'string' &&
|
|
39
|
+
typeof value.code === 'string');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* よく使う next_actions のプリセット。
|
|
43
|
+
* pdf-reader-mcp 固有の tool 名を含む。
|
|
44
|
+
*/
|
|
45
|
+
export const NEXT_ACTIONS = {
|
|
46
|
+
checkFilePath: (filePath) => ({
|
|
47
|
+
action: 'verify_file_path',
|
|
48
|
+
reason: 'ファイルパスが正しいか、絶対パスで指定されているか確認してください',
|
|
49
|
+
example: filePath ? { file_path: filePath } : undefined,
|
|
50
|
+
}),
|
|
51
|
+
useGetPageCount: (filePath) => ({
|
|
52
|
+
action: 'get_page_count',
|
|
53
|
+
reason: '総ページ数を確認してから pages を指定してください',
|
|
54
|
+
example: filePath ? { file_path: filePath } : undefined,
|
|
55
|
+
}),
|
|
56
|
+
useInspectStructure: (filePath) => ({
|
|
57
|
+
action: 'inspect_structure',
|
|
58
|
+
reason: 'PDF が壊れている可能性があります。Catalog / Pages 等の構造を確認してください',
|
|
59
|
+
example: filePath ? { file_path: filePath } : undefined,
|
|
60
|
+
}),
|
|
61
|
+
splitPdf: () => ({
|
|
62
|
+
action: 'split_pdf',
|
|
63
|
+
reason: 'ファイルサイズが 50MB を超えています。分割してから再試行してください',
|
|
64
|
+
}),
|
|
65
|
+
retryLater: () => ({
|
|
66
|
+
action: 'retry_later',
|
|
67
|
+
reason: '一時的なネットワークエラーの可能性があります。30秒〜数分後に再試行してください',
|
|
68
|
+
}),
|
|
69
|
+
checkUrl: (url) => ({
|
|
70
|
+
action: 'verify_url',
|
|
71
|
+
reason: 'URL が正しいか・HTTP/HTTPS であるか確認してください',
|
|
72
|
+
example: url ? { url } : undefined,
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiEH;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,IAAkB,EAClB,OAAe,EACf,UAKI,EAAE;IAEN,MAAM,GAAG,GAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,MAAM,IAAI,KAAK;QACf,OAAQ,KAA4B,CAAC,KAAK,KAAK,QAAQ;QACvD,OAAQ,KAA2B,CAAC,IAAI,KAAK,QAAQ,CACtD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa,EAAE,CAAC,QAAiB,EAAc,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,mCAAmC;QAC3C,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC;IACF,eAAe,EAAE,CAAC,QAAiB,EAAc,EAAE,CAAC,CAAC;QACnD,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,8BAA8B;QACtC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC;IACF,mBAAmB,EAAE,CAAC,QAAiB,EAAc,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,kDAAkD;QAC1D,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC;IACF,QAAQ,EAAE,GAAe,EAAE,CAAC,CAAC;QAC3B,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,uCAAuC;KAChD,CAAC;IACF,UAAU,EAAE,GAAe,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,0CAA0C;KACnD,CAAC;IACF,QAAQ,EAAE,CAAC,GAAY,EAAc,EAAE,CAAC,CAAC;QACvC,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,mCAAmC;QAC3C,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;KACnC,CAAC;CACM,CAAC"}
|
package/dist/schemas/tier1.d.ts
CHANGED
|
@@ -106,8 +106,8 @@ export declare const ReadUrlSchema: z.ZodObject<{
|
|
|
106
106
|
split_columns: z.ZodOptional<z.ZodNumber>;
|
|
107
107
|
compact_whitespace: z.ZodOptional<z.ZodBoolean>;
|
|
108
108
|
}, "strict", z.ZodTypeAny, {
|
|
109
|
-
response_format: import("../constants.js").ResponseFormat;
|
|
110
109
|
url: string;
|
|
110
|
+
response_format: import("../constants.js").ResponseFormat;
|
|
111
111
|
pages?: string | undefined;
|
|
112
112
|
split_columns?: number | undefined;
|
|
113
113
|
compact_whitespace?: boolean | undefined;
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Remote PDF fetcher service.
|
|
3
|
+
*
|
|
4
|
+
* v0.6.1+ では module-level の shared limiter で同時 fetch 数を制限する。
|
|
5
|
+
* 上限は `PDF_READER_CONCURRENCY` 環境変数で上書き可能(既定 4)。
|
|
6
|
+
*
|
|
7
|
+
* テスト用に制限なしで呼びたい場合は `fetchPdfFromUrlUnlimited()` を使う。
|
|
3
8
|
*/
|
|
4
9
|
/**
|
|
5
10
|
* Fetch a PDF from a URL and return it as Uint8Array.
|
|
11
|
+
*
|
|
12
|
+
* 同時実行数は `FETCH_CONCURRENCY` で制限される。LLM が複数 `read_url` を
|
|
13
|
+
* 並列に呼んでも、リモートホストへの過剰負荷とレート制限を防ぐ。
|
|
6
14
|
*/
|
|
7
15
|
export declare function fetchPdfFromUrl(url: string): Promise<Uint8Array>;
|
|
16
|
+
/**
|
|
17
|
+
* Limit を経由しない素の fetch 実装。
|
|
18
|
+
* テスト用、または limit 経由がすでに保証されている呼び出し側用。
|
|
19
|
+
*/
|
|
20
|
+
export declare function fetchPdfFromUrlUnlimited(url: string): Promise<Uint8Array>;
|
|
8
21
|
//# sourceMappingURL=url-fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-fetcher.d.ts","sourceRoot":"","sources":["../../src/services/url-fetcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"url-fetcher.d.ts","sourceRoot":"","sources":["../../src/services/url-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEtE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAuD/E"}
|
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Remote PDF fetcher service.
|
|
3
|
+
*
|
|
4
|
+
* v0.6.1+ では module-level の shared limiter で同時 fetch 数を制限する。
|
|
5
|
+
* 上限は `PDF_READER_CONCURRENCY` 環境変数で上書き可能(既定 4)。
|
|
6
|
+
*
|
|
7
|
+
* テスト用に制限なしで呼びたい場合は `fetchPdfFromUrlUnlimited()` を使う。
|
|
3
8
|
*/
|
|
4
|
-
import { MAX_FILE_SIZE, SERVER_NAME, SERVER_VERSION } from '../constants.js';
|
|
9
|
+
import { FETCH_CONCURRENCY, MAX_FILE_SIZE, SERVER_NAME, SERVER_VERSION } from '../constants.js';
|
|
10
|
+
import { createLimit } from '../utils/concurrency.js';
|
|
5
11
|
import { PdfReaderError } from '../utils/error-handler.js';
|
|
12
|
+
/** module-level shared limiter — 全 read_url 呼び出しが同じ limiter を経由する */
|
|
13
|
+
const fetchLimit = createLimit(FETCH_CONCURRENCY);
|
|
6
14
|
/**
|
|
7
15
|
* Fetch a PDF from a URL and return it as Uint8Array.
|
|
16
|
+
*
|
|
17
|
+
* 同時実行数は `FETCH_CONCURRENCY` で制限される。LLM が複数 `read_url` を
|
|
18
|
+
* 並列に呼んでも、リモートホストへの過剰負荷とレート制限を防ぐ。
|
|
8
19
|
*/
|
|
9
20
|
export async function fetchPdfFromUrl(url) {
|
|
21
|
+
return fetchLimit(() => fetchPdfFromUrlUnlimited(url));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Limit を経由しない素の fetch 実装。
|
|
25
|
+
* テスト用、または limit 経由がすでに保証されている呼び出し側用。
|
|
26
|
+
*/
|
|
27
|
+
export async function fetchPdfFromUrlUnlimited(url) {
|
|
10
28
|
let parsedUrl;
|
|
11
29
|
try {
|
|
12
30
|
parsedUrl = new URL(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-fetcher.js","sourceRoot":"","sources":["../../src/services/url-fetcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"url-fetcher.js","sourceRoot":"","sources":["../../src/services/url-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,qEAAqE;AACrE,MAAM,UAAU,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAElD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CACtB,gBAAgB,GAAG,EAAE,EACrB,aAAa,EACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,cAAc,CACtB,yBAAyB,SAAS,CAAC,QAAQ,EAAE,EAC7C,sBAAsB,EACtB,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,MAAM,EAAE,iBAAiB;YACzB,YAAY,EAAE,GAAG,WAAW,IAAI,cAAc,EAAE;SACjD;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,cAAc,CACtB,6BAA6B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EACrE,cAAc,EACd,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;QACjE,MAAM,IAAI,cAAc,CACtB,oBAAoB,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EACvG,gBAAgB,EAChB,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,MAAM,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,cAAc,CACtB,wBAAwB,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EACjG,gBAAgB,EAChB,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-metadata.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/get-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-metadata.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/get-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+C3D"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { ResponseFormat } from '../../constants.js';
|
|
5
5
|
import { GetMetadataSchema } from '../../schemas/tier1.js';
|
|
6
6
|
import { getMetadata } from '../../services/pdfjs-service.js';
|
|
7
|
-
import {
|
|
7
|
+
import { handleStructuredError } from '../../utils/error-handler.js';
|
|
8
8
|
import { formatMetadataMarkdown } from '../../utils/formatter.js';
|
|
9
9
|
export function registerGetMetadata(server) {
|
|
10
10
|
server.registerTool('get_metadata', {
|
|
@@ -40,8 +40,10 @@ Examples:
|
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
catch (error) {
|
|
43
|
+
const err = handleStructuredError(error);
|
|
43
44
|
return {
|
|
44
|
-
content: [{ type: 'text', text:
|
|
45
|
+
content: [{ type: 'text', text: JSON.stringify(err, null, 2) }],
|
|
46
|
+
isError: true,
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
49
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-metadata.js","sourceRoot":"","sources":["../../../src/tools/tier1/get-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAyB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get-metadata.js","sourceRoot":"","sources":["../../../src/tools/tier1/get-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAyB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE;;;;;;;;;;;;qCAYkB;QAC/B,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAwB,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAErD,MAAM,IAAI,GACR,MAAM,CAAC,eAAe,KAAK,cAAc,CAAC,IAAI;gBAC5C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAEvC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-page-count.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/get-page-count.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-page-count.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/get-page-count.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8C5D"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { GetPageCountSchema } from '../../schemas/tier1.js';
|
|
5
5
|
import { loadDocument } from '../../services/pdfjs-service.js';
|
|
6
|
-
import {
|
|
6
|
+
import { handleStructuredError } from '../../utils/error-handler.js';
|
|
7
7
|
export function registerGetPageCount(server) {
|
|
8
8
|
server.registerTool('get_page_count', {
|
|
9
9
|
title: 'Get PDF Page Count',
|
|
@@ -41,8 +41,10 @@ Examples:
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
catch (error) {
|
|
44
|
+
const err = handleStructuredError(error);
|
|
44
45
|
return {
|
|
45
|
-
content: [{ type: 'text', text:
|
|
46
|
+
content: [{ type: 'text', text: JSON.stringify(err, null, 2) }],
|
|
47
|
+
isError: true,
|
|
46
48
|
};
|
|
47
49
|
}
|
|
48
50
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-page-count.js","sourceRoot":"","sources":["../../../src/tools/tier1/get-page-count.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAA0B,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get-page-count.js","sourceRoot":"","sources":["../../../src/tools/tier1/get-page-count.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAA0B,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE;;;;;;;;;;;;oCAYiB;QAC9B,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAyB,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC1D,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-images.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/read-images.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"read-images.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/read-images.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiF1D"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { ReadImagesSchema } from '../../schemas/tier1.js';
|
|
5
5
|
import { extractImages } from '../../services/pdfjs-service.js';
|
|
6
|
-
import {
|
|
6
|
+
import { handleStructuredError } from '../../utils/error-handler.js';
|
|
7
7
|
export function registerReadImages(server) {
|
|
8
8
|
server.registerTool('read_images', {
|
|
9
9
|
title: 'Read PDF Images',
|
|
@@ -70,8 +70,10 @@ Examples:
|
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
72
|
catch (error) {
|
|
73
|
+
const err = handleStructuredError(error);
|
|
73
74
|
return {
|
|
74
|
-
content: [{ type: 'text', text:
|
|
75
|
+
content: [{ type: 'text', text: JSON.stringify(err, null, 2) }],
|
|
76
|
+
isError: true,
|
|
75
77
|
};
|
|
76
78
|
}
|
|
77
79
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-images.js","sourceRoot":"","sources":["../../../src/tools/tier1/read-images.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAwB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"read-images.js","sourceRoot":"","sources":["../../../src/tools/tier1/read-images.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAwB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE;;;;;;;;;;;;;;;uEAeoD;QACjE,WAAW,EAAE,gBAAgB;QAC7B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAuB,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAEnE,IAAI,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;gBAChC,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;oBAC5B,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EACF,GAAG,MAAM,CAAC,aAAa,iCAAiC;oCACxD,+BAA+B;oCAC/B,wEAAwE;6BAC3E;yBACF;qBACF,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;iBACtF,CAAC;YACJ,CAAC;YAED,uDAAuD;YACvD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACjD,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,UAAU,EAAE,GAAG,CAAC,UAAU;aAC3B,CAAC,CAAC,CAAC;YAEJ,IAAI,IAAI,GAAG,SAAS,MAAM,CAAC,cAAc,YAAY,CAAC;YACtD,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,IAAI,KAAK,MAAM,CAAC,YAAY,8CAA8C,CAAC;YACjF,CAAC;YACD,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAEzD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-text.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/read-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"read-text.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/read-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+DxD"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { ResponseFormat } from '../../constants.js';
|
|
5
5
|
import { ReadTextSchema } from '../../schemas/tier1.js';
|
|
6
6
|
import { extractText } from '../../services/pdfjs-service.js';
|
|
7
|
-
import {
|
|
7
|
+
import { handleStructuredError } from '../../utils/error-handler.js';
|
|
8
8
|
import { formatPageTextsMarkdown, truncateIfNeeded } from '../../utils/formatter.js';
|
|
9
9
|
export function registerReadText(server) {
|
|
10
10
|
server.registerTool('read_text', {
|
|
@@ -57,8 +57,10 @@ Examples:
|
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
|
+
const err = handleStructuredError(error);
|
|
60
61
|
return {
|
|
61
|
-
content: [{ type: 'text', text:
|
|
62
|
+
content: [{ type: 'text', text: JSON.stringify(err, null, 2) }],
|
|
63
|
+
isError: true,
|
|
62
64
|
};
|
|
63
65
|
}
|
|
64
66
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-text.js","sourceRoot":"","sources":["../../../src/tools/tier1/read-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAsB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"read-text.js","sourceRoot":"","sources":["../../../src/tools/tier1/read-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAsB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAErF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;yFAqBsE;QACnF,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAqB,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE;gBAC9D,YAAY,EAAE,MAAM,CAAC,aAAa;gBAClC,iBAAiB,EAAE,MAAM,CAAC,kBAAkB;aAC7C,CAAC,CAAC;YAEH,IAAI,IAAY,CAAC;YACjB,IAAI,MAAM,CAAC,eAAe,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAEnD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACtD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-url.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/read-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"read-url.d.ts","sourceRoot":"","sources":["../../../src/tools/tier1/read-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmEvD"}
|