hyperweave 0.3.0__tar.gz → 0.3.1__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.0 → hyperweave-0.3.1}/CHANGELOG.md +19 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/PKG-INFO +21 -15
- {hyperweave-0.3.0 → hyperweave-0.3.1}/README.md +20 -14
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/_version.py +2 -2
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/cli.py +21 -3
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolver.py +3 -4
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-voltage.json +0 -10
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/chart_engine.py +58 -17
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/codex_parser.py +15 -1
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/contract.py +1 -1
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/models.py +10 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/parser.py +25 -2
- hyperweave-0.3.1/src/hyperweave/telemetry/receipt_paths.py +73 -0
- hyperweave-0.3.1/tests/fixtures/synthetic_session.jsonl +18 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_assembler.py +18 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_chart_engine.py +143 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_codex_parser.py +19 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_proofset.py +23 -8
- hyperweave-0.3.1/tests/test_receipt_paths.py +129 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry.py +84 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_url_stability.py +21 -4
- {hyperweave-0.3.0 → hyperweave-0.3.1}/.dockerignore +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/.github/workflows/ci.yml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/.github/workflows/deploy.yml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/.github/workflows/publish.yml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/.gitignore +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/.pre-commit-config.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/Dockerfile +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/LICENSE +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/buttons/button-liquid.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-butterfly.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-python.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-sunflower.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-waves.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/banner.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/strip.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/banner.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/github.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/x.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/strip.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/master_card.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt_claude-code_medium.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt_codex_large.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt_voltage_xlarge.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/rhythm_strip.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/rhythm_strip_voltage_xlarge.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/footers/inneraura-footer-liquid.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/footers/inneraura-footer-purple.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/footers/inneraura-footer.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/hyperweave-banner.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-discord.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-docs.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-github.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-x.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/marquees/badge-showcase-triple.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/marquees/genome-marquee-triple.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/marquees/sample-badges.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/404.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/callout-icons.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/divider.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/favicon.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/hero-banner.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/loader.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/og-image.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/timelines/hyperweave-roadmap.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/favicon.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/hyperweave-banner.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/hyperweave-navbar-logo.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/og-image.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/architecture.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/camo-compatibility.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/cim-compliance.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/genome-profile-system.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/metadata-tiers.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/add-motion-to-badges.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/create-session-receipts.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/use-live-data-badges.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/introduction.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/mint.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/quickstart.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/cli.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/compose-spec.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/genomes.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/http-api.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/mcp-tools.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/motions.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/telemetry-contract.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/spec/hyperweave-protocol.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/tutorials/compose-your-first-badge.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/tutorials/install-session-telemetry.mdx +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/fly.toml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/hooks/install.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/hooks/session_end.sh +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/justfile +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/pyproject.toml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/extract_font_metrics.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/extract_glyphs.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/generate_proofset.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/probe_live_stats.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/probe_star_history.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/stress_test.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/__main__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/assembler.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/bar_chart.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/context.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/engine.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/lanes.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/layout.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/palette.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolvers/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolvers/chart.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolvers/stats.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/rhythm.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/rhythm_strip.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/treemap.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/validate_paradigms.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/genome_validator.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/loader.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/registry.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/settings.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/arxiv.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/base.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/cache.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/github.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/rest.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/cell_layout.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/color.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/contracts.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/enums.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/font_metrics.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/models.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/paradigm.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/schema.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/state.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/text.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/thresholds.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/badge_modes.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/accessibility.css +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/bridge.css +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/expression.css +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/status.css +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/chakra-petch.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/inter.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/jetbrains-mono.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/orbitron.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/chakra-petch.b64 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/chakra-petch.meta.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/automata.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/brutalist.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/chrome.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-claude-code.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-codex.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-cream.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/glyphs.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/static.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/brutalist.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/cellular.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/chrome.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/default.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/policies/normal.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/policies/permissive.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/policies/ungoverned.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/chrome.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/specimens.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/runtimes/claude-code.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/runtimes/codex.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/arrow.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/aurora.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/beacon.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/bracket3d.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/chevron.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/crosshair.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/diamond.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rocket.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/bar.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/straight.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/wave.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/stijl.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/kit.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/mcp/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/mcp/__main__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/mcp/server.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/py.typed +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/fonts.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/glyphs.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/motion.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/templates.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/serve/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/serve/app.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/serve/data_tokens.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/capture.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/corrections.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/cost.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/runtimes.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/stages.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-area.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-axes.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-empty-state.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-gridlines.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/circle.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/diamond.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/endpoint-diamond.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/endpoint-rect.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/rect.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-milestone.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-polyline.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/status.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/document.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/cellular-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/cellular-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/cellular-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/cellular-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/divider/chrome-band.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/divider.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/cellular-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/cellular-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-overlay.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/cellular-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/cellular-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/cellular-overlay.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/chrome-overlay.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/default-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/default-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/cellular-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/cellular-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/chrome-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/cellular-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/cellular-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/cellular-status.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/partials/provider-glyphs.svg.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/partials/state-signal-cascade.j2 +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/__init__.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/conftest.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/codex_session.jsonl +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/codex_session_patches.jsonl +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/github_contributions/synthetic.html +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/session.json +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/session.jsonl +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/helpers.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/snapshots/url_stability/divider_band_chrome_static.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/snapshots/url_stability/icon_github_chrome_static.svg +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_badge_cellular.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_badge_layout.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_badge_mode.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_chart_frame.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_chrome_variants.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_bar_chart.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_rhythm_strip.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_treemap.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_variant_field.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_connectors.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_core.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_data_tokens.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_divider_cellular.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_divider_genome_specific.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_font_gating.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_font_metrics_chakra.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_genome_automata.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_github_scrape.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_kit.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_marquee_v0_2_16.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_mcp.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_paradigm_cellular.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_paradigm_dispatch.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_paradigm_extensibility.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_parse_transcript_auto.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_receipt_token_compliance.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_render.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_resolver_rhythm.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_runtime_registries.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_serve.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_serve_live_state.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_slot_metric_state.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_state_inference.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_stats_card.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_strip_cellular.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_strip_status_toggle.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry_contract_per_stage.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry_integration.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry_skin_dispatch.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_tool_class_completeness.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_variant_default_resolution.py +0 -0
- {hyperweave-0.3.0 → hyperweave-0.3.1}/uv.lock +0 -0
|
@@ -5,6 +5,25 @@ 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.1] - 2026-05-10
|
|
9
|
+
|
|
10
|
+
Receipt user-turn count and filenames now reflect actual session content. Voltage receipts always render dark regardless of viewer color scheme. Star chart x-axis labels no longer collide on short-history repos.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Receipt user-turn count** — the footer "N user turns" now reports actual prompt count; slash commands and tool results no longer skew the number.
|
|
15
|
+
- **Star chart x-axis labels on short histories** — "Apr 2026" / "May 2026" no longer overlap on charts spanning under two years. Spacing now accounts for actual label width and drops middle labels when their bounding boxes would touch.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- **Receipt filenames are human-readable** — saved as `{date}_{time}_{session-name}.svg` (was UUID-only). Session name comes from Claude Code's auto-titled session or Codex's thread name; UUID stays in the SVG metadata.
|
|
20
|
+
- **Voltage receipts always render dark** — the light-mode adaptation block is removed; voltage stays dark across all viewers.
|
|
21
|
+
- **Codex receipts carry git branch and thread name** — both are now extracted from Codex transcripts and surfaced in receipt provenance and filenames.
|
|
22
|
+
|
|
23
|
+
### Notes
|
|
24
|
+
|
|
25
|
+
- 1067 tests (was 1035).
|
|
26
|
+
|
|
8
27
|
## [0.3.0] - 2026-05-10
|
|
9
28
|
|
|
10
29
|
Chrome ships five named variants. Automata ships sixteen tones with a pairing grammar that composes any two into a bifamily strip or divider. Stat cards, star charts, marquees, and icons redesigned. Per-frame font filtering cuts artifact payloads.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyperweave
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
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
|
|
@@ -161,11 +161,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
161
161
|
<h3 id="chrome">chrome</h3>
|
|
162
162
|
|
|
163
163
|
<p align="center">
|
|
164
|
-
<img src="https://hyperweave.app/v1/badge/BUILD/
|
|
165
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
166
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
167
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
168
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
164
|
+
<img src="https://hyperweave.app/v1/badge/BUILD/chrome.static?data=gh:InnerAura/hyperweave.build&glyph=githubactions&variant=horizon" alt="BUILD — horizon variant"/>
|
|
165
|
+
<img src="https://hyperweave.app/v1/badge/BLUESKY/POST/chrome.static?glyph=bluesky&variant=abyssal" alt="BLUESKY POST — abyssal variant"/>
|
|
166
|
+
<img src="https://hyperweave.app/v1/badge/DOCKER/chrome.static?data=docker:zeroxeli/readme-ai.pull_count&glyph=docker&variant=lightning" alt="DOCKER pulls — lightning variant"/>
|
|
167
|
+
<img src="https://hyperweave.app/v1/badge/STARS/chrome.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=graphite" alt="STARS — graphite variant"/>
|
|
168
|
+
<img src="https://hyperweave.app/v1/badge/ANTHROPIC/CLAUDE/chrome.static?glyph=anthropic&variant=moth" alt="ANTHROPIC CLAUDE — moth variant"/>
|
|
169
169
|
</p>
|
|
170
170
|
|
|
171
171
|
<p align="center">
|
|
@@ -260,12 +260,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
260
260
|
<h3 id="automata">automata</h3>
|
|
261
261
|
|
|
262
262
|
<p align="center">
|
|
263
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
264
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
265
|
-
<img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:
|
|
266
|
-
<img src="https://hyperweave.app/v1/badge/FOLLOW/automata.static?glyph=x&variant=steel" alt="FOLLOW — steel variant"/>
|
|
263
|
+
<img src="https://hyperweave.app/v1/badge/DOCKER/PULL/automata.static?glyph=docker&variant=teal" alt="DOCKER PULL — teal variant"/>
|
|
264
|
+
<img src="https://hyperweave.app/v1/badge/DISCORD/JOIN/automata.static?glyph=discord&variant=violet" alt="DISCORD JOIN — violet variant"/>
|
|
265
|
+
<img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=amber" alt="STARS — amber variant"/>
|
|
267
266
|
<img src="https://hyperweave.app/v1/badge/HF/MODELS/automata.static?glyph=huggingface&variant=sulfur" alt="HF MODELS — sulfur variant"/>
|
|
268
|
-
<img src="https://hyperweave.app/v1/badge/LISTEN/automata.static?glyph=spotify&variant=jade" alt="LISTEN — jade variant"/>
|
|
267
|
+
<img src="https://hyperweave.app/v1/badge/SPOTIFY/LISTEN/automata.static?glyph=spotify&variant=jade" alt="SPOTIFY LISTEN — jade variant"/>
|
|
269
268
|
</p>
|
|
270
269
|
|
|
271
270
|
<p align="center">
|
|
@@ -289,7 +288,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
289
288
|
<tr>
|
|
290
289
|
<th align="left">Dashboard<br/><sub>strip</sub></th>
|
|
291
290
|
<td>
|
|
292
|
-
<img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&
|
|
291
|
+
<img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&glyph=github" alt="strip"/>
|
|
293
292
|
<br/>
|
|
294
293
|
<ul>
|
|
295
294
|
<li><sub><code>/v1/strip/{title}/automata.static?data={tokens}&variant={tone}&pair={tone}&subtitle={text}&glyph={glyph}</code></sub></li>
|
|
@@ -300,7 +299,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
300
299
|
<tr>
|
|
301
300
|
<th align="left">Profile<br/><sub>stats card</sub></th>
|
|
302
301
|
<td>
|
|
303
|
-
<img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone" alt="stats" width="100%"/>
|
|
302
|
+
<img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone&v=2" alt="stats" width="100%"/>
|
|
304
303
|
<br/>
|
|
305
304
|
<ul>
|
|
306
305
|
<li><sub><code>/v1/stats/{username}/{genome}.static?variant={tone}</code></sub></li>
|
|
@@ -311,7 +310,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
311
310
|
<tr>
|
|
312
311
|
<th align="left">Star Chart<br/><sub>star history</sub></th>
|
|
313
312
|
<td>
|
|
314
|
-
<img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone" alt="star chart" width="100%"/>
|
|
313
|
+
<img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone&v=2" alt="star chart" width="100%"/>
|
|
315
314
|
<br/>
|
|
316
315
|
<ul>
|
|
317
316
|
<li><sub><code>/v1/chart/stars/{owner}/{repo}/{genome}.static?variant={tone}</code></sub></li>
|
|
@@ -335,8 +334,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
335
334
|
<td>
|
|
336
335
|
<img src="https://hyperweave.app/v1/icon/docker/automata.static?shape=square&variant=cobalt" alt="docker cobalt" width="56"/>
|
|
337
336
|
<img src="https://hyperweave.app/v1/icon/discord/automata.static?shape=square&variant=indigo" alt="discord indigo" width="56"/>
|
|
337
|
+
<img src="https://hyperweave.app/v1/icon/github/automata.static?shape=square&variant=bone" alt="github bone" width="56"/>
|
|
338
338
|
<img src="https://hyperweave.app/v1/icon/huggingface/automata.static?shape=square&variant=sulfur" alt="huggingface sulfur" width="56"/>
|
|
339
|
+
<img src="https://hyperweave.app/v1/icon/anthropic/automata.static?shape=square&variant=solar" alt="anthropic solar" width="56"/>
|
|
339
340
|
<img src="https://hyperweave.app/v1/icon/youtube/automata.static?shape=square&variant=crimson" alt="youtube crimson" width="56"/>
|
|
341
|
+
<img src="https://hyperweave.app/v1/icon/spotify/automata.static?shape=square&variant=jade" alt="spotify jade" width="56"/>
|
|
340
342
|
<br/>
|
|
341
343
|
<ul>
|
|
342
344
|
<li><sub><code>/v1/icon/{glyph}/automata.static?shape=square&variant={tone}</code></sub></li>
|
|
@@ -347,7 +349,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
347
349
|
<tr>
|
|
348
350
|
<th align="left">Divider<br/><sub>dissolve</sub></th>
|
|
349
351
|
<td>
|
|
350
|
-
<img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone
|
|
352
|
+
<img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone" alt="automata dissolve divider"/>
|
|
351
353
|
<br/>
|
|
352
354
|
<ul>
|
|
353
355
|
<li><sub><code>/v1/divider/dissolve/{genome}.static?variant={tone}&pair={tone}</code></sub></li>
|
|
@@ -444,6 +446,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
444
446
|
</tr>
|
|
445
447
|
</table>
|
|
446
448
|
|
|
449
|
+
<br />
|
|
450
|
+
|
|
447
451
|
| | chrome | brutalist | automata |
|
|
448
452
|
|---|---|---|---|
|
|
449
453
|
| Aesthetic | Metallic precision | Raw material | Living cellular grid |
|
|
@@ -451,6 +455,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
451
455
|
| Motion | Animated border SMIL | Animated border SMIL | Animated cell grid |
|
|
452
456
|
| Divider | `band` | `seam` | `dissolve` |
|
|
453
457
|
|
|
458
|
+
<br />
|
|
459
|
+
|
|
454
460
|
<h3 id="dividers"><code>/a/inneraura/dividers/</code></h3>
|
|
455
461
|
|
|
456
462
|
<table>
|
|
@@ -129,11 +129,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
129
129
|
<h3 id="chrome">chrome</h3>
|
|
130
130
|
|
|
131
131
|
<p align="center">
|
|
132
|
-
<img src="https://hyperweave.app/v1/badge/BUILD/
|
|
133
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
134
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
135
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
136
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
132
|
+
<img src="https://hyperweave.app/v1/badge/BUILD/chrome.static?data=gh:InnerAura/hyperweave.build&glyph=githubactions&variant=horizon" alt="BUILD — horizon variant"/>
|
|
133
|
+
<img src="https://hyperweave.app/v1/badge/BLUESKY/POST/chrome.static?glyph=bluesky&variant=abyssal" alt="BLUESKY POST — abyssal variant"/>
|
|
134
|
+
<img src="https://hyperweave.app/v1/badge/DOCKER/chrome.static?data=docker:zeroxeli/readme-ai.pull_count&glyph=docker&variant=lightning" alt="DOCKER pulls — lightning variant"/>
|
|
135
|
+
<img src="https://hyperweave.app/v1/badge/STARS/chrome.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=graphite" alt="STARS — graphite variant"/>
|
|
136
|
+
<img src="https://hyperweave.app/v1/badge/ANTHROPIC/CLAUDE/chrome.static?glyph=anthropic&variant=moth" alt="ANTHROPIC CLAUDE — moth variant"/>
|
|
137
137
|
</p>
|
|
138
138
|
|
|
139
139
|
<p align="center">
|
|
@@ -228,12 +228,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
228
228
|
<h3 id="automata">automata</h3>
|
|
229
229
|
|
|
230
230
|
<p align="center">
|
|
231
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
232
|
-
<img src="https://hyperweave.app/v1/badge/
|
|
233
|
-
<img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:
|
|
234
|
-
<img src="https://hyperweave.app/v1/badge/FOLLOW/automata.static?glyph=x&variant=steel" alt="FOLLOW — steel variant"/>
|
|
231
|
+
<img src="https://hyperweave.app/v1/badge/DOCKER/PULL/automata.static?glyph=docker&variant=teal" alt="DOCKER PULL — teal variant"/>
|
|
232
|
+
<img src="https://hyperweave.app/v1/badge/DISCORD/JOIN/automata.static?glyph=discord&variant=violet" alt="DISCORD JOIN — violet variant"/>
|
|
233
|
+
<img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=amber" alt="STARS — amber variant"/>
|
|
235
234
|
<img src="https://hyperweave.app/v1/badge/HF/MODELS/automata.static?glyph=huggingface&variant=sulfur" alt="HF MODELS — sulfur variant"/>
|
|
236
|
-
<img src="https://hyperweave.app/v1/badge/LISTEN/automata.static?glyph=spotify&variant=jade" alt="LISTEN — jade variant"/>
|
|
235
|
+
<img src="https://hyperweave.app/v1/badge/SPOTIFY/LISTEN/automata.static?glyph=spotify&variant=jade" alt="SPOTIFY LISTEN — jade variant"/>
|
|
237
236
|
</p>
|
|
238
237
|
|
|
239
238
|
<p align="center">
|
|
@@ -257,7 +256,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
257
256
|
<tr>
|
|
258
257
|
<th align="left">Dashboard<br/><sub>strip</sub></th>
|
|
259
258
|
<td>
|
|
260
|
-
<img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&
|
|
259
|
+
<img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&glyph=github" alt="strip"/>
|
|
261
260
|
<br/>
|
|
262
261
|
<ul>
|
|
263
262
|
<li><sub><code>/v1/strip/{title}/automata.static?data={tokens}&variant={tone}&pair={tone}&subtitle={text}&glyph={glyph}</code></sub></li>
|
|
@@ -268,7 +267,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
268
267
|
<tr>
|
|
269
268
|
<th align="left">Profile<br/><sub>stats card</sub></th>
|
|
270
269
|
<td>
|
|
271
|
-
<img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone" alt="stats" width="100%"/>
|
|
270
|
+
<img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone&v=2" alt="stats" width="100%"/>
|
|
272
271
|
<br/>
|
|
273
272
|
<ul>
|
|
274
273
|
<li><sub><code>/v1/stats/{username}/{genome}.static?variant={tone}</code></sub></li>
|
|
@@ -279,7 +278,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
279
278
|
<tr>
|
|
280
279
|
<th align="left">Star Chart<br/><sub>star history</sub></th>
|
|
281
280
|
<td>
|
|
282
|
-
<img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone" alt="star chart" width="100%"/>
|
|
281
|
+
<img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone&v=2" alt="star chart" width="100%"/>
|
|
283
282
|
<br/>
|
|
284
283
|
<ul>
|
|
285
284
|
<li><sub><code>/v1/chart/stars/{owner}/{repo}/{genome}.static?variant={tone}</code></sub></li>
|
|
@@ -303,8 +302,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
303
302
|
<td>
|
|
304
303
|
<img src="https://hyperweave.app/v1/icon/docker/automata.static?shape=square&variant=cobalt" alt="docker cobalt" width="56"/>
|
|
305
304
|
<img src="https://hyperweave.app/v1/icon/discord/automata.static?shape=square&variant=indigo" alt="discord indigo" width="56"/>
|
|
305
|
+
<img src="https://hyperweave.app/v1/icon/github/automata.static?shape=square&variant=bone" alt="github bone" width="56"/>
|
|
306
306
|
<img src="https://hyperweave.app/v1/icon/huggingface/automata.static?shape=square&variant=sulfur" alt="huggingface sulfur" width="56"/>
|
|
307
|
+
<img src="https://hyperweave.app/v1/icon/anthropic/automata.static?shape=square&variant=solar" alt="anthropic solar" width="56"/>
|
|
307
308
|
<img src="https://hyperweave.app/v1/icon/youtube/automata.static?shape=square&variant=crimson" alt="youtube crimson" width="56"/>
|
|
309
|
+
<img src="https://hyperweave.app/v1/icon/spotify/automata.static?shape=square&variant=jade" alt="spotify jade" width="56"/>
|
|
308
310
|
<br/>
|
|
309
311
|
<ul>
|
|
310
312
|
<li><sub><code>/v1/icon/{glyph}/automata.static?shape=square&variant={tone}</code></sub></li>
|
|
@@ -315,7 +317,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
315
317
|
<tr>
|
|
316
318
|
<th align="left">Divider<br/><sub>dissolve</sub></th>
|
|
317
319
|
<td>
|
|
318
|
-
<img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone
|
|
320
|
+
<img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone" alt="automata dissolve divider"/>
|
|
319
321
|
<br/>
|
|
320
322
|
<ul>
|
|
321
323
|
<li><sub><code>/v1/divider/dissolve/{genome}.static?variant={tone}&pair={tone}</code></sub></li>
|
|
@@ -412,6 +414,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
412
414
|
</tr>
|
|
413
415
|
</table>
|
|
414
416
|
|
|
417
|
+
<br />
|
|
418
|
+
|
|
415
419
|
| | chrome | brutalist | automata |
|
|
416
420
|
|---|---|---|---|
|
|
417
421
|
| Aesthetic | Metallic precision | Raw material | Living cellular grid |
|
|
@@ -419,6 +423,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
|
|
|
419
423
|
| Motion | Animated border SMIL | Animated border SMIL | Animated cell grid |
|
|
420
424
|
| Divider | `band` | `seam` | `dissolve` |
|
|
421
425
|
|
|
426
|
+
<br />
|
|
427
|
+
|
|
422
428
|
<h3 id="dividers"><code>/a/inneraura/dividers/</code></h3>
|
|
423
429
|
|
|
424
430
|
<table>
|
|
@@ -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.1'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 3, 1)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -369,12 +369,30 @@ def session(
|
|
|
369
369
|
result = do_compose(spec)
|
|
370
370
|
|
|
371
371
|
if action == "receipt":
|
|
372
|
-
# Default output: .hyperweave/receipts/{
|
|
372
|
+
# Default output: .hyperweave/receipts/{date}_{time}_{slug}.svg
|
|
373
373
|
if not output:
|
|
374
|
-
|
|
374
|
+
from datetime import datetime as _dt
|
|
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 ""
|
|
375
388
|
hw_dir = Path(".hyperweave") / "receipts"
|
|
376
389
|
hw_dir.mkdir(parents=True, exist_ok=True)
|
|
377
|
-
output = hw_dir /
|
|
390
|
+
output = hw_dir / receipt_filename(
|
|
391
|
+
timestamp=ts,
|
|
392
|
+
session_name=session_name,
|
|
393
|
+
session_id=sid,
|
|
394
|
+
prompt_text=first_prompt,
|
|
395
|
+
)
|
|
378
396
|
|
|
379
397
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
380
398
|
output.write_text(result.svg)
|
|
@@ -1993,10 +1993,9 @@ def resolve_receipt(
|
|
|
1993
1993
|
pill_label = hero_profile.upper()
|
|
1994
1994
|
pill_w = int(len(pill_label) * 7 * 1.28) + 14
|
|
1995
1995
|
pill_x = 800 - 24 - pill_w
|
|
1996
|
-
#
|
|
1997
|
-
#
|
|
1998
|
-
#
|
|
1999
|
-
# failing/blocked tool calls (the red ✗N cell marks reconcile to this).
|
|
1996
|
+
# user_events is the unfiltered series of human-authored prose turns
|
|
1997
|
+
# (continuations + corrections + redirects + elaborations). Tool errors
|
|
1998
|
+
# count failing/blocked tool calls; the red ✗N cell marks reconcile to this.
|
|
2000
1999
|
n_user_turns = len(user_events)
|
|
2001
2000
|
n_tool_errors = sum(t.get("errors", 0) + t.get("blocked", 0) for t in tools)
|
|
2002
2001
|
# n_agents = len(agents) # was used by old footer; v0.2.21 footer is 4-quadrant.
|
|
@@ -66,16 +66,6 @@
|
|
|
66
66
|
"state_building_bright": "#DC8AC2",
|
|
67
67
|
"state_offline_core": "#7A7F88",
|
|
68
68
|
"state_offline_bright": "#B0B4BC",
|
|
69
|
-
"light_mode": {
|
|
70
|
-
"surface": "#fafafa",
|
|
71
|
-
"surface_alt": "#f5f5f5",
|
|
72
|
-
"surface_deep": "#f0f0f0",
|
|
73
|
-
"ink": "#18181b",
|
|
74
|
-
"ink_muted": "#3f3f46",
|
|
75
|
-
"ink_ghost": "#a1a1aa",
|
|
76
|
-
"border": "#e4e4e7",
|
|
77
|
-
"sep": "#d4d4d8"
|
|
78
|
-
},
|
|
79
69
|
"paradigms": {
|
|
80
70
|
"receipt": "default",
|
|
81
71
|
"rhythm-strip": "default",
|
|
@@ -798,10 +798,49 @@ def _build_y_labels(ticks: list[int], v_min: int, v_max: int, vp: Viewport) -> l
|
|
|
798
798
|
return out
|
|
799
799
|
|
|
800
800
|
|
|
801
|
-
#
|
|
802
|
-
#
|
|
803
|
-
#
|
|
804
|
-
|
|
801
|
+
# Width-aware label collision constants. The previous fixed 48px center-to-center
|
|
802
|
+
# gap let monthly labels ("Apr 2026", ~58px wide) overlap by ~10px on adjacent ticks
|
|
803
|
+
# even when the gap "rule" passed. We now compute each label's actual rendered
|
|
804
|
+
# bounding box and check edge-to-edge separation.
|
|
805
|
+
|
|
806
|
+
# Conservative per-character width covering the widest paradigm (brutalist:
|
|
807
|
+
# 9px sans-serif + 0.20em letter-spacing + uppercase). Cellular and chrome
|
|
808
|
+
# render narrower, so this estimate is a safe upper bound for all genome
|
|
809
|
+
# paradigms — it never under-estimates collision.
|
|
810
|
+
_LABEL_CHAR_WIDTH_PX: float = 7.5
|
|
811
|
+
|
|
812
|
+
# Minimum visual gap between two label bounding boxes. Smaller than the full
|
|
813
|
+
# character width — readers tolerate close-packed labels as long as the glyphs
|
|
814
|
+
# don't actually touch.
|
|
815
|
+
_LABEL_EDGE_PADDING_PX: float = 6.0
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
def _label_pixel_width(text: str) -> float:
|
|
819
|
+
"""Worst-case rendered width of `text` in pixels."""
|
|
820
|
+
return len(text) * _LABEL_CHAR_WIDTH_PX
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
def _label_bounds(label: dict[str, Any]) -> tuple[float, float]:
|
|
824
|
+
"""Return (left_edge_px, right_edge_px) for a generated label dict.
|
|
825
|
+
|
|
826
|
+
Honors the SVG `text-anchor` semantics: 'start' anchors the left edge
|
|
827
|
+
at x, 'end' anchors the right edge at x, 'middle' centers the text on x.
|
|
828
|
+
"""
|
|
829
|
+
x = float(label["x"])
|
|
830
|
+
w = _label_pixel_width(str(label["text"]))
|
|
831
|
+
anchor = label.get("anchor", "middle")
|
|
832
|
+
if anchor == "start":
|
|
833
|
+
return (x, x + w)
|
|
834
|
+
if anchor == "end":
|
|
835
|
+
return (x - w, x)
|
|
836
|
+
return (x - w / 2, x + w / 2)
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
def _labels_collide(left: dict[str, Any], right: dict[str, Any]) -> bool:
|
|
840
|
+
"""True if `right`'s left edge is closer than padding to `left`'s right edge."""
|
|
841
|
+
_, left_right = _label_bounds(left)
|
|
842
|
+
right_left, _ = _label_bounds(right)
|
|
843
|
+
return right_left < left_right + _LABEL_EDGE_PADDING_PX
|
|
805
844
|
|
|
806
845
|
|
|
807
846
|
def _build_x_date_labels(points: list[ChartPoint], vp: Viewport) -> list[dict[str, Any]]:
|
|
@@ -815,10 +854,11 @@ def _build_x_date_labels(points: list[ChartPoint], vp: Viewport) -> list[dict[st
|
|
|
815
854
|
else → every other year ("2012", "2014", ...)
|
|
816
855
|
|
|
817
856
|
A single-point input renders one centered label with full "%b %d, %Y".
|
|
818
|
-
After candidate generation, a
|
|
819
|
-
label
|
|
820
|
-
and last labels are preserved
|
|
821
|
-
temporal endpoints a reader
|
|
857
|
+
After candidate generation, a width-aware de-overlap pass removes any
|
|
858
|
+
middle label whose bounding box would touch the previously-kept one
|
|
859
|
+
(see ``_labels_collide``). The first and last labels are preserved
|
|
860
|
+
unconditionally because they're the temporal endpoints a reader
|
|
861
|
+
expects to see.
|
|
822
862
|
"""
|
|
823
863
|
if not points:
|
|
824
864
|
return []
|
|
@@ -867,22 +907,23 @@ def _build_x_date_labels(points: list[ChartPoint], vp: Viewport) -> list[dict[st
|
|
|
867
907
|
# First label flush with the y-axis for a cleaner left edge.
|
|
868
908
|
candidates[0]["anchor"] = "start"
|
|
869
909
|
|
|
870
|
-
# De-overlap: preserve first + last; drop any middle label
|
|
871
|
-
#
|
|
910
|
+
# De-overlap: preserve first + last; drop any middle label whose
|
|
911
|
+
# bounding box would touch the previously-kept one. Edge-to-edge
|
|
912
|
+
# collision (not center-to-center) so labels of different widths
|
|
913
|
+
# (e.g. monthly "Apr 2026" vs yearly "2026") behave correctly.
|
|
872
914
|
if len(candidates) <= 2:
|
|
873
915
|
return candidates
|
|
874
916
|
kept: list[dict[str, Any]] = [candidates[0]]
|
|
875
917
|
for label in candidates[1:-1]:
|
|
876
|
-
if
|
|
918
|
+
if not _labels_collide(kept[-1], label):
|
|
877
919
|
kept.append(label)
|
|
878
|
-
# The terminal endpoint is always included. If it
|
|
879
|
-
# last-kept middle label, or has identical text (e.g. yearly
|
|
880
|
-
# where the last jan-1 tick and the terminal point both
|
|
881
|
-
# replace that middle
|
|
920
|
+
# The terminal endpoint is always included. If it would collide with
|
|
921
|
+
# the last-kept middle label, or has identical text (e.g. yearly
|
|
922
|
+
# granularity where the last jan-1 tick and the terminal point both
|
|
923
|
+
# read "2026"), replace that middle rather than duplicating.
|
|
882
924
|
last_candidate = candidates[-1]
|
|
883
|
-
too_close = last_candidate["x"] - kept[-1]["x"] < _X_LABEL_MIN_GAP_PX
|
|
884
925
|
same_text = last_candidate["text"] == kept[-1]["text"]
|
|
885
|
-
if
|
|
926
|
+
if same_text or _labels_collide(kept[-1], last_candidate):
|
|
886
927
|
kept[-1] = last_candidate
|
|
887
928
|
else:
|
|
888
929
|
kept.append(last_candidate)
|
|
@@ -230,6 +230,8 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
230
230
|
# ── Pass 1: session_meta + turn_context derive session metadata ──
|
|
231
231
|
session_id = ""
|
|
232
232
|
project_path = ""
|
|
233
|
+
git_branch: str | None = None
|
|
234
|
+
session_name = ""
|
|
233
235
|
model: str | None = None
|
|
234
236
|
for line in raw_lines:
|
|
235
237
|
ltype = line.get("type")
|
|
@@ -239,6 +241,11 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
239
241
|
if ltype == "session_meta":
|
|
240
242
|
session_id = session_id or str(payload.get("id", ""))
|
|
241
243
|
project_path = project_path or str(payload.get("cwd", ""))
|
|
244
|
+
git_data = payload.get("git") or {}
|
|
245
|
+
if isinstance(git_data, dict):
|
|
246
|
+
branch = git_data.get("branch")
|
|
247
|
+
if isinstance(branch, str) and branch:
|
|
248
|
+
git_branch = branch
|
|
242
249
|
elif ltype == "turn_context":
|
|
243
250
|
# turn_context refines model + cwd over time; the latest wins.
|
|
244
251
|
cwd = payload.get("cwd")
|
|
@@ -247,6 +254,12 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
247
254
|
mdl = payload.get("model")
|
|
248
255
|
if mdl:
|
|
249
256
|
model = str(mdl)
|
|
257
|
+
elif ltype == "event_msg" and payload.get("type") == "thread_name_updated":
|
|
258
|
+
# Codex's equivalent of Claude Code's customTitle — driven by
|
|
259
|
+
# task-naming flow. Latest-wins so renames mid-session are honored.
|
|
260
|
+
tname = payload.get("thread_name")
|
|
261
|
+
if isinstance(tname, str) and tname:
|
|
262
|
+
session_name = tname
|
|
250
263
|
|
|
251
264
|
# ── Pass 2: tool calls from response_item (3 shapes) ──
|
|
252
265
|
all_tool_calls: list[ToolCall] = []
|
|
@@ -411,8 +424,9 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
411
424
|
|
|
412
425
|
return SessionTelemetry(
|
|
413
426
|
session_id=session_id,
|
|
427
|
+
session_name=session_name,
|
|
414
428
|
project_path=project_path,
|
|
415
|
-
git_branch=
|
|
429
|
+
git_branch=git_branch,
|
|
416
430
|
model=model,
|
|
417
431
|
runtime=_REGISTRY.runtime,
|
|
418
432
|
timestamp=session_start,
|
|
@@ -104,6 +104,7 @@ def _assemble(t: SessionTelemetry, cost: float) -> dict[str, Any]:
|
|
|
104
104
|
return {
|
|
105
105
|
"session": {
|
|
106
106
|
"id": t.session_id,
|
|
107
|
+
"name": t.session_name,
|
|
107
108
|
"start": t.timestamp.isoformat(),
|
|
108
109
|
"end": end,
|
|
109
110
|
"duration_minutes": t.duration_minutes,
|
|
@@ -162,7 +163,6 @@ def _assemble(t: SessionTelemetry, cost: float) -> dict[str, Any]:
|
|
|
162
163
|
"user_events": [
|
|
163
164
|
{"category": e.category.value, "preview": e.message_preview, "confidence": e.confidence.value}
|
|
164
165
|
for e in t.user_events
|
|
165
|
-
if e.category.value != "continuation"
|
|
166
166
|
],
|
|
167
167
|
"agents": [
|
|
168
168
|
{"id": a.agent_id, "type": a.agent_type, "tool_calls": a.tool_calls, "tokens": a.total_tokens}
|
|
@@ -248,6 +248,16 @@ class SessionTelemetry(BaseModel):
|
|
|
248
248
|
model_config = ConfigDict(extra="forbid")
|
|
249
249
|
|
|
250
250
|
session_id: str
|
|
251
|
+
session_name: str = Field(
|
|
252
|
+
default="",
|
|
253
|
+
description=(
|
|
254
|
+
"Human-readable session identifier. Claude Code: latest customTitle "
|
|
255
|
+
"from `custom-title` records (driven by /rename and auto-titling). "
|
|
256
|
+
"Codex: latest thread_name from `event_msg/thread_name_updated` events. "
|
|
257
|
+
"Empty when neither is available — consumers fall back to first-prompt "
|
|
258
|
+
"slug or session_id when constructing receipt filenames."
|
|
259
|
+
),
|
|
260
|
+
)
|
|
251
261
|
project_path: str
|
|
252
262
|
git_branch: str | None = None
|
|
253
263
|
model: str | None = None
|
|
@@ -14,6 +14,7 @@ from __future__ import annotations
|
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
16
|
import logging
|
|
17
|
+
import re
|
|
17
18
|
from datetime import datetime
|
|
18
19
|
from pathlib import Path
|
|
19
20
|
from typing import Any
|
|
@@ -40,6 +41,15 @@ _JsonObj = dict[str, Any]
|
|
|
40
41
|
# Resolved at import time — fail loud if claude-code.yaml is missing.
|
|
41
42
|
_REGISTRY = get_runtime("claude-code")
|
|
42
43
|
|
|
44
|
+
# Match content that consists entirely of one or more XML envelopes
|
|
45
|
+
# emitted by the Claude Code harness (e.g. <command-name>...</command-name>,
|
|
46
|
+
# <local-command-stdout>...</local-command-stdout>, <system-reminder>...</...>).
|
|
47
|
+
# These are non-prose framing — never count them as user turns.
|
|
48
|
+
_ENVELOPE_ONLY = re.compile(
|
|
49
|
+
r"^<[a-z][a-z0-9-]*>.*</[a-z][a-z0-9-]*>$",
|
|
50
|
+
re.DOTALL,
|
|
51
|
+
)
|
|
52
|
+
|
|
43
53
|
|
|
44
54
|
# --------------------------------------------------------------------------- #
|
|
45
55
|
# HELPERS
|
|
@@ -199,7 +209,7 @@ def _extract_user_text(obj: _JsonObj) -> str | None:
|
|
|
199
209
|
|
|
200
210
|
if isinstance(content, str):
|
|
201
211
|
text = content.strip()
|
|
202
|
-
if
|
|
212
|
+
if _ENVELOPE_ONLY.match(text):
|
|
203
213
|
return None
|
|
204
214
|
return text if text else None
|
|
205
215
|
|
|
@@ -303,6 +313,16 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
303
313
|
if session_id and project_path and git_branch is not None:
|
|
304
314
|
break
|
|
305
315
|
|
|
316
|
+
# `custom-title` records carry the user-facing session name (driven by /rename
|
|
317
|
+
# and Claude Code's auto-titling, which slugifies the first prompt). One record
|
|
318
|
+
# is emitted per assistant turn after the most-recent rename, so latest-wins.
|
|
319
|
+
session_name = ""
|
|
320
|
+
for line in raw_lines:
|
|
321
|
+
if line.get("type") == "custom-title":
|
|
322
|
+
title = line.get("customTitle")
|
|
323
|
+
if isinstance(title, str) and title:
|
|
324
|
+
session_name = title
|
|
325
|
+
|
|
306
326
|
# -- Pass 1: Extract all tool calls from assistant messages --
|
|
307
327
|
all_tool_calls: list[ToolCall] = []
|
|
308
328
|
for line in raw_lines:
|
|
@@ -381,7 +401,9 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
381
401
|
s.error_count += 1
|
|
382
402
|
|
|
383
403
|
# -- Build totals --
|
|
384
|
-
|
|
404
|
+
# Count only human-authored prose. type:"user" lines also wrap tool_results
|
|
405
|
+
# and command-name/local-command-stdout envelopes; those are not turns.
|
|
406
|
+
total_user_msgs = sum(1 for ln in raw_lines if _is_user_entry(ln) and _extract_user_text(ln) is not None)
|
|
385
407
|
total_assistant_msgs = sum(1 for ln in raw_lines if ln.get("type") == "assistant")
|
|
386
408
|
|
|
387
409
|
totals = SessionTotals(
|
|
@@ -408,6 +430,7 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
|
|
|
408
430
|
|
|
409
431
|
return SessionTelemetry(
|
|
410
432
|
session_id=session_id,
|
|
433
|
+
session_name=session_name,
|
|
411
434
|
project_path=project_path,
|
|
412
435
|
git_branch=git_branch,
|
|
413
436
|
model=model,
|