driverge-mcp 0.0.0 → 0.0.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.
Files changed (81) hide show
  1. package/README.md +275 -29
  2. package/dist/codegen/esp32.d.ts +11 -3
  3. package/dist/codegen/esp32.js +221 -10
  4. package/dist/codegen/esp32.js.map +1 -1
  5. package/dist/codegen/ident.d.ts +24 -2
  6. package/dist/codegen/ident.js +37 -4
  7. package/dist/codegen/ident.js.map +1 -1
  8. package/dist/codegen/index.d.ts +12 -7
  9. package/dist/codegen/index.js +17 -14
  10. package/dist/codegen/index.js.map +1 -1
  11. package/dist/codegen/lint.js +28 -8
  12. package/dist/codegen/lint.js.map +1 -1
  13. package/dist/codegen/portable-cpp.d.ts +8 -0
  14. package/dist/codegen/portable-cpp.js +281 -0
  15. package/dist/codegen/portable-cpp.js.map +1 -0
  16. package/dist/codegen/portable.d.ts +99 -3
  17. package/dist/codegen/portable.js +419 -99
  18. package/dist/codegen/portable.js.map +1 -1
  19. package/dist/codegen/stm32.d.ts +11 -3
  20. package/dist/codegen/stm32.js +156 -11
  21. package/dist/codegen/stm32.js.map +1 -1
  22. package/dist/codegen/types.d.ts +32 -0
  23. package/dist/codegen/types.js +27 -0
  24. package/dist/codegen/types.js.map +1 -1
  25. package/dist/mcp/cache.d.ts +15 -2
  26. package/dist/mcp/cache.js +32 -4
  27. package/dist/mcp/cache.js.map +1 -1
  28. package/dist/mcp/register.d.ts +17 -0
  29. package/dist/mcp/register.js +149 -21
  30. package/dist/mcp/register.js.map +1 -1
  31. package/dist/mcp/summary.js +8 -0
  32. package/dist/mcp/summary.js.map +1 -1
  33. package/dist/pdf/address.d.ts +4 -0
  34. package/dist/pdf/address.js +28 -0
  35. package/dist/pdf/address.js.map +1 -0
  36. package/dist/pdf/command.js +87 -14
  37. package/dist/pdf/command.js.map +1 -1
  38. package/dist/pdf/extract.js +23 -2
  39. package/dist/pdf/extract.js.map +1 -1
  40. package/dist/pdf/generic-register-table.d.ts +5 -0
  41. package/dist/pdf/generic-register-table.js +125 -0
  42. package/dist/pdf/generic-register-table.js.map +1 -0
  43. package/dist/pdf/index.d.ts +2 -0
  44. package/dist/pdf/index.js +2 -0
  45. package/dist/pdf/index.js.map +1 -1
  46. package/dist/pdf/interface-kind.d.ts +11 -0
  47. package/dist/pdf/interface-kind.js +18 -0
  48. package/dist/pdf/interface-kind.js.map +1 -1
  49. package/dist/pdf/manufacturer.js +39 -0
  50. package/dist/pdf/manufacturer.js.map +1 -1
  51. package/dist/pdf/maxim-register-map.d.ts +11 -0
  52. package/dist/pdf/maxim-register-map.js +544 -0
  53. package/dist/pdf/maxim-register-map.js.map +1 -0
  54. package/dist/pdf/part.js +8 -0
  55. package/dist/pdf/part.js.map +1 -1
  56. package/dist/pdf/prose-commands.d.ts +4 -0
  57. package/dist/pdf/prose-commands.js +90 -0
  58. package/dist/pdf/prose-commands.js.map +1 -0
  59. package/dist/pdf/st-bit-layout.d.ts +3 -0
  60. package/dist/pdf/st-bit-layout.js +238 -0
  61. package/dist/pdf/st-bit-layout.js.map +1 -0
  62. package/dist/pdf/ti-field-descriptions.d.ts +10 -0
  63. package/dist/pdf/ti-field-descriptions.js +87 -0
  64. package/dist/pdf/ti-field-descriptions.js.map +1 -0
  65. package/dist/pdf/ti-register-map.d.ts +5 -0
  66. package/dist/pdf/ti-register-map.js +84 -0
  67. package/dist/pdf/ti-register-map.js.map +1 -0
  68. package/dist/pdf/types.d.ts +15 -3
  69. package/dist/pdf/types.js +4 -1
  70. package/dist/pdf/types.js.map +1 -1
  71. package/dist/schema/assemble.d.ts +35 -3
  72. package/dist/schema/assemble.js +86 -13
  73. package/dist/schema/assemble.js.map +1 -1
  74. package/dist/schema/types.d.ts +21 -1
  75. package/dist/schema/validate.js +37 -10
  76. package/dist/schema/validate.js.map +1 -1
  77. package/dist/server.d.ts +18 -0
  78. package/dist/server.js +49 -3
  79. package/dist/server.js.map +1 -1
  80. package/package.json +1 -1
  81. package/schemas/datasheet.schema.json +17 -3
@@ -1,19 +1,61 @@
1
1
  // Registers the full Driverge MCP surface — tools, resources, prompts — on a
2
2
  // server instance. Kept out of server.ts so the wiring is unit-testable over an
3
3
  // in-memory transport. Contract: wiki mcp-tool-usage-flow.
4
- import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
5
- import { join } from "node:path";
4
+ import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
5
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
8
8
  import { z } from "zod";
9
- import { UnsupportedTargetError, generateDriver, lintDriver, } from "../codegen/index.js";
9
+ import { UnsupportedBusError, UnsupportedTargetError, generateDriver, lintDriver, } from "../codegen/index.js";
10
10
  import { analyzePdfFile } from "../pdf/analyze.js";
11
11
  import { assembleDatasheet } from "../schema/assemble.js";
12
12
  import { validateDatasheet } from "../schema/validate.js";
13
13
  import { computeRef, getDatasheet, putDatasheet } from "./cache.js";
14
14
  import { buildSummary } from "./summary.js";
15
15
  const TARGET = z.enum(["portable", "stm32", "esp32", "arduino"]);
16
+ // Session D: output language flavor. "c" (default) is today's thin-HAL C
17
+ // skeleton; "cpp" renders a class wrapper — see CodegenLanguage. Invalid values
18
+ // (e.g. "rust") are rejected by this zod schema before the handler ever runs.
19
+ const LANGUAGE = z.enum(["c", "cpp"]);
16
20
  const FILES = z.array(z.object({ path: z.string(), content: z.string() }));
21
+ // Structural guard for validate_datasheet's `json` arg (S5, see wiki:
22
+ // validate-before-sending-to-claude): a minimal zod parse covering exactly what
23
+ // validateDatasheet reads, so a malformed/hand-typed blob fails with a clean
24
+ // message instead of a raw TypeError from deep inside the validator. Loose on
25
+ // fields validateDatasheet doesn't touch — this is a guard, not a schema mirror.
26
+ const BIT_FIELD_SCHEMA = z.object({
27
+ name: z.string(),
28
+ msb: z.number(),
29
+ lsb: z.number(),
30
+ });
31
+ const REGISTER_SCHEMA = z.object({
32
+ name: z.string(),
33
+ address: z.string(),
34
+ reset: z.string(),
35
+ width: z.number().optional(),
36
+ bitFields: z.array(BIT_FIELD_SCHEMA),
37
+ });
38
+ const COMMAND_SCHEMA = z.object({
39
+ name: z.string(),
40
+ code: z.string(),
41
+ responseWords: z.number().optional(),
42
+ crc: z.object({ poly: z.string(), init: z.string(), width: z.number() }).optional(),
43
+ });
44
+ const INTERFACE_SCHEMA = z.discriminatedUnion("kind", [
45
+ z.object({ kind: z.literal("register_map"), registers: z.array(REGISTER_SCHEMA) }),
46
+ z.object({ kind: z.literal("command_set"), commands: z.array(COMMAND_SCHEMA) }),
47
+ ]);
48
+ const DATASHEET_JSON_GUARD = z.object({
49
+ metadata: z.looseObject({ part: z.string() }),
50
+ protocol: z.looseObject({ bus: z.string() }),
51
+ interface: INTERFACE_SCHEMA,
52
+ extraction: z
53
+ .object({
54
+ status: z.enum(["complete", "partial", "deferred", "none"]),
55
+ detectedPages: z.array(z.number()),
56
+ })
57
+ .optional(),
58
+ }).loose();
17
59
  const text = (value, isError = false) => ({
18
60
  content: [
19
61
  {
@@ -23,6 +65,39 @@ const text = (value, isError = false) => ({
23
65
  ],
24
66
  ...(isError ? { isError: true } : {}),
25
67
  });
68
+ // Matches an absolute Windows path ("C:\..." or "C:/...") even when Node's
69
+ // `path` module resolves in POSIX mode (e.g. tests running on a non-Windows
70
+ // CI). Node's own `isAbsolute()` only recognizes the *current platform's*
71
+ // notion of absolute, so on POSIX it does NOT consider "C:\evil.h" absolute —
72
+ // this regex closes that gap so resolveArtifactPath's containment check is
73
+ // meaningful on every platform, not just Windows (B3).
74
+ const WINDOWS_ABSOLUTE = /^[a-zA-Z]:[\\/]/;
75
+ /**
76
+ * Confines a single artifact file path (`DriverArtifact.files[].path`) under
77
+ * `rootDir`, returning the resolved absolute path when it is safely inside
78
+ * `rootDir`, or `undefined` when it escapes (an absolute path — POSIX or
79
+ * Windows-style — or a relative path that climbs out via `..`). Mirrors the
80
+ * out_dir escape check in the generate_driver handler below (resolve +
81
+ * relative + isAbsolute) so both containment checks agree on what "escapes"
82
+ * means. A nested-but-non-escaping relative path (e.g. "sub/dir/file.h") is
83
+ * accepted and resolves under rootDir.
84
+ *
85
+ * `filePath` is always Driverge's own deterministic codegen output today
86
+ * (safe), but the generate_driver handler has no other guard if that ever
87
+ * changes — a hostile/careless datasheet-derived slug, a future codegen bug,
88
+ * etc. — so this is the second containment check, applied to every file
89
+ * BEFORE any of them are written (B3).
90
+ */
91
+ export function resolveArtifactPath(rootDir, filePath) {
92
+ if (isAbsolute(filePath) || WINDOWS_ABSOLUTE.test(filePath))
93
+ return undefined;
94
+ const resolvedRoot = resolve(rootDir);
95
+ const target = resolve(resolvedRoot, filePath);
96
+ const rel = relative(resolvedRoot, target);
97
+ if (rel.startsWith("..") || isAbsolute(rel))
98
+ return undefined;
99
+ return target;
100
+ }
26
101
  // The frozen JSON-Schema, shipped alongside dist/ (see package.json "files").
27
102
  function loadSchemaText() {
28
103
  try {
@@ -30,6 +105,8 @@ function loadSchemaText() {
30
105
  return readFileSync(fileURLToPath(url), "utf8");
31
106
  }
32
107
  catch {
108
+ // stderr is safe for a stdio MCP server (stdout is the protocol channel).
109
+ console.error("driverge-mcp: could not read schemas/datasheet.schema.json — serving an empty schema");
33
110
  return "{}";
34
111
  }
35
112
  }
@@ -42,11 +119,20 @@ export function registerDrivergeTools(server) {
42
119
  manufacturer_hint: z.string().optional(),
43
120
  interface_kind_hint: z.enum(["register_map", "command_set"]).optional(),
44
121
  },
45
- }, async ({ pdf_path }) => {
46
- if (!existsSync(pdf_path)) {
122
+ }, async ({ pdf_path, manufacturer_hint, interface_kind_hint }) => {
123
+ // Single stat call (not existsSync + statSync) to close the TOCTOU gap
124
+ // where the file could vanish/change between the check and the read (S4).
125
+ let mtimeMs;
126
+ try {
127
+ mtimeMs = statSync(pdf_path).mtimeMs;
128
+ }
129
+ catch {
47
130
  return text(`file not found: ${pdf_path}`, true);
48
131
  }
49
- const ref = computeRef(pdf_path, statSync(pdf_path).mtimeMs);
132
+ // Fold the hints into the ref material (Session 10 / Contract A): the ref
133
+ // is otherwise path+mtime only, so re-analyzing the same file with
134
+ // different hints would silently serve a hint-less cached entry.
135
+ const ref = computeRef(pdf_path, mtimeMs, `${manufacturer_hint ?? ""}:${interface_kind_hint ?? ""}`);
50
136
  const cached = getDatasheet(ref);
51
137
  if (cached)
52
138
  return text(buildSummary(cached));
@@ -60,19 +146,23 @@ export function registerDrivergeTools(server) {
60
146
  if (analysis.type === "scanned") {
61
147
  return text("PDF appears to be scanned (no extractable text). OCR is not supported in v0.1.0.", true);
62
148
  }
63
- const json = assembleDatasheet(analysis);
149
+ const json = assembleDatasheet(analysis, {
150
+ manufacturerHint: manufacturer_hint,
151
+ interfaceKindHint: interface_kind_hint,
152
+ });
64
153
  putDatasheet({ ref, pdfPath: pdf_path, json });
65
154
  return text(buildSummary({ ref, pdfPath: pdf_path, json }));
66
155
  });
67
156
  server.registerTool("generate_driver", {
68
157
  title: "Generate driver",
69
- description: "Render a deterministic thin-HAL driver skeleton (with TODO(driverge) markers + a fill_in_brief) from a previously analyzed datasheet `ref`. Rejects refs that failed validation.",
158
+ description: "Render a deterministic thin-HAL driver skeleton (with TODO(driverge) markers + a fill_in_brief) from a previously analyzed datasheet `ref`. Rejects refs that failed validation. `language` defaults to \"c\" (struct + free functions); pass \"cpp\" for a class wrapper (.hpp/.cpp) around the same #define macros and hal_* seam.",
70
159
  inputSchema: {
71
160
  ref: z.string(),
72
161
  target: TARGET.default("portable"),
162
+ language: LANGUAGE.default("c"),
73
163
  out_dir: z.string().optional(),
74
164
  },
75
- }, async ({ ref, target, out_dir }) => {
165
+ }, async ({ ref, target, language, out_dir }) => {
76
166
  const entry = getDatasheet(ref);
77
167
  if (!entry)
78
168
  return text(`unknown ref "${ref}" — run analyze_datasheet first`, true);
@@ -84,24 +174,51 @@ export function registerDrivergeTools(server) {
84
174
  }
85
175
  let artifact;
86
176
  try {
87
- artifact = generateDriver(entry.json, target);
177
+ artifact = generateDriver(entry.json, target, { language });
88
178
  }
89
179
  catch (err) {
90
180
  if (err instanceof UnsupportedTargetError)
91
181
  return text(err.message, true);
182
+ if (err instanceof UnsupportedBusError)
183
+ return text(err.message, true);
92
184
  throw err;
93
185
  }
94
186
  if (out_dir) {
95
- mkdirSync(out_dir, { recursive: true });
96
- for (const f of artifact.files)
97
- writeFileSync(join(out_dir, f.path), f.content);
187
+ // S1: confine writes under DRIVERGE_OUT_ROOT (default cwd), read at call
188
+ // time so tests can scope it per-case. relative() + isAbsolute() catches
189
+ // both "../escape" traversal and an absolute path on another drive; no
190
+ // directory is created before this check passes.
191
+ const root = process.env.DRIVERGE_OUT_ROOT ?? process.cwd();
192
+ const resolvedRoot = resolve(root);
193
+ const resolvedOut = resolve(resolvedRoot, out_dir);
194
+ const rel = relative(resolvedRoot, resolvedOut);
195
+ if (rel.startsWith("..") || isAbsolute(rel)) {
196
+ return text(`out_dir "${out_dir}" escapes the allowed root "${resolvedRoot}" (set DRIVERGE_OUT_ROOT to change it)`, true);
197
+ }
198
+ // B3: a SECOND containment check, this time on each artifact file's
199
+ // own path — resolveArtifactPath, not a bare join(resolvedOut,
200
+ // f.path). Every path is validated BEFORE any file is written, so a
201
+ // single escaping path aborts the whole write with no partial output.
202
+ const targets = [];
203
+ for (const f of artifact.files) {
204
+ const target = resolveArtifactPath(resolvedOut, f.path);
205
+ if (!target) {
206
+ return text(`generated file path "${f.path}" escapes the output directory "${resolvedOut}" — refusing to write anything`, true);
207
+ }
208
+ targets.push({ target, content: f.content });
209
+ }
210
+ mkdirSync(resolvedOut, { recursive: true });
211
+ for (const { target, content } of targets) {
212
+ mkdirSync(dirname(target), { recursive: true });
213
+ writeFileSync(target, content);
214
+ }
98
215
  }
99
216
  return text(artifact);
100
217
  });
101
218
  server.registerTool("validate_driver", {
102
219
  title: "Validate driver",
103
220
  description: "Static-lint a completed driver against its source datasheet `ref`: thin-HAL purity, no leftover TODO(driverge), register/command references exist, bit-field masks match the JSON.",
104
- inputSchema: { ref: z.string(), target: TARGET.optional(), files: FILES },
221
+ inputSchema: { ref: z.string(), files: FILES },
105
222
  }, async ({ ref, files }) => {
106
223
  const entry = getDatasheet(ref);
107
224
  if (!entry)
@@ -127,8 +244,19 @@ export function registerDrivergeTools(server) {
127
244
  return text(`unknown ref "${ref}"`, true);
128
245
  return text(validateDatasheet(entry.json));
129
246
  }
130
- if (json)
131
- return text(validateDatasheet(json));
247
+ if (json) {
248
+ // S5: structural parse before validateDatasheet ever dereferences the
249
+ // shape — a hand-typed/malformed blob must fail cleanly, not throw a
250
+ // raw TypeError from deep inside the validator.
251
+ const parsed = DATASHEET_JSON_GUARD.safeParse(json);
252
+ if (!parsed.success) {
253
+ const issues = parsed.error.issues
254
+ .map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`)
255
+ .join("; ");
256
+ return text(`invalid datasheet JSON — ${issues}`, true);
257
+ }
258
+ return text(validateDatasheet(parsed.data));
259
+ }
132
260
  return text("provide either `ref` or `json`", true);
133
261
  });
134
262
  }
@@ -164,18 +292,18 @@ export function registerDrivergeResources(server) {
164
292
  export function registerDrivergePrompts(server) {
165
293
  server.registerPrompt("generate-driver", {
166
294
  title: "Generate a driver",
167
- description: "Guided flow: render the skeleton for a ref/target, complete the TODO(driverge) markers using the datasheet resource, then validate.",
168
- argsSchema: { ref: z.string(), target: z.string().optional() },
169
- }, ({ ref, target }) => ({
295
+ description: "Guided flow: render the skeleton for a ref/target/language, complete the TODO(driverge) markers using the datasheet resource, then validate.",
296
+ argsSchema: { ref: z.string(), target: z.string().optional(), language: z.string().optional() },
297
+ }, ({ ref, target, language }) => ({
170
298
  messages: [
171
299
  {
172
300
  role: "user",
173
301
  content: {
174
302
  type: "text",
175
303
  text: [
176
- `Generate an embedded driver for datasheet ref "${ref}" (target: ${target ?? "portable"}).`,
304
+ `Generate an embedded driver for datasheet ref "${ref}" (target: ${target ?? "portable"}, language: ${language ?? "c"}).`,
177
305
  "",
178
- `1. Call generate_driver({ ref: "${ref}", target: "${target ?? "portable"}" }).`,
306
+ `1. Call generate_driver({ ref: "${ref}", target: "${target ?? "portable"}", language: "${language ?? "c"}" }) — language is optional and defaults to "c" (struct + free functions); pass "cpp" for a C++ class wrapper (.hpp/.cpp) around the same #define macros and hal_* seam.`,
179
307
  `2. Read driverge://datasheet/${ref} for full register/command detail.`,
180
308
  "3. Complete every TODO(driverge) marker using the fill_in_brief and the datasheet JSON — init sequence, vendor quirks, docs (and CRC for command-set parts).",
181
309
  "4. Keep all bus access on the hal_* seam; never call a vendor peripheral API directly.",
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/mcp/register.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/mcp/register.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,gFAAgF;AAChF,2DAA2D;AAE3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AACjE,yEAAyE;AACzE,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AACtC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;AAE3E,sEAAsE;AACtE,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACrC,CAAC,CAAC;AACH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CACpF,CAAC,CAAC;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACpD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;IAClF,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;CAChF,CAAC,CAAC;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC5C,SAAS,EAAE,gBAAgB;IAC3B,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACnC,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC,KAAK,EAAE,CAAC;AAMX,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,OAAO,GAAG,KAAK,EAAc,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE;QACP;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SACzE;KACF;IACD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACtC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,2EAA2E;AAC3E,uDAAuD;AACvD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,QAAgB;IACnE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,qCAAqC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5E,OAAO,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,OAAO,CAAC,KAAK,CACX,sFAAsF,CACvF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,gMAAgM;QAClM,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACnE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACxC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE;SACxE;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,EAAE,EAAE;QAC7D,uEAAuE;QACvE,0EAA0E;QAC1E,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,mBAAmB,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,0EAA0E;QAC1E,mEAAmE;QACnE,iEAAiE;QACjE,MAAM,GAAG,GAAG,UAAU,CACpB,QAAQ,EACR,OAAO,EACP,GAAG,iBAAiB,IAAI,EAAE,IAAI,mBAAmB,IAAI,EAAE,EAAE,CAC1D,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9C,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,wBAAyB,GAAa,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CACT,kFAAkF,EAClF,IAAI,CACL,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,EAAE;YACvC,gBAAgB,EAAE,iBAAiB;YACnC,iBAAiB,EAAE,mBAAmB;SACvC,CAAC,CAAC;QACH,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,sUAAsU;QACxU,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;YAClC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC/B;KACF,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,gBAAgB,GAAG,iCAAiC,EAAE,IAAI,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,IAAI,CACT;gBACE,KAAK,EAAE,+CAA+C;gBACtD,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;aACrC,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,MAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,sBAAsB;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1E,IAAI,GAAG,YAAY,mBAAmB;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,yEAAyE;YACzE,yEAAyE;YACzE,uEAAuE;YACvE,iDAAiD;YACjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAChD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CACT,YAAY,OAAO,+BAA+B,YAAY,wCAAwC,EACtG,IAAI,CACL,CAAC;YACJ,CAAC;YACD,oEAAoE;YACpE,+DAA+D;YAC/D,oEAAoE;YACpE,sEAAsE;YACtE,MAAM,OAAO,GAA0C,EAAE,CAAC;YAC1D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACxD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,IAAI,CACT,wBAAwB,CAAC,CAAC,IAAI,mCAAmC,WAAW,gCAAgC,EAC5G,IAAI,CACL,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;YACD,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC1C,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,oLAAoL;QACtL,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;KAC/C,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,gBAAgB,GAAG,iCAAiC,EAAE,IAAI,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;YACV,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,kJAAkJ;QACpJ,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;SACnD;KACF,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,gBAAgB,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,sEAAsE;YACtE,qEAAqE;YACrE,gDAAgD;YAChD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;qBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,IAAI,CAAC,4BAA4B,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAgC,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,gCAAgC,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,mBAAmB,EACnB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,iEAAiE;QAC9E,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;KAC9E,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,gBAAgB,EAChB,IAAI,gBAAgB,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EACvE;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,GAAG,CAAC,CAAC;QAC9D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,cAAc,CACnB,iBAAiB,EACjB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,8IAA8I;QAChJ,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;KAChG,EACD,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,kDAAkD,GAAG,cAAc,MAAM,IAAI,UAAU,eAAe,QAAQ,IAAI,GAAG,IAAI;wBACzH,EAAE;wBACF,mCAAmC,GAAG,eAAe,MAAM,IAAI,UAAU,iBAAiB,QAAQ,IAAI,GAAG,0KAA0K;wBACnR,gCAAgC,GAAG,oCAAoC;wBACvE,8JAA8J;wBAC9J,wFAAwF;wBACxF,mCAAmC,GAAG,8EAA8E;qBACrH,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -26,6 +26,14 @@ export function buildSummary(entry) {
26
26
  interface: { kind: json.interface.kind },
27
27
  protocol_summary: protocolSummary,
28
28
  counts,
29
+ ...(json.extraction
30
+ ? {
31
+ extraction: {
32
+ status: json.extraction.status,
33
+ detected_pages: json.extraction.detectedPages,
34
+ },
35
+ }
36
+ : {}),
29
37
  validation: {
30
38
  passed: json.validation.valid,
31
39
  warnings: json.validation.warnings,
@@ -1 +1 @@
1
- {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/mcp/summary.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,yEAAyE;AACzE,kCAAkC;AAIlC,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GACV,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc;QACpC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE;QAChD,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC5B,MAAM,eAAe,GAAG;QACtB,KAAK,CAAC,GAAG;QACT,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAC9E,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,SAAS;KAC5D;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,GAAG;QACH,QAAQ,EAAE;YACR,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC/B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;YACxC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB;YAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC/B,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;SACpC;QACD,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACxC,gBAAgB,EAAE,eAAe;QACjC,MAAM;QACN,UAAU,EAAE;YACV,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;YAC7B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;YAClC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;SAC/B;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/mcp/summary.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,yEAAyE;AACzE,kCAAkC;AAIlC,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GACV,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc;QACpC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE;QAChD,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC5B,MAAM,eAAe,GAAG;QACtB,KAAK,CAAC,GAAG;QACT,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAC9E,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,SAAS;KAC5D;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,GAAG;QACH,QAAQ,EAAE;YACR,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC/B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;YACxC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB;YAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC/B,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;SACpC;QACD,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACxC,gBAAgB,EAAE,eAAe;QACjC,MAAM;QACN,GAAG,CAAC,IAAI,CAAC,UAAU;YACjB,CAAC,CAAC;gBACE,UAAU,EAAE;oBACV,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;oBAC9B,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;iBAC9C;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,UAAU,EAAE;YACV,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;YAC7B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;YAClC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;SAC/B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Canonicalize a register-address cell to "0xNN", or undefined if it isn't one. */
2
+ export declare function normalizeRegisterAddress(raw: string): string | undefined;
3
+ /** True when a cell reads as a single register address. */
4
+ export declare function isRegisterAddress(raw: string): boolean;
@@ -0,0 +1,28 @@
1
+ // Shared register-address recognition/normalization for the register-table
2
+ // extractors. A register address cell appears in several vendor forms — "0xF4"
3
+ // (Bosch), "00" bare hex (Microchip), "8h"/"10h" (TI), "22" bare hex (ST) — all
4
+ // of which normalize to a canonical "0xNN" (min two upper-hex digits). Binary
5
+ // columns and ranges deliberately do NOT match, so a "Register address (Binary)"
6
+ // or a "2E-34" reserved span is never mistaken for a single register address.
7
+ const FORMS = [
8
+ /^0x([0-9a-f]{1,4})$/i, // 0xF4, 0x00
9
+ /^([0-9a-f]{1,4})h$/i, // 8h, 10h, F4h
10
+ /^([0-9a-f]{1,2})$/i, // bare 1-2 hex digits: 00, 22, 2A (register offsets)
11
+ ];
12
+ /** Canonicalize a register-address cell to "0xNN", or undefined if it isn't one. */
13
+ export function normalizeRegisterAddress(raw) {
14
+ const s = raw.trim();
15
+ for (const re of FORMS) {
16
+ const m = re.exec(s);
17
+ if (m) {
18
+ const hex = m[1].toUpperCase();
19
+ return `0x${hex.padStart(2, "0")}`;
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ /** True when a cell reads as a single register address. */
25
+ export function isRegisterAddress(raw) {
26
+ return normalizeRegisterAddress(raw) !== undefined;
27
+ }
28
+ //# sourceMappingURL=address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/pdf/address.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,8EAA8E;AAE9E,MAAM,KAAK,GAAsB;IAC/B,sBAAsB,EAAE,eAAe;IACvC,qBAAqB,EAAE,kBAAkB;IACzC,oBAAoB,EAAE,yDAAyD;CAChF,CAAC;AAEF,oFAAoF;AACpF,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,wBAAwB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;AACrD,CAAC"}
@@ -21,32 +21,105 @@ function normalizeName(raw) {
21
21
  /** L4b — bus + device addresses. */
22
22
  export function extractProtocol(pages) {
23
23
  const text = joinText(pages);
24
- const bus = /\bI(?:2|²)C\b/i.test(text)
24
+ // SSC/SPC are Infineon's SPI-family serial names (e.g. TLE5014), so treat them
25
+ // as SPI when neither I2C nor a plain "SPI" mention is present.
26
+ // pdfjs renders the "I²C" superscript as separate tokens ("I 2 C"), so a
27
+ // single optional space is tolerated between I/2/C. The trailing \b is kept
28
+ // so "I 2 CHANNELS" (C directly followed by more letters) does not match.
29
+ // SMBus is folded into this same I2C-tier check (evaluated before the SPI
30
+ // branch): SMBus is I2C-compatible at the electrical/protocol level, and
31
+ // sheets that only ever say "SMBus" (e.g. MLX90614) never spell out "I2C",
32
+ // so without this the bus would wrongly resolve to "unknown". Once bus
33
+ // resolves "I2C" the existing `if (bus === "I2C")` address gate fires
34
+ // unchanged — the generated hal_i2c_* seam is correct for SMBus parts.
35
+ // Session B — UART tier. This MUST stay last: multi-interface sheets (e.g. a
36
+ // part offered in both I2C/SPI and UART variants) list I2C/SPI first-class,
37
+ // so those tiers get first refusal above. "UART" and its cousins (RS-232/485
38
+ // are electrically distinct but frame the same way over a UART peripheral;
39
+ // "TTL serial" is the same asynchronous serial link at logic-level voltages)
40
+ // also turn up incidentally in appnote/pinout prose on I2C/SPI datasheets
41
+ // (e.g. "connect via a TTL serial debug adapter"), so resolving this tier
42
+ // before I2C/SPI would misclassify those parts. UART has no bus device
43
+ // address, so — like SPI — address extraction stays gated on I2C only below.
44
+ //
45
+ // Session C — CAN tier. Sits AFTER I2C/SPI/UART for the same multi-interface-
46
+ // sheet reason as UART above. "CAN" is unusual among these bus keywords: it is
47
+ // ALSO a common English modal verb ("the sensor CAN operate in low power
48
+ // mode"), so a bare case-insensitive match would false-positive constantly.
49
+ // Detection therefore needs two tiers of its own: an explicit phrase ("CAN
50
+ // bus", "CAN 2.0[AB]", "CAN FD") is unambiguous on its own; short of that, a
51
+ // literal uppercase "CAN" (case-SENSITIVE — the modal verb is virtually never
52
+ // written in all-caps in running prose) must co-occur with vocabulary that is
53
+ // unique to the CAN protocol (arbitration, DLC, "CAN controller", an
54
+ // acceptance filter) before it resolves. Like UART, CAN has no universal
55
+ // register-access primitive on the wire (CANopen SDO / J1939 PGN / raw
56
+ // message-ID schemes are all device-specific), so address extraction stays
57
+ // gated on I2C only below.
58
+ const CAN_PHRASE = /\bCAN\s?(?:bus|2\.0[AB]?|FD)\b/i;
59
+ const CAN_VOCAB = /\barbitration\b/i.test(text) ||
60
+ /\bDLC\b/.test(text) ||
61
+ /\bCAN\s+controller\b/i.test(text) ||
62
+ /\bacceptance\s+filter/i.test(text);
63
+ const bus = /\bI\s?(?:2|²)\s?C\b/i.test(text) || /\bSMBus\b/i.test(text)
25
64
  ? "I2C"
26
- : /\bSPI\b/.test(text)
65
+ : /\bSPI\b|\bSSC\b|\bSPC\b/.test(text)
27
66
  ? "SPI"
28
- : "unknown";
67
+ : /\bUART\b/.test(text) || /\bRS-?(?:232|485)\b/i.test(text) || /\bTTL\s+serial\b/i.test(text)
68
+ ? "UART"
69
+ : CAN_PHRASE.test(text) || (/\bCAN\b/.test(text) && CAN_VOCAB)
70
+ ? "CAN"
71
+ : "unknown";
29
72
  const addresses = [];
30
- // Within each "address …" window, collect every plausible 7-bit I2C address.
31
- for (const ctx of text.matchAll(/address[^.]{0,60}/gi)) {
32
- for (const m of ctx[0].matchAll(/0x[0-7][0-9a-f]/gi)) {
33
- const addr = upperHex(m[0]);
34
- const value = Number.parseInt(addr, 16);
35
- if (value >= 0x08 && value <= 0x77 && !addresses.includes(addr)) {
36
- addresses.push(addr);
73
+ // Only I2C has a bus device address. Scanning for "0xNN near 'address'" on an
74
+ // SPI datasheet yields register offsets, not addresses (e.g. AEAT-8811), so we
75
+ // gate address extraction on the I2C bus.
76
+ if (bus === "I2C") {
77
+ for (const ctx of text.matchAll(/address[^.]{0,60}/gi)) {
78
+ for (const m of ctx[0].matchAll(/0x[0-7][0-9a-f]/gi)) {
79
+ const addr = upperHex(m[0]);
80
+ const value = Number.parseInt(addr, 16);
81
+ if (value >= 0x08 && value <= 0x77 && !addresses.includes(addr)) {
82
+ addresses.push(addr);
83
+ }
37
84
  }
38
85
  }
39
86
  }
40
87
  return addresses.length > 0 ? { bus, addresses } : { bus };
41
88
  }
89
+ /** Parse a CRC polynomial written as an expression, e.g. "1+X 4 +X 5 +X 8"
90
+ * (pdfjs renders superscripts as separate tokens). Drops the implicit highest
91
+ * term (x^width) and returns the truncated poly byte. */
92
+ function polyFromExpression(text) {
93
+ const m = /polynomial[^.]{0,80}/i.exec(text);
94
+ if (!m)
95
+ return undefined;
96
+ const expr = m[0];
97
+ const exps = [...expr.matchAll(/x\s*\^?\s*(\d+)/gi)].map((e) => Number(e[1]));
98
+ if (exps.length === 0)
99
+ return undefined;
100
+ const width = Math.max(...exps);
101
+ const bits = new Set(exps.filter((e) => e < width));
102
+ if (/[=+]\s*1\b/.test(expr) || /\b1\s*\+/.test(expr))
103
+ bits.add(0); // the "+1"/"1+" constant term
104
+ let poly = 0;
105
+ for (const b of bits)
106
+ poly |= 1 << b;
107
+ return { poly: `0x${poly.toString(16).toUpperCase().padStart(2, "0")}`, width };
108
+ }
42
109
  /** L4b — CRC parameters from the checksum section. */
43
110
  export function extractCrc(pages) {
44
111
  const text = joinText(pages);
45
- const poly = /polynomial\s+(0x[0-9a-f]{2})/i.exec(text);
46
- const init = /initiali[sz]ation\s+(0x[0-9a-f]{2})/i.exec(text);
47
- if (!poly || !init)
112
+ const init = /initiali[sz]ation\s+(0x[0-9a-f]{2})/i.exec(text) ??
113
+ /initial\s+value[^.]{0,40}?(0x[0-9a-f]{2})/i.exec(text);
114
+ if (!init)
115
+ return undefined;
116
+ const polyHex = /polynomial\s+(0x[0-9a-f]{2})/i.exec(text);
117
+ const poly = polyHex
118
+ ? { poly: upperHex(polyHex[1]), width: 8 }
119
+ : polyFromExpression(text);
120
+ if (!poly)
48
121
  return undefined;
49
- return { poly: upperHex(poly[1]), init: upperHex(init[1]), width: 8 };
122
+ return { poly: poly.poly, init: upperHex(init[1]), width: poly.width };
50
123
  }
51
124
  // Only patterns whose NAME is a pure run of letters/spaces are used — a digit or
52
125
  // "0x" in the span means we've crossed into the other text column, so we bail
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/pdf/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/pdf/command.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,28 @@
1
1
  // pdfjs-dist adapter: load a PDF and pull positioned text + an image flag from
2
2
  // every page. The legacy build is the Node-friendly entry (and ships types).
3
+ //
4
+ // hasImage is lazy (Session 10, Phase 4): it is only meaningful — and only
5
+ // computed — for sparse-text pages, i.e. exactly the pages classifyPage()
6
+ // consults it for (textLength < MIN_TEXT_CHARS). A text-rich page always
7
+ // reports hasImage === false without walking its operator list, even if it
8
+ // does paint a raster (logo/figure): nothing reads that value, so paying for
9
+ // getOperatorList() there would be wasted work on the majority of pages in a
10
+ // real datasheet.
3
11
  import { getDocument, OPS } from "pdfjs-dist/legacy/build/pdf.mjs";
12
+ import { MIN_TEXT_CHARS } from "./classify.js";
4
13
  const IMAGE_OPS = new Set([
5
14
  OPS.paintImageXObject,
6
15
  OPS.paintInlineImageXObject,
7
16
  OPS.paintImageMaskXObject,
8
17
  ]);
9
18
  export async function extractPages(data) {
19
+ // S3 hardening note: earlier pdfjs-dist versions accepted `isEvalSupported`
20
+ // to stop it from `new Function(...)`-evaluating embedded Type3/PostScript
21
+ // glyph code on untrusted PDFs (CVE-2024-4367). This install (pdfjs-dist
22
+ // 6.1.200) removed both the option and the eval code path upstream — grep
23
+ // of node_modules/pdfjs-dist finds no `isEvalSupported` or `new Function(`
24
+ // left in the bundle — so there is nothing left here to opt out of. Flagged
25
+ // to the orchestrator; revisit if a future pdfjs-dist bump reintroduces it.
10
26
  const task = getDocument({ data });
11
27
  const pdf = await task.promise;
12
28
  try {
@@ -32,8 +48,13 @@ export async function extractPages(data) {
32
48
  .join(" ")
33
49
  .replace(/\s+/g, " ")
34
50
  .trim();
35
- const opList = await page.getOperatorList();
36
- const hasImage = opList.fnArray.some((fn) => IMAGE_OPS.has(fn));
51
+ // Only pay for the operator-list walk on sparse-text pages: that is
52
+ // the only case classifyPage() reads hasImage for.
53
+ let hasImage = false;
54
+ if (text.length < MIN_TEXT_CHARS) {
55
+ const opList = await page.getOperatorList();
56
+ hasImage = opList.fnArray.some((fn) => IMAGE_OPS.has(fn));
57
+ }
37
58
  pages.push({ index: n, text, items, hasImage });
38
59
  page.cleanup();
39
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/pdf/extract.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAE7E,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAGnE,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC;IAC7C,GAAG,CAAC,iBAAiB;IACrB,GAAG,CAAC,uBAAuB;IAC3B,GAAG,CAAC,qBAAqB;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB;IACjD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,KAAK,GAAqB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACrC,uDAAuD;gBACvD,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;oBAAE,SAAS;gBAC/B,KAAK,CAAC,IAAI,CAAC;oBACT,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBACpB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBACpB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,KAAK;iBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;iBACjB,IAAI,CAAC,GAAG,CAAC;iBACT,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,IAAI,EAAE,CAAC;YAEV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAEhE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/pdf/extract.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,2EAA2E;AAC3E,6EAA6E;AAC7E,6EAA6E;AAC7E,kBAAkB;AAElB,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC;IAC7C,GAAG,CAAC,iBAAiB;IACrB,GAAG,CAAC,uBAAuB;IAC3B,GAAG,CAAC,qBAAqB;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB;IACjD,4EAA4E;IAC5E,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAElC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,KAAK,GAAqB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACrC,uDAAuD;gBACvD,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;oBAAE,SAAS;gBAC/B,KAAK,CAAC,IAAI,CAAC;oBACT,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBACpB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oBACpB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,KAAK;iBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;iBACjB,IAAI,CAAC,GAAG,CAAC;iBACT,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,IAAI,EAAE,CAAC;YAEV,oEAAoE;YACpE,mDAAmD;YACnD,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC5C,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PageContent, RegisterTable } from "./types.js";
2
+ /** Parse a generic register map from a single page, if it holds one. */
3
+ export declare function parseGenericRegisterTable(page: PageContent): RegisterTable | undefined;
4
+ /** Scan pages; return the first qualifying generic register table (≥ MIN_ROWS). */
5
+ export declare function findGenericRegisterTable(pages: PageContent[]): RegisterTable | undefined;