@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.
- package/README.md +163 -7
- package/capability-policy.json +1 -1
- package/lib/access/capability-catalog.js +144 -0
- package/lib/access/capability-catalog.js.map +1 -0
- package/lib/access/model.js +379 -0
- package/lib/access/model.js.map +1 -0
- package/lib/access/role-repository.js +195 -0
- package/lib/access/role-repository.js.map +1 -0
- package/lib/access/service.js +380 -0
- package/lib/access/service.js.map +1 -0
- package/lib/access/skill-metadata.js +234 -0
- package/lib/access/skill-metadata.js.map +1 -0
- package/lib/account-remotes.js +20 -10
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/file.js.map +1 -1
- package/lib/accounts/store.js +202 -3
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/conversation-log.js +256 -0
- package/lib/admin/conversation-log.js.map +1 -0
- package/lib/admin/index.js +17 -0
- package/lib/admin/index.js.map +1 -0
- package/lib/admin/metrics.js +103 -0
- package/lib/admin/metrics.js.map +1 -0
- package/lib/admin/paging.js +23 -0
- package/lib/admin/paging.js.map +1 -0
- package/lib/admin/permissions.js +50 -0
- package/lib/admin/permissions.js.map +1 -0
- package/lib/admin/quality-store.js +485 -0
- package/lib/admin/quality-store.js.map +1 -0
- package/lib/admin/queue.js +107 -0
- package/lib/admin/queue.js.map +1 -0
- package/lib/admin/redaction.js +45 -0
- package/lib/admin/redaction.js.map +1 -0
- package/lib/admin/service.js +897 -0
- package/lib/admin/service.js.map +1 -0
- package/lib/admin/session-log.js +142 -0
- package/lib/admin/session-log.js.map +1 -0
- package/lib/cli.js +9 -6
- package/lib/cli.js.map +1 -1
- package/lib/client/QaSessionController.js +28 -2
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +143 -5
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +1 -0
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +458 -0
- package/lib/client/admin/QaAdmin.js.map +1 -0
- package/lib/client/admin/format.js +177 -0
- package/lib/client/admin/format.js.map +1 -0
- package/lib/client/admin/pages/Conversations.js +114 -0
- package/lib/client/admin/pages/Conversations.js.map +1 -0
- package/lib/client/admin/pages/Overview.js +24 -0
- package/lib/client/admin/pages/Overview.js.map +1 -0
- package/lib/client/admin/pages/Quality.js +71 -0
- package/lib/client/admin/pages/Quality.js.map +1 -0
- package/lib/client/admin/pages/Review.js +93 -0
- package/lib/client/admin/pages/Review.js.map +1 -0
- package/lib/client/admin/pages/Users.js +95 -0
- package/lib/client/admin/pages/Users.js.map +1 -0
- package/lib/client/admin/routes.js +143 -0
- package/lib/client/admin/routes.js.map +1 -0
- package/lib/client/admin/shared.js +91 -0
- package/lib/client/admin/shared.js.map +1 -0
- package/lib/client/admin/styles.js +111 -0
- package/lib/client/admin/styles.js.map +1 -0
- package/lib/client/components/QaChangelog.js +53 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaHeader.js +3 -3
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +61 -2
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/create-session.js +1 -1
- package/lib/client/create-session.js.map +1 -1
- package/lib/client/index.js +48 -1
- package/lib/client/index.js.map +1 -1
- package/lib/client/role/RoleSelector.js +31 -0
- package/lib/client/role/RoleSelector.js.map +1 -0
- package/lib/client/session-sources.js +37 -1
- package/lib/client/session-sources.js.map +1 -1
- package/lib/client/settings/card.js +2 -2
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/sections.js +0 -1
- package/lib/client/settings/sections.js.map +1 -1
- package/lib/client/settings-extensions/index.js +1 -0
- package/lib/client/settings-extensions/index.js.map +1 -1
- package/lib/client/settings-extensions/user-session.js +62 -0
- package/lib/client/settings-extensions/user-session.js.map +1 -0
- package/lib/client/styles.js +31 -0
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client.js +9993 -4848
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/defaults.js +0 -2
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config.js +0 -249
- package/lib/config.js.map +1 -1
- package/lib/enforcement/skill-policy.js +172 -0
- package/lib/enforcement/skill-policy.js.map +1 -0
- package/lib/enforcement/tool-grants.js +151 -0
- package/lib/enforcement/tool-grants.js.map +1 -0
- package/lib/index.js +224 -42
- package/lib/index.js.map +1 -1
- package/lib/personal-skills/service.js +10 -3
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/qa-tools/index.js +4 -0
- package/lib/qa-tools/index.js.map +1 -1
- package/lib/resolve-config.js +0 -2
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +71 -17
- package/lib/secure-session.js.map +1 -1
- package/lib/typert.host.js +2237 -202
- package/lib/typert.remote-client.d.ts +49 -3
- package/lib/typert.remote-client.js +1863 -183
- package/lib/types/access/capability-catalog.d.ts +37 -0
- package/lib/types/access/model.d.ts +60 -0
- package/lib/types/access/role-repository.d.ts +32 -0
- package/lib/types/access/service.d.ts +57 -0
- package/lib/types/access/skill-metadata.d.ts +53 -0
- package/lib/types/account-remotes.d.ts +6 -0
- package/lib/types/accounts/errors.d.ts +1 -1
- package/lib/types/accounts/file.d.ts +16 -5
- package/lib/types/accounts/store.d.ts +83 -3
- package/lib/types/admin/conversation-log.d.ts +39 -0
- package/lib/types/admin/index.d.ts +24 -0
- package/lib/types/admin/metrics.d.ts +29 -0
- package/lib/types/admin/paging.d.ts +33 -0
- package/lib/types/admin/permissions.d.ts +10 -0
- package/lib/types/admin/quality-store.d.ts +82 -0
- package/lib/types/admin/queue.d.ts +21 -0
- package/lib/types/admin/redaction.d.ts +29 -0
- package/lib/types/admin/service.d.ts +105 -0
- package/lib/types/admin/session-log.d.ts +53 -0
- package/lib/types/client/QaSessionController.d.ts +12 -1
- package/lib/types/client/QaSurface.d.ts +7 -1
- package/lib/types/client/admin/QaAdmin.d.ts +17 -0
- package/lib/types/client/admin/format.d.ts +43 -0
- package/lib/types/client/admin/pages/Conversations.d.ts +21 -0
- package/lib/types/client/admin/pages/Overview.d.ts +13 -0
- package/lib/types/client/admin/pages/Quality.d.ts +18 -0
- package/lib/types/client/admin/pages/Review.d.ts +15 -0
- package/lib/types/client/admin/pages/Users.d.ts +22 -0
- package/lib/types/client/admin/routes.d.ts +60 -0
- package/lib/types/client/admin/shared.d.ts +53 -0
- package/lib/types/client/admin/styles.d.ts +11 -0
- package/lib/types/client/components/QaHeader.d.ts +5 -1
- package/lib/types/client/components/QaMessage.d.ts +14 -1
- package/lib/types/client/create-session.d.ts +2 -0
- package/lib/types/client/role/RoleSelector.d.ts +14 -0
- package/lib/types/client/session-sources.d.ts +9 -0
- package/lib/types/client/settings/sections.d.ts +0 -1
- package/lib/types/client/settings-extensions/index.d.ts +2 -0
- package/lib/types/client/settings-extensions/user-session.d.ts +59 -0
- package/lib/types/client/types.d.ts +39 -2
- package/lib/types/enforcement/skill-policy.d.ts +29 -0
- package/lib/types/enforcement/tool-grants.d.ts +84 -0
- package/lib/types/index.d.ts +62 -14
- package/lib/types/qa-tools/index.d.ts +2 -0
- package/lib/types/secure-session.d.ts +10 -1
- package/lib/types/types.d.ts +568 -5
- package/package.json +2 -2
- package/lib/client/settings/sections/documents.js +0 -88
- package/lib/client/settings/sections/documents.js.map +0 -1
- package/lib/documents/artifacts/ids.js +0 -43
- package/lib/documents/artifacts/ids.js.map +0 -1
- package/lib/documents/artifacts/manifest.js +0 -66
- package/lib/documents/artifacts/manifest.js.map +0 -1
- package/lib/documents/artifacts/store.js +0 -169
- package/lib/documents/artifacts/store.js.map +0 -1
- package/lib/documents/capabilities.js +0 -93
- package/lib/documents/capabilities.js.map +0 -1
- package/lib/documents/config.js +0 -302
- package/lib/documents/config.js.map +0 -1
- package/lib/documents/defaults.js +0 -78
- package/lib/documents/defaults.js.map +0 -1
- package/lib/documents/errors.js +0 -101
- package/lib/documents/errors.js.map +0 -1
- package/lib/documents/index.js +0 -80
- package/lib/documents/index.js.map +0 -1
- package/lib/documents/inspect/facts.js +0 -161
- package/lib/documents/inspect/facts.js.map +0 -1
- package/lib/documents/inspect/zip.js +0 -108
- package/lib/documents/inspect/zip.js.map +0 -1
- package/lib/documents/markdown/directives.js +0 -135
- package/lib/documents/markdown/directives.js.map +0 -1
- package/lib/documents/markdown/frontmatter.js +0 -35
- package/lib/documents/markdown/frontmatter.js.map +0 -1
- package/lib/documents/markdown/normalize.js +0 -113
- package/lib/documents/markdown/normalize.js.map +0 -1
- package/lib/documents/orchestrator/assets.js +0 -243
- package/lib/documents/orchestrator/assets.js.map +0 -1
- package/lib/documents/orchestrator/convert-document.js +0 -186
- package/lib/documents/orchestrator/convert-document.js.map +0 -1
- package/lib/documents/orchestrator/create-document.js +0 -292
- package/lib/documents/orchestrator/create-document.js.map +0 -1
- package/lib/documents/orchestrator/extract-document.js +0 -162
- package/lib/documents/orchestrator/extract-document.js.map +0 -1
- package/lib/documents/orchestrator/inspect-document.js +0 -89
- package/lib/documents/orchestrator/inspect-document.js.map +0 -1
- package/lib/documents/orchestrator/runtime-deps.js +0 -59
- package/lib/documents/orchestrator/runtime-deps.js.map +0 -1
- package/lib/documents/orchestrator/scope.js +0 -132
- package/lib/documents/orchestrator/scope.js.map +0 -1
- package/lib/documents/providers/docling.js +0 -247
- package/lib/documents/providers/docling.js.map +0 -1
- package/lib/documents/providers/libreoffice.js +0 -130
- package/lib/documents/providers/libreoffice.js.map +0 -1
- package/lib/documents/providers/markitdown.js +0 -89
- package/lib/documents/providers/markitdown.js.map +0 -1
- package/lib/documents/providers/pandoc.js +0 -161
- package/lib/documents/providers/pandoc.js.map +0 -1
- package/lib/documents/providers/process.js +0 -164
- package/lib/documents/providers/process.js.map +0 -1
- package/lib/documents/providers/registry.js +0 -152
- package/lib/documents/providers/registry.js.map +0 -1
- package/lib/documents/providers/shared.js +0 -75
- package/lib/documents/providers/shared.js.map +0 -1
- package/lib/documents/runtime.js +0 -114
- package/lib/documents/runtime.js.map +0 -1
- package/lib/documents/security/file-types.js +0 -188
- package/lib/documents/security/file-types.js.map +0 -1
- package/lib/documents/security/limits.js +0 -78
- package/lib/documents/security/limits.js.map +0 -1
- package/lib/documents/security/mime.js +0 -43
- package/lib/documents/security/mime.js.map +0 -1
- package/lib/documents/security/paths.js +0 -133
- package/lib/documents/security/paths.js.map +0 -1
- package/lib/documents/templates/registry.js +0 -147
- package/lib/documents/templates/registry.js.map +0 -1
- package/lib/documents/templates/resolver.js +0 -59
- package/lib/documents/templates/resolver.js.map +0 -1
- package/lib/documents/tools/convert.js +0 -125
- package/lib/documents/tools/convert.js.map +0 -1
- package/lib/documents/tools/create.js +0 -187
- package/lib/documents/tools/create.js.map +0 -1
- package/lib/documents/tools/index.js +0 -41
- package/lib/documents/tools/index.js.map +0 -1
- package/lib/documents/tools/inspect.js +0 -135
- package/lib/documents/tools/inspect.js.map +0 -1
- package/lib/documents/tools/shared.js +0 -88
- package/lib/documents/tools/shared.js.map +0 -1
- package/lib/documents/tools/to-markdown.js +0 -125
- package/lib/documents/tools/to-markdown.js.map +0 -1
- package/lib/documents/types.js +0 -12
- package/lib/documents/types.js.map +0 -1
- package/lib/types/client/settings/sections/documents.d.ts +0 -13
- package/lib/types/documents/artifacts/ids.d.ts +0 -14
- package/lib/types/documents/artifacts/manifest.d.ts +0 -32
- package/lib/types/documents/artifacts/store.d.ts +0 -67
- package/lib/types/documents/capabilities.d.ts +0 -32
- package/lib/types/documents/config.d.ts +0 -27
- package/lib/types/documents/defaults.d.ts +0 -161
- package/lib/types/documents/errors.d.ts +0 -42
- package/lib/types/documents/index.d.ts +0 -63
- package/lib/types/documents/inspect/facts.d.ts +0 -43
- package/lib/types/documents/inspect/zip.d.ts +0 -28
- package/lib/types/documents/markdown/directives.d.ts +0 -39
- package/lib/types/documents/markdown/frontmatter.d.ts +0 -15
- package/lib/types/documents/markdown/normalize.d.ts +0 -30
- package/lib/types/documents/orchestrator/assets.d.ts +0 -55
- package/lib/types/documents/orchestrator/convert-document.d.ts +0 -25
- package/lib/types/documents/orchestrator/create-document.d.ts +0 -18
- package/lib/types/documents/orchestrator/extract-document.d.ts +0 -24
- package/lib/types/documents/orchestrator/inspect-document.d.ts +0 -12
- package/lib/types/documents/orchestrator/runtime-deps.d.ts +0 -43
- package/lib/types/documents/orchestrator/scope.d.ts +0 -52
- package/lib/types/documents/providers/docling.d.ts +0 -54
- package/lib/types/documents/providers/libreoffice.d.ts +0 -40
- package/lib/types/documents/providers/markitdown.d.ts +0 -28
- package/lib/types/documents/providers/pandoc.d.ts +0 -42
- package/lib/types/documents/providers/process.d.ts +0 -54
- package/lib/types/documents/providers/registry.d.ts +0 -68
- package/lib/types/documents/providers/shared.d.ts +0 -27
- package/lib/types/documents/runtime.d.ts +0 -59
- package/lib/types/documents/security/file-types.d.ts +0 -39
- package/lib/types/documents/security/limits.d.ts +0 -24
- package/lib/types/documents/security/mime.d.ts +0 -13
- package/lib/types/documents/security/paths.d.ts +0 -38
- package/lib/types/documents/templates/registry.d.ts +0 -50
- package/lib/types/documents/templates/resolver.d.ts +0 -30
- package/lib/types/documents/tools/convert.d.ts +0 -9
- package/lib/types/documents/tools/create.d.ts +0 -14
- package/lib/types/documents/tools/index.d.ts +0 -33
- package/lib/types/documents/tools/inspect.d.ts +0 -9
- package/lib/types/documents/tools/shared.d.ts +0 -77
- package/lib/types/documents/tools/to-markdown.d.ts +0 -12
- 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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"}
|