@yadsh/dsh-qa-surface 0.5.0 → 0.6.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 (374) hide show
  1. package/README.md +194 -9
  2. package/compatibility.json +10 -1
  3. package/cordis.patch.yml +9 -0
  4. package/lib/account-remotes.js +10 -0
  5. package/lib/account-remotes.js.map +1 -1
  6. package/lib/accounts/errors.js.map +1 -1
  7. package/lib/accounts/file.js.map +1 -1
  8. package/lib/accounts/store.js +22 -0
  9. package/lib/accounts/store.js.map +1 -1
  10. package/lib/client/QaAccountsController.js +29 -0
  11. package/lib/client/QaAccountsController.js.map +1 -1
  12. package/lib/client/QaSessionController.js +168 -48
  13. package/lib/client/QaSessionController.js.map +1 -1
  14. package/lib/client/QaSurface.js +125 -56
  15. package/lib/client/QaSurface.js.map +1 -1
  16. package/lib/client/QaSurfaceGuard.js +96 -0
  17. package/lib/client/QaSurfaceGuard.js.map +1 -0
  18. package/lib/client/QaTranscriptAdapter.js +11 -5
  19. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  20. package/lib/client/components/QaChangelog.js +31 -0
  21. package/lib/client/components/QaChangelog.js.map +1 -1
  22. package/lib/client/components/QaComposer.js +1 -1
  23. package/lib/client/components/QaComposer.js.map +1 -1
  24. package/lib/client/components/QaHeader.js +2 -8
  25. package/lib/client/components/QaHeader.js.map +1 -1
  26. package/lib/client/components/QaMessage.js +20 -7
  27. package/lib/client/components/QaMessage.js.map +1 -1
  28. package/lib/client/components/QaModal.js +24 -6
  29. package/lib/client/components/QaModal.js.map +1 -1
  30. package/lib/client/components/QaSidebar.js +2 -6
  31. package/lib/client/components/QaSidebar.js.map +1 -1
  32. package/lib/client/components/QaSourcesPanel.js +6 -5
  33. package/lib/client/components/QaSourcesPanel.js.map +1 -1
  34. package/lib/client/components/QaWidthHandle.js +21 -1
  35. package/lib/client/components/QaWidthHandle.js.map +1 -1
  36. package/lib/client/components/surface-utils.js +2 -0
  37. package/lib/client/components/surface-utils.js.map +1 -1
  38. package/lib/client/index.js +72 -24
  39. package/lib/client/index.js.map +1 -1
  40. package/lib/client/panels/PanelHost.js +209 -0
  41. package/lib/client/panels/PanelHost.js.map +1 -0
  42. package/lib/client/panels/PanelLauncher.js +39 -0
  43. package/lib/client/panels/PanelLauncher.js.map +1 -0
  44. package/lib/client/panels/contract.js +2 -0
  45. package/lib/client/panels/contract.js.map +1 -0
  46. package/lib/client/panels/index.js +2 -0
  47. package/lib/client/panels/index.js.map +1 -0
  48. package/lib/client/panels/registry.js +171 -0
  49. package/lib/client/panels/registry.js.map +1 -0
  50. package/lib/client/project-session-state.js +3 -0
  51. package/lib/client/project-session-state.js.map +1 -1
  52. package/lib/client/settings/card.js +2 -2
  53. package/lib/client/settings/card.js.map +1 -1
  54. package/lib/client/settings/sections/accounts.js +3 -1
  55. package/lib/client/settings/sections/accounts.js.map +1 -1
  56. package/lib/client/settings/sections/documents.js +88 -0
  57. package/lib/client/settings/sections/documents.js.map +1 -0
  58. package/lib/client/settings/sections/interface.js +2 -0
  59. package/lib/client/settings/sections/interface.js.map +1 -1
  60. package/lib/client/settings/sections.js +1 -0
  61. package/lib/client/settings/sections.js.map +1 -1
  62. package/lib/client/settings-extensions/contract.js +2 -0
  63. package/lib/client/settings-extensions/contract.js.map +1 -0
  64. package/lib/client/settings-extensions/index.js +2 -0
  65. package/lib/client/settings-extensions/index.js.map +1 -0
  66. package/lib/client/settings-extensions/registry.js +63 -0
  67. package/lib/client/settings-extensions/registry.js.map +1 -0
  68. package/lib/client/settlement.js +51 -5
  69. package/lib/client/settlement.js.map +1 -1
  70. package/lib/client/source-preview.js +24 -0
  71. package/lib/client/source-preview.js.map +1 -0
  72. package/lib/client/styles.js +157 -32
  73. package/lib/client/styles.js.map +1 -1
  74. package/lib/client/subagent-codenames.js +109 -0
  75. package/lib/client/subagent-codenames.js.map +1 -0
  76. package/lib/client/types.js +1 -0
  77. package/lib/client/types.js.map +1 -1
  78. package/lib/client/user-settings/GeneralSettingsPage.js +13 -0
  79. package/lib/client/user-settings/GeneralSettingsPage.js.map +1 -0
  80. package/lib/client/user-settings/ProfileSettingsPage.js +59 -0
  81. package/lib/client/user-settings/ProfileSettingsPage.js.map +1 -0
  82. package/lib/client/user-settings/SkillCatalog.js +23 -0
  83. package/lib/client/user-settings/SkillCatalog.js.map +1 -0
  84. package/lib/client/user-settings/SkillEditor.js +89 -0
  85. package/lib/client/user-settings/SkillEditor.js.map +1 -0
  86. package/lib/client/user-settings/SkillToolPicker.js +58 -0
  87. package/lib/client/user-settings/SkillToolPicker.js.map +1 -0
  88. package/lib/client/user-settings/SkillsSettingsPage.js +171 -0
  89. package/lib/client/user-settings/SkillsSettingsPage.js.map +1 -0
  90. package/lib/client/user-settings/StartersSettingsPage.js +78 -0
  91. package/lib/client/user-settings/StartersSettingsPage.js.map +1 -0
  92. package/lib/client/user-settings/UserSettingsDialog.js +50 -0
  93. package/lib/client/user-settings/UserSettingsDialog.js.map +1 -0
  94. package/lib/client/user-settings/copy.js +84 -0
  95. package/lib/client/user-settings/copy.js.map +1 -0
  96. package/lib/client/user-settings/draft.js +127 -0
  97. package/lib/client/user-settings/draft.js.map +1 -0
  98. package/lib/client/user-settings/fields.js +24 -0
  99. package/lib/client/user-settings/fields.js.map +1 -0
  100. package/lib/client.js +5467 -1379
  101. package/lib/client.js.map +1 -1
  102. package/lib/config-resolvers/accounts.js +30 -0
  103. package/lib/config-resolvers/accounts.js.map +1 -1
  104. package/lib/config-resolvers/defaults.js +23 -0
  105. package/lib/config-resolvers/defaults.js.map +1 -1
  106. package/lib/config-resolvers/tools.js +37 -0
  107. package/lib/config-resolvers/tools.js.map +1 -0
  108. package/lib/config-resolvers/ui.js +2 -0
  109. package/lib/config-resolvers/ui.js.map +1 -1
  110. package/lib/config.js +288 -0
  111. package/lib/config.js.map +1 -1
  112. package/lib/documents/artifacts/ids.js +43 -0
  113. package/lib/documents/artifacts/ids.js.map +1 -0
  114. package/lib/documents/artifacts/manifest.js +66 -0
  115. package/lib/documents/artifacts/manifest.js.map +1 -0
  116. package/lib/documents/artifacts/store.js +169 -0
  117. package/lib/documents/artifacts/store.js.map +1 -0
  118. package/lib/documents/capabilities.js +93 -0
  119. package/lib/documents/capabilities.js.map +1 -0
  120. package/lib/documents/config.js +302 -0
  121. package/lib/documents/config.js.map +1 -0
  122. package/lib/documents/defaults.js +78 -0
  123. package/lib/documents/defaults.js.map +1 -0
  124. package/lib/documents/errors.js +101 -0
  125. package/lib/documents/errors.js.map +1 -0
  126. package/lib/documents/index.js +80 -0
  127. package/lib/documents/index.js.map +1 -0
  128. package/lib/documents/inspect/facts.js +161 -0
  129. package/lib/documents/inspect/facts.js.map +1 -0
  130. package/lib/documents/inspect/zip.js +108 -0
  131. package/lib/documents/inspect/zip.js.map +1 -0
  132. package/lib/documents/markdown/directives.js +135 -0
  133. package/lib/documents/markdown/directives.js.map +1 -0
  134. package/lib/documents/markdown/frontmatter.js +35 -0
  135. package/lib/documents/markdown/frontmatter.js.map +1 -0
  136. package/lib/documents/markdown/normalize.js +113 -0
  137. package/lib/documents/markdown/normalize.js.map +1 -0
  138. package/lib/documents/orchestrator/assets.js +243 -0
  139. package/lib/documents/orchestrator/assets.js.map +1 -0
  140. package/lib/documents/orchestrator/convert-document.js +186 -0
  141. package/lib/documents/orchestrator/convert-document.js.map +1 -0
  142. package/lib/documents/orchestrator/create-document.js +292 -0
  143. package/lib/documents/orchestrator/create-document.js.map +1 -0
  144. package/lib/documents/orchestrator/extract-document.js +162 -0
  145. package/lib/documents/orchestrator/extract-document.js.map +1 -0
  146. package/lib/documents/orchestrator/inspect-document.js +89 -0
  147. package/lib/documents/orchestrator/inspect-document.js.map +1 -0
  148. package/lib/documents/orchestrator/runtime-deps.js +59 -0
  149. package/lib/documents/orchestrator/runtime-deps.js.map +1 -0
  150. package/lib/documents/orchestrator/scope.js +132 -0
  151. package/lib/documents/orchestrator/scope.js.map +1 -0
  152. package/lib/documents/providers/docling.js +247 -0
  153. package/lib/documents/providers/docling.js.map +1 -0
  154. package/lib/documents/providers/libreoffice.js +130 -0
  155. package/lib/documents/providers/libreoffice.js.map +1 -0
  156. package/lib/documents/providers/markitdown.js +89 -0
  157. package/lib/documents/providers/markitdown.js.map +1 -0
  158. package/lib/documents/providers/pandoc.js +161 -0
  159. package/lib/documents/providers/pandoc.js.map +1 -0
  160. package/lib/documents/providers/process.js +164 -0
  161. package/lib/documents/providers/process.js.map +1 -0
  162. package/lib/documents/providers/registry.js +152 -0
  163. package/lib/documents/providers/registry.js.map +1 -0
  164. package/lib/documents/providers/shared.js +75 -0
  165. package/lib/documents/providers/shared.js.map +1 -0
  166. package/lib/documents/runtime.js +114 -0
  167. package/lib/documents/runtime.js.map +1 -0
  168. package/lib/documents/security/file-types.js +188 -0
  169. package/lib/documents/security/file-types.js.map +1 -0
  170. package/lib/documents/security/limits.js +78 -0
  171. package/lib/documents/security/limits.js.map +1 -0
  172. package/lib/documents/security/mime.js +43 -0
  173. package/lib/documents/security/mime.js.map +1 -0
  174. package/lib/documents/security/paths.js +133 -0
  175. package/lib/documents/security/paths.js.map +1 -0
  176. package/lib/documents/templates/registry.js +147 -0
  177. package/lib/documents/templates/registry.js.map +1 -0
  178. package/lib/documents/templates/resolver.js +59 -0
  179. package/lib/documents/templates/resolver.js.map +1 -0
  180. package/lib/documents/tools/convert.js +125 -0
  181. package/lib/documents/tools/convert.js.map +1 -0
  182. package/lib/documents/tools/create.js +187 -0
  183. package/lib/documents/tools/create.js.map +1 -0
  184. package/lib/documents/tools/index.js +41 -0
  185. package/lib/documents/tools/index.js.map +1 -0
  186. package/lib/documents/tools/inspect.js +135 -0
  187. package/lib/documents/tools/inspect.js.map +1 -0
  188. package/lib/documents/tools/shared.js +88 -0
  189. package/lib/documents/tools/shared.js.map +1 -0
  190. package/lib/documents/tools/to-markdown.js +125 -0
  191. package/lib/documents/tools/to-markdown.js.map +1 -0
  192. package/lib/documents/types.js +12 -0
  193. package/lib/documents/types.js.map +1 -0
  194. package/lib/index.js +225 -20
  195. package/lib/index.js.map +1 -1
  196. package/lib/integration-principals.js +22 -0
  197. package/lib/integration-principals.js.map +1 -0
  198. package/lib/lockdown-policy.js +15 -3
  199. package/lib/lockdown-policy.js.map +1 -1
  200. package/lib/personal-skills/errors.js +9 -0
  201. package/lib/personal-skills/errors.js.map +1 -0
  202. package/lib/personal-skills/host.js +80 -0
  203. package/lib/personal-skills/host.js.map +1 -0
  204. package/lib/personal-skills/index.js +10 -0
  205. package/lib/personal-skills/index.js.map +1 -0
  206. package/lib/personal-skills/paths.js +127 -0
  207. package/lib/personal-skills/paths.js.map +1 -0
  208. package/lib/personal-skills/provider.js +109 -0
  209. package/lib/personal-skills/provider.js.map +1 -0
  210. package/lib/personal-skills/remotes.js +40 -0
  211. package/lib/personal-skills/remotes.js.map +1 -0
  212. package/lib/personal-skills/service.js +686 -0
  213. package/lib/personal-skills/service.js.map +1 -0
  214. package/lib/personal-skills/skill-file.js +278 -0
  215. package/lib/personal-skills/skill-file.js.map +1 -0
  216. package/lib/personal-skills/skill-format.js +202 -0
  217. package/lib/personal-skills/skill-format.js.map +1 -0
  218. package/lib/personal-skills/watcher.js +96 -0
  219. package/lib/personal-skills/watcher.js.map +1 -0
  220. package/lib/profile.js +6 -4
  221. package/lib/profile.js.map +1 -1
  222. package/lib/prompt-notes.js +19 -0
  223. package/lib/prompt-notes.js.map +1 -1
  224. package/lib/provenance/file-preview.js +68 -21
  225. package/lib/provenance/file-preview.js.map +1 -1
  226. package/lib/provenance/host-store.js +44 -11
  227. package/lib/provenance/host-store.js.map +1 -1
  228. package/lib/provenance/index.js +1 -0
  229. package/lib/provenance/index.js.map +1 -1
  230. package/lib/provenance/normalize.js +3 -1
  231. package/lib/provenance/normalize.js.map +1 -1
  232. package/lib/provenance/snapshot-store.js +154 -0
  233. package/lib/provenance/snapshot-store.js.map +1 -0
  234. package/lib/qa-tools/activation-detector.js +53 -0
  235. package/lib/qa-tools/activation-detector.js.map +1 -0
  236. package/lib/qa-tools/activation-manager.js +111 -0
  237. package/lib/qa-tools/activation-manager.js.map +1 -0
  238. package/lib/qa-tools/catalog.js +108 -0
  239. package/lib/qa-tools/catalog.js.map +1 -0
  240. package/lib/qa-tools/durable-marker.js +115 -0
  241. package/lib/qa-tools/durable-marker.js.map +1 -0
  242. package/lib/qa-tools/index.js +83 -0
  243. package/lib/qa-tools/index.js.map +1 -0
  244. package/lib/qa-tools/lifecycle.js +64 -0
  245. package/lib/qa-tools/lifecycle.js.map +1 -0
  246. package/lib/qa-tools/types.js +2 -0
  247. package/lib/qa-tools/types.js.map +1 -0
  248. package/lib/resolve-config.js +5 -0
  249. package/lib/resolve-config.js.map +1 -1
  250. package/lib/secure-session.js +35 -3
  251. package/lib/secure-session.js.map +1 -1
  252. package/lib/starters.js +117 -0
  253. package/lib/starters.js.map +1 -0
  254. package/lib/typert.host.js +767 -22
  255. package/lib/typert.remote-client.d.ts +17 -1
  256. package/lib/typert.remote-client.js +609 -17
  257. package/lib/types/account-remotes.d.ts +3 -1
  258. package/lib/types/accounts/errors.d.ts +1 -1
  259. package/lib/types/accounts/file.d.ts +10 -0
  260. package/lib/types/accounts/store.d.ts +7 -1
  261. package/lib/types/client/QaAccountsController.d.ts +7 -1
  262. package/lib/types/client/QaSessionController.d.ts +12 -0
  263. package/lib/types/client/QaSurface.d.ts +14 -4
  264. package/lib/types/client/QaSurfaceGuard.d.ts +27 -0
  265. package/lib/types/client/QaTranscriptAdapter.d.ts +7 -0
  266. package/lib/types/client/components/QaComposer.d.ts +3 -1
  267. package/lib/types/client/components/QaHeader.d.ts +3 -1
  268. package/lib/types/client/components/QaModal.d.ts +5 -4
  269. package/lib/types/client/components/QaSidebar.d.ts +8 -11
  270. package/lib/types/client/components/QaWidthHandle.d.ts +13 -0
  271. package/lib/types/client/index.d.ts +1 -0
  272. package/lib/types/client/panels/PanelHost.d.ts +18 -0
  273. package/lib/types/client/panels/PanelLauncher.d.ts +5 -0
  274. package/lib/types/client/panels/contract.d.ts +83 -0
  275. package/lib/types/client/panels/index.d.ts +3 -0
  276. package/lib/types/client/panels/registry.d.ts +40 -0
  277. package/lib/types/client/project-session-state.d.ts +5 -0
  278. package/lib/types/client/settings/sections/documents.d.ts +13 -0
  279. package/lib/types/client/settings/sections.d.ts +1 -0
  280. package/lib/types/client/settings-extensions/contract.d.ts +32 -0
  281. package/lib/types/client/settings-extensions/index.d.ts +3 -0
  282. package/lib/types/client/settings-extensions/registry.d.ts +15 -0
  283. package/lib/types/client/settlement.d.ts +41 -5
  284. package/lib/types/client/source-preview.d.ts +8 -0
  285. package/lib/types/client/styles.d.ts +2 -0
  286. package/lib/types/client/subagent-codenames.d.ts +18 -0
  287. package/lib/types/client/types.d.ts +35 -3
  288. package/lib/types/client/user-settings/GeneralSettingsPage.d.ts +14 -0
  289. package/lib/types/client/user-settings/ProfileSettingsPage.d.ts +18 -0
  290. package/lib/types/client/user-settings/SkillCatalog.d.ts +16 -0
  291. package/lib/types/client/user-settings/SkillEditor.d.ts +42 -0
  292. package/lib/types/client/user-settings/SkillToolPicker.d.ts +17 -0
  293. package/lib/types/client/user-settings/SkillsSettingsPage.d.ts +15 -0
  294. package/lib/types/client/user-settings/StartersSettingsPage.d.ts +14 -0
  295. package/lib/types/client/user-settings/UserSettingsDialog.d.ts +43 -0
  296. package/lib/types/client/user-settings/copy.d.ts +25 -0
  297. package/lib/types/client/user-settings/draft.d.ts +51 -0
  298. package/lib/types/client/user-settings/fields.d.ts +43 -0
  299. package/lib/types/config-resolvers/tools.d.ts +6 -0
  300. package/lib/types/documents/artifacts/ids.d.ts +14 -0
  301. package/lib/types/documents/artifacts/manifest.d.ts +32 -0
  302. package/lib/types/documents/artifacts/store.d.ts +67 -0
  303. package/lib/types/documents/capabilities.d.ts +32 -0
  304. package/lib/types/documents/config.d.ts +27 -0
  305. package/lib/types/documents/defaults.d.ts +161 -0
  306. package/lib/types/documents/errors.d.ts +42 -0
  307. package/lib/types/documents/index.d.ts +63 -0
  308. package/lib/types/documents/inspect/facts.d.ts +43 -0
  309. package/lib/types/documents/inspect/zip.d.ts +28 -0
  310. package/lib/types/documents/markdown/directives.d.ts +39 -0
  311. package/lib/types/documents/markdown/frontmatter.d.ts +15 -0
  312. package/lib/types/documents/markdown/normalize.d.ts +30 -0
  313. package/lib/types/documents/orchestrator/assets.d.ts +55 -0
  314. package/lib/types/documents/orchestrator/convert-document.d.ts +25 -0
  315. package/lib/types/documents/orchestrator/create-document.d.ts +18 -0
  316. package/lib/types/documents/orchestrator/extract-document.d.ts +24 -0
  317. package/lib/types/documents/orchestrator/inspect-document.d.ts +12 -0
  318. package/lib/types/documents/orchestrator/runtime-deps.d.ts +43 -0
  319. package/lib/types/documents/orchestrator/scope.d.ts +52 -0
  320. package/lib/types/documents/providers/docling.d.ts +54 -0
  321. package/lib/types/documents/providers/libreoffice.d.ts +40 -0
  322. package/lib/types/documents/providers/markitdown.d.ts +28 -0
  323. package/lib/types/documents/providers/pandoc.d.ts +42 -0
  324. package/lib/types/documents/providers/process.d.ts +54 -0
  325. package/lib/types/documents/providers/registry.d.ts +68 -0
  326. package/lib/types/documents/providers/shared.d.ts +27 -0
  327. package/lib/types/documents/runtime.d.ts +59 -0
  328. package/lib/types/documents/security/file-types.d.ts +39 -0
  329. package/lib/types/documents/security/limits.d.ts +24 -0
  330. package/lib/types/documents/security/mime.d.ts +13 -0
  331. package/lib/types/documents/security/paths.d.ts +38 -0
  332. package/lib/types/documents/templates/registry.d.ts +50 -0
  333. package/lib/types/documents/templates/resolver.d.ts +30 -0
  334. package/lib/types/documents/tools/convert.d.ts +9 -0
  335. package/lib/types/documents/tools/create.d.ts +14 -0
  336. package/lib/types/documents/tools/index.d.ts +33 -0
  337. package/lib/types/documents/tools/inspect.d.ts +9 -0
  338. package/lib/types/documents/tools/shared.d.ts +77 -0
  339. package/lib/types/documents/tools/to-markdown.d.ts +12 -0
  340. package/lib/types/documents/types.d.ts +294 -0
  341. package/lib/types/index.d.ts +75 -3
  342. package/lib/types/integration-principals.d.ts +9 -0
  343. package/lib/types/lockdown-policy.d.ts +12 -2
  344. package/lib/types/personal-skills/errors.d.ts +11 -0
  345. package/lib/types/personal-skills/host.d.ts +42 -0
  346. package/lib/types/personal-skills/index.d.ts +10 -0
  347. package/lib/types/personal-skills/paths.d.ts +39 -0
  348. package/lib/types/personal-skills/provider.d.ts +33 -0
  349. package/lib/types/personal-skills/remotes.d.ts +35 -0
  350. package/lib/types/personal-skills/service.d.ts +131 -0
  351. package/lib/types/personal-skills/skill-file.d.ts +64 -0
  352. package/lib/types/personal-skills/skill-format.d.ts +100 -0
  353. package/lib/types/personal-skills/watcher.d.ts +39 -0
  354. package/lib/types/profile.d.ts +13 -0
  355. package/lib/types/prompt-notes.d.ts +9 -0
  356. package/lib/types/provenance/file-preview.d.ts +47 -4
  357. package/lib/types/provenance/host-store.d.ts +7 -1
  358. package/lib/types/provenance/index.d.ts +1 -0
  359. package/lib/types/provenance/snapshot-store.d.ts +23 -0
  360. package/lib/types/qa-tools/activation-detector.d.ts +29 -0
  361. package/lib/types/qa-tools/activation-manager.d.ts +47 -0
  362. package/lib/types/qa-tools/catalog.d.ts +40 -0
  363. package/lib/types/qa-tools/durable-marker.d.ts +16 -0
  364. package/lib/types/qa-tools/index.d.ts +40 -0
  365. package/lib/types/qa-tools/lifecycle.d.ts +44 -0
  366. package/lib/types/qa-tools/types.d.ts +45 -0
  367. package/lib/types/secure-session.d.ts +24 -2
  368. package/lib/types/starters.d.ts +45 -0
  369. package/lib/types/types.d.ts +202 -3
  370. package/package.json +24 -11
  371. package/scripts/repair-session-events.mjs +260 -0
  372. package/lib/client/components/QaProfile.js +0 -64
  373. package/lib/client/components/QaProfile.js.map +0 -1
  374. package/lib/types/client/components/QaProfile.d.ts +0 -25
@@ -0,0 +1,162 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-document.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/extract-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-document.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/inspect-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Job scope: where an operation reads from and writes to.
3
+ *
4
+ * Artifacts live in the session workspace by default
5
+ * (`<cwd>/.qa/artifacts/documents/<artifact-id>`), which is what makes a QA
6
+ * deployment's per-user workspaces isolate document bundles for free (§40).
7
+ * A deployment may pin `documents.storage.root` to a shared volume instead, in
8
+ * which case the session workspace stays the only place inputs are read from.
9
+ * Inputs may additionally come from explicitly configured roots (§26.2).
10
+ */
11
+ import { readFile, stat } from "node:fs/promises";
12
+ import path from "node:path";
13
+ import { ArtifactStore } from "../artifacts/store.js";
14
+ import { DocumentError, asDocumentError } from "../errors.js";
15
+ import { assertBytesWithinBudget } from "../security/limits.js";
16
+ import { canonicalizeForContainment, isInsideRoot, resolveInsideRoot, } from "../security/paths.js";
17
+ import { loadTemplateRegistry, } from "../templates/registry.js";
18
+ /** Artifact root of one workspace: configured root, else the workspace itself. */
19
+ export function defaultArtifactRoot(config, workspaceRoot) {
20
+ return (config.storage.root ??
21
+ path.join(workspaceRoot, ".qa", "artifacts", "documents"));
22
+ }
23
+ async function probeManifest(candidate) {
24
+ const details = await stat(path.join(candidate, "manifest.yml")).catch(() => undefined);
25
+ return details?.isFile() === true;
26
+ }
27
+ /**
28
+ * Template roots to probe, in order. An explicitly configured root is
29
+ * authoritative; a deployment that configures none gets the two conventional
30
+ * workspace directories.
31
+ */
32
+ export function templateCandidateRoots(config, workspaceRoot) {
33
+ if (config.templates.root !== null)
34
+ return [config.templates.root];
35
+ return [
36
+ path.join(workspaceRoot, "document-templates"),
37
+ path.join(workspaceRoot, "templates"),
38
+ ];
39
+ }
40
+ /** Load the first candidate root that carries a registry manifest. */
41
+ export async function loadScopeTemplates(config, workspaceRoot) {
42
+ for (const candidate of templateCandidateRoots(config, workspaceRoot)) {
43
+ if (await probeManifest(candidate))
44
+ return await loadTemplateRegistry(candidate);
45
+ }
46
+ return await loadTemplateRegistry(undefined);
47
+ }
48
+ export async function resolveDocumentScope(config, scope) {
49
+ if (typeof scope.workspaceRoot !== "string" ||
50
+ scope.workspaceRoot.trim() === "") {
51
+ // Fail closed: an empty root would silently resolve to the host process's
52
+ // working directory and grant artifacts access to it.
53
+ throw new DocumentError("INVALID_INPUT", "the document scope requires a session working directory");
54
+ }
55
+ const workspaceRoot = await canonicalizeForContainment(scope.workspaceRoot);
56
+ const artifactRoot = await canonicalizeForContainment(defaultArtifactRoot(config, workspaceRoot));
57
+ return {
58
+ workspaceRoot,
59
+ artifactRoot,
60
+ ...(scope.sessionId === undefined ? {} : { sessionId: scope.sessionId }),
61
+ ...(scope.signal === undefined ? {} : { signal: scope.signal }),
62
+ store: new ArtifactStore({ root: artifactRoot }),
63
+ templates: await loadScopeTemplates(config, workspaceRoot),
64
+ };
65
+ }
66
+ /** Roots an input file may be read from, most specific first. */
67
+ export function allowedInputRoots(config, scope) {
68
+ return [
69
+ scope.workspaceRoot,
70
+ scope.artifactRoot,
71
+ ...config.storage.allowedInputRoots,
72
+ ];
73
+ }
74
+ /**
75
+ * Resolve a caller-supplied input path. The file must exist inside one of the
76
+ * allowed roots — traversal, symlinks out of the root and absolute paths to
77
+ * unrelated directories are all refused (§26.2).
78
+ */
79
+ export async function resolveInputPath(config, scope, requested, label) {
80
+ let lastError;
81
+ for (const root of allowedInputRoots(config, scope)) {
82
+ try {
83
+ const resolved = await resolveInsideRoot(root, requested, label);
84
+ const details = await stat(resolved).catch(() => undefined);
85
+ if (details === undefined || !details.isFile()) {
86
+ throw new DocumentError("FILE_NOT_FOUND", `${label} does not exist`);
87
+ }
88
+ return resolved;
89
+ }
90
+ catch (error) {
91
+ lastError = error;
92
+ if (error instanceof DocumentError && error.code === "FILE_NOT_FOUND")
93
+ continue;
94
+ if (error instanceof DocumentError && error.code === "PATH_NOT_ALLOWED")
95
+ continue;
96
+ throw error;
97
+ }
98
+ }
99
+ if (lastError instanceof DocumentError) {
100
+ throw new DocumentError("FILE_NOT_FOUND", `${label} is not a file inside the session workspace or a configured document root`, { details: { label } });
101
+ }
102
+ throw asDocumentError(lastError, "FILE_NOT_FOUND");
103
+ }
104
+ /** Read an input file under a byte budget. */
105
+ export async function readInputBytes(filePath, config, label) {
106
+ const details = await stat(filePath).catch(() => undefined);
107
+ if (details === undefined) {
108
+ throw new DocumentError("FILE_NOT_FOUND", `${label} does not exist`);
109
+ }
110
+ assertBytesWithinBudget(details.size, config.limits.maxInputBytes, label);
111
+ const bytes = await readFile(filePath).catch((error) => {
112
+ throw asDocumentError(error, "FILE_NOT_FOUND", label);
113
+ });
114
+ assertBytesWithinBudget(bytes.length, config.limits.maxInputBytes, label);
115
+ return bytes;
116
+ }
117
+ /** Ensure the artifact root exists and is writable, failing with a clear code. */
118
+ export async function ensureArtifactRoot(scope) {
119
+ try {
120
+ await scope.store.ensureDir(".");
121
+ }
122
+ catch (error) {
123
+ throw asDocumentError(error, "ARTIFACT_WRITE_FAILED");
124
+ }
125
+ }
126
+ export function assertInsideArtifactRoot(scope, target, label) {
127
+ if (!isInsideRoot(scope.artifactRoot, path.resolve(target))) {
128
+ throw new DocumentError("PATH_NOT_ALLOWED", `${label} is outside the artifact root`);
129
+ }
130
+ return target;
131
+ }
132
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/documents/orchestrator/scope.ts"],"names":[],"mappings":"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"}