@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.
- package/README.ja.md +178 -50
- package/README.md +181 -51
- package/dist/cli/prefetch.d.ts +6 -1
- package/dist/cli/prefetch.d.ts.map +1 -1
- package/dist/cli/prefetch.js +53 -23
- package/dist/cli/prefetch.js.map +1 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +16 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +80 -7
- package/dist/constants.js.map +1 -1
- package/dist/services/checklist-generator.d.ts.map +1 -1
- package/dist/services/checklist-generator.js +72 -7
- package/dist/services/checklist-generator.js.map +1 -1
- package/dist/services/rfc-fetcher.d.ts +19 -1
- package/dist/services/rfc-fetcher.d.ts.map +1 -1
- package/dist/services/rfc-fetcher.js +116 -19
- package/dist/services/rfc-fetcher.js.map +1 -1
- package/dist/services/rfc-service.d.ts +11 -1
- package/dist/services/rfc-service.d.ts.map +1 -1
- package/dist/services/rfc-service.js +45 -5
- package/dist/services/rfc-service.js.map +1 -1
- package/dist/services/rfc-text-parser.d.ts.map +1 -1
- package/dist/services/rfc-text-parser.js +1594 -88
- package/dist/services/rfc-text-parser.js.map +1 -1
- package/dist/services/rfcxml-parser.d.ts.map +1 -1
- package/dist/services/rfcxml-parser.js +366 -98
- package/dist/services/rfcxml-parser.js.map +1 -1
- package/dist/tools/definitions.d.ts +8 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +17 -1
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +24 -12
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +161 -36
- package/dist/tools/handlers.js.map +1 -1
- package/dist/types/index.d.ts +22 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +19 -0
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +32 -0
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/disk-cache.d.ts +10 -6
- package/dist/utils/disk-cache.d.ts.map +1 -1
- package/dist/utils/disk-cache.js +13 -9
- package/dist/utils/disk-cache.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/requirement-extractor.d.ts.map +1 -1
- package/dist/utils/requirement-extractor.js +413 -21
- package/dist/utils/requirement-extractor.js.map +1 -1
- package/dist/utils/section.d.ts.map +1 -1
- package/dist/utils/section.js +11 -0
- package/dist/utils/section.js.map +1 -1
- package/dist/utils/statement-matcher.d.ts +69 -4
- package/dist/utils/statement-matcher.d.ts.map +1 -1
- package/dist/utils/statement-matcher.js +524 -48
- package/dist/utils/statement-matcher.js.map +1 -1
- package/dist/utils/text.d.ts +62 -0
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js +273 -18
- package/dist/utils/text.js.map +1 -1
- 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` -
|
|
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": "
|
|
156
|
-
"title": "Purpose and Scope"
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
"number": "section-3",
|
|
192
|
+
"number": "3",
|
|
160
193
|
"title": "Functional Specification",
|
|
161
194
|
"subsections": [
|
|
162
|
-
{ "number": "
|
|
195
|
+
{ "number": "3.1", "title": "Header Format" },
|
|
163
196
|
{
|
|
164
|
-
"number": "
|
|
197
|
+
"number": "3.5",
|
|
165
198
|
"title": "Establishing a Connection",
|
|
166
199
|
"subsections": [
|
|
167
|
-
{ "number": "
|
|
168
|
-
{ "number": "
|
|
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":
|
|
222
|
+
"filter": { "section": "all", "level": "MUST" },
|
|
223
|
+
"stats": { "total": 55, "byLevel": { "MUST": 55 } },
|
|
186
224
|
"requirements": [
|
|
187
225
|
{
|
|
188
|
-
"id": "R-
|
|
226
|
+
"id": "R-3.5-1",
|
|
189
227
|
"level": "MUST",
|
|
190
|
-
"text": "A TCP implementation support simultaneous open attempts (MUST-10).",
|
|
191
|
-
"section": "
|
|
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-
|
|
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": "
|
|
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":
|
|
214
|
-
{
|
|
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":
|
|
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:
|
|
288
|
+
Role: client
|
|
289
|
+
|
|
290
|
+
Generated: 2026-09-04T17:09:37.833Z
|
|
232
291
|
|
|
233
|
-
##
|
|
292
|
+
## Mandatory Requirements (MUST / REQUIRED / SHALL)
|
|
234
293
|
|
|
235
|
-
- [ ] A TCP implementation support simultaneous open attempts (MUST-10). (
|
|
236
|
-
- [ ] TCP endpoints implement both sending and receiving the MSS Option (MUST-14). (
|
|
237
|
-
- [ ]
|
|
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
|
-
##
|
|
298
|
+
## Recommended Requirements (SHOULD / RECOMMENDED)
|
|
240
299
|
|
|
241
|
-
- [ ]
|
|
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
|
|
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 │
|
|
321
|
-
│Editor │
|
|
322
|
-
└────┬───┘
|
|
323
|
-
│
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
#
|
|
482
|
+
# Unit tests (single run) / watch mode
|
|
357
483
|
npm test
|
|
484
|
+
npm run test:watch
|
|
358
485
|
|
|
359
|
-
#
|
|
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
|
|
package/dist/cli/prefetch.d.ts
CHANGED
|
@@ -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
|
-
|
|
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"}
|
package/dist/cli/prefetch.js
CHANGED
|
@@ -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 {
|
|
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
|
|
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 =
|
|
79
|
-
const to =
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
package/dist/cli/prefetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/cli/prefetch.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/cli/prefetch.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -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;;
|
|
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
|
-
|
|
24
|
-
|
|
23
|
+
// リトライは実装していない(`maxRetries` は v0.6.52 まで未使用のまま置かれていた)。
|
|
24
|
+
// 一時的な失敗への備えは `fetchFromMultipleSources` の Promise.any による
|
|
25
|
+
// 並列取得(rfc-editor + datatracker)で代替している。
|
|
25
26
|
};
|
|
26
27
|
/**
|
|
27
28
|
* Cache configuration
|
package/dist/config.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -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
|
*
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|