hyperweave 0.3.2__tar.gz → 0.3.3__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.2 → hyperweave-0.3.3}/CHANGELOG.md +17 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/PKG-INFO +3 -3
- {hyperweave-0.3.2 → hyperweave-0.3.3}/README.md +2 -2
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/_version.py +2 -2
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/cli.py +38 -25
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/layout.py +72 -27
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolver.py +81 -16
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/models.py +11 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/paradigm.py +41 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/brutalist.json +36 -18
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/brutalist.yaml +24 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/chart_engine.py +7 -1
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/receipt_paths.py +23 -13
- hyperweave-0.3.3/src/hyperweave/templates/components/chart-milestone-brutalist.svg.j2 +37 -0
- hyperweave-0.3.3/src/hyperweave/templates/frames/badge/brutalist-dark-content.j2 +95 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-dark-content.j2 +15 -7
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +91 -9
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-light-content.j2 +17 -7
- hyperweave-0.3.3/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +49 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/divider.svg.j2 +22 -10
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-light-content.j2 +12 -3
- hyperweave-0.3.3/tests/test_badge_brutalist_dark.py +343 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chart_engine.py +7 -3
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chromatic_coverage_validator.py +29 -8
- hyperweave-0.3.3/tests/test_divider_genome_specific.py +244 -0
- hyperweave-0.3.3/tests/test_receipt_paths.py +165 -0
- hyperweave-0.3.3/tests/test_stats_brutalist.py +125 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry_integration.py +75 -12
- hyperweave-0.3.2/src/hyperweave/templates/frames/badge/brutalist-dark-content.j2 +0 -55
- hyperweave-0.3.2/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +0 -39
- hyperweave-0.3.2/tests/test_divider_genome_specific.py +0 -93
- hyperweave-0.3.2/tests/test_receipt_paths.py +0 -129
- {hyperweave-0.3.2 → hyperweave-0.3.3}/.dockerignore +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/.github/workflows/ci.yml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/.github/workflows/deploy.yml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/.github/workflows/publish.yml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/.gitignore +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/.pre-commit-config.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/Dockerfile +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/LICENSE +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/buttons/button-liquid.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-butterfly.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-python.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-sunflower.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-waves.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/banner.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/strip.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/banner.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/github.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/x.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/strip.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/master_card.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt_claude-code_medium.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt_codex_large.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt_voltage_xlarge.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/rhythm_strip.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/rhythm_strip_voltage_xlarge.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/footers/inneraura-footer-liquid.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/footers/inneraura-footer-purple.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/footers/inneraura-footer.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/hyperweave-banner.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-discord.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-docs.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-github.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-x.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/marquees/badge-showcase-triple.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/marquees/genome-marquee-triple.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/marquees/sample-badges.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/404.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/callout-icons.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/divider.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/favicon.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/hero-banner.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/loader.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/og-image.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/timelines/hyperweave-roadmap.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/favicon.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/hyperweave-banner.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/hyperweave-navbar-logo.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/og-image.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/architecture.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/camo-compatibility.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/cim-compliance.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/genome-profile-system.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/metadata-tiers.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/add-motion-to-badges.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/create-session-receipts.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/use-live-data-badges.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/introduction.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/mint.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/quickstart.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/cli.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/compose-spec.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/genomes.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/http-api.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/mcp-tools.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/motions.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/telemetry-contract.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/spec/hyperweave-protocol.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/tutorials/compose-your-first-badge.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/tutorials/install-session-telemetry.mdx +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/fly.toml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/hooks/install.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/hooks/session_end.sh +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/justfile +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/pyproject.toml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/extract_font_metrics.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/extract_glyphs.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/generate_proofset.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/probe_live_stats.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/probe_star_history.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/stress_test.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/__main__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/assembler.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/bar_chart.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/context.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/engine.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/lanes.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/palette.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/reasoning.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolvers/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolvers/chart.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolvers/stats.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/rhythm.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/rhythm_strip.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/treemap.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/validate_paradigms.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/genome_validator.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/loader.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/registry.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/settings.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/arxiv.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/base.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/cache.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/github.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/rest.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/cell_layout.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/color.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/contracts.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/enums.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/font_metrics.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/schema.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/state.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/text.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/thresholds.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/badge_modes.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/accessibility.css +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/bridge.css +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/expression.css +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/status.css +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/chakra-petch.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/inter.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/jetbrains-mono.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/orbitron.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-700.b64 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-700.meta.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-900.b64 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-900.meta.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/chakra-petch.b64 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/chakra-petch.meta.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/automata.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/chrome.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-claude-code.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-codex.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-cream.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-voltage.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/glyphs.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/static.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/cellular.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/chrome.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/default.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/policies/normal.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/policies/permissive.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/policies/ungoverned.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/chrome.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/reasoning/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/reasoning/brutalist.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/specimens.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/runtimes/claude-code.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/runtimes/codex.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/arrow.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/aurora.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/beacon.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/bracket3d.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/chevron.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/crosshair.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/diamond.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rocket.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/bar.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/straight.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/wave.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/stijl.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/kit.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/mcp/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/mcp/__main__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/mcp/server.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/py.typed +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/fonts.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/glyphs.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/motion.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/templates.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/serve/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/serve/app.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/serve/data_tokens.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/capture.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/codex_parser.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/contract.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/corrections.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/cost.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/models.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/parser.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/runtimes.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/stages.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-area.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-axes.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-empty-state.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-gridlines.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/circle.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/diamond.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/endpoint-diamond.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/endpoint-rect.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/rect.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-milestone.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-polyline.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/status.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/document.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/brutalist-light-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/cellular-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/cellular-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/cellular-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/cellular-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/divider/chrome-band.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/cellular-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/cellular-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-overlay.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/cellular-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/cellular-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/cellular-overlay.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-overlay.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/default-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/default-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-dark-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/cellular-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/cellular-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/chrome-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-dark-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-light-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/cellular-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/cellular-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/cellular-status.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/partials/provider-glyphs.svg.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/partials/state-signal-cascade.j2 +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/__init__.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/conftest.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/codex_session.jsonl +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/codex_session_patches.jsonl +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/github_contributions/synthetic.html +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/session.json +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/session.jsonl +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/synthetic_session.jsonl +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/helpers.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/snapshots/url_stability/divider_band_chrome_static.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/snapshots/url_stability/icon_github_chrome_static.svg +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_assembler.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_badge_cellular.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_badge_layout.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_badge_mode.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chart_frame.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chrome_variants.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_codex_parser.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_bar_chart.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_rhythm_strip.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_treemap.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_variant_field.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_connectors.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_core.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_data_tokens.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_divider_cellular.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_font_gating.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_font_metrics_chakra.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_genome_automata.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_github_scrape.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_kit.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_marquee_v0_2_16.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_mcp.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_paradigm_cellular.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_paradigm_dispatch.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_paradigm_extensibility.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_parse_transcript_auto.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_proofset.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_receipt_token_compliance.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_render.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_resolver_rhythm.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_runtime_registries.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_serve.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_serve_live_state.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_slot_metric_state.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_state_inference.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_stats_card.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_strip_brutalist_grammar.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_strip_cellular.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_strip_status_toggle.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry_contract_per_stage.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry_skin_dispatch.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_tool_class_completeness.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_url_stability.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_variant_default_resolution.py +0 -0
- {hyperweave-0.3.2 → hyperweave-0.3.3}/uv.lock +0 -0
|
@@ -5,6 +5,23 @@ 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.3] - 2026-05-12
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Receipt filenames** — use consistent underscore separators; the footer displays the same human-readable filename.
|
|
13
|
+
- **Dark brutalist badge panels** — match the prototype: left panel reads `brand_panel_fill`, label reads `ink-primary`, seam-gap rect restored so the divider region renders the same in any markdown viewer.
|
|
14
|
+
- **Badge layout engine** — brutalist badges land every interior gap (accent→glyph, glyph→label, label→seam, seam→value, value→indicator, indicator→right border) on a single 5px rhythm. `measure_text` now consumes the paradigm's declared `value_letter_spacing_em` so the engine reserves the actual rendered width instead of under-counting by `(n-1) * font_size * em`.
|
|
15
|
+
- **Dark brutalist star charts** — header glyph fill routes through `var(--dna-signal)` (was an orphaned brand-text white). 6px solid left accent rail anchors the chart as a Y-axis spine; outer perimeter softens to a 1.5px hairline at 0.25 opacity so the rail dominates the read.
|
|
16
|
+
- **Light scholar star charts** — area gradient resolves through each variant's panel color across all 6 light variants instead of falling back to the seam color. Substrate-aware paper grain with multiply blend; perimeter inset and grain layer order match the prototype.
|
|
17
|
+
- **Activity graph bars** — light scholar stat cards use the correct accent color.
|
|
18
|
+
- **Divider tick marks** — resolve through the genome palette instead of a hardcoded green.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **Star chart milestone callouts** — now include date context (e.g. `1K · JAN 24`) so the chart is self-documenting without cross-referencing external star history tools.
|
|
23
|
+
- **Star chart milestone markers** — data points use a filled square marker (■) to visually distinguish them from the regular interval crosshair (+) markers.
|
|
24
|
+
|
|
8
25
|
## [0.3.2] - 2026-05-11
|
|
9
26
|
|
|
10
27
|
Brutalist gets 12 variants split by substrate: 6 dark monochromes (celadon, carbon, alloy, temper, pigment, ember) and 6 light scholars (archive, signal, pulse, depth, afterimage, primer). Metadata pipeline wires 12 fields that were silently hardcoded. Per-frame reasoning populates `hw:reasoning` from per-genome YAML.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyperweave
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
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
|
|
@@ -197,11 +197,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
197
197
|
<tr>
|
|
198
198
|
<th align="left">Dashboard<br/><sub>strip</sub></th>
|
|
199
199
|
<td>
|
|
200
|
-
<img src="https://hyperweave.app/v1/strip/
|
|
200
|
+
<img src="https://hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon" alt="strip"/>
|
|
201
201
|
<br/>
|
|
202
202
|
<ul>
|
|
203
203
|
<li><sub><code>/v1/strip/{title}/{genome}.static?data={tokens}&subtitle={text}&glyph={glyph}&variant={variant}</code></sub></li>
|
|
204
|
-
<li><sub><code>hyperweave.app/v1/strip/
|
|
204
|
+
<li><sub><code>hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon</code></sub></li>
|
|
205
205
|
</ul>
|
|
206
206
|
</td>
|
|
207
207
|
</tr>
|
|
@@ -165,11 +165,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
165
165
|
<tr>
|
|
166
166
|
<th align="left">Dashboard<br/><sub>strip</sub></th>
|
|
167
167
|
<td>
|
|
168
|
-
<img src="https://hyperweave.app/v1/strip/
|
|
168
|
+
<img src="https://hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon" alt="strip"/>
|
|
169
169
|
<br/>
|
|
170
170
|
<ul>
|
|
171
171
|
<li><sub><code>/v1/strip/{title}/{genome}.static?data={tokens}&subtitle={text}&glyph={glyph}&variant={variant}</code></sub></li>
|
|
172
|
-
<li><sub><code>hyperweave.app/v1/strip/
|
|
172
|
+
<li><sub><code>hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon</code></sub></li>
|
|
173
173
|
</ul>
|
|
174
174
|
</td>
|
|
175
175
|
</tr>
|
|
@@ -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.3'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 3, 3)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -361,39 +361,52 @@ def session(
|
|
|
361
361
|
|
|
362
362
|
frame_type = "receipt" if action == "receipt" else "rhythm-strip"
|
|
363
363
|
genome_slug = _normalize_genome_slug(genome) if genome else ""
|
|
364
|
+
|
|
365
|
+
# Pre-compute the receipt's on-disk filename (when applicable) so the
|
|
366
|
+
# footer can render the same human-readable basename as the file the
|
|
367
|
+
# user sees. The compose pipeline reads receipt_filename_hint when set;
|
|
368
|
+
# an empty hint falls back to the legacy UUID-path footer (HTTP / MCP).
|
|
369
|
+
filename_hint = ""
|
|
370
|
+
if action == "receipt" and not output:
|
|
371
|
+
from datetime import datetime as _dt
|
|
372
|
+
|
|
373
|
+
from hyperweave.telemetry.receipt_paths import receipt_filename
|
|
374
|
+
|
|
375
|
+
sess = contract.get("session", {})
|
|
376
|
+
sid = sess.get("id", "unknown")
|
|
377
|
+
session_name = sess.get("name", "")
|
|
378
|
+
start_iso = sess.get("start", "")
|
|
379
|
+
try:
|
|
380
|
+
ts = _dt.fromisoformat(start_iso)
|
|
381
|
+
except (TypeError, ValueError):
|
|
382
|
+
ts = _dt.now()
|
|
383
|
+
user_events = contract.get("user_events", []) or []
|
|
384
|
+
first_prompt = user_events[0].get("preview", "") if user_events else ""
|
|
385
|
+
hw_dir = Path(".hyperweave") / "receipts"
|
|
386
|
+
hw_dir.mkdir(parents=True, exist_ok=True)
|
|
387
|
+
output = hw_dir / receipt_filename(
|
|
388
|
+
timestamp=ts,
|
|
389
|
+
session_name=session_name,
|
|
390
|
+
session_id=sid,
|
|
391
|
+
prompt_text=first_prompt,
|
|
392
|
+
)
|
|
393
|
+
filename_hint = output.name
|
|
394
|
+
elif action == "receipt" and output:
|
|
395
|
+
# Explicit --output: the user picked a basename; surface it.
|
|
396
|
+
filename_hint = output.name
|
|
397
|
+
|
|
364
398
|
spec = ComposeSpec(
|
|
365
399
|
type=frame_type,
|
|
366
400
|
genome_id=genome_slug,
|
|
367
401
|
telemetry_data=contract,
|
|
402
|
+
receipt_filename_hint=filename_hint,
|
|
368
403
|
)
|
|
369
404
|
result = do_compose(spec)
|
|
370
405
|
|
|
371
406
|
if action == "receipt":
|
|
372
|
-
#
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
from hyperweave.telemetry.receipt_paths import receipt_filename
|
|
377
|
-
|
|
378
|
-
sess = contract.get("session", {})
|
|
379
|
-
sid = sess.get("id", "unknown")
|
|
380
|
-
session_name = sess.get("name", "")
|
|
381
|
-
start_iso = sess.get("start", "")
|
|
382
|
-
try:
|
|
383
|
-
ts = _dt.fromisoformat(start_iso)
|
|
384
|
-
except (TypeError, ValueError):
|
|
385
|
-
ts = _dt.now()
|
|
386
|
-
user_events = contract.get("user_events", []) or []
|
|
387
|
-
first_prompt = user_events[0].get("preview", "") if user_events else ""
|
|
388
|
-
hw_dir = Path(".hyperweave") / "receipts"
|
|
389
|
-
hw_dir.mkdir(parents=True, exist_ok=True)
|
|
390
|
-
output = hw_dir / receipt_filename(
|
|
391
|
-
timestamp=ts,
|
|
392
|
-
session_name=session_name,
|
|
393
|
-
session_id=sid,
|
|
394
|
-
prompt_text=first_prompt,
|
|
395
|
-
)
|
|
396
|
-
|
|
407
|
+
# output is guaranteed non-None here: the receipt branch above either
|
|
408
|
+
# received an explicit --output or computed a default path.
|
|
409
|
+
assert output is not None
|
|
397
410
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
398
411
|
output.write_text(result.svg)
|
|
399
412
|
|
|
@@ -110,6 +110,8 @@ def compute_badge_layout(
|
|
|
110
110
|
value_font_size: float,
|
|
111
111
|
right_canvas_inset: int = 0,
|
|
112
112
|
min_total_w: int = 60,
|
|
113
|
+
inner_bit_ratio: float = 0.5,
|
|
114
|
+
rhythm_gap: int = 0,
|
|
113
115
|
) -> BadgeLayout:
|
|
114
116
|
"""Compute every position the badge templates need from input measurements.
|
|
115
117
|
|
|
@@ -121,44 +123,83 @@ def compute_badge_layout(
|
|
|
121
123
|
|
|
122
124
|
The centering correctness is verified by ``tests/test_badge_layout``
|
|
123
125
|
against short / long / version / license / python_requires values.
|
|
126
|
+
|
|
127
|
+
When ``rhythm_gap > 0`` (brutalist v0.3.3 sets 8), the layout collapses
|
|
128
|
+
every interior gap to a single value: accent_right→glyph_left,
|
|
129
|
+
glyph_right→label_first, label_last→seam_left, seam_right→value_first,
|
|
130
|
+
value_last→indicator_left, indicator_right→right_border. Caller must
|
|
131
|
+
also set ``ind_pad_r=rhythm_gap`` so the indicator gaps land on the
|
|
132
|
+
same rhythm.
|
|
124
133
|
"""
|
|
125
134
|
# Glyph pixel position. Mirrors resolver.py logic: paradigms with a
|
|
126
135
|
# left-edge decoration zone (cellular pattern strip x=2..~20) reserve
|
|
127
136
|
# space via ``glyph_left_offset``; brutalist/chrome declare 0.
|
|
137
|
+
# When rhythm_gap is set, the glyph sits exactly ``rhythm_gap`` right
|
|
138
|
+
# of the accent bar so the accent→glyph gap matches the global rhythm.
|
|
128
139
|
if has_glyph:
|
|
129
|
-
|
|
130
|
-
|
|
140
|
+
if rhythm_gap > 0:
|
|
141
|
+
glyph_x = accent_w + rhythm_gap + glyph_left_offset
|
|
142
|
+
else:
|
|
143
|
+
glyph_x = (inset + accent_w + 4) if inset else (accent_w + 3)
|
|
144
|
+
glyph_x += glyph_left_offset
|
|
131
145
|
glyph_y = round((height - glyph_size) / 2, 1)
|
|
132
146
|
else:
|
|
133
147
|
glyph_x, glyph_y = 0, 0.0
|
|
134
148
|
|
|
135
149
|
# Label area starts after the glyph (or after the accent + paradigm
|
|
136
|
-
# left-edge decoration when there's no glyph).
|
|
137
|
-
#
|
|
138
|
-
#
|
|
139
|
-
|
|
150
|
+
# left-edge decoration when there's no glyph). When rhythm_gap > 0,
|
|
151
|
+
# the glyph→label gap (with-glyph) and accent→label gap (no-glyph)
|
|
152
|
+
# both equal rhythm_gap.
|
|
153
|
+
if rhythm_gap > 0:
|
|
154
|
+
label_start = (glyph_x + glyph_size + rhythm_gap) if has_glyph else (accent_w + rhythm_gap + glyph_left_offset)
|
|
155
|
+
else:
|
|
156
|
+
label_start = (glyph_x + glyph_size + glyph_gap) if has_glyph else (accent_w + 6 + glyph_left_offset)
|
|
140
157
|
|
|
141
158
|
# Left panel width — fits the label plus paradigm-driven right padding.
|
|
142
|
-
label_pad_r =
|
|
159
|
+
# rhythm_gap mode forces label_pad_r = rhythm_gap so label_last→seam_left
|
|
160
|
+
# equals the global rhythm. Legacy mode keeps the 9 (mono) / 8 (non-mono)
|
|
161
|
+
# default tuned for chrome/cellular's denser label kerning.
|
|
162
|
+
label_pad_r = rhythm_gap if rhythm_gap > 0 else (9 if use_mono else 8)
|
|
143
163
|
left_panel = round(label_start + measured_label_w + label_pad_r)
|
|
144
164
|
left_panel = max(left_panel, 30)
|
|
145
165
|
|
|
146
|
-
# Label text center
|
|
147
|
-
#
|
|
148
|
-
#
|
|
149
|
-
|
|
150
|
-
|
|
166
|
+
# Label text center. Legacy mode centers the label in [label_start,
|
|
167
|
+
# label_area_end] with a 6px shy-from-seam adjustment for uppercase
|
|
168
|
+
# labels. rhythm_gap mode aligns label_first with label_start exactly
|
|
169
|
+
# (label_x = label_start + w/2) so the accent_right→label_first gap
|
|
170
|
+
# lands at ``rhythm_gap`` regardless of label_w. The legacy area-center
|
|
171
|
+
# formula leaves a (panel_w - label_w)/2 interior gutter inside the
|
|
172
|
+
# label area, which collapses the structural gap to ~(rhythm_gap +
|
|
173
|
+
# interior_gutter)/2 — visible as 12.2/4.2 asymmetry on a 35.64px
|
|
174
|
+
# label in a 44px area when targeting an 8px rhythm.
|
|
175
|
+
if rhythm_gap > 0:
|
|
176
|
+
label_area_end = left_panel
|
|
177
|
+
label_x = round(label_start + measured_label_w / 2, 1)
|
|
178
|
+
else:
|
|
179
|
+
label_area_end = left_panel - (6 if label_uppercase else 0)
|
|
180
|
+
label_x = round((label_start + label_area_end) / 2, 1)
|
|
151
181
|
|
|
152
182
|
# Right-panel allocation. ``ls_extra`` accounts for non-mono letter-
|
|
153
183
|
# spacing overrun (each char carries 0.4 of trailing tracking).
|
|
154
184
|
indicator_alloc = (indicator_size + ind_pad_r) if show_indicator else 0
|
|
155
185
|
ls_extra = value_raw_len * 0.4 if (not use_mono and value_raw_len) else 0
|
|
156
|
-
#
|
|
157
|
-
#
|
|
158
|
-
#
|
|
159
|
-
#
|
|
160
|
-
#
|
|
161
|
-
|
|
186
|
+
# Gap between value text right edge and the indicator's left edge. For
|
|
187
|
+
# stateful badges this mirrors ``ind_pad_r`` (gap right of indicator) so
|
|
188
|
+
# the indicator sits with equal interior padding on both sides — the
|
|
189
|
+
# cohesive-balance contract the brutalist v16 prototype encodes. For
|
|
190
|
+
# stateless badges there's no indicator, so the trailing pad collapses
|
|
191
|
+
# to ``val_min_gap`` (3px tight right gutter; tighter than the stateful
|
|
192
|
+
# symmetric gap because there's no marker to balance against).
|
|
193
|
+
text_to_indicator_gap = ind_pad_r if show_indicator else val_min_gap
|
|
194
|
+
# rhythm_gap mode overrides ``val_pad_l`` (seam→value gap) to the
|
|
195
|
+
# global rhythm. Legacy mode keeps the resolver-supplied val_pad_l
|
|
196
|
+
# (3px) for chrome/cellular/default paradigms.
|
|
197
|
+
effective_val_pad_l = rhythm_gap if rhythm_gap > 0 else val_pad_l
|
|
198
|
+
# right_panel reserves: effective_val_pad_l (left interior gutter), the
|
|
199
|
+
# measured value text + letter-spacing overrun, text_to_indicator_gap
|
|
200
|
+
# (right interior gutter), and indicator_alloc when stateful. Symmetric
|
|
201
|
+
# stateful: text + ind_pad_r + indicator_size + ind_pad_r.
|
|
202
|
+
right_panel = effective_val_pad_l + measured_value_w + ls_extra + text_to_indicator_gap + indicator_alloc
|
|
162
203
|
total_w = round(left_panel + sep_w + seam_w + right_panel)
|
|
163
204
|
total_w = max(total_w, min_total_w)
|
|
164
205
|
|
|
@@ -176,13 +217,14 @@ def compute_badge_layout(
|
|
|
176
217
|
# which is the midpoint of [zone_left, indicator_left_edge], not
|
|
177
218
|
# [zone_left, zone_right]. Old formula skewed text by val_min_gap/2
|
|
178
219
|
# toward the indicator and was undefined when no indicator rendered.
|
|
179
|
-
value_zone_left = right_panel_x +
|
|
220
|
+
value_zone_left = right_panel_x + effective_val_pad_l
|
|
180
221
|
# When stateless (no indicator), the slab's right edge is total_w minus
|
|
181
|
-
# any paradigm-specific canvas inset (cellular: 2; brutalist/chrome: 0)
|
|
182
|
-
# val_min_gap
|
|
183
|
-
#
|
|
184
|
-
#
|
|
185
|
-
|
|
222
|
+
# any paradigm-specific canvas inset (cellular: 2; brutalist/chrome: 0)
|
|
223
|
+
# minus val_min_gap (tight 3px trailing pad). When stateful, the right
|
|
224
|
+
# edge sits ind_pad_r inside the indicator's left edge — mirroring the
|
|
225
|
+
# right-of-indicator gap so the indicator reads as equidistant from
|
|
226
|
+
# the value text and from the badge's right border.
|
|
227
|
+
value_zone_right = (indicator_x - ind_pad_r) if show_indicator else (total_w - right_canvas_inset - val_min_gap)
|
|
186
228
|
value_zone_width = value_zone_right - value_zone_left
|
|
187
229
|
value_x = round((value_zone_left + value_zone_right) / 2, 1)
|
|
188
230
|
|
|
@@ -196,9 +238,12 @@ def compute_badge_layout(
|
|
|
196
238
|
indicator_y = round(text_y - value_font_size * 0.3 - indicator_size / 2, 1)
|
|
197
239
|
|
|
198
240
|
# Indicator inner-bit geometry — moved from cellular/brutalist
|
|
199
|
-
# template-side arithmetic.
|
|
200
|
-
#
|
|
201
|
-
|
|
241
|
+
# template-side arithmetic. v0.3.3 generalizes the ratio so brutalist
|
|
242
|
+
# can render the prototype's 6/10 (0.6) bit instead of the cellular
|
|
243
|
+
# 4/8 (0.5) default — caller passes a paradigm-driven ratio. Rounded
|
|
244
|
+
# to the nearest integer so the bit lands on a pixel grid; offset is
|
|
245
|
+
# the half-difference, which can be a half-pixel for odd ratios.
|
|
246
|
+
inner_bit_w = round(indicator_size * inner_bit_ratio)
|
|
202
247
|
inner_bit_offset = (indicator_size - inner_bit_w) / 2
|
|
203
248
|
|
|
204
249
|
return BadgeLayout(
|
|
@@ -335,8 +335,30 @@ def resolve_badge(
|
|
|
335
335
|
if badge_cfg_for_seam and badge_cfg_for_seam.seam_w > 0
|
|
336
336
|
else profile.get("badge_seam_width", 3)
|
|
337
337
|
)
|
|
338
|
-
|
|
339
|
-
ind_pad_r
|
|
338
|
+
# Indicator geometry: paradigm overrides profile defaults. Brutalist v0.3.3
|
|
339
|
+
# declares 10x10 + ind_pad_r=10 to match the v16 prototype's translate(138,5);
|
|
340
|
+
# chrome and cellular continue to fall back to their profile defaults.
|
|
341
|
+
badge_cfg_for_indicator = paradigm_spec.badge if paradigm_spec else None
|
|
342
|
+
indicator_size = (
|
|
343
|
+
badge_cfg_for_indicator.indicator_size
|
|
344
|
+
if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_size > 0
|
|
345
|
+
else profile.get("badge_indicator_size", 8)
|
|
346
|
+
)
|
|
347
|
+
ind_pad_r = (
|
|
348
|
+
badge_cfg_for_indicator.indicator_pad_r
|
|
349
|
+
if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_pad_r > 0
|
|
350
|
+
else profile.get("badge_indicator_pad_r", 8)
|
|
351
|
+
)
|
|
352
|
+
indicator_stroke_width = (
|
|
353
|
+
badge_cfg_for_indicator.indicator_stroke_width
|
|
354
|
+
if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_stroke_width > 0
|
|
355
|
+
else 1.2
|
|
356
|
+
)
|
|
357
|
+
indicator_inner_bit_ratio = (
|
|
358
|
+
badge_cfg_for_indicator.indicator_inner_bit_ratio
|
|
359
|
+
if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_inner_bit_ratio > 0
|
|
360
|
+
else 0.5
|
|
361
|
+
)
|
|
340
362
|
inset = profile.get("badge_inset", 0)
|
|
341
363
|
# text_y_factor from paradigm (cellular uses 0.656 matching spec y=21 at
|
|
342
364
|
# h=32; brutalist/chrome use 0.69 baseline). One place drives the math.
|
|
@@ -364,18 +386,26 @@ def resolve_badge(
|
|
|
364
386
|
_label_size = max(round(_label_size * 0.78), 6)
|
|
365
387
|
_value_size = max(round(_value_size * 0.78), 7)
|
|
366
388
|
|
|
367
|
-
#
|
|
368
|
-
#
|
|
369
|
-
#
|
|
370
|
-
#
|
|
371
|
-
#
|
|
389
|
+
# Letter-spacing values come from the paradigm's badge config so
|
|
390
|
+
# measure_text reserves the exact width the template will render. The
|
|
391
|
+
# paradigm's declared values are the canonical source; the
|
|
392
|
+
# ``0.06 if use_mono else 0.0`` fallback preserves pre-v0.3.3 behavior
|
|
393
|
+
# for paradigms (cellular, default) that haven't declared their badge
|
|
394
|
+
# letter-spacing yet. measure_text applies ``(max(0, N-1) * font_size
|
|
395
|
+
# * em)`` internally — single source of truth in core/text.py.
|
|
396
|
+
_label_ls_em = (
|
|
397
|
+
paradigm_spec.badge.label_letter_spacing_em
|
|
398
|
+
if paradigm_spec and paradigm_spec.badge.label_letter_spacing_em > 0
|
|
399
|
+
else (0.06 if use_mono else 0.0)
|
|
400
|
+
)
|
|
401
|
+
_value_ls_em = paradigm_spec.badge.value_letter_spacing_em if paradigm_spec else 0.0
|
|
372
402
|
lw = (
|
|
373
403
|
measure_text(
|
|
374
404
|
label_display,
|
|
375
405
|
font_family=_label_family,
|
|
376
406
|
font_size=_label_size,
|
|
377
407
|
font_weight=400 if use_mono else 700,
|
|
378
|
-
letter_spacing_em=
|
|
408
|
+
letter_spacing_em=_label_ls_em,
|
|
379
409
|
)
|
|
380
410
|
if label_display
|
|
381
411
|
else 0.0
|
|
@@ -386,6 +416,7 @@ def resolve_badge(
|
|
|
386
416
|
font_family=_value_family,
|
|
387
417
|
font_size=_value_size,
|
|
388
418
|
font_weight=_value_weight,
|
|
419
|
+
letter_spacing_em=_value_ls_em,
|
|
389
420
|
)
|
|
390
421
|
if value_raw
|
|
391
422
|
else 0.0
|
|
@@ -426,6 +457,16 @@ def resolve_badge(
|
|
|
426
457
|
# All badge geometry now lives in compose/layout.py — single source of
|
|
427
458
|
# truth, unit-tested independently. The v0.2.25 centering fix is in there
|
|
428
459
|
# (value_x = zone_center, not midpoint of unrelated bounds).
|
|
460
|
+
# Uniform-rhythm gap: when the paradigm declares a positive
|
|
461
|
+
# ``rhythm_gap`` (brutalist v0.3.3 sets 8), every interior gap of the
|
|
462
|
+
# badge composition (accent→glyph or accent→label, glyph→label,
|
|
463
|
+
# label→seam, seam→value, value→indicator, indicator→right border)
|
|
464
|
+
# collapses to that single value. Paradigms that don't declare it
|
|
465
|
+
# (chrome / cellular / default) receive 0 and keep their legacy layout
|
|
466
|
+
# constants. When rhythm_gap > 0, ``ind_pad_r`` is also forced to the
|
|
467
|
+
# same value so the value→indicator and indicator→right-border gaps
|
|
468
|
+
# match the rest of the rhythm.
|
|
469
|
+
rhythm_gap = paradigm_spec.badge.rhythm_gap if paradigm_spec else 0
|
|
429
470
|
layout = compute_badge_layout(
|
|
430
471
|
height=height,
|
|
431
472
|
measured_label_w=lw,
|
|
@@ -449,6 +490,8 @@ def resolve_badge(
|
|
|
449
490
|
right_canvas_inset=right_canvas_inset,
|
|
450
491
|
text_y_factor=text_y_factor,
|
|
451
492
|
value_font_size=_value_size,
|
|
493
|
+
inner_bit_ratio=indicator_inner_bit_ratio,
|
|
494
|
+
rhythm_gap=rhythm_gap,
|
|
452
495
|
)
|
|
453
496
|
|
|
454
497
|
# Variant resolution and profile visual context (envelope, well, specular,
|
|
@@ -483,6 +526,7 @@ def resolve_badge(
|
|
|
483
526
|
"indicator_size": layout.indicator_size,
|
|
484
527
|
"inner_bit_w": layout.inner_bit_w,
|
|
485
528
|
"inner_bit_offset": layout.inner_bit_offset,
|
|
529
|
+
"indicator_stroke_width": indicator_stroke_width,
|
|
486
530
|
"accent_bar_width": accent_w,
|
|
487
531
|
"has_glyph": has_glyph,
|
|
488
532
|
"show_indicator": layout.show_indicator,
|
|
@@ -1100,10 +1144,18 @@ def resolve_divider(
|
|
|
1100
1144
|
"divider_label": spec.value or "",
|
|
1101
1145
|
"variant": spec.variant or "",
|
|
1102
1146
|
# Pass through chrome chromosomes so chrome-band template's envelope_stops
|
|
1103
|
-
# for-loop has data. brutalist-seam needs accent +
|
|
1147
|
+
# for-loop has data. brutalist-seam needs accent + accent_complement (was
|
|
1148
|
+
# accent_signal pre-v0.3.3 — see brutalist-seam.svg.j2 header for the
|
|
1149
|
+
# chromatic-register rationale). zeropoint (editorial default) needs
|
|
1150
|
+
# accent + accent_complement + surface_deep to drive its variant-aware
|
|
1151
|
+
# aurora gradient + nexus beacon without hardcoded chromatic literals.
|
|
1152
|
+
# accent_signal stays in context for backward-compat — currently no
|
|
1153
|
+
# divider template reads it but other surfaces may grow into the field.
|
|
1104
1154
|
"envelope_stops": genome.get("envelope_stops", []),
|
|
1105
1155
|
"accent": genome.get("accent", ""),
|
|
1156
|
+
"accent_complement": genome.get("accent_complement", ""),
|
|
1106
1157
|
"accent_signal": genome.get("accent_signal", ""),
|
|
1158
|
+
"surface_deep": genome.get("surface_2", ""),
|
|
1107
1159
|
}
|
|
1108
1160
|
# Profile visual context now injected centrally by the dispatcher.
|
|
1109
1161
|
|
|
@@ -1704,12 +1756,16 @@ def _truncate_path_left(
|
|
|
1704
1756
|
"""Truncate ``path`` from the LEFT (drop prefix, keep filename end) so the
|
|
1705
1757
|
result fits inside ``max_w`` pixels at 9pt JetBrains Mono.
|
|
1706
1758
|
|
|
1707
|
-
Receipt footer paths
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1759
|
+
Receipt footer paths take one of two shapes depending on the caller:
|
|
1760
|
+
the CLI write path emits a human-readable basename like
|
|
1761
|
+
``20260508_receipt_debug_v0226.svg`` (set via
|
|
1762
|
+
``ComposeSpec.receipt_filename_hint``); HTTP / MCP callers without the
|
|
1763
|
+
hint emit the legacy ``.hyperweave/receipts/<uuid>.svg`` shape. In both
|
|
1764
|
+
cases the *end* of the string carries the most identifying information
|
|
1765
|
+
(the slug or the UUID), and any leading prefix is the lower-signal
|
|
1766
|
+
portion to drop. Left-truncation emits ``…<unique-suffix>`` so a
|
|
1767
|
+
footer line that would otherwise collide with the right-aligned
|
|
1768
|
+
session date stays inside the content track.
|
|
1713
1769
|
|
|
1714
1770
|
Returns the input unchanged when it already fits. Returns the empty
|
|
1715
1771
|
string when ``max_w`` is too small even for a single ellipsis. Width
|
|
@@ -2169,7 +2225,16 @@ def resolve_receipt(
|
|
|
2169
2225
|
git_branch = session.get("git_branch", "")
|
|
2170
2226
|
project_path = session.get("project_path", "")
|
|
2171
2227
|
project_name = Path(project_path).name if project_path else "session"
|
|
2172
|
-
|
|
2228
|
+
# Footer filepath token: prefer the CLI-supplied human-readable basename
|
|
2229
|
+
# (matches the file the user sees on disk — e.g. "20260508_receipt_debug_v0226.svg").
|
|
2230
|
+
# Fall back to the legacy UUID path so HTTP / MCP callers that don't set
|
|
2231
|
+
# receipt_filename_hint keep rendering rather than blanking the footer.
|
|
2232
|
+
if spec.receipt_filename_hint:
|
|
2233
|
+
receipt_path = spec.receipt_filename_hint
|
|
2234
|
+
elif session_id:
|
|
2235
|
+
receipt_path = f".hyperweave/receipts/{session_id}.svg"
|
|
2236
|
+
else:
|
|
2237
|
+
receipt_path = ""
|
|
2173
2238
|
|
|
2174
2239
|
start_iso = session.get("start", "")
|
|
2175
2240
|
start_formatted = ""
|
|
@@ -147,6 +147,17 @@ class ComposeSpec(FrozenModel):
|
|
|
147
147
|
telemetry_data: dict[str, object] | None = Field(
|
|
148
148
|
default=None, description="Session data contract JSON (telemetry frames only)"
|
|
149
149
|
)
|
|
150
|
+
receipt_filename_hint: str = Field(
|
|
151
|
+
default="",
|
|
152
|
+
description=(
|
|
153
|
+
"Human-readable filename basename for the receipt footer (e.g. "
|
|
154
|
+
"'20260508_receipt_debug_v0226.svg'). Set by the CLI write path "
|
|
155
|
+
"after computing the on-disk filename so the footer's filepath "
|
|
156
|
+
"token matches the file the user sees. Empty string falls back "
|
|
157
|
+
"to the legacy '.hyperweave/receipts/{uuid}.svg' path so HTTP / "
|
|
158
|
+
"MCP callers that don't set the hint keep rendering."
|
|
159
|
+
),
|
|
160
|
+
)
|
|
150
161
|
|
|
151
162
|
# -- Divider-specific --
|
|
152
163
|
divider_variant: DividerVariant = Field(
|
|
@@ -283,6 +283,47 @@ class ParadigmBadgeConfig(FrozenModel):
|
|
|
283
283
|
at ``x=2..width-2`` per cellular-content.j2:9). Without this override,
|
|
284
284
|
``value_zone_right`` lands ``right_canvas_inset`` past the actual slab
|
|
285
285
|
edge and drifts the centered value text right by half that amount."""
|
|
286
|
+
indicator_size: int = 0
|
|
287
|
+
"""Optional paradigm-specific indicator side length. ``> 0`` overrides
|
|
288
|
+
the profile's ``badge_indicator_size``. Brutalist v0.3.3 sets 10 to
|
|
289
|
+
match the v16 badge matrix prototype (concentric 10x10 outline + 6x6
|
|
290
|
+
inner bit). Zero (default) defers to the profile."""
|
|
291
|
+
indicator_pad_r: int = 0
|
|
292
|
+
"""Optional paradigm-specific right padding for the indicator. ``> 0``
|
|
293
|
+
overrides the profile's ``badge_indicator_pad_r``. Brutalist v0.3.3
|
|
294
|
+
sets 10 so the 10x10 indicator anchors at x=138 in a 158px badge
|
|
295
|
+
(matches prototype's ``translate(138,5)``). Zero defers to the profile."""
|
|
296
|
+
indicator_stroke_width: float = 0.0
|
|
297
|
+
"""Optional paradigm-specific outer-ring stroke width for the indicator.
|
|
298
|
+
``> 0`` overrides the layout-engine default (1.2). Brutalist v0.3.3
|
|
299
|
+
sets 1.5 to match the prototype's heavier ring weight. Zero defers
|
|
300
|
+
to the default."""
|
|
301
|
+
indicator_inner_bit_ratio: float = 0.0
|
|
302
|
+
"""Optional paradigm-specific inner-bit/outer-ring side-length ratio.
|
|
303
|
+
``> 0`` overrides the layout-engine default (0.5 — bit half of outer).
|
|
304
|
+
Brutalist v0.3.3 sets 0.6 (10→6) to match the prototype's heavier
|
|
305
|
+
inner mark. Zero defers to the default."""
|
|
306
|
+
label_letter_spacing_em: float = 0.0
|
|
307
|
+
"""CSS-rendered ``letter-spacing`` for the label text. Resolver passes
|
|
308
|
+
this to ``measure_text`` so the layout reserves the actual rendered
|
|
309
|
+
width. Pre-v0.3.3 the resolver hardcoded ``0.06 if use_mono else 0.0``;
|
|
310
|
+
paradigm-driven now so brutalist (0.06) and chrome (0.12) declare the
|
|
311
|
+
measurement value alongside the template's ``letter-spacing`` attribute."""
|
|
312
|
+
value_letter_spacing_em: float = 0.0
|
|
313
|
+
"""CSS-rendered ``letter-spacing`` for the value text. Brutalist's value
|
|
314
|
+
text declares ``letter-spacing="0.04em"`` in the template; before this
|
|
315
|
+
field landed the resolver passed ``0.0`` to measure_text and the badge
|
|
316
|
+
layout under-reserved width by ``(n-1) * font_size * 0.04`` — visible as
|
|
317
|
+
the value text overflowing the value zone by ~2.6px on a 7-char value."""
|
|
318
|
+
rhythm_gap: int = 0
|
|
319
|
+
"""When ``> 0``, the badge layout engine uses a uniform interior rhythm:
|
|
320
|
+
every interior gap (accent→glyph, glyph→label, label→seam, seam→value,
|
|
321
|
+
value→indicator, indicator→right border) equals ``rhythm_gap`` pixels.
|
|
322
|
+
Forces ``label_start = accent_w + rhythm_gap``, ``label_pad_r = rhythm_gap``,
|
|
323
|
+
``val_pad_l = rhythm_gap``, ``glyph_gap = rhythm_gap``, and disables the
|
|
324
|
+
uppercase shy-from-seam adjustment. Zero (default) preserves legacy
|
|
325
|
+
layout for chrome/cellular/default paradigms; brutalist sets 8 to match
|
|
326
|
+
the v16 prototype's symmetric composition."""
|
|
286
327
|
|
|
287
328
|
|
|
288
329
|
class ParadigmIconConfig(FrozenModel):
|