callman-core 1.28.0 → 1.29.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 (345) hide show
  1. package/ai-packs/scenario-nodes.md +451 -0
  2. package/dist/ai/index.d.ts +2 -1
  3. package/dist/ai/index.d.ts.map +1 -1
  4. package/dist/ai/index.js +1 -0
  5. package/dist/ai/index.js.map +1 -1
  6. package/dist/ai/outputSchemas.d.ts +3 -0
  7. package/dist/ai/outputSchemas.d.ts.map +1 -1
  8. package/dist/ai/outputSchemas.js +1 -0
  9. package/dist/ai/outputSchemas.js.map +1 -1
  10. package/dist/ai/parse/diagram.d.ts.map +1 -1
  11. package/dist/ai/parse/diagram.js +6 -3
  12. package/dist/ai/parse/diagram.js.map +1 -1
  13. package/dist/ai/prompts/diagram.d.ts +7 -3
  14. package/dist/ai/prompts/diagram.d.ts.map +1 -1
  15. package/dist/ai/prompts/diagram.js +44 -5
  16. package/dist/ai/prompts/diagram.js.map +1 -1
  17. package/dist/ai/prompts/scenario.d.ts.map +1 -1
  18. package/dist/ai/prompts/scenario.js +9 -8
  19. package/dist/ai/prompts/scenario.js.map +1 -1
  20. package/dist/ai/prompts/scenarioNodeReference.d.ts +16 -0
  21. package/dist/ai/prompts/scenarioNodeReference.d.ts.map +1 -0
  22. package/dist/ai/prompts/scenarioNodeReference.js +882 -0
  23. package/dist/ai/prompts/scenarioNodeReference.js.map +1 -0
  24. package/dist/ai/types.d.ts +6 -0
  25. package/dist/ai/types.d.ts.map +1 -1
  26. package/dist/diagram/bpmn/derive.d.ts +74 -0
  27. package/dist/diagram/bpmn/derive.d.ts.map +1 -0
  28. package/dist/diagram/bpmn/derive.js +392 -0
  29. package/dist/diagram/bpmn/derive.js.map +1 -0
  30. package/dist/diagram/bpmn/index.d.ts +7 -0
  31. package/dist/diagram/bpmn/index.d.ts.map +1 -0
  32. package/dist/diagram/bpmn/index.js +12 -0
  33. package/dist/diagram/bpmn/index.js.map +1 -0
  34. package/dist/diagram/bpmn/patch.d.ts +14 -0
  35. package/dist/diagram/bpmn/patch.d.ts.map +1 -0
  36. package/dist/diagram/bpmn/patch.js +770 -0
  37. package/dist/diagram/bpmn/patch.js.map +1 -0
  38. package/dist/diagram/bpmn/place.d.ts +4 -0
  39. package/dist/diagram/bpmn/place.d.ts.map +1 -0
  40. package/dist/diagram/bpmn/place.js +65 -0
  41. package/dist/diagram/bpmn/place.js.map +1 -0
  42. package/dist/diagram/bpmn/serialize.d.ts +12 -0
  43. package/dist/diagram/bpmn/serialize.d.ts.map +1 -0
  44. package/dist/diagram/bpmn/serialize.js +292 -0
  45. package/dist/diagram/bpmn/serialize.js.map +1 -0
  46. package/dist/diagram/bpmn/types.d.ts +42 -0
  47. package/dist/diagram/bpmn/types.d.ts.map +1 -0
  48. package/dist/diagram/bpmn/types.js +84 -0
  49. package/dist/diagram/bpmn/types.js.map +1 -0
  50. package/dist/diagram/bpmn/xml.d.ts +60 -0
  51. package/dist/diagram/bpmn/xml.d.ts.map +1 -0
  52. package/dist/diagram/bpmn/xml.js +342 -0
  53. package/dist/diagram/bpmn/xml.js.map +1 -0
  54. package/dist/diagram/elkGraph.d.ts +1 -3
  55. package/dist/diagram/elkGraph.d.ts.map +1 -1
  56. package/dist/diagram/elkGraph.js +1 -0
  57. package/dist/diagram/elkGraph.js.map +1 -1
  58. package/dist/diagram/fixtures.d.ts +10 -0
  59. package/dist/diagram/fixtures.d.ts.map +1 -0
  60. package/dist/diagram/fixtures.js +113 -0
  61. package/dist/diagram/fixtures.js.map +1 -0
  62. package/dist/diagram/geometry.d.ts +27 -0
  63. package/dist/diagram/geometry.d.ts.map +1 -0
  64. package/dist/diagram/geometry.js +122 -0
  65. package/dist/diagram/geometry.js.map +1 -0
  66. package/dist/diagram/history.d.ts +36 -0
  67. package/dist/diagram/history.d.ts.map +1 -0
  68. package/dist/diagram/history.js +54 -0
  69. package/dist/diagram/history.js.map +1 -0
  70. package/dist/diagram/ids.d.ts +5 -0
  71. package/dist/diagram/ids.d.ts.map +1 -0
  72. package/dist/diagram/ids.js +52 -0
  73. package/dist/diagram/ids.js.map +1 -0
  74. package/dist/diagram/index.d.ts +14 -2
  75. package/dist/diagram/index.d.ts.map +1 -1
  76. package/dist/diagram/index.js +20 -8
  77. package/dist/diagram/index.js.map +1 -1
  78. package/dist/diagram/layout.d.ts +107 -0
  79. package/dist/diagram/layout.d.ts.map +1 -0
  80. package/dist/diagram/layout.js +356 -0
  81. package/dist/diagram/layout.js.map +1 -0
  82. package/dist/diagram/mermaid/derive.d.ts +55 -0
  83. package/dist/diagram/mermaid/derive.d.ts.map +1 -0
  84. package/dist/diagram/mermaid/derive.js +343 -0
  85. package/dist/diagram/mermaid/derive.js.map +1 -0
  86. package/dist/diagram/mermaid/index.d.ts +8 -0
  87. package/dist/diagram/mermaid/index.d.ts.map +1 -0
  88. package/dist/diagram/mermaid/index.js +24 -0
  89. package/dist/diagram/mermaid/index.js.map +1 -0
  90. package/dist/diagram/mermaid/parse.d.ts +96 -0
  91. package/dist/diagram/mermaid/parse.d.ts.map +1 -0
  92. package/dist/diagram/mermaid/parse.js +672 -0
  93. package/dist/diagram/mermaid/parse.js.map +1 -0
  94. package/dist/diagram/mermaid/patch.d.ts +16 -0
  95. package/dist/diagram/mermaid/patch.d.ts.map +1 -0
  96. package/dist/diagram/mermaid/patch.js +463 -0
  97. package/dist/diagram/mermaid/patch.js.map +1 -0
  98. package/dist/diagram/mermaid/serialize.d.ts +14 -0
  99. package/dist/diagram/mermaid/serialize.d.ts.map +1 -0
  100. package/dist/diagram/mermaid/serialize.js +125 -0
  101. package/dist/diagram/mermaid/serialize.js.map +1 -0
  102. package/dist/diagram/mermaid/shapes.d.ts +11 -0
  103. package/dist/diagram/mermaid/shapes.d.ts.map +1 -0
  104. package/dist/diagram/mermaid/shapes.js +320 -0
  105. package/dist/diagram/mermaid/shapes.js.map +1 -0
  106. package/dist/diagram/migrations.d.ts +1 -0
  107. package/dist/diagram/migrations.d.ts.map +1 -1
  108. package/dist/diagram/migrations.js +7 -2
  109. package/dist/diagram/migrations.js.map +1 -1
  110. package/dist/diagram/normalize.d.ts +9 -1
  111. package/dist/diagram/normalize.d.ts.map +1 -1
  112. package/dist/diagram/normalize.js +194 -0
  113. package/dist/diagram/normalize.js.map +1 -1
  114. package/dist/diagram/ops.d.ts +146 -0
  115. package/dist/diagram/ops.d.ts.map +1 -0
  116. package/dist/diagram/ops.js +823 -0
  117. package/dist/diagram/ops.js.map +1 -0
  118. package/dist/diagram/opsReference.d.ts +3 -0
  119. package/dist/diagram/opsReference.d.ts.map +1 -0
  120. package/dist/diagram/opsReference.js +51 -0
  121. package/dist/diagram/opsReference.js.map +1 -0
  122. package/dist/diagram/patchInput.d.ts +193 -0
  123. package/dist/diagram/patchInput.d.ts.map +1 -0
  124. package/dist/diagram/patchInput.js +621 -0
  125. package/dist/diagram/patchInput.js.map +1 -0
  126. package/dist/diagram/routing/batch.d.ts +45 -0
  127. package/dist/diagram/routing/batch.d.ts.map +1 -0
  128. package/dist/diagram/routing/batch.js +136 -0
  129. package/dist/diagram/routing/batch.js.map +1 -0
  130. package/dist/diagram/routing/curves.d.ts +7 -0
  131. package/dist/diagram/routing/curves.d.ts.map +1 -0
  132. package/dist/diagram/routing/curves.js +120 -0
  133. package/dist/diagram/routing/curves.js.map +1 -0
  134. package/dist/diagram/routing/grid.d.ts +15 -0
  135. package/dist/diagram/routing/grid.d.ts.map +1 -0
  136. package/dist/diagram/routing/grid.js +245 -0
  137. package/dist/diagram/routing/grid.js.map +1 -0
  138. package/dist/diagram/routing/index.d.ts +10 -0
  139. package/dist/diagram/routing/index.d.ts.map +1 -0
  140. package/dist/diagram/routing/index.js +10 -0
  141. package/dist/diagram/routing/index.js.map +1 -0
  142. package/dist/diagram/routing/legacy.d.ts +6 -0
  143. package/dist/diagram/routing/legacy.d.ts.map +1 -0
  144. package/dist/diagram/routing/legacy.js +27 -0
  145. package/dist/diagram/routing/legacy.js.map +1 -0
  146. package/dist/diagram/routing/nudge.d.ts +4 -0
  147. package/dist/diagram/routing/nudge.d.ts.map +1 -0
  148. package/dist/diagram/routing/nudge.js +96 -0
  149. package/dist/diagram/routing/nudge.js.map +1 -0
  150. package/dist/diagram/routing/orthogonal.d.ts +6 -0
  151. package/dist/diagram/routing/orthogonal.d.ts.map +1 -0
  152. package/dist/diagram/routing/orthogonal.js +56 -0
  153. package/dist/diagram/routing/orthogonal.js.map +1 -0
  154. package/dist/diagram/routing/path.d.ts +16 -0
  155. package/dist/diagram/routing/path.d.ts.map +1 -0
  156. package/dist/diagram/routing/path.js +128 -0
  157. package/dist/diagram/routing/path.js.map +1 -0
  158. package/dist/diagram/routing/sides.d.ts +22 -0
  159. package/dist/diagram/routing/sides.d.ts.map +1 -0
  160. package/dist/diagram/routing/sides.js +74 -0
  161. package/dist/diagram/routing/sides.js.map +1 -0
  162. package/dist/diagram/routing/types.d.ts +46 -0
  163. package/dist/diagram/routing/types.d.ts.map +1 -0
  164. package/dist/diagram/routing/types.js +11 -0
  165. package/dist/diagram/routing/types.js.map +1 -0
  166. package/dist/diagram/schema.d.ts +70 -37
  167. package/dist/diagram/schema.d.ts.map +1 -1
  168. package/dist/diagram/schema.js +62 -8
  169. package/dist/diagram/schema.js.map +1 -1
  170. package/dist/diagram/styleInput.d.ts +41 -0
  171. package/dist/diagram/styleInput.d.ts.map +1 -0
  172. package/dist/diagram/styleInput.js +105 -0
  173. package/dist/diagram/styleInput.js.map +1 -0
  174. package/dist/diagram/views.d.ts +9 -0
  175. package/dist/diagram/views.d.ts.map +1 -0
  176. package/dist/diagram/views.js +42 -0
  177. package/dist/diagram/views.js.map +1 -0
  178. package/dist/http-file/flatImport.d.ts +1 -0
  179. package/dist/http-file/flatImport.d.ts.map +1 -1
  180. package/dist/http-file/flatImport.js.map +1 -1
  181. package/dist/http-file/index.d.ts +1 -1
  182. package/dist/http-file/index.d.ts.map +1 -1
  183. package/dist/http-file/index.js +1 -1
  184. package/dist/http-file/index.js.map +1 -1
  185. package/dist/http-file/parseHttpFile.d.ts +1 -0
  186. package/dist/http-file/parseHttpFile.d.ts.map +1 -1
  187. package/dist/http-file/parseHttpFile.js +40 -8
  188. package/dist/http-file/parseHttpFile.js.map +1 -1
  189. package/dist/index.d.ts +1 -0
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/index.js +3 -0
  192. package/dist/index.js.map +1 -1
  193. package/dist/request/requestBody.d.ts +55 -0
  194. package/dist/request/requestBody.d.ts.map +1 -0
  195. package/dist/request/requestBody.js +198 -0
  196. package/dist/request/requestBody.js.map +1 -0
  197. package/dist/runner/requestRunner.d.ts.map +1 -1
  198. package/dist/runner/requestRunner.js +127 -43
  199. package/dist/runner/requestRunner.js.map +1 -1
  200. package/dist/runner/runCollection.d.ts +1 -1
  201. package/dist/runner/runCollection.d.ts.map +1 -1
  202. package/dist/runner/runCollection.js +9 -2
  203. package/dist/runner/runCollection.js.map +1 -1
  204. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts +2 -1
  205. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts.map +1 -1
  206. package/dist/scenario-runner/adapters/helpers/request-helpers.js +8 -40
  207. package/dist/scenario-runner/adapters/helpers/request-helpers.js.map +1 -1
  208. package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -1
  209. package/dist/scenario-runner/adapters/request-executor.js +2 -29
  210. package/dist/scenario-runner/adapters/request-executor.js.map +1 -1
  211. package/dist/scenario-runner/index.d.ts +1 -0
  212. package/dist/scenario-runner/index.d.ts.map +1 -1
  213. package/dist/scenario-runner/index.js +1 -0
  214. package/dist/scenario-runner/index.js.map +1 -1
  215. package/dist/scenario-runner/labels.d.ts +3 -0
  216. package/dist/scenario-runner/labels.d.ts.map +1 -0
  217. package/dist/scenario-runner/labels.js +20 -0
  218. package/dist/scenario-runner/labels.js.map +1 -0
  219. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  220. package/dist/scenario-runner/runScenario.js +4 -11
  221. package/dist/scenario-runner/runScenario.js.map +1 -1
  222. package/dist/script/legacy.d.ts.map +1 -1
  223. package/dist/script/legacy.js +24 -9
  224. package/dist/script/legacy.js.map +1 -1
  225. package/dist/types/index.d.ts +18 -1
  226. package/dist/types/index.d.ts.map +1 -1
  227. package/dist/variables/resolver.d.ts.map +1 -1
  228. package/dist/variables/resolver.js +27 -5
  229. package/dist/variables/resolver.js.map +1 -1
  230. package/dist-cjs/ai/index.js +4 -1
  231. package/dist-cjs/ai/index.js.map +1 -1
  232. package/dist-cjs/ai/outputSchemas.js +1 -0
  233. package/dist-cjs/ai/outputSchemas.js.map +1 -1
  234. package/dist-cjs/ai/parse/diagram.js +6 -3
  235. package/dist-cjs/ai/parse/diagram.js.map +1 -1
  236. package/dist-cjs/ai/prompts/diagram.js +44 -5
  237. package/dist-cjs/ai/prompts/diagram.js.map +1 -1
  238. package/dist-cjs/ai/prompts/scenario.js +9 -8
  239. package/dist-cjs/ai/prompts/scenario.js.map +1 -1
  240. package/dist-cjs/ai/prompts/scenarioNodeReference.js +886 -0
  241. package/dist-cjs/ai/prompts/scenarioNodeReference.js.map +1 -0
  242. package/dist-cjs/diagram/bpmn/derive.js +398 -0
  243. package/dist-cjs/diagram/bpmn/derive.js.map +1 -0
  244. package/dist-cjs/diagram/bpmn/index.js +31 -0
  245. package/dist-cjs/diagram/bpmn/index.js.map +1 -0
  246. package/dist-cjs/diagram/bpmn/patch.js +774 -0
  247. package/dist-cjs/diagram/bpmn/patch.js.map +1 -0
  248. package/dist-cjs/diagram/bpmn/place.js +69 -0
  249. package/dist-cjs/diagram/bpmn/place.js.map +1 -0
  250. package/dist-cjs/diagram/bpmn/serialize.js +299 -0
  251. package/dist-cjs/diagram/bpmn/serialize.js.map +1 -0
  252. package/dist-cjs/diagram/bpmn/types.js +99 -0
  253. package/dist-cjs/diagram/bpmn/types.js.map +1 -0
  254. package/dist-cjs/diagram/bpmn/xml.js +367 -0
  255. package/dist-cjs/diagram/bpmn/xml.js.map +1 -0
  256. package/dist-cjs/diagram/elkGraph.js +1 -0
  257. package/dist-cjs/diagram/elkGraph.js.map +1 -1
  258. package/dist-cjs/diagram/fixtures.js +117 -0
  259. package/dist-cjs/diagram/fixtures.js.map +1 -0
  260. package/dist-cjs/diagram/geometry.js +143 -0
  261. package/dist-cjs/diagram/geometry.js.map +1 -0
  262. package/dist-cjs/diagram/history.js +65 -0
  263. package/dist-cjs/diagram/history.js.map +1 -0
  264. package/dist-cjs/diagram/ids.js +58 -0
  265. package/dist-cjs/diagram/ids.js.map +1 -0
  266. package/dist-cjs/diagram/index.js +23 -8
  267. package/dist-cjs/diagram/index.js.map +1 -1
  268. package/dist-cjs/diagram/layout.js +364 -0
  269. package/dist-cjs/diagram/layout.js.map +1 -0
  270. package/dist-cjs/diagram/mermaid/derive.js +353 -0
  271. package/dist-cjs/diagram/mermaid/derive.js.map +1 -0
  272. package/dist-cjs/diagram/mermaid/index.js +44 -0
  273. package/dist-cjs/diagram/mermaid/index.js.map +1 -0
  274. package/dist-cjs/diagram/mermaid/parse.js +681 -0
  275. package/dist-cjs/diagram/mermaid/parse.js.map +1 -0
  276. package/dist-cjs/diagram/mermaid/patch.js +468 -0
  277. package/dist-cjs/diagram/mermaid/patch.js.map +1 -0
  278. package/dist-cjs/diagram/mermaid/serialize.js +133 -0
  279. package/dist-cjs/diagram/mermaid/serialize.js.map +1 -0
  280. package/dist-cjs/diagram/mermaid/shapes.js +327 -0
  281. package/dist-cjs/diagram/mermaid/shapes.js.map +1 -0
  282. package/dist-cjs/diagram/migrations.js +9 -3
  283. package/dist-cjs/diagram/migrations.js.map +1 -1
  284. package/dist-cjs/diagram/normalize.js +198 -1
  285. package/dist-cjs/diagram/normalize.js.map +1 -1
  286. package/dist-cjs/diagram/ops.js +829 -0
  287. package/dist-cjs/diagram/ops.js.map +1 -0
  288. package/dist-cjs/diagram/opsReference.js +55 -0
  289. package/dist-cjs/diagram/opsReference.js.map +1 -0
  290. package/dist-cjs/diagram/patchInput.js +636 -0
  291. package/dist-cjs/diagram/patchInput.js.map +1 -0
  292. package/dist-cjs/diagram/routing/batch.js +142 -0
  293. package/dist-cjs/diagram/routing/batch.js.map +1 -0
  294. package/dist-cjs/diagram/routing/curves.js +127 -0
  295. package/dist-cjs/diagram/routing/curves.js.map +1 -0
  296. package/dist-cjs/diagram/routing/grid.js +250 -0
  297. package/dist-cjs/diagram/routing/grid.js.map +1 -0
  298. package/dist-cjs/diagram/routing/index.js +29 -0
  299. package/dist-cjs/diagram/routing/index.js.map +1 -0
  300. package/dist-cjs/diagram/routing/legacy.js +32 -0
  301. package/dist-cjs/diagram/routing/legacy.js.map +1 -0
  302. package/dist-cjs/diagram/routing/nudge.js +100 -0
  303. package/dist-cjs/diagram/routing/nudge.js.map +1 -0
  304. package/dist-cjs/diagram/routing/orthogonal.js +62 -0
  305. package/dist-cjs/diagram/routing/orthogonal.js.map +1 -0
  306. package/dist-cjs/diagram/routing/path.js +137 -0
  307. package/dist-cjs/diagram/routing/path.js.map +1 -0
  308. package/dist-cjs/diagram/routing/sides.js +82 -0
  309. package/dist-cjs/diagram/routing/sides.js.map +1 -0
  310. package/dist-cjs/diagram/routing/types.js +15 -0
  311. package/dist-cjs/diagram/routing/types.js.map +1 -0
  312. package/dist-cjs/diagram/schema.js +64 -9
  313. package/dist-cjs/diagram/schema.js.map +1 -1
  314. package/dist-cjs/diagram/styleInput.js +113 -0
  315. package/dist-cjs/diagram/styleInput.js.map +1 -0
  316. package/dist-cjs/diagram/views.js +46 -0
  317. package/dist-cjs/diagram/views.js.map +1 -0
  318. package/dist-cjs/http-file/flatImport.js.map +1 -1
  319. package/dist-cjs/http-file/index.js +2 -1
  320. package/dist-cjs/http-file/index.js.map +1 -1
  321. package/dist-cjs/http-file/parseHttpFile.js +42 -9
  322. package/dist-cjs/http-file/parseHttpFile.js.map +1 -1
  323. package/dist-cjs/index.js +9 -1
  324. package/dist-cjs/index.js.map +1 -1
  325. package/dist-cjs/request/requestBody.js +206 -0
  326. package/dist-cjs/request/requestBody.js.map +1 -0
  327. package/dist-cjs/runner/requestRunner.js +127 -43
  328. package/dist-cjs/runner/requestRunner.js.map +1 -1
  329. package/dist-cjs/runner/runCollection.js +9 -2
  330. package/dist-cjs/runner/runCollection.js.map +1 -1
  331. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js +7 -42
  332. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js.map +1 -1
  333. package/dist-cjs/scenario-runner/adapters/request-executor.js +3 -30
  334. package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -1
  335. package/dist-cjs/scenario-runner/index.js +4 -1
  336. package/dist-cjs/scenario-runner/index.js.map +1 -1
  337. package/dist-cjs/scenario-runner/labels.js +24 -0
  338. package/dist-cjs/scenario-runner/labels.js.map +1 -0
  339. package/dist-cjs/scenario-runner/runScenario.js +4 -11
  340. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  341. package/dist-cjs/script/legacy.js +24 -9
  342. package/dist-cjs/script/legacy.js.map +1 -1
  343. package/dist-cjs/variables/resolver.js +27 -5
  344. package/dist-cjs/variables/resolver.js.map +1 -1
  345. package/package.json +1 -1
@@ -0,0 +1,128 @@
1
+ const fmt = (n) => (Number.isInteger(n) ? String(n) : n.toFixed(2).replace(/\.?0+$/, ""));
2
+ // Orthogonal polylines get rounded corners of `radius` (clamped to half the
3
+ // shorter adjacent segment); straight polylines are sharp; curved paths use
4
+ // their cubic segments.
5
+ export const svgPathFromRoute = (route, radius = 8) => {
6
+ const { points } = route;
7
+ if (points.length === 0)
8
+ return "";
9
+ if (route.kind === "curved" && route.curves) {
10
+ let d = `M ${fmt(points[0].x)} ${fmt(points[0].y)}`;
11
+ for (const [c1, c2, end] of route.curves) {
12
+ d += ` C ${fmt(c1.x)} ${fmt(c1.y)} ${fmt(c2.x)} ${fmt(c2.y)} ${fmt(end.x)} ${fmt(end.y)}`;
13
+ }
14
+ return d;
15
+ }
16
+ if (route.kind !== "orthogonal" || radius <= 0 || points.length < 3) {
17
+ return points.map((p, i) => `${i === 0 ? "M" : "L"} ${fmt(p.x)} ${fmt(p.y)}`).join(" ");
18
+ }
19
+ let d = `M ${fmt(points[0].x)} ${fmt(points[0].y)}`;
20
+ for (let i = 1; i < points.length - 1; i += 1) {
21
+ const prev = points[i - 1];
22
+ const corner = points[i];
23
+ const next = points[i + 1];
24
+ const inLen = Math.hypot(corner.x - prev.x, corner.y - prev.y);
25
+ const outLen = Math.hypot(next.x - corner.x, next.y - corner.y);
26
+ const r = Math.min(radius, inLen / 2, outLen / 2);
27
+ if (r <= 0.01) {
28
+ d += ` L ${fmt(corner.x)} ${fmt(corner.y)}`;
29
+ continue;
30
+ }
31
+ const a = { x: corner.x - ((corner.x - prev.x) / inLen) * r, y: corner.y - ((corner.y - prev.y) / inLen) * r };
32
+ const b = { x: corner.x + ((next.x - corner.x) / outLen) * r, y: corner.y + ((next.y - corner.y) / outLen) * r };
33
+ d += ` L ${fmt(a.x)} ${fmt(a.y)} Q ${fmt(corner.x)} ${fmt(corner.y)} ${fmt(b.x)} ${fmt(b.y)}`;
34
+ }
35
+ const last = points[points.length - 1];
36
+ d += ` L ${fmt(last.x)} ${fmt(last.y)}`;
37
+ return d;
38
+ };
39
+ const cubicAt = (p0, c1, c2, p1, t) => {
40
+ const mt = 1 - t;
41
+ return {
42
+ x: mt * mt * mt * p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t * t * t * p1.x,
43
+ y: mt * mt * mt * p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t * t * t * p1.y,
44
+ };
45
+ };
46
+ // Polyline approximation used for lengths and sampling (curves flattened).
47
+ export const flattenRoute = (route, steps = 12) => {
48
+ if (route.kind !== "curved" || !route.curves)
49
+ return route.points;
50
+ const out = [route.points[0]];
51
+ let from = route.points[0];
52
+ for (const [c1, c2, end] of route.curves) {
53
+ for (let i = 1; i <= steps; i += 1)
54
+ out.push(cubicAt(from, c1, c2, end, i / steps));
55
+ from = end;
56
+ }
57
+ return out;
58
+ };
59
+ export const routeLength = (route) => {
60
+ const pts = flattenRoute(route);
61
+ let length = 0;
62
+ for (let i = 1; i < pts.length; i += 1)
63
+ length += Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y);
64
+ return length;
65
+ };
66
+ // Point at fraction `t` (0..1) of the path length, plus the tangent angle in
67
+ // radians — where an edge label or toolbar sits.
68
+ export const pointAlongRoute = (route, t) => {
69
+ const pts = flattenRoute(route);
70
+ if (pts.length === 0)
71
+ return { point: { x: 0, y: 0 }, angle: 0 };
72
+ if (pts.length === 1)
73
+ return { point: pts[0], angle: 0 };
74
+ const total = routeLength(route);
75
+ let remaining = Math.min(1, Math.max(0, t)) * total;
76
+ for (let i = 1; i < pts.length; i += 1) {
77
+ const a = pts[i - 1];
78
+ const b = pts[i];
79
+ const segment = Math.hypot(b.x - a.x, b.y - a.y);
80
+ if (remaining <= segment || i === pts.length - 1) {
81
+ const k = segment === 0 ? 0 : remaining / segment;
82
+ return { point: { x: a.x + (b.x - a.x) * k, y: a.y + (b.y - a.y) * k }, angle: Math.atan2(b.y - a.y, b.x - a.x) };
83
+ }
84
+ remaining -= segment;
85
+ }
86
+ const last = pts[pts.length - 1];
87
+ return { point: last, angle: 0 };
88
+ };
89
+ // The fraction along the path nearest to `point` — dragging a label.
90
+ export const nearestFraction = (route, point) => {
91
+ const pts = flattenRoute(route);
92
+ const total = routeLength(route);
93
+ if (total === 0 || pts.length < 2)
94
+ return 0.5;
95
+ let best = 0;
96
+ let bestDistance = Infinity;
97
+ let walked = 0;
98
+ for (let i = 1; i < pts.length; i += 1) {
99
+ const a = pts[i - 1];
100
+ const b = pts[i];
101
+ const dx = b.x - a.x;
102
+ const dy = b.y - a.y;
103
+ const segment = Math.hypot(dx, dy);
104
+ const k = segment === 0 ? 0 : Math.min(1, Math.max(0, ((point.x - a.x) * dx + (point.y - a.y) * dy) / (segment * segment)));
105
+ const px = a.x + dx * k;
106
+ const py = a.y + dy * k;
107
+ const distance = Math.hypot(point.x - px, point.y - py);
108
+ if (distance < bestDistance) {
109
+ bestDistance = distance;
110
+ best = (walked + segment * k) / total;
111
+ }
112
+ walked += segment;
113
+ }
114
+ return best;
115
+ };
116
+ // Midpoints of the interior segments of an orthogonal route — where the
117
+ // canvas shows drag handles that create manual bends.
118
+ export const segmentMidpoints = (route) => {
119
+ const out = [];
120
+ const pts = route.points;
121
+ for (let i = 1; i < pts.length - 2; i += 1) {
122
+ const a = pts[i];
123
+ const b = pts[i + 1];
124
+ out.push({ index: i, point: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }, horizontal: Math.abs(a.y - b.y) < 1e-6 });
125
+ }
126
+ return out;
127
+ };
128
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/diagram/routing/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Rect } from "../geometry.js";
2
+ import type { Point } from "../schema.js";
3
+ import type { Side, Terminal } from "./types.js";
4
+ export interface Sides {
5
+ source: Side;
6
+ target: Side;
7
+ }
8
+ export declare const chooseSides: (source: Rect, target: Rect, fixed?: {
9
+ source?: Side;
10
+ target?: Side;
11
+ }, previous?: {
12
+ source?: Side;
13
+ target?: Side;
14
+ }) => Sides;
15
+ export declare const sidesFor: (source: Terminal, target: Terminal, previous?: {
16
+ source?: Side;
17
+ target?: Side;
18
+ }) => Sides;
19
+ export declare const sideVector: (side: Side) => Point;
20
+ export declare const attachPoint: (terminal: Terminal, side: Side) => Point;
21
+ export declare const boundaryToward: (rect: Rect, toward: Point) => Point;
22
+ //# sourceMappingURL=sides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sides.d.ts","sourceRoot":"","sources":["../../../src/diagram/routing/sides.ts"],"names":[],"mappings":"AAKA,OAAO,EAA4B,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,IAAI,CAAC;CACd;AAaD,eAAO,MAAM,WAAW,GACtB,QAAQ,IAAI,EACZ,QAAQ,IAAI,EACZ,QAAO;IAAE,MAAM,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAO,EAC5C,WAAW;IAAE,MAAM,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,KAC1C,KAuBF,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,EAAE,WAAW;IAAE,MAAM,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,KAAG,KACZ,CAAC;AAEhG,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,KAAG,KAYvC,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,UAAU,QAAQ,EAAE,MAAM,IAAI,KAAG,KAA4D,CAAC;AAI1H,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,EAAE,QAAQ,KAAK,KAAG,KAS1D,CAAC"}
@@ -0,0 +1,74 @@
1
+ // Which side of each node a FLOATING edge leaves from / arrives at. draw.io's
2
+ // rule: the pair of facing sides along the axis with the larger gap; when
3
+ // the rectangles overlap on both axes, the sides the centre vector points
4
+ // through. A previous choice is kept while the gaps are nearly equal so a
5
+ // node dragged along the diagonal does not flip its edges every frame.
6
+ import { rectCenter, sideMidpoint } from "../geometry.js";
7
+ const HYSTERESIS = 24;
8
+ const sideToward = (from, to) => {
9
+ const center = rectCenter(from);
10
+ const dx = to.x - center.x;
11
+ const dy = to.y - center.y;
12
+ // Compare against the rectangle's aspect so wide nodes prefer left/right.
13
+ if (Math.abs(dx) * from.height >= Math.abs(dy) * from.width)
14
+ return dx >= 0 ? "right" : "left";
15
+ return dy >= 0 ? "bottom" : "top";
16
+ };
17
+ export const chooseSides = (source, target, fixed = {}, previous) => {
18
+ if (fixed.source && fixed.target)
19
+ return { source: fixed.source, target: fixed.target };
20
+ if (fixed.source)
21
+ return { source: fixed.source, target: sideToward(target, sideMidpoint(source, fixed.source)) };
22
+ if (fixed.target)
23
+ return { source: sideToward(source, sideMidpoint(target, fixed.target)), target: fixed.target };
24
+ const gapX = Math.max(target.x - (source.x + source.width), source.x - (target.x + target.width));
25
+ const gapY = Math.max(target.y - (source.y + source.height), source.y - (target.y + target.height));
26
+ const sc = rectCenter(source);
27
+ const tc = rectCenter(target);
28
+ let horizontal;
29
+ if (previous?.source && previous.target && Math.abs(gapX - gapY) < HYSTERESIS) {
30
+ horizontal = previous.source === "left" || previous.source === "right";
31
+ }
32
+ else if (gapX < 0 && gapY < 0) {
33
+ // Overlapping on both axes: go by the centre vector.
34
+ horizontal = Math.abs(tc.x - sc.x) >= Math.abs(tc.y - sc.y);
35
+ }
36
+ else {
37
+ horizontal = gapX >= gapY;
38
+ }
39
+ if (horizontal) {
40
+ return tc.x >= sc.x ? { source: "right", target: "left" } : { source: "left", target: "right" };
41
+ }
42
+ return tc.y >= sc.y ? { source: "bottom", target: "top" } : { source: "top", target: "bottom" };
43
+ };
44
+ export const sidesFor = (source, target, previous) => chooseSides(source.rect, target.rect, { source: source.side, target: target.side }, previous);
45
+ export const sideVector = (side) => {
46
+ switch (side) {
47
+ case "top":
48
+ return { x: 0, y: -1 };
49
+ case "bottom":
50
+ return { x: 0, y: 1 };
51
+ case "left":
52
+ return { x: -1, y: 0 };
53
+ case "right":
54
+ default:
55
+ return { x: 1, y: 0 };
56
+ }
57
+ };
58
+ // The point on the boundary where a terminal attaches: the explicit point
59
+ // when given (legacy anchors, free ends), else the side's midpoint.
60
+ export const attachPoint = (terminal, side) => terminal.point ?? sideMidpoint(terminal.rect, side);
61
+ // Where the straight line from the rectangle's centre toward `toward` leaves
62
+ // the rectangle — used by straight and curved edges so they meet the outline.
63
+ export const boundaryToward = (rect, toward) => {
64
+ const c = rectCenter(rect);
65
+ const dx = toward.x - c.x;
66
+ const dy = toward.y - c.y;
67
+ if (dx === 0 && dy === 0)
68
+ return { x: c.x, y: rect.y };
69
+ const hw = rect.width / 2;
70
+ const hh = rect.height / 2;
71
+ const scale = Math.min(hw / Math.max(Math.abs(dx), 1e-9), hh / Math.max(Math.abs(dy), 1e-9));
72
+ return { x: c.x + dx * scale, y: c.y + dy * scale };
73
+ };
74
+ //# sourceMappingURL=sides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sides.js","sourceRoot":"","sources":["../../../src/diagram/routing/sides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { Rect } from "../geometry.js";
2
+ import type { DiagramRouting, HandleSide, Point } from "../schema.js";
3
+ export type { Rect } from "../geometry.js";
4
+ export type Side = HandleSide;
5
+ export interface Terminal {
6
+ rect: Rect;
7
+ side?: Side;
8
+ point?: Point;
9
+ }
10
+ export interface RoutedPath {
11
+ points: Point[];
12
+ kind: "orthogonal" | "straight" | "curved";
13
+ sourceSide: Side;
14
+ targetSide: Side;
15
+ curves?: Array<[Point, Point, Point]>;
16
+ via: "orthogonal" | "smart" | "smart-fallback" | "straight" | "curved" | "waypoints" | "legacy";
17
+ }
18
+ export interface RouteOptions {
19
+ margin?: number;
20
+ cornerRadius?: number;
21
+ bendPenalty?: number;
22
+ hugPenalty?: number;
23
+ nudgeGap?: number;
24
+ regionPad?: number;
25
+ smartObstacleLimit?: number;
26
+ previous?: {
27
+ source?: Side;
28
+ target?: Side;
29
+ };
30
+ }
31
+ export interface ResolvedRouteOptions {
32
+ margin: number;
33
+ cornerRadius: number;
34
+ bendPenalty: number;
35
+ hugPenalty: number;
36
+ nudgeGap: number;
37
+ regionPad: number;
38
+ smartObstacleLimit: number;
39
+ previous?: {
40
+ source?: Side;
41
+ target?: Side;
42
+ };
43
+ }
44
+ export declare const resolveRouteOptions: (options?: RouteOptions) => ResolvedRouteOptions;
45
+ export type { DiagramRouting, Point };
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/diagram/routing/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAEtE,YAAY,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,MAAM,MAAM,IAAI,GAAG,UAAU,CAAC;AAI9B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAIzB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC3C,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtC,GAAG,EAAE,YAAY,GAAG,OAAO,GAAG,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;CACjG;AAED,MAAM,WAAW,YAAY;IAE3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAG5B,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;CAC7C;AAED,eAAO,MAAM,mBAAmB,GAAI,UAAS,YAAiB,KAAG,oBAS/D,CAAC;AAEH,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const resolveRouteOptions = (options = {}) => ({
2
+ margin: options.margin ?? 24,
3
+ cornerRadius: options.cornerRadius ?? 8,
4
+ bendPenalty: options.bendPenalty ?? 30,
5
+ hugPenalty: options.hugPenalty ?? 6,
6
+ nudgeGap: options.nudgeGap ?? 6,
7
+ regionPad: options.regionPad ?? 200,
8
+ smartObstacleLimit: options.smartObstacleLimit ?? 60,
9
+ previous: options.previous,
10
+ });
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/diagram/routing/types.ts"],"names":[],"mappings":"AA+DA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAwB,EAAE,EAAwB,EAAE,CAAC,CAAC;IACxF,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;IAC5B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC;IACvC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;IACtC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;IACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG;IACnC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,EAAE;IACpD,QAAQ,EAAE,OAAO,CAAC,QAAQ;CAC3B,CAAC,CAAC"}
@@ -1,6 +1,19 @@
1
1
  export declare const SCHEMA_VERSION: 1;
2
- export type DiagramRouting = "orthogonal" | "straight" | "curved";
2
+ export type DiagramRouting = "orthogonal" | "straight" | "curved" | "smart";
3
+ export declare const DIAGRAM_ROUTINGS: readonly DiagramRouting[];
3
4
  export type ArrowType = "none" | "classic" | "classicThin" | "open" | "block" | "diamond" | "oval";
5
+ export declare const ARROW_TYPES: readonly ArrowType[];
6
+ export type HandleSide = "top" | "right" | "bottom" | "left";
7
+ export declare const HANDLE_SIDES: readonly HandleSide[];
8
+ export declare const isHandleSide: (value: unknown) => value is HandleSide;
9
+ export interface Point {
10
+ x: number;
11
+ y: number;
12
+ }
13
+ export interface Size {
14
+ width: number;
15
+ height: number;
16
+ }
4
17
  export type TokenRef = {
5
18
  token: string;
6
19
  } | {
@@ -24,59 +37,55 @@ export interface DiagramStyle {
24
37
  shadow?: boolean;
25
38
  opacity?: number;
26
39
  }
40
+ export interface LegacyAnchor {
41
+ x: number;
42
+ y: number;
43
+ dx?: number;
44
+ dy?: number;
45
+ perimeter?: boolean;
46
+ }
47
+ export interface DiagramCallmanBinding {
48
+ kind: "request" | "scenario" | "connection" | "environment" | "mock" | "kafkaTopic";
49
+ id: string;
50
+ workspaceId?: string;
51
+ name?: string;
52
+ }
27
53
  export interface DiagramNode {
28
54
  id: string;
29
55
  type: string;
30
- position: {
31
- x: number;
32
- y: number;
33
- };
34
- size: {
35
- width: number;
36
- height: number;
37
- };
56
+ position: Point;
57
+ size: Size;
38
58
  label?: string;
39
59
  rotation?: number;
40
60
  style?: DiagramStyle;
41
- data?: Record<string, unknown>;
61
+ data?: Record<string, unknown> & {
62
+ callman?: DiagramCallmanBinding;
63
+ };
42
64
  parentId?: string;
43
- z?: number;
44
65
  hidden?: boolean;
45
66
  locked?: boolean;
67
+ collapsed?: boolean;
68
+ collapsedSize?: Size;
69
+ /** @deprecated never read or written — array order IS the z-order. Stripped by normalizeDocument. */
70
+ z?: number;
46
71
  }
47
72
  export interface DiagramEdge {
48
73
  id: string;
49
74
  source?: string;
50
75
  target?: string;
51
- sourcePoint?: {
52
- x: number;
53
- y: number;
54
- };
55
- targetPoint?: {
56
- x: number;
57
- y: number;
58
- };
59
- sourceAnchor?: {
60
- x: number;
61
- y: number;
62
- dx?: number;
63
- dy?: number;
64
- perimeter?: boolean;
65
- };
66
- targetAnchor?: {
67
- x: number;
68
- y: number;
69
- dx?: number;
70
- dy?: number;
71
- perimeter?: boolean;
72
- };
76
+ sourcePoint?: Point;
77
+ targetPoint?: Point;
78
+ sourceAnchor?: LegacyAnchor;
79
+ targetAnchor?: LegacyAnchor;
80
+ sourceHandle?: HandleSide;
81
+ targetHandle?: HandleSide;
73
82
  label?: string;
83
+ labelPosition?: number;
84
+ labelOffset?: Point;
74
85
  routing?: DiagramRouting;
75
86
  style?: DiagramStyle;
76
- waypoints?: Array<{
77
- x: number;
78
- y: number;
79
- }>;
87
+ waypoints?: Point[];
88
+ data?: Record<string, unknown>;
80
89
  markerStart?: ArrowType;
81
90
  markerEnd?: ArrowType;
82
91
  }
@@ -85,10 +94,33 @@ export interface DiagramMeta {
85
94
  createdAt: string;
86
95
  updatedAt: string;
87
96
  appVersion?: string;
97
+ revision?: number;
88
98
  }
99
+ export type LayoutAlgorithm = "layered" | "tree" | "organic" | "radial" | "force";
100
+ export type LayoutDirection = "DOWN" | "RIGHT" | "UP" | "LEFT";
101
+ export declare const LAYOUT_DIRECTIONS: readonly LayoutDirection[];
89
102
  export interface DiagramCanvasState {
90
103
  background?: "grid" | "dots" | "blank";
91
104
  gridSize?: number;
105
+ viewport?: {
106
+ x: number;
107
+ y: number;
108
+ zoom: number;
109
+ };
110
+ layout?: {
111
+ algorithm: LayoutAlgorithm;
112
+ direction: LayoutDirection;
113
+ };
114
+ defaultRouting?: DiagramRouting;
115
+ }
116
+ export type DiagramSourceFormat = "mermaid" | "bpmn";
117
+ export interface DiagramSource {
118
+ format: DiagramSourceFormat;
119
+ text: string;
120
+ diagramType: string;
121
+ grammar?: string;
122
+ hash?: string;
123
+ valid?: boolean;
92
124
  }
93
125
  export interface DiagramDocument {
94
126
  schemaVersion: number;
@@ -97,6 +129,7 @@ export interface DiagramDocument {
97
129
  canvas?: DiagramCanvasState;
98
130
  nodes: DiagramNode[];
99
131
  edges: DiagramEdge[];
132
+ source?: DiagramSource;
100
133
  }
101
134
  export declare const nowIso: () => string;
102
135
  export declare const genId: (prefix?: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/diagram/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/diagram/schema.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,23 @@
1
1
  // The diagram DSL — the single source of truth for a diagram. A plain,
2
- // versioned, git-diffable JSON model that is independent of any renderer
3
- // (maxGraph in the desktop is just an editor of this document). AI generation,
4
- // the MCP server and DB persistence produce/consume exactly this shape.
2
+ // versioned, git-diffable JSON model that is independent of any renderer.
3
+ // AI generation, the MCP server, DB persistence and the desktop editor all
4
+ // produce/consume exactly this shape, and every EDIT — from the canvas, from
5
+ // an AI reply, from an MCP tool — is an operation on it (see ops.ts).
6
+ //
7
+ // Versioning policy: `schemaVersion` stays 1 while the shape only GROWS
8
+ // (optional fields). Every reader ignores keys it does not know, so a newer
9
+ // document still opens in an older host; a breaking change bumps the version
10
+ // and registers a step in migrations.ts. The additive fields of the rebuilt
11
+ // studio are marked "(1.29)" below.
5
12
  //
6
- // Moved here from the desktop so every host validates with ONE validator.
7
13
  // zod is intentionally NOT used: the hand validator keeps the module
8
14
  // dependency-free and CSP-safe (it runs in the Electron renderer).
9
15
  export const SCHEMA_VERSION = 1;
16
+ export const DIAGRAM_ROUTINGS = ["orthogonal", "straight", "curved", "smart"];
17
+ export const ARROW_TYPES = ["none", "classic", "classicThin", "open", "block", "diamond", "oval"];
18
+ export const HANDLE_SIDES = ["top", "right", "bottom", "left"];
19
+ export const isHandleSide = (value) => typeof value === "string" && HANDLE_SIDES.includes(value);
20
+ export const LAYOUT_DIRECTIONS = ["DOWN", "RIGHT", "UP", "LEFT"];
10
21
  // --- id + time helpers -----------------------------------------------------
11
22
  export const nowIso = () => new Date().toISOString();
12
23
  const randomBytes = (length) => {
@@ -55,6 +66,8 @@ export class DiagramValidationError extends Error {
55
66
  const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
56
67
  const isNum = (v) => typeof v === "number" && Number.isFinite(v);
57
68
  const isStr = (v) => typeof v === "string";
69
+ const isPoint = (v) => isObject(v) && isNum(v.x) && isNum(v.y);
70
+ const isSize = (v) => isObject(v) && isNum(v.width) && isNum(v.height);
58
71
  const validateNode = (n, i, errors) => {
59
72
  if (!isObject(n))
60
73
  return void errors.push(`nodes[${i}] is not an object`);
@@ -62,12 +75,15 @@ const validateNode = (n, i, errors) => {
62
75
  errors.push(`nodes[${i}].id must be a string`);
63
76
  if (!isStr(n.type))
64
77
  errors.push(`nodes[${i}].type must be a string`);
65
- if (!isObject(n.position) || !isNum(n.position.x) || !isNum(n.position.y))
78
+ if (!isPoint(n.position))
66
79
  errors.push(`nodes[${i}].position must be { x:number, y:number }`);
67
- if (!isObject(n.size) || !isNum(n.size.width) || !isNum(n.size.height))
80
+ if (!isSize(n.size))
68
81
  errors.push(`nodes[${i}].size must be { width:number, height:number }`);
82
+ if (n.collapsedSize !== undefined && !isSize(n.collapsedSize))
83
+ errors.push(`nodes[${i}].collapsedSize must be { width:number, height:number }`);
84
+ if (n.parentId !== undefined && !isStr(n.parentId))
85
+ errors.push(`nodes[${i}].parentId must be a string`);
69
86
  };
70
- const isPoint = (v) => isObject(v) && isNum(v.x) && isNum(v.y);
71
87
  const validateEdge = (e, i, ids, errors) => {
72
88
  if (!isObject(e))
73
89
  return void errors.push(`edges[${i}] is not an object`);
@@ -93,6 +109,42 @@ const validateEdge = (e, i, ids, errors) => {
93
109
  else if (!isPoint(e.targetPoint)) {
94
110
  errors.push(`edges[${i}] needs a target id or a targetPoint { x, y }`);
95
111
  }
112
+ if (e.sourceHandle !== undefined && !isHandleSide(e.sourceHandle))
113
+ errors.push(`edges[${i}].sourceHandle must be one of ${HANDLE_SIDES.join(", ")}`);
114
+ if (e.targetHandle !== undefined && !isHandleSide(e.targetHandle))
115
+ errors.push(`edges[${i}].targetHandle must be one of ${HANDLE_SIDES.join(", ")}`);
116
+ if (e.routing !== undefined && !DIAGRAM_ROUTINGS.includes(e.routing))
117
+ errors.push(`edges[${i}].routing must be one of ${DIAGRAM_ROUTINGS.join(", ")}`);
118
+ if (e.labelPosition !== undefined && !isNum(e.labelPosition))
119
+ errors.push(`edges[${i}].labelPosition must be a number`);
120
+ if (e.labelOffset !== undefined && !isPoint(e.labelOffset))
121
+ errors.push(`edges[${i}].labelOffset must be { x:number, y:number }`);
122
+ if (e.waypoints !== undefined && (!Array.isArray(e.waypoints) || !e.waypoints.every(isPoint)))
123
+ errors.push(`edges[${i}].waypoints must be an array of { x:number, y:number }`);
124
+ };
125
+ const validateCanvas = (c, errors) => {
126
+ if (c === undefined)
127
+ return;
128
+ if (!isObject(c))
129
+ return void errors.push("canvas must be an object");
130
+ if (c.viewport !== undefined && !(isObject(c.viewport) && isNum(c.viewport.x) && isNum(c.viewport.y) && isNum(c.viewport.zoom)))
131
+ errors.push("canvas.viewport must be { x, y, zoom } numbers");
132
+ if (c.defaultRouting !== undefined && !DIAGRAM_ROUTINGS.includes(c.defaultRouting))
133
+ errors.push(`canvas.defaultRouting must be one of ${DIAGRAM_ROUTINGS.join(", ")}`);
134
+ if (c.layout !== undefined && !(isObject(c.layout) && isStr(c.layout.algorithm) && isStr(c.layout.direction)))
135
+ errors.push("canvas.layout must be { algorithm, direction }");
136
+ };
137
+ const validateSource = (s, errors) => {
138
+ if (s === undefined)
139
+ return;
140
+ if (!isObject(s))
141
+ return void errors.push("source must be an object");
142
+ if (s.format !== "mermaid" && s.format !== "bpmn")
143
+ errors.push('source.format must be "mermaid" or "bpmn"');
144
+ if (!isStr(s.text))
145
+ errors.push("source.text must be a string");
146
+ if (!isStr(s.diagramType))
147
+ errors.push("source.diagramType must be a string");
96
148
  };
97
149
  export const safeParseDiagramDocument = (input) => {
98
150
  const errors = [];
@@ -113,7 +165,7 @@ export const safeParseDiagramDocument = (input) => {
113
165
  const nodes = input.nodes;
114
166
  const edges = input.edges;
115
167
  nodes.forEach((n, i) => validateNode(n, i, errors));
116
- // Valid edge terminals = node ids + edge ids (edges may connect to edges).
168
+ // Valid edge terminals = node ids + edge ids (legacy edges may connect to edges).
117
169
  const terminalIds = new Set();
118
170
  for (const n of nodes)
119
171
  if (isObject(n) && isStr(n.id))
@@ -122,6 +174,8 @@ export const safeParseDiagramDocument = (input) => {
122
174
  if (isObject(e) && isStr(e.id))
123
175
  terminalIds.add(e.id);
124
176
  edges.forEach((e, i) => validateEdge(e, i, terminalIds, errors));
177
+ validateCanvas(input.canvas, errors);
178
+ validateSource(input.source, errors);
125
179
  if (errors.length)
126
180
  return { ok: false, errors };
127
181
  return { ok: true, document: input };