@bendyline/squisq 1.5.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +63 -10
  2. package/dist/{Doc-BBVGq1_9.d.ts → Doc-ylqWKDc_.d.ts} +248 -37
  3. package/dist/{ImageEditDoc-FuyGtt6o.d.ts → ImageEditDoc-D828IXJ1.d.ts} +1 -1
  4. package/dist/annotationCoercion-Dr_DY9Hx.d.ts +86 -0
  5. package/dist/{chunk-T5UK6YOB.js → chunk-2PWOO4ZE.js} +60 -17
  6. package/dist/chunk-2PWOO4ZE.js.map +1 -0
  7. package/dist/{chunk-VWUFZ6ZG.js → chunk-3E5F2XMR.js} +2 -29
  8. package/dist/chunk-3E5F2XMR.js.map +1 -0
  9. package/dist/chunk-4X3JQXNM.js +35 -0
  10. package/dist/chunk-4X3JQXNM.js.map +1 -0
  11. package/dist/{chunk-P3K7NLHF.js → chunk-5DKBFXPY.js} +31 -121
  12. package/dist/chunk-5DKBFXPY.js.map +1 -0
  13. package/dist/{chunk-DLXZMS5K.js → chunk-5J4HKRJF.js} +51 -3
  14. package/dist/chunk-5J4HKRJF.js.map +1 -0
  15. package/dist/chunk-5UYI3RJB.js +2503 -0
  16. package/dist/chunk-5UYI3RJB.js.map +1 -0
  17. package/dist/{chunk-BEQODJWV.js → chunk-66QO7XFB.js} +11 -291
  18. package/dist/chunk-66QO7XFB.js.map +1 -0
  19. package/dist/{chunk-HWVFJAAH.js → chunk-AMIR72JP.js} +28 -10
  20. package/dist/chunk-AMIR72JP.js.map +1 -0
  21. package/dist/chunk-CY2R2VPR.js +884 -0
  22. package/dist/chunk-CY2R2VPR.js.map +1 -0
  23. package/dist/chunk-FVJUUTEM.js +74 -0
  24. package/dist/chunk-FVJUUTEM.js.map +1 -0
  25. package/dist/{chunk-Q3ROPT5H.js → chunk-GZY66SDN.js} +1 -1
  26. package/dist/{chunk-Q3ROPT5H.js.map → chunk-GZY66SDN.js.map} +1 -1
  27. package/dist/chunk-JOQYPRDZ.js +127 -0
  28. package/dist/chunk-JOQYPRDZ.js.map +1 -0
  29. package/dist/{chunk-A4O7GIWE.js → chunk-MMPBOUK7.js} +10 -73
  30. package/dist/chunk-MMPBOUK7.js.map +1 -0
  31. package/dist/{chunk-LDQ2HJIX.js → chunk-PXLVXTLW.js} +252 -54
  32. package/dist/chunk-PXLVXTLW.js.map +1 -0
  33. package/dist/{chunk-TQWLI6S2.js → chunk-Q7LROV2H.js} +4 -2
  34. package/dist/{chunk-TQWLI6S2.js.map → chunk-Q7LROV2H.js.map} +1 -1
  35. package/dist/{chunk-GPLTCSXO.js → chunk-R2GC6RLD.js} +7 -7
  36. package/dist/chunk-R2GC6RLD.js.map +1 -0
  37. package/dist/chunk-R2YZTCLO.js +292 -0
  38. package/dist/chunk-R2YZTCLO.js.map +1 -0
  39. package/dist/chunk-S7A5D7ZJ.js +174 -0
  40. package/dist/chunk-S7A5D7ZJ.js.map +1 -0
  41. package/dist/chunk-TFJVXUHH.js +2358 -0
  42. package/dist/chunk-TFJVXUHH.js.map +1 -0
  43. package/dist/{chunk-LTN6I7QW.js → chunk-TUWMK62B.js} +55 -4
  44. package/dist/chunk-TUWMK62B.js.map +1 -0
  45. package/dist/{chunk-IMSCRLLV.js → chunk-VR7UPJ7C.js} +35 -25
  46. package/dist/chunk-VR7UPJ7C.js.map +1 -0
  47. package/dist/{chunk-KKNUBQ6Y.js → chunk-W4O2TX5I.js} +157 -92
  48. package/dist/chunk-W4O2TX5I.js.map +1 -0
  49. package/dist/{chunk-5TYS5V3G.js → chunk-X6DUONGT.js} +4204 -3560
  50. package/dist/chunk-X6DUONGT.js.map +1 -0
  51. package/dist/doc/index.d.ts +2334 -5
  52. package/dist/doc/index.js +127 -33
  53. package/dist/generate/index.d.ts +7 -2
  54. package/dist/generate/index.js +1 -1
  55. package/dist/imageEdit/index.d.ts +9 -6
  56. package/dist/imageEdit/index.js +3 -3
  57. package/dist/index.d.ts +12 -10
  58. package/dist/index.js +246 -80
  59. package/dist/jsonForm/index.d.ts +7 -3
  60. package/dist/jsonForm/index.js +9 -4
  61. package/dist/markdown/index.d.ts +6 -70
  62. package/dist/markdown/index.js +13 -9
  63. package/dist/narration/index.d.ts +618 -0
  64. package/dist/narration/index.js +82 -0
  65. package/dist/recommend/index.d.ts +15 -1
  66. package/dist/recommend/index.js +2 -2
  67. package/dist/schemas/index.d.ts +28 -6
  68. package/dist/schemas/index.js +15 -13
  69. package/dist/spatial/index.d.ts +0 -1
  70. package/dist/spatial/index.js +1 -1
  71. package/dist/storage/index.js +1 -1
  72. package/dist/{themeLibrary-CehcJhzz.d.ts → themeLibrary-RjVgLpUi.d.ts} +10 -11
  73. package/dist/timing/index.js +5 -3
  74. package/dist/transform/index.d.ts +35 -24
  75. package/dist/transform/index.js +9 -10
  76. package/dist/{types-DlAZ7MW4.d.ts → types-BwMPl2CB.d.ts} +1 -1
  77. package/dist/{types-D98li1gV.d.ts → types-C4kiRn_k.d.ts} +3 -1
  78. package/dist/versions/index.d.ts +2 -1
  79. package/dist/versions/index.js +2 -2
  80. package/package.json +6 -6
  81. package/src/__tests__/applyNarrationTiming.test.ts +190 -0
  82. package/src/__tests__/applyRenderStyle.test.ts +3 -3
  83. package/src/__tests__/asciiDiagramBattle.test.ts +246 -0
  84. package/src/__tests__/asciiDiagramDetect.test.ts +162 -0
  85. package/src/__tests__/asciiDiagramMapping.test.ts +38 -0
  86. package/src/__tests__/asciiDiagramParse.test.ts +233 -0
  87. package/src/__tests__/asciiDiagramPipeline.test.ts +273 -0
  88. package/src/__tests__/asciiDiagramRender.test.ts +162 -0
  89. package/src/__tests__/asciiDiagramRepair.test.ts +84 -0
  90. package/src/__tests__/asciiTimelineDetect.test.ts +157 -0
  91. package/src/__tests__/asciiTimelineParse.test.ts +205 -0
  92. package/src/__tests__/asciiTimelinePipeline.test.ts +349 -0
  93. package/src/__tests__/asciiTimelineRender.test.ts +376 -0
  94. package/src/__tests__/attrTokens.test.ts +5 -0
  95. package/src/__tests__/contentContainer.test.ts +43 -0
  96. package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -15
  97. package/src/__tests__/customThemesFrontmatter.test.ts +1 -0
  98. package/src/__tests__/dataTable.test.ts +25 -15
  99. package/src/__tests__/diagramBlock.test.ts +3 -3
  100. package/src/__tests__/diagramText.test.ts +26 -0
  101. package/src/__tests__/docToMarkdownMedia.test.ts +83 -0
  102. package/src/__tests__/drawingBlock.test.ts +3 -3
  103. package/src/__tests__/fixtures/asciiDiagramBattle.ts +512 -0
  104. package/src/__tests__/fixtures/asciiDiagrams.ts +287 -0
  105. package/src/__tests__/fixtures/asciiTimelines.ts +35 -0
  106. package/src/__tests__/fixtures/treeviewFixtures.ts +243 -0
  107. package/src/__tests__/getLayers.test.ts +32 -18
  108. package/src/__tests__/getLayersFallback.test.ts +8 -8
  109. package/src/__tests__/imageEditVersions.test.ts +2 -0
  110. package/src/__tests__/jsonForm.pointer.test.ts +47 -1
  111. package/src/__tests__/layoutBlock.test.ts +3 -3
  112. package/src/__tests__/majorApiTypes.test.ts +18 -0
  113. package/src/__tests__/markdown.test.ts +54 -4
  114. package/src/__tests__/markdownSanitize.test.ts +7 -5
  115. package/src/__tests__/matchFontFamily.test.ts +114 -0
  116. package/src/__tests__/materializeBlockLayers.test.ts +135 -0
  117. package/src/__tests__/materializeTestUtils.ts +17 -0
  118. package/src/__tests__/narrationAlign.test.ts +150 -0
  119. package/src/__tests__/narrationFeatures.test.ts +71 -0
  120. package/src/__tests__/narrationNuclei.test.ts +45 -0
  121. package/src/__tests__/narrationPacing.test.ts +189 -0
  122. package/src/__tests__/narrationScript.test.ts +149 -0
  123. package/src/__tests__/narrationSessionRepro.test.ts +62 -0
  124. package/src/__tests__/narrationSidecar.test.ts +88 -0
  125. package/src/__tests__/narrationSyllables.test.ts +65 -0
  126. package/src/__tests__/narrationTestSignals.ts +167 -0
  127. package/src/__tests__/narrationVad.test.ts +66 -0
  128. package/src/__tests__/resolveDocTheme.test.ts +16 -2
  129. package/src/__tests__/rootExports.test.ts +18 -0
  130. package/src/__tests__/scopedContentContainer.test.ts +20 -0
  131. package/src/__tests__/shapeGeometry.test.ts +12 -0
  132. package/src/__tests__/templateAnnotationParse.test.ts +10 -0
  133. package/src/__tests__/templateInputs.test.ts +69 -0
  134. package/src/__tests__/templateMetadata.test.ts +2 -1
  135. package/src/__tests__/templates.test.ts +143 -17
  136. package/src/__tests__/themeCompile.test.ts +49 -22
  137. package/src/__tests__/transformProvenance.test.ts +160 -0
  138. package/src/__tests__/transformV2.test.ts +40 -14
  139. package/src/__tests__/treeviewBattle.test.ts +76 -0
  140. package/src/__tests__/treeviewDetect.test.ts +168 -0
  141. package/src/__tests__/treeviewParse.test.ts +118 -0
  142. package/src/__tests__/treeviewPipeline.test.ts +183 -0
  143. package/src/__tests__/treeviewRender.test.ts +91 -0
  144. package/src/__tests__/versions.test.ts +44 -0
  145. package/src/doc/applyNarrationTiming.ts +244 -0
  146. package/src/doc/asciiDiagram/chars.ts +210 -0
  147. package/src/doc/asciiDiagram/detect.ts +175 -0
  148. package/src/doc/asciiDiagram/index.ts +38 -0
  149. package/src/doc/asciiDiagram/mapping.ts +225 -0
  150. package/src/doc/asciiDiagram/parse.ts +1095 -0
  151. package/src/doc/asciiDiagram/render.ts +963 -0
  152. package/src/doc/asciiDiagram/repair.ts +400 -0
  153. package/src/doc/asciiDiagram/types.ts +65 -0
  154. package/src/doc/asciiTimeline/detect.ts +138 -0
  155. package/src/doc/asciiTimeline/index.ts +26 -0
  156. package/src/doc/asciiTimeline/mapping.ts +43 -0
  157. package/src/doc/asciiTimeline/parse.ts +870 -0
  158. package/src/doc/asciiTimeline/render.ts +427 -0
  159. package/src/doc/asciiTimeline/types.ts +73 -0
  160. package/src/doc/asciiTimeline/wrappedFlow.ts +427 -0
  161. package/src/doc/audioMapping.ts +60 -46
  162. package/src/doc/customTemplatesFrontmatter.ts +0 -41
  163. package/src/doc/docToMarkdown.ts +70 -2
  164. package/src/doc/index.ts +76 -4
  165. package/src/doc/markdownToDoc.ts +138 -2
  166. package/src/doc/materializeBlockLayers.ts +304 -0
  167. package/src/doc/mediaAnnotations.ts +20 -0
  168. package/src/doc/resolveDocTheme.ts +8 -7
  169. package/src/doc/templateInputs.ts +185 -2
  170. package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +22 -8
  171. package/src/doc/templates/__tests__/listBlock.test.ts +64 -0
  172. package/src/doc/templates/diagramBlock.ts +237 -38
  173. package/src/doc/templates/fallbackBlock.ts +1 -1
  174. package/src/doc/templates/index.ts +134 -279
  175. package/src/doc/templates/inputDescriptors.ts +20 -1
  176. package/src/doc/templates/listBlock.ts +88 -30
  177. package/src/doc/templates/metadata.ts +10 -0
  178. package/src/doc/templates/persistentLayers.ts +12 -126
  179. package/src/doc/templates/registry.ts +88 -0
  180. package/src/doc/templates/templateNames.ts +22 -0
  181. package/src/doc/templates/timelineBlock.ts +613 -0
  182. package/src/doc/templates/treeBlock.ts +131 -0
  183. package/src/doc/treeview/chars.ts +72 -0
  184. package/src/doc/treeview/detect.ts +145 -0
  185. package/src/doc/treeview/index.ts +30 -0
  186. package/src/doc/treeview/mapping.ts +95 -0
  187. package/src/doc/treeview/parse.ts +201 -0
  188. package/src/doc/treeview/render.ts +41 -0
  189. package/src/doc/treeview/types.ts +43 -0
  190. package/src/doc/utils/applyRenderStyle.ts +2 -9
  191. package/src/doc/utils/diagramText.ts +78 -0
  192. package/src/doc/utils/shapeGeometry.ts +67 -5
  193. package/src/doc/validate.ts +1 -1
  194. package/src/generate/templateMapper.ts +7 -0
  195. package/src/imageEdit/export.ts +6 -5
  196. package/src/imageEdit/versionPaths.ts +13 -26
  197. package/src/imageEdit/versions.ts +21 -100
  198. package/src/index.ts +1 -0
  199. package/src/internal/immutable.ts +58 -0
  200. package/src/jsonForm/index.ts +9 -1
  201. package/src/jsonForm/pointer.ts +68 -23
  202. package/src/markdown/attrTokens.ts +7 -5
  203. package/src/markdown/index.ts +1 -0
  204. package/src/markdown/stringify.ts +4 -9
  205. package/src/markdown/utils.ts +36 -14
  206. package/src/narration/align.ts +514 -0
  207. package/src/narration/features.ts +231 -0
  208. package/src/narration/index.ts +86 -0
  209. package/src/narration/nuclei.ts +118 -0
  210. package/src/narration/pacing.ts +211 -0
  211. package/src/narration/script.ts +239 -0
  212. package/src/narration/session.ts +100 -0
  213. package/src/narration/sidecar.ts +187 -0
  214. package/src/narration/syllables.ts +85 -0
  215. package/src/narration/trace.ts +50 -0
  216. package/src/narration/types.ts +299 -0
  217. package/src/narration/vad.ts +131 -0
  218. package/src/recommend/numberHighlight.ts +25 -0
  219. package/src/recommend/templates.ts +108 -12
  220. package/src/schemas/BlockTemplates.ts +156 -7
  221. package/src/schemas/Doc.ts +72 -9
  222. package/src/schemas/Media.ts +12 -2
  223. package/src/schemas/Theme.ts +45 -25
  224. package/src/schemas/Viewport.ts +2 -2
  225. package/src/schemas/fontStacks.ts +79 -0
  226. package/src/schemas/themeCompile.ts +15 -0
  227. package/src/schemas/themeConstants.ts +2 -0
  228. package/src/schemas/themeLibrary.ts +25 -19
  229. package/src/schemas/themeValidator.ts +1 -1
  230. package/src/schemas/themes/gezellig.json +1 -1
  231. package/src/spatial/Geohash.ts +0 -3
  232. package/src/storage/ContentContainer.ts +17 -9
  233. package/src/storage/ScopedContentContainer.ts +45 -15
  234. package/src/transform/applyTransform.ts +5 -5
  235. package/src/transform/index.ts +3 -1
  236. package/src/transform/registry.ts +169 -49
  237. package/src/transform/templateSelector.ts +21 -2
  238. package/src/transform/timingAllocator.ts +152 -21
  239. package/src/transform/types.ts +14 -1
  240. package/src/versions/gitignore.ts +34 -0
  241. package/src/versions/index.ts +2 -0
  242. package/src/versions/operations.ts +18 -104
  243. package/src/versions/paths.ts +13 -28
  244. package/src/versions/snapshotStore.ts +202 -0
  245. package/src/versions/types.ts +3 -1
  246. package/dist/chunk-5TYS5V3G.js.map +0 -1
  247. package/dist/chunk-A4O7GIWE.js.map +0 -1
  248. package/dist/chunk-BEQODJWV.js.map +0 -1
  249. package/dist/chunk-DLXZMS5K.js.map +0 -1
  250. package/dist/chunk-GPLTCSXO.js.map +0 -1
  251. package/dist/chunk-HWVFJAAH.js.map +0 -1
  252. package/dist/chunk-IMSCRLLV.js.map +0 -1
  253. package/dist/chunk-JELIRVDP.js +0 -24
  254. package/dist/chunk-JELIRVDP.js.map +0 -1
  255. package/dist/chunk-KKNUBQ6Y.js.map +0 -1
  256. package/dist/chunk-LDQ2HJIX.js.map +0 -1
  257. package/dist/chunk-LTN6I7QW.js.map +0 -1
  258. package/dist/chunk-P3K7NLHF.js.map +0 -1
  259. package/dist/chunk-T5UK6YOB.js.map +0 -1
  260. package/dist/chunk-UY7KGQ5R.js +0 -192
  261. package/dist/chunk-UY7KGQ5R.js.map +0 -1
  262. package/dist/chunk-VLJJHDAC.js +0 -218
  263. package/dist/chunk-VLJJHDAC.js.map +0 -1
  264. package/dist/chunk-VWUFZ6ZG.js.map +0 -1
  265. package/dist/story/index.d.ts +0 -1801
  266. package/dist/story/index.js +0 -279
  267. package/src/doc/getLayers.ts +0 -195
  268. /package/dist/{story → narration}/index.js.map +0 -0
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Shared ASCII-diagram fixtures for the codec test suites (parse, render
3
+ * fixpoint, detection corpus, pipeline). Positive fixtures are the parse
4
+ * contract; the negative corpus is the detection contract.
5
+ */
6
+
7
+ export const TWO_BOX_VERTICAL = [
8
+ '┌────────┐',
9
+ '│ Alpha │',
10
+ '└───┬────┘',
11
+ ' │',
12
+ ' ▼',
13
+ '┌────────┐',
14
+ '│ Beta │',
15
+ '└────────┘',
16
+ ].join('\n');
17
+
18
+ export const TWO_BOX_VERTICAL_ASCII = [
19
+ '+--------+',
20
+ '| Alpha |',
21
+ '+---+----+',
22
+ ' |',
23
+ ' v',
24
+ '+--------+',
25
+ '| Beta |',
26
+ '+--------+',
27
+ ].join('\n');
28
+
29
+ export const TWO_BOX_HORIZONTAL_ASCII = [
30
+ '+--------+ +--------+',
31
+ '| Input | --> | Output |',
32
+ '+--------+ +--------+',
33
+ ].join('\n');
34
+
35
+ export const TWO_BOX_HORIZONTAL_UNICODE = [
36
+ '┌────────┐ ┌────────┐',
37
+ '│ Input │────►│ Output │',
38
+ '└────────┘ └────────┘',
39
+ ].join('\n');
40
+
41
+ export const UNDIRECTED = [
42
+ '┌────────┐ ┌────────┐',
43
+ '│ Left │─────│ Right │',
44
+ '└────────┘ └────────┘',
45
+ ].join('\n');
46
+
47
+ export const BIDIRECTIONAL = [
48
+ '┌───────┐ ┌───────┐',
49
+ '│ Peer │◄───────►│ Peer │',
50
+ '└───────┘ └───────┘',
51
+ ].join('\n');
52
+
53
+ export const FAN_OUT_COLUMNS = [
54
+ '┌──────────────────────┐',
55
+ '│ Source │',
56
+ '└──────┬───────┬───────┘',
57
+ ' │ │',
58
+ ' ▼ ▼',
59
+ ' ┌─────┐ ┌─────┐',
60
+ ' │ One │ │ Two │',
61
+ ' └─────┘ └─────┘',
62
+ ].join('\n');
63
+
64
+ export const FAN_OUT_BUS = [
65
+ '┌──────────────────────┐',
66
+ '│ Source │',
67
+ '└──────────┬───────────┘',
68
+ ' ┌─────┴─────┐',
69
+ ' ▼ ▼',
70
+ ' ┌─────┐ ┌─────┐',
71
+ ' │ One │ │ Two │',
72
+ ' └─────┘ └─────┘',
73
+ ].join('\n');
74
+
75
+ export const PARALLEL_DUPES = [
76
+ '┌────────────────┐',
77
+ '│ Wide A │',
78
+ '└──┬──────────┬──┘',
79
+ ' │ │',
80
+ ' ▼ ▼',
81
+ '┌────────────────┐',
82
+ '│ Wide B │',
83
+ '└────────────────┘',
84
+ ].join('\n');
85
+
86
+ /** The canonical AI-style nested diagram: container + 2×3 children + column edges. */
87
+ export const NESTED_CONTAINER = [
88
+ '┌────────────────────────────────────────────────┐',
89
+ '│ Data Pipeline │',
90
+ '│ │',
91
+ '│ ┌────────┐ ┌─────────┐ ┌────────┐ │',
92
+ '│ │ Ingest │ │ Enrich │ │ Export │ │',
93
+ '│ └───┬────┘ └────┬────┘ └───┬────┘ │',
94
+ '│ │ │ │ │',
95
+ '│ ▼ ▼ ▼ │',
96
+ '│ ┌────────┐ ┌─────────┐ ┌────────┐ │',
97
+ '│ │ Raw │ │ Silver │ │ Gold │ │',
98
+ '│ └────────┘ └─────────┘ └────────┘ │',
99
+ '└────────────────────────────────────────────────┘',
100
+ ].join('\n');
101
+
102
+ export const CONTAINER_EMBEDDED_TITLE = [
103
+ '┌─── Cluster ────┐',
104
+ '│ ┌──────────┐ │',
105
+ '│ │ Worker │ │',
106
+ '│ └──────────┘ │',
107
+ '└────────────────┘',
108
+ ].join('\n');
109
+
110
+ export const MULTILINE_LABELS = [
111
+ '┌──────────────┐ ┌──────────────┐',
112
+ '│ molen-kernel │ │ molen-client │',
113
+ '│ headless sim │ │ three.js │',
114
+ '│ no DOM │ │ cameras │',
115
+ '└──────┬───────┘ └──────────────┘',
116
+ ' │',
117
+ ' ▼',
118
+ '┌──────────────┐',
119
+ '│ Worker │',
120
+ '└──────────────┘',
121
+ ].join('\n');
122
+
123
+ /** `├──┤` interior dividers are indistinguishable from stacked shared-border boxes → two nodes. */
124
+ export const SECTIONED_CARD = [
125
+ '┌──────────┐',
126
+ '│ Header │',
127
+ '├──────────┤',
128
+ '│ Body │',
129
+ '└──────────┘',
130
+ ].join('\n');
131
+
132
+ export const STACKED_SHARED_BORDER_ASCII = [
133
+ '+-------+',
134
+ '| Upper |',
135
+ '+-------+',
136
+ '| Lower |',
137
+ '+-------+',
138
+ ].join('\n');
139
+
140
+ export const EDGE_LABEL = [
141
+ '┌────────┐ ┌────────┐',
142
+ '│ Client │──auth──────►│ Server │',
143
+ '└────────┘ └────────┘',
144
+ ].join('\n');
145
+
146
+ export const EDGE_LABEL_SPACED = [
147
+ '┌────────┐ ┌────────┐',
148
+ '│ Client │── auth flow ─►│ Server │',
149
+ '└────────┘ └────────┘',
150
+ ].join('\n');
151
+
152
+ export const DUPLICATE_LABELS = [
153
+ '┌───────┐ ┌───────┐',
154
+ '│ Cache │ │ Cache │',
155
+ '└───────┘ └───────┘',
156
+ ].join('\n');
157
+
158
+ export const ROUNDED_AND_DOUBLE = [
159
+ '╭────────╮ ╔════════╗',
160
+ '│ Round │ ║ Double ║',
161
+ '╰────────╯ ╚════════╝',
162
+ ].join('\n');
163
+
164
+ export const SINGLE_BOX = ['┌────────┐', '│ Alone │', '└────────┘'].join('\n');
165
+
166
+ /** Every positive fixture the fixpoint suite must survive. */
167
+ export const POSITIVE_FIXTURES: Record<string, string> = {
168
+ TWO_BOX_VERTICAL,
169
+ TWO_BOX_VERTICAL_ASCII,
170
+ TWO_BOX_HORIZONTAL_ASCII,
171
+ TWO_BOX_HORIZONTAL_UNICODE,
172
+ UNDIRECTED,
173
+ BIDIRECTIONAL,
174
+ FAN_OUT_COLUMNS,
175
+ FAN_OUT_BUS,
176
+ PARALLEL_DUPES,
177
+ NESTED_CONTAINER,
178
+ CONTAINER_EMBEDDED_TITLE,
179
+ MULTILINE_LABELS,
180
+ SECTIONED_CARD,
181
+ STACKED_SHARED_BORDER_ASCII,
182
+ EDGE_LABEL,
183
+ EDGE_LABEL_SPACED,
184
+ DUPLICATE_LABELS,
185
+ ROUNDED_AND_DOUBLE,
186
+ };
187
+
188
+ // ---------------------------------------------------------------------------
189
+ // Negative corpus — all of these must be REJECTED by detectAsciiDiagram.
190
+ // ---------------------------------------------------------------------------
191
+
192
+ export const NEG_MARKDOWN_TABLE = [
193
+ '| Name | Role |',
194
+ '|-------|----------|',
195
+ '| Ada | Engineer |',
196
+ '| Grace | Admiral |',
197
+ ].join('\n');
198
+
199
+ export const NEG_PSQL_TABLE = [
200
+ '+----+-------+',
201
+ '| id | name |',
202
+ '+----+-------+',
203
+ '| 1 | Alice |',
204
+ '+----+-------+',
205
+ '| 2 | Bob |',
206
+ '+----+-------+',
207
+ ].join('\n');
208
+
209
+ export const NEG_MYSQL_TABLE = [
210
+ '+----------+----------+---------+',
211
+ '| Database | Table | Rows |',
212
+ '+----------+----------+---------+',
213
+ '| app | users | 1042 |',
214
+ '| app | sessions | 98213 |',
215
+ '+----------+----------+---------+',
216
+ ].join('\n');
217
+
218
+ export const NEG_SHELL_PIPES = [
219
+ 'cat access.log | grep 500 | awk "{print $7}" | sort | uniq -c',
220
+ 'ps aux | head -20',
221
+ 'docker ps -a | wc -l',
222
+ ].join('\n');
223
+
224
+ export const NEG_TS_UNION = [
225
+ 'type Result<T> =',
226
+ ' | { ok: true; value: T }',
227
+ ' | { ok: false; error: Error };',
228
+ 'const x: A | B | C = pick();',
229
+ ].join('\n');
230
+
231
+ export const NEG_SQL_DDL = [
232
+ 'CREATE TABLE users (',
233
+ ' id INTEGER PRIMARY KEY,',
234
+ ' name TEXT NOT NULL,',
235
+ ' created_at TIMESTAMP',
236
+ ');',
237
+ ].join('\n');
238
+
239
+ export const NEG_FILE_TREE = [
240
+ 'src/',
241
+ '├── components/',
242
+ '│ ├── App.tsx',
243
+ '│ └── Button.tsx',
244
+ '└── utils/',
245
+ ' └── math.ts',
246
+ ].join('\n');
247
+
248
+ export const NEG_YAML = [
249
+ 'services:',
250
+ ' web:',
251
+ ' image: nginx',
252
+ ' ports:',
253
+ ' - "80:80"',
254
+ ].join('\n');
255
+
256
+ export const NEG_LOG_COLUMNS = [
257
+ '2026-01-01 │ INFO │ started',
258
+ '2026-01-02 │ WARN │ disk low',
259
+ '2026-01-03 │ ERROR │ crashed',
260
+ ].join('\n');
261
+
262
+ export const NEG_PROSE_HEAVY = [
263
+ 'This paragraph explains the architecture in detail before showing it.',
264
+ 'There is a great deal of text here that is not part of any box at all,',
265
+ 'and the actual diagram below is a small part of the overall content.',
266
+ 'More prose lines continue to pad this out considerably, adding noise',
267
+ 'that should push the loose-content ratio well past the threshold.',
268
+ '┌───┐ ┌───┐',
269
+ '│ A │ │ B │',
270
+ '└───┘ └───┘',
271
+ 'And afterwards even more explanation text follows the tiny diagram,',
272
+ 'ensuring that the fence is mostly prose rather than mostly diagram.',
273
+ ].join('\n');
274
+
275
+ export const NEGATIVE_FIXTURES: Record<string, string> = {
276
+ NEG_MARKDOWN_TABLE,
277
+ NEG_PSQL_TABLE,
278
+ NEG_MYSQL_TABLE,
279
+ NEG_SHELL_PIPES,
280
+ NEG_TS_UNION,
281
+ NEG_SQL_DDL,
282
+ NEG_FILE_TREE,
283
+ NEG_YAML,
284
+ NEG_LOG_COLUMNS,
285
+ NEG_PROSE_HEAVY,
286
+ SINGLE_BOX,
287
+ };
@@ -0,0 +1,35 @@
1
+ /** The motivating timeline from the feature request, byte-for-byte inside its fence. */
2
+ export const TICK_INTERPOLATION_TIMELINE = ` kernel ticks (30 Hz): T28 T29 T30 T31
3
+ ─────────────────────●──────────●──────────●──────────●──────────► sim time
4
+ deltas sent: └─Δ28──────└─Δ29──────└─Δ30──────└─Δ31
5
+
6
+ client frames (e.g. 120 Hz): f f f f f f f f f f f f f f f f
7
+ estimated kernel clock: ▲ estTick ≈ 30.4
8
+ render position: ▲ renderTick = estTick − 1.5 ≈ 28.9
9
+ └─ interpolate between snapshot T28 and T29 at t=0.9`;
10
+
11
+ /** Two independently labelled tracks plus an explicit cross-track branch. */
12
+ export const MULTI_TRACK_BRANCH_TIMELINE = [
13
+ 'Kernel: ● T28 :: snapshot {#t28} ──────────● T29 :: snapshot {#t29} ──────────►',
14
+ 'Client: ● F28 :: snapshot {#f28} ──────────● F29 :: snapshot {#f29} ──────────►',
15
+ 'branch: t29 -> f29 : interpolation path',
16
+ ].join('\n');
17
+
18
+ /** Sparse ASCII form: only an explicit `timeline` fence should claim it. */
19
+ export const SINGLE_POINT_ASCII_TIMELINE = 'Release: *---- Alpha {#alpha} ---->';
20
+
21
+ /** Multi-lane AI-authored flow with a right-edge error return. */
22
+ export const WRAPPED_CLIENT_KERNEL_TIMELINE = ` CLIENT (main thread) KERNEL (Web Worker / Node)
23
+ ──────────────────── ──────────────────────────
24
+ input events ──► InputMap ──► command ───────► validate (schema)
25
+ ├─ invalid → command-rejected event ─┐
26
+ └─ valid → queue at tick T │
27
+
28
+ tick T: phases │
29
+ commands → update → physics → late │
30
+
31
+ interpolation buffer ◄── delta {tick T} ◄────── dirty-tracked per-tick delta │
32
+ (render ~1.5 ticks │
33
+ behind, lerp/slerp) ◄── keyframe ◄─────────── every 60 ticks + on demand │
34
+
35
+ error surfaced to user/agent ◄───────────────────────────────────────────────────────┘`;
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Battle-test corpus for the ASCII treeview codec: a broad set of AI-style
3
+ * trees (project scaffolds, monorepos, dependency trees, category/decision
4
+ * outlines, forests) with their intended flat semantics. Every fixture is
5
+ * verified to detect + parse to exactly this shape + round-trip byte-stably.
6
+ *
7
+ * GENERATED by scratchpad/gen-tree-fixtures.mjs — edit there and re-run.
8
+ */
9
+
10
+ export interface TreeFixture {
11
+ name: string;
12
+ category: string;
13
+ art: string;
14
+ /** Flat "depth:label[ #comment]" lines, depth-first. */
15
+ expect: string[];
16
+ }
17
+
18
+ export const TREE_FIXTURES: TreeFixture[] = [
19
+ {
20
+ name: 'reactApp',
21
+ category: 'scaffold',
22
+ art: `my-app/
23
+ ├── public/
24
+ │ └── index.html
25
+ ├── src/
26
+ │ ├── App.tsx
27
+ │ ├── index.tsx
28
+ │ └── components/
29
+ │ ├── Header.tsx
30
+ │ └── Footer.tsx
31
+ ├── package.json
32
+ └── tsconfig.json`,
33
+ expect: [
34
+ '0:my-app/',
35
+ '1:public/',
36
+ '2:index.html',
37
+ '1:src/',
38
+ '2:App.tsx',
39
+ '2:index.tsx',
40
+ '2:components/',
41
+ '3:Header.tsx',
42
+ '3:Footer.tsx',
43
+ '1:package.json',
44
+ '1:tsconfig.json',
45
+ ],
46
+ },
47
+ {
48
+ name: 'pythonPkg',
49
+ category: 'scaffold',
50
+ art: `mypackage/
51
+ ├── __init__.py
52
+ ├── core.py
53
+ ├── utils/
54
+ │ ├── __init__.py
55
+ │ └── helpers.py
56
+ └── tests/
57
+ └── test_core.py`,
58
+ expect: [
59
+ '0:mypackage/',
60
+ '1:__init__.py',
61
+ '1:core.py',
62
+ '1:utils/',
63
+ '2:__init__.py',
64
+ '2:helpers.py',
65
+ '1:tests/',
66
+ '2:test_core.py',
67
+ ],
68
+ },
69
+ {
70
+ name: 'monorepo',
71
+ category: 'scaffold',
72
+ art: `workspace/
73
+ ├── packages/
74
+ │ ├── core/
75
+ │ ├── ui/
76
+ │ └── cli/
77
+ ├── apps/
78
+ │ └── web/
79
+ └── package.json`,
80
+ expect: [
81
+ '0:workspace/',
82
+ '1:packages/',
83
+ '2:core/',
84
+ '2:ui/',
85
+ '2:cli/',
86
+ '1:apps/',
87
+ '2:web/',
88
+ '1:package.json',
89
+ ],
90
+ },
91
+ {
92
+ name: 'asciiStyle',
93
+ category: 'style',
94
+ art: `docs/
95
+ |-- guide.md
96
+ |-- api/
97
+ | |-- rest.md
98
+ | \`-- graphql.md
99
+ \`-- README.md`,
100
+ expect: ['0:docs/', '1:guide.md', '1:api/', '2:rest.md', '2:graphql.md', '1:README.md'],
101
+ },
102
+ {
103
+ name: 'plusStyle',
104
+ category: 'style',
105
+ art: `root
106
+ +-- moduleA
107
+ | +-- fileA1
108
+ | +-- fileA2
109
+ +-- moduleB
110
+ +-- fileB1`,
111
+ expect: ['0:root', '1:moduleA', '2:fileA1', '2:fileA2', '1:moduleB', '2:fileB1'],
112
+ },
113
+ {
114
+ name: 'withComments',
115
+ category: 'comments',
116
+ art: `service/
117
+ ├── main.go # entrypoint
118
+ ├── config.yaml # runtime config
119
+ ├── handlers/ # HTTP handlers
120
+ │ └── users.go
121
+ └── go.mod`,
122
+ expect: [
123
+ '0:service/',
124
+ '1:main.go #entrypoint',
125
+ '1:config.yaml #runtime config',
126
+ '1:handlers/ #HTTP handlers',
127
+ '2:users.go',
128
+ '1:go.mod',
129
+ ],
130
+ },
131
+ {
132
+ name: 'depTree',
133
+ category: 'outline',
134
+ art: `express@4.18.2
135
+ ├── body-parser@1.20.1
136
+ │ ├── bytes@3.1.2
137
+ │ └── qs@6.11.0
138
+ ├── cookie@0.5.0
139
+ └── debug@2.6.9
140
+ └── ms@2.0.0`,
141
+ expect: [
142
+ '0:express@4.18.2',
143
+ '1:body-parser@1.20.1',
144
+ '2:bytes@3.1.2',
145
+ '2:qs@6.11.0',
146
+ '1:cookie@0.5.0',
147
+ '1:debug@2.6.9',
148
+ '2:ms@2.0.0',
149
+ ],
150
+ },
151
+ {
152
+ name: 'categoryOutline',
153
+ category: 'outline',
154
+ art: `Animals
155
+ ├── Mammals
156
+ │ ├── Dogs
157
+ │ └── Cats
158
+ ├── Birds
159
+ │ ├── Eagles
160
+ │ └── Sparrows
161
+ └── Reptiles
162
+ └── Snakes`,
163
+ expect: [
164
+ '0:Animals',
165
+ '1:Mammals',
166
+ '2:Dogs',
167
+ '2:Cats',
168
+ '1:Birds',
169
+ '2:Eagles',
170
+ '2:Sparrows',
171
+ '1:Reptiles',
172
+ '2:Snakes',
173
+ ],
174
+ },
175
+ {
176
+ name: 'decisionOutline',
177
+ category: 'outline',
178
+ art: `Deploy?
179
+ ├── Tests pass
180
+ │ ├── Deploy to staging
181
+ │ └── Run smoke tests
182
+ └── Tests fail
183
+ └── Notify team`,
184
+ expect: [
185
+ '0:Deploy?',
186
+ '1:Tests pass',
187
+ '2:Deploy to staging',
188
+ '2:Run smoke tests',
189
+ '1:Tests fail',
190
+ '2:Notify team',
191
+ ],
192
+ },
193
+ {
194
+ name: 'forest',
195
+ category: 'shape',
196
+ art: `frontend/
197
+ ├── index.html
198
+ └── app.js
199
+ backend/
200
+ ├── server.py
201
+ └── models.py
202
+ shared/
203
+ └── types.ts`,
204
+ expect: [
205
+ '0:frontend/',
206
+ '1:index.html',
207
+ '1:app.js',
208
+ '0:backend/',
209
+ '1:server.py',
210
+ '1:models.py',
211
+ '0:shared/',
212
+ '1:types.ts',
213
+ ],
214
+ },
215
+ {
216
+ name: 'deepChain',
217
+ category: 'shape',
218
+ art: `a/
219
+ └── b/
220
+ └── c/
221
+ └── d/
222
+ └── e.txt`,
223
+ expect: ['0:a/', '1:b/', '2:c/', '3:d/', '4:e.txt'],
224
+ },
225
+ {
226
+ name: 'wideFlat',
227
+ category: 'shape',
228
+ art: `config/
229
+ ├── dev.json
230
+ ├── staging.json
231
+ ├── prod.json
232
+ ├── test.json
233
+ └── local.json`,
234
+ expect: [
235
+ '0:config/',
236
+ '1:dev.json',
237
+ '1:staging.json',
238
+ '1:prod.json',
239
+ '1:test.json',
240
+ '1:local.json',
241
+ ],
242
+ },
243
+ ];