@yadsh/dsh-qa-surface 0.6.1 → 0.7.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 (287) hide show
  1. package/README.md +163 -7
  2. package/capability-policy.json +1 -1
  3. package/lib/access/capability-catalog.js +144 -0
  4. package/lib/access/capability-catalog.js.map +1 -0
  5. package/lib/access/model.js +379 -0
  6. package/lib/access/model.js.map +1 -0
  7. package/lib/access/role-repository.js +195 -0
  8. package/lib/access/role-repository.js.map +1 -0
  9. package/lib/access/service.js +380 -0
  10. package/lib/access/service.js.map +1 -0
  11. package/lib/access/skill-metadata.js +234 -0
  12. package/lib/access/skill-metadata.js.map +1 -0
  13. package/lib/account-remotes.js +20 -10
  14. package/lib/account-remotes.js.map +1 -1
  15. package/lib/accounts/errors.js.map +1 -1
  16. package/lib/accounts/file.js.map +1 -1
  17. package/lib/accounts/store.js +202 -3
  18. package/lib/accounts/store.js.map +1 -1
  19. package/lib/admin/conversation-log.js +256 -0
  20. package/lib/admin/conversation-log.js.map +1 -0
  21. package/lib/admin/index.js +17 -0
  22. package/lib/admin/index.js.map +1 -0
  23. package/lib/admin/metrics.js +103 -0
  24. package/lib/admin/metrics.js.map +1 -0
  25. package/lib/admin/paging.js +23 -0
  26. package/lib/admin/paging.js.map +1 -0
  27. package/lib/admin/permissions.js +50 -0
  28. package/lib/admin/permissions.js.map +1 -0
  29. package/lib/admin/quality-store.js +485 -0
  30. package/lib/admin/quality-store.js.map +1 -0
  31. package/lib/admin/queue.js +107 -0
  32. package/lib/admin/queue.js.map +1 -0
  33. package/lib/admin/redaction.js +45 -0
  34. package/lib/admin/redaction.js.map +1 -0
  35. package/lib/admin/service.js +897 -0
  36. package/lib/admin/service.js.map +1 -0
  37. package/lib/admin/session-log.js +142 -0
  38. package/lib/admin/session-log.js.map +1 -0
  39. package/lib/cli.js +9 -6
  40. package/lib/cli.js.map +1 -1
  41. package/lib/client/QaSessionController.js +28 -2
  42. package/lib/client/QaSessionController.js.map +1 -1
  43. package/lib/client/QaSurface.js +143 -5
  44. package/lib/client/QaSurface.js.map +1 -1
  45. package/lib/client/QaTranscriptAdapter.js +1 -0
  46. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  47. package/lib/client/admin/QaAdmin.js +458 -0
  48. package/lib/client/admin/QaAdmin.js.map +1 -0
  49. package/lib/client/admin/format.js +177 -0
  50. package/lib/client/admin/format.js.map +1 -0
  51. package/lib/client/admin/pages/Conversations.js +114 -0
  52. package/lib/client/admin/pages/Conversations.js.map +1 -0
  53. package/lib/client/admin/pages/Overview.js +24 -0
  54. package/lib/client/admin/pages/Overview.js.map +1 -0
  55. package/lib/client/admin/pages/Quality.js +71 -0
  56. package/lib/client/admin/pages/Quality.js.map +1 -0
  57. package/lib/client/admin/pages/Review.js +93 -0
  58. package/lib/client/admin/pages/Review.js.map +1 -0
  59. package/lib/client/admin/pages/Users.js +95 -0
  60. package/lib/client/admin/pages/Users.js.map +1 -0
  61. package/lib/client/admin/routes.js +143 -0
  62. package/lib/client/admin/routes.js.map +1 -0
  63. package/lib/client/admin/shared.js +91 -0
  64. package/lib/client/admin/shared.js.map +1 -0
  65. package/lib/client/admin/styles.js +111 -0
  66. package/lib/client/admin/styles.js.map +1 -0
  67. package/lib/client/components/QaChangelog.js +53 -0
  68. package/lib/client/components/QaChangelog.js.map +1 -1
  69. package/lib/client/components/QaHeader.js +3 -3
  70. package/lib/client/components/QaHeader.js.map +1 -1
  71. package/lib/client/components/QaMessage.js +61 -2
  72. package/lib/client/components/QaMessage.js.map +1 -1
  73. package/lib/client/create-session.js +1 -1
  74. package/lib/client/create-session.js.map +1 -1
  75. package/lib/client/index.js +48 -1
  76. package/lib/client/index.js.map +1 -1
  77. package/lib/client/role/RoleSelector.js +31 -0
  78. package/lib/client/role/RoleSelector.js.map +1 -0
  79. package/lib/client/session-sources.js +37 -1
  80. package/lib/client/session-sources.js.map +1 -1
  81. package/lib/client/settings/card.js +2 -2
  82. package/lib/client/settings/card.js.map +1 -1
  83. package/lib/client/settings/sections.js +0 -1
  84. package/lib/client/settings/sections.js.map +1 -1
  85. package/lib/client/settings-extensions/index.js +1 -0
  86. package/lib/client/settings-extensions/index.js.map +1 -1
  87. package/lib/client/settings-extensions/user-session.js +62 -0
  88. package/lib/client/settings-extensions/user-session.js.map +1 -0
  89. package/lib/client/styles.js +31 -0
  90. package/lib/client/styles.js.map +1 -1
  91. package/lib/client/types.js.map +1 -1
  92. package/lib/client.js +9993 -4848
  93. package/lib/client.js.map +1 -1
  94. package/lib/config-resolvers/defaults.js +0 -2
  95. package/lib/config-resolvers/defaults.js.map +1 -1
  96. package/lib/config.js +0 -249
  97. package/lib/config.js.map +1 -1
  98. package/lib/enforcement/skill-policy.js +172 -0
  99. package/lib/enforcement/skill-policy.js.map +1 -0
  100. package/lib/enforcement/tool-grants.js +151 -0
  101. package/lib/enforcement/tool-grants.js.map +1 -0
  102. package/lib/index.js +224 -42
  103. package/lib/index.js.map +1 -1
  104. package/lib/personal-skills/service.js +10 -3
  105. package/lib/personal-skills/service.js.map +1 -1
  106. package/lib/qa-tools/index.js +4 -0
  107. package/lib/qa-tools/index.js.map +1 -1
  108. package/lib/resolve-config.js +0 -2
  109. package/lib/resolve-config.js.map +1 -1
  110. package/lib/secure-session.js +71 -17
  111. package/lib/secure-session.js.map +1 -1
  112. package/lib/typert.host.js +2237 -202
  113. package/lib/typert.remote-client.d.ts +49 -3
  114. package/lib/typert.remote-client.js +1863 -183
  115. package/lib/types/access/capability-catalog.d.ts +37 -0
  116. package/lib/types/access/model.d.ts +60 -0
  117. package/lib/types/access/role-repository.d.ts +32 -0
  118. package/lib/types/access/service.d.ts +57 -0
  119. package/lib/types/access/skill-metadata.d.ts +53 -0
  120. package/lib/types/account-remotes.d.ts +6 -0
  121. package/lib/types/accounts/errors.d.ts +1 -1
  122. package/lib/types/accounts/file.d.ts +16 -5
  123. package/lib/types/accounts/store.d.ts +83 -3
  124. package/lib/types/admin/conversation-log.d.ts +39 -0
  125. package/lib/types/admin/index.d.ts +24 -0
  126. package/lib/types/admin/metrics.d.ts +29 -0
  127. package/lib/types/admin/paging.d.ts +33 -0
  128. package/lib/types/admin/permissions.d.ts +10 -0
  129. package/lib/types/admin/quality-store.d.ts +82 -0
  130. package/lib/types/admin/queue.d.ts +21 -0
  131. package/lib/types/admin/redaction.d.ts +29 -0
  132. package/lib/types/admin/service.d.ts +105 -0
  133. package/lib/types/admin/session-log.d.ts +53 -0
  134. package/lib/types/client/QaSessionController.d.ts +12 -1
  135. package/lib/types/client/QaSurface.d.ts +7 -1
  136. package/lib/types/client/admin/QaAdmin.d.ts +17 -0
  137. package/lib/types/client/admin/format.d.ts +43 -0
  138. package/lib/types/client/admin/pages/Conversations.d.ts +21 -0
  139. package/lib/types/client/admin/pages/Overview.d.ts +13 -0
  140. package/lib/types/client/admin/pages/Quality.d.ts +18 -0
  141. package/lib/types/client/admin/pages/Review.d.ts +15 -0
  142. package/lib/types/client/admin/pages/Users.d.ts +22 -0
  143. package/lib/types/client/admin/routes.d.ts +60 -0
  144. package/lib/types/client/admin/shared.d.ts +53 -0
  145. package/lib/types/client/admin/styles.d.ts +11 -0
  146. package/lib/types/client/components/QaHeader.d.ts +5 -1
  147. package/lib/types/client/components/QaMessage.d.ts +14 -1
  148. package/lib/types/client/create-session.d.ts +2 -0
  149. package/lib/types/client/role/RoleSelector.d.ts +14 -0
  150. package/lib/types/client/session-sources.d.ts +9 -0
  151. package/lib/types/client/settings/sections.d.ts +0 -1
  152. package/lib/types/client/settings-extensions/index.d.ts +2 -0
  153. package/lib/types/client/settings-extensions/user-session.d.ts +59 -0
  154. package/lib/types/client/types.d.ts +39 -2
  155. package/lib/types/enforcement/skill-policy.d.ts +29 -0
  156. package/lib/types/enforcement/tool-grants.d.ts +84 -0
  157. package/lib/types/index.d.ts +62 -14
  158. package/lib/types/qa-tools/index.d.ts +2 -0
  159. package/lib/types/secure-session.d.ts +10 -1
  160. package/lib/types/types.d.ts +568 -5
  161. package/package.json +2 -2
  162. package/lib/client/settings/sections/documents.js +0 -88
  163. package/lib/client/settings/sections/documents.js.map +0 -1
  164. package/lib/documents/artifacts/ids.js +0 -43
  165. package/lib/documents/artifacts/ids.js.map +0 -1
  166. package/lib/documents/artifacts/manifest.js +0 -66
  167. package/lib/documents/artifacts/manifest.js.map +0 -1
  168. package/lib/documents/artifacts/store.js +0 -169
  169. package/lib/documents/artifacts/store.js.map +0 -1
  170. package/lib/documents/capabilities.js +0 -93
  171. package/lib/documents/capabilities.js.map +0 -1
  172. package/lib/documents/config.js +0 -302
  173. package/lib/documents/config.js.map +0 -1
  174. package/lib/documents/defaults.js +0 -78
  175. package/lib/documents/defaults.js.map +0 -1
  176. package/lib/documents/errors.js +0 -101
  177. package/lib/documents/errors.js.map +0 -1
  178. package/lib/documents/index.js +0 -80
  179. package/lib/documents/index.js.map +0 -1
  180. package/lib/documents/inspect/facts.js +0 -161
  181. package/lib/documents/inspect/facts.js.map +0 -1
  182. package/lib/documents/inspect/zip.js +0 -108
  183. package/lib/documents/inspect/zip.js.map +0 -1
  184. package/lib/documents/markdown/directives.js +0 -135
  185. package/lib/documents/markdown/directives.js.map +0 -1
  186. package/lib/documents/markdown/frontmatter.js +0 -35
  187. package/lib/documents/markdown/frontmatter.js.map +0 -1
  188. package/lib/documents/markdown/normalize.js +0 -113
  189. package/lib/documents/markdown/normalize.js.map +0 -1
  190. package/lib/documents/orchestrator/assets.js +0 -243
  191. package/lib/documents/orchestrator/assets.js.map +0 -1
  192. package/lib/documents/orchestrator/convert-document.js +0 -186
  193. package/lib/documents/orchestrator/convert-document.js.map +0 -1
  194. package/lib/documents/orchestrator/create-document.js +0 -292
  195. package/lib/documents/orchestrator/create-document.js.map +0 -1
  196. package/lib/documents/orchestrator/extract-document.js +0 -162
  197. package/lib/documents/orchestrator/extract-document.js.map +0 -1
  198. package/lib/documents/orchestrator/inspect-document.js +0 -89
  199. package/lib/documents/orchestrator/inspect-document.js.map +0 -1
  200. package/lib/documents/orchestrator/runtime-deps.js +0 -59
  201. package/lib/documents/orchestrator/runtime-deps.js.map +0 -1
  202. package/lib/documents/orchestrator/scope.js +0 -132
  203. package/lib/documents/orchestrator/scope.js.map +0 -1
  204. package/lib/documents/providers/docling.js +0 -247
  205. package/lib/documents/providers/docling.js.map +0 -1
  206. package/lib/documents/providers/libreoffice.js +0 -130
  207. package/lib/documents/providers/libreoffice.js.map +0 -1
  208. package/lib/documents/providers/markitdown.js +0 -89
  209. package/lib/documents/providers/markitdown.js.map +0 -1
  210. package/lib/documents/providers/pandoc.js +0 -161
  211. package/lib/documents/providers/pandoc.js.map +0 -1
  212. package/lib/documents/providers/process.js +0 -164
  213. package/lib/documents/providers/process.js.map +0 -1
  214. package/lib/documents/providers/registry.js +0 -152
  215. package/lib/documents/providers/registry.js.map +0 -1
  216. package/lib/documents/providers/shared.js +0 -75
  217. package/lib/documents/providers/shared.js.map +0 -1
  218. package/lib/documents/runtime.js +0 -114
  219. package/lib/documents/runtime.js.map +0 -1
  220. package/lib/documents/security/file-types.js +0 -188
  221. package/lib/documents/security/file-types.js.map +0 -1
  222. package/lib/documents/security/limits.js +0 -78
  223. package/lib/documents/security/limits.js.map +0 -1
  224. package/lib/documents/security/mime.js +0 -43
  225. package/lib/documents/security/mime.js.map +0 -1
  226. package/lib/documents/security/paths.js +0 -133
  227. package/lib/documents/security/paths.js.map +0 -1
  228. package/lib/documents/templates/registry.js +0 -147
  229. package/lib/documents/templates/registry.js.map +0 -1
  230. package/lib/documents/templates/resolver.js +0 -59
  231. package/lib/documents/templates/resolver.js.map +0 -1
  232. package/lib/documents/tools/convert.js +0 -125
  233. package/lib/documents/tools/convert.js.map +0 -1
  234. package/lib/documents/tools/create.js +0 -187
  235. package/lib/documents/tools/create.js.map +0 -1
  236. package/lib/documents/tools/index.js +0 -41
  237. package/lib/documents/tools/index.js.map +0 -1
  238. package/lib/documents/tools/inspect.js +0 -135
  239. package/lib/documents/tools/inspect.js.map +0 -1
  240. package/lib/documents/tools/shared.js +0 -88
  241. package/lib/documents/tools/shared.js.map +0 -1
  242. package/lib/documents/tools/to-markdown.js +0 -125
  243. package/lib/documents/tools/to-markdown.js.map +0 -1
  244. package/lib/documents/types.js +0 -12
  245. package/lib/documents/types.js.map +0 -1
  246. package/lib/types/client/settings/sections/documents.d.ts +0 -13
  247. package/lib/types/documents/artifacts/ids.d.ts +0 -14
  248. package/lib/types/documents/artifacts/manifest.d.ts +0 -32
  249. package/lib/types/documents/artifacts/store.d.ts +0 -67
  250. package/lib/types/documents/capabilities.d.ts +0 -32
  251. package/lib/types/documents/config.d.ts +0 -27
  252. package/lib/types/documents/defaults.d.ts +0 -161
  253. package/lib/types/documents/errors.d.ts +0 -42
  254. package/lib/types/documents/index.d.ts +0 -63
  255. package/lib/types/documents/inspect/facts.d.ts +0 -43
  256. package/lib/types/documents/inspect/zip.d.ts +0 -28
  257. package/lib/types/documents/markdown/directives.d.ts +0 -39
  258. package/lib/types/documents/markdown/frontmatter.d.ts +0 -15
  259. package/lib/types/documents/markdown/normalize.d.ts +0 -30
  260. package/lib/types/documents/orchestrator/assets.d.ts +0 -55
  261. package/lib/types/documents/orchestrator/convert-document.d.ts +0 -25
  262. package/lib/types/documents/orchestrator/create-document.d.ts +0 -18
  263. package/lib/types/documents/orchestrator/extract-document.d.ts +0 -24
  264. package/lib/types/documents/orchestrator/inspect-document.d.ts +0 -12
  265. package/lib/types/documents/orchestrator/runtime-deps.d.ts +0 -43
  266. package/lib/types/documents/orchestrator/scope.d.ts +0 -52
  267. package/lib/types/documents/providers/docling.d.ts +0 -54
  268. package/lib/types/documents/providers/libreoffice.d.ts +0 -40
  269. package/lib/types/documents/providers/markitdown.d.ts +0 -28
  270. package/lib/types/documents/providers/pandoc.d.ts +0 -42
  271. package/lib/types/documents/providers/process.d.ts +0 -54
  272. package/lib/types/documents/providers/registry.d.ts +0 -68
  273. package/lib/types/documents/providers/shared.d.ts +0 -27
  274. package/lib/types/documents/runtime.d.ts +0 -59
  275. package/lib/types/documents/security/file-types.d.ts +0 -39
  276. package/lib/types/documents/security/limits.d.ts +0 -24
  277. package/lib/types/documents/security/mime.d.ts +0 -13
  278. package/lib/types/documents/security/paths.d.ts +0 -38
  279. package/lib/types/documents/templates/registry.d.ts +0 -50
  280. package/lib/types/documents/templates/resolver.d.ts +0 -30
  281. package/lib/types/documents/tools/convert.d.ts +0 -9
  282. package/lib/types/documents/tools/create.d.ts +0 -14
  283. package/lib/types/documents/tools/index.d.ts +0 -33
  284. package/lib/types/documents/tools/inspect.d.ts +0 -9
  285. package/lib/types/documents/tools/shared.d.ts +0 -77
  286. package/lib/types/documents/tools/to-markdown.d.ts +0 -12
  287. package/lib/types/documents/types.d.ts +0 -294
@@ -1,161 +0,0 @@
1
- /**
2
- * Document facts read without converting anything (§11).
3
- *
4
- * `document_inspect` must be cheap and safe: it reads the bytes it was given
5
- * and answers what they claim to be. Two tiny readers cover the formats the
6
- * pipeline supports — a PDF dictionary scan and an OOXML package scan — which
7
- * is what makes inspect useful on a 400-page file that nobody wants to render.
8
- */
9
- import { findZipEntry, readZipEntries, readZipEntry, } from "./zip.js";
10
- const PDF_DATE = /^D:(\d{4})(\d{2})(\d{2})(\d{2})?(\d{2})?(\d{2})?/u;
11
- function normalizePdfDate(raw) {
12
- const match = PDF_DATE.exec(raw.trim());
13
- if (match === null)
14
- return undefined;
15
- const [, year, month, day, hour = "00", minute = "00", second = "00"] = match;
16
- return `${year}-${month}-${day}T${hour}:${minute}:${second}Z`;
17
- }
18
- function decodePdfString(raw) {
19
- const literal = /^\((.*)\)$/su.exec(raw.trim());
20
- const value = literal?.[1] ?? raw;
21
- return value
22
- .replace(/\\([nrtbf()\\])/gu, (_all, escape) => {
23
- const map = {
24
- n: "\n",
25
- r: "\r",
26
- t: "\t",
27
- b: "\b",
28
- f: "\f",
29
- };
30
- return map[escape] ?? escape;
31
- })
32
- .replace(/\\(\d{1,3})/gu, (_all, octal) => String.fromCharCode(Number.parseInt(octal, 8)))
33
- .trim();
34
- }
35
- /**
36
- * Read a PDF's page count, encryption flag and document-information entries.
37
- * This is a scan, not a parser: it is immune to malformed cross-reference
38
- * tables (a broken PDF still answers "how many pages does it claim"), and it
39
- * never follows an object stream.
40
- */
41
- export function readPdfFacts(buffer) {
42
- const text = buffer.toString("latin1");
43
- const tail = text.slice(Math.max(0, text.length - 131_072));
44
- const encrypted = /\/Encrypt\b/u.test(tail) || /\/Encrypt\b/u.test(text.slice(0, 4_096));
45
- const pageMatches = text.match(/\/Type\s*\/Page[^s]/gu);
46
- const pages = pageMatches === null ? undefined : pageMatches.length;
47
- // The trailer names the document-information object; its dictionary is read
48
- // from the object itself, because the trailer's own dictionary holds no
49
- // title or author.
50
- const infoId = /\/Info\s+(\d+)\s+\d+\s+R/u.exec(tail)?.[1];
51
- const info = infoId === undefined
52
- ? undefined
53
- : new RegExp(`\\b${infoId}\\s+\\d+\\s+obj\\s*<<([\\s\\S]*?)>>`, "u").exec(text)?.[1];
54
- const readEntry = (key) => {
55
- if (info === undefined)
56
- return undefined;
57
- const pattern = new RegExp(`/${key}\\s*(\\((?:[^()\\\\]|\\\\.)*\\)|<[0-9A-Fa-f\\s]+>)`, "u");
58
- const match = pattern.exec(info);
59
- if (match?.[1] === undefined)
60
- return undefined;
61
- const raw = match[1];
62
- if (raw.startsWith("<")) {
63
- const hex = raw.slice(1, -1).replace(/\s+/gu, "");
64
- const bytes = Buffer.from(hex.length % 2 === 0 ? hex : `${hex}0`, "hex");
65
- /* eslint-disable-next-line no-control-regex -- NUL padding is exactly what this strips */
66
- const decoded = bytes.toString("utf16le").replace(/\u0000+$/u, "");
67
- return decoded.trim() === "" ? undefined : decoded.trim();
68
- }
69
- const decoded = decodePdfString(raw);
70
- return decoded === "" ? undefined : decoded;
71
- };
72
- const created = readEntry("CreationDate");
73
- const modified = readEntry("ModDate");
74
- const title = readEntry("Title");
75
- const author = readEntry("Author");
76
- const streamImages = (/\/Subtype\s*\/Image\b/gu.exec(text) ?? []).length;
77
- return {
78
- ...(pages === undefined || pages === 0 ? {} : { pages }),
79
- encrypted,
80
- metadata: {
81
- ...(title === undefined ? {} : { title }),
82
- ...(author === undefined ? {} : { author }),
83
- ...(created === undefined
84
- ? {}
85
- : { createdAt: normalizePdfDate(created) ?? created }),
86
- ...(modified === undefined
87
- ? {}
88
- : { modifiedAt: normalizePdfDate(modified) ?? modified }),
89
- },
90
- ...(streamImages > 0 ? { images: streamImages } : {}),
91
- };
92
- }
93
- const DOCX_FACTS_MAX_PART_BYTES = 32 * 1024 * 1024;
94
- function readPart(buffer, entries, name) {
95
- const entry = findZipEntry(entries, name);
96
- if (entry === undefined ||
97
- entry.uncompressedSize > DOCX_FACTS_MAX_PART_BYTES) {
98
- return undefined;
99
- }
100
- const payload = readZipEntry(buffer, entry);
101
- return payload?.toString("utf8");
102
- }
103
- /** Count document structure from the OOXML package, without rendering it. */
104
- export function readDocxFacts(buffer) {
105
- const entries = readZipEntries(buffer);
106
- if (entries === undefined)
107
- return {};
108
- const document = readPart(buffer, entries, "word/document.xml");
109
- if (document === undefined)
110
- return {};
111
- const headingStyles = document.match(/<w:pStyle[^>]*w:val="(?:Heading|heading|Заголовок)[^"]*"/gu) ?? [];
112
- const outlineLevels = document.match(/<w:outlineLvl\b/gu) ?? [];
113
- const tables = (document.match(/<w:tbl>/gu) ?? []).length;
114
- const images = (document.match(/<w:drawing>/gu) ?? []).length +
115
- (document.match(/<w:pict>/gu) ?? []).length;
116
- const mediaParts = entries.filter((entry) => /^word\/media\//iu.test(entry.name)).length;
117
- return {
118
- headings: headingStyles.length + outlineLevels.length,
119
- tables,
120
- images: Math.max(images, mediaParts),
121
- };
122
- }
123
- /** Metadata recorded in `docProps/core.xml`. */
124
- export function readDocxMetadata(buffer) {
125
- const entries = readZipEntries(buffer);
126
- if (entries === undefined)
127
- return {};
128
- const core = readPart(buffer, entries, "docProps/core.xml");
129
- if (core === undefined)
130
- return {};
131
- const read = (tag) => {
132
- const match = new RegExp(`<(?:[A-Za-z]+:)?${tag}[^>]*>([\\s\\S]*?)</(?:[A-Za-z]+:)?${tag}>`, "u").exec(core);
133
- const value = match?.[1]?.trim();
134
- return value === undefined || value === "" ? undefined : value;
135
- };
136
- const title = read("title");
137
- const author = read("creator");
138
- const created = read("created");
139
- const modified = read("modified");
140
- return {
141
- ...(title === undefined ? {} : { title }),
142
- ...(author === undefined ? {} : { author }),
143
- ...(created === undefined ? {} : { createdAt: created }),
144
- ...(modified === undefined ? {} : { modifiedAt: modified }),
145
- };
146
- }
147
- export function mediaTypeOfDetected(format) {
148
- switch (format) {
149
- case "pdf":
150
- return "application/pdf";
151
- case "docx":
152
- return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
153
- case "docm":
154
- return "application/vnd.ms-word.document.macroEnabled.12";
155
- case "markdown":
156
- return "text/markdown";
157
- default:
158
- return "application/octet-stream";
159
- }
160
- }
161
- //# sourceMappingURL=facts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../../src/documents/inspect/facts.ts"],"names":[],"mappings":"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"}
@@ -1,108 +0,0 @@
1
- /**
2
- * Minimal ZIP reader (central directory + per-entry inflate).
3
- *
4
- * The document pipeline inspects OOXML containers — `document_inspect` counts
5
- * headings and images, `security/file-types.ts` decides DOCX vs macro-enabled
6
- * DOCM — and neither may pull a ZIP dependency into the host plugin. Only the
7
- * two compression methods OOXML writers actually produce are supported
8
- * (stored and deflate); anything else is reported as unreadable instead of
9
- * being guessed at.
10
- */
11
- import { inflateRawSync } from "node:zlib";
12
- const EOCD_SIGNATURE = 0x06054b50;
13
- const CENTRAL_SIGNATURE = 0x02014b50;
14
- const LOCAL_SIGNATURE = 0x04034b50;
15
- /** The end-of-central-directory record sits in the last 64 KiB (plus comment). */
16
- const EOCD_SEARCH_BYTES = 65_557;
17
- /** Guard against absurd declared sizes in a hostile archive. */
18
- const MAX_ENTRY_BYTES = 64 * 1024 * 1024;
19
- function findEndOfCentralDirectory(buffer) {
20
- const start = Math.max(0, buffer.length - EOCD_SEARCH_BYTES);
21
- for (let offset = buffer.length - 22; offset >= start; offset -= 1) {
22
- if (buffer.readUInt32LE(offset) === EOCD_SIGNATURE)
23
- return offset;
24
- }
25
- return -1;
26
- }
27
- /**
28
- * Parse the central directory. Returns `undefined` when the buffer is not a
29
- * ZIP archive (or is truncated) — the caller decides whether that is an error.
30
- */
31
- export function readZipEntries(buffer) {
32
- if (buffer.length < 22)
33
- return undefined;
34
- const eocd = findEndOfCentralDirectory(buffer);
35
- if (eocd < 0)
36
- return undefined;
37
- const count = buffer.readUInt16LE(eocd + 10);
38
- const centralOffset = buffer.readUInt32LE(eocd + 16);
39
- if (centralOffset === 0xffffffff || count === 0xffff)
40
- return undefined;
41
- const entries = [];
42
- let cursor = centralOffset;
43
- for (let index = 0; index < count; index += 1) {
44
- if (cursor + 46 > buffer.length)
45
- return undefined;
46
- if (buffer.readUInt32LE(cursor) !== CENTRAL_SIGNATURE)
47
- return undefined;
48
- const nameLength = buffer.readUInt16LE(cursor + 28);
49
- const extraLength = buffer.readUInt16LE(cursor + 30);
50
- const commentLength = buffer.readUInt16LE(cursor + 32);
51
- const nameStart = cursor + 46;
52
- if (nameStart + nameLength > buffer.length)
53
- return undefined;
54
- entries.push({
55
- name: buffer.toString("utf8", nameStart, nameStart + nameLength),
56
- compressionMethod: buffer.readUInt16LE(cursor + 10),
57
- compressedSize: buffer.readUInt32LE(cursor + 20),
58
- uncompressedSize: buffer.readUInt32LE(cursor + 24),
59
- localHeaderOffset: buffer.readUInt32LE(cursor + 42),
60
- });
61
- cursor = nameStart + nameLength + extraLength + commentLength;
62
- }
63
- return entries;
64
- }
65
- export function findZipEntry(entries, name) {
66
- const wanted = name.toLowerCase();
67
- return entries.find((entry) => entry.name.toLowerCase() === wanted);
68
- }
69
- /** Decompress one entry, or `undefined` when it is unreadable/oversized. */
70
- export function readZipEntry(buffer, entry) {
71
- if (entry.compressedSize > MAX_ENTRY_BYTES ||
72
- entry.uncompressedSize > MAX_ENTRY_BYTES) {
73
- return undefined;
74
- }
75
- const offset = entry.localHeaderOffset;
76
- if (offset + 30 > buffer.length)
77
- return undefined;
78
- if (buffer.readUInt32LE(offset) !== LOCAL_SIGNATURE)
79
- return undefined;
80
- const nameLength = buffer.readUInt16LE(offset + 26);
81
- const extraLength = buffer.readUInt16LE(offset + 28);
82
- const start = offset + 30 + nameLength + extraLength;
83
- const end = start + entry.compressedSize;
84
- if (end > buffer.length)
85
- return undefined;
86
- const payload = buffer.subarray(start, end);
87
- try {
88
- if (entry.compressionMethod === 0)
89
- return Buffer.from(payload);
90
- if (entry.compressionMethod === 8)
91
- return inflateRawSync(payload);
92
- return undefined;
93
- }
94
- catch {
95
- return undefined;
96
- }
97
- }
98
- /** Convenience: read a named entry from an archive in one call. */
99
- export function readZipEntryByName(buffer, name) {
100
- const entries = readZipEntries(buffer);
101
- if (entries === undefined)
102
- return undefined;
103
- const entry = findZipEntry(entries, name);
104
- if (entry === undefined)
105
- return undefined;
106
- return readZipEntry(buffer, entry);
107
- }
108
- //# sourceMappingURL=zip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../../src/documents/inspect/zip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,cAAc,GAAG,UAAU,CAAC;AAClC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AACrC,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,kFAAkF;AAClF,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,gEAAgE;AAChE,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAUzC,SAAS,yBAAyB,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IAC7D,KAAK,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACnE,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,cAAc;YAAE,OAAO,MAAM,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,IAAI,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACrD,IAAI,aAAa,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IACvE,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,aAAa,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9C,IAAI,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAClD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,iBAAiB;YAAE,OAAO,SAAS,CAAC;QACxE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;QAC9B,IAAI,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;YAChE,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC;YACnD,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC;YAChD,gBAAgB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC;YAClD,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;IAChE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAA4B,EAC5B,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,KAAe;IAEf,IACE,KAAK,CAAC,cAAc,GAAG,eAAe;QACtC,KAAK,CAAC,gBAAgB,GAAG,eAAe,EACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACvC,IAAI,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,eAAe;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,GAAG,UAAU,GAAG,WAAW,CAAC;IACrD,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;IACzC,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC;YAAE,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,IAAY;IAEZ,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC"}
@@ -1,135 +0,0 @@
1
- /**
2
- * Controlled document directives (§36).
3
- *
4
- * Markdown stays the canonical source, so the few structures Markdown cannot
5
- * express — a page break, a callout — are written as fences the orchestrator
6
- * rewrites into the target backend's own representation before the renderer
7
- * sees the text:
8
- *
9
- * ```md
10
- * :::pagebreak
11
- * :::
12
- *
13
- * :::note
14
- * Important information.
15
- * :::
16
- * ```
17
- *
18
- * Anything else is refused rather than passed through: an unknown `:::`
19
- * directive would otherwise reach pandoc as literal text, and raw markup
20
- * (HTML, LaTeX, Typst escapes) is only accepted when a deployment explicitly
21
- * opts in with `documents.create.allowRawMarkup`.
22
- */
23
- import { DocumentError } from "../errors.js";
24
- const DIRECTIVE_OPEN = /^[ \t]*:::[ \t]*([A-Za-z][A-Za-z0-9_-]*)[ \t]*$/u;
25
- const DIRECTIVE_CLOSE = /^[ \t]*:::[ \t]*$/u;
26
- const KNOWN_DIRECTIVES = new Set(["pagebreak", "note", "warning", "info"]);
27
- const PAGEBREAK_OPENXML = '```{=openxml}\n<w:p><w:r><w:br w:type="page"/></w:r></w:p>\n```';
28
- const RAW_MARKUP_PATTERNS = [
29
- {
30
- pattern: /<\s*(?:script|style|iframe|object|embed|applet|form|link|meta|base)\b/iu,
31
- label: "HTML element",
32
- },
33
- { pattern: /<\?|<!ENTITY/iu, label: "processing instruction" },
34
- {
35
- pattern: /\\(?:input|include|write18|directlua|usepackage)\s*[{[]/iu,
36
- label: "LaTeX command",
37
- },
38
- { pattern: /#(?:import|include|read)\s*[( "]/iu, label: "Typst command" },
39
- { pattern: /\{\{|\{%/u, label: "template placeholder" },
40
- ];
41
- function assertNoRawMarkup(markdown, allowRawMarkup) {
42
- if (allowRawMarkup)
43
- return;
44
- for (const { pattern, label } of RAW_MARKUP_PATTERNS) {
45
- if (pattern.test(markdown)) {
46
- throw new DocumentError("INVALID_INPUT", `the content carries raw markup (${label}); raw markup is disabled in this deployment`, { details: { kind: label } });
47
- }
48
- }
49
- }
50
- function renderPageBreak(backend) {
51
- if (backend === "typst")
52
- return "#pagebreak()";
53
- // Pandoc's openxml raw block is understood for DOCX output; for the PDF path
54
- // the document is rendered through DOCX first, so the same spelling applies.
55
- return PAGEBREAK_OPENXML;
56
- }
57
- function renderNote(kind, body, backend) {
58
- const label = kind === "note" ? "Note" : kind === "warning" ? "Warning" : "Info";
59
- const text = body.trim();
60
- const header = backend === "typst" ? `*${label}.* ` : `> **${label}.** `;
61
- if (text === "")
62
- return header.trimEnd();
63
- if (backend === "typst") {
64
- return header + text.replace(/\n{2,}/gu, "\n\n");
65
- }
66
- return header + text.split(/\r?\n/u).join("\n> ");
67
- }
68
- /**
69
- * Rewrite directives for one backend. Line-oriented on purpose: a fence that
70
- * appears inside a code block is content, not a directive.
71
- */
72
- export function applyDirectives(markdown, options) {
73
- assertNoRawMarkup(markdown, options.allowRawMarkup);
74
- const lines = markdown.split(/\r?\n/u);
75
- const output = [];
76
- let index = 0;
77
- while (index < lines.length) {
78
- const line = lines[index] ?? "";
79
- const fence = /^[ \t]*(`{3,}|~{3,})/u.exec(line);
80
- if (fence !== null) {
81
- const marker = fence[1] ?? "```";
82
- output.push(line);
83
- index += 1;
84
- while (index < lines.length) {
85
- const inner = lines[index] ?? "";
86
- output.push(inner);
87
- index += 1;
88
- if (inner.trimStart().startsWith(marker))
89
- break;
90
- }
91
- continue;
92
- }
93
- const directive = DIRECTIVE_OPEN.exec(line);
94
- if (directive === null) {
95
- output.push(line);
96
- index += 1;
97
- continue;
98
- }
99
- const rawName = (directive[1] ?? "").toLowerCase();
100
- const directiveName = rawName === "page-break" ? "pagebreak" : rawName;
101
- const openedAt = index + 1;
102
- if (!KNOWN_DIRECTIVES.has(directiveName)) {
103
- throw new DocumentError("INVALID_INPUT", `unsupported document directive ":::${rawName}" (supported: pagebreak, note, warning, info)`, { details: { directive: rawName, line: openedAt } });
104
- }
105
- index += 1;
106
- const body = [];
107
- let closed = false;
108
- while (index < lines.length) {
109
- const inner = lines[index] ?? "";
110
- if (DIRECTIVE_CLOSE.test(inner)) {
111
- closed = true;
112
- index += 1;
113
- break;
114
- }
115
- if (DIRECTIVE_OPEN.test(inner)) {
116
- throw new DocumentError("INVALID_INPUT", `document directive ":::${directiveName}" on line ${openedAt} contains a nested directive`, { details: { directive: directiveName, line: openedAt } });
117
- }
118
- body.push(inner);
119
- index += 1;
120
- }
121
- if (directiveName === "pagebreak") {
122
- if (body.some((entry) => entry.trim() !== "")) {
123
- throw new DocumentError("INVALID_INPUT", `":::pagebreak" on line ${openedAt} takes no body`, { details: { directive: directiveName, line: openedAt } });
124
- }
125
- output.push(renderPageBreak(options.backend));
126
- continue;
127
- }
128
- if (!closed) {
129
- throw new DocumentError("INVALID_INPUT", `document directive ":::${directiveName}" opened on line ${openedAt} is never closed`, { details: { directive: directiveName, line: openedAt } });
130
- }
131
- output.push(renderNote(directiveName, body.join("\n"), options.backend));
132
- }
133
- return { markdown: output.join("\n"), warnings: [] };
134
- }
135
- //# sourceMappingURL=directives.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../../src/documents/markdown/directives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgB7C,MAAM,cAAc,GAAG,kDAAkD,CAAC;AAC1E,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAC7C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3E,MAAM,iBAAiB,GACrB,iEAAiE,CAAC;AAEpE,MAAM,mBAAmB,GAGnB;IACJ;QACE,OAAO,EACL,yEAAyE;QAC3E,KAAK,EAAE,cAAc;KACtB;IACD,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,wBAAwB,EAAE;IAC9D;QACE,OAAO,EAAE,2DAA2D;QACpE,KAAK,EAAE,eAAe;KACvB;IACD,EAAE,OAAO,EAAE,oCAAoC,EAAE,KAAK,EAAE,eAAe,EAAE;IACzE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAAE;CACxD,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAAgB,EAAE,cAAuB;IAClE,IAAI,cAAc;QAAE,OAAO;IAC3B,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,CAAC;QACrD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,mCAAmC,KAAK,8CAA8C,EACtF,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAyB;IAChD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,cAAc,CAAC;IAC/C,6EAA6E;IAC7E,6EAA6E;IAC7E,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CACjB,IAAY,EACZ,IAAY,EACZ,OAAyB;IAEzB,MAAM,KAAK,GACT,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC;IACzE,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,OAAyB;IAEzB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,MAAM;YAClD,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,sCAAsC,OAAO,+CAA+C,EAC5F,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CACpD,CAAC;QACJ,CAAC;QAED,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,GAAG,IAAI,CAAC;gBACd,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,0BAA0B,aAAa,aAAa,QAAQ,8BAA8B,EAC1F,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAC1D,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QAED,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,0BAA0B,QAAQ,gBAAgB,EAClD,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAC1D,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,0BAA0B,aAAa,oBAAoB,QAAQ,kBAAkB,EACrF,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAC1D,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACvD,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Front-matter handling (§35).
3
- *
4
- * A generated document may carry a leading `---` block with scalar metadata.
5
- * Only scalars are read: the block feeds document properties and the manifest,
6
- * never a nested configuration surface, so there is nothing here an author
7
- * could use to reach a backend option.
8
- */
9
- const FRONT_MATTER_PATTERN = /^\uFEFF?---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/u;
10
- function unquote(value) {
11
- const trimmed = value.trim();
12
- if ((trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length >= 2) ||
13
- (trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2)) {
14
- return trimmed.slice(1, -1);
15
- }
16
- return trimmed;
17
- }
18
- /** Split leading front matter from the body. Malformed lines are ignored. */
19
- export function parseFrontMatter(markdown) {
20
- const match = FRONT_MATTER_PATTERN.exec(markdown);
21
- if (match === null)
22
- return { attributes: {}, body: markdown };
23
- const attributes = {};
24
- for (const line of (match[1] ?? "").split(/\r?\n/u)) {
25
- const separator = line.indexOf(":");
26
- if (separator <= 0)
27
- continue;
28
- const key = line.slice(0, separator).trim().toLowerCase();
29
- if (key === "" || key.startsWith("-"))
30
- continue;
31
- attributes[key] = unquote(line.slice(separator + 1));
32
- }
33
- return { attributes, body: markdown.slice(match[0].length) };
34
- }
35
- //# sourceMappingURL=frontmatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../../src/documents/markdown/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,oBAAoB,GACxB,4DAA4D,CAAC;AAE/D,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IACE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACzE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,EACzE,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9D,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,SAAS,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC"}
@@ -1,113 +0,0 @@
1
- /**
2
- * Markdown normalization for extracted documents (§16).
3
- *
4
- * The layer is deliberately conservative: it removes artifacts a converter
5
- * reliably produces (platform line endings, non-breaking spaces, page-number
6
- * lines, a running head repeated on every page) and never touches meaning.
7
- * Guessing missing content is explicitly out of scope, and an LLM pass is not
8
- * part of this stage at all — a document is never sent to a model to make its
9
- * Markdown nicer.
10
- */
11
- const PAGE_NUMBER_LINE = /^[ \t]*(?:[-–—|]\s*)?(?:page|стр\.?|страница)?\s*\d{1,4}\s*(?:[-–—|])?[ \t]*$/iu;
12
- const BULLET_SUBSTITUTES = /^([ \t]*)[•▪◦‣·]([ \t]+)/u;
13
- const RUNNING_HEAD_MAX_CHARS = 80;
14
- const RUNNING_HEAD_MIN_REPEATS = 3;
15
- function collapseBlankRuns(lines) {
16
- const output = [];
17
- let blanks = 0;
18
- for (const line of lines) {
19
- if (line.trim() === "") {
20
- blanks += 1;
21
- if (blanks > 1)
22
- continue;
23
- output.push("");
24
- continue;
25
- }
26
- blanks = 0;
27
- output.push(line);
28
- }
29
- while (output.length > 0 && output[output.length - 1] === "")
30
- output.pop();
31
- return output;
32
- }
33
- function stripRunningHeads(lines) {
34
- const counts = new Map();
35
- for (const line of lines) {
36
- const trimmed = line.trim();
37
- if (trimmed === "" || trimmed.length > RUNNING_HEAD_MAX_CHARS)
38
- continue;
39
- if (trimmed.startsWith("#") ||
40
- trimmed.startsWith("|") ||
41
- trimmed.startsWith(">"))
42
- continue;
43
- counts.set(trimmed, (counts.get(trimmed) ?? 0) + 1);
44
- }
45
- const repeated = new Set([...counts.entries()]
46
- .filter(([, count]) => count >= RUNNING_HEAD_MIN_REPEATS)
47
- .map(([line]) => line));
48
- if (repeated.size === 0)
49
- return [...lines];
50
- return lines.filter((line) => {
51
- const trimmed = line.trim();
52
- if (trimmed === "" || trimmed.length > RUNNING_HEAD_MAX_CHARS)
53
- return true;
54
- return !repeated.has(trimmed);
55
- });
56
- }
57
- /** Normalize extracted Markdown; returns the text and what was changed. */
58
- export function normalizeExtractedMarkdown(markdown, options = {}) {
59
- const warnings = [];
60
- let text = markdown
61
- .replace(/^\uFEFF/u, "")
62
- .replace(/\r\n?/gu, "\n")
63
- .replace(/\u00A0/gu, " ")
64
- .replace(/[\u200B-\u200D\u2060]/gu, "");
65
- const rawLines = text.split("\n");
66
- let lines = rawLines.map((line) => line.replace(/\s+$/u, ""));
67
- const bulletFix = lines.map((line) => line.replace(BULLET_SUBSTITUTES, "$1- "));
68
- if (bulletFix.some((line, index) => line !== lines[index])) {
69
- lines = bulletFix;
70
- }
71
- const beforeHeadStrip = lines.length;
72
- if (options.stripRunningHeads ?? true) {
73
- lines = stripRunningHeads(lines);
74
- if (lines.length < beforeHeadStrip) {
75
- warnings.push({
76
- code: "TABLE_EXTRACTION_DEGRADED",
77
- message: "lines repeated across pages were removed as running heads or footers",
78
- details: { removed: beforeHeadStrip - lines.length },
79
- });
80
- }
81
- }
82
- if (options.stripPageNumbers ?? true) {
83
- const filtered = lines.filter((line, index) => !(PAGE_NUMBER_LINE.test(line) &&
84
- (lines[index - 1] ?? "").trim() === "" &&
85
- (lines[index + 1] ?? "").trim() === ""));
86
- if (filtered.length < lines.length) {
87
- warnings.push({
88
- code: "TABLE_EXTRACTION_DEGRADED",
89
- message: "standalone page-number lines were removed",
90
- details: { removed: lines.length - filtered.length },
91
- });
92
- }
93
- lines = filtered;
94
- }
95
- lines = collapseBlankRuns(lines);
96
- text = `${lines.join("\n")}\n`;
97
- return { markdown: text, warnings };
98
- }
99
- /** Count Markdown structure for `document_inspect` on Markdown inputs. */
100
- export function markdownStructure(markdown) {
101
- const headings = markdown
102
- .split("\n")
103
- .filter((line) => /^#{1,6}\s+\S/u.test(line)).length;
104
- return {
105
- headings,
106
- images: (markdown.match(/!\[[^\]]*\]\([^)]*\)/gu) ?? []).length,
107
- tables: markdown
108
- .split(/\n{2,}/u)
109
- .filter((block) => /^\|.*\|$/mu.test(block) && /\|\s*-{2,}/u.test(block))
110
- .length,
111
- };
112
- }
113
- //# sourceMappingURL=normalize.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/documents/markdown/normalize.ts"],"names":[],"mappings":"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"}