@shuji-bonji/rfcxml-mcp 0.6.13 → 0.6.53

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 (67) hide show
  1. package/README.ja.md +178 -50
  2. package/README.md +181 -51
  3. package/dist/cli/prefetch.d.ts +6 -1
  4. package/dist/cli/prefetch.d.ts.map +1 -1
  5. package/dist/cli/prefetch.js +53 -23
  6. package/dist/cli/prefetch.js.map +1 -1
  7. package/dist/config.d.ts +0 -2
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +3 -2
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.d.ts +16 -0
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js +80 -7
  14. package/dist/constants.js.map +1 -1
  15. package/dist/services/checklist-generator.d.ts.map +1 -1
  16. package/dist/services/checklist-generator.js +72 -7
  17. package/dist/services/checklist-generator.js.map +1 -1
  18. package/dist/services/rfc-fetcher.d.ts +19 -1
  19. package/dist/services/rfc-fetcher.d.ts.map +1 -1
  20. package/dist/services/rfc-fetcher.js +116 -19
  21. package/dist/services/rfc-fetcher.js.map +1 -1
  22. package/dist/services/rfc-service.d.ts +11 -1
  23. package/dist/services/rfc-service.d.ts.map +1 -1
  24. package/dist/services/rfc-service.js +45 -5
  25. package/dist/services/rfc-service.js.map +1 -1
  26. package/dist/services/rfc-text-parser.d.ts.map +1 -1
  27. package/dist/services/rfc-text-parser.js +1594 -88
  28. package/dist/services/rfc-text-parser.js.map +1 -1
  29. package/dist/services/rfcxml-parser.d.ts.map +1 -1
  30. package/dist/services/rfcxml-parser.js +366 -98
  31. package/dist/services/rfcxml-parser.js.map +1 -1
  32. package/dist/tools/definitions.d.ts +8 -0
  33. package/dist/tools/definitions.d.ts.map +1 -1
  34. package/dist/tools/definitions.js +17 -1
  35. package/dist/tools/definitions.js.map +1 -1
  36. package/dist/tools/handlers.d.ts +24 -12
  37. package/dist/tools/handlers.d.ts.map +1 -1
  38. package/dist/tools/handlers.js +161 -36
  39. package/dist/tools/handlers.js.map +1 -1
  40. package/dist/types/index.d.ts +22 -2
  41. package/dist/types/index.d.ts.map +1 -1
  42. package/dist/utils/cache.d.ts +19 -0
  43. package/dist/utils/cache.d.ts.map +1 -1
  44. package/dist/utils/cache.js +32 -0
  45. package/dist/utils/cache.js.map +1 -1
  46. package/dist/utils/disk-cache.d.ts +10 -6
  47. package/dist/utils/disk-cache.d.ts.map +1 -1
  48. package/dist/utils/disk-cache.js +13 -9
  49. package/dist/utils/disk-cache.js.map +1 -1
  50. package/dist/utils/logger.d.ts.map +1 -1
  51. package/dist/utils/logger.js +3 -1
  52. package/dist/utils/logger.js.map +1 -1
  53. package/dist/utils/requirement-extractor.d.ts.map +1 -1
  54. package/dist/utils/requirement-extractor.js +413 -21
  55. package/dist/utils/requirement-extractor.js.map +1 -1
  56. package/dist/utils/section.d.ts.map +1 -1
  57. package/dist/utils/section.js +11 -0
  58. package/dist/utils/section.js.map +1 -1
  59. package/dist/utils/statement-matcher.d.ts +69 -4
  60. package/dist/utils/statement-matcher.d.ts.map +1 -1
  61. package/dist/utils/statement-matcher.js +524 -48
  62. package/dist/utils/statement-matcher.js.map +1 -1
  63. package/dist/utils/text.d.ts +62 -0
  64. package/dist/utils/text.d.ts.map +1 -1
  65. package/dist/utils/text.js +273 -18
  66. package/dist/utils/text.js.map +1 -1
  67. package/package.json +5 -2
package/README.md CHANGED
@@ -62,6 +62,33 @@ Add the following to your MCP configuration file:
62
62
  }
63
63
  ```
64
64
 
65
+ To pin a version (0.6.x ships patch releases frequently), write the version into the package spec:
66
+
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "rfcxml": {
71
+ "command": "npx",
72
+ "args": ["-y", "@shuji-bonji/rfcxml-mcp@0.6.53"]
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ To keep fetched RFCs on disk across restarts, pass `RFCXML_CACHE_DIR` (see [Disk cache and `rfcxml-prefetch`](#disk-cache-and-rfcxml-prefetch)):
79
+
80
+ ```json
81
+ {
82
+ "mcpServers": {
83
+ "rfcxml": {
84
+ "command": "npx",
85
+ "args": ["-y", "@shuji-bonji/rfcxml-mcp@0.6.53"],
86
+ "env": { "RFCXML_CACHE_DIR": "/home/you/.cache/rfcxml-mcp" }
87
+ }
88
+ }
89
+ }
90
+ ```
91
+
65
92
  Configuration file locations:
66
93
 
67
94
  - **Claude Desktop (macOS)**: `~/Library/Application Support/Claude/claude_desktop_config.json`
@@ -105,7 +132,7 @@ Then configure MCP:
105
132
 
106
133
  ### Phase 3: Verification Support
107
134
 
108
- - `validate_statement` - Verify if a statement complies with RFC requirements
135
+ - `validate_statement` - Find the RFC requirements that bear on a statement and report detected contradictions. This is **not** a conformance judgment: `isValid` is three-valued (`null` = nothing matched strongly enough to judge, `false` = a contradiction was detected, `true` = no contradiction was detected among the matches). The verdict is yours.
109
136
  - `generate_checklist` - Generate implementation checklist
110
137
 
111
138
  ## Legacy RFC Support
@@ -141,31 +168,38 @@ All responses include source information:
141
168
 
142
169
  ## Output Samples
143
170
 
171
+ Every sample below is trimmed from the actual output of the current build (`npm run build`, then the listed tool call through an MCP client). Field names and values are verbatim; long arrays are cut with `...`.
172
+
144
173
  ### `get_rfc_structure` - Get RFC Structure
145
174
 
175
+ `get_rfc_structure { "rfc": 9293 }`
176
+
146
177
  ```json
147
178
  {
148
179
  "metadata": {
149
180
  "title": "Transmission Control Protocol (TCP)",
150
181
  "docName": "draft-ietf-tcpm-rfc793bis-28",
151
- "number": 9293
182
+ "number": 9293,
183
+ "date": "2022-08",
184
+ "category": "std",
185
+ "stream": "IETF",
186
+ "abstract": "This document specifies the Transmission Control Protocol (TCP). ..."
152
187
  },
153
188
  "sections": [
189
+ { "number": "1", "title": "Purpose and Scope" },
190
+ { "number": "2", "title": "Introduction" },
154
191
  {
155
- "number": "section-1",
156
- "title": "Purpose and Scope"
157
- },
158
- {
159
- "number": "section-3",
192
+ "number": "3",
160
193
  "title": "Functional Specification",
161
194
  "subsections": [
162
- { "number": "section-3.1", "title": "Header Format" },
195
+ { "number": "3.1", "title": "Header Format" },
163
196
  {
164
- "number": "section-3.5",
197
+ "number": "3.5",
165
198
  "title": "Establishing a Connection",
166
199
  "subsections": [
167
- { "number": "section-3.5.1", "title": "Half-Open Connections and Other Anomalies" },
168
- { "number": "section-3.5.2", "title": "Reset Generation" }
200
+ { "number": "3.5.1", "title": "Half-Open Connections and Other Anomalies" },
201
+ { "number": "3.5.2", "title": "Reset Generation" },
202
+ { "number": "3.5.3", "title": "Reset Processing" }
169
203
  ]
170
204
  }
171
205
  ]
@@ -176,88 +210,178 @@ All responses include source information:
176
210
  }
177
211
  ```
178
212
 
213
+ `number` is the section number as printed in the RFC (`3.5`, `A.2`), not the RFCXML `pn` (`section-3.5`). `category` / `stream` / `abstract` come from the IETF Datatracker API and are **omitted** when the API is unreachable or reports a value outside the mapping (e.g. RFC 1 is `unkn` / `legacy`); in that case `_sourceNote` says so.
214
+
179
215
  ### `get_requirements` - Extract Normative Requirements
180
216
 
217
+ `get_requirements { "rfc": 9293, "level": "MUST" }`
218
+
181
219
  ```json
182
220
  {
183
221
  "rfc": 9293,
184
- "filter": { "level": "MUST" },
185
- "stats": { "total": 53, "byLevel": { "MUST": 53 } },
222
+ "filter": { "section": "all", "level": "MUST" },
223
+ "stats": { "total": 55, "byLevel": { "MUST": 55 } },
186
224
  "requirements": [
187
225
  {
188
- "id": "R-section-3.5-5",
226
+ "id": "R-3.5-1",
189
227
  "level": "MUST",
190
- "text": "A TCP implementation support simultaneous open attempts (MUST-10).",
191
- "section": "section-3.5",
192
- "sectionTitle": "Establishing a Connection"
228
+ "text": "A TCP implementation MUST support simultaneous open attempts (MUST-10).",
229
+ "section": "3.5",
230
+ "sectionTitle": "Establishing a Connection",
231
+ "fullContext": "A TCP implementation MUST support simultaneous open attempts (MUST-10).",
232
+ "subject": "tcp implementation",
233
+ "action": "support simultaneous open attempts (MUST-10)"
193
234
  },
194
235
  {
195
- "id": "R-section-3.7.1-9",
236
+ "id": "R-3.7.1-1",
196
237
  "level": "MUST",
197
- "text": "TCP endpoints implement both sending and receiving the MSS Option (MUST-14).",
198
- "section": "section-3.7.1",
199
- "sectionTitle": "Maximum Segment Size Option"
238
+ "text": "TCP endpoints MUST implement both sending and receiving the MSS Option (MUST-14).",
239
+ "section": "3.7.1",
240
+ "sectionTitle": "Maximum Segment Size Option",
241
+ "fullContext": "TCP endpoints MUST implement both sending and receiving the MSS Option (MUST-14).",
242
+ "subject": "tcp endpoints",
243
+ "action": "implement both sending and receiving the MSS Option (MUST-14)"
200
244
  }
201
245
  ],
202
246
  "_source": "xml"
203
247
  }
204
248
  ```
205
249
 
250
+ `id` is `R-<section>-<n>` with `n` numbered per section, so the identifier stays stable when requirements are added elsewhere in the document.
251
+
206
252
  ### `get_rfc_dependencies` - Get RFC Dependencies
207
253
 
254
+ `get_rfc_dependencies { "rfc": 9293 }`
255
+
208
256
  ```json
209
257
  {
210
258
  "rfc": 9293,
211
259
  "normative": [
212
260
  { "rfcNumber": 791, "title": "Internet Protocol", "anchor": "RFC0791" },
213
- { "rfcNumber": 2119, "title": "Key words for use in RFCs to Indicate Requirement Levels" },
214
- { "rfcNumber": 5681, "title": "TCP Congestion Control" }
261
+ { "rfcNumber": 1191, "title": "Path MTU discovery", "anchor": "RFC1191" },
262
+ {
263
+ "rfcNumber": 2119,
264
+ "title": "Key words for use in RFCs to Indicate Requirement Levels",
265
+ "anchor": "RFC2119"
266
+ }
215
267
  ],
216
268
  "informative": [
217
- { "rfcNumber": 793, "title": "Transmission Control Protocol" },
218
- { "rfcNumber": 1122, "title": "Requirements for Internet Hosts - Communication Layers" }
269
+ { "rfcNumber": 793, "title": "Transmission Control Protocol", "anchor": "RFC0793" },
270
+ { "rfcNumber": 896, "title": "Congestion Control in IP/TCP Internetworks", "anchor": "RFC0896" }
219
271
  ],
220
- "_source": "xml"
272
+ "_source": "xml",
273
+ "_referencesSource": "xml"
221
274
  }
222
275
  ```
223
276
 
277
+ `_referencesSource` tells where the reference list came from: `xml` (RFCXML `<references>`), `text` (the References section of the plain text), or `api` (Datatracker `relateddocument`, with placeholder titles).
278
+
224
279
  ### `generate_checklist` - Generate Implementation Checklist
225
280
 
281
+ `generate_checklist { "rfc": 9293, "role": "client", "sections": ["3.5", "3.7.1"] }` — the `markdown` field:
282
+
226
283
  ```markdown
227
284
  # RFC 9293 Implementation Checklist
228
285
 
229
286
  **Transmission Control Protocol (TCP)**
230
287
 
231
- Role: Client
288
+ Role: client
289
+
290
+ Generated: 2026-09-04T17:09:37.833Z
232
291
 
233
- ## Required (MUST / REQUIRED / SHALL)
292
+ ## Mandatory Requirements (MUST / REQUIRED / SHALL)
234
293
 
235
- - [ ] A TCP implementation support simultaneous open attempts (MUST-10). (section-3.5)
236
- - [ ] TCP endpoints implement both sending and receiving the MSS Option (MUST-14). (section-3.7.1)
237
- - [ ] The RTO be computed according to the algorithm in, including Karn's algorithm (MUST-18). (section-3.8.1)
294
+ - [ ] **MUST** A TCP implementation MUST support simultaneous open attempts (MUST-10). (§3.5)
295
+ - [ ] **MUST** TCP endpoints MUST implement both sending and receiving the MSS Option (MUST-14). (§3.7.1)
296
+ - [ ] **MUST** If an MSS Option is not received at connection setup, TCP implementations MUST assume a default send MSS of 536 (576 - 40) for IPv4 or 1220 (1280 - 60) for IPv6 (MUST-15). (§3.7.1)
238
297
 
239
- ## Optional (MAY / OPTIONAL)
298
+ ## Recommended Requirements (SHOULD / RECOMMENDED)
240
299
 
241
- - [ ] Implementers include "keep-alives" in their TCP implementations (MAY-5). (section-3.8.4)
300
+ - [ ] **SHOULD** TCP implementations SHOULD allow a received RST segment to include data (SHLD-2). (§3.5.3)
242
301
  ```
243
302
 
303
+ The same call also returns `"stats": { "must": 6, "should": 2, "may": 1, "total": 9 }`.
304
+
305
+ ### `validate_statement` - Find Bearing Requirements
306
+
307
+ `validate_statement { "rfc": 6455, "statement": "The client MUST mask all frames sent to the server." }`
308
+
309
+ ```json
310
+ {
311
+ "rfc": 6455,
312
+ "statement": "The client MUST mask all frames sent to the server.",
313
+ "analysis": { "detectedLevel": "MUST", "detectedSubject": "client" },
314
+ "isValid": true,
315
+ "matchingRequirements": [
316
+ {
317
+ "id": "R-5.3-2",
318
+ "level": "MUST",
319
+ "text": "When preparing a masked frame, the client MUST pick a fresh masking key from the set of allowed 32-bit values.",
320
+ "section": "5.3",
321
+ "sectionTitle": "Client-to-Server Masking",
322
+ "_matchScore": 17,
323
+ "_matchedKeywords": ["client", "mask", "frames"],
324
+ "_subjectMatch": true,
325
+ "_levelMatch": true
326
+ }
327
+ ],
328
+ "conflicts": [],
329
+ "_source": "text",
330
+ "_sourceNote": "Warning: Parsed from text format. Validation accuracy may be limited."
331
+ }
332
+ ```
333
+
334
+ `isValid: true` means only that no contradiction was detected among the matched requirements. When nothing matches strongly enough, `isValid` is `null` and `_verdictNote` explains why.
335
+
244
336
  ### Text Fallback Output (Legacy RFCs)
245
337
 
338
+ `get_rfc_structure { "rfc": 6455 }` — RFC 6455 predates RFCXML v3, so the plain text is parsed:
339
+
246
340
  ```json
247
341
  {
248
342
  "metadata": {
249
343
  "title": "The WebSocket Protocol",
250
- "number": 6455
344
+ "number": 6455,
345
+ "date": "2011-12",
346
+ "category": "std",
347
+ "stream": "IETF",
348
+ "abstract": "The WebSocket Protocol enables two-way communication ..."
251
349
  },
252
350
  "sections": [
253
351
  { "number": "1", "title": "Introduction" },
352
+ { "number": "2", "title": "Conformance Requirements" },
254
353
  { "number": "5", "title": "Data Framing" }
255
354
  ],
355
+ "referenceCount": { "normative": 18, "informative": 9 },
256
356
  "_source": "text",
257
357
  "_sourceNote": "Warning: Parsed from text format. Accuracy may be limited."
258
358
  }
259
359
  ```
260
360
 
361
+ For RFCs 8650 and later, the XML is tried first. If every XML source returns 404 the call fails ("No RFC with that number is published"). If the XML fetch fails for another reason (5xx, timeout), the text is used and `_sourceNote` says that the XML fetch failed and may be temporary.
362
+
363
+ ## Disk cache and `rfcxml-prefetch`
364
+
365
+ By default, fetched RFCs live only in an in-memory LRU cache and are re-fetched after every restart. Set `RFCXML_CACHE_DIR` to keep them on disk:
366
+
367
+ ```
368
+ $RFCXML_CACHE_DIR/
369
+ ├── xml/rfc9293.xml # RFCXML (RFC 8650 and later)
370
+ └── text/rfc6455.txt # plain text (older RFCs, or XML fetch failures)
371
+ ```
372
+
373
+ The package also ships a `rfcxml-prefetch` CLI that fills the same layout ahead of time, for offline or CI use:
374
+
375
+ ```bash
376
+ # Fetch a range into $RFCXML_CACHE_DIR (or ~/.cache/rfcxml-mcp when unset)
377
+ npx -y -p @shuji-bonji/rfcxml-mcp rfcxml-prefetch --range 9110-9114
378
+
379
+ # Individual RFCs, explicit directory, re-download even if cached
380
+ npx -y -p @shuji-bonji/rfcxml-mcp rfcxml-prefetch --rfc 6455 --rfc 9293 --cache-dir ./rfc-cache --force
381
+ ```
382
+
383
+ Options: `--range A-B`, `--rfc N` (repeatable), `--cache-dir DIR`, `--concurrency N` (default 3), `--force`. RFCs already on disk (XML or text) are skipped unless `--force` is given. RFC numbers must be digits only; `--rfc 9110abc` exits with code 1.
384
+
261
385
  ## Examples
262
386
 
263
387
  See the [examples/](./examples/) directory for complete checklist samples:
@@ -307,32 +431,34 @@ src/
307
431
 
308
432
  ### RFC Fetch Optimization
309
433
 
310
- Sends parallel requests to multiple sources (RFC Editor, IETF Tools, Datatracker) and uses the first successful response:
434
+ Sends parallel requests to the two XML sources (RFC Editor, Datatracker) and uses the first successful response. `tools.ietf.org` was retired in 2021 and is not used. There is no retry; the parallel race is the only redundancy.
311
435
 
312
436
  ```
313
437
  ┌─────────────────┐
314
438
  │ fetchRFCXML() │
315
439
  └────────┬────────┘
316
440
  │ Parallel requests
317
- ┌────┴────┬────────────┐
318
- ▼ ▼ ▼
319
- ┌────────┐ ┌────────┐ ┌────────┐
320
- │RFC │ │IETF │ │Data- │
321
- │Editor │ │Tools │ │tracker │
322
- └────┬───┘ └────┬───┘ └────┬───┘
323
- │ │ │
324
- └────┬─────┴──────────┘
325
- │ Promise.any (first success)
326
- ▼
441
+ ┌────┴─────────┐
442
+ ▼ ▼
443
+ ┌────────┐ ┌────────┐
444
+ │RFC │ │Data- │
445
+ │Editor │ │tracker │
446
+ └────┬───┘ └────┬───┘
447
+ │ │
448
+ └──────┬──────┘
449
+ │ Promise.any (first success)
450
+ ▼
327
451
  ┌───────────┐
328
452
  │ Successful│ → Cancel other requests via AbortController
329
453
  │ Response │
330
454
  └───────────┘
331
455
  ```
332
456
 
457
+ Concurrent calls for the same RFC (e.g. `get_rfc_structure` and `get_requirements` issued in parallel) share one in-flight fetch and one parse.
458
+
333
459
  ### Cache Strategy
334
460
 
335
- LRU (Least Recently Used) cache with memory limits:
461
+ LRU (Least Recently Used) cache with memory limits, plus the optional disk cache (`RFCXML_CACHE_DIR`) below the XML / text caches:
336
462
 
337
463
  | Cache | Max Entries | Content |
338
464
  | -------------- | ----------- | ---------------- |
@@ -353,15 +479,19 @@ npm run dev
353
479
  # Build
354
480
  npm run build
355
481
 
356
- # Test (watch mode)
482
+ # Unit tests (single run) / watch mode
357
483
  npm test
484
+ npm run test:watch
358
485
 
359
- # Test (single run — for CI etc.)
360
- npm test -- --run
361
-
362
- # E2E test (MCP client integration)
486
+ # E2E test (MCP client integration; fetches a few real RFCs)
363
487
  npm run test:e2e
364
488
 
489
+ # Audit against real RFCs, tool-to-tool crosscheck, output snapshots
490
+ # (see tests/audit/README.md; run weekly by .github/workflows/audit.yml)
491
+ npm run audit
492
+ npm run crosscheck
493
+ npm run snapshot
494
+
365
495
  # Lint
366
496
  npm run lint
367
497
 
@@ -24,5 +24,10 @@
24
24
  * - XML validation matches the MCP runtime expectations
25
25
  * - Disk layout matches what the MCP runtime reads, no schema drift
26
26
  */
27
- export {};
27
+ /**
28
+ * RFC 番号を読む。数字だけを受け付ける。
29
+ *
30
+ * `parseInt` は `9110abc` を 9110 として通していた(Issue #17)。
31
+ */
32
+ export declare function parseRFCNumber(value: string | undefined, flag: string): number;
28
33
  //# sourceMappingURL=prefetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefetch.d.ts","sourceRoot":"","sources":["../../src/cli/prefetch.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
1
+ {"version":3,"file":"prefetch.d.ts","sourceRoot":"","sources":["../../src/cli/prefetch.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA2CH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS9E"}
@@ -27,7 +27,8 @@
27
27
  import os from 'node:os';
28
28
  import path from 'node:path';
29
29
  import { promises as fs } from 'node:fs';
30
- import { fetchRFCXML, resetDiskCacheForTesting } from '../services/rfc-fetcher.js';
30
+ import { fileURLToPath } from 'node:url';
31
+ import { fetchRFCText, fetchRFCXML, resetDiskCacheForTesting } from '../services/rfc-fetcher.js';
31
32
  import { DiskCache } from '../utils/disk-cache.js';
32
33
  import { PACKAGE_INFO } from '../config.js';
33
34
  const USAGE = `\
@@ -51,10 +52,25 @@ Options:
51
52
  --help, -h Show this help
52
53
 
53
54
  Notes:
54
- - Old RFCs (< 8650) generally have no XML; those will fail and are skipped.
55
+ - Old RFCs (< 8650) generally have no XML; those are cached as text instead.
55
56
  - The MCP server picks up the cache automatically when started with
56
57
  RFCXML_CACHE_DIR pointing at the same directory.
57
58
  `;
59
+ /**
60
+ * RFC 番号を読む。数字だけを受け付ける。
61
+ *
62
+ * `parseInt` は `9110abc` を 9110 として通していた(Issue #17)。
63
+ */
64
+ export function parseRFCNumber(value, flag) {
65
+ if (value === undefined || !/^\d+$/.test(value)) {
66
+ throw new Error(`${flag} expects a positive integer, got "${value ?? ''}"`);
67
+ }
68
+ const n = Number(value);
69
+ if (!Number.isSafeInteger(n) || n <= 0) {
70
+ throw new Error(`${flag} expects a positive integer, got "${value}"`);
71
+ }
72
+ return n;
73
+ }
58
74
  function parseArgs(argv) {
59
75
  const opts = {
60
76
  rfcs: [],
@@ -75,8 +91,8 @@ function parseArgs(argv) {
75
91
  const m = v?.match(/^(\d+)-(\d+)$/);
76
92
  if (!m)
77
93
  throw new Error(`--range expects N-M, got "${v}"`);
78
- const from = parseInt(m[1], 10);
79
- const to = parseInt(m[2], 10);
94
+ const from = parseRFCNumber(m[1], '--range');
95
+ const to = parseRFCNumber(m[2], '--range');
80
96
  if (from > to)
81
97
  throw new Error(`--range: from (${from}) > to (${to})`);
82
98
  for (let n = from; n <= to; n++)
@@ -84,11 +100,7 @@ function parseArgs(argv) {
84
100
  break;
85
101
  }
86
102
  case '--rfc': {
87
- const v = argv[++i];
88
- const n = parseInt(v ?? '', 10);
89
- if (!Number.isInteger(n) || n <= 0)
90
- throw new Error(`--rfc expects positive integer`);
91
- opts.rfcs.push(n);
103
+ opts.rfcs.push(parseRFCNumber(argv[++i], '--rfc'));
92
104
  break;
93
105
  }
94
106
  case '--cache-dir':
@@ -122,8 +134,11 @@ function parseArgs(argv) {
122
134
  * Process one RFC. Returns a result row instead of throwing so the runner can
123
135
  * tally totals across the whole batch.
124
136
  */
125
- async function processOne(rfc, cache, force) {
126
- if (!force && (await cache.has(rfc))) {
137
+ async function processOne(rfc, cache, textCache, force) {
138
+ // XML でもテキストでもディスクにあれば飛ばす。v0.6.52 までは `xml/` しか
139
+ // 見ていなかったので、XML の無い RFC 8649 は毎回 404 を 2 本投げてから
140
+ // `Text loaded from disk cache` になり、"fetched" と数えられていた(Issue #17)。
141
+ if (!force && ((await cache.has(rfc)) || (await textCache.has(rfc)))) {
127
142
  return { rfc, status: 'skipped' };
128
143
  }
129
144
  try {
@@ -135,12 +150,20 @@ async function processOne(rfc, cache, force) {
135
150
  await cache.set(rfc, xml);
136
151
  return { rfc, status: 'ok' };
137
152
  }
138
- catch (error) {
139
- return {
140
- rfc,
141
- status: 'failed',
142
- error: error instanceof Error ? error.message : String(error),
143
- };
153
+ catch (xmlError) {
154
+ // RFCXML が無い RFC はテキストで読む(RFC 8650 より前のほとんど)。
155
+ // ここで取っておかないと、MCP サーバは起動のたびに本文を取り直す。
156
+ try {
157
+ await fetchRFCText(rfc, { forceFresh: force });
158
+ return { rfc, status: 'ok' };
159
+ }
160
+ catch {
161
+ return {
162
+ rfc,
163
+ status: 'failed',
164
+ error: xmlError instanceof Error ? xmlError.message : String(xmlError),
165
+ };
166
+ }
144
167
  }
145
168
  }
146
169
  /**
@@ -170,16 +193,19 @@ async function main() {
170
193
  }
171
194
  catch (error) {
172
195
  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
173
- process.exit(2);
196
+ // 引数の誤りも取得の失敗も 1 で終わる(Issue #17: `--rfc 9110abc` は exit 1)。
197
+ process.exit(1);
174
198
  }
175
199
  // Plumb the cache dir into the env so fetchRFCXML's lazy init picks it up.
176
200
  process.env.RFCXML_CACHE_DIR = opts.cacheDir;
177
201
  resetDiskCacheForTesting();
178
202
  const cache = new DiskCache(path.join(opts.cacheDir, 'xml'));
203
+ const textCache = new DiskCache(path.join(opts.cacheDir, 'text'), 'text');
179
204
  await fs.mkdir(cache.dir, { recursive: true });
205
+ await fs.mkdir(textCache.dir, { recursive: true });
180
206
  process.stderr.write(`rfcxml-prefetch: ${opts.rfcs.length} RFCs -> ${cache.dir} ` +
181
207
  `(concurrency=${opts.concurrency}, force=${opts.force})\n`);
182
- const results = await runWithConcurrency(opts.rfcs, opts.concurrency, (rfc) => processOne(rfc, cache, opts.force));
208
+ const results = await runWithConcurrency(opts.rfcs, opts.concurrency, (rfc) => processOne(rfc, cache, textCache, opts.force));
183
209
  const summary = results.reduce((acc, r) => {
184
210
  acc[r.status]++;
185
211
  return acc;
@@ -193,8 +219,12 @@ async function main() {
193
219
  process.exit(1);
194
220
  }
195
221
  }
196
- main().catch((error) => {
197
- process.stderr.write(`Fatal: ${error instanceof Error ? error.message : String(error)}\n`);
198
- process.exit(1);
199
- });
222
+ // テストが parseRFCNumber を import できるよう、CLI として起動されたときだけ走る。
223
+ const isMain = process.argv[1] !== undefined && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
224
+ if (isMain) {
225
+ main().catch((error) => {
226
+ process.stderr.write(`Fatal: ${error instanceof Error ? error.message : String(error)}\n`);
227
+ process.exit(1);
228
+ });
229
+ }
200
230
  //# sourceMappingURL=prefetch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/cli/prefetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/cli/prefetch.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -17,8 +17,6 @@ export declare const HTTP_CONFIG: {
17
17
  readonly userAgent: `${string}/${string}`;
18
18
  /** Timeout in milliseconds */
19
19
  readonly timeout: 30000;
20
- /** Maximum retry attempts */
21
- readonly maxRetries: 3;
22
20
  };
23
21
  /**
24
22
  * Cache configuration
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB,wBAAwB;;IAExB,8BAA8B;;IAE9B,6BAA6B;;CAErB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB,iEAAiE;;;;;IAKjE,0BAA0B;;;;;IAK1B,8CAA8C;;;;;IAK9C,oCAAoC;;;;;CAK5B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB;;;OAGG;;CAEK,CAAC;AAEX;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe;IAC1B,oCAAoC;8BACnB,MAAM;IACvB,0EAA0E;gCACvD,MAAM;CACjB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;IAC3B,oCAAoC;8BACnB,MAAM;CACf,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B,sFAAsF;6BACtE,MAAM;IACtB,8DAA8D;mCACxC,MAAM;IAE5B,kEAAkE;6BAClD,MAAM;IAEtB,qFAAqF;iCACjE,MAAM;IAE1B,mFAAmF;+BACjE,MAAM;CAEhB,CAAC;AAEX;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAElE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB,wBAAwB;;IAExB,8BAA8B;;CAKtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB,iEAAiE;;;;;IAKjE,0BAA0B;;;;;IAK1B,8CAA8C;;;;;IAK9C,oCAAoC;;;;;CAK5B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB;;;OAGG;;CAEK,CAAC;AAEX;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe;IAC1B,oCAAoC;8BACnB,MAAM;IACvB,0EAA0E;gCACvD,MAAM;CACjB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;IAC3B,oCAAoC;8BACnB,MAAM;CACf,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B,sFAAsF;6BACtE,MAAM;IACtB,8DAA8D;mCACxC,MAAM;IAE5B,kEAAkE;6BAClD,MAAM;IAEtB,qFAAqF;iCACjE,MAAM;IAE1B,mFAAmF;+BACjE,MAAM;CAEhB,CAAC;AAEX;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAElE"}
package/dist/config.js CHANGED
@@ -20,8 +20,9 @@ export const HTTP_CONFIG = {
20
20
  userAgent: `${PACKAGE_INFO.name}/${PACKAGE_INFO.version}`,
21
21
  /** Timeout in milliseconds */
22
22
  timeout: 30000,
23
- /** Maximum retry attempts */
24
- maxRetries: 3,
23
+ // リトライは実装していない(`maxRetries` は v0.6.52 まで未使用のまま置かれていた)。
24
+ // 一時的な失敗への備えは `fetchFromMultipleSources` の Promise.any による
25
+ // 並列取得(rfc-editor + datatracker)で代替している。
25
26
  };
26
27
  /**
27
28
  * Cache configuration
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CACpB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,wBAAwB;IACxB,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE;IACzD,8BAA8B;IAC9B,OAAO,EAAE,KAAK;IACd,6BAA6B;IAC7B,UAAU,EAAE,CAAC;CACL,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iEAAiE;IACjE,GAAG,EAAE;QACH,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,UAAU;KACjB;IACD,0BAA0B;IAC1B,IAAI,EAAE;QACJ,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,WAAW;KAClB;IACD,8CAA8C;IAC9C,QAAQ,EAAE;QACR,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,eAAe;KACtB;IACD,oCAAoC;IACpC,MAAM,EAAE;QACN,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,YAAY;KACnB;CACO,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;OAGG;IACH,gBAAgB,EAAE,IAAI;CACd,CAAC;AAEX;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oCAAoC;IACpC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,qCAAqC,GAAG,MAAM;IAC1E,0EAA0E;IAC1E,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,uCAAuC,GAAG,OAAO;CACvE,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,oCAAoC;IACpC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,qCAAqC,GAAG,MAAM;CAClE,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sFAAsF;IACtF,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,uDAAuD,GAAG,GAAG;IACxF,8DAA8D;IAC9D,cAAc,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAC1C,6EAA6E,GAAG,UAAU,KAAK,EAAE;IACnG,kEAAkE;IAClE,QAAQ,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CACpC,kEAAkE,GAAG,yBAAyB,KAAK,EAAE;IACvG,qFAAqF;IACrF,YAAY,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,CACzC,4EAA4E,GAAG,wEAAwE,KAAK,EAAE;IAChK,mFAAmF;IACnF,UAAU,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,CACvC,4EAA4E,GAAG,iDAAiD,KAAK,EAAE;CACjI,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,OAAO,SAAS,IAAI,UAAU,CAAC,gBAAgB,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CACpB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,wBAAwB;IACxB,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE;IACzD,8BAA8B;IAC9B,OAAO,EAAE,KAAK;IACd,uDAAuD;IACvD,2DAA2D;IAC3D,yCAAyC;CACjC,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iEAAiE;IACjE,GAAG,EAAE;QACH,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,UAAU;KACjB;IACD,0BAA0B;IAC1B,IAAI,EAAE;QACJ,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,WAAW;KAClB;IACD,8CAA8C;IAC9C,QAAQ,EAAE;QACR,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,eAAe;KACtB;IACD,oCAAoC;IACpC,MAAM,EAAE;QACN,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,YAAY;KACnB;CACO,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;OAGG;IACH,gBAAgB,EAAE,IAAI;CACd,CAAC;AAEX;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oCAAoC;IACpC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,qCAAqC,GAAG,MAAM;IAC1E,0EAA0E;IAC1E,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,uCAAuC,GAAG,OAAO;CACvE,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,oCAAoC;IACpC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,qCAAqC,GAAG,MAAM;CAClE,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sFAAsF;IACtF,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,uDAAuD,GAAG,GAAG;IACxF,8DAA8D;IAC9D,cAAc,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAC1C,6EAA6E,GAAG,UAAU,KAAK,EAAE;IACnG,kEAAkE;IAClE,QAAQ,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CACpC,kEAAkE,GAAG,yBAAyB,KAAK,EAAE;IACvG,qFAAqF;IACrF,YAAY,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,CACzC,4EAA4E,GAAG,wEAAwE,KAAK,EAAE;IAChK,mFAAmF;IACnF,UAAU,EAAE,CAAC,GAAW,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,CACvC,4EAA4E,GAAG,iDAAiD,KAAK,EAAE;CACjI,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,OAAO,SAAS,IAAI,UAAU,CAAC,gBAAgB,CAAC;AAClD,CAAC"}
@@ -54,6 +54,22 @@ export declare function createRFCReferenceRegex(): RegExp;
54
54
  * Section reference pattern (e.g., "Section 1.2", "section 3.4.5")
55
55
  */
56
56
  export declare function createSectionReferenceRegex(): RegExp;
57
+ /**
58
+ * 節番号の列挙の 2 つ目以降。`, 4.2` `, and 4.3` ` and 4.2` ` or 4.2`。
59
+ *
60
+ * 番号のあとに括弧の補足が入ることがある。RFC 7519 §11 は
61
+ * `Sections 10.12 ("JSON Security Considerations") and 10.13 ("Unicode
62
+ * Comparison Security Considerations") of [JWS]` と書く。補足を認めないと
63
+ * 10.12 だけがこの RFC の節として残る(RFC 7519 に §10.12 は無い)。
64
+ *
65
+ * 読点だけで続く番号は、`Section 3, 2 octets long` のように文の途中で読点が
66
+ * 来るものと区別がつかない。そのため読点の形では、番号のあとに列挙の続き
67
+ * (読点・`and`・`or`)か文の切れ目(句点・セミコロン・閉じ括弧・末尾)が
68
+ * 来ることを求める。`and` / `or` で続く形にはこれを課さない。
69
+ */
70
+ export declare const SECTION_LIST_TAIL: string;
71
+ /** 列挙の中の節番号を全部取り出す。 */
72
+ export declare function splitSectionList(list: string): string[];
57
73
  /**
58
74
  * 別文書の節を指す言い回し。
59
75
  *
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B,+BAA+B;;IAE/B,wDAAwD;;CAEhD,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAAgB,EAYlD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAA2B,CAAC;AAM1D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAgC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,IAAI,KAAK,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CA+BD"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B,+BAA+B;;IAE/B,wDAAwD;;CAEhD,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAAgB,EAYlD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAO/C;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAA2B,CAAC;AAM1D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAgC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAWpD;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,QAE2C,CAAC;AAE1E,uBAAuB;AACvB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,IAAI,KAAK,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAiGD"}