diff --git a/index.ts b/.SRCINFO
similarity index 100%
rename from index.ts
rename to .SRCINFO
diff --git a/.cargo/config.toml b/.cargo/config.toml
deleted file mode 100644
index be5f3f9..0000000
--- a/.cargo/config.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[alias]
-bin = ["run", "--package", "cargo-bin", "--"]
-watch = ["bin", "cargo-watch"]
diff --git a/.github/DISCUSSION_TEMPLATE/ideas.md b/.github/DISCUSSION_TEMPLATE/ideas.md
new file mode 100644
index 0000000..566f827
--- /dev/null
+++ b/.github/DISCUSSION_TEMPLATE/ideas.md
@@ -0,0 +1,16 @@
+---
+title: "[Idea] "
+labels: discussion
+---
+
+## Summary
+Briefly describe your idea.
+
+## Problem
+What problem does this solve?
+
+## Proposed Solution
+Whatβs your suggested approach?
+
+## Benefits
+Why should this be considered?
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index a9d61d2..0000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-name: Bug report
-about: Create a bug report to help us improve
-title: "[Bug]"
-labels: ''
-assignees: ErenayDev
-
----
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-**To Reproduce**
-Steps to reproduce the behavior:
-1. Go to '...'
-2. Click on '....'
-3. Scroll down to '....'
-4. See error
-
-**Expected behavior**
-A clear and concise description of what you expected to happen.
-
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
-
-**OS Information (please complete the following information):**
- - OS: [MacOS, Linux (Give distro if its neccessary), Windows]
- - Version [e.g. 0.1.0]
-
-**Additional context**
-Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
new file mode 100644
index 0000000..c0e9037
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -0,0 +1,98 @@
+name: Bug Report
+description: Report a bug in the system
+title: "[Bug]: "
+labels: ["bug"]
+assignees:
+ - ErenayDev
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Please provide detailed information about the bug to help us resolve it quickly.
+
+ - type: textarea
+ id: description
+ attributes:
+ label: Bug Description
+ description: A clear and concise description of the bug.
+ placeholder: Describe what happened...
+ validations:
+ required: true
+
+ - type: textarea
+ id: steps-to-reproduce
+ attributes:
+ label: Steps to Reproduce
+ description: List the steps to reproduce the behavior.
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '...'
+ 3. See error
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected-behavior
+ attributes:
+ label: Expected Behavior
+ description: What did you expect to happen?
+ placeholder: Explain what you expected to happen...
+ validations:
+ required: true
+
+ - type: dropdown
+ id: operating-system
+ attributes:
+ label: Operating System
+ description: What OS are you using?
+ options:
+ - Windows 10
+ - Windows 11
+ - macOS
+ - Linux (Ubuntu)
+ - Linux (Fedora)
+ - Linux (Arch)
+ - Linux (Other)
+ - Other
+ validations:
+ required: true
+
+ - type: input
+ id: version
+ attributes:
+ label: Version
+ description: What version of the software are you running?
+ placeholder: e.g., 1.1.0
+ validations:
+ required: true
+
+ - type: dropdown
+ id: browsers
+ attributes:
+ label: Browser (if applicable)
+ description: Which browser are you using?
+ multiple: true
+ options:
+ - Chrome
+ - Firefox
+ - Safari
+ - Edge
+ - Opera
+ - Other
+
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional Context
+ description: Add any other context, screenshots, or logs about the problem.
+ placeholder: Include screenshots, error messages, or any other relevant information...
+
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: I have searched existing issues to avoid duplicates
+ required: true
+ - label: I have provided all required information
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..6d17197
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,8 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Security Issues
+ url: https://github.com/ErenayDev/checkpoint-ts/security/advisories/new
+ about: Report security vulnerabilities privately
+ - name: Discussions
+ url: https://github.com/ErenayDev/checkpoint-ts/discussions
+ about: Ask questions and discuss ideas
diff --git a/.github/ISSUE_TEMPLATE/documentation.yaml b/.github/ISSUE_TEMPLATE/documentation.yaml
new file mode 100644
index 0000000..1544889
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/documentation.yaml
@@ -0,0 +1,82 @@
+name: Documentation Update
+description: Suggest updates or additions to documentation
+title: "[Docs]: "
+labels: ["documentation", "improvement"]
+assignees: []
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Help us improve our documentation by suggesting updates or additions.
+
+ - type: dropdown
+ id: doc-type
+ attributes:
+ label: Documentation Type
+ description: What type of documentation needs updating?
+ options:
+ - README
+ - API Documentation
+ - Installation Guide
+ - User Guide
+ - Developer Guide
+ - Code Comments
+ - Other
+ validations:
+ required: true
+
+ - type: textarea
+ id: current-issue
+ attributes:
+ label: Current Issue
+ description: What's wrong with the current documentation?
+ placeholder: Describe what's missing, outdated, or unclear...
+ validations:
+ required: true
+
+ - type: textarea
+ id: suggested-changes
+ attributes:
+ label: Suggested Changes
+ description: What changes would you like to see?
+ placeholder: Provide detailed description of the changes...
+ validations:
+ required: true
+
+ - type: input
+ id: affected-sections
+ attributes:
+ label: Affected Sections
+ description: Which sections or files need updating?
+ placeholder: e.g., README.md section 3, API endpoint /users
+
+ - type: dropdown
+ id: urgency
+ attributes:
+ label: Urgency
+ description: How urgent is this documentation update?
+ options:
+ - Low - Nice to have
+ - Medium - Should be updated soon
+ - High - Needs immediate attention
+ - Critical - Blocking users
+ default: 1
+ validations:
+ required: true
+
+ - type: textarea
+ id: additional-resources
+ attributes:
+ label: Additional Resources
+ description: Any related links, examples, or resources?
+ placeholder: Include any relevant links, examples, or references...
+
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: I have checked the current documentation
+ required: true
+ - label: I have searched for existing documentation issues
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 6a1f988..0000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-title: "[Feature]"
-labels: ''
-assignees: ErenayDev
-
----
-
-**Is your feature request related to a problem? Please describe.**
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-
-**Describe the solution you'd like**
-A clear and concise description of what you want to happen.
-
-**Describe alternatives you've considered**
-A clear and concise description of any alternative solutions or features you've considered.
-
-**Additional context**
-Add any other context or screenshots about the feature request here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
new file mode 100644
index 0000000..d28e6a7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -0,0 +1,76 @@
+name: Feature Request
+description: Suggest a new feature or improvement
+title: "[Feature]: "
+labels: ["enhancement", "feature-request"]
+assignees:
+ - ErenayDev
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for suggesting a new feature! Please provide as much detail as possible.
+
+ - type: textarea
+ id: feature-description
+ attributes:
+ label: Feature Description
+ description: What feature would you like to see?
+ placeholder: Describe the feature you'd like to request...
+ validations:
+ required: true
+
+ - type: textarea
+ id: problem-statement
+ attributes:
+ label: Problem Statement
+ description: What problem does this feature solve?
+ placeholder: Explain the problem or need for this feature...
+ validations:
+ required: true
+
+ - type: textarea
+ id: proposed-solution
+ attributes:
+ label: Proposed Solution
+ description: How should this feature work?
+ placeholder: Describe how this feature could be implemented...
+ validations:
+ required: true
+
+ - type: textarea
+ id: alternatives
+ attributes:
+ label: Alternative Solutions
+ description: Have you considered any alternative solutions?
+ placeholder: Describe any alternative solutions you've considered...
+
+ - type: dropdown
+ id: priority
+ attributes:
+ label: Priority
+ description: How important is this feature to you?
+ options:
+ - Low
+ - Medium
+ - High
+ - Critical
+ default: 1
+ validations:
+ required: true
+
+ - type: textarea
+ id: additional-context
+ attributes:
+ label: Additional Context
+ description: Add any other context, screenshots, mockups, or resources.
+ placeholder: Include any relevant screenshots, links, or resources...
+
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: I have searched existing issues to avoid duplicates
+ required: true
+ - label: This feature aligns with the project's goals
+ required: true
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..342f38c
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,14 @@
+## Description
+Explain the changes you made and why.
+
+Fixes # (issue number)
+
+## Type of Change
+- [ ] Bug fix
+- [ ] New feature
+- [ ] Documentation update
+
+## Checklist
+- [ ] Code follows project guidelines
+- [ ] Tests added/updated
+- [ ] Documentation updated
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f74b904..4f7f524 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -23,7 +23,7 @@ concurrency:
jobs:
fmt:
name: fmt
- runs-on: ubuntu-latest
+ runs-on: self-hosted
steps:
- name: Checkout
uses: actions/checkout@v5
@@ -37,7 +37,7 @@ jobs:
run: cargo fmt -- --check
clippy:
name: clippy
- runs-on: ubuntu-latest
+ runs-on: self-hosted
permissions:
contents: read
checks: write
@@ -54,7 +54,7 @@ jobs:
uses: clechasseur/rs-clippy-check@v5
doc:
name: doc
- runs-on: ubuntu-latest
+ runs-on: self-hosted
steps:
- uses: actions/checkout@v5
- name: Install Rust nightly
diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml
index 0ab93e6..031caf2 100644
--- a/.github/workflows/codecov.yml
+++ b/.github/workflows/codecov.yml
@@ -8,7 +8,7 @@ on:
jobs:
coverage:
- runs-on: ubuntu-latest
+ runs-on: self-hosted
steps:
- uses: actions/checkout@v4
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..3dfcda0
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,296 @@
+# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist
+#
+# Copyright 2022-2024, axodotdev
+# SPDX-License-Identifier: MIT or Apache-2.0
+#
+# CI that:
+#
+# * checks for a Git Tag that looks like a release
+# * builds artifacts with dist (archives, installers, hashes)
+# * uploads those artifacts to temporary workflow zip
+# * on success, uploads the artifacts to a GitHub Release
+#
+# Note that the GitHub Release will be created with a generated
+# title/body based on your changelogs.
+
+name: Release
+permissions:
+ "contents": "write"
+
+# This task will run whenever you push a git tag that looks like a version
+# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc.
+# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where
+# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION
+# must be a Cargo-style SemVer Version (must have at least major.minor.patch).
+#
+# If PACKAGE_NAME is specified, then the announcement will be for that
+# package (erroring out if it doesn't have the given version or isn't dist-able).
+#
+# If PACKAGE_NAME isn't specified, then the announcement will be for all
+# (dist-able) packages in the workspace with that version (this mode is
+# intended for workspaces with only one dist-able package, or with all dist-able
+# packages versioned/released in lockstep).
+#
+# If you push multiple tags at once, separate instances of this workflow will
+# spin up, creating an independent announcement for each one. However, GitHub
+# will hard limit this to 3 tags per commit, as it will assume more tags is a
+# mistake.
+#
+# If there's a prerelease-style suffix to the version, then the release(s)
+# will be marked as a prerelease.
+on:
+ pull_request:
+ push:
+ tags:
+ - '**[0-9]+.[0-9]+.[0-9]+*'
+
+jobs:
+ # Run 'dist plan' (or host) to determine what tasks we need to do
+ plan:
+ runs-on: self-hosted
+ outputs:
+ val: ${{ steps.plan.outputs.manifest }}
+ tag: ${{ !github.event.pull_request && github.ref_name || '' }}
+ tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }}
+ publishing: ${{ !github.event.pull_request }}
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ submodules: recursive
+ - name: Install dist
+ # we specify bash to get pipefail; it guards against the `curl` command
+ # failing. otherwise `sh` won't catch that `curl` returned non-0
+ shell: bash
+ run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.31.0/cargo-dist-installer.sh | sh"
+ - name: Cache dist
+ uses: actions/upload-artifact@v6
+ with:
+ name: cargo-dist-cache
+ path: ~/.cargo/bin/dist
+ # sure would be cool if github gave us proper conditionals...
+ # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible
+ # functionality based on whether this is a pull_request, and whether it's from a fork.
+ # (PRs run on the *source* but secrets are usually on the *target* -- that's *good*
+ # but also really annoying to build CI around when it needs secrets to work right.)
+ - id: plan
+ run: |
+ dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json
+ echo "dist ran successfully"
+ cat plan-dist-manifest.json
+ echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT"
+ - name: "Upload dist-manifest.json"
+ uses: actions/upload-artifact@v6
+ with:
+ name: artifacts-plan-dist-manifest
+ path: plan-dist-manifest.json
+
+ # Build and packages all the platform-specific things
+ build-local-artifacts:
+ name: build-local-artifacts (${{ join(matrix.targets, ', ') }})
+ # Let the initial task tell us to not run (currently very blunt)
+ needs:
+ - plan
+ if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }}
+ strategy:
+ fail-fast: false
+ # Target platforms/runners are computed by dist in create-release.
+ # Each member of the matrix has the following arguments:
+ #
+ # - runner: the github runner
+ # - dist-args: cli flags to pass to dist
+ # - install-dist: expression to run to install dist on the runner
+ #
+ # Typically there will be:
+ # - 1 "global" task that builds universal installers
+ # - N "local" tasks that build each platform's binaries and platform-specific installers
+ matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }}
+ runs-on: ${{ matrix.runner }}
+ container: ${{ matrix.container && matrix.container.image || null }}
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json
+ steps:
+ - name: enable windows longpaths
+ run: |
+ git config --global core.longpaths true
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ submodules: recursive
+ - name: Install Rust non-interactively if not already installed
+ if: ${{ matrix.container }}
+ run: |
+ if ! command -v cargo > /dev/null 2>&1; then
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
+ echo "$HOME/.cargo/bin" >> $GITHUB_PATH
+ fi
+ - name: Install dist
+ run: ${{ matrix.install_dist.run }}
+ # Get the dist-manifest
+ - name: Fetch local artifacts
+ uses: actions/download-artifact@v7
+ with:
+ pattern: artifacts-*
+ path: target/distrib/
+ merge-multiple: true
+ - name: Install dependencies
+ run: |
+ ${{ matrix.packages_install }}
+ - name: Build artifacts
+ run: |
+ # Actually do builds and make zips and whatnot
+ dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json
+ echo "dist ran successfully"
+ - id: cargo-dist
+ name: Post-build
+ # We force bash here just because github makes it really hard to get values up
+ # to "real" actions without writing to env-vars, and writing to env-vars has
+ # inconsistent syntax between shell and powershell.
+ shell: bash
+ run: |
+ # Parse out what we just built and upload it to scratch storage
+ echo "paths<> "$GITHUB_OUTPUT"
+ dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT"
+ echo "EOF" >> "$GITHUB_OUTPUT"
+
+ cp dist-manifest.json "$BUILD_MANIFEST_NAME"
+ - name: "Upload artifacts"
+ uses: actions/upload-artifact@v6
+ with:
+ name: artifacts-build-local-${{ join(matrix.targets, '_') }}
+ path: |
+ ${{ steps.cargo-dist.outputs.paths }}
+ ${{ env.BUILD_MANIFEST_NAME }}
+
+ # Build and package all the platform-agnostic(ish) things
+ build-global-artifacts:
+ needs:
+ - plan
+ - build-local-artifacts
+ runs-on: self-hosted
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ submodules: recursive
+ - name: Install cached dist
+ uses: actions/download-artifact@v7
+ with:
+ name: cargo-dist-cache
+ path: ~/.cargo/bin/
+ - run: chmod +x ~/.cargo/bin/dist
+ # Get all the local artifacts for the global tasks to use (for e.g. checksums)
+ - name: Fetch local artifacts
+ uses: actions/download-artifact@v7
+ with:
+ pattern: artifacts-*
+ path: target/distrib/
+ merge-multiple: true
+ - id: cargo-dist
+ shell: bash
+ run: |
+ dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json
+ echo "dist ran successfully"
+
+ # Parse out what we just built and upload it to scratch storage
+ echo "paths<> "$GITHUB_OUTPUT"
+ jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT"
+ echo "EOF" >> "$GITHUB_OUTPUT"
+
+ cp dist-manifest.json "$BUILD_MANIFEST_NAME"
+ - name: "Upload artifacts"
+ uses: actions/upload-artifact@v6
+ with:
+ name: artifacts-build-global
+ path: |
+ ${{ steps.cargo-dist.outputs.paths }}
+ ${{ env.BUILD_MANIFEST_NAME }}
+ # Determines if we should publish/announce
+ host:
+ needs:
+ - plan
+ - build-local-artifacts
+ - build-global-artifacts
+ # Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine)
+ if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ runs-on: self-hosted
+ outputs:
+ val: ${{ steps.host.outputs.manifest }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ submodules: recursive
+ - name: Install cached dist
+ uses: actions/download-artifact@v7
+ with:
+ name: cargo-dist-cache
+ path: ~/.cargo/bin/
+ - run: chmod +x ~/.cargo/bin/dist
+ # Fetch artifacts from scratch-storage
+ - name: Fetch artifacts
+ uses: actions/download-artifact@v7
+ with:
+ pattern: artifacts-*
+ path: target/distrib/
+ merge-multiple: true
+ - id: host
+ shell: bash
+ run: |
+ dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json
+ echo "artifacts uploaded and released successfully"
+ cat dist-manifest.json
+ echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT"
+ - name: "Upload dist-manifest.json"
+ uses: actions/upload-artifact@v6
+ with:
+ # Overwrite the previous copy
+ name: artifacts-dist-manifest
+ path: dist-manifest.json
+ # Create a GitHub Release while uploading all files to it
+ - name: "Download GitHub Artifacts"
+ uses: actions/download-artifact@v7
+ with:
+ pattern: artifacts-*
+ path: artifacts
+ merge-multiple: true
+ - name: Cleanup
+ run: |
+ # Remove the granular manifests
+ rm -f artifacts/*-dist-manifest.json
+ - name: Create GitHub Release
+ env:
+ PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}"
+ ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}"
+ ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}"
+ RELEASE_COMMIT: "${{ github.sha }}"
+ run: |
+ # Write and read notes from a file to avoid quoting breaking things
+ echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt
+
+ gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/*
+
+ announce:
+ needs:
+ - plan
+ - host
+ # use "always() && ..." to allow us to wait for all publish jobs while
+ # still allowing individual publish jobs to skip themselves (for prereleases).
+ # "host" however must run to completion, no skipping allowed!
+ if: ${{ always() && needs.host.result == 'success' }}
+ runs-on: self-hosted
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ submodules: recursive
diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml
new file mode 100644
index 0000000..1094037
--- /dev/null
+++ b/.github/workflows/web.yml
@@ -0,0 +1,99 @@
+# Workflow to build your docs with oranda (and mdbook)
+# and deploy them to Github Pages
+name: Web
+
+# We're going to push to the gh-pages branch, so we need that permission
+permissions:
+ contents: write
+
+# What situations do we want to build docs in?
+# All of these work independently and can be removed / commented out
+# if you don't want oranda/mdbook running in that situation
+on:
+ # Check that a PR didn't break docs!
+ #
+ # Note that the "Deploy to Github Pages" step won't run in this mode,
+ # so this won't have any side-effects. But it will tell you if a PR
+ # completely broke oranda/mdbook. Sadly we don't provide previews (yet)!
+ pull_request:
+
+ # Whenever something gets pushed to main, update the docs!
+ # This is great for getting docs changes live without cutting a full release.
+ #
+ # Note that if you're using cargo-dist, this will "race" the Release workflow
+ # that actually builds the Github Release that oranda tries to read (and
+ # this will almost certainly complete first). As a result you will publish
+ # docs for the latest commit but the oranda landing page won't know about
+ # the latest release. The workflow_run trigger below will properly wait for
+ # cargo-dist, and so this half-published state will only last for ~10 minutes.
+ #
+ # If you only want docs to update with releases, disable this, or change it to
+ # a "release" branch. You can, of course, also manually trigger a workflow run
+ # when you want the docs to update.
+ push:
+ branches:
+ - main
+
+ # Whenever a workflow called "Release" completes, update the docs!
+ #
+ # If you're using cargo-dist, this is recommended, as it will ensure that
+ # oranda always sees the latest release right when it's available. Note
+ # however that Github's UI is wonky when you use workflow_run, and won't
+ # show this workflow as part of any commit. You have to go to the "actions"
+ # tab for your repo to see this one running (the gh-pages deploy will also
+ # only show up there).
+ workflow_run:
+ workflows: [ "Release" ]
+ types:
+ - completed
+
+# Alright, let's do it!
+jobs:
+ web:
+ name: Build and deploy site and docs
+ runs-on: self-hosted
+ steps:
+ # Setup
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - uses: dtolnay/rust-toolchain@stable
+ - uses: swatinem/rust-cache@v2
+
+ # If you use any mdbook plugins, here's the place to install them!
+
+ # Install and run oranda (and mdbook)!
+ #
+ # This will write all output to ./public/ (including copying mdbook's output to there).
+ - name: Install and run oranda
+ run: |
+ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/latest/download/oranda-installer.sh | sh
+ oranda build
+
+ - name: Prepare HTML for link checking
+ # untitaker/hyperlink supports no site prefixes, move entire site into
+ # a subfolder
+ run: mkdir /tmp/public/ && cp -R public /tmp/public/oranda
+
+ - name: Check HTML for broken internal links
+ uses: untitaker/hyperlink@0.1.29
+ with:
+ args: /tmp/public/
+
+ # Deploy to our gh-pages branch (creating it if it doesn't exist).
+ # The "public" dir that oranda made above will become the root dir
+ # of this branch.
+ #
+ # Note that once the gh-pages branch exists, you must
+ # go into repo's settings > pages and set "deploy from branch: gh-pages".
+ # The other defaults work fine.
+ - name: Deploy to Github Pages
+ uses: JamesIves/github-pages-deploy-action@v4.4.1
+ # ONLY if we're on main (so no PRs or feature branches allowed!)
+ if: ${{ github.ref == 'refs/heads/main' }}
+ with:
+ branch: gh-pages
+ # Gotta tell the action where to find oranda's output
+ folder: public
+ token: ${{ secrets.GITHUB_TOKEN }}
+ single-commit: true
diff --git a/.gitignore b/.gitignore
index f2f1649..d21a424 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,9 @@ target
## Cargo-run-bin specific
.bin/
+
+## Generated folder by Node
+node_modules
+
+## Oranda output
+public
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5842937..503e49b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -3,7 +3,7 @@ repos:
rev: v4.4.0
hooks:
- id: trailing-whitespace
- - id: end-of-file-fixer
+# - id: end-of-file-fixer
- id: check-merge-conflict
- repo: https://github.com/doublify/pre-commit-rust
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 12511b0..6b41175 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,62 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [0.1.2] - 20 November 2025
+## [0.1.3] - 27 February 2026
+
+### βοΈ Miscellaneous Tasks
+
+- **tooling**: Remove cargo-bin wrapper and custom aliases
+
+- Remove root-level test artifacts
+
+- **github**: Update PR template location
+
+- **config**: Add node_modules to gitignore
+
+- **pre-commit**: Disable end-of-file-fixer hook
+
+- Add .checkpoint to gitignore
+
+- Add oranda output to gitignore
+
+- Add project metadata and distribution config
+
+- Remove tracked .checkpoint artifacts
+
+### ποΈ Build System
+
+- Bump workspace to v0.1.3, update swc_core and throbber-widgets-tui deps, add dist profile
+
+### π· CI/CD
+
+- Switch runners from ubuntu-latest to self-hosted
+
+- Add release and web workflows
+
+### π Documentation
+
+- Update CHANGELOG for v0.1.2
+
+- Rewrite README with simplified structure and sponsor section
+
+- Add installation and release documentation
+
+- Add crate-level READMEs
+
+### π Features
+
+- **github**: Add issue and PR templates
+
+- **runtime**: Add shared memory IPC runtime and examples
+
+### π Refactor
+
+- **workspace**: Migrate to multi-crate workspace structure
+
+- **core**: Remove old monolithic source structure
+
+- Replace strip_type with typescript transform using GLOBALS context
+---## [0.1.2] - 20 November 2025
### βοΈ Miscellaneous Tasks
@@ -17,8 +72,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### π· CI/CD
-- Added linux environment
-
- Configure openssl for windows
- Add path filters to optimize workflow triggers
@@ -29,12 +82,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### π Features
-- Updated dashboard layout
-
-- Added variable editor skeleton
-
-- Added keymap controls for TUI switching
-
- Added git-cliff for keeping changelogs
- **profiler**: Implement performance profiler scene
@@ -52,4 +99,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **app**: Extract keyboard handling and improve state management
- **variable_editor**: Remove unnecessary references
+---## [0.1.1] - 17 November 2025
+
+### π· CI/CD
+
+- Added linux environment
+
+### π Features
+
+- Updated dashboard layout
+
+- Added variable editor skeleton
+
+- Added keymap controls for TUI switching
+
+### π Refactor
+
+- Cargo fmt linting fix
+
+- Cargo fmt linting fix
---
diff --git a/Cargo.lock b/Cargo.lock
index 0866154..811e453 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -17,6 +17,27 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+[[package]]
+name = "ahash"
+version = "0.8.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+dependencies = [
+ "memchr",
+]
+
[[package]]
name = "allocator-api2"
version = "0.2.21"
@@ -32,6 +53,15 @@ dependencies = [
"libc",
]
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
[[package]]
name = "anstream"
version = "0.6.21"
@@ -88,6 +118,41 @@ version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
+[[package]]
+name = "ar_archive_writer"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a"
+dependencies = [
+ "object 0.32.2",
+]
+
+[[package]]
+name = "ascii"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
+
+[[package]]
+name = "ast_node"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eb025ef00a6da925cf40870b9c8d008526b6004ece399cb0974209720f0b194"
+dependencies = [
+ "quote",
+ "swc_macros_common",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "atomic"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340"
+dependencies = [
+ "bytemuck",
+]
+
[[package]]
name = "autocfg"
version = "1.5.0"
@@ -104,22 +169,98 @@ dependencies = [
"cfg-if",
"libc",
"miniz_oxide",
- "object",
+ "object 0.37.3",
"rustc-demangle",
"windows-link",
]
+[[package]]
+name = "base64"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
+[[package]]
+name = "base64-simd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
+dependencies = [
+ "outref",
+ "vsimd",
+]
+
+[[package]]
+name = "better_scoped_tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cd228125315b132eed175bf47619ac79b945b26e56b848ba203ae4ea8603609"
+dependencies = [
+ "scoped-tls",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
[[package]]
name = "bitflags"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
[[package]]
name = "bumpalo"
-version = "3.19.0"
+version = "3.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
+dependencies = [
+ "allocator-api2",
+]
+
+[[package]]
+name = "bytemuck"
+version = "1.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
[[package]]
name = "bytes"
@@ -128,34 +269,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
[[package]]
-name = "cargo-bin"
-version = "0.1.0"
+name = "bytes-str"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c60b5ce37e0b883c37eb89f79a1e26fbe9c1081945d024eee93e8d91a7e18b3"
dependencies = [
- "cargo-run-bin",
+ "bytes",
+ "serde",
]
[[package]]
-name = "cargo-run-bin"
-version = "1.7.5"
+name = "camino"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ba4ea665f68a2042470ec6e27a36755783ebd3367b90bec2fb100f9d5012fd8"
+checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "cargo-platform"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
dependencies = [
- "anyhow",
- "cfg-if",
- "clap",
- "rustversion",
"serde",
- "toml",
- "toml_edit",
- "version_check",
- "which",
]
[[package]]
-name = "cassowary"
-version = "0.3.0"
+name = "cargo_metadata"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "cargo_metadata"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
+checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.17",
+]
[[package]]
name = "castaway"
@@ -168,9 +335,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.2.46"
+version = "1.2.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36"
+checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3"
dependencies = [
"find-msvc-tools",
"shlex",
@@ -182,48 +349,82 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
+[[package]]
+name = "checkpoint-parser"
+version = "0.1.3"
+dependencies = [
+ "checkpoint-shared",
+ "serde",
+ "serde_json",
+ "swc_core",
+]
+
+[[package]]
+name = "checkpoint-shared"
+version = "0.1.3"
+dependencies = [
+ "serde",
+ "serde_json",
+ "shared_memory",
+]
+
[[package]]
name = "checkpoint-ts"
-version = "0.1.2"
+version = "0.1.3"
dependencies = [
+ "checkpoint-parser",
+ "checkpoint-shared",
"chrono",
+ "clap",
"color-eyre",
- "crossterm 0.29.0",
+ "crossterm",
+ "dirs",
"futures",
"ratatui",
"serde",
"serde_json",
+ "sha2",
+ "thiserror 2.0.17",
"throbber-widgets-tui",
"tokio",
+ "walkdir",
]
[[package]]
name = "chrono"
-version = "0.4.42"
+version = "0.4.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
+checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
dependencies = [
"iana-time-zone",
"js-sys",
"num-traits",
+ "serde",
"wasm-bindgen",
"windows-link",
]
[[package]]
name = "clap"
-version = "4.5.51"
+version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
+checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394"
dependencies = [
"clap_builder",
+ "clap_derive",
]
[[package]]
name = "clap_builder"
-version = "4.5.51"
+version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
+checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00"
dependencies = [
"anstream",
"anstyle",
@@ -231,11 +432,23 @@ dependencies = [
"strsim",
]
+[[package]]
+name = "clap_derive"
+version = "4.5.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
[[package]]
name = "clap_lex"
-version = "0.7.6"
+version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
+checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32"
[[package]]
name = "color-eyre"
@@ -272,9 +485,22 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "compact_str"
-version = "0.8.1"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "ryu",
+ "static_assertions",
+]
+
+[[package]]
+name = "compact_str"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
+checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a"
dependencies = [
"castaway",
"cfg-if",
@@ -286,9 +512,9 @@ dependencies = [
[[package]]
name = "convert_case"
-version = "0.7.1"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7"
+checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
dependencies = [
"unicode-segmentation",
]
@@ -300,19 +526,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
-name = "crossterm"
-version = "0.28.1"
+name = "cpufeatures"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
- "bitflags",
- "crossterm_winapi",
- "mio",
- "parking_lot",
- "rustix 0.38.44",
- "signal-hook",
- "signal-hook-mio",
- "winapi",
+ "libc",
]
[[package]]
@@ -321,14 +540,14 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
dependencies = [
- "bitflags",
+ "bitflags 2.10.0",
"crossterm_winapi",
"derive_more",
"document-features",
"futures-core",
"mio",
"parking_lot",
- "rustix 1.1.2",
+ "rustix",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -343,14 +562,44 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "crypto-common"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "csscolorparser"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf"
+dependencies = [
+ "lab",
+ "phf",
+]
+
[[package]]
name = "darling"
version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
- "darling_core",
- "darling_macro",
+ "darling_core 0.20.11",
+ "darling_macro 0.20.11",
+]
+
+[[package]]
+name = "darling"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
+dependencies = [
+ "darling_core 0.23.0",
+ "darling_macro 0.23.0",
]
[[package]]
@@ -364,7 +613,20 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
+dependencies = [
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn 2.0.114",
]
[[package]]
@@ -373,101 +635,308 @@ version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
- "darling_core",
+ "darling_core 0.20.11",
"quote",
- "syn",
+ "syn 2.0.114",
]
[[package]]
-name = "derive_more"
-version = "2.0.1"
+name = "darling_macro"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
+checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
- "derive_more-impl",
+ "darling_core 0.23.0",
+ "quote",
+ "syn 2.0.114",
]
[[package]]
-name = "derive_more-impl"
-version = "2.0.1"
+name = "data-encoding"
+version = "2.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea"
+
+[[package]]
+name = "debugid"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
+checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
dependencies = [
- "convert_case",
- "proc-macro2",
- "quote",
- "syn",
+ "serde",
+ "uuid",
]
[[package]]
-name = "document-features"
-version = "0.2.12"
+name = "deltae"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4"
+
+[[package]]
+name = "deranged"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
dependencies = [
- "litrs",
+ "powerfmt",
]
[[package]]
-name = "either"
-version = "1.15.0"
+name = "derive_builder"
+version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
+dependencies = [
+ "derive_builder_macro",
+]
[[package]]
-name = "equivalent"
-version = "1.0.2"
+name = "derive_builder_core"
+version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
+dependencies = [
+ "darling 0.20.11",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
[[package]]
-name = "errno"
-version = "0.3.14"
+name = "derive_builder_macro"
+version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
- "libc",
- "windows-sys 0.61.2",
+ "derive_builder_core",
+ "syn 2.0.114",
]
[[package]]
-name = "eyre"
-version = "0.6.12"
+name = "derive_more"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
dependencies = [
- "indenter",
- "once_cell",
+ "derive_more-impl",
]
[[package]]
-name = "find-msvc-tools"
-version = "0.1.5"
+name = "derive_more-impl"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn 2.0.114",
+]
[[package]]
-name = "fnv"
-version = "1.0.7"
+name = "diff"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]]
-name = "foldhash"
-version = "0.1.5"
+name = "difference"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
[[package]]
-name = "futures"
-version = "0.3.31"
+name = "digest"
+version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "dirs"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "document-features"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+dependencies = [
+ "litrs",
+]
+
+[[package]]
+name = "dragonbox_ecma"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf"
+
+[[package]]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "euclid"
+version = "0.22.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "eyre"
+version = "0.6.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
+dependencies = [
+ "indenter",
+ "once_cell",
+]
+
+[[package]]
+name = "fancy-regex"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2"
+dependencies = [
+ "bit-set",
+ "regex",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
+[[package]]
+name = "filedescriptor"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d"
+dependencies = [
+ "libc",
+ "thiserror 1.0.69",
+ "winapi",
+]
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41"
+
+[[package]]
+name = "finl_unicode"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5"
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foldhash"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "from_variant"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9"
+dependencies = [
+ "swc_macros_common",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "futures"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
"futures-sink",
"futures-task",
"futures-util",
@@ -514,7 +983,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.114",
]
[[package]]
@@ -547,28 +1016,71 @@ dependencies = [
"slab",
]
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+ "wasip2",
+]
+
[[package]]
name = "gimli"
version = "0.32.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
+[[package]]
+name = "glob"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
+
[[package]]
name = "hashbrown"
-version = "0.15.5"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
+ "ahash",
"allocator-api2",
- "equivalent",
- "foldhash",
]
[[package]]
name = "hashbrown"
-version = "0.16.0"
+version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash",
+]
[[package]]
name = "heck"
@@ -577,12 +1089,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
-name = "home"
-version = "0.5.12"
+name = "hermit-abi"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hstr"
+version = "3.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d"
+checksum = "faa57007c3c9dab34df2fa4c1fb52fe9c34ec5a27ed9d8edea53254b50cd7887"
dependencies = [
- "windows-sys 0.61.2",
+ "hashbrown 0.14.5",
+ "new_debug_unreachable",
+ "once_cell",
+ "rustc-hash",
+ "serde",
+ "triomphe",
]
[[package]]
@@ -609,12 +1138,120 @@ dependencies = [
"cc",
]
+[[package]]
+name = "icu_collections"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
+dependencies = [
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
+
+[[package]]
+name = "icu_properties"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
+dependencies = [
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
+
+[[package]]
+name = "icu_provider"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
+
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+[[package]]
+name = "idna"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "if_chain"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb"
+
[[package]]
name = "indenter"
version = "0.3.4"
@@ -623,12 +1260,12 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5"
[[package]]
name = "indexmap"
-version = "2.12.0"
+version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
+checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
- "hashbrown 0.16.0",
+ "hashbrown 0.16.1",
]
[[package]]
@@ -642,15 +1279,27 @@ dependencies = [
[[package]]
name = "instability"
-version = "0.3.9"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a"
+checksum = "357b7205c6cd18dd2c86ed312d1e70add149aea98e7ef72b9fdf0270e555c11d"
dependencies = [
- "darling",
+ "darling 0.23.0",
"indoc",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "is-macro"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
]
[[package]]
@@ -668,22 +1317,48 @@ dependencies = [
"either",
]
+[[package]]
+name = "itertools"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+dependencies = [
+ "either",
+]
+
[[package]]
name = "itoa"
-version = "1.0.15"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
[[package]]
name = "js-sys"
-version = "0.3.82"
+version = "0.3.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
+checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
dependencies = [
"once_cell",
"wasm-bindgen",
]
+[[package]]
+name = "kasuari"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b"
+dependencies = [
+ "hashbrown 0.16.1",
+ "portable-atomic",
+ "thiserror 2.0.17",
+]
+
+[[package]]
+name = "lab"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f"
+
[[package]]
name = "lazy_static"
version = "1.5.0"
@@ -692,22 +1367,41 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
-version = "0.2.177"
+version = "0.2.180"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
+checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
[[package]]
-name = "linux-raw-sys"
-version = "0.4.15"
+name = "libredox"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
+checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"
+dependencies = [
+ "bitflags 2.10.0",
+ "libc",
+]
[[package]]
-name = "linux-raw-sys"
-version = "0.11.0"
+name = "line-clipping"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
-
+checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a"
+dependencies = [
+ "bitflags 2.10.0",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
+
+[[package]]
+name = "litemap"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
+
[[package]]
name = "litrs"
version = "1.0.0"
@@ -725,17 +1419,36 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.28"
+version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "lru"
-version = "0.12.5"
+version = "0.16.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593"
+dependencies = [
+ "hashbrown 0.16.1",
+]
+
+[[package]]
+name = "mac_address"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303"
+dependencies = [
+ "nix 0.29.0",
+ "winapi",
+]
+
+[[package]]
+name = "matchers"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
+checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
dependencies = [
- "hashbrown 0.15.5",
+ "regex-automata",
]
[[package]]
@@ -744,6 +1457,60 @@ version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
+[[package]]
+name = "memmem"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15"
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "miette"
+version = "7.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7"
+dependencies = [
+ "cfg-if",
+ "miette-derive",
+ "owo-colors",
+ "textwrap",
+ "unicode-width 0.1.14",
+]
+
+[[package]]
+name = "miette-derive"
+version = "7.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
[[package]]
name = "miniz_oxide"
version = "0.8.9"
@@ -755,9 +1522,9 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.1.0"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873"
+checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
dependencies = [
"libc",
"log",
@@ -765,6 +1532,94 @@ dependencies = [
"windows-sys 0.61.2",
]
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
+[[package]]
+name = "nix"
+version = "0.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
+dependencies = [
+ "bitflags 1.3.2",
+ "cc",
+ "cfg-if",
+ "libc",
+ "memoffset 0.6.5",
+]
+
+[[package]]
+name = "nix"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
+dependencies = [
+ "bitflags 2.10.0",
+ "cfg-if",
+ "cfg_aliases",
+ "libc",
+ "memoffset 0.9.1",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.50.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+dependencies = [
+ "num-integer",
+ "num-traits",
+ "serde",
+]
+
+[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num-derive"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
[[package]]
name = "num-traits"
version = "0.2.19"
@@ -774,6 +1629,34 @@ dependencies = [
"autocfg",
]
+[[package]]
+name = "num_cpus"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.32.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+dependencies = [
+ "memchr",
+]
+
[[package]]
name = "object"
version = "0.37.3"
@@ -795,12 +1678,42 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+[[package]]
+name = "option-ext"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
+[[package]]
+name = "ordered-float"
+version = "4.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "outref"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
+
[[package]]
name = "owo-colors"
version = "4.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52"
+[[package]]
+name = "par-core"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e96cbd21255b7fb29a5d51ef38a779b517a91abd59e2756c039583f43ef4c90f"
+dependencies = [
+ "once_cell",
+]
+
[[package]]
name = "parking_lot"
version = "0.12.5"
@@ -825,276 +1738,1278 @@ dependencies = [
]
[[package]]
-name = "paste"
-version = "1.0.15"
+name = "percent-encoding"
+version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
-name = "pin-project-lite"
-version = "0.2.16"
+name = "pest"
+version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7"
+dependencies = [
+ "memchr",
+ "ucd-trie",
+]
[[package]]
-name = "pin-utils"
-version = "0.1.0"
+name = "pest_derive"
+version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
[[package]]
-name = "proc-macro2"
-version = "1.0.103"
+name = "pest_generator"
+version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
+checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5"
dependencies = [
- "unicode-ident",
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
]
[[package]]
-name = "quote"
-version = "1.0.42"
+name = "pest_meta"
+version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
+checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365"
dependencies = [
- "proc-macro2",
+ "pest",
+ "sha2",
]
[[package]]
-name = "ratatui"
-version = "0.29.0"
+name = "phf"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
dependencies = [
- "bitflags",
- "cassowary",
- "compact_str",
- "crossterm 0.28.1",
- "indoc",
- "instability",
- "itertools",
- "lru",
- "paste",
- "strum",
- "unicode-segmentation",
- "unicode-truncate",
- "unicode-width 0.2.0",
+ "phf_macros",
+ "phf_shared",
]
[[package]]
-name = "redox_syscall"
-version = "0.5.18"
+name = "phf_codegen"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
dependencies = [
- "bitflags",
+ "phf_generator",
+ "phf_shared",
]
[[package]]
-name = "rustc-demangle"
-version = "0.1.26"
+name = "phf_generator"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
+dependencies = [
+ "phf_shared",
+ "rand",
+]
[[package]]
-name = "rustix"
-version = "0.38.44"
+name = "phf_macros"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
dependencies = [
- "bitflags",
- "errno",
- "libc",
- "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
]
[[package]]
-name = "rustix"
-version = "1.1.2"
+name = "phf_shared"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
dependencies = [
- "bitflags",
- "errno",
- "libc",
- "linux-raw-sys 0.11.0",
- "windows-sys 0.61.2",
+ "siphasher 1.0.1",
]
[[package]]
-name = "rustversion"
-version = "1.0.22"
+name = "pin-project-lite"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
-name = "ryu"
-version = "1.0.20"
+name = "pin-utils"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
-name = "scopeguard"
-version = "1.2.0"
+name = "portable-atomic"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950"
[[package]]
-name = "serde"
-version = "1.0.228"
+name = "potential_utf"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
dependencies = [
- "serde_core",
- "serde_derive",
+ "zerovec",
]
[[package]]
-name = "serde_core"
-version = "1.0.228"
+name = "powerfmt"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
-name = "serde_derive"
-version = "1.0.228"
+name = "ppv-lite86"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "zerocopy",
]
[[package]]
-name = "serde_json"
-version = "1.0.145"
+name = "pretty_assertions"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
+checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d"
dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
- "serde_core",
+ "diff",
+ "yansi",
]
[[package]]
-name = "sharded-slab"
-version = "0.1.7"
+name = "proc-macro2"
+version = "1.0.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
dependencies = [
- "lazy_static",
+ "unicode-ident",
]
[[package]]
-name = "shlex"
-version = "1.3.0"
+name = "psm"
+version = "0.1.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01"
+dependencies = [
+ "ar_archive_writer",
+ "cc",
+]
[[package]]
-name = "signal-hook"
-version = "0.3.18"
+name = "quote"
+version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
dependencies = [
- "libc",
- "signal-hook-registry",
+ "proc-macro2",
]
[[package]]
-name = "signal-hook-mio"
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.17",
+]
+
+[[package]]
+name = "ratatui"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc"
+dependencies = [
+ "instability",
+ "ratatui-core",
+ "ratatui-crossterm",
+ "ratatui-macros",
+ "ratatui-termwiz",
+ "ratatui-widgets",
+]
+
+[[package]]
+name = "ratatui-core"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293"
+dependencies = [
+ "bitflags 2.10.0",
+ "compact_str 0.9.0",
+ "hashbrown 0.16.1",
+ "indoc",
+ "itertools 0.14.0",
+ "kasuari",
+ "lru",
+ "strum",
+ "thiserror 2.0.17",
+ "unicode-segmentation",
+ "unicode-truncate",
+ "unicode-width 0.2.2",
+]
+
+[[package]]
+name = "ratatui-crossterm"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3"
+dependencies = [
+ "cfg-if",
+ "crossterm",
+ "instability",
+ "ratatui-core",
+]
+
+[[package]]
+name = "ratatui-macros"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7f1342a13e83e4bb9d0b793d0ea762be633f9582048c892ae9041ef39c936f4"
+dependencies = [
+ "ratatui-core",
+ "ratatui-widgets",
+]
+
+[[package]]
+name = "ratatui-termwiz"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f76fe0bd0ed4295f0321b1676732e2454024c15a35d01904ddb315afd3d545c"
+dependencies = [
+ "ratatui-core",
+ "termwiz",
+]
+
+[[package]]
+name = "ratatui-widgets"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db"
+dependencies = [
+ "bitflags 2.10.0",
+ "hashbrown 0.16.1",
+ "indoc",
+ "instability",
+ "itertools 0.14.0",
+ "line-clipping",
+ "ratatui-core",
+ "strum",
+ "time",
+ "unicode-segmentation",
+ "unicode-width 0.2.2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+dependencies = [
+ "bitflags 2.10.0",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
+dependencies = [
+ "getrandom 0.2.17",
+ "libredox",
+ "thiserror 2.0.17",
+]
+
+[[package]]
+name = "regex"
+version = "1.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
+
+[[package]]
+name = "relative-path"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d"
+
+[[package]]
+name = "rustc-hash"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
+dependencies = [
+ "bitflags 2.10.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+
+[[package]]
+name = "ryu"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "semver"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+dependencies = [
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "seq-macro"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
+
+[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+dependencies = [
+ "itoa",
+ "memchr",
+ "serde",
+ "serde_core",
+ "zmij",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shared_memory"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba8593196da75d9dc4f69349682bd4c2099f8cde114257d1ef7ef1b33d1aba54"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "nix 0.23.2",
+ "rand",
+ "win-sys",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "signal-hook"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-mio"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
+checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
+dependencies = [
+ "libc",
+ "mio",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+dependencies = [
+ "errno",
+ "libc",
+]
+
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
+[[package]]
+name = "siphasher"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
+
+[[package]]
+name = "slab"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "smartstring"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
+dependencies = [
+ "autocfg",
+ "static_assertions",
+ "version_check",
+]
+
+[[package]]
+name = "socket2"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
+dependencies = [
+ "libc",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+
+[[package]]
+name = "stacker"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "libc",
+ "psm",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "string_enum"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e"
+dependencies = [
+ "quote",
+ "swc_macros_common",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "strum"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
+dependencies = [
+ "strum_macros",
+]
+
+[[package]]
+name = "strum_macros"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "swc_allocator"
+version = "4.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d7eefd2c8b228a8c73056482b2ae4b3a1071fbe07638e3b55ceca8570cc48bb"
+dependencies = [
+ "allocator-api2",
+ "bumpalo",
+ "hashbrown 0.14.5",
+ "rustc-hash",
+]
+
+[[package]]
+name = "swc_atoms"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4ccbe2ecad10ad7432100f878a107b1d972a8aee83ca53184d00c23a078bb8a"
+dependencies = [
+ "hstr",
+ "once_cell",
+ "serde",
+]
+
+[[package]]
+name = "swc_common"
+version = "18.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1c06698254e9b47daaf9bbb062af489a350bd8d10dfaab0cabbd32d46cec69d"
+dependencies = [
+ "anyhow",
+ "ast_node",
+ "better_scoped_tls",
+ "bytes-str",
+ "either",
+ "from_variant",
+ "num-bigint",
+ "once_cell",
+ "parking_lot",
+ "rustc-hash",
+ "serde",
+ "siphasher 0.3.11",
+ "swc_atoms",
+ "swc_eq_ignore_macros",
+ "swc_sourcemap",
+ "swc_visit",
+ "termcolor",
+ "tracing",
+ "unicode-width 0.2.2",
+ "url",
+]
+
+[[package]]
+name = "swc_config"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72e90b52ee734ded867104612218101722ad87ff4cf74fe30383bd244a533f97"
+dependencies = [
+ "anyhow",
+ "bytes-str",
+ "indexmap",
+ "serde",
+ "serde_json",
+ "swc_config_macro",
+]
+
+[[package]]
+name = "swc_config_macro"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b416e8ce6de17dc5ea496e10c7012b35bbc0e3fef38d2e065eed936490db0b3"
dependencies = [
- "libc",
- "mio",
- "signal-hook",
+ "proc-macro2",
+ "quote",
+ "swc_macros_common",
+ "syn 2.0.114",
]
[[package]]
-name = "signal-hook-registry"
-version = "1.4.6"
+name = "swc_core"
+version = "57.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
+checksum = "afb84a28511166b70a7e651b730d99bd4d3e2914ede7009d77c65afbcdbae0ce"
dependencies = [
- "libc",
+ "swc_allocator",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_codegen",
+ "swc_ecma_parser",
+ "swc_ecma_transforms_base",
+ "swc_ecma_transforms_testing",
+ "swc_ecma_transforms_typescript",
+ "swc_ecma_visit",
+ "vergen",
]
[[package]]
-name = "slab"
-version = "0.4.11"
+name = "swc_ecma_ast"
+version = "20.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
+checksum = "252124d0d786aa2338860701a067c93488747dfadbfedb16ac78f386e16a0ac4"
+dependencies = [
+ "bitflags 2.10.0",
+ "is-macro",
+ "num-bigint",
+ "once_cell",
+ "phf",
+ "rustc-hash",
+ "string_enum",
+ "swc_atoms",
+ "swc_common",
+ "swc_visit",
+ "unicode-id-start",
+]
[[package]]
-name = "smallvec"
-version = "1.15.1"
+name = "swc_ecma_codegen"
+version = "23.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+checksum = "56116de786118dce35e90b612a1f4d952116dd2728ecb197c8064cfccf527baf"
+dependencies = [
+ "ascii",
+ "compact_str 0.7.1",
+ "dragonbox_ecma",
+ "memchr",
+ "num-bigint",
+ "once_cell",
+ "regex",
+ "rustc-hash",
+ "serde",
+ "swc_allocator",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_codegen_macros",
+ "tracing",
+]
[[package]]
-name = "socket2"
-version = "0.6.1"
+name = "swc_ecma_codegen_macros"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
+checksum = "e276dc62c0a2625a560397827989c82a93fd545fcf6f7faec0935a82cc4ddbb8"
dependencies = [
- "libc",
- "windows-sys 0.60.2",
+ "proc-macro2",
+ "swc_macros_common",
+ "syn 2.0.114",
]
[[package]]
-name = "static_assertions"
-version = "1.1.0"
+name = "swc_ecma_hooks"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+checksum = "8c9adff1f01550ef653e262ad709a2914d3dd6cfd559aea2e28eeeab8f895981"
+dependencies = [
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_visit",
+]
[[package]]
-name = "strsim"
-version = "0.11.1"
+name = "swc_ecma_parser"
+version = "34.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+checksum = "18271343933dfa820caba5fabb36118b1cfbf0010702a2947c8bf81b9154e36c"
+dependencies = [
+ "bitflags 2.10.0",
+ "either",
+ "num-bigint",
+ "phf",
+ "rustc-hash",
+ "seq-macro",
+ "serde",
+ "smartstring",
+ "stacker",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "tracing",
+]
[[package]]
-name = "strum"
-version = "0.26.3"
+name = "swc_ecma_testing"
+version = "19.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
+checksum = "177244625cdecd268a07534c3b087f7f263604dd40f3ec7c7a984ca95351b632"
dependencies = [
- "strum_macros",
+ "anyhow",
+ "hex",
+ "sha2",
+ "testing",
+ "tracing",
]
[[package]]
-name = "strum_macros"
-version = "0.26.4"
+name = "swc_ecma_transforms_base"
+version = "37.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
+checksum = "dcea2b456609d624513ebd884c7152d5b1a04ad5dd8fcb957e00e8993387ed00"
+dependencies = [
+ "better_scoped_tls",
+ "indexmap",
+ "once_cell",
+ "par-core",
+ "phf",
+ "rustc-hash",
+ "serde",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_parser",
+ "swc_ecma_utils",
+ "swc_ecma_visit",
+ "tracing",
+]
+
+[[package]]
+name = "swc_ecma_transforms_react"
+version = "41.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e071551d429c184f40080696ee0bcbd54ccf75bf11569302b6dc5de106a6984"
+dependencies = [
+ "base64",
+ "bytes-str",
+ "indexmap",
+ "once_cell",
+ "rustc-hash",
+ "serde",
+ "sha1",
+ "string_enum",
+ "swc_atoms",
+ "swc_common",
+ "swc_config",
+ "swc_ecma_ast",
+ "swc_ecma_hooks",
+ "swc_ecma_parser",
+ "swc_ecma_transforms_base",
+ "swc_ecma_utils",
+ "swc_ecma_visit",
+]
+
+[[package]]
+name = "swc_ecma_transforms_testing"
+version = "41.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1385bece088a1c51d0c3c379642eacf5ed9a69c1b6fe5c4c07878eeecbb55ff8"
+dependencies = [
+ "ansi_term",
+ "anyhow",
+ "base64",
+ "hex",
+ "serde",
+ "serde_json",
+ "sha2",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_codegen",
+ "swc_ecma_parser",
+ "swc_ecma_testing",
+ "swc_ecma_transforms_base",
+ "swc_ecma_utils",
+ "swc_ecma_visit",
+ "swc_sourcemap",
+ "tempfile",
+ "testing",
+]
+
+[[package]]
+name = "swc_ecma_transforms_typescript"
+version = "41.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c59c1d87f4c36161833462cbf16d769fce63158da04a42dbb83c8fac7ee8e04e"
+dependencies = [
+ "bytes-str",
+ "rustc-hash",
+ "serde",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_transforms_base",
+ "swc_ecma_transforms_react",
+ "swc_ecma_utils",
+ "swc_ecma_visit",
+]
+
+[[package]]
+name = "swc_ecma_utils"
+version = "26.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3669c1d92ba315caff5a80df76141367acf61b2d846231a1960e25be65a20fbd"
+dependencies = [
+ "dragonbox_ecma",
+ "indexmap",
+ "num_cpus",
+ "once_cell",
+ "par-core",
+ "rustc-hash",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_visit",
+ "tracing",
+]
+
+[[package]]
+name = "swc_ecma_visit"
+version = "20.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e971a258717db3dc8939c38410d8b8cb8126f1b05b9758672daa7cae3e0248c2"
+dependencies = [
+ "new_debug_unreachable",
+ "num-bigint",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_visit",
+ "tracing",
+]
+
+[[package]]
+name = "swc_eq_ignore_macros"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c16ce73424a6316e95e09065ba6a207eba7765496fed113702278b7711d4b632"
dependencies = [
- "heck",
"proc-macro2",
"quote",
- "rustversion",
- "syn",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "swc_error_reporters"
+version = "20.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3615d499e30e5bc4d53978d1fc4c1975c8be9acc79f42b5956bbca7fc7c6dc58"
+dependencies = [
+ "anyhow",
+ "miette",
+ "once_cell",
+ "serde",
+ "swc_common",
+]
+
+[[package]]
+name = "swc_macros_common"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1efbaa74943dc5ad2a2fb16cbd78b77d7e4d63188f3c5b4df2b4dcd2faaae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "swc_sourcemap"
+version = "9.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de08ef00f816acdd1a58ee8a81c0e1a59eefef2093aefe5611f256fa6b64c4d7"
+dependencies = [
+ "base64-simd",
+ "bitvec",
+ "bytes-str",
+ "data-encoding",
+ "debugid",
+ "if_chain",
+ "rustc-hash",
+ "serde",
+ "serde_json",
+ "unicode-id-start",
+ "url",
+]
+
+[[package]]
+name = "swc_visit"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62fb71484b486c185e34d2172f0eabe7f4722742aad700f426a494bb2de232a2"
+dependencies = [
+ "either",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
]
[[package]]
name = "syn"
-version = "2.0.110"
+version = "2.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
+checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
+[[package]]
+name = "synstructure"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
+[[package]]
+name = "tempfile"
+version = "3.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
+dependencies = [
+ "fastrand",
+ "getrandom 0.3.4",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminfo"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662"
+dependencies = [
+ "fnv",
+ "nom",
+ "phf",
+ "phf_codegen",
+]
+
+[[package]]
+name = "termios"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "termwiz"
+version = "0.23.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7"
+dependencies = [
+ "anyhow",
+ "base64",
+ "bitflags 2.10.0",
+ "fancy-regex",
+ "filedescriptor",
+ "finl_unicode",
+ "fixedbitset",
+ "hex",
+ "lazy_static",
+ "libc",
+ "log",
+ "memmem",
+ "nix 0.29.0",
+ "num-derive",
+ "num-traits",
+ "ordered-float",
+ "pest",
+ "pest_derive",
+ "phf",
+ "sha2",
+ "signal-hook",
+ "siphasher 1.0.1",
+ "terminfo",
+ "termios",
+ "thiserror 1.0.69",
+ "ucd-trie",
+ "unicode-segmentation",
+ "vtparse",
+ "wezterm-bidi",
+ "wezterm-blob-leases",
+ "wezterm-color-types",
+ "wezterm-dynamic",
+ "wezterm-input-types",
+ "winapi",
+]
+
+[[package]]
+name = "testing"
+version = "19.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad1506c602222ebab5d96100180f8d3c015b2394eceb00a46d20c25b8b1e5100"
+dependencies = [
+ "cargo_metadata 0.18.1",
+ "difference",
+ "once_cell",
+ "pretty_assertions",
+ "regex",
+ "rustc-hash",
+ "serde",
+ "serde_json",
+ "swc_common",
+ "swc_error_reporters",
+ "testing_macros",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "testing_macros"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7442bd3ca09f38d4788dc5ebafbc1967c3717726b4b074db011d470b353548b"
+dependencies = [
+ "anyhow",
+ "glob",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "relative-path",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057"
+dependencies = [
+ "unicode-linebreak",
+ "unicode-width 0.2.2",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
+dependencies = [
+ "thiserror-impl 2.0.17",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
[[package]]
name = "thread_local"
version = "1.1.9"
@@ -1105,19 +3020,50 @@ dependencies = [
]
[[package]]
-name = "throbber-widgets-tui"
-version = "0.9.0"
+name = "throbber-widgets-tui"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1e6941f74491a80911cb8821cb1f55f7e13bca867b28a2b14e5a1daaf691eb3"
+dependencies = [
+ "ratatui",
+]
+
+[[package]]
+name = "time"
+version = "0.3.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd"
+dependencies = [
+ "deranged",
+ "libc",
+ "num-conv",
+ "num_threads",
+ "powerfmt",
+ "serde_core",
+ "time-core",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca"
+
+[[package]]
+name = "tinystr"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45e58887883fb0a259717b16d68d251983e40850b4b2f45c2da410f46d4333dc"
+checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
dependencies = [
- "ratatui",
+ "displaydoc",
+ "zerovec",
]
[[package]]
name = "tokio"
-version = "1.48.0"
+version = "1.49.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
+checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"
dependencies = [
"bytes",
"libc",
@@ -1138,50 +3084,36 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
- "syn",
-]
-
-[[package]]
-name = "toml"
-version = "0.5.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
-dependencies = [
- "serde",
+ "syn 2.0.114",
]
[[package]]
-name = "toml_datetime"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
-
-[[package]]
-name = "toml_edit"
-version = "0.19.15"
+name = "tracing"
+version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
- "indexmap",
- "toml_datetime",
- "winnow",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
]
[[package]]
-name = "tracing"
-version = "0.1.41"
+name = "tracing-attributes"
+version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
+checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
- "pin-project-lite",
- "tracing-core",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
]
[[package]]
name = "tracing-core"
-version = "0.1.34"
+version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [
"once_cell",
"valuable",
@@ -1197,23 +3129,75 @@ dependencies = [
"tracing-subscriber",
]
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
[[package]]
name = "tracing-subscriber"
-version = "0.3.20"
+version = "0.3.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
+checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex-automata",
"sharded-slab",
+ "smallvec",
"thread_local",
+ "tracing",
"tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "triomphe"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
]
+[[package]]
+name = "typenum"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
+
+[[package]]
+name = "unicode-id-start"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007"
+
[[package]]
name = "unicode-ident"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
+[[package]]
+name = "unicode-linebreak"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
+
[[package]]
name = "unicode-segmentation"
version = "1.12.0"
@@ -1222,13 +3206,13 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "unicode-truncate"
-version = "1.1.0"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf"
+checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330"
dependencies = [
- "itertools",
+ "itertools 0.13.0",
"unicode-segmentation",
- "unicode-width 0.1.14",
+ "unicode-width 0.2.2",
]
[[package]]
@@ -1239,9 +3223,27 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
name = "unicode-width"
-version = "0.2.0"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+
+[[package]]
+name = "url"
+version = "2.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "utf8parse"
@@ -1249,29 +3251,100 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+[[package]]
+name = "uuid"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
+dependencies = [
+ "atomic",
+ "getrandom 0.3.4",
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "valuable"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+[[package]]
+name = "vergen"
+version = "9.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777"
+dependencies = [
+ "anyhow",
+ "cargo_metadata 0.19.2",
+ "derive_builder",
+ "regex",
+ "rustversion",
+ "vergen-lib",
+]
+
+[[package]]
+name = "vergen-lib"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166"
+dependencies = [
+ "anyhow",
+ "derive_builder",
+ "rustversion",
+]
+
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+[[package]]
+name = "vsimd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+
+[[package]]
+name = "vtparse"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+[[package]]
+name = "wasip2"
+version = "1.0.2+wasi-0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
+dependencies = [
+ "wit-bindgen",
+]
+
[[package]]
name = "wasm-bindgen"
-version = "0.2.105"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
+checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
dependencies = [
"cfg-if",
"once_cell",
@@ -1282,9 +3355,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.105"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
+checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -1292,36 +3365,105 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.105"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
+checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.114",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.105"
+version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
+checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
dependencies = [
"unicode-ident",
]
[[package]]
-name = "which"
-version = "4.4.2"
+name = "wezterm-bidi"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec"
dependencies = [
- "either",
- "home",
- "once_cell",
- "rustix 0.38.44",
+ "log",
+ "wezterm-dynamic",
+]
+
+[[package]]
+name = "wezterm-blob-leases"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7"
+dependencies = [
+ "getrandom 0.3.4",
+ "mac_address",
+ "sha2",
+ "thiserror 1.0.69",
+ "uuid",
+]
+
+[[package]]
+name = "wezterm-color-types"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296"
+dependencies = [
+ "csscolorparser",
+ "deltae",
+ "lazy_static",
+ "wezterm-dynamic",
+]
+
+[[package]]
+name = "wezterm-dynamic"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac"
+dependencies = [
+ "log",
+ "ordered-float",
+ "strsim",
+ "thiserror 1.0.69",
+ "wezterm-dynamic-derive",
+]
+
+[[package]]
+name = "wezterm-dynamic-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "wezterm-input-types"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e"
+dependencies = [
+ "bitflags 1.3.2",
+ "euclid",
+ "lazy_static",
+ "serde",
+ "wezterm-dynamic",
+]
+
+[[package]]
+name = "win-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b7b128a98c1cfa201b09eb49ba285887deb3cbe7466a98850eb1adabb452be5"
+dependencies = [
+ "windows",
]
[[package]]
@@ -1340,12 +3482,34 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+[[package]]
+name = "winapi-util"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+[[package]]
+name = "windows"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f"
+dependencies = [
+ "windows_aarch64_msvc 0.34.0",
+ "windows_i686_gnu 0.34.0",
+ "windows_i686_msvc 0.34.0",
+ "windows_x86_64_gnu 0.34.0",
+ "windows_x86_64_msvc 0.34.0",
+]
+
[[package]]
name = "windows-core"
version = "0.62.2"
@@ -1367,7 +3531,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.114",
]
[[package]]
@@ -1378,7 +3542,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.114",
]
[[package]]
@@ -1477,6 +3641,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d"
+
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
@@ -1489,6 +3659,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+[[package]]
+name = "windows_i686_gnu"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed"
+
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
@@ -1513,6 +3689,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+[[package]]
+name = "windows_i686_msvc"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956"
+
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
@@ -1525,6 +3707,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4"
+
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
@@ -1549,6 +3737,12 @@ version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9"
+
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
@@ -1562,10 +3756,131 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
[[package]]
-name = "winnow"
-version = "0.5.40"
+name = "wit-bindgen"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+
+[[package]]
+name = "writeable"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
dependencies = [
- "memchr",
+ "tap",
+]
+
+[[package]]
+name = "yansi"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
+
+[[package]]
+name = "yoke"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
+dependencies = [
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "synstructure",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "synstructure",
+]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "zmij"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
diff --git a/Cargo.toml b/Cargo.toml
index 2f84676..fe377d8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,42 +1,36 @@
-[package]
-name = "checkpoint-ts"
-version = "0.1.2"
-description = "Interactive checkpoint system for TypeScript/JavaScript development. Debug with TUI, inspect state, skip functions, inject values."
-authors = ["ErenayDev "]
-license = "MIT"
+[workspace]
+resolver = "2"
+members = ["crates/core", "crates/parser", "crates/shared"]
+
+[workspace.package]
+version = "0.1.3"
edition = "2024"
+license = "MIT"
repository = "https://github.com/ErenayDev/checkpoint-ts"
+description = "Interactive checkpoint system for TypeScript/JavaScript development. Debug with TUI, inspect state, skip functions, inject values."
+authors = ["ErenayDev erenaydev@proton.me"]
homepage = "https://github.com/ErenayDev/checkpoint-ts"
documentation = "https://docs.rs/checkpoint-ts"
readme = "README.md"
keywords = ["debug", "typescript", "javascript", "tui", "checkpoint"]
categories = ["development-tools::debugging", "command-line-utilities"]
-rust-version = "1.87"
-exclude = [
- "target/",
- ".git/",
- ".github/",
- "tools/",
- "*.log"
-]
-
-[[bin]]
-name = "checkpoint"
-path = "src/main.rs"
-
-[workspace]
-members = ["tools/cargo-bin"]
-[package.metadata.bin]
-cargo-watch = { version = "8.5.2" }
+[workspace.dependencies]
+shared_memory = "0.12"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+swc_core = { version = "57.0.1", features = [
+ "__common",
+ "__ecma",
+ "ecma_ast",
+ "ecma_parser",
+ "ecma_transforms_typescript",
+ "ecma_codegen",
+ "ecma_visit",
+ "__testing_transform",
+] } # old ver -> 54
-[dependencies]
-chrono = "0.4.42"
-color-eyre = "0.6.3"
-crossterm = { version = "0.29.0", features = ["event-stream"] }
-futures = "0.3.31"
-ratatui = "0.29.0"
-serde = "1.0.228"
-serde_json = "1.0.145"
-throbber-widgets-tui = "0.9.0"
-tokio = { version = "1.40.0", features = ["full"] }
+# The profile that 'dist' will build with
+[profile.dist]
+inherits = "release"
+lto = "thin"
diff --git a/FUNDING.yml b/FUNDING.yml
new file mode 100644
index 0000000..a4d752a
--- /dev/null
+++ b/FUNDING.yml
@@ -0,0 +1,3 @@
+github: [ErenayDev]
+liberapay: ErenayDev
+open_collective: erenay
diff --git a/README.md b/README.md
index a2c8ea8..64b437b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# checkpoint.ts
+# Checkpoint.ts
[](https://codecov.io/gh/ErenayDev/checkpoint-ts)
[](https://github.com/ErenayDev/checkpoint-ts/actions)
@@ -7,6 +7,49 @@
[](https://www.rust-lang.org)
[](https://crates.io/crates/checkpoint-ts)
+<<<<<<< develop
+Interactive checkpoint system for TypeScript/JavaScript.
+
+## Quick Start
+
+See [INSTALLATION.md](./doc/INSTALLATION.md)
+
+## Key Features
+
+When you run program, first parses your code with AST's and injects checkpointing functions.
+Then injects runtime codes and then a TUI appears to you view.
+When you wanna checkpoint in a point, the function name and its parameters, variables written to cache(in your .checkpoint folder)
+If you wanna run the checkpointed function, just do it. You can edit the parameters, variables for the function.
+You can profile execution times for each function.
+Also you can edit whatever you want. really. try it yourself.
+
+## Usage
+
+### Basic Usage
+
+```bash
+checkpoint script.ts
+```
+
+### Runtime Selection
+
+Currently only [Bun](https://bun.sh) is available. Check again in future for more runtimes
+
+```bash
+checkpoint script.ts --interpreter bun
+```
+
+### Pre-instrumented Files (not available yet)
+
+```bash
+checkpoint --instrumented script.ts
+```
+
+## Supported Features
+
+Covers like 85% TypeScript/JavaScript ecosystem codes. I'm planning optimize code and performance with switching to [oxc](https://oxc.rs) from [swc](https://swc.rs).
+And for dead-code elimination, I wanna use the [jsshaker](https://github.com/kermanx/jsshaker) for O(n) to O(1) optimization
+=======
> Stop rerunning 10 functions to debug the 11th.
@@ -20,13 +63,12 @@ Written in Rust π¦ | Works with Bun, Node, Deno
Functional logic has not yet been implemented. Please check again in the future.
---
+>>>>>>> main
## Contributing
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
----
-
## License
Copyright (c) ErenayDev
@@ -35,26 +77,20 @@ This project is licensed under the MIT license ([LICENSE] or
+
+
+
+
## Acknowledgments
Built with:
+
- [SWC](https://swc.rs/) for TypeScript/JavaScript parsing
- [Ratatui](https://ratatui.rs/) for terminal user interface
- [Tokio](https://tokio.rs/) for async runtime support
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..1a8ea52
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,3 @@
+[ ] JSX/TSX support
+[+] Discord RPC
+[ ] Settings page or ~/.config/checkpoint/config.yml
diff --git a/assets/logo-tests.png b/assets/logo-tests.png
new file mode 100644
index 0000000..3f0abcf
Binary files /dev/null and b/assets/logo-tests.png differ
diff --git a/assets/logo.png b/assets/logo.png
new file mode 100644
index 0000000..d3a09dd
Binary files /dev/null and b/assets/logo.png differ
diff --git a/assets/logo2.png b/assets/logo2.png
new file mode 100644
index 0000000..ba6eac5
Binary files /dev/null and b/assets/logo2.png differ
diff --git a/assets/logo3.png b/assets/logo3.png
new file mode 100644
index 0000000..0158df3
Binary files /dev/null and b/assets/logo3.png differ
diff --git a/assets/logo4.png b/assets/logo4.png
new file mode 100644
index 0000000..a4bbe43
Binary files /dev/null and b/assets/logo4.png differ
diff --git a/crates/core/Cargo.lock b/crates/core/Cargo.lock
new file mode 100644
index 0000000..0866154
--- /dev/null
+++ b/crates/core/Cargo.lock
@@ -0,0 +1,1571 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "addr2line"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+dependencies = [
+ "anstyle",
+ "once_cell_polyfill",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
+
+[[package]]
+name = "autocfg"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+
+[[package]]
+name = "backtrace"
+version = "0.3.76"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6"
+dependencies = [
+ "addr2line",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+ "windows-link",
+]
+
+[[package]]
+name = "bitflags"
+version = "2.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
+
+[[package]]
+name = "bumpalo"
+version = "3.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+
+[[package]]
+name = "bytes"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
+
+[[package]]
+name = "cargo-bin"
+version = "0.1.0"
+dependencies = [
+ "cargo-run-bin",
+]
+
+[[package]]
+name = "cargo-run-bin"
+version = "1.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba4ea665f68a2042470ec6e27a36755783ebd3367b90bec2fb100f9d5012fd8"
+dependencies = [
+ "anyhow",
+ "cfg-if",
+ "clap",
+ "rustversion",
+ "serde",
+ "toml",
+ "toml_edit",
+ "version_check",
+ "which",
+]
+
+[[package]]
+name = "cassowary"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
+
+[[package]]
+name = "castaway"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "cc"
+version = "1.2.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36"
+dependencies = [
+ "find-msvc-tools",
+ "shlex",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+
+[[package]]
+name = "checkpoint-ts"
+version = "0.1.2"
+dependencies = [
+ "chrono",
+ "color-eyre",
+ "crossterm 0.29.0",
+ "futures",
+ "ratatui",
+ "serde",
+ "serde_json",
+ "throbber-widgets-tui",
+ "tokio",
+]
+
+[[package]]
+name = "chrono"
+version = "0.4.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-link",
+]
+
+[[package]]
+name = "clap"
+version = "4.5.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
+dependencies = [
+ "clap_builder",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
+
+[[package]]
+name = "color-eyre"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d"
+dependencies = [
+ "backtrace",
+ "color-spantrace",
+ "eyre",
+ "indenter",
+ "once_cell",
+ "owo-colors",
+ "tracing-error",
+]
+
+[[package]]
+name = "color-spantrace"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427"
+dependencies = [
+ "once_cell",
+ "owo-colors",
+ "tracing-core",
+ "tracing-error",
+]
+
+[[package]]
+name = "colorchoice"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+
+[[package]]
+name = "compact_str"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "rustversion",
+ "ryu",
+ "static_assertions",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "crossterm"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
+dependencies = [
+ "bitflags",
+ "crossterm_winapi",
+ "mio",
+ "parking_lot",
+ "rustix 0.38.44",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
+dependencies = [
+ "bitflags",
+ "crossterm_winapi",
+ "derive_more",
+ "document-features",
+ "futures-core",
+ "mio",
+ "parking_lot",
+ "rustix 1.1.2",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm_winapi"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "darling"
+version = "0.20.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.20.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.20.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_more"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "document-features"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+dependencies = [
+ "litrs",
+]
+
+[[package]]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "eyre"
+version = "0.6.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
+dependencies = [
+ "indenter",
+ "once_cell",
+]
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foldhash"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
+[[package]]
+name = "futures"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
+
+[[package]]
+name = "futures-task"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
+
+[[package]]
+name = "futures-util"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "gimli"
+version = "0.32.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
+
+[[package]]
+name = "hashbrown"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "home"
+version = "0.5.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "indenter"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5"
+
+[[package]]
+name = "indexmap"
+version = "2.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.16.0",
+]
+
+[[package]]
+name = "indoc"
+version = "2.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "instability"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a"
+dependencies = [
+ "darling",
+ "indoc",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+
+[[package]]
+name = "itertools"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "js-sys"
+version = "0.3.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.177"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
+
+[[package]]
+name = "litrs"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
+
+[[package]]
+name = "lock_api"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+
+[[package]]
+name = "lru"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
+dependencies = [
+ "hashbrown 0.15.5",
+]
+
+[[package]]
+name = "memchr"
+version = "2.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+dependencies = [
+ "adler2",
+]
+
+[[package]]
+name = "mio"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "object"
+version = "0.37.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "once_cell_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+
+[[package]]
+name = "owo-colors"
+version = "4.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-link",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.103"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "ratatui"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
+dependencies = [
+ "bitflags",
+ "cassowary",
+ "compact_str",
+ "crossterm 0.28.1",
+ "indoc",
+ "instability",
+ "itertools",
+ "lru",
+ "paste",
+ "strum",
+ "unicode-segmentation",
+ "unicode-truncate",
+ "unicode-width 0.2.0",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
+
+[[package]]
+name = "rustix"
+version = "0.38.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+dependencies = [
+ "bitflags",
+ "errno",
+ "libc",
+ "linux-raw-sys 0.4.15",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "rustix"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
+dependencies = [
+ "bitflags",
+ "errno",
+ "libc",
+ "linux-raw-sys 0.11.0",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+
+[[package]]
+name = "ryu"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.145"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "signal-hook"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-mio"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
+dependencies = [
+ "libc",
+ "mio",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "socket2"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
+dependencies = [
+ "libc",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "strum"
+version = "0.26.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
+dependencies = [
+ "strum_macros",
+]
+
+[[package]]
+name = "strum_macros"
+version = "0.26.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.110"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "throbber-widgets-tui"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45e58887883fb0a259717b16d68d251983e40850b4b2f45c2da410f46d4333dc"
+dependencies = [
+ "ratatui",
+]
+
+[[package]]
+name = "tokio"
+version = "1.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
+dependencies = [
+ "bytes",
+ "libc",
+ "mio",
+ "parking_lot",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
+dependencies = [
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-error"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db"
+dependencies = [
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
+dependencies = [
+ "sharded-slab",
+ "thread_local",
+ "tracing-core",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+
+[[package]]
+name = "unicode-truncate"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf"
+dependencies = [
+ "itertools",
+ "unicode-segmentation",
+ "unicode-width 0.1.14",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
+
+[[package]]
+name = "unicode-width"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "valuable"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
+dependencies = [
+ "bumpalo",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "which"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+dependencies = [
+ "either",
+ "home",
+ "once_cell",
+ "rustix 0.38.44",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-core"
+version = "0.62.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+
+[[package]]
+name = "windows-result"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm 0.52.6",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.53.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+dependencies = [
+ "windows-link",
+ "windows_aarch64_gnullvm 0.53.1",
+ "windows_aarch64_msvc 0.53.1",
+ "windows_i686_gnu 0.53.1",
+ "windows_i686_gnullvm 0.53.1",
+ "windows_i686_msvc 0.53.1",
+ "windows_x86_64_gnu 0.53.1",
+ "windows_x86_64_gnullvm 0.53.1",
+ "windows_x86_64_msvc 0.53.1",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+
+[[package]]
+name = "winnow"
+version = "0.5.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml
new file mode 100644
index 0000000..5150c6b
--- /dev/null
+++ b/crates/core/Cargo.toml
@@ -0,0 +1,37 @@
+[package]
+name = "checkpoint-ts"
+description = "Interactive checkpoint system for TypeScript/JavaScript development. Debug with TUI, inspect state, skip functions, inject values."
+authors = ["ErenayDev erenaydev@proton.me"]
+license = "MIT"
+repository = "https://github.com/ErenayDev/checkpoint-ts"
+homepage = "https://github.com/ErenayDev/checkpoint-ts"
+documentation = "https://docs.rs/checkpoint-ts"
+readme = "README.md"
+keywords = ["debug", "typescript", "javascript", "tui", "checkpoint"]
+categories = ["development-tools::debugging", "command-line-utilities"]
+version.workspace = true
+edition.workspace = true
+rust-version = "1.87"
+exclude = ["target/", ".git/", ".github/", "tools/", "*.log"]
+
+[[bin]]
+name = "checkpoint"
+path = "src/main.rs"
+
+[dependencies]
+checkpoint-shared = { path = "../shared" }
+checkpoint-parser = { path = "../parser" }
+serde.workspace = true
+serde_json.workspace = true
+chrono = { version = "0.4", features = ["serde"] }
+color-eyre = "0.6"
+crossterm = { version = "0.29", features = ["event-stream"] }
+futures = "0.3"
+ratatui = "0.30"
+throbber-widgets-tui = "0.11.0"
+tokio = { version = "1", features = ["full"] }
+clap = { version = "4.5.54", features = ["derive"] }
+thiserror = "2.0.17"
+dirs = "6.0.0"
+walkdir = "2"
+sha2 = "0.10"
diff --git a/crates/core/README.md b/crates/core/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/crates/core/src/main.rs b/crates/core/src/main.rs
new file mode 100644
index 0000000..9a73b42
--- /dev/null
+++ b/crates/core/src/main.rs
@@ -0,0 +1,206 @@
+use clap::Parser;
+use color_eyre::{Result, eyre};
+
+pub mod services;
+pub mod tui;
+pub mod utils;
+
+use std::{
+ path::PathBuf,
+ time::{SystemTime, UNIX_EPOCH},
+};
+use utils::discord_rpc::DiscordRpc;
+
+use services::transformer::TransformService;
+use tui::CheckpointTUI;
+use utils::{entry_finder, project_context::ProjectContext};
+
+use crate::utils::discord_rpc::{Activity, Button, RpcSession};
+
+#[derive(Parser)]
+#[command(name = "checkpoint")]
+#[command(
+ about = "Interactive checkpoint system for TypeScript/JavaScript development with time-travel capabilities"
+)]
+struct Cli {
+ #[arg(short, long, help = "Input file or directory path")]
+ input: std::path::PathBuf,
+
+ #[arg(short, long, help = "Output path for transformed file")]
+ output: Option,
+
+ #[arg(
+ short,
+ long,
+ help = "Enable minification",
+ default_value_t = false,
+ num_args = 0..=1,
+ default_missing_value = "true"
+ )]
+ minify: bool,
+
+ #[arg(long, help = "Skip transformation, use cached files only")]
+ no_transform: bool,
+
+ #[arg(long, help = "Transform only entry file and its imports")]
+ only_needed: bool,
+}
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ color_eyre::install()?;
+
+ let args = Cli::parse();
+
+ let entry_file: PathBuf = match entry_finder::find_entry_file(args.input.to_str()) {
+ Ok(path) => path,
+ Err(e) => {
+ eprintln!("[ERROR]: {e}");
+ std::process::exit(1);
+ }
+ };
+
+ let ctx = ProjectContext::discover(&entry_file);
+ ctx.ensure_checkpoint_dir()?;
+
+ let minify = args.minify || ctx.config.minify.unwrap_or(false);
+
+ if !args.no_transform {
+ let mut transformer = TransformService::new(ctx.clone());
+
+ if args.only_needed {
+ println!("[INFO] Transforming entry file and dependencies...");
+ transformer
+ .transform_file(&entry_file, minify)
+ .map_err(|e| eyre::eyre!("Transform failed: {}", e))?;
+ } else {
+ println!("[INFO] Transforming entire project...");
+ let transformed = transformer
+ .transform_project(minify)
+ .map_err(|e| eyre::eyre!("Transform failed: {}", e))?;
+ println!("[INFO] Transformed {} files", transformed.len());
+ }
+ }
+
+ copy_runtime_files(&ctx)?;
+
+ let transformed_entry: PathBuf = ctx
+ .checkpoint_dir
+ .join("transforms")
+ .join(entry_file.file_name().unwrap());
+
+ // discord rpc logic
+ //
+ // delete if u want
+
+ let rpc = match DiscordRpc::connect("1232253585962700911") {
+ Ok(rpc) => {
+ println!("discord rpc connected");
+ Some(rpc)
+ }
+ Err(_) => {
+ println!("discord not running, skipping rpc");
+ None
+ }
+ };
+
+ let now = SystemTime::now()
+ .duration_since(UNIX_EPOCH)
+ .unwrap_or_default()
+ .as_secs();
+
+ let mut activity = Activity::new();
+ activity.large_image = Some("logo".into());
+ activity.large_text = Some("Checkpoint.ts".into());
+ activity.start_timestamp = Some(now);
+ activity.buttons = Some(vec![Button {
+ label: "GitHub".into(),
+ url: "https://github.com/ErenayDev/Checkpoint-ts".into(),
+ }]);
+
+ let mut rpc_session = RpcSession::new(rpc, activity);
+ rpc_session.update();
+
+ run_app(transformed_entry, entry_file, rpc_session).await?;
+ Ok(())
+}
+
+async fn run_app(transformed_entry: PathBuf, entry_file: PathBuf, rpc: RpcSession) -> Result<()> {
+ let terminal = ratatui::init();
+ let mut app = CheckpointTUI::new(
+ Some(transformed_entry.to_string_lossy().to_string()),
+ Some(entry_file.to_string_lossy().to_string()),
+ rpc,
+ );
+ let result = app.run(terminal).await;
+ ratatui::restore();
+
+ result
+}
+
+fn copy_runtime_files(ctx: &ProjectContext) -> Result<()> {
+ use std::fs;
+ use std::process::Command;
+
+ let runtime_src = std::path::Path::new("runtime");
+ let runtime_dst = ctx.checkpoint_dir.join("runtime");
+
+ if !runtime_src.exists() {
+ return Err(eyre::eyre!("Runtime directory not found at ./runtime"));
+ }
+
+ if runtime_dst.exists() {
+ fs::remove_dir_all(&runtime_dst)?;
+ }
+
+ fs::create_dir_all(&runtime_dst)?;
+
+ copy_dir_selective(runtime_src, &runtime_dst)?;
+
+ println!("[INFO] Runtime files copied to .checkpoint/runtime");
+
+ if runtime_dst.join("package.json").exists() {
+ println!("[INFO] Installing runtime dependencies...");
+ let install_result = Command::new("bun")
+ .arg("install")
+ .current_dir(&runtime_dst)
+ .output()?;
+
+ if !install_result.status.success() {
+ eprintln!("[WARN] Failed to install dependencies, runtime may not work");
+ } else {
+ println!("[INFO] Dependencies installed successfully");
+ }
+ }
+
+ Ok(())
+}
+
+fn copy_dir_selective(src: &std::path::Path, dst: &std::path::Path) -> Result<()> {
+ use std::fs;
+
+ let skip_items = ["node_modules", ".git", "dist", "build", "target"];
+
+ for entry in fs::read_dir(src)? {
+ let entry = entry?;
+ let file_name = entry.file_name();
+ let file_name_str = file_name.to_string_lossy();
+
+ if skip_items.contains(&file_name_str.as_ref()) {
+ continue;
+ }
+
+ let src_path = entry.path();
+ let dst_path = dst.join(&file_name);
+ let file_type = entry.file_type()?;
+
+ if file_type.is_dir() {
+ fs::create_dir_all(&dst_path)?;
+ copy_dir_selective(&src_path, &dst_path)?;
+ } else if file_type.is_file() {
+ fs::copy(&src_path, &dst_path)?;
+ }
+ }
+
+ Ok(())
+}
diff --git a/crates/core/src/services/ipc_bridge.rs b/crates/core/src/services/ipc_bridge.rs
new file mode 100644
index 0000000..61afe24
--- /dev/null
+++ b/crates/core/src/services/ipc_bridge.rs
@@ -0,0 +1,143 @@
+use checkpoint_shared::SharedMemoryBridge;
+use std::io::Write;
+use std::path::Path;
+use std::process::{Child, Command, Stdio};
+
+pub struct IpcBridge {
+ shm: SharedMemoryBridge,
+ child: Option,
+ buffered_messages: Vec,
+}
+
+impl IpcBridge {
+ pub fn spawn_runtime(app_path: &str) -> Result> {
+ let shm = SharedMemoryBridge::create()?;
+ let shm_id = shm.os_id().to_string();
+
+ let app_path_buf = Path::new(app_path);
+ let runtime_dir = app_path_buf
+ .parent()
+ .and_then(|p| p.parent())
+ .ok_or("Cannot find runtime directory")?
+ .join("runtime");
+
+ let runtime_index = runtime_dir.join("index.ts");
+
+ if !runtime_index.exists() {
+ return Err(format!("Runtime not found at {:?}", runtime_index).into());
+ }
+
+ let abs_app_path = std::fs::canonicalize(app_path_buf)?;
+
+ let log_path = runtime_dir.join("runtime.log");
+ let error_path = runtime_dir.join("runtime.error.log");
+
+ let mut log_file = std::fs::OpenOptions::new()
+ .create(true)
+ .write(true)
+ .truncate(true)
+ .open(&log_path)?;
+
+ writeln!(log_file, "[RUST] Starting runtime with SHM: {}", shm_id)?;
+ writeln!(log_file, "[RUST] App path: {}", abs_app_path.display())?;
+ drop(log_file);
+
+ let log_file = std::fs::OpenOptions::new()
+ .create(true)
+ .append(true)
+ .open(&log_path)?;
+
+ let error_file = std::fs::OpenOptions::new()
+ .create(true)
+ .write(true)
+ .truncate(true)
+ .open(&error_path)?;
+
+ let child = Command::new("bun")
+ .arg("run")
+ .arg("index.ts")
+ .env("CHECKPOINT_SHM_ID", &shm_id)
+ .env(
+ "CHECKPOINT_APP_PATH",
+ abs_app_path.to_string_lossy().as_ref(),
+ )
+ .current_dir(&runtime_dir)
+ .stdin(Stdio::null())
+ .stdout(Stdio::from(log_file))
+ .stderr(Stdio::from(error_file))
+ .spawn()?;
+
+ std::thread::sleep(std::time::Duration::from_millis(200));
+
+ let mut attempts = 0;
+ let mut ready = false;
+ let mut buffered_messages = Vec::new();
+
+ while attempts < 10 && !ready {
+ if let Some(msg) = shm.wait_receive_json::(500) {
+ if msg.get("type").and_then(|v| v.as_str()) == Some("runtime_ready") {
+ ready = true;
+ }
+ buffered_messages.push(msg);
+ } else {
+ attempts += 1;
+ }
+ }
+
+ if !ready {
+ return Err("Runtime failed to start".into());
+ }
+
+ Ok(Self {
+ shm,
+ child: Some(child),
+ buffered_messages,
+ })
+ }
+
+ pub fn load_app(&self) -> Result<(), Box> {
+ self.send_json(&serde_json::json!({
+ "type": "load_app"
+ }))
+ }
+
+ pub fn send_json(
+ &self,
+ value: &T,
+ ) -> Result<(), Box> {
+ self.shm.send_json(value)
+ }
+
+ pub fn receive_json(&mut self, timeout_ms: u64) -> Option {
+ if !self.buffered_messages.is_empty() {
+ let msg = self.buffered_messages.remove(0);
+ return serde_json::from_value(msg).ok();
+ }
+
+ self.shm.wait_receive_json(timeout_ms)
+ }
+
+ pub fn shutdown(&mut self) {
+ let _ = self.send_json(&serde_json::json!({ "type": "shutdown" }));
+ if let Some(ref mut child) = self.child {
+ let _ = child.wait();
+ }
+ }
+}
+
+impl Drop for IpcBridge {
+ fn drop(&mut self) {
+ if let Some(ref mut child) = self.child {
+ let _ = child.kill();
+ }
+ }
+}
+
+impl std::fmt::Debug for IpcBridge {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("IpcBridge")
+ .field("child", &self.child)
+ .field("buffered_messages_count", &self.buffered_messages.len())
+ .finish_non_exhaustive()
+ }
+}
diff --git a/crates/core/src/services/mod.rs b/crates/core/src/services/mod.rs
new file mode 100644
index 0000000..c6d9783
--- /dev/null
+++ b/crates/core/src/services/mod.rs
@@ -0,0 +1,4 @@
+pub mod ipc_bridge;
+pub mod transformer;
+
+pub use ipc_bridge::IpcBridge;
diff --git a/crates/core/src/services/transformer.rs b/crates/core/src/services/transformer.rs
new file mode 100644
index 0000000..d519368
--- /dev/null
+++ b/crates/core/src/services/transformer.rs
@@ -0,0 +1,113 @@
+use crate::utils::project_context::ProjectContext;
+use crate::utils::transform_cache::TransformCache;
+use checkpoint_parser::transform_code;
+use std::fs;
+use std::path::{Path, PathBuf};
+use walkdir::WalkDir;
+
+pub struct TransformService {
+ ctx: ProjectContext,
+ cache: TransformCache,
+}
+
+impl TransformService {
+ pub fn new(ctx: ProjectContext) -> Self {
+ let cache_path = ctx.checkpoint_dir.join("cache.json");
+ let cache = TransformCache::load(&cache_path);
+
+ Self { ctx, cache }
+ }
+
+ pub fn transform_project(
+ &mut self,
+ minify: bool,
+ ) -> Result, Box> {
+ let mut transformed = Vec::new();
+
+ for entry in WalkDir::new(&self.ctx.root)
+ .follow_links(true)
+ .into_iter()
+ .filter_map(|e| e.ok())
+ {
+ let path = entry.path();
+
+ if !self.is_transformable(path) {
+ continue;
+ }
+
+ match self.transform_file(path, minify) {
+ Ok(output_path) => transformed.push(output_path),
+ Err(e) => eprintln!("[WARN] Failed to transform {}: {}", path.display(), e),
+ }
+ }
+
+ let cache_path = self.ctx.checkpoint_dir.join("cache.json");
+ self.cache.save(&cache_path)?;
+
+ Ok(transformed)
+ }
+
+ pub fn transform_file(
+ &mut self,
+ file_path: &Path,
+ minify: bool,
+ ) -> Result> {
+ let content = fs::read_to_string(file_path)?;
+
+ let hash = TransformCache::compute_hash(&content);
+ let relative_path = file_path.strip_prefix(&self.ctx.root).unwrap_or(file_path);
+
+ if self.cache.is_cached(relative_path.to_str().unwrap(), &hash) {
+ if let Some(cached_path) = self
+ .cache
+ .get_transform_path(relative_path.to_str().unwrap())
+ {
+ if cached_path.exists() {
+ return Ok(cached_path.clone());
+ }
+ }
+ }
+
+ let transformed = transform_code(&content, file_path.to_str().unwrap(), minify)
+ .map_err(|e| format!("Transform failed: {:?}", e))?;
+
+ let output_path = self
+ .ctx
+ .checkpoint_dir
+ .join("transforms")
+ .join(relative_path);
+
+ if let Some(parent) = output_path.parent() {
+ fs::create_dir_all(parent)?;
+ }
+
+ fs::write(&output_path, transformed)?;
+
+ self.cache.update(
+ relative_path.to_string_lossy().to_string(),
+ hash,
+ output_path.clone(),
+ );
+
+ Ok(output_path)
+ }
+
+ fn is_transformable(&self, path: &Path) -> bool {
+ if !path.is_file() {
+ return false;
+ }
+
+ if path.starts_with(&self.ctx.checkpoint_dir) {
+ return false;
+ }
+
+ if path.components().any(|c| c.as_os_str() == "node_modules") {
+ return false;
+ }
+
+ matches!(
+ path.extension().and_then(|e| e.to_str()),
+ Some("ts") | Some("js") | Some("tsx") | Some("jsx") // modify later
+ )
+ }
+}
diff --git a/src/tui/app.rs b/crates/core/src/tui/app.rs
similarity index 84%
rename from src/tui/app.rs
rename to crates/core/src/tui/app.rs
index 834e400..537c09f 100644
--- a/src/tui/app.rs
+++ b/crates/core/src/tui/app.rs
@@ -1,7 +1,9 @@
use super::events::EventHandler;
use super::scenes::dashboard::DashboardState;
+use super::scenes::history::ExecutionHistoryState;
use super::scenes::profiler::PerformanceProfileState;
use super::scenes::variable_editor::VariableEditorState;
+use crate::utils::discord_rpc::RpcSession;
use color_eyre::Result;
use crossterm::event::{Event, KeyEventKind};
use ratatui::{DefaultTerminal, Frame};
@@ -19,7 +21,7 @@ pub enum Scene {
}
#[derive(Debug)]
-pub struct TuiApp {
+pub struct CheckpointTUI {
pub current_scene: Scene,
pub scene_stack: Vec,
pub running: bool,
@@ -27,16 +29,23 @@ pub struct TuiApp {
pub dashboard_state: DashboardState,
pub variable_state: VariableEditorState,
pub profile_state: PerformanceProfileState,
+ pub history_state: ExecutionHistoryState,
+ pub rpc: RpcSession,
}
-impl TuiApp {
- pub fn new(file: Option) -> Self {
+impl CheckpointTUI {
+ pub fn new(
+ transformed_file: Option,
+ original_file: Option,
+ rpc: RpcSession,
+ ) -> Self {
let mut dashboard_state = DashboardState::new();
let variable_state = VariableEditorState::new();
let profile_state = PerformanceProfileState::new();
+ let history_state = ExecutionHistoryState::new();
- if let Some(f) = file {
- dashboard_state.set_file(f);
+ if let (Some(transformed), Some(original)) = (transformed_file, original_file) {
+ let _ = dashboard_state.set_file(transformed, original);
}
Self {
@@ -47,20 +56,22 @@ impl TuiApp {
dashboard_state,
variable_state,
profile_state,
+ history_state,
+ rpc,
}
}
pub async fn run(&mut self, mut terminal: DefaultTerminal) -> Result<()> {
let mut interval = tokio::time::interval(tokio::time::Duration::from_millis(150));
-
while self.running {
tokio::select! {
_ = interval.tick() => {
self.dashboard_state.tick_throbber();
}
- _ = self.handle_events() => {}
+ _= self.handle_events() => {}
}
terminal.draw(|frame| self.draw(frame))?;
+ self.dashboard_state.poll_ipc_messages();
}
Ok(())
}
@@ -79,7 +90,11 @@ impl TuiApp {
pub fn navigate_to(&mut self, new_scene: Scene) {
self.scene_stack.push(self.current_scene.clone());
- self.current_scene = new_scene;
+ self.current_scene = new_scene.clone();
+
+ self.rpc.activity.state = Some(format!(" {:?}", new_scene));
+ self.rpc.update();
+
self.dashboard_state
.add_log(format!("Navigated to {:?}", self.current_scene));
}
@@ -128,12 +143,7 @@ impl TuiApp {
}
fn draw_history(&self, frame: &mut Frame) {
- use ratatui::widgets::{Block, Borders, Paragraph};
- frame.render_widget(
- Paragraph::new("Execution History\n\n[ββ] Navigate [Enter] Go to Checkpoint [R] Replay from Here\n[D] Show Details [S] Save History [Esc] Back")
- .block(Block::default().borders(Borders::ALL).title("Execution History")),
- frame.area(),
- );
+ crate::tui::scenes::history::draw(frame, frame.area(), &self.history_state);
}
fn draw_profiler(&self, frame: &mut Frame) {
diff --git a/src/tui/events.rs b/crates/core/src/tui/events.rs
similarity index 100%
rename from src/tui/events.rs
rename to crates/core/src/tui/events.rs
diff --git a/src/tui/keyboard_handler.rs b/crates/core/src/tui/keyboard_handler.rs
similarity index 57%
rename from src/tui/keyboard_handler.rs
rename to crates/core/src/tui/keyboard_handler.rs
index 845212d..3e1a43f 100644
--- a/src/tui/keyboard_handler.rs
+++ b/crates/core/src/tui/keyboard_handler.rs
@@ -1,8 +1,15 @@
-use super::app::{Scene, TuiApp};
+use super::app::{CheckpointTUI, Scene};
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
-impl TuiApp {
+impl CheckpointTUI {
pub fn handle_key_event(&mut self, key: KeyEvent) {
+ if key.modifiers.contains(KeyModifiers::CONTROL)
+ && matches!(key.code, KeyCode::Char('c') | KeyCode::Char('C'))
+ {
+ self.quit();
+ return;
+ }
+
match self.current_scene {
Scene::Dashboard => self.handle_dashboard_keys(key),
Scene::VariableEditor => self.handle_variable_editor_keys(key),
@@ -15,52 +22,51 @@ impl TuiApp {
}
fn handle_dashboard_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => {
- self.quit();
+ match key.code {
+ KeyCode::Char('c') | KeyCode::Char('C') => {
+ self.dashboard_state.continue_execution();
}
- (_, KeyCode::Char('c')) => {
- self.dashboard_state
- .add_log("Continue execution".to_string());
+ KeyCode::Char('s') | KeyCode::Char('S') => {
+ if self.dashboard_state.paused {
+ self.navigate_to(Scene::FunctionSkip);
+ }
}
- (_, KeyCode::Char('s')) => {
- self.navigate_to(Scene::FunctionSkip);
- }
- (_, KeyCode::Char('e')) => {
- self.navigate_to(Scene::VariableEditor);
+ KeyCode::Char('e') | KeyCode::Char('E') => {
+ if self.dashboard_state.paused {
+ self.navigate_to(Scene::VariableEditor);
+ }
}
- (_, KeyCode::Char('p')) => {
+ KeyCode::Char('p') | KeyCode::Char('P') => {
self.navigate_to(Scene::Profiler);
}
- (_, KeyCode::Char('v')) => {
+ KeyCode::Char('v') | KeyCode::Char('V') => {
self.navigate_to(Scene::CallStack);
}
- (_, KeyCode::Char('h')) => {
+ KeyCode::Char('h') | KeyCode::Char('H') => {
self.navigate_to(Scene::History);
}
- (_, KeyCode::Esc | KeyCode::Char('q')) => {
- self.quit();
+ KeyCode::Char('q') | KeyCode::Char('Q') | KeyCode::Esc => {
+ self.navigate_back();
}
_ => {}
}
}
fn handle_variable_editor_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (_, KeyCode::Enter) => {
+ match key.code {
+ KeyCode::Enter => {
self.dashboard_state
.add_log("Applied variable changes".to_string());
}
- (_, KeyCode::Tab) => {
+ KeyCode::Tab => {
self.dashboard_state
.add_log("Next field selected".to_string());
}
- (_, KeyCode::Char('r')) => {
+ KeyCode::Char('r') | KeyCode::Char('R') => {
self.dashboard_state
.add_log("Reset all variables".to_string());
}
- (_, KeyCode::Esc | KeyCode::Char('q'))
- | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => {
+ KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
self.navigate_back();
}
_ => {}
@@ -68,23 +74,20 @@ impl TuiApp {
}
fn handle_function_skip_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (_, KeyCode::Enter) => {
- self.dashboard_state
- .add_log("Function skipped with selected option".to_string());
+ match key.code {
+ KeyCode::Enter => {
+ self.dashboard_state.skip_function(serde_json::Value::Null);
self.navigate_back();
}
- (_, KeyCode::Char('c')) => {
- self.dashboard_state
- .add_log("Continue normal execution".to_string());
+ KeyCode::Char('c') | KeyCode::Char('C') => {
+ self.dashboard_state.continue_execution();
self.navigate_back();
}
- (_, KeyCode::Up | KeyCode::Down) => {
+ KeyCode::Up | KeyCode::Down => {
self.dashboard_state
.add_log("Skip option changed".to_string());
}
- (_, KeyCode::Esc | KeyCode::Char('q'))
- | (KeyModifiers::CONTROL, KeyCode::Char('C')) => {
+ KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
self.navigate_back();
}
_ => {}
@@ -92,29 +95,28 @@ impl TuiApp {
}
fn handle_history_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (_, KeyCode::Up | KeyCode::Down) => {
+ match key.code {
+ KeyCode::Up | KeyCode::Down => {
self.dashboard_state
.add_log("History navigation".to_string());
}
- (_, KeyCode::Enter) => {
+ KeyCode::Enter => {
self.dashboard_state
.add_log("Go to selected checkpoint".to_string());
}
- (_, KeyCode::Char('r')) => {
+ KeyCode::Char('r') | KeyCode::Char('R') => {
self.dashboard_state
.add_log("Replay from selected point".to_string());
}
- (_, KeyCode::Char('d')) => {
+ KeyCode::Char('d') | KeyCode::Char('D') => {
self.dashboard_state
.add_log("Show execution details".to_string());
}
- (_, KeyCode::Char('s')) => {
+ KeyCode::Char('s') | KeyCode::Char('S') => {
self.dashboard_state
.add_log("Save execution history".to_string());
}
- (_, KeyCode::Esc | KeyCode::Char('q'))
- | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => {
+ KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
self.navigate_back();
}
_ => {}
@@ -122,21 +124,20 @@ impl TuiApp {
}
fn handle_profiler_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (_, KeyCode::Char('s')) => {
+ match key.code {
+ KeyCode::Char('s') | KeyCode::Char('S') => {
self.profile_state.save_report();
self.dashboard_state
.add_log("Performance report saved".to_string());
}
- (_, KeyCode::Char('e')) => {
+ KeyCode::Char('e') | KeyCode::Char('E') => {
self.profile_state.export_csv();
self.dashboard_state.add_log("Export to CSV".to_string());
}
- (_, KeyCode::Char('f')) => {
+ KeyCode::Char('f') | KeyCode::Char('F') => {
self.dashboard_state.add_log("Filter functions".to_string());
}
- (_, KeyCode::Esc | KeyCode::Char('q'))
- | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => {
+ KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
self.navigate_back();
}
_ => {}
@@ -144,28 +145,26 @@ impl TuiApp {
}
fn handle_call_stack_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (_, KeyCode::Up | KeyCode::Down) => {
+ match key.code {
+ KeyCode::Up | KeyCode::Down => {
self.dashboard_state
.add_log("Navigate call stack".to_string());
}
- (_, KeyCode::Enter) => {
+ KeyCode::Enter => {
self.dashboard_state
.add_log("Jump to selected frame".to_string());
}
- (_, KeyCode::Char('v')) => {
+ KeyCode::Char('v') | KeyCode::Char('V') => {
self.navigate_to(Scene::VariableEditor);
}
- (_, KeyCode::Char('b')) => {
+ KeyCode::Char('b') | KeyCode::Char('B') => {
self.dashboard_state.add_log("Breakpoint set".to_string());
}
- (_, KeyCode::Char('c')) => {
- self.dashboard_state
- .add_log("Continue execution".to_string());
+ KeyCode::Char('c') | KeyCode::Char('C') => {
+ self.dashboard_state.continue_execution();
self.navigate_back();
}
- (_, KeyCode::Esc | KeyCode::Char('q'))
- | (KeyModifiers::CONTROL, KeyCode::Char('C')) => {
+ KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
self.navigate_back();
}
_ => {}
@@ -173,22 +172,20 @@ impl TuiApp {
}
fn handle_error_dialog_keys(&mut self, key: KeyEvent) {
- match (key.modifiers, key.code) {
- (_, KeyCode::Char('f')) => {
+ match key.code {
+ KeyCode::Char('f') | KeyCode::Char('F') => {
self.navigate_to(Scene::VariableEditor);
}
- (_, KeyCode::Char('s')) => {
- self.dashboard_state
- .add_log("Function skipped with default value".to_string());
+ KeyCode::Char('s') | KeyCode::Char('S') => {
+ self.dashboard_state.skip_function(serde_json::Value::Null);
self.navigate_back();
}
- (_, KeyCode::Char('r')) => {
+ KeyCode::Char('r') | KeyCode::Char('R') => {
self.dashboard_state
.add_log("Restart from last checkpoint".to_string());
self.navigate_back();
}
- (_, KeyCode::Esc | KeyCode::Char('q'))
- | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => {
+ KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
self.navigate_back();
}
_ => {}
diff --git a/src/tui/mod.rs b/crates/core/src/tui/mod.rs
similarity index 72%
rename from src/tui/mod.rs
rename to crates/core/src/tui/mod.rs
index 821b78f..36e9eb1 100644
--- a/src/tui/mod.rs
+++ b/crates/core/src/tui/mod.rs
@@ -3,4 +3,4 @@ pub mod events;
pub mod keyboard_handler;
pub mod scenes;
-pub use app::TuiApp;
+pub use app::CheckpointTUI;
diff --git a/src/tui/scenes/call_stack.rs b/crates/core/src/tui/scenes/call_stack.rs
similarity index 100%
rename from src/tui/scenes/call_stack.rs
rename to crates/core/src/tui/scenes/call_stack.rs
diff --git a/src/tui/scenes/dashboard.rs b/crates/core/src/tui/scenes/dashboard.rs
similarity index 65%
rename from src/tui/scenes/dashboard.rs
rename to crates/core/src/tui/scenes/dashboard.rs
index 168bb9c..d88bbeb 100644
--- a/src/tui/scenes/dashboard.rs
+++ b/crates/core/src/tui/scenes/dashboard.rs
@@ -1,3 +1,4 @@
+use crate::services::IpcBridge;
use ratatui::{
Frame,
layout::{Alignment, Constraint, Direction, Layout, Rect},
@@ -10,6 +11,8 @@ use throbber_widgets_tui::{BRAILLE_SIX, Throbber, ThrobberState};
#[derive(Debug)]
pub struct DashboardState {
pub file_path: Option,
+ pub transformed_path: Option,
+ pub ipc_bridge: Option,
pub runtime: String,
pub execution_time: String,
pub status: String,
@@ -20,6 +23,15 @@ pub struct DashboardState {
pub timeline_functions: Vec,
pub logs: Vec,
pub throbber_state: ThrobberState,
+ pub paused: bool,
+ pub pending_checkpoint: Option,
+}
+
+#[derive(Clone, Debug)]
+pub struct CheckpointData {
+ pub function_name: String,
+ pub args: Vec,
+ pub context: Option,
}
#[derive(Clone, Debug)]
@@ -29,7 +41,6 @@ pub struct TimelineFunction {
pub duration: Option,
}
-#[allow(dead_code)]
#[derive(Clone, Debug)]
pub enum FunctionStatus {
Completed,
@@ -42,7 +53,9 @@ impl Default for DashboardState {
fn default() -> Self {
Self {
file_path: None,
- runtime: "Bun v1.3.2".to_string(),
+ transformed_path: None,
+ ipc_bridge: None,
+ runtime: "Bun v1.3.5".to_string(),
execution_time: "0s".to_string(),
status: "Ready".to_string(),
current_function: None,
@@ -50,6 +63,8 @@ impl Default for DashboardState {
called_by: None,
stack_depth: 0,
throbber_state: ThrobberState::default(),
+ paused: false,
+ pending_checkpoint: None,
timeline_functions: vec![
TimelineFunction {
name: "initApp".to_string(),
@@ -77,11 +92,7 @@ impl Default for DashboardState {
duration: None,
},
],
- logs: vec![
- "System initialized".to_string(),
- "Ready to start debugging...".to_string(),
- "Waiting for user input...".to_string(),
- ],
+ logs: vec!["System initialized".to_string()],
}
}
}
@@ -91,9 +102,148 @@ impl DashboardState {
Self::default()
}
- pub fn set_file(&mut self, file: String) {
- self.file_path = Some(file);
- self.add_log("File loaded successfully".to_string());
+ pub fn poll_ipc_messages(&mut self) {
+ if let Some(ref mut bridge) = self.ipc_bridge {
+ if let Some(message) = bridge.receive_json::(100) {
+ self.add_log(format!(
+ "IPC: {}",
+ serde_json::to_string(&message).unwrap_or_default()
+ ));
+ self.handle_ipc_message(message);
+ }
+ }
+ }
+
+ fn handle_ipc_message(&mut self, message: serde_json::Value) {
+ if let Some(log_msg) = message.get("log").and_then(|v| v.as_str()) {
+ self.add_log(log_msg.to_string());
+ }
+
+ if let Some(msg_type) = message.get("type").and_then(|v| v.as_str()) {
+ match msg_type {
+ "checkpoint" => {
+ if let Some(payload) = message.get("payload") {
+ let func_name = payload
+ .get("functionName")
+ .and_then(|v| v.as_str())
+ .unwrap_or("unknown");
+
+ let args = payload
+ .get("args")
+ .and_then(|v| v.as_array())
+ .cloned()
+ .unwrap_or_default();
+
+ let context = payload
+ .get("context")
+ .and_then(|v| v.as_str())
+ .map(|s| s.to_string());
+
+ self.current_function = Some(func_name.to_string());
+ self.add_log(format!("Checkpoint: {}", func_name));
+
+ self.pending_checkpoint = Some(CheckpointData {
+ function_name: func_name.to_string(),
+ args,
+ context,
+ });
+
+ self.paused = true;
+ self.status = "Paused".to_string();
+ }
+ }
+ "error" => {
+ if let Some(error_msg) = message.get("message").and_then(|v| v.as_str()) {
+ self.add_log(format!("Error: {}", error_msg));
+ }
+ }
+ "version" => {
+ if let Some(value) = message.get("value") {
+ if let Some(lv) = value.get("lv").and_then(|v| v.as_str()) {
+ self.runtime = lv.to_string();
+ }
+ }
+
+ if let Some(ref bridge) = self.ipc_bridge {
+ let _ = bridge.send_json(&serde_json::json!({
+ "type": "version_ack"
+ }));
+ }
+ }
+ _ => {}
+ }
+ }
+
+ if let Some(func) = message.get("current_function").and_then(|v| v.as_str()) {
+ self.current_function = Some(func.to_string());
+ }
+ if let Some(line) = message.get("current_line").and_then(|v| v.as_u64()) {
+ self.current_line = Some(line as u32);
+ }
+ }
+
+ pub fn continue_execution(&mut self) {
+ if self.paused {
+ if let Some(ref bridge) = self.ipc_bridge {
+ let _ = bridge.send_json(&serde_json::json!({
+ "type": "continue"
+ }));
+ }
+ self.paused = false;
+ self.pending_checkpoint = None;
+ self.status = "Running".to_string();
+ self.add_log("Execution continued".to_string());
+ }
+ }
+
+ pub fn skip_function(&mut self, return_value: serde_json::Value) {
+ if self.paused {
+ if let Some(ref bridge) = self.ipc_bridge {
+ let _ = bridge.send_json(&serde_json::json!({
+ "type": "skip",
+ "returnValue": return_value
+ }));
+ }
+ self.paused = false;
+ self.pending_checkpoint = None;
+ self.status = "Running".to_string();
+ self.add_log("Function skipped".to_string());
+ }
+ }
+
+ pub fn set_file(
+ &mut self,
+ transformed_file: String,
+ original_file: String,
+ ) -> Result<(), Box> {
+ self.file_path = Some(original_file);
+ self.transformed_path = Some(transformed_file.clone());
+
+ match IpcBridge::spawn_runtime(&transformed_file) {
+ Ok(bridge) => {
+ self.status = "Starting".to_string();
+ self.add_log("Runtime started, loading application...".to_string());
+
+ let _ = bridge.load_app();
+
+ self.ipc_bridge = Some(bridge);
+ self.status = "Running".to_string();
+ Ok(())
+ }
+ Err(e) => {
+ self.status = "Error".to_string();
+ self.add_log(format!("Failed to start runtime: {}", e));
+ Err(e)
+ }
+ }
+ }
+
+ pub fn shutdown(&mut self) {
+ if let Some(ref mut bridge) = self.ipc_bridge {
+ bridge.shutdown();
+ }
+ self.ipc_bridge = None;
+ self.status = "Stopped".to_string();
}
pub fn tick_throbber(&mut self) {
@@ -149,6 +299,12 @@ impl DashboardState {
}
}
+impl Drop for DashboardState {
+ fn drop(&mut self) {
+ self.shutdown();
+ }
+}
+
pub fn draw(frame: &mut Frame, area: Rect, state: &mut DashboardState) {
let main_layout = Layout::default()
.direction(Direction::Vertical)
@@ -182,7 +338,13 @@ fn draw_header(frame: &mut Frame, area: Rect, state: &DashboardState) {
let line1_right = format!("Runtime: {}", state.runtime);
let line1 = format!("{: = state.logs.iter().rev().take(10).rev().collect();
+ let display_logs: Vec<_> = state.logs.iter().rev().take(30).rev().collect();
let logs_text = display_logs
.iter()
.map(|s| s.as_str())
diff --git a/src/tui/scenes/error_dialog.rs b/crates/core/src/tui/scenes/error_dialog.rs
similarity index 100%
rename from src/tui/scenes/error_dialog.rs
rename to crates/core/src/tui/scenes/error_dialog.rs
diff --git a/src/tui/scenes/function_skip.rs b/crates/core/src/tui/scenes/function_skip.rs
similarity index 100%
rename from src/tui/scenes/function_skip.rs
rename to crates/core/src/tui/scenes/function_skip.rs
diff --git a/crates/core/src/tui/scenes/history.rs b/crates/core/src/tui/scenes/history.rs
new file mode 100644
index 0000000..37a0238
--- /dev/null
+++ b/crates/core/src/tui/scenes/history.rs
@@ -0,0 +1,200 @@
+use ratatui::{
+ Frame,
+ layout::{Constraint, Direction, Layout, Rect},
+ style::Stylize,
+ widgets::{Block, Borders, Cell, Paragraph, Row, Table},
+};
+
+#[allow(dead_code)]
+#[derive(Debug, Clone)]
+pub struct ExecutionHistoryState {
+ pub total_functions: u32,
+ pub skipped: u32,
+ pub executed: u32,
+ pub total_time: f32,
+ pub function_calls: Vec,
+ pub selected_index: usize,
+}
+
+#[derive(Clone, Debug)]
+pub struct FunctionCall {
+ pub time: String,
+ pub function: String,
+ pub status: CallStatus,
+ pub duration: String,
+ pub return_value: String,
+}
+
+#[allow(dead_code)]
+#[derive(Clone, Debug)]
+pub enum CallStatus {
+ Exec,
+ Skip,
+ Pause,
+}
+
+impl Default for ExecutionHistoryState {
+ fn default() -> Self {
+ Self {
+ total_functions: 23,
+ skipped: 5,
+ executed: 18,
+ total_time: 1.2,
+ function_calls: vec![
+ FunctionCall {
+ time: "0.0ms".to_string(),
+ function: "initApp()".to_string(),
+ status: CallStatus::Exec,
+ duration: "2ms".to_string(),
+ return_value: "undefined".to_string(),
+ },
+ FunctionCall {
+ time: "2.1ms".to_string(),
+ function: "loadConfig()".to_string(),
+ status: CallStatus::Exec,
+ duration: "15ms".to_string(),
+ return_value: "{...}".to_string(),
+ },
+ FunctionCall {
+ time: "17.3ms".to_string(),
+ function: "connectDB()".to_string(),
+ status: CallStatus::Exec,
+ duration: "120ms".to_string(),
+ return_value: "Connection".to_string(),
+ },
+ FunctionCall {
+ time: "137.8ms".to_string(),
+ function: "fetchUser()".to_string(),
+ status: CallStatus::Exec,
+ duration: "45ms".to_string(),
+ return_value: "User{id:123}".to_string(),
+ },
+ FunctionCall {
+ time: "183.2ms".to_string(),
+ function: "validateUser()".to_string(),
+ status: CallStatus::Skip,
+ duration: "0ms".to_string(),
+ return_value: "true (injected)".to_string(),
+ },
+ FunctionCall {
+ time: "183.3ms".to_string(),
+ function: "loadPermissions()".to_string(),
+ status: CallStatus::Skip,
+ duration: "0ms".to_string(),
+ return_value: "['read','write']".to_string(),
+ },
+ FunctionCall {
+ time: "183.4ms".to_string(),
+ function: "processOrder()".to_string(),
+ status: CallStatus::Exec,
+ duration: "25ms".to_string(),
+ return_value: "order{...}".to_string(),
+ },
+ FunctionCall {
+ time: "208.7ms".to_string(),
+ function: "calculateTax()".to_string(),
+ status: CallStatus::Pause,
+ duration: "?".to_string(),
+ return_value: "?".to_string(),
+ },
+ ],
+ selected_index: 0,
+ }
+ }
+}
+
+impl ExecutionHistoryState {
+ pub fn new() -> Self {
+ Self::default()
+ }
+}
+
+pub fn draw(frame: &mut Frame, area: Rect, state: &ExecutionHistoryState) {
+ let main_layout = Layout::default()
+ .direction(Direction::Vertical)
+ .constraints([
+ Constraint::Length(3),
+ Constraint::Min(10),
+ Constraint::Length(5),
+ ])
+ .split(area);
+
+ draw_summary(frame, main_layout[0], state);
+ draw_function_timeline(frame, main_layout[1], state);
+ draw_navigation(frame, main_layout[2]);
+}
+
+fn draw_summary(frame: &mut Frame, area: Rect, state: &ExecutionHistoryState) {
+ let summary_text = format!(
+ "Total Functions: {} Skipped: {} Executed: {} Total Time: {}s",
+ state.total_functions, state.skipped, state.executed, state.total_time
+ );
+ frame.render_widget(
+ Paragraph::new(summary_text).block(
+ Block::default()
+ .borders(Borders::ALL)
+ .title("Execution History".blue().bold()),
+ ),
+ area,
+ );
+}
+
+fn draw_function_timeline(frame: &mut Frame, area: Rect, state: &ExecutionHistoryState) {
+ let header = Row::new(vec![
+ Cell::from("Time").style(ratatui::style::Style::default().bold()),
+ Cell::from("Function").style(ratatui::style::Style::default().bold()),
+ Cell::from("Status").style(ratatui::style::Style::default().bold()),
+ Cell::from("Duration").style(ratatui::style::Style::default().bold()),
+ Cell::from("Return Value").style(ratatui::style::Style::default().bold()),
+ ]);
+
+ let rows: Vec = state
+ .function_calls
+ .iter()
+ .map(|call| {
+ let status_symbol = match call.status {
+ CallStatus::Exec => "β Exec",
+ CallStatus::Skip => "β Skip",
+ CallStatus::Pause => "βΈ Pause",
+ };
+ Row::new(vec![
+ Cell::from(call.time.clone()),
+ Cell::from(call.function.clone()),
+ Cell::from(status_symbol),
+ Cell::from(call.duration.clone()),
+ Cell::from(call.return_value.clone()),
+ ])
+ })
+ .collect();
+
+ let table = Table::new(
+ rows,
+ [
+ Constraint::Length(10),
+ Constraint::Percentage(25),
+ Constraint::Length(12),
+ Constraint::Length(10),
+ Constraint::Percentage(35),
+ ],
+ )
+ .header(header)
+ .block(
+ Block::default()
+ .borders(Borders::ALL)
+ .title("Function Call Timeline".yellow().bold()),
+ );
+
+ frame.render_widget(table, area);
+}
+
+fn draw_navigation(frame: &mut Frame, area: Rect) {
+ let navigation_text = "[ββ] Navigate [Enter] Go to Checkpoint [R] Replay from Here [D] Show Details [S] Save History [Esc] Back to Dashboard";
+ frame.render_widget(
+ Paragraph::new(navigation_text).block(
+ Block::default()
+ .borders(Borders::ALL)
+ .title("Navigation".green().bold()),
+ ),
+ area,
+ );
+}
diff --git a/src/tui/scenes/mod.rs b/crates/core/src/tui/scenes/mod.rs
similarity index 100%
rename from src/tui/scenes/mod.rs
rename to crates/core/src/tui/scenes/mod.rs
diff --git a/src/tui/scenes/profiler.rs b/crates/core/src/tui/scenes/profiler.rs
similarity index 98%
rename from src/tui/scenes/profiler.rs
rename to crates/core/src/tui/scenes/profiler.rs
index 01a547e..13efb78 100644
--- a/src/tui/scenes/profiler.rs
+++ b/crates/core/src/tui/scenes/profiler.rs
@@ -157,7 +157,7 @@ fn draw_performance_stats(frame: &mut Frame, area: Rect, state: &PerformanceProf
fn draw_slowest_functions(frame: &mut Frame, area: Rect, state: &PerformanceProfileState) {
let mut functions = state.functions.clone();
- functions.sort_by(|a, b| b.ms.cmp(&a.ms));
+ functions.sort_by_key(|f| std::cmp::Reverse(f.ms));
let max_duration = functions.first().map(|f| f.ms).unwrap_or(0);
let available_width = area.width.saturating_sub(20);
@@ -205,7 +205,7 @@ fn draw_slowest_functions(frame: &mut Frame, area: Rect, state: &PerformanceProf
fn draw_call_frequency(frame: &mut Frame, area: Rect, state: &PerformanceProfileState) {
let mut functions = state.functions.clone();
- functions.sort_by(|a, b| b.call_count.cmp(&a.call_count));
+ functions.sort_by_key(|f| std::cmp::Reverse(f.call_count));
let max_calls = functions.first().map(|f| f.call_count).unwrap_or(0);
let available_width = area.width.saturating_sub(35);
diff --git a/src/tui/scenes/variable_editor.rs b/crates/core/src/tui/scenes/variable_editor.rs
similarity index 100%
rename from src/tui/scenes/variable_editor.rs
rename to crates/core/src/tui/scenes/variable_editor.rs
diff --git a/crates/core/src/utils/discord_rpc.rs b/crates/core/src/utils/discord_rpc.rs
new file mode 100644
index 0000000..ef6d087
--- /dev/null
+++ b/crates/core/src/utils/discord_rpc.rs
@@ -0,0 +1,340 @@
+#[cfg(windows)]
+use std::fs::OpenOptions;
+use std::io::{self, Read, Write};
+#[cfg(unix)]
+use std::os::unix::net::UnixStream;
+use std::path::PathBuf;
+
+const RPC_VERSION: u32 = 1;
+
+#[derive(Debug, Clone, Copy)]
+#[repr(u32)]
+enum OpCode {
+ Handshake = 0,
+ Frame = 1,
+ Close = 2,
+ #[expect(dead_code)]
+ Ping = 3,
+ #[expect(dead_code)]
+ Pong = 4,
+}
+
+#[derive(Debug, Default)]
+pub struct Activity {
+ pub state: Option,
+ pub details: Option,
+ pub large_image: Option,
+ pub large_text: Option,
+ pub small_image: Option,
+ pub small_text: Option,
+ pub start_timestamp: Option,
+ pub buttons: Option>,
+}
+
+#[derive(Debug)]
+pub struct Button {
+ pub label: String,
+ pub url: String,
+}
+
+impl Activity {
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ fn to_json(&self) -> serde_json::Value {
+ let mut activity = serde_json::Map::new();
+
+ if let Some(ref state) = self.state {
+ activity.insert("state".into(), serde_json::Value::String(state.clone()));
+ }
+ if let Some(ref details) = self.details {
+ activity.insert("details".into(), serde_json::Value::String(details.clone()));
+ }
+
+ let mut assets = serde_json::Map::new();
+ let mut has_assets = false;
+
+ if let Some(ref key) = self.large_image {
+ assets.insert("large_image".into(), serde_json::Value::String(key.clone()));
+ has_assets = true;
+ }
+ if let Some(ref text) = self.large_text {
+ assets.insert("large_text".into(), serde_json::Value::String(text.clone()));
+ has_assets = true;
+ }
+ if let Some(ref key) = self.small_image {
+ assets.insert("small_image".into(), serde_json::Value::String(key.clone()));
+ has_assets = true;
+ }
+ if let Some(ref text) = self.small_text {
+ assets.insert("small_text".into(), serde_json::Value::String(text.clone()));
+ has_assets = true;
+ }
+
+ if has_assets {
+ activity.insert("assets".into(), serde_json::Value::Object(assets));
+ }
+
+ if let Some(ts) = self.start_timestamp {
+ let timestamps = serde_json::json!({ "start": ts });
+ activity.insert("timestamps".into(), timestamps);
+ }
+
+ if let Some(ref buttons) = self.buttons {
+ let button_array: Vec = buttons
+ .iter()
+ .map(|btn| {
+ serde_json::json!({
+ "label": btn.label,
+ "url": btn.url
+ })
+ })
+ .collect();
+ activity.insert("buttons".into(), serde_json::Value::Array(button_array));
+ }
+
+ serde_json::Value::Object(activity)
+ }
+}
+
+enum Connection {
+ #[cfg(unix)]
+ Unix(UnixStream),
+ #[cfg(windows)]
+ Pipe(std::fs::File),
+}
+
+impl std::fmt::Debug for Connection {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ #[cfg(unix)]
+ Connection::Unix(_) => f.write_str("Connection::Unix(..)"),
+ #[cfg(windows)]
+ Connection::Pipe(_) => f.write_str("Connection::Pipe(..)"),
+ }
+ }
+}
+
+impl Connection {
+ fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
+ match self {
+ #[cfg(unix)]
+ Connection::Unix(stream) => stream.write_all(buf),
+ #[cfg(windows)]
+ Connection::Pipe(file) => file.write_all(buf),
+ }
+ }
+
+ fn flush(&mut self) -> io::Result<()> {
+ match self {
+ #[cfg(unix)]
+ Connection::Unix(stream) => stream.flush(),
+ #[cfg(windows)]
+ Connection::Pipe(file) => file.flush(),
+ }
+ }
+
+ fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
+ match self {
+ #[cfg(unix)]
+ Connection::Unix(stream) => stream.read_exact(buf),
+ #[cfg(windows)]
+ Connection::Pipe(file) => file.read_exact(buf),
+ }
+ }
+}
+
+pub struct DiscordRpc {
+ client_id: String,
+ connection: Connection,
+ pid: u32,
+}
+
+impl std::fmt::Debug for DiscordRpc {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("DiscordRpc")
+ .field("client_id", &self.client_id)
+ .field("pid", &self.pid)
+ .finish_non_exhaustive()
+ }
+}
+
+impl DiscordRpc {
+ pub fn connect(client_id: &str) -> io::Result {
+ let connection = Self::open_connection()?;
+ let mut rpc = Self {
+ client_id: client_id.to_string(),
+ connection,
+ pid: std::process::id(),
+ };
+ rpc.handshake()?;
+ Ok(rpc)
+ }
+
+ #[cfg(unix)]
+ fn open_connection() -> io::Result {
+ let candidates = Self::socket_paths();
+ for path in &candidates {
+ if let Ok(stream) = UnixStream::connect(path) {
+ return Ok(Connection::Unix(stream));
+ }
+ }
+ Err(io::Error::new(
+ io::ErrorKind::NotFound,
+ "discord ipc socket not found",
+ ))
+ }
+
+ #[cfg(unix)]
+ fn socket_paths() -> Vec {
+ let dirs: Vec = [
+ std::env::var("XDG_RUNTIME_DIR").ok(),
+ std::env::var("TMPDIR").ok(),
+ std::env::var("TMP").ok(),
+ std::env::var("TEMP").ok(),
+ Some("/tmp".into()),
+ ]
+ .into_iter()
+ .flatten()
+ .collect();
+
+ let mut paths = Vec::new();
+ for dir in dirs {
+ for i in 0..10 {
+ paths.push(PathBuf::from(&dir).join(format!("discord-ipc-{i}")));
+ let snap_path = PathBuf::from(&dir)
+ .join("snap.discord")
+ .join(format!("discord-ipc-{i}"));
+ paths.push(snap_path);
+ let flatpak_path = PathBuf::from(&dir)
+ .join("app")
+ .join("com.discordapp.Discord")
+ .join(format!("discord-ipc-{i}"));
+ paths.push(flatpak_path);
+ }
+ }
+ paths
+ }
+
+ #[cfg(windows)]
+ fn open_connection() -> io::Result {
+ for i in 0..10 {
+ let pipe_name = format!(r"\\.\pipe\discord-ipc-{i}");
+ let file = OpenOptions::new().read(true).write(true).open(&pipe_name);
+ if let Ok(f) = file {
+ return Ok(Connection::Pipe(f));
+ }
+ }
+ Err(io::Error::new(
+ io::ErrorKind::NotFound,
+ "discord ipc pipe not found",
+ ))
+ }
+
+ fn handshake(&mut self) -> io::Result<()> {
+ let payload = serde_json::json!({
+ "v": RPC_VERSION,
+ "client_id": self.client_id,
+ });
+ self.send(OpCode::Handshake, &payload)?;
+ let (_op, _response) = self.recv()?;
+ Ok(())
+ }
+
+ pub fn set_activity(&mut self, activity: &Activity) -> io::Result<()> {
+ let payload = serde_json::json!({
+ "cmd": "SET_ACTIVITY",
+ "args": {
+ "pid": self.pid,
+ "activity": activity.to_json(),
+ },
+ "nonce": Self::nonce(),
+ });
+ self.send(OpCode::Frame, &payload)?;
+ let _ = self.recv()?;
+ Ok(())
+ }
+
+ pub fn clear_activity(&mut self) -> io::Result<()> {
+ let payload = serde_json::json!({
+ "cmd": "SET_ACTIVITY",
+ "args": {
+ "pid": self.pid,
+ },
+ "nonce": Self::nonce(),
+ });
+ self.send(OpCode::Frame, &payload)?;
+ let _ = self.recv()?;
+ Ok(())
+ }
+
+ fn send(&mut self, opcode: OpCode, payload: &serde_json::Value) -> io::Result<()> {
+ let json_bytes = serde_json::to_vec(payload)
+ .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
+ let mut header = [0u8; 8];
+ header[..4].copy_from_slice(&(opcode as u32).to_le_bytes());
+ header[4..8].copy_from_slice(&(json_bytes.len() as u32).to_le_bytes());
+ self.connection.write_all(&header)?;
+ self.connection.write_all(&json_bytes)?;
+ self.connection.flush()
+ }
+
+ fn recv(&mut self) -> io::Result<(u32, serde_json::Value)> {
+ let mut header = [0u8; 8];
+ self.connection.read_exact(&mut header)?;
+ let opcode = u32::from_le_bytes(header[..4].try_into().unwrap());
+ let length = u32::from_le_bytes(header[4..8].try_into().unwrap()) as usize;
+ let mut buf = vec![0u8; length];
+ self.connection.read_exact(&mut buf)?;
+ let value: serde_json::Value = serde_json::from_slice(&buf)
+ .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
+
+ if opcode == OpCode::Close as u32 {
+ let msg = value["message"]
+ .as_str()
+ .unwrap_or("connection closed by discord");
+ return Err(io::Error::new(io::ErrorKind::ConnectionReset, msg));
+ }
+
+ Ok((opcode, value))
+ }
+
+ fn nonce() -> String {
+ use std::time::{SystemTime, UNIX_EPOCH};
+ let ts = SystemTime::now()
+ .duration_since(UNIX_EPOCH)
+ .unwrap_or_default();
+ format!("{}{}", ts.as_nanos(), std::process::id())
+ }
+}
+
+impl Drop for DiscordRpc {
+ fn drop(&mut self) {
+ let _ = self.clear_activity();
+ let payload = serde_json::json!({});
+ let _ = self.send(OpCode::Close, &payload);
+ }
+}
+
+#[derive(Debug)]
+pub struct RpcSession {
+ rpc: Option,
+ pub activity: Activity,
+}
+
+impl RpcSession {
+ pub fn new(rpc: Option, activity: Activity) -> Self {
+ Self { rpc, activity }
+ }
+
+ pub fn update(&mut self) {
+ if let Some(ref mut rpc) = self.rpc {
+ let _ = rpc.set_activity(&self.activity);
+ }
+ }
+
+ pub fn connected(&self) -> bool {
+ self.rpc.is_some()
+ }
+}
diff --git a/crates/core/src/utils/entry_finder.rs b/crates/core/src/utils/entry_finder.rs
new file mode 100644
index 0000000..9a287bb
--- /dev/null
+++ b/crates/core/src/utils/entry_finder.rs
@@ -0,0 +1,70 @@
+use serde_json::Value;
+use std::fs;
+use std::path::{Path, PathBuf};
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum EntryError {
+ #[error("Path does not exist: {0}")]
+ PathNotFound(PathBuf),
+ #[error("Cannot read package.json: {0}")]
+ PackageJsonReadError(#[from] std::io::Error),
+ #[error("Invalid package.json format")]
+ InvalidPackageJson,
+ #[error(
+ "No entry file found in {0}. Looked for: package.json main, index.ts, index.js, main.ts, main.js"
+ )]
+ NoEntryFound(PathBuf),
+}
+
+pub fn find_entry_file(path: Option<&str>) -> Result {
+ let path = path.ok_or_else(|| EntryError::PathNotFound(PathBuf::new()))?;
+ let base = Path::new(path);
+
+ if !base.exists() {
+ return Err(EntryError::PathNotFound(base.to_path_buf()));
+ }
+
+ if base.is_file() {
+ return Ok(base.to_path_buf());
+ }
+
+ if let Some(entry) = try_package_json(base)? {
+ return Ok(entry);
+ }
+
+ let candidates = ["index.ts", "index.js", "main.ts", "main.js"];
+
+ for candidate in candidates {
+ let candidate_path = base.join(candidate);
+ if candidate_path.is_file() {
+ return Ok(candidate_path);
+ }
+ }
+
+ Err(EntryError::NoEntryFound(base.to_path_buf()))
+}
+
+fn try_package_json(base: &Path) -> Result