@arnilo/prism-tools 0.0.0-stage → 0.13.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 (331) hide show
  1. package/CHANGELOG.md +410 -0
  2. package/LICENSE +21 -0
  3. package/README.md +44 -2
  4. package/browser/README.md +98 -0
  5. package/browser/skills/browser-automation/SKILL.md +14 -0
  6. package/browser/src/actions/cdp.ts +131 -0
  7. package/browser/src/actions/dialog.ts +25 -0
  8. package/browser/src/actions/download_release.ts +22 -0
  9. package/browser/src/actions/index.ts +37 -0
  10. package/browser/src/actions/locator.ts +70 -0
  11. package/browser/src/actions/navigate.ts +23 -0
  12. package/browser/src/actions/screenshot.ts +27 -0
  13. package/browser/src/actions/scroll.ts +24 -0
  14. package/browser/src/actions/select_page.ts +21 -0
  15. package/browser/src/actions/types.ts +114 -0
  16. package/browser/src/actions/upload.ts +44 -0
  17. package/browser/src/actions/wait.ts +45 -0
  18. package/browser/src/browser.ts +197 -0
  19. package/browser/src/cdp.ts +178 -0
  20. package/browser/src/checkpoint.ts +189 -0
  21. package/browser/src/config.ts +72 -0
  22. package/browser/src/downloads.ts +253 -0
  23. package/browser/src/errors.ts +31 -0
  24. package/browser/src/evaluate.ts +101 -0
  25. package/browser/src/index.ts +129 -0
  26. package/browser/src/limits.ts +271 -0
  27. package/browser/src/manager.ts +730 -0
  28. package/browser/src/network.ts +263 -0
  29. package/browser/src/observe.ts +178 -0
  30. package/browser/src/policy.ts +133 -0
  31. package/browser/src/screenshot.ts +107 -0
  32. package/browser/src/shared-sandbox.ts +53 -0
  33. package/browser/src/snapshot.ts +99 -0
  34. package/browser/src/targets.ts +165 -0
  35. package/browser/src/tools.ts +480 -0
  36. package/browser/src/types.ts +316 -0
  37. package/browser/src/uploads.ts +174 -0
  38. package/coding/README.md +337 -0
  39. package/coding/src/agent/acp-operations.ts +146 -0
  40. package/coding/src/agent/artifacts.ts +38 -0
  41. package/coding/src/agent/ask-user-decision.ts +623 -0
  42. package/coding/src/agent/atomic-write.ts +23 -0
  43. package/coding/src/agent/bounded-file.ts +21 -0
  44. package/coding/src/agent/checks.ts +301 -0
  45. package/coding/src/agent/coding-checkpoint.ts +828 -0
  46. package/coding/src/agent/delete.ts +237 -0
  47. package/coding/src/agent/diagnostics-tool.ts +163 -0
  48. package/coding/src/agent/diagnostics.ts +262 -0
  49. package/coding/src/agent/edit-diff.ts +382 -0
  50. package/coding/src/agent/edit.ts +322 -0
  51. package/coding/src/agent/effects.ts +102 -0
  52. package/coding/src/agent/env.ts +28 -0
  53. package/coding/src/agent/execution-policy.ts +89 -0
  54. package/coding/src/agent/file-mutation-queue.ts +72 -0
  55. package/coding/src/agent/forge/github.ts +603 -0
  56. package/coding/src/agent/forge/index.ts +16 -0
  57. package/coding/src/agent/forge/types.ts +185 -0
  58. package/coding/src/agent/git-aware-repository.ts +305 -0
  59. package/coding/src/agent/git-exec.ts +326 -0
  60. package/coding/src/agent/git-status.ts +177 -0
  61. package/coding/src/agent/git-tools.ts +360 -0
  62. package/coding/src/agent/git.ts +1074 -0
  63. package/coding/src/agent/glob-match.ts +146 -0
  64. package/coding/src/agent/glob.ts +182 -0
  65. package/coding/src/agent/goal-verify.ts +385 -0
  66. package/coding/src/agent/grep-worker.ts +74 -0
  67. package/coding/src/agent/grep.ts +459 -0
  68. package/coding/src/agent/identity.ts +48 -0
  69. package/coding/src/agent/index.ts +676 -0
  70. package/coding/src/agent/language/client.ts +429 -0
  71. package/coding/src/agent/language/framing.ts +190 -0
  72. package/coding/src/agent/language/index.ts +23 -0
  73. package/coding/src/agent/language/intelligence.ts +682 -0
  74. package/coding/src/agent/language/types.ts +187 -0
  75. package/coding/src/agent/lifecycle-events.ts +121 -0
  76. package/coding/src/agent/lifecycle.ts +166 -0
  77. package/coding/src/agent/limits.ts +214 -0
  78. package/coding/src/agent/move.ts +178 -0
  79. package/coding/src/agent/mutation-path.ts +52 -0
  80. package/coding/src/agent/output-accumulator.ts +304 -0
  81. package/coding/src/agent/path-utils.ts +120 -0
  82. package/coding/src/agent/process/index.ts +58 -0
  83. package/coding/src/agent/process/recovery.ts +508 -0
  84. package/coding/src/agent/process/sessions-host.ts +222 -0
  85. package/coding/src/agent/process/sessions-monitor.ts +141 -0
  86. package/coding/src/agent/process/sessions-recovery.ts +241 -0
  87. package/coding/src/agent/process/sessions-spawn.ts +613 -0
  88. package/coding/src/agent/process/sessions-teardown.ts +281 -0
  89. package/coding/src/agent/process/sessions.ts +30 -0
  90. package/coding/src/agent/process/types.ts +358 -0
  91. package/coding/src/agent/read-path-set.ts +126 -0
  92. package/coding/src/agent/read.ts +713 -0
  93. package/coding/src/agent/repository/glob.ts +147 -0
  94. package/coding/src/agent/repository/indexed-search.ts +480 -0
  95. package/coding/src/agent/repository/list.ts +131 -0
  96. package/coding/src/agent/repository/operations.ts +22 -0
  97. package/coding/src/agent/repository/path.ts +98 -0
  98. package/coding/src/agent/repository/search.ts +277 -0
  99. package/coding/src/agent/repository/types.ts +243 -0
  100. package/coding/src/agent/repository/walk.ts +126 -0
  101. package/coding/src/agent/repository.ts +12 -0
  102. package/coding/src/agent/shell-background.ts +264 -0
  103. package/coding/src/agent/shell-output.ts +75 -0
  104. package/coding/src/agent/shell.ts +526 -0
  105. package/coding/src/agent/todo.ts +399 -0
  106. package/coding/src/agent/truncate.ts +251 -0
  107. package/coding/src/agent/write.ts +170 -0
  108. package/coding/src/ask-user-host.ts +48 -0
  109. package/coding/src/config.ts +278 -0
  110. package/coding/src/hard-deny.ts +97 -0
  111. package/coding/src/index.ts +318 -0
  112. package/coding/src/principal-guard.ts +84 -0
  113. package/coding/src/sandbox.ts +92 -0
  114. package/coding/src/security/approval.ts +144 -0
  115. package/coding/src/security/command-rules.ts +57 -0
  116. package/coding/src/security/docker-cli.ts +222 -0
  117. package/coding/src/security/docker-sandbox.ts +1205 -0
  118. package/coding/src/security/e2b-sandbox.ts +853 -0
  119. package/coding/src/security/egress/dns-pin.ts +88 -0
  120. package/coding/src/security/egress/index.ts +32 -0
  121. package/coding/src/security/egress/limits.ts +57 -0
  122. package/coding/src/security/egress/policy.ts +137 -0
  123. package/coding/src/security/egress/proxy.ts +599 -0
  124. package/coding/src/security/egress/types.ts +30 -0
  125. package/coding/src/security/index.ts +199 -0
  126. package/coding/src/security/native-sandbox.ts +639 -0
  127. package/coding/src/security/path-containment.ts +55 -0
  128. package/coding/src/security/sandbox-coding-operations.ts +392 -0
  129. package/coding/src/security/sandbox-fs-operations.ts +644 -0
  130. package/coding/src/security/sandbox-limits.ts +147 -0
  131. package/coding/src/security/sandbox-tar.ts +308 -0
  132. package/coding/src/security/sandbox.ts +179 -0
  133. package/coding/src/security/semaphore.ts +55 -0
  134. package/coding/src/targets.ts +110 -0
  135. package/coding/src/workspace/diff.ts +78 -0
  136. package/coding/src/workspace/errors.ts +28 -0
  137. package/coding/src/workspace/index.ts +5 -0
  138. package/coding/src/workspace/merge.ts +151 -0
  139. package/coding/src/workspace/routing.ts +76 -0
  140. package/coding/src/workspace/service.ts +545 -0
  141. package/computer-use/README.md +105 -0
  142. package/computer-use/skills/computer-use-linux/SKILL.md +17 -0
  143. package/computer-use/src/classify.ts +53 -0
  144. package/computer-use/src/command.ts +29 -0
  145. package/computer-use/src/config.ts +69 -0
  146. package/computer-use/src/create.ts +170 -0
  147. package/computer-use/src/devices.ts +247 -0
  148. package/computer-use/src/env.ts +28 -0
  149. package/computer-use/src/index.ts +157 -0
  150. package/computer-use/src/skill.ts +21 -0
  151. package/openapi/README.md +97 -0
  152. package/openapi/src/compile.ts +386 -0
  153. package/openapi/src/config.ts +73 -0
  154. package/openapi/src/errors.ts +16 -0
  155. package/openapi/src/execute.ts +241 -0
  156. package/openapi/src/index.ts +124 -0
  157. package/openapi/src/limits.ts +63 -0
  158. package/openapi/src/specs.ts +86 -0
  159. package/openapi/src/tools.ts +60 -0
  160. package/openapi/src/types.ts +61 -0
  161. package/package.json +171 -4
  162. package/research/README.md +72 -0
  163. package/research/skills/research-report/SKILL.md +12 -0
  164. package/research/skills/research-scoping/SKILL.md +10 -0
  165. package/research/skills/research-synthesis/SKILL.md +10 -0
  166. package/research/skills/source-triage/SKILL.md +10 -0
  167. package/research/src/check.ts +71 -0
  168. package/research/src/config.ts +41 -0
  169. package/research/src/index.ts +147 -0
  170. package/research/src/ledger.ts +157 -0
  171. package/research/src/urls.ts +21 -0
  172. package/web/README.md +287 -0
  173. package/web/skills/web-research/SKILL.md +17 -0
  174. package/web/src/brave.ts +66 -0
  175. package/web/src/cache.ts +151 -0
  176. package/web/src/config.ts +210 -0
  177. package/web/src/controls.ts +128 -0
  178. package/web/src/domains.ts +114 -0
  179. package/web/src/exa.ts +60 -0
  180. package/web/src/firecrawl.ts +160 -0
  181. package/web/src/index.ts +387 -0
  182. package/web/src/kagi.ts +73 -0
  183. package/web/src/limits.ts +55 -0
  184. package/web/src/native/convert.ts +84 -0
  185. package/web/src/native/fetch.ts +226 -0
  186. package/web/src/normalize.ts +131 -0
  187. package/web/src/obscura/cdp.ts +201 -0
  188. package/web/src/obscura/classify.ts +35 -0
  189. package/web/src/obscura/cli.ts +254 -0
  190. package/web/src/obscura/errors.ts +8 -0
  191. package/web/src/obscura/index.ts +59 -0
  192. package/web/src/obscura/limits.ts +92 -0
  193. package/web/src/obscura/mcp.ts +104 -0
  194. package/web/src/obscura/playwright.ts +133 -0
  195. package/web/src/obscura/process.ts +235 -0
  196. package/web/src/obscura/search-profile.ts +73 -0
  197. package/web/src/obscura/types.ts +48 -0
  198. package/web/src/obscura/web.ts +419 -0
  199. package/web/src/prompt-fetch.ts +88 -0
  200. package/web/src/render.ts +75 -0
  201. package/web/src/searxng.ts +78 -0
  202. package/web/src/slice.ts +139 -0
  203. package/web/src/tavily.ts +77 -0
  204. package/web/src/tools.ts +182 -0
  205. package/web/src/transport.ts +310 -0
  206. package/web/src/types.ts +199 -0
  207. package/work/README.md +77 -0
  208. package/work/THIRD_PARTY_NOTICES +24 -0
  209. package/work/docling/ocr.py +150 -0
  210. package/work/sandbox/Dockerfile +36 -0
  211. package/work/sandbox/soffice.sh +12 -0
  212. package/work/src/command.ts +29 -0
  213. package/work/src/config.ts +138 -0
  214. package/work/src/connectors/cli.ts +343 -0
  215. package/work/src/connectors/drafts.ts +647 -0
  216. package/work/src/connectors/errors.ts +8 -0
  217. package/work/src/connectors/file-bytes.ts +149 -0
  218. package/work/src/connectors/google-workspace-http.ts +399 -0
  219. package/work/src/connectors/google-workspace.ts +465 -0
  220. package/work/src/connectors/gws-tools.ts +378 -0
  221. package/work/src/connectors/http.ts +123 -0
  222. package/work/src/connectors/idempotency.ts +235 -0
  223. package/work/src/connectors/identity.ts +34 -0
  224. package/work/src/connectors/index.ts +93 -0
  225. package/work/src/connectors/limits.ts +50 -0
  226. package/work/src/connectors/m365-tools.ts +308 -0
  227. package/work/src/connectors/microsoft365-http.ts +428 -0
  228. package/work/src/connectors/microsoft365.ts +402 -0
  229. package/work/src/connectors/normalize.ts +120 -0
  230. package/work/src/connectors/tool-helpers.ts +398 -0
  231. package/work/src/connectors/tools.ts +42 -0
  232. package/work/src/connectors/types.ts +399 -0
  233. package/work/src/diagrams/canonicalize.ts +166 -0
  234. package/work/src/diagrams/caps.ts +52 -0
  235. package/work/src/diagrams/embed.ts +340 -0
  236. package/work/src/diagrams/errors.ts +76 -0
  237. package/work/src/diagrams/index.ts +81 -0
  238. package/work/src/diagrams/messages.ts +150 -0
  239. package/work/src/diagrams/origin.ts +52 -0
  240. package/work/src/diagrams/telemetry.ts +34 -0
  241. package/work/src/diagrams/xml.ts +267 -0
  242. package/work/src/document-extraction/index.ts +563 -0
  243. package/work/src/document-reader/ambient.d.ts +2 -0
  244. package/work/src/document-reader/errors.ts +7 -0
  245. package/work/src/document-reader/index.ts +181 -0
  246. package/work/src/document-reader/mistral-ocr.ts +318 -0
  247. package/work/src/document-reader/parsers.ts +171 -0
  248. package/work/src/documents/caps.ts +135 -0
  249. package/work/src/documents/diff.ts +269 -0
  250. package/work/src/documents/errors.ts +44 -0
  251. package/work/src/documents/fidelity.ts +98 -0
  252. package/work/src/documents/generate.ts +96 -0
  253. package/work/src/documents/hash.ts +8 -0
  254. package/work/src/documents/index.ts +14 -0
  255. package/work/src/documents/model-schema.ts +639 -0
  256. package/work/src/documents/parse.ts +252 -0
  257. package/work/src/documents/patch-history.ts +81 -0
  258. package/work/src/documents/patch.ts +476 -0
  259. package/work/src/documents/preview-html.ts +245 -0
  260. package/work/src/documents/preview.ts +227 -0
  261. package/work/src/documents/telemetry.ts +36 -0
  262. package/work/src/documents/translate/docx.ts +292 -0
  263. package/work/src/documents/translate/pptx.ts +304 -0
  264. package/work/src/documents/translate/xlsx.ts +137 -0
  265. package/work/src/documents/types.ts +188 -0
  266. package/work/src/index.ts +311 -0
  267. package/work/src/runtime/worker-pool-entry.ts +102 -0
  268. package/work/src/runtime/worker-pool.ts +267 -0
  269. package/work/src/sandbox/composition.ts +212 -0
  270. package/work/src/sandbox/image.ts +6 -0
  271. package/work/src/sandbox/index.ts +14 -0
  272. package/work/src/sheets/caps.ts +68 -0
  273. package/work/src/sheets/csv.ts +351 -0
  274. package/work/src/sheets/decimal.ts +388 -0
  275. package/work/src/sheets/errors.ts +52 -0
  276. package/work/src/sheets/index.ts +62 -0
  277. package/work/src/sheets/inference.ts +378 -0
  278. package/work/src/sheets/telemetry.ts +34 -0
  279. package/work/src/sheets/types.ts +162 -0
  280. package/work/src/sheets/xlsx.ts +388 -0
  281. package/work/src/skills/index.ts +8 -0
  282. package/work/src/skills/load.ts +43 -0
  283. package/work/src/tools/filesystem.ts +21 -0
  284. package/work/src/tools/index.ts +1 -0
  285. package/work/src/tools/local-filesystem.ts +33 -0
  286. package/work/src/tools/office.ts +311 -0
  287. package/work/vendor/hermes-agent/LICENSE +21 -0
  288. package/work/vendor/hermes-agent/skills/productivity/docx/LICENSE +21 -0
  289. package/work/vendor/hermes-agent/skills/productivity/docx/SKILL.md +196 -0
  290. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_comments.py +289 -0
  291. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_common.py +94 -0
  292. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_create.py +177 -0
  293. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_edit.py +250 -0
  294. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_read.py +149 -0
  295. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_revisions.py +147 -0
  296. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_template.py +70 -0
  297. package/work/vendor/hermes-agent/skills/productivity/docx/scripts/docx_validate.py +156 -0
  298. package/work/vendor/hermes-agent/skills/productivity/pdf/LICENSE +21 -0
  299. package/work/vendor/hermes-agent/skills/productivity/pdf/SKILL.md +125 -0
  300. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/_raster.py +76 -0
  301. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/extract_marker.py +88 -0
  302. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/extract_pymupdf.py +101 -0
  303. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_create.py +130 -0
  304. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_fill_form.py +97 -0
  305. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_form_layout.py +168 -0
  306. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_make_form.py +145 -0
  307. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_merge.py +50 -0
  308. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_meta.py +115 -0
  309. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_page_image.py +99 -0
  310. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_read.py +153 -0
  311. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_secure.py +71 -0
  312. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_split.py +84 -0
  313. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_stamp.py +143 -0
  314. package/work/vendor/hermes-agent/skills/productivity/pdf/scripts/pdf_watermark.py +51 -0
  315. package/work/vendor/hermes-agent/skills/productivity/powerpoint/LICENSE +21 -0
  316. package/work/vendor/hermes-agent/skills/productivity/powerpoint/SKILL.md +220 -0
  317. package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_create.py +214 -0
  318. package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_edit.py +436 -0
  319. package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_from_template.py +88 -0
  320. package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_read.py +131 -0
  321. package/work/vendor/hermes-agent/skills/productivity/powerpoint/scripts/pptx_render.py +93 -0
  322. package/work/vendor/hermes-agent/skills/productivity/xlsx/LICENSE +21 -0
  323. package/work/vendor/hermes-agent/skills/productivity/xlsx/SKILL.md +196 -0
  324. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/csv_to_xlsx.py +104 -0
  325. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_create.py +259 -0
  326. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_edit.py +263 -0
  327. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_read.py +160 -0
  328. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_recalc.py +111 -0
  329. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_restructure.py +337 -0
  330. package/work/vendor/hermes-agent/skills/productivity/xlsx/scripts/xlsx_to_csv.py +69 -0
  331. package/work/vendor-lock.json +11 -0
@@ -0,0 +1,340 @@
1
+ import { DiagramsProtocolError, DiagramsTimeoutError } from "./errors.js";
2
+ import type { DrawioExportBounds, DrawioExportFormat, DrawioInboundEvent, DrawioOutboundAction } from "./messages.js";
3
+ import { validateDiagramsOrigin } from "./origin.js";
4
+
5
+ export interface DrawioEmbedFrame {
6
+ readonly contentWindow: {
7
+ postMessage(message: unknown, targetOrigin: string): void;
8
+ } | null;
9
+ }
10
+
11
+ export interface DrawioMessageEvent {
12
+ readonly origin: string;
13
+ readonly source: unknown;
14
+ readonly data: unknown;
15
+ }
16
+
17
+ export interface DrawioMessageSource {
18
+ addEventListener(type: "message", listener: (event: DrawioMessageEvent) => void): void;
19
+ removeEventListener(type: "message", listener: (event: DrawioMessageEvent) => void): void;
20
+ }
21
+
22
+ export type DrawioEventMap = {
23
+ init: () => void;
24
+ load: () => void;
25
+ save: (event: { readonly xml: string; readonly exit?: boolean }) => void;
26
+ autosave: (event: { readonly xml: string }) => void;
27
+ exit: (event: { readonly modified: boolean }) => void;
28
+ configure: () => void;
29
+ export: (event: { readonly format: string; readonly data: string; readonly xml?: string; readonly bounds?: DrawioExportBounds }) => void;
30
+ error: (event: { readonly message: string }) => void;
31
+ };
32
+
33
+ export interface DrawioEmbedOptions {
34
+ readonly iframe: DrawioEmbedFrame;
35
+ readonly origin: string;
36
+ readonly messageSource?: DrawioMessageSource;
37
+ readonly onProtocolError?: (error: DiagramsProtocolError) => void;
38
+ readonly defaultExportTimeoutMs?: number;
39
+ }
40
+
41
+ export interface DrawioLoadOptions {
42
+ readonly xml: string;
43
+ readonly autosave?: boolean;
44
+ readonly saveAndExit?: boolean;
45
+ readonly noSaveBtn?: boolean;
46
+ readonly noExitBtn?: boolean;
47
+ readonly title?: string;
48
+ }
49
+
50
+ export interface DrawioExportOptions {
51
+ readonly format: DrawioExportFormat;
52
+ readonly scale?: number;
53
+ readonly border?: number;
54
+ readonly xml?: string;
55
+ readonly embedImages?: boolean;
56
+ readonly timeoutMs?: number;
57
+ }
58
+
59
+ export interface DrawioExportResult {
60
+ readonly format: string;
61
+ readonly data: string;
62
+ readonly xml?: string;
63
+ readonly bounds?: DrawioExportBounds;
64
+ }
65
+
66
+ export interface DrawioEmbed {
67
+ readonly origin: string;
68
+ on<K extends keyof DrawioEventMap>(event: K, listener: DrawioEventMap[K]): () => void;
69
+ off<K extends keyof DrawioEventMap>(event: K, listener: DrawioEventMap[K]): void;
70
+ load(options: DrawioLoadOptions): void;
71
+ configure(config: Readonly<Record<string, unknown>>): void;
72
+ merge(xml: string): void;
73
+ export(options: DrawioExportOptions): Promise<DrawioExportResult>;
74
+ postAction(action: DrawioOutboundAction): void;
75
+ destroy(): void;
76
+ }
77
+
78
+ const DEFAULT_EXPORT_TIMEOUT_MS = 30_000;
79
+
80
+ export function createDrawioEmbed(options: DrawioEmbedOptions): DrawioEmbed {
81
+ if (!options || typeof options !== "object") {
82
+ throw new DiagramsProtocolError("createDrawioEmbed requires an options object");
83
+ }
84
+
85
+ if (!options.iframe || typeof options.iframe !== "object") {
86
+ throw new DiagramsProtocolError("createDrawioEmbed requires an iframe container with contentWindow");
87
+ }
88
+
89
+ const origin = validateDiagramsOrigin(options.origin);
90
+ const defaultTimeoutMs = options.defaultExportTimeoutMs ?? DEFAULT_EXPORT_TIMEOUT_MS;
91
+
92
+ const listeners = new Map<keyof DrawioEventMap, Set<(...args: any[]) => void>>();
93
+ const pendingExportResolvers = new Set<(result: DrawioExportResult) => void>();
94
+
95
+ const messageSource: DrawioMessageSource | undefined =
96
+ options.messageSource ??
97
+ (typeof globalThis !== "undefined" && typeof (globalThis as unknown as { addEventListener?: unknown }).addEventListener === "function"
98
+ ? (globalThis as unknown as DrawioMessageSource)
99
+ : undefined);
100
+
101
+ function handleMessage(event: DrawioMessageEvent): void {
102
+ // 1. Origin verification: must strictly match the configured origin
103
+ if (event.origin !== origin) {
104
+ return;
105
+ }
106
+
107
+ // 2. Source verification: must come from the embed iframe's contentWindow
108
+ if (!options.iframe.contentWindow || event.source !== options.iframe.contentWindow) {
109
+ return;
110
+ }
111
+
112
+ // 3. Payload normalization
113
+ let payload: unknown;
114
+ if (typeof event.data === "string") {
115
+ try {
116
+ payload = JSON.parse(event.data);
117
+ } catch {
118
+ options.onProtocolError?.(new DiagramsProtocolError("Failed to parse JSON message payload from draw.io iframe"));
119
+ return;
120
+ }
121
+ } else {
122
+ payload = event.data;
123
+ }
124
+
125
+ if (!payload || typeof payload !== "object") {
126
+ options.onProtocolError?.(new DiagramsProtocolError("Received non-object message payload from draw.io iframe"));
127
+ return;
128
+ }
129
+
130
+ const eventName = (payload as { event?: unknown }).event;
131
+ if (typeof eventName !== "string") {
132
+ options.onProtocolError?.(new DiagramsProtocolError("Inbound draw.io message is missing string 'event' discriminator"));
133
+ return;
134
+ }
135
+
136
+ dispatchInboundEvent(payload as DrawioInboundEvent);
137
+ }
138
+
139
+ function dispatchInboundEvent(inbound: DrawioInboundEvent): void {
140
+ switch (inbound.event) {
141
+ case "init": {
142
+ const set = listeners.get("init");
143
+ if (set) {
144
+ for (const fn of Array.from(set)) fn();
145
+ }
146
+ break;
147
+ }
148
+ case "load": {
149
+ const set = listeners.get("load");
150
+ if (set) {
151
+ for (const fn of Array.from(set)) fn();
152
+ }
153
+ break;
154
+ }
155
+ case "save": {
156
+ const set = listeners.get("save");
157
+ if (set) {
158
+ for (const fn of Array.from(set)) {
159
+ fn({ xml: inbound.xml, exit: inbound.exit });
160
+ }
161
+ }
162
+ break;
163
+ }
164
+ case "autosave": {
165
+ const set = listeners.get("autosave");
166
+ if (set) {
167
+ for (const fn of Array.from(set)) {
168
+ fn({ xml: inbound.xml });
169
+ }
170
+ }
171
+ break;
172
+ }
173
+ case "exit": {
174
+ const set = listeners.get("exit");
175
+ if (set) {
176
+ for (const fn of Array.from(set)) {
177
+ fn({ modified: Boolean(inbound.modified) });
178
+ }
179
+ }
180
+ break;
181
+ }
182
+ case "configure": {
183
+ const set = listeners.get("configure");
184
+ if (set) {
185
+ for (const fn of Array.from(set)) fn();
186
+ }
187
+ break;
188
+ }
189
+ case "export": {
190
+ const result: DrawioExportResult = {
191
+ format: inbound.format,
192
+ data: inbound.data,
193
+ ...(inbound.xml !== undefined ? { xml: inbound.xml } : {}),
194
+ ...(inbound.bounds !== undefined ? { bounds: inbound.bounds } : {}),
195
+ };
196
+ // Resolve any waiting export promise
197
+ for (const resolver of Array.from(pendingExportResolvers)) {
198
+ resolver(result);
199
+ }
200
+ const set = listeners.get("export");
201
+ if (set) {
202
+ for (const fn of Array.from(set)) {
203
+ fn(result);
204
+ }
205
+ }
206
+ break;
207
+ }
208
+ case "error": {
209
+ const set = listeners.get("error");
210
+ if (set) {
211
+ for (const fn of Array.from(set)) {
212
+ fn({ message: inbound.message });
213
+ }
214
+ }
215
+ break;
216
+ }
217
+ default: {
218
+ options.onProtocolError?.(
219
+ new DiagramsProtocolError(`Unknown or unsupported draw.io event: "${(inbound as { event: string }).event}"`),
220
+ );
221
+ break;
222
+ }
223
+ }
224
+ }
225
+
226
+ if (messageSource) {
227
+ messageSource.addEventListener("message", handleMessage);
228
+ }
229
+
230
+ function postAction(action: DrawioOutboundAction): void {
231
+ if (!action || typeof action !== "object" || typeof action.action !== "string") {
232
+ throw new DiagramsProtocolError("Outbound action must be an object with an 'action' discriminator");
233
+ }
234
+
235
+ if (!options.iframe.contentWindow) {
236
+ throw new DiagramsProtocolError("Cannot post action: iframe contentWindow is null or unavailable");
237
+ }
238
+
239
+ // Prohibit wildcard posting - always post strictly to validated origin
240
+ if (origin === "*") {
241
+ throw new DiagramsProtocolError("Posting to wildcard targetOrigin '*' is strictly prohibited");
242
+ }
243
+
244
+ options.iframe.contentWindow.postMessage(JSON.stringify(action), origin);
245
+ }
246
+
247
+ return {
248
+ origin,
249
+
250
+ on<K extends keyof DrawioEventMap>(event: K, listener: DrawioEventMap[K]): () => void {
251
+ let set = listeners.get(event);
252
+ if (!set) {
253
+ set = new Set();
254
+ listeners.set(event, set);
255
+ }
256
+ set.add(listener as (...args: any[]) => void);
257
+ return () => {
258
+ set?.delete(listener as (...args: any[]) => void);
259
+ };
260
+ },
261
+
262
+ off<K extends keyof DrawioEventMap>(event: K, listener: DrawioEventMap[K]): void {
263
+ listeners.get(event)?.delete(listener as (...args: any[]) => void);
264
+ },
265
+
266
+ load(opts: DrawioLoadOptions): void {
267
+ postAction({
268
+ action: "load",
269
+ xml: opts.xml,
270
+ ...(opts.autosave !== undefined ? { autosave: opts.autosave ? 1 : 0 } : {}),
271
+ ...(opts.saveAndExit !== undefined ? { saveAndExit: opts.saveAndExit ? 1 : 0 } : {}),
272
+ ...(opts.noSaveBtn !== undefined ? { noSaveBtn: opts.noSaveBtn ? 1 : 0 } : {}),
273
+ ...(opts.noExitBtn !== undefined ? { noExitBtn: opts.noExitBtn ? 1 : 0 } : {}),
274
+ ...(opts.title !== undefined ? { title: opts.title } : {}),
275
+ });
276
+ },
277
+
278
+ configure(config: Readonly<Record<string, unknown>>): void {
279
+ postAction({
280
+ action: "configure",
281
+ config,
282
+ });
283
+ },
284
+
285
+ merge(xml: string): void {
286
+ postAction({
287
+ action: "merge",
288
+ xml,
289
+ });
290
+ },
291
+
292
+ export(opts: DrawioExportOptions): Promise<DrawioExportResult> {
293
+ const timeoutMs = opts.timeoutMs ?? defaultTimeoutMs;
294
+
295
+ return new Promise<DrawioExportResult>((resolve, reject) => {
296
+ let timer: ReturnType<typeof setTimeout> | undefined;
297
+
298
+ const resolver = (result: DrawioExportResult) => {
299
+ if (timer) clearTimeout(timer);
300
+ pendingExportResolvers.delete(resolver);
301
+ resolve(result);
302
+ };
303
+
304
+ pendingExportResolvers.add(resolver);
305
+
306
+ if (timeoutMs > 0 && timeoutMs !== Number.POSITIVE_INFINITY) {
307
+ timer = setTimeout(() => {
308
+ pendingExportResolvers.delete(resolver);
309
+ reject(new DiagramsTimeoutError(`Timed out waiting for draw.io export response after ${timeoutMs}ms`));
310
+ }, timeoutMs);
311
+ }
312
+
313
+ try {
314
+ postAction({
315
+ action: "export",
316
+ format: opts.format,
317
+ ...(opts.scale !== undefined ? { scale: opts.scale } : {}),
318
+ ...(opts.border !== undefined ? { border: opts.border } : {}),
319
+ ...(opts.xml !== undefined ? { xml: opts.xml } : {}),
320
+ ...(opts.embedImages !== undefined ? { embedImages: opts.embedImages } : {}),
321
+ });
322
+ } catch (error) {
323
+ if (timer) clearTimeout(timer);
324
+ pendingExportResolvers.delete(resolver);
325
+ reject(error);
326
+ }
327
+ });
328
+ },
329
+
330
+ postAction,
331
+
332
+ destroy(): void {
333
+ if (messageSource) {
334
+ messageSource.removeEventListener("message", handleMessage);
335
+ }
336
+ listeners.clear();
337
+ pendingExportResolvers.clear();
338
+ },
339
+ };
340
+ }
@@ -0,0 +1,76 @@
1
+ export type DiagramsErrorCode =
2
+ | "ERR_PRISM_DIAGRAMS"
3
+ | "ERR_PRISM_DIAGRAMS_ORIGIN_INVALID"
4
+ | "ERR_PRISM_DIAGRAMS_PROTOCOL"
5
+ | "ERR_PRISM_DIAGRAMS_XXE"
6
+ | "ERR_PRISM_DIAGRAMS_XML_MALFORMED"
7
+ | "ERR_PRISM_DIAGRAMS_XML_CAP"
8
+ | "ERR_PRISM_DIAGRAMS_XML_INVALID_MODEL"
9
+ | "ERR_PRISM_DIAGRAMS_UNSUPPORTED_FORMAT"
10
+ | "ERR_PRISM_DIAGRAMS_TIMEOUT";
11
+
12
+ export class DiagramsError extends Error {
13
+ readonly code: DiagramsErrorCode;
14
+
15
+ constructor(code: DiagramsErrorCode, message: string) {
16
+ super(message);
17
+ this.name = "DiagramsError";
18
+ this.code = code;
19
+ }
20
+ }
21
+
22
+ export class DiagramsOriginError extends DiagramsError {
23
+ constructor(message: string) {
24
+ super("ERR_PRISM_DIAGRAMS_ORIGIN_INVALID", message);
25
+ this.name = "DiagramsOriginError";
26
+ }
27
+ }
28
+
29
+ export class DiagramsProtocolError extends DiagramsError {
30
+ constructor(message: string, code: DiagramsErrorCode = "ERR_PRISM_DIAGRAMS_PROTOCOL") {
31
+ super(code, message);
32
+ this.name = "DiagramsProtocolError";
33
+ }
34
+ }
35
+
36
+ export class DiagramsXxeError extends DiagramsError {
37
+ constructor(message = "XML contains forbidden DOCTYPE or ENTITY declaration") {
38
+ super("ERR_PRISM_DIAGRAMS_XXE", message);
39
+ this.name = "DiagramsXxeError";
40
+ }
41
+ }
42
+
43
+ export class DiagramsCapError extends DiagramsError {
44
+ constructor(message: string) {
45
+ super("ERR_PRISM_DIAGRAMS_XML_CAP", message);
46
+ this.name = "DiagramsCapError";
47
+ }
48
+ }
49
+
50
+ export class DiagramsXmlMalformedError extends DiagramsError {
51
+ constructor(message: string) {
52
+ super("ERR_PRISM_DIAGRAMS_XML_MALFORMED", message);
53
+ this.name = "DiagramsXmlMalformedError";
54
+ }
55
+ }
56
+
57
+ export class DiagramsModelInvalidError extends DiagramsError {
58
+ constructor(message: string) {
59
+ super("ERR_PRISM_DIAGRAMS_XML_INVALID_MODEL", message);
60
+ this.name = "DiagramsModelInvalidError";
61
+ }
62
+ }
63
+
64
+ export class DiagramsFormatError extends DiagramsError {
65
+ constructor(message: string) {
66
+ super("ERR_PRISM_DIAGRAMS_UNSUPPORTED_FORMAT", message);
67
+ this.name = "DiagramsFormatError";
68
+ }
69
+ }
70
+
71
+ export class DiagramsTimeoutError extends DiagramsError {
72
+ constructor(message: string) {
73
+ super("ERR_PRISM_DIAGRAMS_TIMEOUT", message);
74
+ this.name = "DiagramsTimeoutError";
75
+ }
76
+ }
@@ -0,0 +1,81 @@
1
+ export {
2
+ canonicalizeDrawioXml,
3
+ type DrawioCanonicalizeOptions,
4
+ } from "./canonicalize.js";
5
+ export {
6
+ DEFAULT_MAX_ATTRIBUTES,
7
+ DEFAULT_MAX_ELEMENTS,
8
+ DEFAULT_MAX_XML_BYTES,
9
+ type DrawioXmlCaps,
10
+ HARD_MAX_ATTRIBUTES,
11
+ HARD_MAX_ELEMENTS,
12
+ HARD_MAX_XML_BYTES,
13
+ type ResolvedDrawioXmlCaps,
14
+ resolveDiagramsCaps,
15
+ validateByteCap,
16
+ } from "./caps.js";
17
+ export {
18
+ createDrawioEmbed,
19
+ type DrawioEmbed,
20
+ type DrawioEmbedFrame,
21
+ type DrawioEmbedOptions,
22
+ type DrawioEventMap,
23
+ type DrawioExportOptions,
24
+ type DrawioExportResult,
25
+ type DrawioLoadOptions,
26
+ type DrawioMessageEvent,
27
+ type DrawioMessageSource,
28
+ } from "./embed.js";
29
+ export {
30
+ DiagramsCapError,
31
+ DiagramsError,
32
+ type DiagramsErrorCode,
33
+ DiagramsFormatError,
34
+ DiagramsModelInvalidError,
35
+ DiagramsOriginError,
36
+ DiagramsProtocolError,
37
+ DiagramsTimeoutError,
38
+ DiagramsXmlMalformedError,
39
+ DiagramsXxeError,
40
+ } from "./errors.js";
41
+ export type {
42
+ DrawioAutosaveEvent,
43
+ DrawioConfigureAction,
44
+ DrawioConfigureEvent,
45
+ DrawioDialogAction,
46
+ DrawioDraftAction,
47
+ DrawioErrorEvent,
48
+ DrawioExitEvent,
49
+ DrawioExportAction,
50
+ DrawioExportBounds,
51
+ DrawioExportEvent,
52
+ DrawioExportFormat,
53
+ DrawioFitAction,
54
+ DrawioInboundEvent,
55
+ DrawioInitEvent,
56
+ DrawioLoadAction,
57
+ DrawioLoadEvent,
58
+ DrawioMergeAction,
59
+ DrawioOutboundAction,
60
+ DrawioPromptAction,
61
+ DrawioResetEditorAction,
62
+ DrawioSaveEvent,
63
+ DrawioSpinnerAction,
64
+ DrawioStatusAction,
65
+ DrawioTemplateAction,
66
+ } from "./messages.js";
67
+ export { validateDiagramsOrigin } from "./origin.js";
68
+ export {
69
+ type DiagramsTelemetry,
70
+ type DiagramsTelemetryAttributeValue,
71
+ type DiagramsTelemetrySpan,
72
+ noopDiagramsSpan,
73
+ noopDiagramsTelemetry,
74
+ } from "./telemetry.js";
75
+ export {
76
+ assertNotVisio,
77
+ type DrawioModelSummary,
78
+ type DrawioXmlOptions,
79
+ UNSAFE_XML_DECLARATION_PATTERN,
80
+ validateDrawioXml,
81
+ } from "./xml.js";
@@ -0,0 +1,150 @@
1
+ export type DrawioExportFormat = "xml" | "xmlsvg" | "xmlpng" | "json" | "png" | "svg";
2
+
3
+ export interface DrawioExportBounds {
4
+ readonly x: number;
5
+ readonly y: number;
6
+ readonly width: number;
7
+ readonly height: number;
8
+ }
9
+
10
+ // Inbound Editor-to-Host Events
11
+ export interface DrawioInitEvent {
12
+ readonly event: "init";
13
+ }
14
+
15
+ export interface DrawioLoadEvent {
16
+ readonly event: "load";
17
+ }
18
+
19
+ export interface DrawioSaveEvent {
20
+ readonly event: "save";
21
+ readonly xml: string;
22
+ readonly exit?: boolean;
23
+ }
24
+
25
+ export interface DrawioAutosaveEvent {
26
+ readonly event: "autosave";
27
+ readonly xml: string;
28
+ }
29
+
30
+ export interface DrawioExitEvent {
31
+ readonly event: "exit";
32
+ readonly modified: boolean;
33
+ }
34
+
35
+ export interface DrawioConfigureEvent {
36
+ readonly event: "configure";
37
+ }
38
+
39
+ export interface DrawioExportEvent {
40
+ readonly event: "export";
41
+ readonly format: string;
42
+ readonly data: string;
43
+ readonly xml?: string;
44
+ readonly bounds?: DrawioExportBounds;
45
+ }
46
+
47
+ export interface DrawioErrorEvent {
48
+ readonly event: "error";
49
+ readonly message: string;
50
+ }
51
+
52
+ export type DrawioInboundEvent =
53
+ | DrawioInitEvent
54
+ | DrawioLoadEvent
55
+ | DrawioSaveEvent
56
+ | DrawioAutosaveEvent
57
+ | DrawioExitEvent
58
+ | DrawioConfigureEvent
59
+ | DrawioExportEvent
60
+ | DrawioErrorEvent;
61
+
62
+ // Outbound Host-to-Editor Actions
63
+ export interface DrawioLoadAction {
64
+ readonly action: "load";
65
+ readonly xml: string;
66
+ readonly autosave?: boolean | 0 | 1;
67
+ readonly saveAndExit?: boolean | 0 | 1;
68
+ readonly noSaveBtn?: boolean | 0 | 1;
69
+ readonly noExitBtn?: boolean | 0 | 1;
70
+ readonly title?: string;
71
+ }
72
+
73
+ export interface DrawioConfigureAction {
74
+ readonly action: "configure";
75
+ readonly config: Readonly<Record<string, unknown>>;
76
+ }
77
+
78
+ export interface DrawioExportAction {
79
+ readonly action: "export";
80
+ readonly format: DrawioExportFormat;
81
+ readonly scale?: number;
82
+ readonly border?: number;
83
+ readonly xml?: string;
84
+ readonly embedImages?: boolean;
85
+ }
86
+
87
+ export interface DrawioMergeAction {
88
+ readonly action: "merge";
89
+ readonly xml: string;
90
+ }
91
+
92
+ export interface DrawioDialogAction {
93
+ readonly action: "dialog";
94
+ readonly title: string;
95
+ readonly message: string;
96
+ readonly button: string;
97
+ }
98
+
99
+ export interface DrawioPromptAction {
100
+ readonly action: "prompt";
101
+ readonly title: string;
102
+ readonly defaultValue?: string;
103
+ readonly ok: string;
104
+ }
105
+
106
+ export interface DrawioTemplateAction {
107
+ readonly action: "template";
108
+ readonly xml?: string;
109
+ readonly name?: string;
110
+ }
111
+
112
+ export interface DrawioDraftAction {
113
+ readonly action: "draft";
114
+ readonly xml: string;
115
+ readonly editKey?: string;
116
+ }
117
+
118
+ export interface DrawioStatusAction {
119
+ readonly action: "status";
120
+ readonly message: string;
121
+ readonly modified?: boolean;
122
+ }
123
+
124
+ export interface DrawioSpinnerAction {
125
+ readonly action: "spinner";
126
+ readonly show: boolean;
127
+ readonly message?: string;
128
+ }
129
+
130
+ export interface DrawioFitAction {
131
+ readonly action: "fit";
132
+ }
133
+
134
+ export interface DrawioResetEditorAction {
135
+ readonly action: "resetEditor";
136
+ }
137
+
138
+ export type DrawioOutboundAction =
139
+ | DrawioLoadAction
140
+ | DrawioConfigureAction
141
+ | DrawioExportAction
142
+ | DrawioMergeAction
143
+ | DrawioDialogAction
144
+ | DrawioPromptAction
145
+ | DrawioTemplateAction
146
+ | DrawioDraftAction
147
+ | DrawioStatusAction
148
+ | DrawioSpinnerAction
149
+ | DrawioFitAction
150
+ | DrawioResetEditorAction;
@@ -0,0 +1,52 @@
1
+ import { DiagramsOriginError } from "./errors.js";
2
+
3
+ /**
4
+ * Validates and normalizes an origin string for the draw.io embed client.
5
+ *
6
+ * Security rules:
7
+ * - Must be an explicit, non-empty origin string.
8
+ * - Wildcards ("*") are strictly rejected.
9
+ * - Must be a valid URL with "https:" or "http:" protocol.
10
+ * - Must have no path components (no trailing slash), no search query, no hash fragment, and no embedded credentials.
11
+ * - Returns the exact normalized origin matching url.origin.
12
+ */
13
+ export function validateDiagramsOrigin(value: unknown): string {
14
+ if (typeof value !== "string" || value.trim().length === 0) {
15
+ throw new DiagramsOriginError("An explicit, non-empty origin string is required to embed draw.io");
16
+ }
17
+
18
+ const trimmed = value.trim();
19
+ if (trimmed === "*") {
20
+ throw new DiagramsOriginError('Wildcard origin "*" is prohibited for draw.io embed security');
21
+ }
22
+
23
+ let url: URL;
24
+ try {
25
+ url = new URL(trimmed);
26
+ } catch {
27
+ throw new DiagramsOriginError(`Invalid origin URL: "${trimmed}"`);
28
+ }
29
+
30
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
31
+ throw new DiagramsOriginError(`Origin must use "https:" or "http:" protocol, received: "${url.protocol}"`);
32
+ }
33
+
34
+ if (url.username || url.password) {
35
+ throw new DiagramsOriginError("Origin must not contain embedded user credentials");
36
+ }
37
+
38
+ if (url.search || url.hash) {
39
+ throw new DiagramsOriginError("Origin must not contain query parameters or hash fragments");
40
+ }
41
+
42
+ if (url.pathname !== "" && url.pathname !== "/") {
43
+ throw new DiagramsOriginError(`Origin must not contain path components, received pathname: "${url.pathname}"`);
44
+ }
45
+
46
+ // Ensure byte-exact match with url.origin (no trailing slash)
47
+ if (trimmed !== url.origin) {
48
+ throw new DiagramsOriginError(`Origin must match exact origin format "${url.origin}" (no trailing slashes or paths)`);
49
+ }
50
+
51
+ return url.origin;
52
+ }