@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
- * Pandoc provider (§6.1, §13, §14.2).
3
- *
4
- * The command line is assembled here and nowhere else: the agent supplies
5
- * content, a template *name* and a handful of enumerated options, and this
6
- * module turns them into argv. There is no path through the pipeline by which
7
- * a caller can add `--lua-filter`, an arbitrary `--resource-path`, or a
8
- * `--pdf-engine-opt` (§26.1).
9
- */
10
- import path from "node:path";
11
- import { sha256OfFile } from "../artifacts/store.js";
12
- import { DocumentError } from "../errors.js";
13
- import { expectProcessOk, runProcess } from "./process.js";
14
- import { backendInfo, metadataArguments, parseVersionOutput, verifyOutput, } from "./shared.js";
15
- const VERSION_TIMEOUT_MS = 10_000;
16
- const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
17
- function spawnPandoc(options, argv, context) {
18
- return runProcess(options.executable, argv, {
19
- cwd: context.cwd,
20
- timeoutMs: options.timeoutMs,
21
- maxStdoutBytes: MAX_OUTPUT_BYTES,
22
- backend: context.backend,
23
- context: context.action,
24
- ...(context.signal === undefined ? {} : { signal: context.signal }),
25
- ...(options.programPrefixArgs === undefined
26
- ? {}
27
- : { programPrefixArgs: options.programPrefixArgs }),
28
- });
29
- }
30
- async function probeVersion(options, backend) {
31
- if (options.versionProbe !== undefined)
32
- return await options.versionProbe();
33
- try {
34
- const result = await runProcess(options.executable, ["--version"], {
35
- timeoutMs: VERSION_TIMEOUT_MS,
36
- maxStdoutBytes: 8 * 1024,
37
- backend,
38
- context: "reporting its version",
39
- ...(options.programPrefixArgs === undefined
40
- ? {}
41
- : { programPrefixArgs: options.programPrefixArgs }),
42
- });
43
- if (result.exitCode !== 0)
44
- return undefined;
45
- return parseVersionOutput(result.stdout, backend);
46
- }
47
- catch {
48
- return undefined;
49
- }
50
- }
51
- /** Pandoc renders Markdown into DOCX, optionally through a reference document. */
52
- export class PandocDocxRenderer {
53
- options;
54
- name = "pandoc";
55
- cachedVersion;
56
- constructor(options) {
57
- this.options = options;
58
- }
59
- async version() {
60
- this.cachedVersion ??= probeVersion(this.options, this.name);
61
- return await this.cachedVersion;
62
- }
63
- async render(input) {
64
- const argv = [
65
- input.sourcePath,
66
- "--from=gfm",
67
- "--to=docx",
68
- `--output=${input.outputPath}`,
69
- ...(input.referenceDocPath === undefined
70
- ? []
71
- : [`--reference-doc=${input.referenceDocPath}`]),
72
- ...(input.assetsDir === undefined
73
- ? []
74
- : [`--resource-path=${input.assetsDir}`]),
75
- ...(input.toc === true ? ["--toc", "--toc-depth=3"] : []),
76
- ...(input.title === undefined ? [] : [`--metadata=title=${input.title}`]),
77
- ...metadataArguments(input.metadata),
78
- ];
79
- const result = await spawnPandoc(this.options, argv, {
80
- cwd: input.workDir,
81
- backend: this.name,
82
- action: "rendering DOCX",
83
- ...(input.signal === undefined ? {} : { signal: input.signal }),
84
- });
85
- if (result.truncated) {
86
- throw new DocumentError("RENDER_FAILED", "the DOCX renderer produced more output than the pipeline accepts", { backend: this.name });
87
- }
88
- expectProcessOk(result, {
89
- backend: this.name,
90
- context: "rendering DOCX",
91
- fallbackCode: "RENDER_FAILED",
92
- });
93
- const verified = await verifyOutput(input.outputPath, this.name, "RENDER_FAILED");
94
- return {
95
- path: verified.path,
96
- size: verified.size,
97
- sha256: await sha256OfFile(verified.path),
98
- backend: backendInfo(this.name, await this.version()),
99
- warnings: [],
100
- };
101
- }
102
- }
103
- /**
104
- * Pandoc-driven PDF renderer. The only engine this pipeline enables is Typst,
105
- * so the provider exists for `pdfMode: "typst"` alone (§14.2); the office route
106
- * renders DOCX first and converts it with LibreOffice.
107
- */
108
- export class PandocTypstPdfRenderer {
109
- options;
110
- name = "typst";
111
- cachedVersion;
112
- constructor(options) {
113
- this.options = options;
114
- }
115
- async version() {
116
- this.cachedVersion ??= probeVersion(this.options, this.name);
117
- return await this.cachedVersion;
118
- }
119
- async render(input) {
120
- const argv = [
121
- input.sourcePath,
122
- "--from=gfm",
123
- "--to=pdf",
124
- "--standalone",
125
- "--pdf-engine=typst",
126
- `--output=${input.outputPath}`,
127
- ...(input.typstTemplateDir === undefined
128
- ? []
129
- : [`--template=${path.join(input.typstTemplateDir, "main.typ")}`]),
130
- ...(input.assetsDir === undefined
131
- ? []
132
- : [`--resource-path=${input.assetsDir}`]),
133
- ...(input.pageSize === undefined
134
- ? []
135
- : [`-V=papersize=${input.pageSize}`]),
136
- ...(input.toc === true ? ["--toc", "--toc-depth=3"] : []),
137
- ...(input.title === undefined ? [] : [`--metadata=title=${input.title}`]),
138
- ...metadataArguments(input.metadata),
139
- ];
140
- const result = await spawnPandoc(this.options, argv, {
141
- cwd: input.workDir,
142
- backend: this.name,
143
- action: "rendering PDF with Typst",
144
- ...(input.signal === undefined ? {} : { signal: input.signal }),
145
- });
146
- expectProcessOk(result, {
147
- backend: this.name,
148
- context: "rendering PDF with Typst",
149
- fallbackCode: "RENDER_FAILED",
150
- });
151
- const verified = await verifyOutput(input.outputPath, this.name, "RENDER_FAILED");
152
- return {
153
- path: verified.path,
154
- size: verified.size,
155
- sha256: await sha256OfFile(verified.path),
156
- backend: backendInfo(this.name, await this.version()),
157
- warnings: [],
158
- };
159
- }
160
- }
161
- //# sourceMappingURL=pandoc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pandoc.js","sourceRoot":"","sources":["../../../src/documents/providers/pandoc.ts"],"names":[],"mappings":"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"}
@@ -1,164 +0,0 @@
1
- /**
2
- * Hardened child-process runner for document backends (§26.1, §28, §47).
3
- *
4
- * Every backend invocation goes through here. The contract mirrors the one the
5
- * git tools use, because the threat is the same shape — a document is
6
- * untrusted input and the backend is a powerful external program:
7
- *
8
- * - argv array only, built by the provider, never by the model, no shell;
9
- * - an explicit environment allow-list, so ambient secrets and proxies do not
10
- * reach the backend;
11
- * - output is byte-capped and the process is killed when the cap or the
12
- * timeout hits; a killed run is reported as `timedOut`/`truncated` rather
13
- * than being confused with a backend that failed on its own;
14
- * - the caller's abort signal terminates the child and its descendants.
15
- */
16
- import { spawn } from "node:child_process";
17
- import { DocumentError, sanitizeBackendOutput } from "../errors.js";
18
- const DEFAULT_STDERR_MAX_BYTES = 16 * 1024;
19
- const KILL_ESCALATION_MS = 500;
20
- /**
21
- * Ambient variables a document backend legitimately needs. Everything else —
22
- * API keys, proxy settings, cloud credentials — is withheld: a converter
23
- * parsing a hostile document should not be able to read the deployment's
24
- * secrets out of its own environment (§26.5).
25
- */
26
- export function buildProcessEnv(extra, source = process.env) {
27
- const allowed = {};
28
- for (const key of [
29
- "PATH",
30
- "HOME",
31
- "USERPROFILE",
32
- "LANG",
33
- "LC_ALL",
34
- "TMPDIR",
35
- "TEMP",
36
- "TMP",
37
- "SystemRoot",
38
- "windir",
39
- "PATHEXT",
40
- "COMSPEC",
41
- "PROGRAMFILES",
42
- "PROGRAMFILES(X86)",
43
- "PROGRAMDATA",
44
- "LOCALAPPDATA",
45
- "APPDATA",
46
- ]) {
47
- const value = source[key];
48
- if (value !== undefined)
49
- allowed[key] = value;
50
- }
51
- return { ...allowed, ...(extra ?? {}) };
52
- }
53
- export async function runProcess(program, argv, options) {
54
- const args = [...(options.programPrefixArgs ?? []), ...argv];
55
- return await new Promise((resolve, reject) => {
56
- let child;
57
- try {
58
- child = spawn(program, [...args], {
59
- ...(options.cwd === undefined ? {} : { cwd: options.cwd }),
60
- env: buildProcessEnv(options.env),
61
- stdio: ["ignore", "pipe", "pipe"],
62
- windowsHide: true,
63
- });
64
- }
65
- catch (error) {
66
- reject(new DocumentError("BACKEND_UNAVAILABLE", `${options.backend} could not be started: ${sanitizeBackendOutput(error.message)}`, { backend: options.backend }));
67
- return;
68
- }
69
- let settled = false;
70
- let stdoutBytes = 0;
71
- let stderrBytes = 0;
72
- let truncated = false;
73
- let timedOut = false;
74
- const stdoutChunks = [];
75
- const stderrChunks = [];
76
- const stdoutCap = Math.max(1, Math.floor(options.maxStdoutBytes));
77
- const stderrCap = Math.max(1, Math.floor(options.maxStderrBytes ?? DEFAULT_STDERR_MAX_BYTES));
78
- const kill = () => {
79
- if (child.exitCode !== null || child.signalCode !== null)
80
- return;
81
- child.kill();
82
- const escalation = setTimeout(() => {
83
- if (child.exitCode === null && child.signalCode === null)
84
- child.kill("SIGKILL");
85
- }, KILL_ESCALATION_MS);
86
- escalation.unref?.();
87
- };
88
- const timer = setTimeout(() => {
89
- timedOut = true;
90
- kill();
91
- }, Math.max(1, Math.floor(options.timeoutMs)));
92
- timer.unref?.();
93
- const onAbort = () => kill();
94
- options.signal?.addEventListener("abort", onAbort, { once: true });
95
- const detach = () => {
96
- clearTimeout(timer);
97
- options.signal?.removeEventListener("abort", onAbort);
98
- };
99
- child.stdout?.on("data", (chunk) => {
100
- if (stdoutBytes >= stdoutCap) {
101
- truncated = true;
102
- kill();
103
- return;
104
- }
105
- const remaining = stdoutCap - stdoutBytes;
106
- if (chunk.length > remaining) {
107
- stdoutChunks.push(chunk.subarray(0, remaining));
108
- stdoutBytes = stdoutCap;
109
- truncated = true;
110
- kill();
111
- return;
112
- }
113
- stdoutChunks.push(chunk);
114
- stdoutBytes += chunk.length;
115
- });
116
- child.stderr?.on("data", (chunk) => {
117
- if (stderrBytes >= stderrCap)
118
- return;
119
- const remaining = stderrCap - stderrBytes;
120
- if (chunk.length > remaining) {
121
- stderrChunks.push(chunk.subarray(0, remaining));
122
- stderrBytes = stderrCap;
123
- return;
124
- }
125
- stderrChunks.push(chunk);
126
- stderrBytes += chunk.length;
127
- });
128
- child.on("error", (error) => {
129
- if (settled)
130
- return;
131
- settled = true;
132
- detach();
133
- reject(new DocumentError("BACKEND_UNAVAILABLE", `${options.backend} could not be started: ${sanitizeBackendOutput(error.message)}`, { backend: options.backend }));
134
- });
135
- child.on("close", (code) => {
136
- if (settled)
137
- return;
138
- settled = true;
139
- detach();
140
- resolve({
141
- stdout: Buffer.concat(stdoutChunks).toString("utf8"),
142
- stderr: Buffer.concat(stderrChunks).toString("utf8"),
143
- exitCode: code,
144
- truncated,
145
- timedOut,
146
- });
147
- });
148
- });
149
- }
150
- /** Map a finished run that the provider expected to succeed onto an error. */
151
- export function expectProcessOk(result, options) {
152
- if (result.timedOut) {
153
- throw new DocumentError("BACKEND_TIMEOUT", `${options.backend} exceeded its time budget while ${options.context}`, { backend: options.backend, details: { timeoutMs: true } });
154
- }
155
- if (result.exitCode === 0)
156
- return;
157
- const detail = sanitizeBackendOutput(result.stderr) ||
158
- sanitizeBackendOutput(result.stdout);
159
- throw new DocumentError(options.fallbackCode, `${options.backend} failed while ${options.context}${detail === "" ? "" : `: ${detail}`}`, {
160
- backend: options.backend,
161
- details: { exitCode: result.exitCode },
162
- });
163
- }
164
- //# sourceMappingURL=process.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/documents/providers/process.ts"],"names":[],"mappings":"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"}
@@ -1,152 +0,0 @@
1
- /**
2
- * Backend registry and selection (§22, §23, §14.3, §45).
3
- *
4
- * Tools never import a concrete provider: they ask the registry for the
5
- * renderer, extractor or converter that fits the request, and the registry
6
- * decides — from configuration and from what is actually available — which
7
- * implementation that is. Swapping Docling for another extractor, or Typst for
8
- * another PDF engine, is a change here and nowhere else.
9
- */
10
- import { DocumentError } from "../errors.js";
11
- import { DoclingExtractor } from "./docling.js";
12
- import { LibreOfficePdfConverter } from "./libreoffice.js";
13
- import { MarkItDownExtractor } from "./markitdown.js";
14
- import { PandocDocxRenderer, PandocTypstPdfRenderer } from "./pandoc.js";
15
- export function createProviders(config, seams = {}) {
16
- const pandocOptions = {
17
- executable: config.pandoc.executable,
18
- timeoutMs: config.pandoc.timeoutMs,
19
- ...(seams.pandoc?.programPrefixArgs === undefined
20
- ? {}
21
- : { programPrefixArgs: seams.pandoc.programPrefixArgs }),
22
- ...(seams.pandoc?.versionProbe === undefined
23
- ? {}
24
- : { versionProbe: seams.pandoc.versionProbe }),
25
- };
26
- const pandoc = new PandocDocxRenderer(pandocOptions);
27
- const docling = config.docling.enabled
28
- ? new DoclingExtractor({
29
- baseUrl: config.docling.baseUrl,
30
- timeoutMs: config.docling.timeoutMs,
31
- maxResponseBytes: config.limits.maxResponseBytes,
32
- maxImages: config.limits.maxExtractedImages,
33
- ...(seams.fetchImpl === undefined
34
- ? {}
35
- : { fetchImpl: seams.fetchImpl }),
36
- })
37
- : undefined;
38
- const markitdown = config.markitdown.enabled
39
- ? new MarkItDownExtractor({
40
- executable: config.markitdown.executable,
41
- timeoutMs: config.markitdown.timeoutMs,
42
- maxStdoutBytes: config.limits.maxExtractedMarkdownBytes,
43
- ...(seams.markitdown?.programPrefixArgs === undefined
44
- ? {}
45
- : { programPrefixArgs: seams.markitdown.programPrefixArgs }),
46
- ...(seams.markitdown?.versionProbe === undefined
47
- ? {}
48
- : { versionProbe: seams.markitdown.versionProbe }),
49
- })
50
- : undefined;
51
- return {
52
- docx: pandoc,
53
- typstPdf: config.typst.enabled
54
- ? new PandocTypstPdfRenderer(pandocOptions)
55
- : undefined,
56
- converter: new LibreOfficePdfConverter({
57
- executable: config.libreoffice.executable,
58
- timeoutMs: config.libreoffice.timeoutMs,
59
- ...(seams.libreoffice?.programPrefixArgs === undefined
60
- ? {}
61
- : { programPrefixArgs: seams.libreoffice.programPrefixArgs }),
62
- ...(seams.libreoffice?.versionProbe === undefined
63
- ? {}
64
- : { versionProbe: seams.libreoffice.versionProbe }),
65
- }),
66
- docling,
67
- doclingHealth: docling === undefined
68
- ? undefined
69
- : async () => await docling.health(),
70
- markitdown,
71
- markitdownHealth: markitdown === undefined
72
- ? undefined
73
- : async () => await markitdown.health(),
74
- };
75
- }
76
- /**
77
- * The PDF route (§14.3):
78
- *
79
- * ```text
80
- * DOCX + PDF requested → office
81
- * PDF only, template has Typst → typst
82
- * otherwise → office
83
- * ```
84
- *
85
- * A deployment that asked for `typst` without enabling the engine is answered
86
- * with `BACKEND_UNAVAILABLE` instead of silently rendering an office PDF in
87
- * the wrong layout.
88
- */
89
- export function selectPdfMode(options) {
90
- const wantsDocx = options.formats.includes("docx");
91
- const resolve = () => {
92
- if (options.requested === "office")
93
- return "office";
94
- if (options.requested === "typst")
95
- return "typst";
96
- if (wantsDocx)
97
- return "office";
98
- return options.templateHasTypst ? "typst" : "office";
99
- };
100
- const mode = resolve();
101
- if (mode === "typst" && !options.typstEnabled) {
102
- throw new DocumentError("BACKEND_UNAVAILABLE", options.requested === "typst"
103
- ? "the Typst PDF route is not enabled in this deployment"
104
- : "this template only provides a Typst layout, but the Typst PDF route is not enabled", { backend: "typst" });
105
- }
106
- return mode;
107
- }
108
- export function selectExtractor(providers, config, mode, format) {
109
- const docling = providers.docling;
110
- const markitdown = providers.markitdown;
111
- if (mode === "fast") {
112
- if (markitdown !== undefined && markitdown.supports(format)) {
113
- return {
114
- extractor: markitdown,
115
- fallbacks: docling === undefined ? [] : [docling],
116
- };
117
- }
118
- if (docling === undefined) {
119
- throw new DocumentError("BACKEND_UNAVAILABLE", "no document extractor is enabled in this deployment", { backend: "docling" });
120
- }
121
- return { extractor: docling, fallbacks: [] };
122
- }
123
- if (docling !== undefined && docling.supports(format)) {
124
- const fallbacks = config.extraction.allowFallback &&
125
- markitdown !== undefined &&
126
- markitdown.supports(format)
127
- ? [markitdown]
128
- : [];
129
- return { extractor: docling, fallbacks };
130
- }
131
- if (markitdown !== undefined && markitdown.supports(format)) {
132
- return { extractor: markitdown, fallbacks: [] };
133
- }
134
- throw new DocumentError("BACKEND_UNAVAILABLE", `no enabled extractor supports ${format.toUpperCase()} documents`, { backend: "docling" });
135
- }
136
- /** Run the selected extractor, falling back only when it is unreachable. */
137
- export async function extractWithFallback(selection, input) {
138
- try {
139
- return { document: await selection.extractor.extract(input) };
140
- }
141
- catch (error) {
142
- const unreachable = error instanceof DocumentError &&
143
- (error.code === "BACKEND_UNAVAILABLE" ||
144
- error.code === "BACKEND_TIMEOUT");
145
- const next = selection.fallbacks[0];
146
- if (!unreachable || next === undefined)
147
- throw error;
148
- const document = await next.extract(input);
149
- return { document, fellBackFrom: selection.extractor.name };
150
- }
151
- }
152
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/documents/providers/registry.ts"],"names":[],"mappings":"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"}
@@ -1,75 +0,0 @@
1
- /**
2
- * Shared plumbing of the document providers.
3
- *
4
- * Providers report what they wrote through {@link verifyOutput}: a backend
5
- * that exits 0 but leaves no file behind is a failure, and one that leaves an
6
- * empty file is a failure too — the caller must never be handed a path that
7
- * looks like an artifact and is not.
8
- */
9
- import { readFile, stat } from "node:fs/promises";
10
- import { DocumentError, sanitizeBackendOutput } from "../errors.js";
11
- export async function verifyOutput(outputPath, backend, code) {
12
- const details = await stat(outputPath).catch(() => undefined);
13
- if (details === undefined || !details.isFile()) {
14
- throw new DocumentError(code, `${backend} reported success but produced no output`, { backend });
15
- }
16
- if (details.size === 0) {
17
- throw new DocumentError(code, `${backend} produced an empty file`, {
18
- backend,
19
- });
20
- }
21
- return { path: outputPath, size: details.size };
22
- }
23
- /** `--metadata=key=value` pairs, sanitized of control characters. */
24
- export function metadataArguments(metadata) {
25
- if (metadata === undefined)
26
- return [];
27
- const args = [];
28
- for (const [key, value] of Object.entries(metadata)) {
29
- const cleanKey = key.replace(/[^A-Za-z0-9_-]+/gu, "-").slice(0, 40);
30
- if (cleanKey === "")
31
- continue;
32
- // Newlines would let a value impersonate the next CLI argument in a log;
33
- // argv itself is already structured, so collapsing is enough.
34
- /* eslint-disable-next-line no-control-regex -- newlines and NULs must not survive into a log */
35
- const cleanValue = value.replace(/[\r\n\u0000]+/gu, " ").slice(0, 4_000);
36
- args.push(`--metadata=${cleanKey}=${cleanValue}`);
37
- }
38
- return args;
39
- }
40
- /** First line of a `--version` run, reduced to the version token. */
41
- export function parseVersionOutput(stdout, program) {
42
- const firstLine = sanitizeBackendOutput(stdout.split(/\r?\n/u)[0] ?? "", 200);
43
- const match = /(\d+\.\d+(?:\.\d+)?)/u.exec(firstLine);
44
- if (match !== null)
45
- return match[1];
46
- return firstLine === "" || firstLine === program ? undefined : firstLine;
47
- }
48
- export function backendInfo(provider, version) {
49
- return version === undefined ? { provider } : { provider, version };
50
- }
51
- /** Read a text output produced by a backend, with a bounded size. */
52
- export async function readTextOutput(filePath, backend, maxBytes) {
53
- const details = await stat(filePath).catch(() => undefined);
54
- if (details === undefined) {
55
- throw new DocumentError("EXTRACTION_FAILED", `${backend} produced no output`, {
56
- backend,
57
- });
58
- }
59
- if (details.size > maxBytes) {
60
- const raw = await readFile(filePath);
61
- return {
62
- text: raw.subarray(0, maxBytes).toString("utf8"),
63
- truncated: true,
64
- };
65
- }
66
- return { text: await readFile(filePath, "utf8"), truncated: false };
67
- }
68
- export function truncationWarning(backend, contentType) {
69
- return {
70
- code: "MARKDOWN_TRUNCATED",
71
- message: `the extracted ${contentType} exceeded the configured inline budget and was truncated`,
72
- backend,
73
- };
74
- }
75
- //# sourceMappingURL=shared.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/documents/providers/shared.ts"],"names":[],"mappings":"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"}