@yadsh/dsh-qa-surface 0.6.1 → 0.7.0

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 (281) hide show
  1. package/README.md +136 -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 +127 -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 +35 -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 +33 -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/styles.js +31 -0
  86. package/lib/client/styles.js.map +1 -1
  87. package/lib/client/types.js.map +1 -1
  88. package/lib/client.js +9908 -4857
  89. package/lib/client.js.map +1 -1
  90. package/lib/config-resolvers/defaults.js +0 -2
  91. package/lib/config-resolvers/defaults.js.map +1 -1
  92. package/lib/config.js +0 -249
  93. package/lib/config.js.map +1 -1
  94. package/lib/enforcement/skill-policy.js +172 -0
  95. package/lib/enforcement/skill-policy.js.map +1 -0
  96. package/lib/enforcement/tool-grants.js +151 -0
  97. package/lib/enforcement/tool-grants.js.map +1 -0
  98. package/lib/index.js +224 -42
  99. package/lib/index.js.map +1 -1
  100. package/lib/personal-skills/service.js +10 -3
  101. package/lib/personal-skills/service.js.map +1 -1
  102. package/lib/qa-tools/index.js +4 -0
  103. package/lib/qa-tools/index.js.map +1 -1
  104. package/lib/resolve-config.js +0 -2
  105. package/lib/resolve-config.js.map +1 -1
  106. package/lib/secure-session.js +71 -17
  107. package/lib/secure-session.js.map +1 -1
  108. package/lib/typert.host.js +2237 -202
  109. package/lib/typert.remote-client.d.ts +49 -3
  110. package/lib/typert.remote-client.js +1863 -183
  111. package/lib/types/access/capability-catalog.d.ts +37 -0
  112. package/lib/types/access/model.d.ts +60 -0
  113. package/lib/types/access/role-repository.d.ts +32 -0
  114. package/lib/types/access/service.d.ts +57 -0
  115. package/lib/types/access/skill-metadata.d.ts +53 -0
  116. package/lib/types/account-remotes.d.ts +6 -0
  117. package/lib/types/accounts/errors.d.ts +1 -1
  118. package/lib/types/accounts/file.d.ts +16 -5
  119. package/lib/types/accounts/store.d.ts +83 -3
  120. package/lib/types/admin/conversation-log.d.ts +39 -0
  121. package/lib/types/admin/index.d.ts +24 -0
  122. package/lib/types/admin/metrics.d.ts +29 -0
  123. package/lib/types/admin/paging.d.ts +33 -0
  124. package/lib/types/admin/permissions.d.ts +10 -0
  125. package/lib/types/admin/quality-store.d.ts +82 -0
  126. package/lib/types/admin/queue.d.ts +21 -0
  127. package/lib/types/admin/redaction.d.ts +29 -0
  128. package/lib/types/admin/service.d.ts +105 -0
  129. package/lib/types/admin/session-log.d.ts +53 -0
  130. package/lib/types/client/QaSessionController.d.ts +12 -1
  131. package/lib/types/client/QaSurface.d.ts +7 -1
  132. package/lib/types/client/admin/QaAdmin.d.ts +17 -0
  133. package/lib/types/client/admin/format.d.ts +43 -0
  134. package/lib/types/client/admin/pages/Conversations.d.ts +21 -0
  135. package/lib/types/client/admin/pages/Overview.d.ts +13 -0
  136. package/lib/types/client/admin/pages/Quality.d.ts +18 -0
  137. package/lib/types/client/admin/pages/Review.d.ts +15 -0
  138. package/lib/types/client/admin/pages/Users.d.ts +22 -0
  139. package/lib/types/client/admin/routes.d.ts +50 -0
  140. package/lib/types/client/admin/shared.d.ts +53 -0
  141. package/lib/types/client/admin/styles.d.ts +11 -0
  142. package/lib/types/client/components/QaHeader.d.ts +5 -1
  143. package/lib/types/client/components/QaMessage.d.ts +14 -1
  144. package/lib/types/client/create-session.d.ts +2 -0
  145. package/lib/types/client/role/RoleSelector.d.ts +14 -0
  146. package/lib/types/client/session-sources.d.ts +9 -0
  147. package/lib/types/client/settings/sections.d.ts +0 -1
  148. package/lib/types/client/types.d.ts +39 -2
  149. package/lib/types/enforcement/skill-policy.d.ts +29 -0
  150. package/lib/types/enforcement/tool-grants.d.ts +84 -0
  151. package/lib/types/index.d.ts +62 -14
  152. package/lib/types/qa-tools/index.d.ts +2 -0
  153. package/lib/types/secure-session.d.ts +10 -1
  154. package/lib/types/types.d.ts +568 -5
  155. package/package.json +1 -1
  156. package/lib/client/settings/sections/documents.js +0 -88
  157. package/lib/client/settings/sections/documents.js.map +0 -1
  158. package/lib/documents/artifacts/ids.js +0 -43
  159. package/lib/documents/artifacts/ids.js.map +0 -1
  160. package/lib/documents/artifacts/manifest.js +0 -66
  161. package/lib/documents/artifacts/manifest.js.map +0 -1
  162. package/lib/documents/artifacts/store.js +0 -169
  163. package/lib/documents/artifacts/store.js.map +0 -1
  164. package/lib/documents/capabilities.js +0 -93
  165. package/lib/documents/capabilities.js.map +0 -1
  166. package/lib/documents/config.js +0 -302
  167. package/lib/documents/config.js.map +0 -1
  168. package/lib/documents/defaults.js +0 -78
  169. package/lib/documents/defaults.js.map +0 -1
  170. package/lib/documents/errors.js +0 -101
  171. package/lib/documents/errors.js.map +0 -1
  172. package/lib/documents/index.js +0 -80
  173. package/lib/documents/index.js.map +0 -1
  174. package/lib/documents/inspect/facts.js +0 -161
  175. package/lib/documents/inspect/facts.js.map +0 -1
  176. package/lib/documents/inspect/zip.js +0 -108
  177. package/lib/documents/inspect/zip.js.map +0 -1
  178. package/lib/documents/markdown/directives.js +0 -135
  179. package/lib/documents/markdown/directives.js.map +0 -1
  180. package/lib/documents/markdown/frontmatter.js +0 -35
  181. package/lib/documents/markdown/frontmatter.js.map +0 -1
  182. package/lib/documents/markdown/normalize.js +0 -113
  183. package/lib/documents/markdown/normalize.js.map +0 -1
  184. package/lib/documents/orchestrator/assets.js +0 -243
  185. package/lib/documents/orchestrator/assets.js.map +0 -1
  186. package/lib/documents/orchestrator/convert-document.js +0 -186
  187. package/lib/documents/orchestrator/convert-document.js.map +0 -1
  188. package/lib/documents/orchestrator/create-document.js +0 -292
  189. package/lib/documents/orchestrator/create-document.js.map +0 -1
  190. package/lib/documents/orchestrator/extract-document.js +0 -162
  191. package/lib/documents/orchestrator/extract-document.js.map +0 -1
  192. package/lib/documents/orchestrator/inspect-document.js +0 -89
  193. package/lib/documents/orchestrator/inspect-document.js.map +0 -1
  194. package/lib/documents/orchestrator/runtime-deps.js +0 -59
  195. package/lib/documents/orchestrator/runtime-deps.js.map +0 -1
  196. package/lib/documents/orchestrator/scope.js +0 -132
  197. package/lib/documents/orchestrator/scope.js.map +0 -1
  198. package/lib/documents/providers/docling.js +0 -247
  199. package/lib/documents/providers/docling.js.map +0 -1
  200. package/lib/documents/providers/libreoffice.js +0 -130
  201. package/lib/documents/providers/libreoffice.js.map +0 -1
  202. package/lib/documents/providers/markitdown.js +0 -89
  203. package/lib/documents/providers/markitdown.js.map +0 -1
  204. package/lib/documents/providers/pandoc.js +0 -161
  205. package/lib/documents/providers/pandoc.js.map +0 -1
  206. package/lib/documents/providers/process.js +0 -164
  207. package/lib/documents/providers/process.js.map +0 -1
  208. package/lib/documents/providers/registry.js +0 -152
  209. package/lib/documents/providers/registry.js.map +0 -1
  210. package/lib/documents/providers/shared.js +0 -75
  211. package/lib/documents/providers/shared.js.map +0 -1
  212. package/lib/documents/runtime.js +0 -114
  213. package/lib/documents/runtime.js.map +0 -1
  214. package/lib/documents/security/file-types.js +0 -188
  215. package/lib/documents/security/file-types.js.map +0 -1
  216. package/lib/documents/security/limits.js +0 -78
  217. package/lib/documents/security/limits.js.map +0 -1
  218. package/lib/documents/security/mime.js +0 -43
  219. package/lib/documents/security/mime.js.map +0 -1
  220. package/lib/documents/security/paths.js +0 -133
  221. package/lib/documents/security/paths.js.map +0 -1
  222. package/lib/documents/templates/registry.js +0 -147
  223. package/lib/documents/templates/registry.js.map +0 -1
  224. package/lib/documents/templates/resolver.js +0 -59
  225. package/lib/documents/templates/resolver.js.map +0 -1
  226. package/lib/documents/tools/convert.js +0 -125
  227. package/lib/documents/tools/convert.js.map +0 -1
  228. package/lib/documents/tools/create.js +0 -187
  229. package/lib/documents/tools/create.js.map +0 -1
  230. package/lib/documents/tools/index.js +0 -41
  231. package/lib/documents/tools/index.js.map +0 -1
  232. package/lib/documents/tools/inspect.js +0 -135
  233. package/lib/documents/tools/inspect.js.map +0 -1
  234. package/lib/documents/tools/shared.js +0 -88
  235. package/lib/documents/tools/shared.js.map +0 -1
  236. package/lib/documents/tools/to-markdown.js +0 -125
  237. package/lib/documents/tools/to-markdown.js.map +0 -1
  238. package/lib/documents/types.js +0 -12
  239. package/lib/documents/types.js.map +0 -1
  240. package/lib/types/client/settings/sections/documents.d.ts +0 -13
  241. package/lib/types/documents/artifacts/ids.d.ts +0 -14
  242. package/lib/types/documents/artifacts/manifest.d.ts +0 -32
  243. package/lib/types/documents/artifacts/store.d.ts +0 -67
  244. package/lib/types/documents/capabilities.d.ts +0 -32
  245. package/lib/types/documents/config.d.ts +0 -27
  246. package/lib/types/documents/defaults.d.ts +0 -161
  247. package/lib/types/documents/errors.d.ts +0 -42
  248. package/lib/types/documents/index.d.ts +0 -63
  249. package/lib/types/documents/inspect/facts.d.ts +0 -43
  250. package/lib/types/documents/inspect/zip.d.ts +0 -28
  251. package/lib/types/documents/markdown/directives.d.ts +0 -39
  252. package/lib/types/documents/markdown/frontmatter.d.ts +0 -15
  253. package/lib/types/documents/markdown/normalize.d.ts +0 -30
  254. package/lib/types/documents/orchestrator/assets.d.ts +0 -55
  255. package/lib/types/documents/orchestrator/convert-document.d.ts +0 -25
  256. package/lib/types/documents/orchestrator/create-document.d.ts +0 -18
  257. package/lib/types/documents/orchestrator/extract-document.d.ts +0 -24
  258. package/lib/types/documents/orchestrator/inspect-document.d.ts +0 -12
  259. package/lib/types/documents/orchestrator/runtime-deps.d.ts +0 -43
  260. package/lib/types/documents/orchestrator/scope.d.ts +0 -52
  261. package/lib/types/documents/providers/docling.d.ts +0 -54
  262. package/lib/types/documents/providers/libreoffice.d.ts +0 -40
  263. package/lib/types/documents/providers/markitdown.d.ts +0 -28
  264. package/lib/types/documents/providers/pandoc.d.ts +0 -42
  265. package/lib/types/documents/providers/process.d.ts +0 -54
  266. package/lib/types/documents/providers/registry.d.ts +0 -68
  267. package/lib/types/documents/providers/shared.d.ts +0 -27
  268. package/lib/types/documents/runtime.d.ts +0 -59
  269. package/lib/types/documents/security/file-types.d.ts +0 -39
  270. package/lib/types/documents/security/limits.d.ts +0 -24
  271. package/lib/types/documents/security/mime.d.ts +0 -13
  272. package/lib/types/documents/security/paths.d.ts +0 -38
  273. package/lib/types/documents/templates/registry.d.ts +0 -50
  274. package/lib/types/documents/templates/resolver.d.ts +0 -30
  275. package/lib/types/documents/tools/convert.d.ts +0 -9
  276. package/lib/types/documents/tools/create.d.ts +0 -14
  277. package/lib/types/documents/tools/index.d.ts +0 -33
  278. package/lib/types/documents/tools/inspect.d.ts +0 -9
  279. package/lib/types/documents/tools/shared.d.ts +0 -77
  280. package/lib/types/documents/tools/to-markdown.d.ts +0 -12
  281. package/lib/types/documents/types.d.ts +0 -294
@@ -1,292 +0,0 @@
1
- /**
2
- * `document_create` orchestration (§8, §13, §14, §45).
3
- *
4
- * Markdown in, DOCX and/or PDF out, with the source, the assets and a manifest
5
- * kept beside the results. The orchestration is where the pipeline's promises
6
- * are actually kept:
7
- *
8
- * - the caller picks intent (formats, template name, pdf mode), never a
9
- * command line;
10
- * - a failure of the second format does not discard the first — partial
11
- * success is returned with a warning (§45);
12
- * - every produced file is fingerprinted and recorded in the manifest.
13
- */
14
- import path from "node:path";
15
- import { sha256Hex, sha256OfFile } from "../artifacts/store.js";
16
- import { buildManifest, outputRecord, writeManifest, } from "../artifacts/manifest.js";
17
- import { DocumentError, asDocumentError } from "../errors.js";
18
- import { applyDirectives } from "../markdown/directives.js";
19
- import { parseFrontMatter } from "../markdown/frontmatter.js";
20
- import { selectPdfMode } from "../providers/registry.js";
21
- import { assertCharsWithinBudget } from "../security/limits.js";
22
- import { sanitizeFilename } from "../security/paths.js";
23
- import { resolveTemplate } from "../templates/resolver.js";
24
- import { auditAssetReferences, prepareAssets, rewriteAssetReferences, } from "./assets.js";
25
- import { allowedInputRoots, ensureArtifactRoot, resolveDocumentScope, } from "./scope.js";
26
- import { withRenderSlot } from "./runtime-deps.js";
27
- const ARTIFACT_ID_SHORT_CHARS = 10;
28
- function validateFormats(formats, allowed) {
29
- if (!Array.isArray(formats) || formats.length === 0) {
30
- throw new DocumentError("INVALID_INPUT", "formats must list at least one of: docx, pdf");
31
- }
32
- const unique = [];
33
- for (const format of formats) {
34
- if (format !== "docx" && format !== "pdf") {
35
- throw new DocumentError("UNSUPPORTED_FORMAT", `"${String(format)}" is not a creatable format`);
36
- }
37
- if (!allowed.includes(format)) {
38
- throw new DocumentError("UNSUPPORTED_FORMAT", `this deployment does not create ${format.toUpperCase()} documents`, { details: { format, allowed } });
39
- }
40
- if (!unique.includes(format))
41
- unique.push(format);
42
- }
43
- return unique;
44
- }
45
- export async function createDocument(deps, input, scopeInput) {
46
- const config = deps.config;
47
- const started = Date.now();
48
- const formats = validateFormats(input.formats, config.create.allowFormats);
49
- if (typeof input.content !== "string" || input.content.trim() === "") {
50
- throw new DocumentError("INVALID_INPUT", "content must be non-empty Markdown");
51
- }
52
- assertCharsWithinBudget(input.content.length, config.limits.maxMarkdownChars, "content");
53
- const scope = await resolveDocumentScope(config, scopeInput);
54
- const signals = scope.signal === undefined ? {} : { signal: scope.signal };
55
- await ensureArtifactRoot(scope);
56
- const { artifactId, dir: artifactDir } = await scope.store.create(deps.now().getTime());
57
- const workDir = await scope.store.createWorkDir(artifactId);
58
- const warnings = [];
59
- try {
60
- const resolution = resolveTemplate(scope.templates, input.template, config.templates.default);
61
- warnings.push(...scope.templates.warnings, ...resolution.warnings);
62
- const frontMatter = parseFrontMatter(input.content);
63
- const metadata = {
64
- ...frontMatter.attributes,
65
- ...(input.metadata ?? {}),
66
- };
67
- const title = input.title ?? metadata["title"];
68
- const toc = input.options?.toc ?? config.create.toc;
69
- const retainSource = input.options?.preserveSource ?? config.storage.retainSource;
70
- const pdfModeRequested = input.options?.pdfMode ?? config.create.defaultPdfMode;
71
- const templateHasTypst = resolution.resolved.template?.typst !== undefined;
72
- const wantsPdf = formats.includes("pdf");
73
- const pdfMode = wantsPdf
74
- ? selectPdfMode({
75
- requested: pdfModeRequested,
76
- formats,
77
- templateHasTypst,
78
- typstEnabled: config.typst.enabled,
79
- })
80
- : "office";
81
- if (pdfMode === "office" &&
82
- resolution.resolved.template?.docx === undefined &&
83
- input.template !== undefined) {
84
- warnings.push({
85
- code: "TEMPLATE_DEFAULTED",
86
- message: `template "${resolution.resolved.name}" declares no DOCX layout; the backend's own defaults are in use`,
87
- details: { template: resolution.resolved.name },
88
- });
89
- }
90
- const directed = applyDirectives(frontMatter.body, {
91
- backend: pdfMode === "typst" && !formats.includes("docx") ? "typst" : "docx",
92
- allowRawMarkup: config.create.allowRawMarkup,
93
- });
94
- warnings.push(...directed.warnings);
95
- const assetsDir = await scope.store.ensureDir(path.join(artifactId, "assets"));
96
- const prepared = await prepareAssets(input.assets, {
97
- config,
98
- scope,
99
- assetsDir,
100
- });
101
- warnings.push(...prepared.warnings);
102
- const markdown = rewriteAssetReferences(directed.markdown, prepared.assets, {
103
- roots: allowedInputRoots(config, scope),
104
- });
105
- await auditAssetReferences(markdown, {
106
- assetsDir,
107
- assets: prepared.assets,
108
- });
109
- const sourcePath = path.join(retainSource ? artifactDir : workDir, "source.md");
110
- const sourceBytes = Buffer.from(markdown, "utf8");
111
- await scope.store.write(path.relative(scope.artifactRoot, sourcePath), sourceBytes);
112
- const stem = sanitizeFilename(input.filename, `document-${artifactId.slice(-ARTIFACT_ID_SHORT_CHARS).toLowerCase()}`, "");
113
- const outputs = [];
114
- const backends = {};
115
- const docxTarget = formats.includes("docx")
116
- ? path.join(artifactDir, `${stem}.docx`)
117
- : path.join(workDir, "intermediate.docx");
118
- let docxRendered;
119
- // The office route needs the DOCX as its intermediate; the Typst route
120
- // renders the Markdown directly, so it must not pay for a DOCX nobody sees.
121
- if (formats.includes("docx") || pdfMode === "office") {
122
- const rendered = await withRenderSlot(deps, scope.signal, async () => await deps.providers.docx.render({
123
- sourcePath,
124
- outputPath: docxTarget,
125
- workDir,
126
- assetsDir,
127
- ...(resolution.resolved.template?.docx === undefined
128
- ? {}
129
- : { referenceDocPath: resolution.resolved.template.docx }),
130
- templateName: resolution.resolved.name,
131
- ...(title === undefined ? {} : { title }),
132
- ...(Object.keys(metadata).length === 0 ? {} : { metadata }),
133
- toc,
134
- ...signals,
135
- }));
136
- docxRendered = rendered;
137
- backends["docx"] = rendered.backend;
138
- warnings.push(...rendered.warnings);
139
- if (formats.includes("docx")) {
140
- outputs.push(createdFile("docx", rendered));
141
- }
142
- }
143
- if (wantsPdf) {
144
- try {
145
- const pdfPath = path.join(artifactDir, `${stem}.pdf`);
146
- const rendered = await withRenderSlot(deps, scope.signal, async () => {
147
- if (pdfMode === "typst") {
148
- const typst = deps.providers.typstPdf;
149
- if (typst === undefined) {
150
- throw new DocumentError("BACKEND_UNAVAILABLE", "the Typst PDF route is not enabled in this deployment", { backend: "typst" });
151
- }
152
- return await typst.render({
153
- sourcePath,
154
- outputPath: pdfPath,
155
- workDir,
156
- assetsDir,
157
- templateName: resolution.resolved.name,
158
- ...(resolution.resolved.template?.typst === undefined
159
- ? {}
160
- : { typstTemplateDir: resolution.resolved.template.typst }),
161
- ...(input.options?.pageSize === undefined
162
- ? {}
163
- : { pageSize: input.options.pageSize }),
164
- ...(title === undefined ? {} : { title }),
165
- ...(Object.keys(metadata).length === 0 ? {} : { metadata }),
166
- toc,
167
- ...signals,
168
- });
169
- }
170
- const converter = deps.providers.converter;
171
- const docxPath = docxRendered?.path ?? docxTarget;
172
- const converted = await converter.convert({
173
- inputPath: docxPath,
174
- outputPath: pdfPath,
175
- workDir,
176
- ...signals,
177
- });
178
- return {
179
- path: converted.path,
180
- size: converted.size,
181
- sha256: converted.sha256,
182
- backend: converted.backend,
183
- warnings: converted.warnings,
184
- };
185
- });
186
- outputs.push(createdFile("pdf", rendered));
187
- backends["pdf"] = rendered.backend;
188
- warnings.push(...rendered.warnings);
189
- if (input.options?.pageSize !== undefined && formats.includes("docx")) {
190
- warnings.push({
191
- code: "PAGE_SIZE_NOT_APPLIED",
192
- message: "page size applies to the PDF layout only; DOCX page size comes from the template",
193
- details: { pageSize: input.options.pageSize },
194
- });
195
- }
196
- }
197
- catch (error) {
198
- const failure = asDocumentError(error, "CONVERSION_FAILED", "libreoffice");
199
- if (outputs.length === 0)
200
- throw failure;
201
- warnings.push({
202
- code: "FORMAT_FAILED",
203
- message: `the PDF copy could not be produced: ${failure.message}`,
204
- details: { code: failure.code, retryable: failure.retryable },
205
- });
206
- outputs.push({
207
- format: "pdf",
208
- path: path.join(artifactDir, `${stem}.pdf`),
209
- mediaType: "application/pdf",
210
- size: 0,
211
- sha256: "",
212
- status: "failed",
213
- error: failure.code,
214
- });
215
- }
216
- }
217
- const created = outputs.filter((file) => file.status === "created");
218
- if (created.length === 0) {
219
- throw new DocumentError("RENDER_FAILED", "no requested format could be produced", { details: { formats } });
220
- }
221
- const templateSha256 = resolution.resolved.template?.docx === undefined
222
- ? undefined
223
- : await sha256OfFile(resolution.resolved.template.docx);
224
- const manifest = buildManifest({
225
- artifactId,
226
- operation: "document_create",
227
- createdAt: deps.now().toISOString(),
228
- input: {
229
- format: "md",
230
- sha256: sha256Hex(sourceBytes),
231
- bytes: sourceBytes.length,
232
- },
233
- outputs: outputs.map(outputRecord),
234
- ...(resolution.resolved.template === undefined &&
235
- input.template === undefined
236
- ? {}
237
- : { template: resolution.resolved.name }),
238
- ...(templateSha256 === undefined ? {} : { templateSha256 }),
239
- backends,
240
- warnings,
241
- scope: {
242
- ...(scope.sessionId === undefined
243
- ? {}
244
- : { sessionId: scope.sessionId }),
245
- workspace: scope.workspaceRoot,
246
- },
247
- });
248
- const manifestPath = await writeManifest(scope.store, artifactId, manifest);
249
- await scope.store.removeWorkDir(workDir);
250
- deps.logger.info("documents.create", {
251
- artifactId,
252
- formats: formats.join(","),
253
- pdfMode: wantsPdf ? pdfMode : undefined,
254
- template: resolution.resolved.name,
255
- durationMs: Date.now() - started,
256
- bytes: created.reduce((total, file) => total + file.size, 0),
257
- status: warnings.some((warning) => warning.code === "FORMAT_FAILED")
258
- ? "partial"
259
- : "ok",
260
- });
261
- return {
262
- artifactId,
263
- ...(retainSource
264
- ? { source: { path: sourcePath, mediaType: "text/markdown" } }
265
- : {}),
266
- files: outputs,
267
- ...(resolution.resolved.template === undefined &&
268
- input.template === undefined
269
- ? {}
270
- : { template: resolution.resolved.name }),
271
- warnings,
272
- manifestPath,
273
- };
274
- }
275
- catch (error) {
276
- await scope.store.removeWorkDir(workDir);
277
- throw asDocumentError(error, "RENDER_FAILED");
278
- }
279
- }
280
- function createdFile(format, rendered) {
281
- return {
282
- format,
283
- path: rendered.path,
284
- mediaType: format === "pdf"
285
- ? "application/pdf"
286
- : "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
287
- size: rendered.size,
288
- sha256: rendered.sha256,
289
- status: "created",
290
- };
291
- }
292
- //# sourceMappingURL=create-document.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-document.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/create-document.ts"],"names":[],"mappings":"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"}
@@ -1,162 +0,0 @@
1
- /**
2
- * `document_to_markdown` orchestration (§9, §15, §16).
3
- *
4
- * The tool returns the extracted Markdown, and the bundle keeps it: the model
5
- * may only see a truncated view (a 300-page PDF is not a conversation), while
6
- * the artifact always carries the full text with its assets and manifest.
7
- */
8
- import path from "node:path";
9
- import { readPdfFacts } from "../inspect/facts.js";
10
- import { buildManifest, outputRecord, writeManifest, } from "../artifacts/manifest.js";
11
- import { sha256Hex } from "../artifacts/store.js";
12
- import { DocumentError, asDocumentError } from "../errors.js";
13
- import { normalizeExtractedMarkdown } from "../markdown/normalize.js";
14
- import { extractWithFallback, selectExtractor } from "../providers/registry.js";
15
- import { assertCountWithinBudget } from "../security/limits.js";
16
- import { sanitizeFilename } from "../security/paths.js";
17
- import { describeUnsupported, mediaTypeFor, sniffDocument, supportedFormatOf, } from "../security/file-types.js";
18
- import { ensureArtifactRoot, readInputBytes, resolveDocumentScope, resolveInputPath, } from "./scope.js";
19
- import { withExtractionSlot, withOcrSlot, } from "./runtime-deps.js";
20
- export async function extractToMarkdown(deps, params, scopeInput, operation) {
21
- const config = deps.config;
22
- const started = Date.now();
23
- const scope = await resolveDocumentScope(config, scopeInput);
24
- const signals = scope.signal === undefined ? {} : { signal: scope.signal };
25
- await ensureArtifactRoot(scope);
26
- const inputPath = await resolveInputPath(config, scope, params.file, "file");
27
- const bytes = await readInputBytes(inputPath, config, "file");
28
- const sniffed = sniffDocument(bytes, inputPath);
29
- const sourceFormat = supportedFormatOf(sniffed);
30
- if (sourceFormat === undefined) {
31
- throw new DocumentError(sniffed.format === "docm"
32
- ? "MACRO_ENABLED_DOCUMENT"
33
- : "UNSUPPORTED_FORMAT", describeUnsupported(sniffed, inputPath));
34
- }
35
- if (sourceFormat === "pdf" && readPdfFacts(bytes).encrypted) {
36
- throw new DocumentError("ENCRYPTED_DOCUMENT", "the PDF is encrypted; password-protected documents are not processed");
37
- }
38
- const mode = params.mode ?? config.extraction.defaultMode;
39
- const ocr = params.ocr ?? config.extraction.ocr;
40
- const ocrLanguages = params.ocrLanguages ?? config.extraction.ocrLanguages;
41
- const selection = selectExtractor(deps.providers, config, mode, sourceFormat);
42
- const { artifactId } = await scope.store.create(deps.now().getTime());
43
- const workDir = await scope.store.createWorkDir(artifactId);
44
- try {
45
- if (config.storage.retainInputs) {
46
- await scope.store.write(path.join(artifactId, "input", path.basename(inputPath)), bytes);
47
- }
48
- const assetsDir = await scope.store.ensureDir(path.join(artifactId, "assets"));
49
- const runExtraction = async () => await extractWithFallback(selection, {
50
- inputPath,
51
- workDir,
52
- assetsDir,
53
- ocr,
54
- ocrLanguages,
55
- extractImages: params.extractImages ?? config.extraction.extractImages,
56
- extractTables: params.extractTables ?? config.extraction.extractTables,
57
- preservePageMarkers: params.preservePageMarkers ?? config.extraction.preservePageMarkers,
58
- maxPages: config.limits.maxPages,
59
- maxImages: config.limits.maxExtractedImages,
60
- ...signals,
61
- });
62
- // OCR is the one stage with its own concurrency slot (§27).
63
- const { document: extracted, fellBackFrom } = ocr === "force"
64
- ? await withOcrSlot(deps, scope.signal, runExtraction)
65
- : await withExtractionSlot(deps, scope.signal, runExtraction);
66
- const warnings = [...extracted.warnings];
67
- if (fellBackFrom !== undefined) {
68
- warnings.push({
69
- code: "BACKEND_FALLBACK_USED",
70
- message: `${fellBackFrom} was unreachable; the operation continued with ${extracted.backend.provider}`,
71
- details: { from: fellBackFrom, to: extracted.backend.provider },
72
- });
73
- }
74
- if (extracted.pages !== undefined) {
75
- assertCountWithinBudget(extracted.pages, config.limits.maxPages, "the document's pages");
76
- }
77
- const normalized = normalizeExtractedMarkdown(extracted.markdown);
78
- warnings.push(...normalized.warnings);
79
- const markdownName = sanitizeFilename(params.outputFilename, "extracted", ".md");
80
- const written = await scope.store.write(path.join(artifactId, markdownName), normalized.markdown);
81
- const manifest = buildManifest({
82
- artifactId,
83
- operation,
84
- createdAt: deps.now().toISOString(),
85
- input: {
86
- format: sourceFormat,
87
- sha256: sha256Hex(bytes),
88
- filename: path.basename(inputPath),
89
- bytes: bytes.length,
90
- },
91
- outputs: [
92
- outputRecord({
93
- format: "md",
94
- path: written.path,
95
- mediaType: mediaTypeFor("md"),
96
- size: written.size,
97
- sha256: written.sha256,
98
- status: "created",
99
- }),
100
- ],
101
- backends: { extract: extracted.backend },
102
- warnings,
103
- scope: {
104
- ...(scope.sessionId === undefined
105
- ? {}
106
- : { sessionId: scope.sessionId }),
107
- workspace: scope.workspaceRoot,
108
- },
109
- });
110
- const manifestPath = await writeManifest(scope.store, artifactId, manifest);
111
- await scope.store.removeWorkDir(workDir);
112
- const inlineLimit = config.extraction.maxInlineChars;
113
- const inline = normalized.markdown.length > inlineLimit
114
- ? normalized.markdown.slice(0, inlineLimit)
115
- : normalized.markdown;
116
- if (inline.length < normalized.markdown.length) {
117
- warnings.push({
118
- code: "MARKDOWN_TRUNCATED",
119
- message: `the extracted Markdown is ${normalized.markdown.length} characters; the response carries the first ${inlineLimit} and the artifact keeps the whole text`,
120
- details: { chars: normalized.markdown.length, inline: inlineLimit },
121
- });
122
- }
123
- deps.logger.info("documents.extract", {
124
- artifactId,
125
- operation,
126
- format: sourceFormat,
127
- backend: extracted.backend.provider,
128
- ocr,
129
- pages: extracted.pages,
130
- durationMs: Date.now() - started,
131
- bytes: bytes.length,
132
- outBytes: written.size,
133
- status: "ok",
134
- });
135
- return {
136
- artifactId,
137
- markdown: inline,
138
- markdownPath: written.path,
139
- ...(extracted.assets.length === 0 ? {} : { assets: extracted.assets }),
140
- ...(extracted.pages === undefined ? {} : { pages: extracted.pages }),
141
- backend: extracted.backend.provider,
142
- warnings,
143
- manifestPath,
144
- };
145
- }
146
- catch (error) {
147
- await scope.store.removeWorkDir(workDir);
148
- const failure = asDocumentError(error, "EXTRACTION_FAILED");
149
- deps.logger.error("documents.extract.failed", {
150
- artifactId,
151
- format: sourceFormat,
152
- backend: selection.extractor.name,
153
- durationMs: Date.now() - started,
154
- code: failure.code,
155
- });
156
- throw failure;
157
- }
158
- }
159
- export async function toMarkdown(deps, input, scope) {
160
- return await extractToMarkdown(deps, input, scope, "document_to_markdown");
161
- }
162
- //# sourceMappingURL=extract-document.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-document.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/extract-document.ts"],"names":[],"mappings":"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"}
@@ -1,89 +0,0 @@
1
- /**
2
- * `document_inspect` orchestration (§11).
3
- *
4
- * A read-only pass over one file: what it is, how big it is, what it says
5
- * about itself, and what structure it holds. No artifact is created — the
6
- * operation answers a question, it does not make a document.
7
- */
8
- import path from "node:path";
9
- import { sha256Hex } from "../artifacts/store.js";
10
- import { DocumentError } from "../errors.js";
11
- import { mediaTypeOfDetected, readDocxFacts, readDocxMetadata, readPdfFacts, } from "../inspect/facts.js";
12
- import { markdownStructure } from "../markdown/normalize.js";
13
- import { sniffDocument } from "../security/file-types.js";
14
- import { readInputBytes, resolveDocumentScope, resolveInputPath, } from "./scope.js";
15
- export async function inspectDocument(deps, input, scopeInput) {
16
- const config = deps.config;
17
- if (typeof input.file !== "string" || input.file.trim() === "") {
18
- throw new DocumentError("INVALID_INPUT", "file must be a path");
19
- }
20
- const scope = await resolveDocumentScope(config, scopeInput);
21
- const inputPath = await resolveInputPath(config, scope, input.file, "file");
22
- const bytes = await readInputBytes(inputPath, config, "file");
23
- const sniffed = sniffDocument(bytes, inputPath);
24
- const warnings = [];
25
- const result = {
26
- filename: path.basename(inputPath),
27
- format: sniffed.format,
28
- mediaType: sniffed.mediaType === "application/octet-stream" ||
29
- sniffed.mediaType === "application/zip"
30
- ? mediaTypeOfDetected(sniffed.format)
31
- : sniffed.mediaType,
32
- size: bytes.length,
33
- sha256: sha256Hex(bytes),
34
- warnings,
35
- };
36
- if (sniffed.format === "pdf") {
37
- const facts = readPdfFacts(bytes);
38
- if (facts.encrypted) {
39
- // Reported, not refused: inspect exists to answer "what is this file",
40
- // and "an encrypted PDF" is a complete answer (§11).
41
- result.encrypted = true;
42
- }
43
- if (Object.keys(facts.metadata).length > 0) {
44
- result.metadata = facts.metadata;
45
- }
46
- else {
47
- warnings.push({
48
- code: "METADATA_PARTIALLY_EXTRACTED",
49
- message: "the document carries no readable document-information entries",
50
- });
51
- }
52
- result.structure = {
53
- ...(facts.pages === undefined ? {} : { pages: facts.pages }),
54
- ...(facts.images === undefined ? {} : { images: facts.images }),
55
- };
56
- }
57
- else if (sniffed.format === "docx" || sniffed.format === "docm") {
58
- const facts = readDocxFacts(bytes);
59
- const metadata = readDocxMetadata(bytes);
60
- if (Object.keys(metadata).length > 0) {
61
- result.metadata = metadata;
62
- }
63
- else {
64
- warnings.push({
65
- code: "METADATA_PARTIALLY_EXTRACTED",
66
- message: "the document carries no readable core properties",
67
- });
68
- }
69
- result.structure = { ...facts };
70
- if (sniffed.macroEnabled === true)
71
- result.macroEnabled = true;
72
- }
73
- else if (sniffed.format === "markdown") {
74
- const text = bytes.toString("utf8");
75
- result.structure = markdownStructure(text);
76
- }
77
- else {
78
- warnings.push({
79
- code: "METADATA_PARTIALLY_EXTRACTED",
80
- message: "the file is not a document format this pipeline recognizes",
81
- });
82
- }
83
- deps.logger.debug("documents.inspect", {
84
- format: sniffed.format,
85
- bytes: bytes.length,
86
- });
87
- return result;
88
- }
89
- //# sourceMappingURL=inspect-document.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect-document.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/inspect-document.ts"],"names":[],"mappings":"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"}
@@ -1,59 +0,0 @@
1
- /**
2
- * Runtime wiring shared by the four orchestrator operations.
3
- *
4
- * The runtime owns what must outlive a single call — the backend registry, the
5
- * concurrency semaphores and the clock — and each operation reads its
6
- * configuration and providers from here, so a test can substitute stub
7
- * backends without touching a tool definition.
8
- */
9
- import { createSemaphore } from "../security/limits.js";
10
- /** A logger that drops everything; the default when none is supplied. */
11
- export const silentDocumentLogger = {
12
- debug: () => undefined,
13
- info: () => undefined,
14
- warn: () => undefined,
15
- error: () => undefined,
16
- };
17
- export function createRuntimeDeps(options) {
18
- return {
19
- config: options.config,
20
- providers: options.providers,
21
- logger: options.logger ?? silentDocumentLogger,
22
- now: options.now ?? (() => new Date()),
23
- semaphores: {
24
- render: createSemaphore(options.config.workers.renderConcurrency),
25
- extraction: createSemaphore(options.config.workers.extractionConcurrency),
26
- ocr: createSemaphore(options.config.workers.ocrConcurrency),
27
- },
28
- };
29
- }
30
- /** Run `body` with one render slot held, releasing it on every path. */
31
- export async function withRenderSlot(deps, signal, body) {
32
- const release = await deps.semaphores.render.acquire(signal);
33
- try {
34
- return await body();
35
- }
36
- finally {
37
- release();
38
- }
39
- }
40
- export async function withExtractionSlot(deps, signal, body) {
41
- const release = await deps.semaphores.extraction.acquire(signal);
42
- try {
43
- return await body();
44
- }
45
- finally {
46
- release();
47
- }
48
- }
49
- /** OCR runs behind its own, narrower slot (§27: `ocrConcurrency`). */
50
- export async function withOcrSlot(deps, signal, body) {
51
- const release = await deps.semaphores.ocr.acquire(signal);
52
- try {
53
- return await body();
54
- }
55
- finally {
56
- release();
57
- }
58
- }
59
- //# sourceMappingURL=runtime-deps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-deps.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/runtime-deps.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,eAAe,EAAkB,MAAM,uBAAuB,CAAC;AAUxE,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;IACrB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;IACrB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;CACvB,CAAC;AAcF,MAAM,UAAU,iBAAiB,CAAC,OAKjC;IACC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,oBAAoB;QAC9C,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACtC,UAAU,EAAE;YACV,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACjE,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC;YACzE,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;SAC5D;KACF,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAyB,EACzB,MAA+B,EAC/B,IAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAyB,EACzB,MAA+B,EAC/B,IAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAyB,EACzB,MAA+B,EAC/B,IAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}