dexterm-cli 0.0.0-stage → 0.1.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 (349) hide show
  1. package/LICENSE +661 -0
  2. package/dist/packages/agents/src/audit.js +122 -0
  3. package/dist/packages/agents/src/bus.js +379 -0
  4. package/dist/packages/agents/src/executor.js +177 -0
  5. package/dist/packages/agents/src/gate.js +176 -0
  6. package/dist/packages/agents/src/identity.js +179 -0
  7. package/dist/packages/agents/src/index.js +15 -0
  8. package/dist/packages/agents/src/proposals.js +153 -0
  9. package/dist/packages/agents/src/schema.js +87 -0
  10. package/dist/packages/agents/src/sdk.js +140 -0
  11. package/dist/packages/agents/src/tiers.js +114 -0
  12. package/dist/packages/agents/src/tools.js +69 -0
  13. package/dist/packages/agents/src/ws.js +158 -0
  14. package/dist/packages/cli/assets/claude/analyst-system.md +76 -0
  15. package/dist/packages/cli/assets/claude/plugin/.claude-plugin/plugin.json +5 -0
  16. package/dist/packages/cli/assets/claude/plugin/skills/REGISTRY.json +16 -0
  17. package/dist/packages/cli/assets/claude/plugin/skills/larp-check/SKILL.md +67 -0
  18. package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +64 -0
  19. package/dist/packages/cli/assets/claude/plugin/skills/token-dossier/SKILL.md +63 -0
  20. package/dist/packages/cli/assets/claude/plugin/skills/trench-scan/SKILL.md +44 -0
  21. package/dist/packages/cli/assets/claude/schemas/larp.schema.json +117 -0
  22. package/dist/packages/cli/assets/claude/schemas/trench-scan.schema.json +71 -0
  23. package/dist/packages/cli/assets/claude/schemas/verdict.schema.json +115 -0
  24. package/dist/packages/cli/bin/dexterm.mjs +11 -0
  25. package/dist/packages/cli/src/agent-cmd.js +303 -0
  26. package/dist/packages/cli/src/agent-roster.js +26 -0
  27. package/dist/packages/cli/src/analyst/backend.js +526 -0
  28. package/dist/packages/cli/src/analyst/results.js +38 -0
  29. package/dist/packages/cli/src/analyst/session.js +319 -0
  30. package/dist/packages/cli/src/audit.js +51 -0
  31. package/dist/packages/cli/src/backtest-cmd.js +149 -0
  32. package/dist/packages/cli/src/boot-state.js +62 -0
  33. package/dist/packages/cli/src/custom.js +261 -0
  34. package/dist/packages/cli/src/display.js +191 -0
  35. package/dist/packages/cli/src/doctor.js +361 -0
  36. package/dist/packages/cli/src/feed.js +634 -0
  37. package/dist/packages/cli/src/fixtures.js +275 -0
  38. package/dist/packages/cli/src/follow-cmd.js +221 -0
  39. package/dist/packages/cli/src/images-config.js +59 -0
  40. package/dist/packages/cli/src/index.js +31 -0
  41. package/dist/packages/cli/src/kb-skill-cmd.js +240 -0
  42. package/dist/packages/cli/src/larp-record.js +21 -0
  43. package/dist/packages/cli/src/live/copy.js +80 -0
  44. package/dist/packages/cli/src/live/flow.js +233 -0
  45. package/dist/packages/cli/src/live/index.js +509 -0
  46. package/dist/packages/cli/src/live/intel.js +227 -0
  47. package/dist/packages/cli/src/live/newpairs.js +334 -0
  48. package/dist/packages/cli/src/live/screens/newpairs-live.js +219 -0
  49. package/dist/packages/cli/src/live/screens/token-live.js +459 -0
  50. package/dist/packages/cli/src/live/screens/watchlist-live.js +149 -0
  51. package/dist/packages/cli/src/live/token.js +585 -0
  52. package/dist/packages/cli/src/live/trade.js +929 -0
  53. package/dist/packages/cli/src/live/watchlist.js +178 -0
  54. package/dist/packages/cli/src/main.js +5583 -0
  55. package/dist/packages/cli/src/narrative-cmd.js +76 -0
  56. package/dist/packages/cli/src/pack-cmd.js +323 -0
  57. package/dist/packages/cli/src/plan-cmd.js +278 -0
  58. package/dist/packages/cli/src/popup.js +810 -0
  59. package/dist/packages/cli/src/rules-cmd.js +131 -0
  60. package/dist/packages/cli/src/rules.js +339 -0
  61. package/dist/packages/cli/src/scan/command.js +57 -0
  62. package/dist/packages/cli/src/scan/engine.js +419 -0
  63. package/dist/packages/cli/src/scan/observe.js +64 -0
  64. package/dist/packages/cli/src/scan/ui.js +98 -0
  65. package/dist/packages/cli/src/screener/filter.js +241 -0
  66. package/dist/packages/cli/src/screener/presets.js +80 -0
  67. package/dist/packages/cli/src/screener/rows.js +146 -0
  68. package/dist/packages/cli/src/screener/rug.js +50 -0
  69. package/dist/packages/cli/src/screener/sort.js +52 -0
  70. package/dist/packages/cli/src/screener/view.js +183 -0
  71. package/dist/packages/cli/src/screens/analyst-session.js +343 -0
  72. package/dist/packages/cli/src/screens/analyst.js +326 -0
  73. package/dist/packages/cli/src/screens/boot.js +74 -0
  74. package/dist/packages/cli/src/screens/bubbles.js +255 -0
  75. package/dist/packages/cli/src/screens/coin.js +33 -0
  76. package/dist/packages/cli/src/screens/follows.js +201 -0
  77. package/dist/packages/cli/src/screens/kol.js +90 -0
  78. package/dist/packages/cli/src/screens/narrative.js +90 -0
  79. package/dist/packages/cli/src/screens/newpairs.js +150 -0
  80. package/dist/packages/cli/src/screens/overlay.js +257 -0
  81. package/dist/packages/cli/src/screens/plans.js +126 -0
  82. package/dist/packages/cli/src/screens/positions.js +176 -0
  83. package/dist/packages/cli/src/screens/rules.js +170 -0
  84. package/dist/packages/cli/src/screens/screener.js +459 -0
  85. package/dist/packages/cli/src/screens/social-panel.js +107 -0
  86. package/dist/packages/cli/src/screens/ticket.js +342 -0
  87. package/dist/packages/cli/src/screens/token.js +312 -0
  88. package/dist/packages/cli/src/screens/trending.js +181 -0
  89. package/dist/packages/cli/src/screens/watchlist.js +104 -0
  90. package/dist/packages/cli/src/social/demo.js +96 -0
  91. package/dist/packages/cli/src/social/view.js +250 -0
  92. package/dist/packages/cli/src/state.js +463 -0
  93. package/dist/packages/cli/src/theme-cmd.js +126 -0
  94. package/dist/packages/cli/src/trade.js +319 -0
  95. package/dist/packages/cli/src/voice-hud.js +42 -0
  96. package/dist/packages/cli/src/wallet-cmd.js +440 -0
  97. package/dist/packages/cli/src/wallet-command.js +31 -0
  98. package/dist/packages/cli/src/widgets.js +208 -0
  99. package/dist/packages/cli/src/workspace-cmd.js +68 -0
  100. package/dist/packages/cli/src/x-cmd.js +154 -0
  101. package/dist/packages/custom/src/config.js +213 -0
  102. package/dist/packages/custom/src/index.js +10 -0
  103. package/dist/packages/custom/src/keymap.js +107 -0
  104. package/dist/packages/custom/src/layout.js +235 -0
  105. package/dist/packages/custom/src/packs.js +633 -0
  106. package/dist/packages/custom/src/rules.js +704 -0
  107. package/dist/packages/custom/src/schema.js +515 -0
  108. package/dist/packages/custom/src/themes.js +176 -0
  109. package/dist/packages/custom/src/widget-html.js +222 -0
  110. package/dist/packages/custom/src/workspace.js +141 -0
  111. package/dist/packages/data/src/analyst-actions.js +133 -0
  112. package/dist/packages/data/src/budget.js +88 -0
  113. package/dist/packages/data/src/cache.js +142 -0
  114. package/dist/packages/data/src/candles.js +168 -0
  115. package/dist/packages/data/src/clock.js +64 -0
  116. package/dist/packages/data/src/credits.js +137 -0
  117. package/dist/packages/data/src/detail.js +97 -0
  118. package/dist/packages/data/src/fast-lane.js +321 -0
  119. package/dist/packages/data/src/fixtures.js +135 -0
  120. package/dist/packages/data/src/health.js +245 -0
  121. package/dist/packages/data/src/http.js +277 -0
  122. package/dist/packages/data/src/images/cache.js +141 -0
  123. package/dist/packages/data/src/images/decode-worker.js +28 -0
  124. package/dist/packages/data/src/images/decode.js +81 -0
  125. package/dist/packages/data/src/images/fetch.js +162 -0
  126. package/dist/packages/data/src/images/gif.js +214 -0
  127. package/dist/packages/data/src/images/index.js +10 -0
  128. package/dist/packages/data/src/images/jpeg.js +544 -0
  129. package/dist/packages/data/src/images/png.js +310 -0
  130. package/dist/packages/data/src/images/service.js +334 -0
  131. package/dist/packages/data/src/images/types.js +27 -0
  132. package/dist/packages/data/src/index.js +208 -0
  133. package/dist/packages/data/src/intel/helius-history.js +59 -0
  134. package/dist/packages/data/src/intel/holder-class.js +125 -0
  135. package/dist/packages/data/src/intel/rules.js +421 -0
  136. package/dist/packages/data/src/intel/scan.js +170 -0
  137. package/dist/packages/data/src/larp/evidence.js +288 -0
  138. package/dist/packages/data/src/larp/links.js +137 -0
  139. package/dist/packages/data/src/larp/robots.js +90 -0
  140. package/dist/packages/data/src/larp/safe-fetch.js +389 -0
  141. package/dist/packages/data/src/limiter.js +341 -0
  142. package/dist/packages/data/src/model.js +12 -0
  143. package/dist/packages/data/src/paper.js +331 -0
  144. package/dist/packages/data/src/rpc-config.js +126 -0
  145. package/dist/packages/data/src/rpc-pool.js +166 -0
  146. package/dist/packages/data/src/social/chain.js +83 -0
  147. package/dist/packages/data/src/social/dedupe.js +205 -0
  148. package/dist/packages/data/src/social/feed.js +462 -0
  149. package/dist/packages/data/src/social/firewall.js +110 -0
  150. package/dist/packages/data/src/social/index.js +11 -0
  151. package/dist/packages/data/src/social/kol.js +269 -0
  152. package/dist/packages/data/src/social/model.js +11 -0
  153. package/dist/packages/data/src/social/rank.js +184 -0
  154. package/dist/packages/data/src/social/rss.js +113 -0
  155. package/dist/packages/data/src/social/summary.js +104 -0
  156. package/dist/packages/data/src/social/venues.js +186 -0
  157. package/dist/packages/data/src/sources/dexscreener.js +170 -0
  158. package/dist/packages/data/src/sources/geckoterminal.js +133 -0
  159. package/dist/packages/data/src/sources/goplus.js +161 -0
  160. package/dist/packages/data/src/sources/jupiter-swap.js +236 -0
  161. package/dist/packages/data/src/sources/jupiter.js +198 -0
  162. package/dist/packages/data/src/sources/pda.js +113 -0
  163. package/dist/packages/data/src/sources/pump-curve.js +58 -0
  164. package/dist/packages/data/src/sources/pumpportal.js +247 -0
  165. package/dist/packages/data/src/sources/rugcheck.js +71 -0
  166. package/dist/packages/data/src/sources/solana-rpc.js +299 -0
  167. package/dist/packages/data/src/sources/solana-ws.js +287 -0
  168. package/dist/packages/data/src/store.js +289 -0
  169. package/dist/packages/data/src/trade/bridge.js +464 -0
  170. package/dist/packages/data/src/trade/caps.js +323 -0
  171. package/dist/packages/data/src/trade/copy/auto.js +385 -0
  172. package/dist/packages/data/src/trade/copy/follows.js +103 -0
  173. package/dist/packages/data/src/trade/copy/index.js +9 -0
  174. package/dist/packages/data/src/trade/copy/mirror.js +91 -0
  175. package/dist/packages/data/src/trade/copy/stats.js +120 -0
  176. package/dist/packages/data/src/trade/copy/tracker.js +158 -0
  177. package/dist/packages/data/src/trade/copy/trades.js +87 -0
  178. package/dist/packages/data/src/trade/copy/types.js +6 -0
  179. package/dist/packages/data/src/trade/executor.js +933 -0
  180. package/dist/packages/data/src/trade/kill-switch.js +47 -0
  181. package/dist/packages/data/src/trade/link-store.js +52 -0
  182. package/dist/packages/data/src/trade/plans/confirm.js +157 -0
  183. package/dist/packages/data/src/trade/plans/engine.js +784 -0
  184. package/dist/packages/data/src/trade/plans/executor-live.js +220 -0
  185. package/dist/packages/data/src/trade/plans/executor-paper.js +44 -0
  186. package/dist/packages/data/src/trade/plans/executor.js +11 -0
  187. package/dist/packages/data/src/trade/plans/index.js +12 -0
  188. package/dist/packages/data/src/trade/plans/journal.js +77 -0
  189. package/dist/packages/data/src/trade/plans/mandate.js +129 -0
  190. package/dist/packages/data/src/trade/plans/plan.js +179 -0
  191. package/dist/packages/data/src/trade/plans/service.js +168 -0
  192. package/dist/packages/data/src/trade/plans/types.js +6 -0
  193. package/dist/packages/data/src/trade/rpc-exec.js +229 -0
  194. package/dist/packages/data/src/trade/signer/client.js +197 -0
  195. package/dist/packages/data/src/trade/signer/fast-wallet.js +154 -0
  196. package/dist/packages/data/src/trade/signer/host.js +97 -0
  197. package/dist/packages/data/src/trade/signer/main.js +121 -0
  198. package/dist/packages/data/src/trade/signer/probe-builder.js +85 -0
  199. package/dist/packages/data/src/trade/signer/protocol.js +92 -0
  200. package/dist/packages/data/src/trade/signer/service.js +400 -0
  201. package/dist/packages/data/src/trade/signer/sol-usd-feed.js +98 -0
  202. package/dist/packages/data/src/trade/sol-usd.js +86 -0
  203. package/dist/packages/data/src/trade/swap-build.js +108 -0
  204. package/dist/packages/data/src/trade/token-delta.js +201 -0
  205. package/dist/packages/data/src/trade/tx-decode.js +632 -0
  206. package/dist/packages/data/src/util.js +24 -0
  207. package/dist/packages/data/src/watchlist.js +176 -0
  208. package/dist/packages/data/src/x/api.js +256 -0
  209. package/dist/packages/data/src/x/budget.js +66 -0
  210. package/dist/packages/data/src/x/config.js +49 -0
  211. package/dist/packages/data/src/x/index.js +10 -0
  212. package/dist/packages/data/src/x/mock-server.js +217 -0
  213. package/dist/packages/data/src/x/oauth.js +242 -0
  214. package/dist/packages/data/src/x/pkce.js +21 -0
  215. package/dist/packages/data/src/x/source.js +285 -0
  216. package/dist/packages/data/src/x/token-store.js +134 -0
  217. package/dist/packages/data/src/x/transport.js +71 -0
  218. package/dist/packages/data/vendor/solana-web3/LICENSE +20 -0
  219. package/dist/packages/data/vendor/solana-web3/NOTICE.md +13 -0
  220. package/dist/packages/data/vendor/solana-web3/index.iife.min.js +20 -0
  221. package/dist/packages/mcp/assets/cases.json +1194 -0
  222. package/dist/packages/mcp/assets/kb/entries/cabal-and-coordinated-launches.md +28 -0
  223. package/dist/packages/mcp/assets/kb/entries/common-rug-patterns.md +40 -0
  224. package/dist/packages/mcp/assets/kb/entries/dbc-mechanics.md +30 -0
  225. package/dist/packages/mcp/assets/kb/entries/dev-wallet-behaviour.md +33 -0
  226. package/dist/packages/mcp/assets/kb/entries/glossary.md +35 -0
  227. package/dist/packages/mcp/assets/kb/entries/holder-concentration.md +30 -0
  228. package/dist/packages/mcp/assets/kb/entries/jito-bundles.md +29 -0
  229. package/dist/packages/mcp/assets/kb/entries/launchlab-curve.md +31 -0
  230. package/dist/packages/mcp/assets/kb/entries/lp-burn-vs-lock.md +31 -0
  231. package/dist/packages/mcp/assets/kb/entries/metadata-and-copycats.md +29 -0
  232. package/dist/packages/mcp/assets/kb/entries/mint-freeze-authority.md +31 -0
  233. package/dist/packages/mcp/assets/kb/entries/narrative-lifecycle.md +32 -0
  234. package/dist/packages/mcp/assets/kb/entries/pump-bonding-curve.md +33 -0
  235. package/dist/packages/mcp/assets/kb/entries/pumpswap-migration.md +29 -0
  236. package/dist/packages/mcp/assets/kb/entries/sniping-and-snipers.md +29 -0
  237. package/dist/packages/mcp/assets/kb/entries/token2022-extensions-risk.md +32 -0
  238. package/dist/packages/mcp/assets/kb/entries/wash-trading-fake-volume.md +33 -0
  239. package/dist/packages/mcp/assets/skills/rug-check.md +52 -0
  240. package/dist/packages/mcp/assets/skills/token-dossier.md +57 -0
  241. package/dist/packages/mcp/assets/skills/trench-scan.md +40 -0
  242. package/dist/packages/mcp/bin/dexterm-mcp.mjs +16 -0
  243. package/dist/packages/mcp/src/dossier.js +78 -0
  244. package/dist/packages/mcp/src/firewall.js +21 -0
  245. package/dist/packages/mcp/src/index.js +22 -0
  246. package/dist/packages/mcp/src/server.js +849 -0
  247. package/dist/packages/mcp/src/user-content.js +434 -0
  248. package/dist/packages/packs/src/backtest.js +183 -0
  249. package/dist/packages/packs/src/digest.js +95 -0
  250. package/dist/packages/packs/src/firewall.js +57 -0
  251. package/dist/packages/packs/src/index.js +19 -0
  252. package/dist/packages/packs/src/larp-eval.js +100 -0
  253. package/dist/packages/packs/src/narrative.js +309 -0
  254. package/dist/packages/packs/src/reason.js +135 -0
  255. package/dist/packages/packs/src/rug-model.js +137 -0
  256. package/dist/packages/packs/src/schema.js +54 -0
  257. package/dist/packages/packs/src/token-dossier.js +174 -0
  258. package/dist/packages/packs/src/verdicts.js +17 -0
  259. package/dist/packages/packs/src/wallet-dossier.js +105 -0
  260. package/dist/packages/popup/src/config.js +71 -0
  261. package/dist/packages/popup/src/dock.js +271 -0
  262. package/dist/packages/popup/src/host.js +210 -0
  263. package/dist/packages/popup/src/index.js +12 -0
  264. package/dist/packages/popup/src/loopback.js +53 -0
  265. package/dist/packages/popup/src/open.js +183 -0
  266. package/dist/packages/popup/src/pages/bubbles-lib.js +160 -0
  267. package/dist/packages/popup/src/pages/bubbles.css +23 -0
  268. package/dist/packages/popup/src/pages/bubbles.html +36 -0
  269. package/dist/packages/popup/src/pages/bubbles.js +214 -0
  270. package/dist/packages/popup/src/pages/chart-lib.js +262 -0
  271. package/dist/packages/popup/src/pages/chart.css +50 -0
  272. package/dist/packages/popup/src/pages/chart.html +56 -0
  273. package/dist/packages/popup/src/pages/chart.js +554 -0
  274. package/dist/packages/popup/src/pages/common.css +34 -0
  275. package/dist/packages/popup/src/pages/common.js +187 -0
  276. package/dist/packages/popup/src/pages/feeds.html +20 -0
  277. package/dist/packages/popup/src/pages/feeds.js +77 -0
  278. package/dist/packages/popup/src/pages/narrative.html +20 -0
  279. package/dist/packages/popup/src/pages/narrative.js +61 -0
  280. package/dist/packages/popup/src/pages/plans.css +30 -0
  281. package/dist/packages/popup/src/pages/plans.html +26 -0
  282. package/dist/packages/popup/src/pages/plans.js +82 -0
  283. package/dist/packages/popup/src/pages/roster.css +41 -0
  284. package/dist/packages/popup/src/pages/roster.html +25 -0
  285. package/dist/packages/popup/src/pages/roster.js +75 -0
  286. package/dist/packages/popup/src/pages/token.html +20 -0
  287. package/dist/packages/popup/src/pages/token.js +112 -0
  288. package/dist/packages/popup/src/pages/widget-sdk.js +224 -0
  289. package/dist/packages/popup/src/pages/widget.css +5 -0
  290. package/dist/packages/popup/src/pages/widget.html +21 -0
  291. package/dist/packages/popup/src/pages/widget.js +85 -0
  292. package/dist/packages/popup/src/protocol.js +31 -0
  293. package/dist/packages/popup/src/selftest.js +156 -0
  294. package/dist/packages/popup/src/server.js +582 -0
  295. package/dist/packages/popup/src/sinkproxy.js +167 -0
  296. package/dist/packages/popup/src/widget-html.js +231 -0
  297. package/dist/packages/popup/vendor/lightweight-charts/LICENSE +201 -0
  298. package/dist/packages/popup/vendor/lightweight-charts/NOTICE +2 -0
  299. package/dist/packages/popup/vendor/lightweight-charts/README.md +30 -0
  300. package/dist/packages/popup/vendor/lightweight-charts/VERSION +1 -0
  301. package/dist/packages/popup/vendor/lightweight-charts/lightweight-charts.standalone.production.js +7 -0
  302. package/dist/packages/recorder/bin/dexterm-recorder.mjs +11 -0
  303. package/dist/packages/recorder/src/cli.js +113 -0
  304. package/dist/packages/recorder/src/export.js +71 -0
  305. package/dist/packages/recorder/src/index.js +20 -0
  306. package/dist/packages/recorder/src/labels.js +151 -0
  307. package/dist/packages/recorder/src/open.js +29 -0
  308. package/dist/packages/recorder/src/recorder.js +553 -0
  309. package/dist/packages/recorder/src/schedule.js +43 -0
  310. package/dist/packages/recorder/src/schema.js +135 -0
  311. package/dist/packages/recorder/src/snapshot.js +191 -0
  312. package/dist/packages/recorder/src/sweep.js +52 -0
  313. package/dist/packages/recorder/src/verdicts.js +52 -0
  314. package/dist/packages/tui/src/bubbles.js +415 -0
  315. package/dist/packages/tui/src/canvas.js +370 -0
  316. package/dist/packages/tui/src/chrome.js +85 -0
  317. package/dist/packages/tui/src/color.js +133 -0
  318. package/dist/packages/tui/src/flush.js +62 -0
  319. package/dist/packages/tui/src/fmt.js +188 -0
  320. package/dist/packages/tui/src/fx-trade.js +278 -0
  321. package/dist/packages/tui/src/fx.js +527 -0
  322. package/dist/packages/tui/src/images/blocks.js +141 -0
  323. package/dist/packages/tui/src/images/coin.js +22 -0
  324. package/dist/packages/tui/src/images/detect.js +140 -0
  325. package/dist/packages/tui/src/images/index.js +7 -0
  326. package/dist/packages/tui/src/images/layer.js +146 -0
  327. package/dist/packages/tui/src/images/pixels.js +157 -0
  328. package/dist/packages/tui/src/images/protocols.js +87 -0
  329. package/dist/packages/tui/src/index.js +15 -0
  330. package/dist/packages/tui/src/keymap.js +355 -0
  331. package/dist/packages/tui/src/layout.js +11 -0
  332. package/dist/packages/tui/src/sound.js +177 -0
  333. package/dist/packages/tui/src/theme.js +182 -0
  334. package/dist/packages/tui/src/widgets.js +598 -0
  335. package/dist/packages/voice/src/controller.js +395 -0
  336. package/dist/packages/voice/src/doctor.js +63 -0
  337. package/dist/packages/voice/src/engines.js +44 -0
  338. package/dist/packages/voice/src/index.js +16 -0
  339. package/dist/packages/voice/src/router.js +502 -0
  340. package/dist/packages/voice/src/stt/apple-helper.swift.js +103 -0
  341. package/dist/packages/voice/src/stt/apple.js +179 -0
  342. package/dist/packages/voice/src/stt/fake.js +34 -0
  343. package/dist/packages/voice/src/stt/whisper.js +102 -0
  344. package/dist/packages/voice/src/summary.js +44 -0
  345. package/dist/packages/voice/src/tts/fake.js +30 -0
  346. package/dist/packages/voice/src/tts/say.js +96 -0
  347. package/dist/packages/voice/src/types.js +3 -0
  348. package/package.json +42 -4
  349. package/README.md +0 -3
@@ -0,0 +1,544 @@
1
+ import { DEFAULT_LIMITS, ImageDecodeError, checkDims } from "./types.js";
2
+ const ZIGZAG = new Int32Array([
3
+ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
4
+ 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63,
5
+ ]);
6
+ function buildHuffman(counts, symbols) {
7
+ const maxcode = new Int32Array(18).fill(-1), mincode = new Int32Array(17), valptr = new Int32Array(17);
8
+ let code = 0, k = 0;
9
+ for (let len = 1; len <= 16; len++) {
10
+ const n = counts[len - 1];
11
+ valptr[len] = k;
12
+ mincode[len] = code;
13
+ if (n > 0) {
14
+ code += n;
15
+ k += n;
16
+ maxcode[len] = code - 1;
17
+ }
18
+ else
19
+ maxcode[len] = -1;
20
+ code <<= 1;
21
+ }
22
+ if (k !== symbols.length)
23
+ throw new ImageDecodeError('jpeg: huffman table symbol count mismatch');
24
+ return { maxcode, mincode, valptr, symbols };
25
+ }
26
+ class BitReader {
27
+ pos;
28
+ data;
29
+ bitBuf = 0;
30
+ bitCnt = 0;
31
+ /** A marker was hit inside entropy-coded data: bits read as zeros until the scan loop handles it. */
32
+ markerHit = false;
33
+ constructor(data, start) { this.data = data; this.pos = start; }
34
+ readBit() {
35
+ if (this.bitCnt === 0) {
36
+ if (this.markerHit || this.pos >= this.data.length) {
37
+ this.markerHit = true;
38
+ return 0;
39
+ }
40
+ let b = this.data[this.pos];
41
+ if (b === 0xff) {
42
+ const nxt = this.data[this.pos + 1];
43
+ if (nxt === 0) {
44
+ this.pos += 2;
45
+ }
46
+ else if (nxt === undefined) {
47
+ this.markerHit = true;
48
+ return 0;
49
+ }
50
+ else if (nxt >= 0xd0 && nxt <= 0xd7) {
51
+ this.markerHit = true;
52
+ return 0;
53
+ } // RSTn: handled by the scan loop
54
+ else {
55
+ this.markerHit = true;
56
+ return 0;
57
+ }
58
+ }
59
+ else
60
+ this.pos += 1;
61
+ this.bitBuf = b;
62
+ this.bitCnt = 8;
63
+ }
64
+ this.bitCnt -= 1;
65
+ return (this.bitBuf >> this.bitCnt) & 1;
66
+ }
67
+ receive(n) { let v = 0; for (let i = 0; i < n; i++)
68
+ v = (v << 1) | this.readBit(); return v; }
69
+ receiveExtend(s) {
70
+ if (s === 0)
71
+ return 0;
72
+ if (s > 16)
73
+ throw new ImageDecodeError('jpeg: bad magnitude category');
74
+ const v = this.receive(s);
75
+ return v < 1 << (s - 1) ? v - (1 << s) + 1 : v;
76
+ }
77
+ decode(h) {
78
+ let code = 0;
79
+ for (let len = 1; len <= 16; len++) {
80
+ code = (code << 1) | this.readBit();
81
+ if (h.maxcode[len] >= 0 && code <= h.maxcode[len])
82
+ return h.symbols[h.valptr[len] + code - h.mincode[len]];
83
+ }
84
+ if (this.markerHit)
85
+ return 0; // ran off the end of a scan: decode zeros, the loop stops at the marker
86
+ throw new ImageDecodeError('jpeg: invalid huffman code');
87
+ }
88
+ /** Drop buffered bits (restart / end of scan). */
89
+ reset() { this.bitBuf = 0; this.bitCnt = 0; this.markerHit = false; }
90
+ }
91
+ function decodeScan(data, start, frame, comps, restartInterval, ss, se, ah, al) {
92
+ const br = new BitReader(data, start);
93
+ const progressive = frame.progressive;
94
+ let eobrun = 0;
95
+ let acState = 0, acNext = 0;
96
+ const decodeBaseline = (c, off) => {
97
+ const t = br.decode(c.dc);
98
+ const diff = t === 0 ? 0 : br.receiveExtend(t);
99
+ c.pred += diff;
100
+ c.blockData[off] = c.pred;
101
+ let k = 1;
102
+ while (k < 64) {
103
+ const rs = br.decode(c.ac);
104
+ const s = rs & 15, r = rs >> 4;
105
+ if (s === 0) {
106
+ if (r < 15)
107
+ break;
108
+ k += 16;
109
+ continue;
110
+ }
111
+ k += r;
112
+ if (k > 63)
113
+ break;
114
+ c.blockData[off + ZIGZAG[k]] = br.receiveExtend(s);
115
+ k += 1;
116
+ }
117
+ };
118
+ const decodeDCFirst = (c, off) => {
119
+ const t = br.decode(c.dc);
120
+ const diff = t === 0 ? 0 : br.receiveExtend(t) << al;
121
+ c.pred += diff;
122
+ c.blockData[off] = c.pred;
123
+ };
124
+ const decodeDCRefine = (c, off) => { if (br.readBit())
125
+ c.blockData[off] |= 1 << al; };
126
+ const decodeACFirst = (c, off) => {
127
+ if (eobrun > 0) {
128
+ eobrun -= 1;
129
+ return;
130
+ }
131
+ let k = ss;
132
+ while (k <= se) {
133
+ const rs = br.decode(c.ac);
134
+ const s = rs & 15, r = rs >> 4;
135
+ if (s === 0) {
136
+ if (r < 15) {
137
+ eobrun = br.receive(r) + (1 << r) - 1;
138
+ break;
139
+ }
140
+ k += 16;
141
+ continue;
142
+ }
143
+ k += r;
144
+ if (k > 63)
145
+ break;
146
+ c.blockData[off + ZIGZAG[k]] = br.receiveExtend(s) * (1 << al);
147
+ k += 1;
148
+ }
149
+ };
150
+ const decodeACRefine = (c, off) => {
151
+ let k = ss, r = 0;
152
+ const bd = c.blockData;
153
+ while (k <= se) {
154
+ const z = off + ZIGZAG[k];
155
+ const sign = bd[z] < 0 ? -1 : 1;
156
+ switch (acState) {
157
+ case 0: {
158
+ const rs = br.decode(c.ac);
159
+ const s = rs & 15;
160
+ r = rs >> 4;
161
+ if (s === 0) {
162
+ if (r < 15) {
163
+ eobrun = br.receive(r) + (1 << r);
164
+ acState = 4;
165
+ }
166
+ else {
167
+ r = 16;
168
+ acState = 1;
169
+ }
170
+ }
171
+ else {
172
+ if (s !== 1)
173
+ throw new ImageDecodeError('jpeg: invalid AC refinement');
174
+ acNext = br.receiveExtend(s);
175
+ acState = r ? 2 : 3;
176
+ }
177
+ continue;
178
+ }
179
+ case 1:
180
+ case 2:
181
+ if (bd[z])
182
+ bd[z] += sign * (br.readBit() << al);
183
+ else {
184
+ r -= 1;
185
+ if (r === 0)
186
+ acState = acState === 2 ? 3 : 0;
187
+ }
188
+ break;
189
+ case 3:
190
+ if (bd[z])
191
+ bd[z] += sign * (br.readBit() << al);
192
+ else {
193
+ bd[z] = acNext << al;
194
+ acState = 0;
195
+ }
196
+ break;
197
+ case 4:
198
+ if (bd[z])
199
+ bd[z] += sign * (br.readBit() << al);
200
+ break;
201
+ }
202
+ k += 1;
203
+ }
204
+ if (acState === 4) {
205
+ eobrun -= 1;
206
+ if (eobrun === 0)
207
+ acState = 0;
208
+ }
209
+ };
210
+ const decodeFn = !progressive ? decodeBaseline : ss === 0 ? (ah === 0 ? decodeDCFirst : decodeDCRefine) : (ah === 0 ? decodeACFirst : decodeACRefine);
211
+ const blockAt = (c, row, col) => {
212
+ if (row < 0 || col < 0 || row >= c.blocksPerColumnForMcu || col >= c.blocksPerLineForMcu)
213
+ throw new ImageDecodeError('jpeg: block out of range');
214
+ return 64 * (row * c.blocksPerLineForMcu + col);
215
+ };
216
+ const single = comps.length === 1;
217
+ const total = single ? comps[0].blocksPerLine * comps[0].blocksPerColumn : frame.mcusPerLine * frame.mcusPerColumn;
218
+ const perRestart = restartInterval > 0 ? restartInterval : total;
219
+ let mcu = 0;
220
+ while (mcu < total) {
221
+ for (const c of comps)
222
+ c.pred = 0;
223
+ eobrun = 0;
224
+ acState = 0;
225
+ for (let n = 0; n < perRestart && mcu < total; n++, mcu++) {
226
+ if (single) {
227
+ const c = comps[0];
228
+ const row = Math.floor(mcu / c.blocksPerLine), col = mcu % c.blocksPerLine;
229
+ decodeFn(c, blockAt(c, row, col));
230
+ }
231
+ else {
232
+ const mr = Math.floor(mcu / frame.mcusPerLine), mc = mcu % frame.mcusPerLine;
233
+ for (const c of comps)
234
+ for (let j = 0; j < c.v; j++)
235
+ for (let k = 0; k < c.h; k++)
236
+ decodeFn(c, blockAt(c, mr * c.v + j, mc * c.h + k));
237
+ }
238
+ if (br.markerHit && br.pos >= data.length)
239
+ break;
240
+ }
241
+ // Expect a marker: RSTn continues, anything else ends the scan.
242
+ br.reset();
243
+ let p = br.pos;
244
+ while (p < data.length && data[p] !== 0xff)
245
+ p += 1;
246
+ while (p + 1 < data.length && data[p] === 0xff && data[p + 1] === 0xff)
247
+ p += 1;
248
+ if (p + 1 >= data.length)
249
+ return data.length;
250
+ const m = data[p + 1];
251
+ if (m >= 0xd0 && m <= 0xd7) {
252
+ br.pos = p + 2;
253
+ continue;
254
+ }
255
+ return p;
256
+ }
257
+ // consumed every MCU: find the next marker
258
+ let p = br.pos;
259
+ while (p < data.length && !(data[p] === 0xff && data[p + 1] !== 0 && !(data[p + 1] >= 0xd0 && data[p + 1] <= 0xd7)))
260
+ p += 1;
261
+ return p;
262
+ }
263
+ // Separable float IDCT with a precomputed cosine table; exact enough for display and simple to audit.
264
+ const COS = (() => {
265
+ const t = new Float32Array(64);
266
+ for (let x = 0; x < 8; x++)
267
+ for (let u = 0; u < 8; u++)
268
+ t[x * 8 + u] = (u === 0 ? Math.SQRT1_2 : 1) * Math.cos(((2 * x + 1) * u * Math.PI) / 16);
269
+ return t;
270
+ })();
271
+ function idctBlock(src, off, q, out, outOff, stride, tmp) {
272
+ // rows: tmp[y][x] = sum_u C(u) F(y,u) cos(x,u) where F stored natural order [v*8+u]
273
+ for (let v = 0; v < 8; v++) {
274
+ for (let x = 0; x < 8; x++) {
275
+ let s = 0;
276
+ for (let u = 0; u < 8; u++)
277
+ s += src[off + v * 8 + u] * q[v * 8 + u] * COS[x * 8 + u];
278
+ tmp[v * 8 + x] = s;
279
+ }
280
+ }
281
+ for (let x = 0; x < 8; x++) {
282
+ for (let y = 0; y < 8; y++) {
283
+ let s = 0;
284
+ for (let v = 0; v < 8; v++)
285
+ s += tmp[v * 8 + x] * COS[y * 8 + v];
286
+ const val = Math.round(s / 4 + 128);
287
+ out[outOff + y * stride + x] = val < 0 ? 0 : val > 255 ? 255 : val;
288
+ }
289
+ }
290
+ }
291
+ function clamp8(v) { return v < 0 ? 0 : v > 255 ? 255 : v; }
292
+ export function decodeJpeg(data, limits = DEFAULT_LIMITS) {
293
+ if (data.length < 4 || data[0] !== 0xff || data[1] !== 0xd8)
294
+ throw new ImageDecodeError('jpeg: bad signature');
295
+ if (data.length > limits.maxBytes)
296
+ throw new ImageDecodeError('jpeg: input over the byte cap');
297
+ const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);
298
+ const qt = [];
299
+ const dcTables = [], acTables = [];
300
+ let frame = null;
301
+ let restartInterval = 0;
302
+ let adobeTransform = null;
303
+ let jfif = false;
304
+ let pos = 2;
305
+ const u16 = (p) => { if (p + 2 > data.length)
306
+ throw new ImageDecodeError('jpeg: truncated'); return dv.getUint16(p); };
307
+ while (pos < data.length) {
308
+ if (data[pos] !== 0xff) {
309
+ pos += 1;
310
+ continue;
311
+ }
312
+ const marker = data[pos + 1];
313
+ if (marker === undefined)
314
+ break;
315
+ if (marker === 0xff) {
316
+ pos += 1;
317
+ continue;
318
+ } // fill byte
319
+ pos += 2;
320
+ if (marker === 0xd8)
321
+ continue; // SOI
322
+ if (marker === 0xd9)
323
+ break; // EOI
324
+ if (marker >= 0xd0 && marker <= 0xd7)
325
+ continue; // stray RST
326
+ const len = u16(pos);
327
+ const segEnd = pos + len;
328
+ if (segEnd > data.length)
329
+ throw new ImageDecodeError('jpeg: segment overruns the file');
330
+ const seg = pos + 2;
331
+ if (marker >= 0xe0 && marker <= 0xef) {
332
+ if (marker === 0xe0 && len >= 7 && data[seg] === 0x4a && data[seg + 1] === 0x46 && data[seg + 2] === 0x49 && data[seg + 3] === 0x46)
333
+ jfif = true;
334
+ if (marker === 0xee && len >= 14 && data[seg] === 0x41 && data[seg + 1] === 0x64 && data[seg + 2] === 0x6f && data[seg + 3] === 0x62 && data[seg + 4] === 0x65)
335
+ adobeTransform = data[seg + 11];
336
+ pos = segEnd;
337
+ continue;
338
+ }
339
+ switch (marker) {
340
+ case 0xdb: { // DQT
341
+ let p = seg;
342
+ while (p < segEnd) {
343
+ const pq = data[p] >> 4, tq = data[p] & 15;
344
+ p += 1;
345
+ if (tq > 3)
346
+ throw new ImageDecodeError('jpeg: bad quant table id');
347
+ const t = new Int32Array(64);
348
+ for (let k = 0; k < 64; k++) {
349
+ if (pq === 0) {
350
+ t[ZIGZAG[k]] = data[p];
351
+ p += 1;
352
+ }
353
+ else {
354
+ t[ZIGZAG[k]] = u16(p);
355
+ p += 2;
356
+ }
357
+ }
358
+ qt[tq] = t;
359
+ }
360
+ break;
361
+ }
362
+ case 0xc0:
363
+ case 0xc1:
364
+ case 0xc2: { // SOF
365
+ if (frame)
366
+ throw new ImageDecodeError('jpeg: multiple frames');
367
+ if (data[seg] !== 8)
368
+ throw new ImageDecodeError('jpeg: only 8-bit precision is supported');
369
+ const height = u16(seg + 1), width = u16(seg + 3), n = data[seg + 5];
370
+ checkDims(width, height, limits, 'jpeg');
371
+ if (n !== 1 && n !== 3)
372
+ throw new ImageDecodeError(`jpeg: ${n}-component images are not supported`);
373
+ const comps = [];
374
+ let p = seg + 6;
375
+ let maxH = 1, maxV = 1;
376
+ for (let i = 0; i < n; i++) {
377
+ const id = data[p], h = data[p + 1] >> 4, v = data[p + 1] & 15, tq = data[p + 2];
378
+ p += 3;
379
+ if (h < 1 || h > 4 || v < 1 || v > 4)
380
+ throw new ImageDecodeError('jpeg: bad sampling factor');
381
+ maxH = Math.max(maxH, h);
382
+ maxV = Math.max(maxV, v);
383
+ comps.push({ id, h, v, tq, blocksPerLine: 0, blocksPerColumn: 0, blocksPerLineForMcu: 0, blocksPerColumnForMcu: 0, blockData: new Int16Array(0), pred: 0 });
384
+ }
385
+ const mcusPerLine = Math.ceil(width / 8 / maxH), mcusPerColumn = Math.ceil(height / 8 / maxV);
386
+ for (const c of comps) {
387
+ c.blocksPerLine = Math.ceil((Math.ceil((width * c.h) / maxH)) / 8);
388
+ c.blocksPerColumn = Math.ceil((Math.ceil((height * c.v) / maxV)) / 8);
389
+ c.blocksPerLineForMcu = mcusPerLine * c.h;
390
+ c.blocksPerColumnForMcu = mcusPerColumn * c.v;
391
+ c.blockData = new Int16Array(c.blocksPerLineForMcu * c.blocksPerColumnForMcu * 64);
392
+ }
393
+ frame = { progressive: marker === 0xc2, width, height, maxH, maxV, mcusPerLine, mcusPerColumn, components: comps };
394
+ break;
395
+ }
396
+ case 0xc3:
397
+ case 0xc5:
398
+ case 0xc6:
399
+ case 0xc7:
400
+ case 0xc9:
401
+ case 0xca:
402
+ case 0xcb:
403
+ case 0xcd:
404
+ case 0xce:
405
+ case 0xcf:
406
+ throw new ImageDecodeError('jpeg: lossless/hierarchical/arithmetic JPEG is not supported');
407
+ case 0xc4: { // DHT
408
+ let p = seg;
409
+ while (p < segEnd) {
410
+ const tc = data[p] >> 4, th = data[p] & 15;
411
+ p += 1;
412
+ if (th > 3)
413
+ throw new ImageDecodeError('jpeg: bad huffman table id');
414
+ const counts = data.subarray(p, p + 16);
415
+ p += 16;
416
+ let total = 0;
417
+ for (let i = 0; i < 16; i++)
418
+ total += counts[i];
419
+ if (total > 256 || p + total > segEnd)
420
+ throw new ImageDecodeError('jpeg: bad huffman table');
421
+ const symbols = data.subarray(p, p + total);
422
+ p += total;
423
+ (tc === 0 ? dcTables : acTables)[th] = buildHuffman(counts, symbols);
424
+ }
425
+ break;
426
+ }
427
+ case 0xdd:
428
+ restartInterval = u16(seg);
429
+ break; // DRI
430
+ case 0xda: { // SOS
431
+ if (!frame)
432
+ throw new ImageDecodeError('jpeg: scan before frame');
433
+ const n = data[seg];
434
+ let p = seg + 1;
435
+ const comps = [];
436
+ for (let i = 0; i < n; i++) {
437
+ const id = data[p], td = data[p + 1] >> 4, ta = data[p + 1] & 15;
438
+ p += 2;
439
+ const c = frame.components.find((x) => x.id === id);
440
+ if (!c)
441
+ throw new ImageDecodeError('jpeg: scan names an unknown component');
442
+ c.dc = dcTables[td];
443
+ c.ac = acTables[ta];
444
+ comps.push(c);
445
+ }
446
+ const ss = data[p], se = data[p + 1], ah = data[p + 2] >> 4, al = data[p + 2] & 15;
447
+ p += 3;
448
+ if (!frame.progressive) {
449
+ for (const c of comps)
450
+ if (!c.dc || !c.ac)
451
+ throw new ImageDecodeError('jpeg: missing huffman table');
452
+ }
453
+ else {
454
+ if (ss > se || se > 63 || al > 13)
455
+ throw new ImageDecodeError('jpeg: bad progressive scan parameters');
456
+ for (const c of comps) {
457
+ if (ss === 0 && ah === 0 && !c.dc)
458
+ throw new ImageDecodeError('jpeg: missing DC table');
459
+ if (ss > 0 && !c.ac)
460
+ throw new ImageDecodeError('jpeg: missing AC table');
461
+ }
462
+ if (ss > 0 && comps.length !== 1)
463
+ throw new ImageDecodeError('jpeg: progressive AC scans must be non-interleaved');
464
+ }
465
+ pos = decodeScan(data, p, frame, comps, restartInterval, ss, se, ah, al);
466
+ continue;
467
+ }
468
+ case 0xdc: break; // DNL: ignored
469
+ default: break; // COM and anything else: skipped by length
470
+ }
471
+ pos = segEnd;
472
+ }
473
+ if (!frame)
474
+ throw new ImageDecodeError('jpeg: no frame');
475
+ // ---- dequantize + IDCT each component into a sample plane
476
+ const planes = [];
477
+ const tmp = new Float32Array(64);
478
+ for (const c of frame.components) {
479
+ const q = qt[c.tq];
480
+ if (!q)
481
+ throw new ImageDecodeError('jpeg: missing quant table');
482
+ const stride = c.blocksPerLine * 8;
483
+ const plane = new Uint8Array(stride * c.blocksPerColumn * 8);
484
+ for (let row = 0; row < c.blocksPerColumn; row++) {
485
+ for (let col = 0; col < c.blocksPerLine; col++) {
486
+ idctBlock(c.blockData, 64 * (row * c.blocksPerLineForMcu + col), q, plane, row * 8 * stride + col * 8, stride, tmp);
487
+ }
488
+ }
489
+ planes.push({ data: plane, stride, c });
490
+ }
491
+ // ---- colour conversion. Subsampled planes are upsampled with linear interpolation between sample
492
+ // centres (libjpeg's "fancy upsampling"), so the output matches djpeg to within a level.
493
+ const { width, height, maxH, maxV } = frame;
494
+ const out = new Uint8Array(width * height * 4);
495
+ const sampleOf = (p, x, y) => {
496
+ const fx = p.c.h / maxH, fy = p.c.v / maxV;
497
+ if (fx === 1 && fy === 1)
498
+ return p.data[y * p.stride + x];
499
+ const pw = p.c.blocksPerLine * 8, ph = p.c.blocksPerColumn * 8;
500
+ const sx = Math.min(Math.max((x + 0.5) * fx - 0.5, 0), pw - 1), sy = Math.min(Math.max((y + 0.5) * fy - 0.5, 0), ph - 1);
501
+ const x0 = Math.floor(sx), y0 = Math.floor(sy), x1 = Math.min(pw - 1, x0 + 1), y1 = Math.min(ph - 1, y0 + 1);
502
+ const tx = sx - x0, ty = sy - y0;
503
+ const d = p.data, s = p.stride;
504
+ const top = d[y0 * s + x0] * (1 - tx) + d[y0 * s + x1] * tx;
505
+ const bot = d[y1 * s + x0] * (1 - tx) + d[y1 * s + x1] * tx;
506
+ return top * (1 - ty) + bot * ty;
507
+ };
508
+ if (planes.length === 1) {
509
+ const p = planes[0];
510
+ for (let y = 0; y < height; y++)
511
+ for (let x = 0; x < width; x++) {
512
+ const g = sampleOf(p, x, y), o = (y * width + x) * 4;
513
+ out[o] = g;
514
+ out[o + 1] = g;
515
+ out[o + 2] = g;
516
+ out[o + 3] = 255;
517
+ }
518
+ return { w: width, h: height, rgba: out };
519
+ }
520
+ // Transform: Adobe flag wins; JFIF implies YCbCr; component ids 'R','G','B' mean RGB; default YCbCr.
521
+ const ids = frame.components.map((c) => c.id);
522
+ const isRgbIds = ids[0] === 0x52 && ids[1] === 0x47 && ids[2] === 0x42;
523
+ const ycc = adobeTransform !== null ? adobeTransform !== 0 : jfif ? true : !isRgbIds;
524
+ const [p0, p1, p2] = planes;
525
+ for (let y = 0; y < height; y++) {
526
+ for (let x = 0; x < width; x++) {
527
+ const a = sampleOf(p0, x, y), b = sampleOf(p1, x, y), c = sampleOf(p2, x, y);
528
+ const o = (y * width + x) * 4;
529
+ if (ycc) {
530
+ const cb = b - 128, cr = c - 128;
531
+ out[o] = clamp8(Math.round(a + 1.402 * cr));
532
+ out[o + 1] = clamp8(Math.round(a - 0.344136 * cb - 0.714136 * cr));
533
+ out[o + 2] = clamp8(Math.round(a + 1.772 * cb));
534
+ }
535
+ else {
536
+ out[o] = a;
537
+ out[o + 1] = b;
538
+ out[o + 2] = c;
539
+ }
540
+ out[o + 3] = 255;
541
+ }
542
+ }
543
+ return { w: width, h: height, rgba: out };
544
+ }