@inhuman.tools/quickdraw 0.0.0-bootstrap.0 → 0.2.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 (522) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +102 -1
  3. package/aurora.vert +168 -0
  4. package/dist/bench/host.d.ts +62 -0
  5. package/dist/bench/host.d.ts.map +1 -0
  6. package/dist/bench/host.js +77 -0
  7. package/dist/bench/host.js.map +1 -0
  8. package/dist/bench/main.d.ts +6 -0
  9. package/dist/bench/main.d.ts.map +1 -0
  10. package/dist/bench/main.js +118 -0
  11. package/dist/bench/main.js.map +1 -0
  12. package/dist/bench/model.d.ts +36 -0
  13. package/dist/bench/model.d.ts.map +1 -0
  14. package/dist/bench/model.js +112 -0
  15. package/dist/bench/model.js.map +1 -0
  16. package/dist/bench/tea.d.ts +14 -0
  17. package/dist/bench/tea.d.ts.map +1 -0
  18. package/dist/bench/tea.js +6 -0
  19. package/dist/bench/tea.js.map +1 -0
  20. package/dist/bench/view.d.ts +9 -0
  21. package/dist/bench/view.d.ts.map +1 -0
  22. package/dist/bench/view.js +88 -0
  23. package/dist/bench/view.js.map +1 -0
  24. package/dist/bench/worker.d.ts +6 -0
  25. package/dist/bench/worker.d.ts.map +1 -0
  26. package/dist/bench/worker.js +46 -0
  27. package/dist/bench/worker.js.map +1 -0
  28. package/dist/buffer/bgfx-mark.d.ts +32 -0
  29. package/dist/buffer/bgfx-mark.d.ts.map +1 -0
  30. package/dist/buffer/bgfx-mark.js +43 -0
  31. package/dist/buffer/bgfx-mark.js.map +1 -0
  32. package/dist/buffer/index.d.ts +191 -0
  33. package/dist/buffer/index.d.ts.map +1 -0
  34. package/dist/buffer/index.js +353 -0
  35. package/dist/buffer/index.js.map +1 -0
  36. package/dist/capabilities/env.d.ts +23 -0
  37. package/dist/capabilities/env.d.ts.map +1 -0
  38. package/dist/capabilities/env.js +35 -0
  39. package/dist/capabilities/env.js.map +1 -0
  40. package/dist/capabilities/index.d.ts +13 -0
  41. package/dist/capabilities/index.d.ts.map +1 -0
  42. package/dist/capabilities/index.js +13 -0
  43. package/dist/capabilities/index.js.map +1 -0
  44. package/dist/capabilities/parse.d.ts +41 -0
  45. package/dist/capabilities/parse.d.ts.map +1 -0
  46. package/dist/capabilities/parse.js +86 -0
  47. package/dist/capabilities/parse.js.map +1 -0
  48. package/dist/capabilities/probe.d.ts +37 -0
  49. package/dist/capabilities/probe.d.ts.map +1 -0
  50. package/dist/capabilities/probe.js +75 -0
  51. package/dist/capabilities/probe.js.map +1 -0
  52. package/dist/capabilities/sequences.d.ts +33 -0
  53. package/dist/capabilities/sequences.d.ts.map +1 -0
  54. package/dist/capabilities/sequences.js +36 -0
  55. package/dist/capabilities/sequences.js.map +1 -0
  56. package/dist/capabilities/types.d.ts +25 -0
  57. package/dist/capabilities/types.d.ts.map +1 -0
  58. package/dist/capabilities/types.js +5 -0
  59. package/dist/capabilities/types.js.map +1 -0
  60. package/dist/index.d.ts +11 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +11 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/input/decode.d.ts +167 -0
  65. package/dist/input/decode.d.ts.map +1 -0
  66. package/dist/input/decode.js +825 -0
  67. package/dist/input/decode.js.map +1 -0
  68. package/dist/input/draft.d.ts +85 -0
  69. package/dist/input/draft.d.ts.map +1 -0
  70. package/dist/input/draft.js +276 -0
  71. package/dist/input/draft.js.map +1 -0
  72. package/dist/input/index.d.ts +3 -0
  73. package/dist/input/index.d.ts.map +1 -0
  74. package/dist/input/index.js +3 -0
  75. package/dist/input/index.js.map +1 -0
  76. package/dist/input/prompt-blocks.d.ts +58 -0
  77. package/dist/input/prompt-blocks.d.ts.map +1 -0
  78. package/dist/input/prompt-blocks.js +48 -0
  79. package/dist/input/prompt-blocks.js.map +1 -0
  80. package/dist/input/rich-draft.d.ts +46 -0
  81. package/dist/input/rich-draft.d.ts.map +1 -0
  82. package/dist/input/rich-draft.js +391 -0
  83. package/dist/input/rich-draft.js.map +1 -0
  84. package/dist/input/rich-hit.d.ts +17 -0
  85. package/dist/input/rich-hit.d.ts.map +1 -0
  86. package/dist/input/rich-hit.js +89 -0
  87. package/dist/input/rich-hit.js.map +1 -0
  88. package/dist/input/rich-intake.d.ts +16 -0
  89. package/dist/input/rich-intake.d.ts.map +1 -0
  90. package/dist/input/rich-intake.js +22 -0
  91. package/dist/input/rich-intake.js.map +1 -0
  92. package/dist/input/rich-paint.d.ts +13 -0
  93. package/dist/input/rich-paint.d.ts.map +1 -0
  94. package/dist/input/rich-paint.js +18 -0
  95. package/dist/input/rich-paint.js.map +1 -0
  96. package/dist/internals/bgfx/index.d.ts +17 -0
  97. package/dist/internals/bgfx/index.d.ts.map +1 -0
  98. package/dist/internals/bgfx/index.js +17 -0
  99. package/dist/internals/bgfx/index.js.map +1 -0
  100. package/dist/internals/bgfx/materialize.d.ts +31 -0
  101. package/dist/internals/bgfx/materialize.d.ts.map +1 -0
  102. package/dist/internals/bgfx/materialize.js +117 -0
  103. package/dist/internals/bgfx/materialize.js.map +1 -0
  104. package/dist/internals/bgfx/opacity.d.ts +37 -0
  105. package/dist/internals/bgfx/opacity.d.ts.map +1 -0
  106. package/dist/internals/bgfx/opacity.js +76 -0
  107. package/dist/internals/bgfx/opacity.js.map +1 -0
  108. package/dist/internals/bgfx/registry.d.ts +13 -0
  109. package/dist/internals/bgfx/registry.d.ts.map +1 -0
  110. package/dist/internals/bgfx/registry.js +24 -0
  111. package/dist/internals/bgfx/registry.js.map +1 -0
  112. package/dist/internals/bgfx/sab-layout.d.ts +61 -0
  113. package/dist/internals/bgfx/sab-layout.d.ts.map +1 -0
  114. package/dist/internals/bgfx/sab-layout.js +107 -0
  115. package/dist/internals/bgfx/sab-layout.js.map +1 -0
  116. package/dist/internals/bgfx/shader-frame-host.d.ts +22 -0
  117. package/dist/internals/bgfx/shader-frame-host.d.ts.map +1 -0
  118. package/dist/internals/bgfx/shader-frame-host.js +165 -0
  119. package/dist/internals/bgfx/shader-frame-host.js.map +1 -0
  120. package/dist/internals/bgfx/shadertoy-catalog.d.ts +41 -0
  121. package/dist/internals/bgfx/shadertoy-catalog.d.ts.map +1 -0
  122. package/dist/internals/bgfx/shadertoy-catalog.js +200 -0
  123. package/dist/internals/bgfx/shadertoy-catalog.js.map +1 -0
  124. package/dist/internals/bgfx/shadertoy-gl.d.ts +38 -0
  125. package/dist/internals/bgfx/shadertoy-gl.d.ts.map +1 -0
  126. package/dist/internals/bgfx/shadertoy-gl.js +283 -0
  127. package/dist/internals/bgfx/shadertoy-gl.js.map +1 -0
  128. package/dist/internals/bgfx/types.d.ts +51 -0
  129. package/dist/internals/bgfx/types.d.ts.map +1 -0
  130. package/dist/internals/bgfx/types.js +14 -0
  131. package/dist/internals/bgfx/types.js.map +1 -0
  132. package/dist/internals/bgfx-worker.d.ts +6 -0
  133. package/dist/internals/bgfx-worker.d.ts.map +1 -0
  134. package/dist/internals/bgfx-worker.js +131 -0
  135. package/dist/internals/bgfx-worker.js.map +1 -0
  136. package/dist/layout/birth.d.ts +77 -0
  137. package/dist/layout/birth.d.ts.map +1 -0
  138. package/dist/layout/birth.js +148 -0
  139. package/dist/layout/birth.js.map +1 -0
  140. package/dist/layout/children.d.ts +5 -0
  141. package/dist/layout/children.d.ts.map +1 -0
  142. package/dist/layout/children.js +19 -0
  143. package/dist/layout/children.js.map +1 -0
  144. package/dist/layout/chrome_frame.d.ts +254 -0
  145. package/dist/layout/chrome_frame.d.ts.map +1 -0
  146. package/dist/layout/chrome_frame.js +1080 -0
  147. package/dist/layout/chrome_frame.js.map +1 -0
  148. package/dist/layout/chrome_mask.d.ts +40 -0
  149. package/dist/layout/chrome_mask.d.ts.map +1 -0
  150. package/dist/layout/chrome_mask.js +150 -0
  151. package/dist/layout/chrome_mask.js.map +1 -0
  152. package/dist/layout/engine.d.ts +49 -0
  153. package/dist/layout/engine.d.ts.map +1 -0
  154. package/dist/layout/engine.js +1269 -0
  155. package/dist/layout/engine.js.map +1 -0
  156. package/dist/layout/flex.d.ts +36 -0
  157. package/dist/layout/flex.d.ts.map +1 -0
  158. package/dist/layout/flex.js +111 -0
  159. package/dist/layout/flex.js.map +1 -0
  160. package/dist/layout/grid.d.ts +36 -0
  161. package/dist/layout/grid.d.ts.map +1 -0
  162. package/dist/layout/grid.js +126 -0
  163. package/dist/layout/grid.js.map +1 -0
  164. package/dist/layout/index.d.ts +30 -0
  165. package/dist/layout/index.d.ts.map +1 -0
  166. package/dist/layout/index.js +30 -0
  167. package/dist/layout/index.js.map +1 -0
  168. package/dist/layout/indication.d.ts +34 -0
  169. package/dist/layout/indication.d.ts.map +1 -0
  170. package/dist/layout/indication.js +68 -0
  171. package/dist/layout/indication.js.map +1 -0
  172. package/dist/layout/length.d.ts +18 -0
  173. package/dist/layout/length.d.ts.map +1 -0
  174. package/dist/layout/length.js +24 -0
  175. package/dist/layout/length.js.map +1 -0
  176. package/dist/layout/live_paint.d.ts +145 -0
  177. package/dist/layout/live_paint.d.ts.map +1 -0
  178. package/dist/layout/live_paint.js +255 -0
  179. package/dist/layout/live_paint.js.map +1 -0
  180. package/dist/layout/markdown.d.ts +22 -0
  181. package/dist/layout/markdown.d.ts.map +1 -0
  182. package/dist/layout/markdown.js +167 -0
  183. package/dist/layout/markdown.js.map +1 -0
  184. package/dist/layout/measure.d.ts +46 -0
  185. package/dist/layout/measure.d.ts.map +1 -0
  186. package/dist/layout/measure.js +307 -0
  187. package/dist/layout/measure.js.map +1 -0
  188. package/dist/layout/paint-hotkey.d.ts +45 -0
  189. package/dist/layout/paint-hotkey.d.ts.map +1 -0
  190. package/dist/layout/paint-hotkey.js +152 -0
  191. package/dist/layout/paint-hotkey.js.map +1 -0
  192. package/dist/layout/paint.d.ts +25 -0
  193. package/dist/layout/paint.d.ts.map +1 -0
  194. package/dist/layout/paint.js +189 -0
  195. package/dist/layout/paint.js.map +1 -0
  196. package/dist/layout/paint_theme.d.ts +85 -0
  197. package/dist/layout/paint_theme.d.ts.map +1 -0
  198. package/dist/layout/paint_theme.js +76 -0
  199. package/dist/layout/paint_theme.js.map +1 -0
  200. package/dist/layout/progress.d.ts +31 -0
  201. package/dist/layout/progress.d.ts.map +1 -0
  202. package/dist/layout/progress.js +83 -0
  203. package/dist/layout/progress.js.map +1 -0
  204. package/dist/layout/selection.d.ts +136 -0
  205. package/dist/layout/selection.d.ts.map +1 -0
  206. package/dist/layout/selection.js +312 -0
  207. package/dist/layout/selection.js.map +1 -0
  208. package/dist/layout/selection_gesture.d.ts +88 -0
  209. package/dist/layout/selection_gesture.d.ts.map +1 -0
  210. package/dist/layout/selection_gesture.js +239 -0
  211. package/dist/layout/selection_gesture.js.map +1 -0
  212. package/dist/layout/selection_paint.d.ts +47 -0
  213. package/dist/layout/selection_paint.d.ts.map +1 -0
  214. package/dist/layout/selection_paint.js +320 -0
  215. package/dist/layout/selection_paint.js.map +1 -0
  216. package/dist/layout/serialize.d.ts +49 -0
  217. package/dist/layout/serialize.d.ts.map +1 -0
  218. package/dist/layout/serialize.js +437 -0
  219. package/dist/layout/serialize.js.map +1 -0
  220. package/dist/layout/squeeze.d.ts +58 -0
  221. package/dist/layout/squeeze.d.ts.map +1 -0
  222. package/dist/layout/squeeze.js +239 -0
  223. package/dist/layout/squeeze.js.map +1 -0
  224. package/dist/layout/text.d.ts +44 -0
  225. package/dist/layout/text.d.ts.map +1 -0
  226. package/dist/layout/text.js +230 -0
  227. package/dist/layout/text.js.map +1 -0
  228. package/dist/layout/theme_store.d.ts +21 -0
  229. package/dist/layout/theme_store.d.ts.map +1 -0
  230. package/dist/layout/theme_store.js +133 -0
  231. package/dist/layout/theme_store.js.map +1 -0
  232. package/dist/layout/types.d.ts +564 -0
  233. package/dist/layout/types.d.ts.map +1 -0
  234. package/dist/layout/types.js +2 -0
  235. package/dist/layout/types.js.map +1 -0
  236. package/dist/layout/visual_draft.d.ts +60 -0
  237. package/dist/layout/visual_draft.d.ts.map +1 -0
  238. package/dist/layout/visual_draft.js +199 -0
  239. package/dist/layout/visual_draft.js.map +1 -0
  240. package/dist/lexicon/color.d.ts +22 -0
  241. package/dist/lexicon/color.d.ts.map +1 -0
  242. package/dist/lexicon/color.js +6 -0
  243. package/dist/lexicon/color.js.map +1 -0
  244. package/dist/lexicon/index.d.ts +15 -0
  245. package/dist/lexicon/index.d.ts.map +1 -0
  246. package/dist/lexicon/index.js +15 -0
  247. package/dist/lexicon/index.js.map +1 -0
  248. package/dist/lexicon/prominence.d.ts +46 -0
  249. package/dist/lexicon/prominence.d.ts.map +1 -0
  250. package/dist/lexicon/prominence.js +73 -0
  251. package/dist/lexicon/prominence.js.map +1 -0
  252. package/dist/lexicon/quarantine.d.ts +21 -0
  253. package/dist/lexicon/quarantine.d.ts.map +1 -0
  254. package/dist/lexicon/quarantine.js +15 -0
  255. package/dist/lexicon/quarantine.js.map +1 -0
  256. package/dist/lexicon/roles.d.ts +37 -0
  257. package/dist/lexicon/roles.d.ts.map +1 -0
  258. package/dist/lexicon/roles.js +52 -0
  259. package/dist/lexicon/roles.js.map +1 -0
  260. package/dist/lexicon/tiers.d.ts +18 -0
  261. package/dist/lexicon/tiers.d.ts.map +1 -0
  262. package/dist/lexicon/tiers.js +17 -0
  263. package/dist/lexicon/tiers.js.map +1 -0
  264. package/dist/measure/index.d.ts +43 -0
  265. package/dist/measure/index.d.ts.map +1 -0
  266. package/dist/measure/index.js +120 -0
  267. package/dist/measure/index.js.map +1 -0
  268. package/dist/render.d.ts +72 -0
  269. package/dist/render.d.ts.map +1 -0
  270. package/dist/render.js +164 -0
  271. package/dist/render.js.map +1 -0
  272. package/dist/runtime/agents_keys.d.ts +8 -0
  273. package/dist/runtime/agents_keys.d.ts.map +1 -0
  274. package/dist/runtime/agents_keys.js +24 -0
  275. package/dist/runtime/agents_keys.js.map +1 -0
  276. package/dist/runtime/agents_peek.d.ts +44 -0
  277. package/dist/runtime/agents_peek.d.ts.map +1 -0
  278. package/dist/runtime/agents_peek.js +96 -0
  279. package/dist/runtime/agents_peek.js.map +1 -0
  280. package/dist/runtime/agents_preview.d.ts +27 -0
  281. package/dist/runtime/agents_preview.d.ts.map +1 -0
  282. package/dist/runtime/agents_preview.js +122 -0
  283. package/dist/runtime/agents_preview.js.map +1 -0
  284. package/dist/runtime/box_bus.d.ts +144 -0
  285. package/dist/runtime/box_bus.d.ts.map +1 -0
  286. package/dist/runtime/box_bus.js +74 -0
  287. package/dist/runtime/box_bus.js.map +1 -0
  288. package/dist/runtime/clipboard-image.d.ts +20 -0
  289. package/dist/runtime/clipboard-image.d.ts.map +1 -0
  290. package/dist/runtime/clipboard-image.js +62 -0
  291. package/dist/runtime/clipboard-image.js.map +1 -0
  292. package/dist/runtime/copy_toast.d.ts +46 -0
  293. package/dist/runtime/copy_toast.d.ts.map +1 -0
  294. package/dist/runtime/copy_toast.js +117 -0
  295. package/dist/runtime/copy_toast.js.map +1 -0
  296. package/dist/runtime/echo.d.ts +41 -0
  297. package/dist/runtime/echo.d.ts.map +1 -0
  298. package/dist/runtime/echo.js +112 -0
  299. package/dist/runtime/echo.js.map +1 -0
  300. package/dist/runtime/frame.d.ts +79 -0
  301. package/dist/runtime/frame.d.ts.map +1 -0
  302. package/dist/runtime/frame.js +258 -0
  303. package/dist/runtime/frame.js.map +1 -0
  304. package/dist/runtime/index.d.ts +16 -0
  305. package/dist/runtime/index.d.ts.map +1 -0
  306. package/dist/runtime/index.js +16 -0
  307. package/dist/runtime/index.js.map +1 -0
  308. package/dist/runtime/key_buffer.d.ts +19 -0
  309. package/dist/runtime/key_buffer.d.ts.map +1 -0
  310. package/dist/runtime/key_buffer.js +24 -0
  311. package/dist/runtime/key_buffer.js.map +1 -0
  312. package/dist/runtime/keys.d.ts +66 -0
  313. package/dist/runtime/keys.d.ts.map +1 -0
  314. package/dist/runtime/keys.js +220 -0
  315. package/dist/runtime/keys.js.map +1 -0
  316. package/dist/runtime/paint_snapshot.d.ts +9 -0
  317. package/dist/runtime/paint_snapshot.d.ts.map +1 -0
  318. package/dist/runtime/paint_snapshot.js +8 -0
  319. package/dist/runtime/paint_snapshot.js.map +1 -0
  320. package/dist/runtime/paint_source.d.ts +266 -0
  321. package/dist/runtime/paint_source.d.ts.map +1 -0
  322. package/dist/runtime/paint_source.js +532 -0
  323. package/dist/runtime/paint_source.js.map +1 -0
  324. package/dist/runtime/present_loop.d.ts +11 -0
  325. package/dist/runtime/present_loop.d.ts.map +1 -0
  326. package/dist/runtime/present_loop.js +46 -0
  327. package/dist/runtime/present_loop.js.map +1 -0
  328. package/dist/runtime/present_profile.d.ts +58 -0
  329. package/dist/runtime/present_profile.d.ts.map +1 -0
  330. package/dist/runtime/present_profile.js +130 -0
  331. package/dist/runtime/present_profile.js.map +1 -0
  332. package/dist/runtime/raster.d.ts +24 -0
  333. package/dist/runtime/raster.d.ts.map +1 -0
  334. package/dist/runtime/raster.js +43 -0
  335. package/dist/runtime/raster.js.map +1 -0
  336. package/dist/runtime/renderer.d.ts +151 -0
  337. package/dist/runtime/renderer.d.ts.map +1 -0
  338. package/dist/runtime/renderer.js +1607 -0
  339. package/dist/runtime/renderer.js.map +1 -0
  340. package/dist/runtime/screenshot.d.ts +9 -0
  341. package/dist/runtime/screenshot.d.ts.map +1 -0
  342. package/dist/runtime/screenshot.js +111 -0
  343. package/dist/runtime/screenshot.js.map +1 -0
  344. package/dist/runtime/selection_host.d.ts +41 -0
  345. package/dist/runtime/selection_host.d.ts.map +1 -0
  346. package/dist/runtime/selection_host.js +190 -0
  347. package/dist/runtime/selection_host.js.map +1 -0
  348. package/dist/runtime/stderr_hold.d.ts +16 -0
  349. package/dist/runtime/stderr_hold.d.ts.map +1 -0
  350. package/dist/runtime/stderr_hold.js +23 -0
  351. package/dist/runtime/stderr_hold.js.map +1 -0
  352. package/dist/runtime/thought_birth.d.ts +25 -0
  353. package/dist/runtime/thought_birth.d.ts.map +1 -0
  354. package/dist/runtime/thought_birth.js +122 -0
  355. package/dist/runtime/thought_birth.js.map +1 -0
  356. package/dist/runtime/thought_collapsed.d.ts +35 -0
  357. package/dist/runtime/thought_collapsed.d.ts.map +1 -0
  358. package/dist/runtime/thought_collapsed.js +94 -0
  359. package/dist/runtime/thought_collapsed.js.map +1 -0
  360. package/dist/runtime/tty.d.ts +58 -0
  361. package/dist/runtime/tty.d.ts.map +1 -0
  362. package/dist/runtime/tty.js +130 -0
  363. package/dist/runtime/tty.js.map +1 -0
  364. package/dist/theme/ansi16.d.ts +34 -0
  365. package/dist/theme/ansi16.d.ts.map +1 -0
  366. package/dist/theme/ansi16.js +181 -0
  367. package/dist/theme/ansi16.js.map +1 -0
  368. package/dist/theme/ansi256.d.ts +15 -0
  369. package/dist/theme/ansi256.d.ts.map +1 -0
  370. package/dist/theme/ansi256.js +94 -0
  371. package/dist/theme/ansi256.js.map +1 -0
  372. package/dist/theme/ground.d.ts +8 -0
  373. package/dist/theme/ground.d.ts.map +1 -0
  374. package/dist/theme/ground.js +11 -0
  375. package/dist/theme/ground.js.map +1 -0
  376. package/dist/theme/index.d.ts +10 -0
  377. package/dist/theme/index.d.ts.map +1 -0
  378. package/dist/theme/index.js +10 -0
  379. package/dist/theme/index.js.map +1 -0
  380. package/dist/theme/region.d.ts +42 -0
  381. package/dist/theme/region.d.ts.map +1 -0
  382. package/dist/theme/region.js +105 -0
  383. package/dist/theme/region.js.map +1 -0
  384. package/dist/theme/resolver.d.ts +126 -0
  385. package/dist/theme/resolver.d.ts.map +1 -0
  386. package/dist/theme/resolver.js +366 -0
  387. package/dist/theme/resolver.js.map +1 -0
  388. package/dist/theme/salience.d.ts +90 -0
  389. package/dist/theme/salience.d.ts.map +1 -0
  390. package/dist/theme/salience.js +208 -0
  391. package/dist/theme/salience.js.map +1 -0
  392. package/dist/theme/seeds.d.ts +113 -0
  393. package/dist/theme/seeds.d.ts.map +1 -0
  394. package/dist/theme/seeds.js +52 -0
  395. package/dist/theme/seeds.js.map +1 -0
  396. package/dist/theme/selection.d.ts +94 -0
  397. package/dist/theme/selection.d.ts.map +1 -0
  398. package/dist/theme/selection.js +135 -0
  399. package/dist/theme/selection.js.map +1 -0
  400. package/dist/theme/theme.d.ts +41 -0
  401. package/dist/theme/theme.d.ts.map +1 -0
  402. package/dist/theme/theme.js +34 -0
  403. package/dist/theme/theme.js.map +1 -0
  404. package/dist/widgets/composer-caret.d.ts +47 -0
  405. package/dist/widgets/composer-caret.d.ts.map +1 -0
  406. package/dist/widgets/composer-caret.js +90 -0
  407. package/dist/widgets/composer-caret.js.map +1 -0
  408. package/dist/widgets/composer-click.d.ts +30 -0
  409. package/dist/widgets/composer-click.d.ts.map +1 -0
  410. package/dist/widgets/composer-click.js +89 -0
  411. package/dist/widgets/composer-click.js.map +1 -0
  412. package/dist/widgets/composer-command.d.ts +64 -0
  413. package/dist/widgets/composer-command.d.ts.map +1 -0
  414. package/dist/widgets/composer-command.js +127 -0
  415. package/dist/widgets/composer-command.js.map +1 -0
  416. package/dist/widgets/composer-frame.d.ts +74 -0
  417. package/dist/widgets/composer-frame.d.ts.map +1 -0
  418. package/dist/widgets/composer-frame.js +284 -0
  419. package/dist/widgets/composer-frame.js.map +1 -0
  420. package/dist/widgets/composer-picker.d.ts +89 -0
  421. package/dist/widgets/composer-picker.d.ts.map +1 -0
  422. package/dist/widgets/composer-picker.js +240 -0
  423. package/dist/widgets/composer-picker.js.map +1 -0
  424. package/dist/widgets/diff.d.ts +11 -0
  425. package/dist/widgets/diff.d.ts.map +1 -0
  426. package/dist/widgets/diff.js +19 -0
  427. package/dist/widgets/diff.js.map +1 -0
  428. package/dist/widgets/expand.d.ts +28 -0
  429. package/dist/widgets/expand.d.ts.map +1 -0
  430. package/dist/widgets/expand.js +94 -0
  431. package/dist/widgets/expand.js.map +1 -0
  432. package/dist/widgets/index.d.ts +126 -0
  433. package/dist/widgets/index.d.ts.map +1 -0
  434. package/dist/widgets/index.js +455 -0
  435. package/dist/widgets/index.js.map +1 -0
  436. package/dist/widgets/internals/arrival-lang.d.ts +88 -0
  437. package/dist/widgets/internals/arrival-lang.d.ts.map +1 -0
  438. package/dist/widgets/internals/arrival-lang.js +211 -0
  439. package/dist/widgets/internals/arrival-lang.js.map +1 -0
  440. package/dist/widgets/internals/diff-expand.d.ts +93 -0
  441. package/dist/widgets/internals/diff-expand.d.ts.map +1 -0
  442. package/dist/widgets/internals/diff-expand.js +1106 -0
  443. package/dist/widgets/internals/diff-expand.js.map +1 -0
  444. package/dist/widgets/internals/embedded-syntax.d.ts +62 -0
  445. package/dist/widgets/internals/embedded-syntax.d.ts.map +1 -0
  446. package/dist/widgets/internals/embedded-syntax.js +465 -0
  447. package/dist/widgets/internals/embedded-syntax.js.map +1 -0
  448. package/dist/widgets/internals/markdown-expand.d.ts +57 -0
  449. package/dist/widgets/internals/markdown-expand.d.ts.map +1 -0
  450. package/dist/widgets/internals/markdown-expand.js +980 -0
  451. package/dist/widgets/internals/markdown-expand.js.map +1 -0
  452. package/dist/widgets/internals/overlay-syntax.d.ts +24 -0
  453. package/dist/widgets/internals/overlay-syntax.d.ts.map +1 -0
  454. package/dist/widgets/internals/overlay-syntax.js +90 -0
  455. package/dist/widgets/internals/overlay-syntax.js.map +1 -0
  456. package/dist/widgets/internals/pierre-parse/cleanLastNewline.d.ts +6 -0
  457. package/dist/widgets/internals/pierre-parse/cleanLastNewline.d.ts.map +1 -0
  458. package/dist/widgets/internals/pierre-parse/cleanLastNewline.js +8 -0
  459. package/dist/widgets/internals/pierre-parse/cleanLastNewline.js.map +1 -0
  460. package/dist/widgets/internals/pierre-parse/constants.d.ts +13 -0
  461. package/dist/widgets/internals/pierre-parse/constants.d.ts.map +1 -0
  462. package/dist/widgets/internals/pierre-parse/constants.js +13 -0
  463. package/dist/widgets/internals/pierre-parse/constants.js.map +1 -0
  464. package/dist/widgets/internals/pierre-parse/detachString.d.ts +3 -0
  465. package/dist/widgets/internals/pierre-parse/detachString.d.ts.map +1 -0
  466. package/dist/widgets/internals/pierre-parse/detachString.js +24 -0
  467. package/dist/widgets/internals/pierre-parse/detachString.js.map +1 -0
  468. package/dist/widgets/internals/pierre-parse/index.d.ts +8 -0
  469. package/dist/widgets/internals/pierre-parse/index.d.ts.map +1 -0
  470. package/dist/widgets/internals/pierre-parse/index.js +8 -0
  471. package/dist/widgets/internals/pierre-parse/index.js.map +1 -0
  472. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.d.ts +15 -0
  473. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.d.ts.map +1 -0
  474. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.js +39 -0
  475. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.js.map +1 -0
  476. package/dist/widgets/internals/pierre-parse/parsePatchFiles.d.ts +11 -0
  477. package/dist/widgets/internals/pierre-parse/parsePatchFiles.d.ts.map +1 -0
  478. package/dist/widgets/internals/pierre-parse/parsePatchFiles.js +621 -0
  479. package/dist/widgets/internals/pierre-parse/parsePatchFiles.js.map +1 -0
  480. package/dist/widgets/internals/pierre-parse/types.d.ts +73 -0
  481. package/dist/widgets/internals/pierre-parse/types.d.ts.map +1 -0
  482. package/dist/widgets/internals/pierre-parse/types.js +7 -0
  483. package/dist/widgets/internals/pierre-parse/types.js.map +1 -0
  484. package/dist/widgets/internals/syntax.d.ts +55 -0
  485. package/dist/widgets/internals/syntax.d.ts.map +1 -0
  486. package/dist/widgets/internals/syntax.js +261 -0
  487. package/dist/widgets/internals/syntax.js.map +1 -0
  488. package/dist/widgets/markdown.d.ts +14 -0
  489. package/dist/widgets/markdown.d.ts.map +1 -0
  490. package/dist/widgets/markdown.js +9 -0
  491. package/dist/widgets/markdown.js.map +1 -0
  492. package/dist/widgets/shadow-stream.d.ts +88 -0
  493. package/dist/widgets/shadow-stream.d.ts.map +1 -0
  494. package/dist/widgets/shadow-stream.js +359 -0
  495. package/dist/widgets/shadow-stream.js.map +1 -0
  496. package/dist/widgets/speech.d.ts +36 -0
  497. package/dist/widgets/speech.d.ts.map +1 -0
  498. package/dist/widgets/speech.js +238 -0
  499. package/dist/widgets/speech.js.map +1 -0
  500. package/dist/widgets/stream-birth.d.ts +13 -0
  501. package/dist/widgets/stream-birth.d.ts.map +1 -0
  502. package/dist/widgets/stream-birth.js +70 -0
  503. package/dist/widgets/stream-birth.js.map +1 -0
  504. package/dist/widgets/syntax-boot.d.ts +25 -0
  505. package/dist/widgets/syntax-boot.d.ts.map +1 -0
  506. package/dist/widgets/syntax-boot.js +181 -0
  507. package/dist/widgets/syntax-boot.js.map +1 -0
  508. package/dist/widgets/text.d.ts +16 -0
  509. package/dist/widgets/text.d.ts.map +1 -0
  510. package/dist/widgets/text.js +14 -0
  511. package/dist/widgets/text.js.map +1 -0
  512. package/dist/widgets/transcript.d.ts +44 -0
  513. package/dist/widgets/transcript.d.ts.map +1 -0
  514. package/dist/widgets/transcript.js +106 -0
  515. package/dist/widgets/transcript.js.map +1 -0
  516. package/doom.vert +1840 -0
  517. package/fonts/DejaVuSans.ttf +0 -0
  518. package/fonts/DejaVuSansMono.ttf +0 -0
  519. package/fonts/LICENSE-DejaVu.txt +187 -0
  520. package/fonts/README.md +6 -0
  521. package/gradient.vert +75 -0
  522. package/package.json +147 -4
package/LICENSE.md ADDED
@@ -0,0 +1,7 @@
1
+ Copyright 2026 Merkle Bonsai
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1 +1,102 @@
1
- Placeholder for @inhuman.tools/quickdraw; see https://github.com/here-build/inhuman-harness
1
+ # quickdraw
2
+
3
+ **Terminal rendering substrate** for the harness — internal framework (cells,
4
+ CSI, layout, theme, caps, input, present).
5
+
6
+ In climbing, a **quickdraw** clips the *harness* into the bolt. Same wordplay:
7
+ the product is the harness (`../harness/`); this tree is how it meets the
8
+ terminal’s brutal reality.
9
+
10
+ One package: `@inhuman.tools/quickdraw`. Grain stages (`src/{measure,lexicon,…}`) are folders, not
11
+ npm names.
12
+
13
+ | | |
14
+ |---|---|
15
+ | **Product** | The harness (`../harness/`). Not this renderer. |
16
+ | **This tree** | Measure, layout, theme, caps, input, damage buffer, host present, paint widgets. |
17
+ | **License** | [MIT](./LICENSE.md) |
18
+
19
+ ## Product home
20
+
21
+ Quickdraw lives **inside the harness product root** (`../` — process packages in
22
+ `../harness/`). Dual-mode is at the product root:
23
+
24
+ ```bash
25
+ cd .. # harness product root
26
+ pnpm build
27
+ pnpm test
28
+ pnpm typecheck
29
+ pnpm test:umbrella # pnpm --filter @inhuman.tools/quickdraw test
30
+ pnpm check:color-parity
31
+ ```
32
+
33
+ From this package:
34
+
35
+ ```bash
36
+ pnpm --filter @inhuman.tools/quickdraw storybook # interactive catalog
37
+ pnpm --filter @inhuman.tools/quickdraw visual # mac terminal goldens (not CI)
38
+ ```
39
+
40
+ ## Tiers
41
+
42
+ **Load-bearing core**
43
+
44
+ - Cell buffer + dirty rows + ANSI emit + content guard
45
+ - Layout tree → `Frame` → paint / hit / selection
46
+ - Role & prominence theme (ground-aware, depth ladder)
47
+ - TTY capability probe
48
+ - One pure input decoder
49
+ - Optional host present (mailboxes, TTY enter/exit order)
50
+
51
+ **Paint widgets**
52
+
53
+ - Streaming markdown, syntax highlight, structured diff
54
+ - Thinking stream / composer chrome
55
+
56
+ **Optional canary — not product chrome**
57
+
58
+ - `src/internals/bgfx` + storybook `fx`: procedural cell wash to prove present-path
59
+ headroom under load. Cool if it runs; interactive paint still owns the loop.
60
+ Don’t build features on shaders.
61
+
62
+ ```bash
63
+ pnpm --filter @inhuman.tools/quickdraw fx
64
+ ```
65
+
66
+ ## Package (`@inhuman.tools/quickdraw`)
67
+
68
+ One package. Grain stages live in `src/` folders. Out-of-package code imports
69
+ named subpaths below — never `src/` or `dist/` filesystem paths.
70
+
71
+ | Export | Role |
72
+ |--------|------|
73
+ | `.` | `startRender` (UI thread; handle: `silenceInput` / `drainInput` / `stop` / `restore`) |
74
+ | `./input` | Draft and key decode |
75
+ | `./measure` | Display-column width |
76
+ | `./runtime` | Worker paint seam, mailbox, raster, thought birth and collapsed |
77
+ | `./widgets` | Light constructors (`Markdown`, `Diff`, `ComposerFrame`, …) |
78
+ | `./widgets/*` | Granular constructors |
79
+ | `./buffer` | Cell grid, dirty rows, ANSI emit |
80
+ | `./lexicon` | Roles, prominence, quarantine brands |
81
+ | `./layout` | Flex/grid tree → Frame, paint / hit / selection |
82
+ | `./theme` | Ground-aware color solve |
83
+ | `./capabilities` | TTY probe result |
84
+ | `./internals/bgfx` | Present-path canary (not product chrome) |
85
+ | `./internals/bgfx-worker` | Worker entry only |
86
+
87
+ The catalog (`src/storybook`) and the present-path bench (`src/bench`) live in this package. Terminal screenshot driving lives in [`../harness-tui/src/e2e`](../harness-tui/src/e2e).
88
+
89
+ ```bash
90
+ pnpm --filter @inhuman.tools/quickdraw storybook
91
+ pnpm --filter @inhuman.tools/quickdraw fx
92
+ pnpm --filter @inhuman.tools/quickdraw visual
93
+ pnpm --filter @inhuman.tools/quickdraw bench
94
+ pnpm --filter @inhuman.tools/quickdraw test
95
+ ```
96
+
97
+ **Boundary:** substrate + paint widgets stay here. The agent product is
98
+ `../harness/` (`@inhuman.tools/harness-*`).
99
+
100
+ ## License
101
+
102
+ [MIT](./LICENSE.md).
package/aurora.vert ADDED
@@ -0,0 +1,168 @@
1
+ // Auroras by nimitz 2017 (twitter: @stormoid)
2
+ // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
3
+ // Contact the author for other licensing options
4
+
5
+ /*
6
+
7
+ There are two main hurdles I encountered rendering this effect.
8
+ First, the nature of the texture that needs to be generated to get a believable effect
9
+ needs to be very specific, with large scale band-like structures, small scale non-smooth variations
10
+ to create the trail-like effect, a method for animating said texture smoothly and finally doing all
11
+ of this cheaply enough to be able to evaluate it several times per fragment/pixel.
12
+
13
+ The second obstacle is the need to render a large volume while keeping the computational cost low.
14
+ Since the effect requires the trails to extend way up in the atmosphere to look good, this means
15
+ that the evaluated volume cannot be as constrained as with cloud effects. My solution was to make
16
+ the sample stride increase polynomially, which works very well as long as the trails are lower opcaity than
17
+ the rest of the effect. Which is always the case for auroras.
18
+
19
+ After that, there were some issues with getting the correct emission curves and removing banding at lowered
20
+ sample densities, this was fixed by a combination of sample number influenced dithering and slight sample blending.
21
+
22
+ N.B. the base setup is from an old shader and ideally the effect would take an arbitrary ray origin and
23
+ direction. But this was not required for this demo and would be trivial to fix.
24
+ */
25
+
26
+ #define time iTime
27
+
28
+ mat2 mm2(in float a){float c = cos(a), s = sin(a);return mat2(c,s,-s,c);}
29
+ mat2 m2 = mat2(0.95534, 0.29552, -0.29552, 0.95534);
30
+ float tri(in float x){return clamp(abs(fract(x)-.5),0.01,0.49);}
31
+ vec2 tri2(in vec2 p){return vec2(tri(p.x)+tri(p.y),tri(p.y+tri(p.x)));}
32
+
33
+ float triNoise2d(in vec2 p, float spd)
34
+ {
35
+ float z=1.8;
36
+ float z2=2.5;
37
+ float rz = 0.;
38
+ p *= mm2(p.x*0.06);
39
+ vec2 bp = p;
40
+ for (float i=0.; i<5.; i++ )
41
+ {
42
+ vec2 dg = tri2(bp*1.85)*.75;
43
+ dg *= mm2(time*spd);
44
+ p -= dg/z2;
45
+
46
+ bp *= 1.3;
47
+ z2 *= .45;
48
+ z *= .42;
49
+ p *= 1.21 + (rz-1.0)*.02;
50
+
51
+ rz += tri(p.x+tri(p.y))*z;
52
+ p*= -m2;
53
+ }
54
+ return clamp(1./pow(rz*29., 1.3),0.,.55);
55
+ }
56
+
57
+ float hash21(in vec2 n){ return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453); }
58
+ vec4 aurora(vec3 ro, vec3 rd)
59
+ {
60
+ vec4 col = vec4(0);
61
+ vec4 avgCol = vec4(0);
62
+
63
+ for(float i=0.;i<50.;i++)
64
+ {
65
+ float of = 0.006*hash21(gl_FragCoord.xy)*smoothstep(0.,15., i);
66
+ float pt = ((.8+pow(i,1.4)*.002)-ro.y)/(rd.y*2.+0.4);
67
+ pt -= of;
68
+ vec3 bpos = ro + pt*rd;
69
+ vec2 p = bpos.zx;
70
+ float rzt = triNoise2d(p, 0.06);
71
+ vec4 col2 = vec4(0,0,0, rzt);
72
+ col2.rgb = (sin(1.-vec3(2.15,-.5, 1.2)+i*0.043)*0.5+0.5)*rzt;
73
+ avgCol = mix(avgCol, col2, .5);
74
+ col += avgCol*exp2(-i*0.065 - 2.5)*smoothstep(0.,5., i);
75
+
76
+ }
77
+
78
+ col *= (clamp(rd.y*15.+.4,0.,1.));
79
+
80
+
81
+ //return clamp(pow(col,vec4(1.3))*1.5,0.,1.);
82
+ //return clamp(pow(col,vec4(1.7))*2.,0.,1.);
83
+ //return clamp(pow(col,vec4(1.5))*2.5,0.,1.);
84
+ //return clamp(pow(col,vec4(1.8))*1.5,0.,1.);
85
+
86
+ //return smoothstep(0.,1.1,pow(col,vec4(1.))*1.5);
87
+ return col*1.8;
88
+ //return pow(col,vec4(1.))*2.
89
+ }
90
+
91
+
92
+ //-------------------Background and Stars--------------------
93
+
94
+ vec3 nmzHash33(vec3 q)
95
+ {
96
+ uvec3 p = uvec3(ivec3(q));
97
+ p = p*uvec3(374761393U, 1103515245U, 668265263U) + p.zxy + p.yzx;
98
+ p = p.yzx*(p.zxy^(p >> 3U));
99
+ return vec3(p^(p >> 16U))*(1.0/vec3(0xffffffffU));
100
+ }
101
+
102
+ vec3 stars(in vec3 p)
103
+ {
104
+ vec3 c = vec3(0.);
105
+ float res = iResolution.x*1.;
106
+
107
+ for (float i=0.;i<4.;i++)
108
+ {
109
+ vec3 q = fract(p*(.15*res))-0.5;
110
+ vec3 id = floor(p*(.15*res));
111
+ vec2 rn = nmzHash33(id).xy;
112
+ float c2 = 1.-smoothstep(0.,.6,length(q));
113
+ c2 *= step(rn.x,.0005+i*i*0.001);
114
+ c += c2*(mix(vec3(1.0,0.49,0.1),vec3(0.75,0.9,1.),rn.y)*0.1+0.9);
115
+ p *= 1.3;
116
+ }
117
+ return c*c*.8;
118
+ }
119
+
120
+ vec3 bg(in vec3 rd)
121
+ {
122
+ float sd = dot(normalize(vec3(-0.5, -0.6, 0.9)), rd)*0.5+0.5;
123
+ sd = pow(sd, 5.);
124
+ vec3 col = mix(vec3(0.05,0.1,0.2), vec3(0.1,0.05,0.2), sd);
125
+ return col*.63;
126
+ }
127
+ //-----------------------------------------------------------
128
+
129
+
130
+ void mainImage( out vec4 fragColor, in vec2 fragCoord )
131
+ {
132
+ vec2 q = fragCoord.xy / iResolution.xy;
133
+ vec2 p = q - 0.5;
134
+ p.x*=iResolution.x/iResolution.y;
135
+
136
+ vec3 ro = vec3(0,0,-6.7);
137
+ vec3 rd = normalize(vec3(p,1.3));
138
+ vec2 mo = iMouse.xy / iResolution.xy-.5;
139
+ mo = (mo==vec2(-.5))?mo=vec2(-0.1,0.1):mo;
140
+ mo.x *= iResolution.x/iResolution.y;
141
+ rd.yz *= mm2(mo.y);
142
+ rd.xz *= mm2(mo.x + sin(time*0.05)*0.2);
143
+
144
+ vec3 col = vec3(0.);
145
+ vec3 brd = rd;
146
+ float fade = smoothstep(0.,0.01,abs(brd.y))*0.1+0.9;
147
+
148
+ col = bg(rd)*fade;
149
+
150
+ if (rd.y > 0.){
151
+ vec4 aur = smoothstep(0.,1.5,aurora(ro,rd))*fade;
152
+ col += stars(rd);
153
+ col = col*(1.-aur.a) + aur.rgb;
154
+ }
155
+ else //Reflections
156
+ {
157
+ rd.y = abs(rd.y);
158
+ col = bg(rd)*fade*0.6;
159
+ vec4 aur = smoothstep(0.0,2.5,aurora(ro,rd));
160
+ col += stars(rd)*0.1;
161
+ col = col*(1.-aur.a) + aur.rgb;
162
+ vec3 pos = ro + ((0.5-ro.y)/rd.y)*rd;
163
+ float nz2 = triNoise2d(pos.xz*vec2(.5,.7), 0.);
164
+ col += mix(vec3(0.2,0.25,0.5)*0.08,vec3(0.3,0.3,0.5)*0.7, nz2*0.4);
165
+ }
166
+
167
+ fragColor = vec4(col, 1.);
168
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * TEA host pieces for the fps experiment — the retired first-generation host,
3
+ * kept bench-local. The product protocol is box-bus (`quickdraw-runtime`);
4
+ * this whole-model snapshot channel exists only to drive the load box.
5
+ */
6
+ import type { Generation, Snapshot } from "./tea.js";
7
+ /** Main → Worker */
8
+ export type HostToWorker = {
9
+ type: "init";
10
+ cols: number;
11
+ rows: number;
12
+ } | {
13
+ type: "resize";
14
+ cols: number;
15
+ rows: number;
16
+ } | {
17
+ type: "key";
18
+ key: string;
19
+ } | {
20
+ type: "tick";
21
+ now: number;
22
+ };
23
+ /** Worker → Main */
24
+ export type WorkerToHost<Model> = {
25
+ type: "snapshot";
26
+ snap: Snapshot<Model>;
27
+ };
28
+ /**
29
+ * Latest-wins box: render always takes the freshest snapshot.
30
+ * Intermediate models are dropped (backpressure).
31
+ *
32
+ * **Thread-safety invariant:** single host event loop only. Safe when the
33
+ * worker `message` handler and the present `onFrame` callback both run on the
34
+ * same Node/main event loop (never concurrent). No Atomics — do not share one
35
+ * mailbox across workers/OS threads or move paint off that loop without a
36
+ * redesign.
37
+ */
38
+ export declare class LatestMailbox<Model> {
39
+ private snap;
40
+ private dropped;
41
+ /** One call may carry a burst. The newest gen wins; older gens in the burst count as dropped. */
42
+ push(...snaps: Snapshot<Model>[]): void;
43
+ /** Read without clearing (render may re-read same gen if no update). */
44
+ peek(): Snapshot<Model> | null;
45
+ takeDropped(): number;
46
+ }
47
+ export type FpsStats = {
48
+ fps: number;
49
+ frameMs: number;
50
+ presents: number;
51
+ skippedEmpty: number;
52
+ snapshotsDropped: number;
53
+ lastGen: Generation;
54
+ };
55
+ export declare function createFpsTracker(): {
56
+ recordPresent: (frameMs: number) => void;
57
+ recordSkip: () => void;
58
+ addDropped: (n: number) => void;
59
+ setGen: (g: Generation) => void;
60
+ sample: () => FpsStats;
61
+ };
62
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/bench/host.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErD,oBAAoB;AACpB,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,oBAAoB;AACpB,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAE9E;;;;;;;;;GASG;AACH,qBAAa,aAAa,CAAC,KAAK;IAC9B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,OAAO,CAAK;IAEpB,iGAAiG;IACjG,IAAI,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI;IAQvC,wEAAwE;IACxE,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;IAI9B,WAAW,IAAI,MAAM;CAKtB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,wBAAgB,gBAAgB,IAAI;IAClC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,QAAQ,CAAC;CACxB,CA2CA"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Latest-wins box: render always takes the freshest snapshot.
3
+ * Intermediate models are dropped (backpressure).
4
+ *
5
+ * **Thread-safety invariant:** single host event loop only. Safe when the
6
+ * worker `message` handler and the present `onFrame` callback both run on the
7
+ * same Node/main event loop (never concurrent). No Atomics — do not share one
8
+ * mailbox across workers/OS threads or move paint off that loop without a
9
+ * redesign.
10
+ */
11
+ export class LatestMailbox {
12
+ snap = null;
13
+ dropped = 0;
14
+ /** One call may carry a burst. The newest gen wins; older gens in the burst count as dropped. */
15
+ push(...snaps) {
16
+ for (const snap of snaps) {
17
+ if (this.snap !== null && snap.gen < this.snap.gen)
18
+ continue;
19
+ if (this.snap !== null)
20
+ this.dropped += 1;
21
+ this.snap = snap;
22
+ }
23
+ }
24
+ /** Read without clearing (render may re-read same gen if no update). */
25
+ peek() {
26
+ return this.snap;
27
+ }
28
+ takeDropped() {
29
+ const d = this.dropped;
30
+ this.dropped = 0;
31
+ return d;
32
+ }
33
+ }
34
+ export function createFpsTracker() {
35
+ let windowStart = performance.now();
36
+ let presents = 0;
37
+ let skipped = 0;
38
+ let dropped = 0;
39
+ let lastFrameMs = 0;
40
+ let lastGen = 0;
41
+ let fps = 0;
42
+ /** Count in the current 1s window for live fps. */
43
+ let windowPresents = 0;
44
+ return {
45
+ recordPresent(frameMs) {
46
+ presents += 1;
47
+ windowPresents += 1;
48
+ lastFrameMs = frameMs;
49
+ const now = performance.now();
50
+ if (now - windowStart >= 1000) {
51
+ fps = windowPresents / ((now - windowStart) / 1000);
52
+ windowPresents = 0;
53
+ windowStart = now;
54
+ }
55
+ },
56
+ recordSkip() {
57
+ skipped += 1;
58
+ },
59
+ addDropped(n) {
60
+ dropped += n;
61
+ },
62
+ setGen(g) {
63
+ lastGen = g;
64
+ },
65
+ sample() {
66
+ return {
67
+ fps,
68
+ frameMs: lastFrameMs,
69
+ presents,
70
+ skippedEmpty: skipped,
71
+ snapshotsDropped: dropped,
72
+ lastGen,
73
+ };
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/bench/host.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAa;IAChB,IAAI,GAA2B,IAAI,CAAC;IACpC,OAAO,GAAG,CAAC,CAAC;IAEpB,iGAAiG;IACjG,IAAI,CAAC,GAAG,KAAwB;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,SAAS;YAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,WAAW;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAWD,MAAM,UAAU,gBAAgB;IAO9B,IAAI,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,GAAe,CAAC,CAAC;IAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,mDAAmD;IACnD,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,OAAO;QACL,aAAa,CAAC,OAAO;YACnB,QAAQ,IAAI,CAAC,CAAC;YACd,cAAc,IAAI,CAAC,CAAC;YACpB,WAAW,GAAG,OAAO,CAAC;YACtB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,GAAG,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC;gBAC9B,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpD,cAAc,GAAG,CAAC,CAAC;gBACnB,WAAW,GAAG,GAAG,CAAC;YACpB,CAAC;QACH,CAAC;QACD,UAAU;YACR,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QACD,UAAU,CAAC,CAAC;YACV,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QACD,MAAM,CAAC,CAAC;YACN,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;QACD,MAAM;YACJ,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,WAAW;gBACpB,QAAQ;gBACR,YAAY,EAAE,OAAO;gBACrB,gBAAgB,EAAE,OAAO;gBACzB,OAAO;aACR,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Render thread (main).
3
+ * Spawns logic worker, presents @ targetFps, writes ANSI to stdout.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/bench/main.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Render thread (main).
3
+ * Spawns logic worker, presents @ targetFps, writes ANSI to stdout.
4
+ */
5
+ import path from "node:path";
6
+ import process from "node:process";
7
+ import { fileURLToPath } from "node:url";
8
+ import { Worker } from "node:worker_threads";
9
+ import { createFpsTracker, LatestMailbox } from "./host.js";
10
+ import { cloneBuffer, emitAnsi } from "../buffer/index.js";
11
+ import { startPresentLoop } from "../index.js";
12
+ import { paint } from "./view.js";
13
+ const TARGET_FPS = Number(process.env.QD_FPS ?? 30);
14
+ const TICK_MS = Number(process.env.QD_TICK_MS ?? 50); // logic clock / log growth
15
+ const SYNC_2026 = process.env.QD_SYNC !== "0";
16
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
+ function termSize() {
18
+ return {
19
+ cols: process.stdout.columns || 80,
20
+ rows: process.stdout.rows || 24,
21
+ };
22
+ }
23
+ const mailbox = new LatestMailbox();
24
+ const fps = createFpsTracker();
25
+ let prev = null;
26
+ let canvas;
27
+ let lastPaintedGen = -1;
28
+ let worker;
29
+ function send(msg) {
30
+ worker.postMessage(msg);
31
+ }
32
+ function setupTerminal() {
33
+ process.stdout.write("\u001B[?1049h"); // alt screen
34
+ process.stdout.write("\u001B[?25l"); // hide cursor
35
+ process.stdout.write("\u001B[?7l"); // no wrap
36
+ if (process.stdin.isTTY) {
37
+ process.stdin.setRawMode(true);
38
+ process.stdin.resume();
39
+ process.stdin.setEncoding("utf8");
40
+ }
41
+ }
42
+ /** Restore TTY and exit. `code` defaults to 0 (clean quit); errors pass 1. */
43
+ function teardown(code = 0) {
44
+ present.stop();
45
+ clearInterval(tickTimer);
46
+ void worker.terminate();
47
+ if (process.stdin.isTTY)
48
+ process.stdin.setRawMode(false);
49
+ process.stdout.write("\u001B[?25h\u001B[?7h\u001B[?1049l");
50
+ process.stdout.write("\n");
51
+ const s = fps.sample();
52
+ console.error(`[quickdraw] last fps=${s.fps.toFixed(1)} frameMs=${s.frameMs.toFixed(1)} gen=${s.lastGen}`);
53
+ process.exit(code);
54
+ }
55
+ function onFrame(_dt) {
56
+ fps.addDropped(mailbox.takeDropped());
57
+ const snap = mailbox.peek();
58
+ if (!snap) {
59
+ fps.recordSkip();
60
+ return;
61
+ }
62
+ // Still present when gen unchanged (clock panel updates only if tick advanced;
63
+ // for steady fps measurement we always paint when we have a snapshot).
64
+ const t0 = performance.now();
65
+ const stats = fps.sample();
66
+ fps.setGen(snap.gen);
67
+ canvas = paint(snap.model, stats, canvas);
68
+ const ansi = emitAnsi(prev, canvas, {
69
+ sync2026: SYNC_2026,
70
+ forceFull: prev === null || lastPaintedGen < 0,
71
+ });
72
+ if (ansi)
73
+ process.stdout.write(ansi);
74
+ prev = cloneBuffer(canvas);
75
+ lastPaintedGen = snap.gen;
76
+ fps.recordPresent(performance.now() - t0);
77
+ }
78
+ // --- boot ---
79
+ setupTerminal();
80
+ const { cols, rows } = termSize();
81
+ // Load the compiled worker beside this file. `tsc` emits `dist/bench/worker.js`;
82
+ // worker_threads + tsx is brittle for a `.js` specifier that should be `.ts`.
83
+ const workerPath = path.resolve(__dirname, "worker.js");
84
+ worker = new Worker(workerPath);
85
+ worker.on("message", (msg) => {
86
+ if (msg.type === "snapshot") {
87
+ mailbox.push(msg.snap);
88
+ }
89
+ });
90
+ worker.on("error", (err) => {
91
+ // Teardown ends in process.exit — log first, then exit non-zero (C9).
92
+ console.error(err);
93
+ teardown(1);
94
+ });
95
+ send({ type: "init", cols, rows });
96
+ const present = startPresentLoop({
97
+ targetFps: TARGET_FPS,
98
+ onFrame,
99
+ });
100
+ const tickTimer = setInterval(() => {
101
+ send({ type: "tick", now: Date.now() });
102
+ }, TICK_MS);
103
+ process.stdout.on("resize", () => {
104
+ const s = termSize();
105
+ send({ type: "resize", cols: s.cols, rows: s.rows });
106
+ prev = null; // keyframe after resize
107
+ });
108
+ process.stdin.on("data", (chunk) => {
109
+ const key = typeof chunk === "string" ? chunk : chunk.toString("utf8");
110
+ if (key === "q" || key === "\u0003") {
111
+ teardown();
112
+ return;
113
+ }
114
+ send({ type: "key", key });
115
+ });
116
+ process.on("SIGINT", teardown);
117
+ process.on("SIGTERM", teardown);
118
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/bench/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Experiment model: scrollable log + side panel + clock + optional CPU burn.
3
+ * Shared types for worker and main (view runs on main).
4
+ */
5
+ export type Msg = {
6
+ type: "tick";
7
+ now: number;
8
+ } | {
9
+ type: "key";
10
+ key: string;
11
+ } | {
12
+ type: "resize";
13
+ cols: number;
14
+ rows: number;
15
+ } | {
16
+ type: "append_burst";
17
+ count: number;
18
+ } | {
19
+ type: "set_burn";
20
+ ms: number;
21
+ };
22
+ export type Model = {
23
+ cols: number;
24
+ rows: number;
25
+ /** monologue log lines */
26
+ lines: string[];
27
+ scroll: number;
28
+ now: number;
29
+ tick: number;
30
+ /** artificial load in update (ms busy-loop) to prove render isolation */
31
+ burnMs: number;
32
+ paused: boolean;
33
+ };
34
+ export declare function init(cols: number, rows: number): Model;
35
+ export declare function update(msg: Msg, model: Model): Model;
36
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/bench/model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,GAAG,GACX;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAIF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAetD;AAcD,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CA8CpD"}