hyperweave 0.3.6__tar.gz → 0.3.8__tar.gz
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.
- {hyperweave-0.3.6 → hyperweave-0.3.8}/CHANGELOG.md +35 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/PKG-INFO +33 -18
- {hyperweave-0.3.6 → hyperweave-0.3.8}/README.md +30 -17
- {hyperweave-0.3.6 → hyperweave-0.3.8}/pyproject.toml +7 -2
- {hyperweave-0.3.6 → hyperweave-0.3.8}/scripts/generate_proofset.py +12 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/_version.py +2 -2
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/assembler.py +39 -53
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/context.py +177 -24
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/validate_paradigms.py +99 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/config/loader.py +46 -0
- hyperweave-0.3.8/src/hyperweave/data/font-embedding.yaml +75 -0
- hyperweave-0.3.8/src/hyperweave/render/fonts.py +126 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/serve/app.py +37 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_chart_frame.py +5 -3
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_font_gating.py +68 -8
- hyperweave-0.3.8/tests/test_font_subsetting.py +240 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_paradigm_cellular.py +43 -14
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_serve.py +48 -0
- hyperweave-0.3.6/src/hyperweave/render/fonts.py +0 -48
- {hyperweave-0.3.6 → hyperweave-0.3.8}/.dockerignore +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/.github/workflows/ci.yml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/.github/workflows/deploy.yml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/.github/workflows/publish.yml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/.gitignore +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/.pre-commit-config.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/Dockerfile +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/LICENSE +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/buttons/button-liquid.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/cards/card-butterfly.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/cards/card-python.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/cards/card-sunflower.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/cards/card-waves.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/banner.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/brutalist-emerald/strip.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/banner.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/icons/github.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/icons/x.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/chrome-horizon/strip.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/master_card.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/receipt.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/receipt_claude-code_medium.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/receipt_codex_large.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/receipt_voltage_xlarge.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/rhythm_strip.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/examples/telemetry/rhythm_strip_voltage_xlarge.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/footers/inneraura-footer-liquid.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/footers/inneraura-footer-purple.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/footers/inneraura-footer.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/hyperweave-banner.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-discord.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-docs.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-github.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-x.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/marquees/badge-showcase-triple.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/marquees/genome-marquee-triple.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/marquees/sample-badges.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/404.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/callout-icons.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/divider.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/favicon.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/hero-banner.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/loader.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/mintlify-assets/og-image.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/assets/timelines/hyperweave-roadmap.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/assets/favicon.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/assets/hyperweave-banner.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/assets/hyperweave-navbar-logo.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/assets/og-image.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/explanation/architecture.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/explanation/camo-compatibility.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/explanation/cim-compliance.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/explanation/genome-profile-system.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/explanation/metadata-tiers.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/how-to/add-motion-to-badges.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/how-to/create-session-receipts.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/how-to/use-live-data-badges.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/introduction.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/mint.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/quickstart.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/cli.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/compose-spec.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/genomes.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/http-api.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/mcp-tools.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/motions.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/reference/telemetry-contract.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/spec/hyperweave-protocol.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/tutorials/compose-your-first-badge.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/docs/tutorials/install-session-telemetry.mdx +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/fly.toml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/hooks/install.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/hooks/session_end.sh +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/justfile +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/scripts/extract_font_metrics.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/scripts/extract_glyphs.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/scripts/probe_live_stats.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/scripts/probe_star_history.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/scripts/stress_test.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/__main__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/cli.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/bar_chart.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/engine.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/lanes.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/layout.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/palette.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/reasoning.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/resolver.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/resolvers/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/resolvers/chart.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/resolvers/stats.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/rhythm.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/rhythm_strip.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/compose/treemap.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/config/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/config/genome_validator.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/config/registry.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/config/settings.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/connectors/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/connectors/arxiv.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/connectors/base.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/connectors/cache.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/connectors/github.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/connectors/rest.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/cell_layout.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/color.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/contracts.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/enums.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/font_metrics.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/models.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/paradigm.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/schema.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/state.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/text.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/core/thresholds.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/badge_modes.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/css/accessibility.css +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/css/bridge.css +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/css/expression.css +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/css/status.css +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/font-metrics/chakra-petch.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/font-metrics/inter.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/font-metrics/jetbrains-mono.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/font-metrics/orbitron.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/barlow-condensed-700.b64 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/barlow-condensed-700.meta.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/barlow-condensed-900.b64 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/barlow-condensed-900.meta.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/chakra-petch.b64 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/chakra-petch.meta.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/automata.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/brutalist.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/chrome.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/telemetry-claude-code.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/telemetry-codex.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/telemetry-cream.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/genomes/telemetry-voltage.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/glyphs.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/motions/static.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/paradigms/brutalist.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/paradigms/cellular.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/paradigms/chrome.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/paradigms/default.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/policies/normal.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/policies/permissive.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/policies/ungoverned.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/profiles/chrome.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/reasoning/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/reasoning/brutalist.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/specimens.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/telemetry/runtimes/claude-code.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/telemetry/runtimes/codex.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/arrow.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/aurora.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/beacon.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/bracket3d.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/chevron.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/crosshair.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/diamond.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rocket.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rules/bar.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rules/straight.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/rules/wave.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/data/terminals/stijl.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/kit.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/mcp/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/mcp/__main__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/mcp/server.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/py.typed +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/render/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/render/chart_engine.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/render/glyphs.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/render/motion.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/render/templates.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/serve/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/serve/data_tokens.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/capture.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/codex_parser.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/contract.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/corrections.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/cost.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/models.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/parser.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/receipt_paths.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/runtimes.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/telemetry/stages.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-area.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-axes.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-empty-state.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-gridlines.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-markers/circle.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-markers/diamond.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-markers/endpoint-diamond.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-markers/endpoint-rect.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-markers/rect.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-milestone-brutalist.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-milestone.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/chart-polyline.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/status.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/document.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/brutalist-dark-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/brutalist-light-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/cellular-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/cellular-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/brutalist-dark-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/brutalist-light-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/cellular-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/cellular-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/divider/chrome-band.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/divider.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/cellular-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/cellular-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-overlay.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/cellular-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/cellular-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/cellular-overlay.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/chrome-overlay.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/default-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal/default-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/brutalist-dark-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/brutalist-light-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/cellular-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/cellular-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/chrome-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/brutalist-dark-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/brutalist-light-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/cellular-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/cellular-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/cellular-status.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/partials/provider-glyphs.svg.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/src/hyperweave/templates/partials/state-signal-cascade.j2 +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/__init__.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/conftest.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/fixtures/codex_session.jsonl +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/fixtures/codex_session_patches.jsonl +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/fixtures/github_contributions/synthetic.html +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/fixtures/session.json +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/fixtures/session.jsonl +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/fixtures/synthetic_session.jsonl +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/helpers.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/snapshots/url_stability/divider_band_chrome_static.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/snapshots/url_stability/icon_github_chrome_static.svg +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_assembler.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_badge_brutalist_dark.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_badge_cellular.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_badge_layout.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_badge_mode.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_chart_engine.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_chromatic_coverage_validator.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_chrome_variants.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_codex_parser.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_compose_bar_chart.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_compose_rhythm_strip.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_compose_treemap.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_compose_variant_field.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_connectors.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_core.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_data_tokens.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_divider_cellular.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_divider_genome_specific.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_doctor.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_font_metrics_chakra.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_genome_automata.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_github_scrape.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_install_hook.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_kit.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_marquee_v0_2_16.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_mcp.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_paradigm_dispatch.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_paradigm_extensibility.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_parse_transcript_auto.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_proofset.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_receipt_paths.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_receipt_token_compliance.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_render.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_resolver_rhythm.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_runtime_registries.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_serve_live_state.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_slot_metric_state.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_state_inference.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_stats_brutalist.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_stats_card.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_strip_brutalist_grammar.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_strip_cellular.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_strip_status_toggle.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_telemetry.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_telemetry_contract_per_stage.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_telemetry_integration.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_telemetry_skin_dispatch.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_tool_class_completeness.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_url_stability.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/tests/test_variant_default_resolution.py +0 -0
- {hyperweave-0.3.6 → hyperweave-0.3.8}/uv.lock +4 -4
|
@@ -5,6 +5,41 @@ All notable changes to HyperWeave are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.8] - 2026-05-19
|
|
9
|
+
|
|
10
|
+
Every artifact request now emits one greppable `HW_REQUEST` access-log line to stdout, so Fly.io's log stream reveals which GitHub repos embed HyperWeave SVGs via Camo's referer header. Health and metrics probes stay silent so 30-second checks don't drown the signal.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Access log middleware** — one `HW_REQUEST` line per non-probe request carries method, path with query string, user-agent, referer, x-forwarded-for, and status. Whitespace inside header values collapses to `_` so each `key=value` token stays grep-addressable.
|
|
15
|
+
- **Silent probe filter** — `/health` and `/metrics` skip the access log; Fly health-check traffic no longer pollutes the stream.
|
|
16
|
+
|
|
17
|
+
### Notes
|
|
18
|
+
|
|
19
|
+
- Logs flow through the `hyperweave.serve.access` named logger at INFO; uvicorn's stdout handler delivers them to Fly's log stream.
|
|
20
|
+
- Request and response bodies are never logged. The referer header is the only embed-attribution signal captured.
|
|
21
|
+
|
|
22
|
+
## [0.3.7] - 2026-05-18
|
|
23
|
+
|
|
24
|
+
Font payloads now embed only the characters each artifact actually renders, and fonts an artifact never displays are no longer embedded at all. Across every text-bearing artifact type — badges, strips, stats cards, star charts, marquees, receipts, and rhythm strips — and across all three genomes, gzip size drops by an average of 59% per artifact.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **Brutalist badge embedding** — single JetBrains Mono `@font-face` block. Barlow Condensed embeds only in stats, strips, and charts.
|
|
29
|
+
- **Automata badge embedding** — Orbitron + Chakra Petch only. JetBrains Mono no longer ships in badges since no badge text uses it.
|
|
30
|
+
- **Automata chart embedding** — Orbitron + JetBrains Mono only. Chakra Petch dropped since no chart text uses it.
|
|
31
|
+
- **Per-genome, per-frame embed list** — `data/font-embedding.yaml` declares which fonts ship for each genome-and-artifact combination. Adding a font is a single YAML edit, no Python changes.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- **Codex Stop hook crash on receipt render** — `fonttools` and `brotli` are now runtime dependencies, so `uv tool install` users no longer hit `ModuleNotFoundError: fontTools` when the hook fires.
|
|
36
|
+
|
|
37
|
+
### Notes
|
|
38
|
+
|
|
39
|
+
- Repeat renders of the same text reuse a cached subset, so the first request pays the subsetting cost and subsequent requests don't.
|
|
40
|
+
- CJK locale font embedding deferred to a future release.
|
|
41
|
+
- Icons and dividers continue to embed zero fonts.
|
|
42
|
+
|
|
8
43
|
## [0.3.6] - 2026-05-18
|
|
9
44
|
|
|
10
45
|
Receipt active-duration sources from per-turn compute when the runtime emits it; long-running sessions no longer inflate via stage-span summation. Codex hooks migrate to the wrapped-matcher GA layout shipped in the Codex CLI v0.129 release. The `data-hw-genome` root attribute reflects the resolved genome ID instead of raw spec input.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyperweave
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.8
|
|
4
4
|
Summary: Headless visual output layer for AI agents. One API call → self-contained SVG.
|
|
5
5
|
Project-URL: Repository, https://github.com/InnerAura/hyperweave
|
|
6
6
|
Project-URL: Issues, https://github.com/InnerAura/hyperweave/issues
|
|
@@ -19,8 +19,10 @@ Classifier: Topic :: Multimedia :: Graphics
|
|
|
19
19
|
Classifier: Topic :: Software Development :: Libraries
|
|
20
20
|
Classifier: Typing :: Typed
|
|
21
21
|
Requires-Python: >=3.12
|
|
22
|
+
Requires-Dist: brotli>=1.2.0
|
|
22
23
|
Requires-Dist: fastapi>=0.115
|
|
23
24
|
Requires-Dist: fastmcp>=3.0
|
|
25
|
+
Requires-Dist: fonttools>=4.62.1
|
|
24
26
|
Requires-Dist: httpx[http2]>=0.28
|
|
25
27
|
Requires-Dist: jinja2>=3.1
|
|
26
28
|
Requires-Dist: pydantic-settings>=2.0
|
|
@@ -241,11 +243,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
241
243
|
<tr>
|
|
242
244
|
<th align="left">Icons<br/><sub>circle + square</sub></th>
|
|
243
245
|
<td>
|
|
244
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
245
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
246
|
+
<img src="https://hyperweave.app/v1/icon/spotify/brutalist.static?shape=circle&variant=celadon" alt="spotify — celadon" width="56"/>
|
|
247
|
+
<img src="https://hyperweave.app/v1/icon/github/brutalist.static?shape=circle&variant=carbon" alt="github — carbon" width="56"/>
|
|
246
248
|
<img src="https://hyperweave.app/v1/icon/docker/brutalist.static?shape=circle&variant=alloy" alt="docker — alloy" width="56"/>
|
|
247
249
|
<img src="https://hyperweave.app/v1/icon/npm/brutalist.static?shape=square&variant=temper" alt="npm — temper" width="56"/>
|
|
248
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
250
|
+
<img src="https://hyperweave.app/v1/icon/discord/brutalist.static?shape=square&variant=pigment" alt="discord — pigment" width="56"/>
|
|
249
251
|
<img src="https://hyperweave.app/v1/icon/anthropic/brutalist.static?shape=square&variant=ember" alt="anthropic — ember" width="56"/>
|
|
250
252
|
<br/>
|
|
251
253
|
<ul>
|
|
@@ -269,11 +271,23 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
269
271
|
<h3 id="automata">automata</h3>
|
|
270
272
|
|
|
271
273
|
<p align="center">
|
|
272
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
273
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
274
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
275
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
276
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
274
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=violet&size=compact" alt="PYPI — violet variant"/>
|
|
275
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=teal&size=compact" alt="PYPI — teal variant"/>
|
|
276
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=bone&size=compact" alt="PYPI — bone variant"/>
|
|
277
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=steel&size=compact" alt="PYPI — steel variant"/>
|
|
278
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=amber&size=compact" alt="PYPI — amber variant"/>
|
|
279
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=jade&size=compact" alt="PYPI — jade variant"/>
|
|
280
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=magenta&size=compact" alt="PYPI — magenta variant"/>
|
|
281
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=cobalt&size=compact" alt="PYPI — cobalt variant"/>
|
|
282
|
+
<br/>
|
|
283
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=toxic&size=compact" alt="PYPI — toxic variant"/>
|
|
284
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=solar&size=compact" alt="PYPI — solar variant"/>
|
|
285
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=abyssal&size=compact" alt="PYPI — abyssal variant"/>
|
|
286
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=crimson&size=compact" alt="PYPI — crimson variant"/>
|
|
287
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=sulfur&size=compact" alt="PYPI — sulfur variant"/>
|
|
288
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=indigo&size=compact" alt="PYPI — indigo variant"/>
|
|
289
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=burgundy&size=compact" alt="PYPI — burgundy variant"/>
|
|
290
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=copper&size=compact" alt="PYPI — copper variant"/>
|
|
277
291
|
</p>
|
|
278
292
|
|
|
279
293
|
<p align="center">
|
|
@@ -370,11 +384,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
370
384
|
<h3 id="chrome">chrome</h3>
|
|
371
385
|
|
|
372
386
|
<p align="center">
|
|
373
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
374
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
375
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
376
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
377
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
387
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=horizon" alt="PYPI — horizon variant"/>
|
|
388
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=abyssal" alt="PYPI — abyssal variant"/>
|
|
389
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=lightning" alt="PYPI — lightning variant"/>
|
|
390
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=graphite" alt="PYPI — graphite variant"/>
|
|
391
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=moth" alt="PYPI — moth variant"/>
|
|
378
392
|
</p>
|
|
379
393
|
|
|
380
394
|
<p align="center">
|
|
@@ -442,10 +456,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
442
456
|
<tr>
|
|
443
457
|
<th align="left">Icons<br/><sub>circle + square</sub></th>
|
|
444
458
|
<td>
|
|
445
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
446
|
-
<img src="https://hyperweave.app/v1/icon/notion/chrome.static?shape=circle&variant=
|
|
447
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
448
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
459
|
+
<img src="https://hyperweave.app/v1/icon/github/chrome.static?shape=circle&variant=horizon" alt="github — horizon" width="56"/>
|
|
460
|
+
<img src="https://hyperweave.app/v1/icon/notion/chrome.static?shape=circle&variant=graphite" alt="notion — graphite" width="56"/>
|
|
461
|
+
<img src="https://hyperweave.app/v1/icon/rust/chrome.static?shape=square&variant=moth" alt="rust — moth" width="56"/>
|
|
462
|
+
<img src="https://hyperweave.app/v1/icon/docker/chrome.static?shape=square&variant=lightning" alt="docker — lightning" width="56"/>
|
|
463
|
+
<img src="https://hyperweave.app/v1/icon/spotify/chrome.static?shape=square&variant=abyssal" alt="spotify — abyssal" width="56"/>
|
|
449
464
|
<br/>
|
|
450
465
|
<ul>
|
|
451
466
|
<li><sub><code>/v1/icon/{glyph}/{genome}.static?shape={circle|square}&variant={variant}</code></sub></li>
|
|
@@ -209,11 +209,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
209
209
|
<tr>
|
|
210
210
|
<th align="left">Icons<br/><sub>circle + square</sub></th>
|
|
211
211
|
<td>
|
|
212
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
213
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
212
|
+
<img src="https://hyperweave.app/v1/icon/spotify/brutalist.static?shape=circle&variant=celadon" alt="spotify — celadon" width="56"/>
|
|
213
|
+
<img src="https://hyperweave.app/v1/icon/github/brutalist.static?shape=circle&variant=carbon" alt="github — carbon" width="56"/>
|
|
214
214
|
<img src="https://hyperweave.app/v1/icon/docker/brutalist.static?shape=circle&variant=alloy" alt="docker — alloy" width="56"/>
|
|
215
215
|
<img src="https://hyperweave.app/v1/icon/npm/brutalist.static?shape=square&variant=temper" alt="npm — temper" width="56"/>
|
|
216
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
216
|
+
<img src="https://hyperweave.app/v1/icon/discord/brutalist.static?shape=square&variant=pigment" alt="discord — pigment" width="56"/>
|
|
217
217
|
<img src="https://hyperweave.app/v1/icon/anthropic/brutalist.static?shape=square&variant=ember" alt="anthropic — ember" width="56"/>
|
|
218
218
|
<br/>
|
|
219
219
|
<ul>
|
|
@@ -237,11 +237,23 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
237
237
|
<h3 id="automata">automata</h3>
|
|
238
238
|
|
|
239
239
|
<p align="center">
|
|
240
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
241
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
242
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
243
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
244
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
240
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=violet&size=compact" alt="PYPI — violet variant"/>
|
|
241
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=teal&size=compact" alt="PYPI — teal variant"/>
|
|
242
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=bone&size=compact" alt="PYPI — bone variant"/>
|
|
243
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=steel&size=compact" alt="PYPI — steel variant"/>
|
|
244
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=amber&size=compact" alt="PYPI — amber variant"/>
|
|
245
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=jade&size=compact" alt="PYPI — jade variant"/>
|
|
246
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=magenta&size=compact" alt="PYPI — magenta variant"/>
|
|
247
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=cobalt&size=compact" alt="PYPI — cobalt variant"/>
|
|
248
|
+
<br/>
|
|
249
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=toxic&size=compact" alt="PYPI — toxic variant"/>
|
|
250
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=solar&size=compact" alt="PYPI — solar variant"/>
|
|
251
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=abyssal&size=compact" alt="PYPI — abyssal variant"/>
|
|
252
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=crimson&size=compact" alt="PYPI — crimson variant"/>
|
|
253
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=sulfur&size=compact" alt="PYPI — sulfur variant"/>
|
|
254
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=indigo&size=compact" alt="PYPI — indigo variant"/>
|
|
255
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=burgundy&size=compact" alt="PYPI — burgundy variant"/>
|
|
256
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/automata.static?data=pypi:hyperweave.version&glyph=python&variant=copper&size=compact" alt="PYPI — copper variant"/>
|
|
245
257
|
</p>
|
|
246
258
|
|
|
247
259
|
<p align="center">
|
|
@@ -338,11 +350,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
338
350
|
<h3 id="chrome">chrome</h3>
|
|
339
351
|
|
|
340
352
|
<p align="center">
|
|
341
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
342
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
343
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
344
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
345
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
353
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=horizon" alt="PYPI — horizon variant"/>
|
|
354
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=abyssal" alt="PYPI — abyssal variant"/>
|
|
355
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=lightning" alt="PYPI — lightning variant"/>
|
|
356
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=graphite" alt="PYPI — graphite variant"/>
|
|
357
|
+
<img src="https://hyperweave.app/v1/badge/PYPI/chrome.static?data=pypi:hyperweave.version&glyph=python&variant=moth" alt="PYPI — moth variant"/>
|
|
346
358
|
</p>
|
|
347
359
|
|
|
348
360
|
<p align="center">
|
|
@@ -410,10 +422,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
410
422
|
<tr>
|
|
411
423
|
<th align="left">Icons<br/><sub>circle + square</sub></th>
|
|
412
424
|
<td>
|
|
413
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
414
|
-
<img src="https://hyperweave.app/v1/icon/notion/chrome.static?shape=circle&variant=
|
|
415
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
416
|
-
<img src="https://hyperweave.app/v1/icon/
|
|
425
|
+
<img src="https://hyperweave.app/v1/icon/github/chrome.static?shape=circle&variant=horizon" alt="github — horizon" width="56"/>
|
|
426
|
+
<img src="https://hyperweave.app/v1/icon/notion/chrome.static?shape=circle&variant=graphite" alt="notion — graphite" width="56"/>
|
|
427
|
+
<img src="https://hyperweave.app/v1/icon/rust/chrome.static?shape=square&variant=moth" alt="rust — moth" width="56"/>
|
|
428
|
+
<img src="https://hyperweave.app/v1/icon/docker/chrome.static?shape=square&variant=lightning" alt="docker — lightning" width="56"/>
|
|
429
|
+
<img src="https://hyperweave.app/v1/icon/spotify/chrome.static?shape=square&variant=abyssal" alt="spotify — abyssal" width="56"/>
|
|
417
430
|
<br/>
|
|
418
431
|
<ul>
|
|
419
432
|
<li><sub><code>/v1/icon/{glyph}/{genome}.static?shape={circle|square}&variant={variant}</code></sub></li>
|
|
@@ -42,6 +42,13 @@ dependencies = [
|
|
|
42
42
|
"httpx[http2]>=0.28",
|
|
43
43
|
"fastmcp>=3.0",
|
|
44
44
|
"pyyaml>=6.0",
|
|
45
|
+
# Font subsetting (v0.3.7). Runtime — not dev-only — because
|
|
46
|
+
# render/fonts.py imports fontTools at module top-level, which
|
|
47
|
+
# executes on every receipt render. brotli is the WOFF2 codec
|
|
48
|
+
# fontTools uses inside font.save(flavor="woff2") and must be
|
|
49
|
+
# importable on every install (uv tool install, pip install, etc.).
|
|
50
|
+
"fonttools>=4.62.1",
|
|
51
|
+
"brotli>=1.2.0",
|
|
45
52
|
]
|
|
46
53
|
|
|
47
54
|
[project.urls]
|
|
@@ -81,8 +88,6 @@ dev = [
|
|
|
81
88
|
"mypy>=1.14",
|
|
82
89
|
"types-pyyaml>=6.0.12.20250915",
|
|
83
90
|
"pre-commit>=4.0",
|
|
84
|
-
"fonttools>=4.62.1",
|
|
85
|
-
"brotli>=1.2.0",
|
|
86
91
|
]
|
|
87
92
|
|
|
88
93
|
[tool.pytest.ini_options]
|
|
@@ -1691,6 +1691,18 @@ def main() -> None:
|
|
|
1691
1691
|
parser.add_argument("--live", action="store_true", help="Include network-dependent artifacts")
|
|
1692
1692
|
args = parser.parse_args()
|
|
1693
1693
|
|
|
1694
|
+
# Wipe outputs/proofset/ before regenerating so renamed/retired artifacts
|
|
1695
|
+
# (paired-variant pairings, telemetry size variants) don't carry stale
|
|
1696
|
+
# payloads forward and create false audit noise. READMEs live one level up
|
|
1697
|
+
# (outputs/README*.md) and are preserved.
|
|
1698
|
+
import shutil
|
|
1699
|
+
|
|
1700
|
+
proofset_dir = OUT / "proofset"
|
|
1701
|
+
if proofset_dir.exists():
|
|
1702
|
+
stale = sum(1 for _ in proofset_dir.rglob("*.svg"))
|
|
1703
|
+
shutil.rmtree(proofset_dir)
|
|
1704
|
+
print(f"Cleaned {stale} stale artifacts from {proofset_dir}")
|
|
1705
|
+
|
|
1694
1706
|
print("Generating static proof set...")
|
|
1695
1707
|
total = generate_static()
|
|
1696
1708
|
print(f" {total} static artifacts")
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.3.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 3,
|
|
21
|
+
__version__ = version = '0.3.8'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 3, 8)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -19,63 +19,49 @@ _BRIDGE_FRAMES: frozenset[str] = frozenset({FrameType.BADGE, FrameType.STRIP, Fr
|
|
|
19
19
|
# Marquee frame types — need frame_fill, status colors, ink tiers
|
|
20
20
|
_MARQUEE_FRAMES: frozenset[str] = frozenset({FrameType.MARQUEE_HORIZONTAL})
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
# Slugs match the keys in ``data/fonts/{slug}.b64`` and the entries in genome
|
|
30
|
-
# ``fonts`` lists. The intersection of the genome's font list and a frame's
|
|
31
|
-
# allowed slugs is what actually gets embedded.
|
|
22
|
+
|
|
23
|
+
# Font embedding gate: per-(genome_id, frame_type) lookup against the YAML
|
|
24
|
+
# config at ``data/font-embedding.yaml``. Replaces the v0.3.5 frozenset
|
|
25
|
+
# table that was keyed only by frame_type — which meant the brutalist
|
|
26
|
+
# badge embedded the genome's full font list (~28KB of unused Barlow
|
|
27
|
+
# Condensed base64) because the genome declared Barlow for stats/strip/
|
|
28
|
+
# chart and the badge frame's allowlist passed it through.
|
|
32
29
|
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
_TELEMETRY_FONTS: frozenset[str] = frozenset({"jetbrains-mono", "orbitron", "chakra-petch"})
|
|
50
|
-
|
|
51
|
-
_NEEDS_FONTS: dict[str, frozenset[str]] = {
|
|
52
|
-
FrameType.BADGE: _BRUTALIST_FONTS,
|
|
53
|
-
FrameType.STRIP: _BRUTALIST_FONTS,
|
|
54
|
-
FrameType.STATS: _BRUTALIST_FONTS,
|
|
55
|
-
FrameType.CHART: _CHART_FONTS,
|
|
56
|
-
FrameType.MARQUEE_HORIZONTAL: frozenset({"orbitron"}),
|
|
57
|
-
FrameType.RECEIPT: _TELEMETRY_FONTS,
|
|
58
|
-
FrameType.RHYTHM_STRIP: _TELEMETRY_FONTS,
|
|
59
|
-
FrameType.MASTER_CARD: _TELEMETRY_FONTS,
|
|
60
|
-
FrameType.CATALOG: _TELEMETRY_FONTS,
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def frame_needs_fonts(frame_type: str) -> bool:
|
|
65
|
-
"""Per-frame font-loading gate. Returns True if any fonts should be
|
|
66
|
-
embedded for this frame type. Frames absent from the ``_NEEDS_FONTS`` dict
|
|
67
|
-
return False — icon and divider render glyph-only with no ``<text>``
|
|
68
|
-
elements, so embedding fonts in them is pure payload waste.
|
|
30
|
+
# The genome-aware lookup lets the brutalist badge embed only JetBrains
|
|
31
|
+
# Mono (the one font its CSS classes actually reference) while the
|
|
32
|
+
# brutalist stats card continues to embed all three fonts it needs.
|
|
33
|
+
# Adding a new (genome, frame) binding is a YAML edit only (Invariant 12).
|
|
34
|
+
def fonts_for_frame(frame_type: str, genome_id: str = "") -> frozenset[str]:
|
|
35
|
+
"""Return the font slugs to embed for ``(frame_type, genome_id)``.
|
|
36
|
+
|
|
37
|
+
When ``genome_id`` matches a row in ``font-embedding.yaml``'s
|
|
38
|
+
``genomes`` block, returns that row's per-frame list. Otherwise
|
|
39
|
+
falls back to ``defaults.<frame_type>`` — an empty list in v0.3.7,
|
|
40
|
+
matching icon/divider semantics for callers without resolved genome
|
|
41
|
+
context (e.g. ``_error_badge``).
|
|
42
|
+
|
|
43
|
+
The composer further intersects this with the genome's declared
|
|
44
|
+
``fonts`` list at ``compose/context.py:_load_font_faces``, so a slug
|
|
45
|
+
listed here that the genome does not declare is a noop.
|
|
69
46
|
"""
|
|
70
|
-
|
|
47
|
+
from hyperweave.config.loader import load_font_embedding
|
|
48
|
+
|
|
49
|
+
embedding = load_font_embedding()
|
|
50
|
+
genome_block = embedding["genomes"].get(genome_id) if genome_id else None
|
|
51
|
+
if isinstance(genome_block, dict) and frame_type in genome_block:
|
|
52
|
+
slugs = genome_block.get(frame_type) or []
|
|
53
|
+
else:
|
|
54
|
+
slugs = embedding["defaults"].get(frame_type) or []
|
|
55
|
+
return frozenset(slugs)
|
|
71
56
|
|
|
72
57
|
|
|
73
|
-
def
|
|
74
|
-
"""
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
58
|
+
def frame_needs_fonts(frame_type: str, genome_id: str = "") -> bool:
|
|
59
|
+
"""Per-(frame_type, genome_id) font-loading gate. Returns True when
|
|
60
|
+
any fonts should be embedded — used by context-builder to gate the
|
|
61
|
+
``data-hw-fonts="self-contained"`` SVG-root attribute and the
|
|
62
|
+
``hw:css-modules`` debug comment.
|
|
63
|
+
"""
|
|
64
|
+
return bool(fonts_for_frame(frame_type, genome_id))
|
|
79
65
|
|
|
80
66
|
|
|
81
67
|
# Genome fields that signal a telemetry skin (presence-gates the tool-color CSS block)
|