dexterm-cli 0.0.0-stage → 0.1.2
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.
- package/LICENSE +661 -0
- package/dist/packages/agents/src/audit.js +122 -0
- package/dist/packages/agents/src/bus.js +394 -0
- package/dist/packages/agents/src/executor.js +202 -0
- package/dist/packages/agents/src/gate.js +179 -0
- package/dist/packages/agents/src/identity.js +218 -0
- package/dist/packages/agents/src/index.js +15 -0
- package/dist/packages/agents/src/proposals.js +153 -0
- package/dist/packages/agents/src/schema.js +87 -0
- package/dist/packages/agents/src/sdk.js +140 -0
- package/dist/packages/agents/src/tiers.js +119 -0
- package/dist/packages/agents/src/tools.js +72 -0
- package/dist/packages/agents/src/ws.js +158 -0
- package/dist/packages/cli/assets/claude/analyst-system.md +76 -0
- package/dist/packages/cli/assets/claude/plugin/.claude-plugin/plugin.json +5 -0
- package/dist/packages/cli/assets/claude/plugin/skills/REGISTRY.json +16 -0
- package/dist/packages/cli/assets/claude/plugin/skills/larp-check/SKILL.md +75 -0
- package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +74 -0
- package/dist/packages/cli/assets/claude/plugin/skills/token-dossier/SKILL.md +63 -0
- package/dist/packages/cli/assets/claude/plugin/skills/trench-scan/SKILL.md +44 -0
- package/dist/packages/cli/assets/claude/schemas/larp.schema.json +117 -0
- package/dist/packages/cli/assets/claude/schemas/trench-scan.schema.json +71 -0
- package/dist/packages/cli/assets/claude/schemas/verdict.schema.json +115 -0
- package/dist/packages/cli/bin/dexterm.mjs +11 -0
- package/dist/packages/cli/src/agent-cmd.js +336 -0
- package/dist/packages/cli/src/agent-roster.js +26 -0
- package/dist/packages/cli/src/alerts/adapters/desktop.js +40 -0
- package/dist/packages/cli/src/alerts/adapters/discord.js +36 -0
- package/dist/packages/cli/src/alerts/adapters/telegram.js +43 -0
- package/dist/packages/cli/src/alerts/adapters/toast.js +16 -0
- package/dist/packages/cli/src/alerts/creds.js +83 -0
- package/dist/packages/cli/src/alerts/format.js +41 -0
- package/dist/packages/cli/src/alerts/index.js +10 -0
- package/dist/packages/cli/src/alerts/notifier.js +53 -0
- package/dist/packages/cli/src/alerts/route.js +19 -0
- package/dist/packages/cli/src/alerts/types.js +1 -0
- package/dist/packages/cli/src/alerts-cmd.js +212 -0
- package/dist/packages/cli/src/analyst/backend.js +526 -0
- package/dist/packages/cli/src/analyst/results.js +38 -0
- package/dist/packages/cli/src/analyst/session.js +319 -0
- package/dist/packages/cli/src/audit.js +51 -0
- package/dist/packages/cli/src/backtest-cmd.js +208 -0
- package/dist/packages/cli/src/boot-state.js +62 -0
- package/dist/packages/cli/src/coin-target.js +2 -0
- package/dist/packages/cli/src/custom.js +261 -0
- package/dist/packages/cli/src/display.js +191 -0
- package/dist/packages/cli/src/doctor.js +375 -0
- package/dist/packages/cli/src/export.js +235 -0
- package/dist/packages/cli/src/feed.js +634 -0
- package/dist/packages/cli/src/fixtures.js +275 -0
- package/dist/packages/cli/src/follow-cmd.js +221 -0
- package/dist/packages/cli/src/images-config.js +59 -0
- package/dist/packages/cli/src/index.js +31 -0
- package/dist/packages/cli/src/kb-skill-cmd.js +240 -0
- package/dist/packages/cli/src/larp-record.js +21 -0
- package/dist/packages/cli/src/live/copy.js +80 -0
- package/dist/packages/cli/src/live/flow.js +233 -0
- package/dist/packages/cli/src/live/index.js +511 -0
- package/dist/packages/cli/src/live/intel.js +227 -0
- package/dist/packages/cli/src/live/newpairs.js +334 -0
- package/dist/packages/cli/src/live/screens/newpairs-live.js +219 -0
- package/dist/packages/cli/src/live/screens/token-live.js +459 -0
- package/dist/packages/cli/src/live/screens/watchlist-live.js +149 -0
- package/dist/packages/cli/src/live/token.js +585 -0
- package/dist/packages/cli/src/live/trade.js +929 -0
- package/dist/packages/cli/src/live/watchlist.js +178 -0
- package/dist/packages/cli/src/main.js +5785 -0
- package/dist/packages/cli/src/mcp-cmd.js +326 -0
- package/dist/packages/cli/src/narrative-cmd.js +76 -0
- package/dist/packages/cli/src/pack-cmd.js +323 -0
- package/dist/packages/cli/src/plan-cmd.js +278 -0
- package/dist/packages/cli/src/popup.js +810 -0
- package/dist/packages/cli/src/rules-cmd.js +131 -0
- package/dist/packages/cli/src/rules.js +358 -0
- package/dist/packages/cli/src/scan/command.js +57 -0
- package/dist/packages/cli/src/scan/engine.js +419 -0
- package/dist/packages/cli/src/scan/observe.js +64 -0
- package/dist/packages/cli/src/scan/ui.js +98 -0
- package/dist/packages/cli/src/screener/filter.js +241 -0
- package/dist/packages/cli/src/screener/presets.js +80 -0
- package/dist/packages/cli/src/screener/rows.js +146 -0
- package/dist/packages/cli/src/screener/rug.js +50 -0
- package/dist/packages/cli/src/screener/sort.js +52 -0
- package/dist/packages/cli/src/screener/view.js +183 -0
- package/dist/packages/cli/src/screens/analyst-session.js +343 -0
- package/dist/packages/cli/src/screens/analyst.js +326 -0
- package/dist/packages/cli/src/screens/boot.js +74 -0
- package/dist/packages/cli/src/screens/bubbles.js +255 -0
- package/dist/packages/cli/src/screens/coin.js +33 -0
- package/dist/packages/cli/src/screens/follows.js +201 -0
- package/dist/packages/cli/src/screens/kol.js +90 -0
- package/dist/packages/cli/src/screens/narrative.js +90 -0
- package/dist/packages/cli/src/screens/newpairs.js +150 -0
- package/dist/packages/cli/src/screens/overlay.js +257 -0
- package/dist/packages/cli/src/screens/plans.js +126 -0
- package/dist/packages/cli/src/screens/positions.js +176 -0
- package/dist/packages/cli/src/screens/rules.js +170 -0
- package/dist/packages/cli/src/screens/screener.js +459 -0
- package/dist/packages/cli/src/screens/social-panel.js +107 -0
- package/dist/packages/cli/src/screens/ticket.js +342 -0
- package/dist/packages/cli/src/screens/token.js +312 -0
- package/dist/packages/cli/src/screens/trending.js +181 -0
- package/dist/packages/cli/src/screens/watchlist.js +104 -0
- package/dist/packages/cli/src/skill-eval-build.js +109 -0
- package/dist/packages/cli/src/social/demo.js +96 -0
- package/dist/packages/cli/src/social/view.js +250 -0
- package/dist/packages/cli/src/state.js +463 -0
- package/dist/packages/cli/src/theme-cmd.js +126 -0
- package/dist/packages/cli/src/trade.js +319 -0
- package/dist/packages/cli/src/update.js +294 -0
- package/dist/packages/cli/src/version.js +3 -0
- package/dist/packages/cli/src/voice-cmd.js +119 -0
- package/dist/packages/cli/src/voice-hud.js +42 -0
- package/dist/packages/cli/src/wallet-cmd.js +440 -0
- package/dist/packages/cli/src/wallet-command.js +31 -0
- package/dist/packages/cli/src/watch-cmd.js +190 -0
- package/dist/packages/cli/src/widgets.js +208 -0
- package/dist/packages/cli/src/workspace-cmd.js +68 -0
- package/dist/packages/cli/src/x-cmd.js +154 -0
- package/dist/packages/custom/src/config.js +213 -0
- package/dist/packages/custom/src/index.js +10 -0
- package/dist/packages/custom/src/keymap.js +107 -0
- package/dist/packages/custom/src/layout.js +235 -0
- package/dist/packages/custom/src/packs.js +633 -0
- package/dist/packages/custom/src/rules.js +704 -0
- package/dist/packages/custom/src/schema.js +538 -0
- package/dist/packages/custom/src/themes.js +176 -0
- package/dist/packages/custom/src/widget-html.js +222 -0
- package/dist/packages/custom/src/workspace.js +141 -0
- package/dist/packages/data/src/analyst-actions.js +133 -0
- package/dist/packages/data/src/budget.js +88 -0
- package/dist/packages/data/src/cache.js +142 -0
- package/dist/packages/data/src/candles.js +168 -0
- package/dist/packages/data/src/clock.js +64 -0
- package/dist/packages/data/src/coin-target.js +82 -0
- package/dist/packages/data/src/credits.js +137 -0
- package/dist/packages/data/src/detail.js +97 -0
- package/dist/packages/data/src/fast-lane.js +321 -0
- package/dist/packages/data/src/fixtures.js +135 -0
- package/dist/packages/data/src/health.js +245 -0
- package/dist/packages/data/src/http.js +277 -0
- package/dist/packages/data/src/images/cache.js +141 -0
- package/dist/packages/data/src/images/decode-worker.js +28 -0
- package/dist/packages/data/src/images/decode.js +81 -0
- package/dist/packages/data/src/images/fetch.js +162 -0
- package/dist/packages/data/src/images/gif.js +214 -0
- package/dist/packages/data/src/images/index.js +10 -0
- package/dist/packages/data/src/images/jpeg.js +544 -0
- package/dist/packages/data/src/images/png.js +310 -0
- package/dist/packages/data/src/images/service.js +334 -0
- package/dist/packages/data/src/images/types.js +27 -0
- package/dist/packages/data/src/index.js +211 -0
- package/dist/packages/data/src/intel/helius-history.js +70 -0
- package/dist/packages/data/src/intel/holder-class.js +125 -0
- package/dist/packages/data/src/intel/rules.js +421 -0
- package/dist/packages/data/src/intel/scan.js +170 -0
- package/dist/packages/data/src/larp/evidence.js +288 -0
- package/dist/packages/data/src/larp/link-baseline.js +196 -0
- package/dist/packages/data/src/larp/links.js +137 -0
- package/dist/packages/data/src/larp/robots.js +90 -0
- package/dist/packages/data/src/larp/safe-fetch.js +389 -0
- package/dist/packages/data/src/limiter.js +341 -0
- package/dist/packages/data/src/model.js +12 -0
- package/dist/packages/data/src/paper.js +331 -0
- package/dist/packages/data/src/rpc-config.js +126 -0
- package/dist/packages/data/src/rpc-pool.js +166 -0
- package/dist/packages/data/src/social/chain.js +83 -0
- package/dist/packages/data/src/social/dedupe.js +205 -0
- package/dist/packages/data/src/social/feed.js +462 -0
- package/dist/packages/data/src/social/firewall.js +110 -0
- package/dist/packages/data/src/social/index.js +11 -0
- package/dist/packages/data/src/social/kol.js +269 -0
- package/dist/packages/data/src/social/model.js +11 -0
- package/dist/packages/data/src/social/rank.js +184 -0
- package/dist/packages/data/src/social/rss.js +113 -0
- package/dist/packages/data/src/social/summary.js +104 -0
- package/dist/packages/data/src/social/venues.js +186 -0
- package/dist/packages/data/src/sources/dexscreener.js +184 -0
- package/dist/packages/data/src/sources/geckoterminal.js +133 -0
- package/dist/packages/data/src/sources/goplus.js +161 -0
- package/dist/packages/data/src/sources/jupiter-swap.js +236 -0
- package/dist/packages/data/src/sources/jupiter.js +198 -0
- package/dist/packages/data/src/sources/pda.js +113 -0
- package/dist/packages/data/src/sources/pump-curve.js +58 -0
- package/dist/packages/data/src/sources/pumpportal.js +252 -0
- package/dist/packages/data/src/sources/rugcheck.js +71 -0
- package/dist/packages/data/src/sources/solana-rpc.js +299 -0
- package/dist/packages/data/src/sources/solana-ws.js +287 -0
- package/dist/packages/data/src/store.js +289 -0
- package/dist/packages/data/src/trade/bridge.js +464 -0
- package/dist/packages/data/src/trade/caps.js +323 -0
- package/dist/packages/data/src/trade/copy/auto.js +385 -0
- package/dist/packages/data/src/trade/copy/follows.js +103 -0
- package/dist/packages/data/src/trade/copy/index.js +9 -0
- package/dist/packages/data/src/trade/copy/mirror.js +91 -0
- package/dist/packages/data/src/trade/copy/stats.js +120 -0
- package/dist/packages/data/src/trade/copy/tracker.js +158 -0
- package/dist/packages/data/src/trade/copy/trades.js +87 -0
- package/dist/packages/data/src/trade/copy/types.js +6 -0
- package/dist/packages/data/src/trade/executor.js +933 -0
- package/dist/packages/data/src/trade/kill-switch.js +47 -0
- package/dist/packages/data/src/trade/link-store.js +52 -0
- package/dist/packages/data/src/trade/plans/confirm.js +157 -0
- package/dist/packages/data/src/trade/plans/engine.js +784 -0
- package/dist/packages/data/src/trade/plans/executor-live.js +220 -0
- package/dist/packages/data/src/trade/plans/executor-paper.js +44 -0
- package/dist/packages/data/src/trade/plans/executor.js +11 -0
- package/dist/packages/data/src/trade/plans/index.js +12 -0
- package/dist/packages/data/src/trade/plans/journal.js +77 -0
- package/dist/packages/data/src/trade/plans/mandate.js +129 -0
- package/dist/packages/data/src/trade/plans/plan.js +179 -0
- package/dist/packages/data/src/trade/plans/service.js +168 -0
- package/dist/packages/data/src/trade/plans/types.js +6 -0
- package/dist/packages/data/src/trade/rpc-exec.js +229 -0
- package/dist/packages/data/src/trade/signer/client.js +197 -0
- package/dist/packages/data/src/trade/signer/fast-wallet.js +154 -0
- package/dist/packages/data/src/trade/signer/host.js +97 -0
- package/dist/packages/data/src/trade/signer/main.js +121 -0
- package/dist/packages/data/src/trade/signer/probe-builder.js +85 -0
- package/dist/packages/data/src/trade/signer/protocol.js +92 -0
- package/dist/packages/data/src/trade/signer/service.js +400 -0
- package/dist/packages/data/src/trade/signer/sol-usd-feed.js +98 -0
- package/dist/packages/data/src/trade/sol-usd.js +86 -0
- package/dist/packages/data/src/trade/swap-build.js +108 -0
- package/dist/packages/data/src/trade/token-delta.js +201 -0
- package/dist/packages/data/src/trade/tx-decode.js +632 -0
- package/dist/packages/data/src/util.js +24 -0
- package/dist/packages/data/src/watchlist.js +176 -0
- package/dist/packages/data/src/x/api.js +256 -0
- package/dist/packages/data/src/x/budget.js +66 -0
- package/dist/packages/data/src/x/config.js +49 -0
- package/dist/packages/data/src/x/index.js +10 -0
- package/dist/packages/data/src/x/mock-server.js +217 -0
- package/dist/packages/data/src/x/oauth.js +242 -0
- package/dist/packages/data/src/x/pkce.js +21 -0
- package/dist/packages/data/src/x/source.js +285 -0
- package/dist/packages/data/src/x/token-store.js +134 -0
- package/dist/packages/data/src/x/transport.js +71 -0
- package/dist/packages/data/vendor/solana-web3/LICENSE +20 -0
- package/dist/packages/data/vendor/solana-web3/NOTICE.md +13 -0
- package/dist/packages/data/vendor/solana-web3/index.iife.min.js +20 -0
- package/dist/packages/mcp/assets/cases.json +1194 -0
- package/dist/packages/mcp/assets/kb/entries/cabal-and-coordinated-launches.md +28 -0
- package/dist/packages/mcp/assets/kb/entries/common-rug-patterns.md +40 -0
- package/dist/packages/mcp/assets/kb/entries/dbc-mechanics.md +30 -0
- package/dist/packages/mcp/assets/kb/entries/dev-wallet-behaviour.md +33 -0
- package/dist/packages/mcp/assets/kb/entries/glossary.md +35 -0
- package/dist/packages/mcp/assets/kb/entries/holder-concentration.md +30 -0
- package/dist/packages/mcp/assets/kb/entries/jito-bundles.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/launchlab-curve.md +31 -0
- package/dist/packages/mcp/assets/kb/entries/lp-burn-vs-lock.md +31 -0
- package/dist/packages/mcp/assets/kb/entries/metadata-and-copycats.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/mint-freeze-authority.md +31 -0
- package/dist/packages/mcp/assets/kb/entries/narrative-lifecycle.md +32 -0
- package/dist/packages/mcp/assets/kb/entries/pump-bonding-curve.md +33 -0
- package/dist/packages/mcp/assets/kb/entries/pumpswap-migration.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/sniping-and-snipers.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/token2022-extensions-risk.md +32 -0
- package/dist/packages/mcp/assets/kb/entries/wash-trading-fake-volume.md +33 -0
- package/dist/packages/mcp/assets/skills/rug-check.md +52 -0
- package/dist/packages/mcp/assets/skills/token-dossier.md +57 -0
- package/dist/packages/mcp/assets/skills/trench-scan.md +40 -0
- package/dist/packages/mcp/bin/dexterm-mcp.mjs +16 -0
- package/dist/packages/mcp/src/dossier.js +78 -0
- package/dist/packages/mcp/src/firewall.js +21 -0
- package/dist/packages/mcp/src/index.js +22 -0
- package/dist/packages/mcp/src/server.js +936 -0
- package/dist/packages/mcp/src/user-content.js +434 -0
- package/dist/packages/packs/src/backtest.js +183 -0
- package/dist/packages/packs/src/digest.js +95 -0
- package/dist/packages/packs/src/firewall.js +57 -0
- package/dist/packages/packs/src/index.js +20 -0
- package/dist/packages/packs/src/larp-eval.js +100 -0
- package/dist/packages/packs/src/narrative.js +309 -0
- package/dist/packages/packs/src/reason.js +135 -0
- package/dist/packages/packs/src/rug-model.js +137 -0
- package/dist/packages/packs/src/schema.js +54 -0
- package/dist/packages/packs/src/skill-backtest.js +300 -0
- package/dist/packages/packs/src/token-dossier.js +174 -0
- package/dist/packages/packs/src/verdicts.js +17 -0
- package/dist/packages/packs/src/wallet-dossier.js +105 -0
- package/dist/packages/popup/src/config.js +71 -0
- package/dist/packages/popup/src/dock.js +271 -0
- package/dist/packages/popup/src/host.js +210 -0
- package/dist/packages/popup/src/index.js +12 -0
- package/dist/packages/popup/src/loopback.js +53 -0
- package/dist/packages/popup/src/open.js +183 -0
- package/dist/packages/popup/src/pages/bubbles-lib.js +160 -0
- package/dist/packages/popup/src/pages/bubbles.css +23 -0
- package/dist/packages/popup/src/pages/bubbles.html +36 -0
- package/dist/packages/popup/src/pages/bubbles.js +214 -0
- package/dist/packages/popup/src/pages/chart-lib.js +262 -0
- package/dist/packages/popup/src/pages/chart.css +50 -0
- package/dist/packages/popup/src/pages/chart.html +56 -0
- package/dist/packages/popup/src/pages/chart.js +554 -0
- package/dist/packages/popup/src/pages/common.css +34 -0
- package/dist/packages/popup/src/pages/common.js +187 -0
- package/dist/packages/popup/src/pages/feeds.html +20 -0
- package/dist/packages/popup/src/pages/feeds.js +77 -0
- package/dist/packages/popup/src/pages/narrative.html +20 -0
- package/dist/packages/popup/src/pages/narrative.js +61 -0
- package/dist/packages/popup/src/pages/plans.css +30 -0
- package/dist/packages/popup/src/pages/plans.html +26 -0
- package/dist/packages/popup/src/pages/plans.js +82 -0
- package/dist/packages/popup/src/pages/roster.css +41 -0
- package/dist/packages/popup/src/pages/roster.html +25 -0
- package/dist/packages/popup/src/pages/roster.js +75 -0
- package/dist/packages/popup/src/pages/token.html +20 -0
- package/dist/packages/popup/src/pages/token.js +112 -0
- package/dist/packages/popup/src/pages/widget-sdk.js +224 -0
- package/dist/packages/popup/src/pages/widget.css +5 -0
- package/dist/packages/popup/src/pages/widget.html +21 -0
- package/dist/packages/popup/src/pages/widget.js +85 -0
- package/dist/packages/popup/src/protocol.js +31 -0
- package/dist/packages/popup/src/selftest.js +156 -0
- package/dist/packages/popup/src/server.js +582 -0
- package/dist/packages/popup/src/sinkproxy.js +167 -0
- package/dist/packages/popup/src/widget-html.js +231 -0
- package/dist/packages/popup/vendor/lightweight-charts/LICENSE +201 -0
- package/dist/packages/popup/vendor/lightweight-charts/NOTICE +2 -0
- package/dist/packages/popup/vendor/lightweight-charts/README.md +30 -0
- package/dist/packages/popup/vendor/lightweight-charts/VERSION +1 -0
- package/dist/packages/popup/vendor/lightweight-charts/lightweight-charts.standalone.production.js +7 -0
- package/dist/packages/recorder/bin/dexterm-recorder.mjs +11 -0
- package/dist/packages/recorder/src/cli.js +113 -0
- package/dist/packages/recorder/src/export.js +71 -0
- package/dist/packages/recorder/src/index.js +20 -0
- package/dist/packages/recorder/src/labels.js +151 -0
- package/dist/packages/recorder/src/open.js +29 -0
- package/dist/packages/recorder/src/recorder.js +553 -0
- package/dist/packages/recorder/src/schedule.js +43 -0
- package/dist/packages/recorder/src/schema.js +135 -0
- package/dist/packages/recorder/src/snapshot.js +191 -0
- package/dist/packages/recorder/src/sweep.js +52 -0
- package/dist/packages/recorder/src/verdicts.js +52 -0
- package/dist/packages/tui/src/bubbles.js +415 -0
- package/dist/packages/tui/src/canvas.js +370 -0
- package/dist/packages/tui/src/chrome.js +85 -0
- package/dist/packages/tui/src/color.js +133 -0
- package/dist/packages/tui/src/flush.js +62 -0
- package/dist/packages/tui/src/fmt.js +188 -0
- package/dist/packages/tui/src/fx-trade.js +278 -0
- package/dist/packages/tui/src/fx.js +527 -0
- package/dist/packages/tui/src/images/blocks.js +141 -0
- package/dist/packages/tui/src/images/coin.js +22 -0
- package/dist/packages/tui/src/images/detect.js +140 -0
- package/dist/packages/tui/src/images/index.js +7 -0
- package/dist/packages/tui/src/images/layer.js +146 -0
- package/dist/packages/tui/src/images/pixels.js +157 -0
- package/dist/packages/tui/src/images/protocols.js +87 -0
- package/dist/packages/tui/src/index.js +18 -0
- package/dist/packages/tui/src/keymap.js +357 -0
- package/dist/packages/tui/src/layout.js +11 -0
- package/dist/packages/tui/src/raster-font.js +195 -0
- package/dist/packages/tui/src/raster.js +213 -0
- package/dist/packages/tui/src/sound.js +177 -0
- package/dist/packages/tui/src/theme.js +182 -0
- package/dist/packages/tui/src/widgets.js +598 -0
- package/dist/packages/voice/src/controller.js +407 -0
- package/dist/packages/voice/src/doctor.js +131 -0
- package/dist/packages/voice/src/download.js +184 -0
- package/dist/packages/voice/src/engines.js +84 -0
- package/dist/packages/voice/src/index.js +20 -0
- package/dist/packages/voice/src/router.js +502 -0
- package/dist/packages/voice/src/stt/apple-helper.swift.js +103 -0
- package/dist/packages/voice/src/stt/apple.js +179 -0
- package/dist/packages/voice/src/stt/fake.js +34 -0
- package/dist/packages/voice/src/stt/whisper.js +112 -0
- package/dist/packages/voice/src/summary.js +44 -0
- package/dist/packages/voice/src/tts/espeak.js +131 -0
- package/dist/packages/voice/src/tts/fake.js +30 -0
- package/dist/packages/voice/src/tts/piper.js +206 -0
- package/dist/packages/voice/src/tts/say.js +132 -0
- package/dist/packages/voice/src/tts/voices.js +206 -0
- package/dist/packages/voice/src/types.js +3 -0
- package/package.json +38 -4
- 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
|
+
}
|