@yadsh/dsh-qa-surface 0.9.0 → 0.10.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 (130) hide show
  1. package/README.md +29 -1
  2. package/lib/admin/service.js +7 -7
  3. package/lib/admin/service.js.map +1 -1
  4. package/lib/client/QaSessionController.js +12 -0
  5. package/lib/client/QaSessionController.js.map +1 -1
  6. package/lib/client/QaSurface.js +23 -5
  7. package/lib/client/QaSurface.js.map +1 -1
  8. package/lib/client/QaSurfaceGuard.js +12 -5
  9. package/lib/client/QaSurfaceGuard.js.map +1 -1
  10. package/lib/client/admin/QaAdmin.js +5 -1
  11. package/lib/client/admin/QaAdmin.js.map +1 -1
  12. package/lib/client/admin/pages/Users.js +9 -2
  13. package/lib/client/admin/pages/Users.js.map +1 -1
  14. package/lib/client/admin/shared.js +5 -1
  15. package/lib/client/admin/shared.js.map +1 -1
  16. package/lib/client/base64.js +22 -1
  17. package/lib/client/base64.js.map +1 -1
  18. package/lib/client/components/QaAgentsDrawer.js +9 -6
  19. package/lib/client/components/QaAgentsDrawer.js.map +1 -1
  20. package/lib/client/components/QaApproval.js +1 -1
  21. package/lib/client/components/QaApproval.js.map +1 -1
  22. package/lib/client/components/QaChangelog.js +29 -0
  23. package/lib/client/components/QaChangelog.js.map +1 -1
  24. package/lib/client/components/QaFilesPanel.js +17 -11
  25. package/lib/client/components/QaFilesPanel.js.map +1 -1
  26. package/lib/client/components/QaHeader.js +3 -11
  27. package/lib/client/components/QaHeader.js.map +1 -1
  28. package/lib/client/components/QaModal.js.map +1 -1
  29. package/lib/client/components/QaQuestions.js +4 -4
  30. package/lib/client/components/QaQuestions.js.map +1 -1
  31. package/lib/client/components/QaSidebar.js +10 -2
  32. package/lib/client/components/QaSidebar.js.map +1 -1
  33. package/lib/client/components/QaWidthHandle.js +111 -5
  34. package/lib/client/components/QaWidthHandle.js.map +1 -1
  35. package/lib/client/components/QaWorkspaceBrowser.js +231 -0
  36. package/lib/client/components/QaWorkspaceBrowser.js.map +1 -0
  37. package/lib/client/index.js +109 -53
  38. package/lib/client/index.js.map +1 -1
  39. package/lib/client/kiosk.js +51 -0
  40. package/lib/client/kiosk.js.map +1 -0
  41. package/lib/client/markdown/blocks.js +122 -7
  42. package/lib/client/markdown/blocks.js.map +1 -1
  43. package/lib/client/markdown/inline.js +108 -12
  44. package/lib/client/markdown/inline.js.map +1 -1
  45. package/lib/client/markdown/katex-css.js +12 -0
  46. package/lib/client/markdown/katex-css.js.map +1 -0
  47. package/lib/client/markdown/math.js +84 -0
  48. package/lib/client/markdown/math.js.map +1 -0
  49. package/lib/client/markdown/render.js +74 -5
  50. package/lib/client/markdown/render.js.map +1 -1
  51. package/lib/client/settings/card.js +2 -2
  52. package/lib/client/settings/card.js.map +1 -1
  53. package/lib/client/settings/sections/notes.js +46 -0
  54. package/lib/client/settings/sections/notes.js.map +1 -0
  55. package/lib/client/settings/sections/sources.js +4 -1
  56. package/lib/client/settings/sections/sources.js.map +1 -1
  57. package/lib/client/settings/sections.js +1 -0
  58. package/lib/client/settings/sections.js.map +1 -1
  59. package/lib/client/settlement.js +1 -1
  60. package/lib/client/settlement.js.map +1 -1
  61. package/lib/client/source-preview.js +3 -0
  62. package/lib/client/source-preview.js.map +1 -1
  63. package/lib/client/styles.js +97 -18
  64. package/lib/client/styles.js.map +1 -1
  65. package/lib/client/types.js.map +1 -1
  66. package/lib/client.js +28587 -595
  67. package/lib/client.js.map +1 -1
  68. package/lib/config-resolvers/defaults.js +10 -0
  69. package/lib/config-resolvers/defaults.js.map +1 -1
  70. package/lib/config-resolvers/notes.js +24 -0
  71. package/lib/config-resolvers/notes.js.map +1 -0
  72. package/lib/config-resolvers/sources.js +4 -0
  73. package/lib/config-resolvers/sources.js.map +1 -1
  74. package/lib/config.js +35 -0
  75. package/lib/config.js.map +1 -1
  76. package/lib/index.js +151 -10
  77. package/lib/index.js.map +1 -1
  78. package/lib/prompt-notes.js +45 -6
  79. package/lib/prompt-notes.js.map +1 -1
  80. package/lib/provenance/document-preview.js +51 -0
  81. package/lib/provenance/document-preview.js.map +1 -0
  82. package/lib/provenance/file-preview.js +191 -19
  83. package/lib/provenance/file-preview.js.map +1 -1
  84. package/lib/qa-tools/catalog.js +7 -1
  85. package/lib/qa-tools/catalog.js.map +1 -1
  86. package/lib/qa-tools/file-delete-gate.js +60 -0
  87. package/lib/qa-tools/file-delete-gate.js.map +1 -0
  88. package/lib/qa-tools/file-delete.js +156 -0
  89. package/lib/qa-tools/file-delete.js.map +1 -0
  90. package/lib/resolve-config.js +2 -0
  91. package/lib/resolve-config.js.map +1 -1
  92. package/lib/shared/documents.js +22 -0
  93. package/lib/shared/documents.js.map +1 -0
  94. package/lib/typert.host.js +278 -55
  95. package/lib/typert.remote-client.d.ts +7 -1
  96. package/lib/typert.remote-client.js +239 -53
  97. package/lib/types/client/admin/shared.d.ts +2 -0
  98. package/lib/types/client/base64.d.ts +13 -1
  99. package/lib/types/client/components/QaAgentsDrawer.d.ts +2 -1
  100. package/lib/types/client/components/QaFilesPanel.d.ts +16 -4
  101. package/lib/types/client/components/QaHeader.d.ts +9 -3
  102. package/lib/types/client/components/QaModal.d.ts +4 -3
  103. package/lib/types/client/components/QaWidthHandle.d.ts +48 -2
  104. package/lib/types/client/components/QaWorkspaceBrowser.d.ts +15 -0
  105. package/lib/types/client/index.d.ts +1 -1
  106. package/lib/types/client/kiosk.d.ts +34 -0
  107. package/lib/types/client/markdown/blocks.d.ts +14 -1
  108. package/lib/types/client/markdown/inline.d.ts +23 -7
  109. package/lib/types/client/markdown/katex-css.d.ts +11 -0
  110. package/lib/types/client/markdown/math.d.ts +23 -0
  111. package/lib/types/client/markdown/render.d.ts +2 -1
  112. package/lib/types/client/settings/sections/notes.d.ts +10 -0
  113. package/lib/types/client/settings/sections.d.ts +1 -0
  114. package/lib/types/client/settlement.d.ts +4 -1
  115. package/lib/types/client/styles.d.ts +15 -2
  116. package/lib/types/client/types.d.ts +50 -1
  117. package/lib/types/config-resolvers/notes.d.ts +10 -0
  118. package/lib/types/index.d.ts +39 -1
  119. package/lib/types/prompt-notes.d.ts +9 -0
  120. package/lib/types/provenance/document-preview.d.ts +24 -0
  121. package/lib/types/provenance/file-preview.d.ts +69 -2
  122. package/lib/types/qa-tools/catalog.d.ts +1 -1
  123. package/lib/types/qa-tools/file-delete-gate.d.ts +42 -0
  124. package/lib/types/qa-tools/file-delete.d.ts +32 -0
  125. package/lib/types/shared/documents.d.ts +20 -0
  126. package/lib/types/types.d.ts +93 -1
  127. package/lib/types/ui-mode.d.ts +18 -0
  128. package/lib/ui-mode.js +22 -0
  129. package/lib/ui-mode.js.map +1 -0
  130. package/package.json +10 -8
@@ -1,4 +1,5 @@
1
1
  import { defineTool } from "@deepseek-ai/dsh-tools";
2
+ import { createFileDeleteTool } from "./file-delete.js";
2
3
  /**
3
4
  * Deterministic catalog identity. The durable activation marker is derived from
4
5
  * the session log rather than stored, so this version is not compared against a
@@ -7,7 +8,7 @@ import { defineTool } from "@deepseek-ai/dsh-tools";
7
8
  *
8
9
  * Bump it whenever the catalog's tool set or their schemas change.
9
10
  */
10
- export const QA_TOOL_CATALOG_VERSION = "1";
11
+ export const QA_TOOL_CATALOG_VERSION = "2";
11
12
  function createSelfcheckTool(deps) {
12
13
  return defineTool({
13
14
  name: "qa_tools_selfcheck",
@@ -79,6 +80,11 @@ export function createQaToolCatalog(deps) {
79
80
  group: "diagnostics",
80
81
  tags: ["activation", "diagnostics"],
81
82
  },
83
+ {
84
+ definition: createFileDeleteTool(),
85
+ group: "workspace",
86
+ tags: ["files", "destructive"],
87
+ },
82
88
  ];
83
89
  }
84
90
  /** QA tool names, in catalog order; the admission gate treats them as dynamic. */
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/qa-tools/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/qa-tools/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /** The one QA tool whose every call is parked for the operator. */
2
+ export const QA_FILE_DELETE_TOOL = "file_delete";
3
+ /** Why the gate answers `ask` before the chain can decide alone. */
4
+ export const QA_FILE_DELETE_ASK_REASON = "deleting a workspace file requires operator confirmation";
5
+ /**
6
+ * The inner half of `file_delete`'s safety: the decision that composes the
7
+ * approval flow around one destructive tool.
8
+ *
9
+ * Installed WITHOUT `prepend`, deliberately. The approval gate sits outside
10
+ * every other `tools/pre-execute` listener and resolves the decision the rest
11
+ * of the chain produced — an `ask` from an inner gate is what it parks for
12
+ * the operator. This listener is that inner gate: for a `file_delete` call
13
+ * from an attested QA session it answers `ask` on its own, without asking
14
+ * the chain, so the interactive approval card appears for every deletion,
15
+ * whatever the deployment's other policies would have said. The operator's
16
+ * answer becomes the decision, and on a deployment with
17
+ * `interaction.approvals: blocked` the approval gate keeps its fail-closed
18
+ * behavior and refuses the call — nothing is ever deleted without a person.
19
+ *
20
+ * Any other tool, and any caller this deployment did not attest, is handed
21
+ * back to the chain untouched.
22
+ */
23
+ export class QaFileDeleteGate {
24
+ ctx;
25
+ ownership;
26
+ disposers = [];
27
+ constructor(ctx, ownership) {
28
+ this.ctx = ctx;
29
+ this.ownership = ownership;
30
+ }
31
+ /** Sit inside the approval gate; registration order is the composition. */
32
+ install() {
33
+ this.ownership.install(this.ctx);
34
+ this.disposers.push(this.ctx.on("tools/pre-execute", (execution, next) => this.handle(execution, next)));
35
+ }
36
+ /** Detach the listener. Wired as an effect, like every other gate. */
37
+ dispose() {
38
+ for (const dispose of this.disposers.splice(0))
39
+ dispose();
40
+ }
41
+ async handle(execution, next) {
42
+ if (execution.name !== QA_FILE_DELETE_TOOL)
43
+ return next();
44
+ if (!this.attested(execution))
45
+ return next();
46
+ return { kind: "ask", reason: QA_FILE_DELETE_ASK_REASON };
47
+ }
48
+ /**
49
+ * Whether this deployment attested the chat the call belongs to, delegated
50
+ * children included. The same ownership service the approval gate reads,
51
+ * so one chat is parked under exactly one surface.
52
+ */
53
+ attested(execution) {
54
+ const session = execution.agent?.session;
55
+ if (session === undefined)
56
+ return false;
57
+ return this.ownership.rootOf(String(session.id)) !== undefined;
58
+ }
59
+ }
60
+ //# sourceMappingURL=file-delete-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-delete-gate.js","sourceRoot":"","sources":["../../src/qa-tools/file-delete-gate.ts"],"names":[],"mappings":"AAKA,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEjD,oEAAoE;AACpE,MAAM,CAAC,MAAM,yBAAyB,GACpC,0DAA0D,CAAC;AAE7D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,gBAAgB;IAIR,GAAG;IACH,SAAS;IAJX,SAAS,GAAmB,EAAE,CAAC;IAEhD,YACmB,GAAY,EACZ,SAA6B;mBAD7B,GAAG;yBACH,SAAS;IACzB,CAAC;IAEJ,2EAA2E;IAC3E,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CACnD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAC7B,CACF,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,OAAO;QACL,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,MAAM,CAClB,SAA8B,EAC9B,IAAoC;QAEpC,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB;YAAE,OAAO,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QAC7C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACK,QAAQ,CAAC,SAA8B;QAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;QACzC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,156 @@
1
+ import { realpath, stat, unlink } from "node:fs/promises";
2
+ import { basename, dirname, isAbsolute, relative, resolve, sep, } from "node:path";
3
+ import { defineTool } from "@deepseek-ai/dsh-tools";
4
+ /**
5
+ * A typed refusal of one `file_delete` call.
6
+ *
7
+ * The message is what the model reads; it names the reason in words and
8
+ * deliberately never echoes the requested absolute host path, so a refusal
9
+ * cannot leak the deployment's layout into the conversation.
10
+ */
11
+ export class QaFileDeleteError extends Error {
12
+ code;
13
+ constructor(code, message, options = {}) {
14
+ super(message, options);
15
+ this.code = code;
16
+ this.name = "QaFileDeleteError";
17
+ }
18
+ }
19
+ const OUTSIDE_WORKSPACE = "file_delete refused this path: it resolves outside the calling session's workspace. Only files inside the workspace can be deleted; pass a path relative to the workspace root.";
20
+ const SYMLINK_ESCAPE = "file_delete refused this path: it escapes the workspace through a symbolic link, and links may not be followed out of the workspace.";
21
+ const NOT_FOUND = "file_delete refused this path: no file exists there. Check the spelling relative to the workspace root, or create the file first.";
22
+ const NOT_A_FILE = "file_delete refused this path: it is a directory, and only a regular file can be deleted.";
23
+ /**
24
+ * The calling agent's workspace root, resolved on disk.
25
+ *
26
+ * A session without a cwd gets a refusal rather than the host process's cwd:
27
+ * guessing a root would point the fence at whatever directory the Host was
28
+ * started from, which is exactly where an untrusted chat must not delete.
29
+ */
30
+ async function workspaceRootOf(exec) {
31
+ const cwd = exec.agent?.session.header.cwd;
32
+ if (typeof cwd !== "string" || cwd.trim() === "") {
33
+ throw new QaFileDeleteError("workspace-unavailable", "file_delete needs the calling session's workspace root, which this execution does not carry, so nothing is deleted.");
34
+ }
35
+ try {
36
+ return await realpath(cwd);
37
+ }
38
+ catch {
39
+ throw new QaFileDeleteError("workspace-unavailable", "file_delete could not resolve the calling session's workspace root on disk, so nothing is deleted.");
40
+ }
41
+ }
42
+ /**
43
+ * Whether `target` sits inside `root` once both are canonical. The root
44
+ * itself counts as inside: it is a directory, and the regular-file check is
45
+ * what refuses it, with a reason that matches what is actually there.
46
+ */
47
+ function insideRoot(root, target) {
48
+ const fromRoot = relative(root, target);
49
+ return (fromRoot === "" ||
50
+ (!fromRoot.startsWith(`..${sep}`) &&
51
+ fromRoot !== ".." &&
52
+ !isAbsolute(fromRoot)));
53
+ }
54
+ /**
55
+ * Canonical form of `input`: the deepest existing ancestor resolved with
56
+ * `fs.realpath`, the missing suffix re-attached. A final entry that does not
57
+ * exist is still checked against the boundary its existing ancestors really
58
+ * live behind, so a symlinked directory cannot carry a request out of the
59
+ * workspace even when the target file is absent.
60
+ */
61
+ async function canonicalCandidate(input) {
62
+ const resolved = resolve(input);
63
+ const suffix = [];
64
+ let cursor = resolved;
65
+ for (;;) {
66
+ try {
67
+ return resolve(await realpath(cursor), ...suffix);
68
+ }
69
+ catch (error) {
70
+ if (error.code !== "ENOENT")
71
+ throw error;
72
+ const parent = dirname(cursor);
73
+ if (parent === cursor)
74
+ throw error;
75
+ suffix.unshift(basename(cursor));
76
+ cursor = parent;
77
+ }
78
+ }
79
+ }
80
+ export function createFileDeleteTool() {
81
+ return defineTool({
82
+ name: "file_delete",
83
+ description: "Delete one regular file inside this session's workspace. Use it to remove scratch files a task produced and no longer needs. Directories, missing paths and anything outside the workspace — including paths that escape through a symbolic link — are refused. Every deletion is confirmed by the operator before it runs.",
84
+ parameters: {
85
+ path: {
86
+ type: "string",
87
+ required: true,
88
+ description: "The file to delete. Relative paths start at the workspace root; an absolute path must stay inside it.",
89
+ },
90
+ },
91
+ output: {
92
+ schema: {
93
+ type: "object",
94
+ additionalProperties: false,
95
+ properties: {
96
+ deleted: { type: "boolean", required: true },
97
+ path: { type: "string", required: true },
98
+ },
99
+ },
100
+ render: (_args, value) => {
101
+ const record = value;
102
+ return [
103
+ {
104
+ type: "text",
105
+ text: `Deleted ${String(record.path)} from the workspace.`,
106
+ },
107
+ ];
108
+ },
109
+ },
110
+ execute: async (args, exec) => {
111
+ const root = await workspaceRootOf(exec);
112
+ // Refuse the spelling first: a path that already leaves the root
113
+ // without any symlink has no reason to touch the filesystem further.
114
+ const absolute = isAbsolute(args.path)
115
+ ? resolve(args.path)
116
+ : resolve(root, args.path);
117
+ if (!insideRoot(root, absolute)) {
118
+ throw new QaFileDeleteError("outside-workspace", OUTSIDE_WORKSPACE);
119
+ }
120
+ let canonical;
121
+ try {
122
+ canonical = await canonicalCandidate(absolute);
123
+ }
124
+ catch {
125
+ throw new QaFileDeleteError("workspace-unavailable", "file_delete could not verify the requested path against the workspace boundary, so nothing is deleted.");
126
+ }
127
+ if (!insideRoot(root, canonical)) {
128
+ // The spelling stayed inside but a symbolic link moved the request
129
+ // out: the honest reason names the link, not the workspace.
130
+ throw new QaFileDeleteError("symlink-escape", SYMLINK_ESCAPE);
131
+ }
132
+ const info = await stat(canonical).catch((error) => error);
133
+ if (info instanceof Error) {
134
+ if (info.code === "ENOENT") {
135
+ throw new QaFileDeleteError("not-found", NOT_FOUND);
136
+ }
137
+ throw new QaFileDeleteError("workspace-unavailable", "file_delete could not inspect the requested entry, so nothing is deleted.");
138
+ }
139
+ if (!info.isFile()) {
140
+ throw new QaFileDeleteError("not-a-file", NOT_A_FILE);
141
+ }
142
+ try {
143
+ await unlink(absolute);
144
+ }
145
+ catch (error) {
146
+ const code = error.code ?? "unknown";
147
+ throw new QaFileDeleteError("workspace-unavailable", `file_delete could not delete the file (${String(code)}).`, { cause: error });
148
+ }
149
+ return {
150
+ deleted: true,
151
+ path: relative(root, absolute).split(sep).join("/"),
152
+ };
153
+ },
154
+ });
155
+ }
156
+ //# sourceMappingURL=file-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-delete.js","sourceRoot":"","sources":["../../src/qa-tools/file-delete.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { resolveAttachments } from "./config-resolvers/attachments.js";
3
3
  import { normalizeRoutePath, resolveBasics, } from "./config-resolvers/basics.js";
4
4
  import { DEFAULT_QA_SURFACE_CONFIG } from "./config-resolvers/defaults.js";
5
5
  import { resolveLockdown } from "./config-resolvers/lockdown.js";
6
+ import { resolveNotes } from "./config-resolvers/notes.js";
6
7
  import { resolveSession } from "./config-resolvers/session.js";
7
8
  import { resolveSlashCommands } from "./config-resolvers/slash-commands.js";
8
9
  import { resolveSources } from "./config-resolvers/sources.js";
@@ -44,6 +45,7 @@ export function resolveConfig(input = {}) {
44
45
  sources,
45
46
  attachments,
46
47
  tools,
48
+ notes: resolveNotes(input.notes),
47
49
  });
48
50
  }
49
51
  //# sourceMappingURL=resolve-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,aAAa,GAAG,oBAAoB,CACxC,KAAK,EACL,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,EAAE;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,eAAe,EAAE,aAAa,CAC5B,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,eAAe,CACnE;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,aAAa;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,WAAW;QACX,KAAK;KACN,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,aAAa,GAAG,oBAAoB,CACxC,KAAK,EACL,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,EAAE;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,eAAe,EAAE,aAAa,CAC5B,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,eAAe,CACnE;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,aAAa;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,WAAW;QACX,KAAK;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Formats the files panel previews by conversion instead of by bytes.
3
+ *
4
+ * Shared by the Host half (which owns the conversion) and the browser card
5
+ * (which decides whether opening a file should ask for one), so the two cannot
6
+ * drift on what "we can render this" means. Dependency-free on purpose: the
7
+ * card bundle inlines it.
8
+ */
9
+ /** OOXML word-processing documents, as the deployment detects them. */
10
+ export const QA_WORD_MEDIA_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
11
+ /** The media type of the PDF a converted document arrives as. */
12
+ export const QA_PDF_MEDIA_TYPE = "application/pdf";
13
+ /**
14
+ * Whether the panel asks the Host for a converted PDF rather than rendering the
15
+ * bytes it already holds. Word documents are the whole set: the document
16
+ * pipeline reads them and renders PDF, while its other inputs are already
17
+ * previewable (Markdown as text, PDF through the browser's own viewer).
18
+ */
19
+ export function isConvertibleDocument(mediaType) {
20
+ return mediaType === QA_WORD_MEDIA_TYPE;
21
+ }
22
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/shared/documents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,yEAAyE,CAAC;AAE5E,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,SAAS,KAAK,kBAAkB,CAAC;AAC1C,CAAC"}