Skip to content

Conversation

@arthrod
Copy link
Owner

@arthrod arthrod commented Jun 6, 2025

User description

Summary

  • avoid staging .env files unless --ok-to-send-env is specified, except for .env.otherthings
  • update default --max-input-chars to 200000
  • revise system prompt to mention real secrets only
  • adjust tests for new default
  • compute maximum response tokens using tiktoken

Testing

  • cargo fmt --all
  • cargo test

https://chatgpt.com/codex/tasks/task_e_68430a28fcc4832bb2e009f0785bd421


PR Type

Enhancement, Bug fix, Tests


Description

  • Use tiktoken to compute allowed max response tokens dynamically

    • Ensures token limits fit model and input size
  • Update .env file filtering to block all except .env.otherthings

    • Prevents accidental staging of sensitive .env files
  • Revise system prompt to clarify real secret detection

    • Only warns for non-placeholder secrets
  • Increase default max-input-chars to 200000

    • Allows larger diffs to be sent to the AI
  • Update integration tests for new defaults and behaviors


Changes walkthrough 📝

Relevant files
Enhancement
main.rs
Dynamic token calculation, .env filtering, and prompt improvements

src/main.rs

  • Use tiktoken to compute max tokens for chat completions
  • Block all .env files except .env.otherthings from staging
  • Update system prompt to clarify secret detection (real secrets only)
  • Increase default max-input-chars to 200000
  • Refactor message construction for tiktoken compatibility
  • +52/-29 
    Dependencies
    Cargo.toml
    Add tiktoken-rs dependency for token calculation                 

    Cargo.toml

    • Add tiktoken-rs dependency with async-openai feature
    +1/-0     
    Tests
    integration_tests.rs
    Update tests for new max-input-chars default                         

    tests/integration_tests.rs

  • Update test for new default max-input-chars (200000)
  • Minor formatting and whitespace adjustments
  • +18/-18 

    Need help?
  • Type /help how to ... in the comments thread for any questions about Qodo Merge usage.
  • Check out the documentation for more information.
  • @coderabbitai
    Copy link

    coderabbitai bot commented Jun 6, 2025

    📝 Walkthrough

    Summary by CodeRabbit

    • New Features

      • Increased the maximum allowed characters for git diff input from 50,000 to 200,000.
      • Enhanced detection of security-related files, now treating any filename starting with .env as sensitive except for specific allowed cases.
      • Implemented improved token limit enforcement for AI requests to better handle large inputs.
    • Improvements

      • Refined AI prompt instructions to more accurately mention files containing API keys or secrets, excluding obvious placeholders.
      • Cleaned up command output and logging for better readability.
    • Tests

      • Updated tests to reflect the new default input size limit and improved test output formatting.

    Summary by CodeRabbit

    • New Features

      • Increased the maximum allowed characters for git diff input from 50,000 to 200,000.
      • Introduced smarter detection of security files, now treating any file starting with .env as sensitive except for specifically allowed cases.
      • AI responses now include references to files containing API keys or secrets, excluding obvious placeholders.
    • Improvements

      • Enhanced handling of large inputs by enforcing token limits based on the AI model and message size.
      • Refined command output and logging for better readability.
    • Tests

      • Updated tests to reflect the new default maximum input character limit.

    Walkthrough

    The changes update the dependency list to include the tiktoken-rs crate, increase the maximum allowed git diff input size, refine the detection of security-related files, enhance AI prompt instructions, and enforce token limits for AI requests using token counting. Associated tests and CLI help output are updated accordingly.

    Changes

    File(s) Change Summary
    Cargo.toml Added tiktoken-rs v0.7 with async-openai feature to dependencies.
    src/main.rs Increased max git diff input size; improved security file detection; refined AI prompts; added token counting with tiktoken-rs; refactored message construction; adjusted logging and output formatting.
    tests/integration_tests.rs Updated CLI help output check for new max input size; minor whitespace cleanup in tests.

    Sequence Diagram(s)

    sequenceDiagram
        participant User
        participant CLI
        participant AI
        User->>CLI: Run update command
        CLI->>CLI: Collect and trim git diff (up to 200,000 chars)
        CLI->>CLI: Detect security files (improved logic)
        CLI->>CLI: Build AI prompt with enhanced instructions
        CLI->>CLI: Count tokens using tiktoken-rs
        CLI->>AI: Send chat completion request (max_tokens capped)
        AI-->>CLI: Return response
        CLI-->>User: Output AI response
    
    Loading

    Possibly related PRs

    • arthrod/auto-commit#3: Adds tiktoken-rs crate and modifies token limit enforcement and diff handling, closely related in token counting and AI request logic.

    Poem

    A rabbit hopped through lines of code,
    With tokens counted, not just showed.
    Security files now wisely found,
    200k diffs—no longer bound!
    The AI prompt is sharp and neat,
    With tiktoken, changes are sweet.
    🐇✨


    📜 Recent review details

    Configuration used: CodeRabbit UI
    Review profile: CHILL
    Plan: Pro

    📥 Commits

    Reviewing files that changed from the base of the PR and between 326e8fb and a1b877a.

    📒 Files selected for processing (1)
    • src/main.rs (7 hunks)
    🧰 Additional context used
    🧬 Code Graph Analysis (1)
    src/main.rs (1)
    src/lib.rs (4)
    • new (33-35)
    • new (39-41)
    • to_string (21-23)
    • to_string (27-29)
    🪛 GitHub Check: Test (macos-latest, stable)
    src/main.rs

    [warning] 677-677:
    Diff in /Users/runner/work/noob-commit/noob-commit/src/main.rs

    🪛 GitHub Check: Test (ubuntu-latest, stable)
    src/main.rs

    [warning] 677-677:
    Diff in /home/runner/work/noob-commit/noob-commit/src/main.rs

    ⏰ Context from checks skipped due to timeout of 90000ms (4)
    • GitHub Check: Test (windows-latest, beta)
    • GitHub Check: Test (macos-latest, beta)
    • GitHub Check: Test (windows-latest, nightly)
    • GitHub Check: Test (windows-latest, stable)
    🔇 Additional comments (11)
    src/main.rs (11)

    84-84: LGTM! Default input limit increased as intended.

    The increase from 50,000 to 200,000 characters aligns with the PR objectives and provides more generous input limits for the AI analysis.


    221-226: Excellent security improvement addressing previous feedback!

    The case-insensitive matching for .env files properly addresses the security concern raised in past reviews about missing variants like .ENV or .Env on case-sensitive filesystems. The explicit exception for .env.otherthings is correctly preserved.


    228-238: Clean formatting improvement.

    The improved indentation enhances code readability without any functional changes.


    430-430: Good cleanup of extra blank lines.

    Removing unnecessary blank lines improves code consistency.

    Also applies to: 435-435


    587-591: Improved logging provides better user feedback.

    The enhanced log message now shows both original and trimmed diff lengths, giving users clearer visibility into the truncation process.


    643-643: Enhanced prompt specificity reduces false positives.

    The updated instruction to mention only non-placeholder secrets (excluding 'dummy' or 'example') will improve the AI's precision in security warnings, aligning with the PR objectives.


    651-663: Good refactoring improves code organization.

    Building the messages vector separately enhances readability and enables potential reuse of the message structure.


    665-678: Proper tiktoken message structure for token calculation.

    The tiktoken-compatible message format correctly mirrors the actual chat messages, enabling accurate token counting for the new dynamic token limit feature.

    🧰 Tools
    🪛 GitHub Check: Test (macos-latest, stable)

    [warning] 677-677:
    Diff in /Users/runner/work/noob-commit/noob-commit/src/main.rs

    🪛 GitHub Check: Test (ubuntu-latest, stable)

    [warning] 677-677:
    Diff in /home/runner/work/noob-commit/noob-commit/src/main.rs


    680-689: Excellent implementation of dynamic token calculation with proper error handling.

    This addresses the previous review feedback perfectly - the match expression provides proper error handling with informative logging when tiktoken calculation fails, ensuring transparency while maintaining functionality through the fallback to user-defined max_tokens.


    695-695: Consistent use of pre-built messages vector.

    Using the pre-built messages vector maintains consistency with the earlier refactoring and improves code organization.


    711-711: Smart token limit enforcement using dynamic calculation.

    Taking the minimum of user-defined and calculated limits ensures requests stay within model constraints while respecting user preferences - excellent application of the new tiktoken feature.

    ✨ Finishing Touches
    • 📝 Generate Docstrings

    🪧 Tips

    Chat

    There are 3 ways to chat with CodeRabbit:

    • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
      • I pushed a fix in commit <commit_id>, please review it.
      • Explain this complex logic.
      • Open a follow-up GitHub issue for this discussion.
    • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
      • @coderabbitai explain this code block.
      • @coderabbitai modularize this function.
    • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
      • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
      • @coderabbitai read src/utils.ts and explain its main purpose.
      • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
      • @coderabbitai help me debug CodeRabbit configuration file.

    Support

    Need help? Create a ticket on our support page for assistance with any issues or questions.

    Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

    CodeRabbit Commands (Invoked using PR comments)

    • @coderabbitai pause to pause the reviews on a PR.
    • @coderabbitai resume to resume the paused reviews.
    • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
    • @coderabbitai full review to do a full review from scratch and review all the files again.
    • @coderabbitai summary to regenerate the summary of the PR.
    • @coderabbitai generate docstrings to generate docstrings for this PR.
    • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
    • @coderabbitai resolve resolve all the CodeRabbit review comments.
    • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
    • @coderabbitai help to get help.

    Other keywords and placeholders

    • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
    • Add @coderabbitai summary or crs to generate the high-level summary at a specific location in the PR description.
    • Add @coderabbitai or cr anywhere in the PR title to generate the title automatically.

    CodeRabbit Configuration File (.coderabbit.yaml)

    • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
    • Please see the configuration documentation for more information.
    • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

    Documentation and Community

    • Visit our Documentation for detailed information on how to use CodeRabbit.
    • Join our Discord Community to get help, request features, and share feedback.
    • Follow us on X/Twitter for updates and announcements.

    Copy link
    Contributor

    @gemini-code-assist gemini-code-assist bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Hello @arthrod, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

    Summary of Changes

    Hello everyone, Gemini here with a summary of this pull request by @arthrod. This PR focuses on improving the handling of sensitive files, specifically .env files, updating some default parameters, refining the system prompt for the AI, and incorporating a token calculation library (tiktoken-rs) to better manage the input size for the AI model.

    Highlights

    • .env File Filtering: The logic for filtering out sensitive .env files has been updated. Previously, only a specific list of .env file names was blocked. Now, any file starting with .env will be blocked by default, with the exception of .env.otherthings, unless the --ok-to-send-env flag is used (which is not directly changed in this PR but is part of the overall functionality).
    • Increased Default Max Input Characters: The default value for the --max-input-chars command-line argument has been significantly increased from 50,000 to 200,000 characters. This allows larger diffs to be sent to the AI by default before truncation occurs.
    • Refined System Prompt: The system prompt provided to the AI has been slightly adjusted to be more specific about detecting and mentioning real secrets or API keys, rather than just any potential API key pattern, and to mention the file containing the secret.
    • Token Calculation Integration: The tiktoken-rs crate has been added as a dependency. This library is now used to calculate the maximum number of tokens allowed for the AI's response based on the specific model being used and the input messages, ensuring the request stays within the model's limits while respecting the user's --max-tokens setting.
    • Test Updates: Integration tests have been updated to reflect the new default value for --max-input-chars.

    Changelog

    Click here to see the changelog
    • Cargo.lock
      • Added tiktoken-rs and its dependencies (anyhow, async-convert, async-trait, base64 0.21.7, bit-set, bit-vec, bitflags 1.3.2, bstr, darling 0.14.4, darling_core 0.14.4, darling_macro 0.14.4, derive_builder 0.12.0, derive_builder_core 0.12.0, derive_builder_macro 0.12.0, encoding_rs, equivalent, fancy-regex, h2, hashbrown, http 0.2.12, http-body 0.4.6, httpdate, hyper 0.14.32, hyper-rustls, indexmap, reqwest 0.11.27, reqwest-eventsource 0.4.0, ring, rustc-hash, rustls, rustls-native-certs, rustls-pemfile, rustls-webpki, sct, strsim 0.10.0, sync_wrapper 0.1.2, system-configuration, system-configuration-sys, tokio-rustls, untrusted, windows-sys 0.48.0, windows-targets 0.48.5, windows_aarch64_gnullvm 0.48.5, windows_aarch64_msvc 0.48.5, windows_i686_gnu 0.48.5, windows_i686_msvc 0.48.5, windows_x86_64_gnu 0.48.5, windows_x86_64_gnullvm 0.48.5, windows_x86_64_msvc 0.48.5, winreg).
      • Updated versions and dependencies for existing crates (base64, derive_builder, reqwest, reqwest-eventsource, rustix, schannel, strsim, sync_wrapper, tokio-util, tower-http, windows-sys, windows-targets).
    • Cargo.toml
      • Added tiktoken-rs crate with version 0.7 and async-openai feature enabled (L27).
    • src/main.rs
      • Updated the default value for the --max-input-chars CLI argument from 50000 to 200000 (L84).
      • Modified the is_security_file function to block any file starting with .env (except .env.otherthings) instead of a fixed list of .env files (L221-225, L238).
      • Minor formatting adjustments (L430, L436, L584, L587-591).
      • Updated the system prompt text to refine the instruction regarding API key/secret detection (L643).
      • Added logic using tiktoken-rs to calculate the maximum allowed tokens for the AI response based on the model and input messages (L651-681).
      • Used the calculated allowed_max_tokens (min of user input and calculated) when creating the chat completion request (L703).
    • tests/integration_tests.rs
      • Updated the assertion in test_cli_defaults to check for the new default max-input-chars value of 200000 (L158).
      • Minor formatting adjustments in test_max_input_chars_truncation (L176, L180, L187, L194, L200, L206, L213, L219, L223, L230, L237, L247, L255, L261, L268).
    Using Gemini Code Assist

    The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

    Invoking Gemini

    You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

    Feature Command Description
    Code Review /gemini review Performs a code review for the current pull request in its current state.
    Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
    Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
    Help /gemini help Displays a list of available commands.

    Customization

    To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

    Limitations & Feedback

    Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

    You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

    Footnotes

    1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

    @qodo-code-review
    Copy link
    Contributor

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🧪 PR contains tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Token Calculation

    The code calculates allowed_max_tokens but doesn't handle potential errors from tiktoken_rs. If tiktoken_rs fails, it falls back to cli.max_tokens, but this might exceed model limits.

    let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
        .unwrap_or(cli.max_tokens as usize);
    Incomplete Error Handling

    The code uses unwrap() when parsing the git diff output which could panic if the output contains invalid UTF-8 characters.

    let mut output = str::from_utf8(&output).unwrap().to_string();

    @qodo-code-review
    Copy link
    Contributor

    qodo-code-review bot commented Jun 6, 2025

    CI Feedback 🧐

    (Feedback updated until commit a1b877a)

    A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

    Action: Test (windows-latest, nightly)

    Failed stage: Run tests [❌]

    Failed test name: test_max_input_chars_truncation

    Failure summary:

    The action failed because the test test_max_input_chars_truncation in the integration tests failed.
    The error occurred at line 218 in the file tests\integration_tests.rs. The specific error was: Os {
    code: 267, kind: NotADirectory, message: "The directory name is invalid." }. This suggests that the
    test is trying to access or create a directory with an invalid name during the test execution.

    Relevant error logs:
    1:  ##[group]Operating System
    2:  Microsoft Windows Server 2022
    ...
    
    368:  with:
    369:  path: ~/.cargo/registry
    370:  key: Windows-cargo-registry-67297cfd1404adb6bd0fb4978ad6e4e967340212394fe8fdbdaeecb7bbee159f
    371:  enableCrossOsArchive: false
    372:  fail-on-cache-miss: false
    373:  lookup-only: false
    374:  save-always: false
    375:  env:
    376:  CARGO_TERM_COLOR: always
    377:  CARGO_INCREMENTAL: 0
    378:  CARGO_PROFILE_DEV_DEBUG: 0
    379:  RUST_BACKTRACE: short
    380:  RUSTFLAGS: -D warnings
    381:  CARGO_UNSTABLE_SPARSE_REGISTRY: true
    382:  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    383:  CACHE_ON_FAILURE: true
    384:  ##[endgroup]
    ...
    
    393:  with:
    394:  path: ~/.cargo/git
    395:  key: Windows-cargo-git-67297cfd1404adb6bd0fb4978ad6e4e967340212394fe8fdbdaeecb7bbee159f
    396:  enableCrossOsArchive: false
    397:  fail-on-cache-miss: false
    398:  lookup-only: false
    399:  save-always: false
    400:  env:
    401:  CARGO_TERM_COLOR: always
    402:  CARGO_INCREMENTAL: 0
    403:  CARGO_PROFILE_DEV_DEBUG: 0
    404:  RUST_BACKTRACE: short
    405:  RUSTFLAGS: -D warnings
    406:  CARGO_UNSTABLE_SPARSE_REGISTRY: true
    407:  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    408:  CACHE_ON_FAILURE: true
    409:  ##[endgroup]
    ...
    
    412:  with:
    413:  path: target
    414:  key: Windows-cargo-build-target-67297cfd1404adb6bd0fb4978ad6e4e967340212394fe8fdbdaeecb7bbee159f
    415:  enableCrossOsArchive: false
    416:  fail-on-cache-miss: false
    417:  lookup-only: false
    418:  save-always: false
    419:  env:
    420:  CARGO_TERM_COLOR: always
    421:  CARGO_INCREMENTAL: 0
    422:  CARGO_PROFILE_DEV_DEBUG: 0
    423:  RUST_BACKTRACE: short
    424:  RUSTFLAGS: -D warnings
    425:  CARGO_UNSTABLE_SPARSE_REGISTRY: true
    426:  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    427:  CACHE_ON_FAILURE: true
    428:  ##[endgroup]
    ...
    
    433:  Cache Size: ~206 MB (216090269 B)
    434:  [command]"C:\Program Files\Git\usr\bin\tar.exe" -xf D:/a/_temp/d43289df-6822-462f-bfa0-e2a1157ec3a1/cache.tzst -P -C D:/a/noob-commit/noob-commit --force-local --use-compress-program "zstd -d"
    435:  Cache restored successfully
    436:  Cache restored from key: Windows-cargo-build-target-67297cfd1404adb6bd0fb4978ad6e4e967340212394fe8fdbdaeecb7bbee159f
    437:  ##[group]Run cargo build --verbose
    438:  �[36;1mcargo build --verbose�[0m
    439:  shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'"
    440:  env:
    441:  CARGO_TERM_COLOR: always
    442:  CARGO_INCREMENTAL: 0
    443:  CARGO_PROFILE_DEV_DEBUG: 0
    444:  RUST_BACKTRACE: short
    445:  RUSTFLAGS: -D warnings
    446:  CARGO_UNSTABLE_SPARSE_REGISTRY: true
    447:  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    448:  CACHE_ON_FAILURE: true
    449:  ##[endgroup]
    ...
    
    547:  �[1m�[32m       Fresh�[0m indexmap v2.9.0
    548:  �[1m�[32m       Fresh�[0m windows_x86_64_msvc v0.48.5
    549:  �[1m�[32m       Fresh�[0m url v2.5.4
    550:  �[1m�[32m       Fresh�[0m serde_urlencoded v0.7.1
    551:  �[1m�[32m       Fresh�[0m aho-corasick v1.1.3
    552:  �[1m�[32m       Fresh�[0m minimal-lexical v0.2.1
    553:  �[1m�[32m       Fresh�[0m regex-syntax v0.8.5
    554:  �[1m�[32m       Fresh�[0m nom v7.1.3
    555:  �[1m�[32m       Fresh�[0m regex-automata v0.4.9
    556:  �[1m�[32m       Fresh�[0m h2 v0.3.26
    557:  �[1m�[32m       Fresh�[0m windows-targets v0.48.5
    558:  �[1m�[32m       Fresh�[0m darling_macro v0.14.4
    559:  �[1m�[32m       Fresh�[0m http-body v0.4.6
    560:  �[1m�[32m       Fresh�[0m darling_core v0.20.11
    561:  �[1m�[32m       Fresh�[0m rand_core v0.6.4
    562:  �[1m�[32m       Fresh�[0m thiserror-impl v1.0.69
    563:  �[1m�[32m       Fresh�[0m anstyle v1.0.10
    564:  �[1m�[32m       Fresh�[0m httpdate v1.0.3
    565:  �[1m�[32m       Fresh�[0m once_cell_polyfill v1.70.1
    566:  �[1m�[32m       Fresh�[0m utf8parse v0.2.2
    567:  �[1m�[32m       Fresh�[0m base64 v0.21.7
    568:  �[1m�[32m       Fresh�[0m base64 v0.22.1
    569:  �[1m�[32m       Fresh�[0m anstyle-parse v0.2.6
    570:  �[1m�[32m       Fresh�[0m anstyle-wincon v3.0.8
    571:  �[1m�[32m       Fresh�[0m rustls-pemfile v1.0.4
    572:  �[1m�[32m       Fresh�[0m thiserror v1.0.69
    573:  �[1m�[32m       Fresh�[0m hyper v0.14.32
    ...
    
    615:  �[1m�[32m       Fresh�[0m tokio-stream v0.1.17
    616:  �[1m�[32m       Fresh�[0m async-trait v0.1.88
    617:  �[1m�[32m       Fresh�[0m bit-vec v0.6.3
    618:  �[1m�[32m       Fresh�[0m clap_lex v0.7.4
    619:  �[1m�[32m       Fresh�[0m heck v0.5.0
    620:  �[1m�[32m       Fresh�[0m heck v0.4.1
    621:  �[1m�[32m       Fresh�[0m strum_macros v0.24.3
    622:  �[1m�[32m       Fresh�[0m clap_derive v4.5.32
    623:  �[1m�[32m       Fresh�[0m clap_builder v4.5.39
    624:  �[1m�[32m       Fresh�[0m bit-set v0.5.3
    625:  �[1m�[32m       Fresh�[0m async-convert v1.0.0
    626:  �[1m�[32m       Fresh�[0m reqwest v0.12.19
    627:  �[1m�[32m       Fresh�[0m rand_core v0.9.3
    628:  �[1m�[32m       Fresh�[0m derive_builder_macro v0.20.2
    629:  �[1m�[32m       Fresh�[0m derive_builder v0.12.0
    630:  �[1m�[32m       Fresh�[0m thiserror-impl v2.0.12
    631:  �[1m�[32m       Fresh�[0m serde_derive_internals v0.29.1
    632:  �[1m�[32m       Fresh�[0m ref-cast-impl v1.0.24
    633:  �[1m�[32m       Fresh�[0m lazy_static v1.5.0
    634:  �[1m�[32m       Fresh�[0m ref-cast v1.0.24
    635:  �[1m�[32m       Fresh�[0m schemars_derive v0.9.0
    636:  �[1m�[32m       Fresh�[0m thiserror v2.0.12
    637:  �[1m�[32m       Fresh�[0m derive_builder v0.20.2
    ...
    
    647:  �[1m�[32m       Fresh�[0m async-openai-macros v0.1.0
    648:  �[1m�[32m       Fresh�[0m rustc-hash v1.1.0
    649:  �[1m�[32m       Fresh�[0m jiff v0.2.14
    650:  �[1m�[32m       Fresh�[0m maplit v1.0.2
    651:  �[1m�[32m       Fresh�[0m dyn-clone v1.0.19
    652:  �[1m�[32m       Fresh�[0m env_logger v0.11.8
    653:  �[1m�[32m       Fresh�[0m spinners v4.1.1
    654:  �[1m�[32m       Fresh�[0m schemars v0.9.0
    655:  �[1m�[32m       Fresh�[0m async-openai v0.28.2
    656:  �[1m�[32m       Fresh�[0m clap-verbosity-flag v3.0.3
    657:  �[1m�[32m       Fresh�[0m rand v0.9.1
    658:  �[1m�[32m       Fresh�[0m question v0.2.2
    659:  �[1m�[32m       Dirty�[0m rustls v0.21.12: dependency info changed
    660:  �[1m�[32m   Compiling�[0m rustls v0.21.12
    661:  �[1m�[32m     Running�[0m `D:\a\noob-commit\noob-commit\target\debug\build\rustls-ffba025b03cf8978\build-script-build`
    662:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name ring --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\ring-0.17.14\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"alloc\"" --cfg "feature=\"default\"" --cfg "feature=\"dev_urandom_fallback\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"alloc\", \"default\", \"dev_urandom_fallback\", \"less-safe-getrandom-custom-or-rdrand\", \"less-safe-getrandom-espidf\", \"slow_tests\", \"std\", \"test_logging\", \"unstable-testing-arm-no-hw\", \"unstable-testing-arm-no-neon\", \"wasm32_unknown_unknown_js\"))" -C metadata=f00b33f098b7dc4d -C extra-filename=-60c748aed1f74298 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern cfg_if=D:\a\noob-commit\noob-commit\target\debug\deps\libcfg_if-81cf3a3ea93cf4e4.rmeta --extern getrandom=D:\a\noob-commit\noob-commit\target\debug\deps\libgetrandom-03226db61e31958e.rmeta --extern untrusted=D:\a\noob-commit\noob-commit\target\debug\deps\libuntrusted-f97096447c9572ae.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -l static=ring_core_0_17_14_ -l static=ring_core_0_17_14__test`
    663:  �[1m�[32m       Dirty�[0m sct v0.7.1: dependency info changed
    664:  �[1m�[32m   Compiling�[0m sct v0.7.1
    665:  �[1m�[32m       Dirty�[0m rustls-webpki v0.101.7: dependency info changed
    666:  �[1m�[32m   Compiling�[0m rustls-webpki v0.101.7
    667:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name sct --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\sct-0.7.1\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=a8d9145f849c4141 -C extra-filename=-7838a6e276bfef2f --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern ring=D:\a\noob-commit\noob-commit\target\debug\deps\libring-60c748aed1f74298.rmeta --extern untrusted=D:\a\noob-commit\noob-commit\target\debug\deps\libuntrusted-f97096447c9572ae.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out`
    668:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name webpki --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\rustls-webpki-0.101.7\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"alloc\"" --cfg "feature=\"default\"" --cfg "feature=\"std\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"alloc\", \"default\", \"std\"))" -C metadata=e7945815206131c4 -C extra-filename=-c0857d4761bf3b62 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern ring=D:\a\noob-commit\noob-commit\target\debug\deps\libring-60c748aed1f74298.rmeta --extern untrusted=D:\a\noob-commit\noob-commit\target\debug\deps\libuntrusted-f97096447c9572ae.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out`
    669:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name rustls --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\rustls-0.21.12\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"dangerous_configuration\"" --cfg "feature=\"default\"" --cfg "feature=\"log\"" --cfg "feature=\"logging\"" --cfg "feature=\"tls12\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"dangerous_configuration\", \"default\", \"log\", \"logging\", \"quic\", \"read_buf\", \"rustversion\", \"secret_extraction\", \"tls12\"))" -C metadata=ca1796a3befbb59a -C extra-filename=-b2f5a21fd5af4846 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rmeta --extern ring=D:\a\noob-commit\noob-commit\target\debug\deps\libring-60c748aed1f74298.rmeta --extern webpki=D:\a\noob-commit\noob-commit\target\debug\deps\libwebpki-c0857d4761bf3b62.rmeta --extern sct=D:\a\noob-commit\noob-commit\target\debug\deps\libsct-7838a6e276bfef2f.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out`
    670:  �[1m�[32m       Dirty�[0m tokio-rustls v0.24.1: dependency info changed
    671:  �[1m�[32m   Compiling�[0m tokio-rustls v0.24.1
    672:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name tokio_rustls --edition=2018 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tokio-rustls-0.24.1\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"logging\"" --cfg "feature=\"tls12\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"dangerous_configuration\", \"default\", \"early-data\", \"logging\", \"secret_extraction\", \"tls12\"))" -C metadata=96537ce7b1151262 -C extra-filename=-b5c93dacb896b2fc --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern rustls=D:\a\noob-commit\noob-commit\target\debug\deps\librustls-b2f5a21fd5af4846.rmeta --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib`
    673:  �[1m�[32m       Dirty�[0m hyper-rustls v0.24.2: dependency info changed
    674:  �[1m�[32m   Compiling�[0m hyper-rustls v0.24.2
    675:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name hyper_rustls --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\hyper-rustls-0.24.2\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"acceptor\", \"default\", \"http1\", \"http2\", \"log\", \"logging\", \"native-tokio\", \"rustls-native-certs\", \"tls12\", \"tokio-runtime\", \"webpki-roots\", \"webpki-tokio\"))" -C metadata=c5d271d737fc5838 -C extra-filename=-f12e1f95c5f0845a --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern futures_util=D:\a\noob-commit\noob-commit\target\debug\deps\libfutures_util-fa36a4639c580da3.rmeta --extern http=D:\a\noob-commit\noob-commit\target\debug\deps\libhttp-b3332e7658566e8b.rmeta --extern hyper=D:\a\noob-commit\noob-commit\target\debug\deps\libhyper-5fe46998462a6060.rmeta --extern rustls=D:\a\noob-commit\noob-commit\target\debug\deps\librustls-b2f5a21fd5af4846.rmeta --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rmeta --extern tokio_rustls=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio_rustls-b5c93dacb896b2fc.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib`
    676:  �[1m�[32m       Dirty�[0m reqwest v0.11.27: dependency info changed
    677:  �[1m�[32m   Compiling�[0m reqwest v0.11.27
    678:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name reqwest --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\reqwest-0.11.27\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"__rustls\"" --cfg "feature=\"__tls\"" --cfg "feature=\"hyper-rustls\"" --cfg "feature=\"json\"" --cfg "feature=\"mime_guess\"" --cfg "feature=\"multipart\"" --cfg "feature=\"rustls\"" --cfg "feature=\"rustls-native-certs\"" --cfg "feature=\"rustls-tls-native-roots\"" --cfg "feature=\"serde_json\"" --cfg "feature=\"stream\"" --cfg "feature=\"tokio-rustls\"" --cfg "feature=\"tokio-util\"" --cfg "feature=\"wasm-streams\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"__internal_proxy_sys_no_cache\", \"__rustls\", \"__tls\", \"async-compression\", \"blocking\", \"brotli\", \"cookie_crate\", \"cookie_store\", \"cookies\", \"default\", \"default-tls\", \"deflate\", \"futures-channel\", \"gzip\", \"h3\", \"h3-quinn\", \"hickory-dns\", \"hickory-resolver\", \"http3\", \"hyper-rustls\", \"hyper-tls\", \"json\", \"mime_guess\", \"multipart\", \"native-tls\", \"native-tls-alpn\", \"native-tls-crate\", \"native-tls-vendored\", \"quinn\", \"rustls\", \"rustls-native-certs\", \"rustls-tls\", \"rustls-tls-manual-roots\", \"rustls-tls-native-roots\", \"rustls-tls-webpki-roots\", \"serde_json\", \"socks\", \"stream\", \"tokio-native-tls\", \"tokio-rustls\", \"tokio-socks\", \"tokio-util\", \"trust-dns\", \"wasm-streams\", \"webpki-roots\"))" -C metadata=b233c030955e15b5 -C extra-filename=-24a8ea270ef64513 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern base64=D:\a\noob-commit\noob-commit\target\debug\deps\libbase64-43d5c1d00d5d3d44.rmeta --extern bytes=D:\a\noob-commit\noob-commit\target\debug\deps\libbytes-c065ca91c8092a91.rmeta --extern encoding_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libencoding_rs-f5a8f90f198ca815.rmeta --extern futures_core=D:\a\noob-commit\noob-commit\target\debug\deps\libfutures_core-10f2d9a4420a8cb3.rmeta --extern futures_util=D:\a\noob-commit\noob-commit\target\debug\deps\libfutures_util-fa36a4639c580da3.rmeta --extern h2=D:\a\noob-commit\noob-commit\target\debug\deps\libh2-adf51ef846112e02.rmeta --extern http=D:\a\noob-commit\noob-commit\target\debug\deps\libhttp-b3332e7658566e8b.rmeta --extern http_body=D:\a\noob-commit\noob-commit\target\debug\deps\libhttp_body-e3aebe04525985b1.rmeta --extern hyper=D:\a\noob-commit\noob-commit\target\debug\deps\libhyper-5fe46998462a6060.rmeta --extern hyper_rustls=D:\a\noob-commit\noob-commit\target\debug\deps\libhyper_rustls-f12e1f95c5f0845a.rmeta --extern ipnet=D:\a\noob-commit\noob-commit\target\debug\deps\libipnet-e5d8db9321d72884.rmeta --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rmeta --extern mime=D:\a\noob-commit\noob-commit\target\debug\deps\libmime-1ee248cd389691dc.rmeta --extern mime_guess=D:\a\noob-commit\noob-commit\target\debug\deps\libmime_guess-157bd0c82cdc1b0b.rmeta --extern once_cell=D:\a\noob-commit\noob-commit\target\debug\deps\libonce_cell-984eff8f2eb6578e.rmeta --extern percent_encoding=D:\a\noob-commit\noob-commit\target\debug\deps\libpercent_encoding-7c6c1e6f5d68a758.rmeta --extern pin_project_lite=D:\a\noob-commit\noob-commit\target\debug\deps\libpin_project_lite-b941dbba71840d90.rmeta --extern rustls=D:\a\noob-commit\noob-commit\target\debug\deps\librustls-b2f5a21fd5af4846.rmeta --extern rustls_native_certs=D:\a\noob-commit\noob-commit\target\debug\deps\librustls_native_certs-a2f08c362482e767.rmeta --extern rustls_pemfile=D:\a\noob-commit\noob-commit\target\debug\deps\librustls_pemfile-a18c550bfde1a0ba.rmeta --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rmeta --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rmeta --extern serde_urlencoded=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_urlencoded-b3299af393586801.rmeta --extern sync_wrapper=D:\a\noob-commit\noob-commit\target\debug\deps\libsync_wrapper-29daeac67ebd8333.rmeta --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rmeta --extern tokio_rustls=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio_rustls-b5c93dacb896b2fc.rmeta --extern tokio_util=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio_util-1445ba04f6234ed0.rmeta --extern tower_service=D:\a\noob-commit\noob-commit\target\debug\deps\libtower_service-72af9f86f9f17f00.rmeta --extern url=D:\a\noob-commit\noob-commit\target\debug\deps\liburl-3a7f86f33ad7b80c.rmeta --extern winreg=D:\a\noob-commit\noob-commit\target\debug\deps\libwinreg-0486d0f20be16216.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    679:  �[1m�[32m       Dirty�[0m reqwest-eventsource v0.4.0: dependency info changed
    680:  �[1m�[32m   Compiling�[0m reqwest-eventsource v0.4.0
    681:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name reqwest_eventsource --edition=2018 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\reqwest-eventsource-0.4.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=4f858063ad7601f7 -C extra-filename=-925cfe972153be88 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern eventsource_stream=D:\a\noob-commit\noob-commit\target\debug\deps\libeventsource_stream-51ff47e9615c56a4.rmeta --extern futures_core=D:\a\noob-commit\noob-commit\target\debug\deps\libfutures_core-10f2d9a4420a8cb3.rmeta --extern futures_timer=D:\a\noob-commit\noob-commit\target\debug\deps\libfutures_timer-43dc198c7a4bd310.rmeta --extern mime=D:\a\noob-commit\noob-commit\target\debug\deps\libmime-1ee248cd389691dc.rmeta --extern nom=D:\a\noob-commit\noob-commit\target\debug\deps\libnom-8fa8f9acd4111f01.rmeta --extern pin_project_lite=D:\a\noob-commit\noob-commit\target\debug\deps\libpin_project_lite-b941dbba71840d90.rmeta --extern reqwest=D:\a\noob-commit\noob-commit\target\debug\deps\libreqwest-24a8ea270ef64513.rmeta --extern thiserror=D:\a\noob-commit\noob-commit\target\debug\deps\libthiserror-e1cad8d0f09a7e11.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    682:  �[1m�[32m       Dirty�[0m async-openai v0.14.3: dependency info changed
    683:  �[1m�[32m   Compiling�[0m async-openai v0.14.3
    684:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name async_openai --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\async-openai-0.14.3\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"rustls\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"default\", \"native-tls\", \"native-tls-vendored\", \"rustls\"))" -C metadata=16a18e1c94ff0a4b -C extra-filename=-45d30ecb22aa7d23 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_convert=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_convert-c12da234102201a9.rmeta --extern backoff=D:\a\noob-commit\noob-commit\target\debug\deps\libbackoff-0f2b50f6ecb793d1.rmeta --extern base64=D:\a\noob-commit\noob-commit\target\debug\deps\libbase64-43d5c1d00d5d3d44.rmeta --extern derive_builder=D:\a\noob-commit\noob-commit\target\debug\deps\libderive_builder-a588ca9d9a24b94e.rmeta --extern futures=D:\a\noob-commit\noob-commit\target\debug\deps\libfutures-c0ee12fe7fe28307.rmeta --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-7b5a7e94d1d6db2b.rmeta --extern reqwest=D:\a\noob-commit\noob-commit\target\debug\deps\libreqwest-24a8ea270ef64513.rmeta --extern reqwest_eventsource=D:\a\noob-commit\noob-commit\target\debug\deps\libreqwest_eventsource-925cfe972153be88.rmeta --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rmeta --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rmeta --extern thiserror=D:\a\noob-commit\noob-commit\target\debug\deps\libthiserror-e1cad8d0f09a7e11.rmeta --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rmeta --extern tokio_stream=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio_stream-0a06f1cadc90058c.rmeta --extern tokio_util=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio_util-1445ba04f6234ed0.rmeta --extern tracing=D:\a\noob-commit\noob-commit\target\debug\deps\libtracing-ef8fe489d37e6685.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    685:  �[1m�[32m       Dirty�[0m tiktoken-rs v0.7.0: dependency info changed
    686:  �[1m�[32m   Compiling�[0m tiktoken-rs v0.7.0
    687:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name tiktoken_rs --edition=2021 C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\tiktoken-rs-0.7.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --cfg "feature=\"async-openai\"" --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values(\"async-openai\", \"dhat-heap\"))" -C metadata=71c18f5eaa47f40c -C extra-filename=-e49a61253cd1e2cd --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern anyhow=D:\a\noob-commit\noob-commit\target\debug\deps\libanyhow-a0af3c41e510cb7b.rmeta --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-45d30ecb22aa7d23.rmeta --extern base64=D:\a\noob-commit\noob-commit\target\debug\deps\libbase64-dbc9edc797a74a45.rmeta --extern bstr=D:\a\noob-commit\noob-commit\target\debug\deps\libbstr-aa0e546856fb0a84.rmeta --extern fancy_regex=D:\a\noob-commit\noob-commit\target\debug\deps\libfancy_regex-f6e73c3d4bf6c733.rmeta --extern lazy_static=D:\a\noob-commit\noob-commit\target\debug\deps\liblazy_static-66f36eb8eea1fa90.rmeta --extern regex=D:\a\noob-commit\noob-commit\target\debug\deps\libregex-8c9ed9521465b3df.rmeta --extern rustc_hash=D:\a\noob-commit\noob-commit\target\debug\deps\librustc_hash-c5555146bdcbb288.rmeta --cap-lints allow -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    688:  �[1m�[32m   Compiling�[0m noob-commit v0.6.1 (D:\a\noob-commit\noob-commit)
    689:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name noob_commit --edition=2021 src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=0875e1443add58e5 -C extra-filename=-ff835059cf06a5f3 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rmeta --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rmeta --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rmeta --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rmeta --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rmeta --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rmeta --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rmeta --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rmeta --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rmeta --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rmeta --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rmeta --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rmeta --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rmeta -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    690:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name noob_commit --edition=2021 src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=36eb77d4398e701e --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rlib --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rlib --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rlib --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rlib --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rlib --extern noob_commit=D:\a\noob-commit\noob-commit\target\debug\deps\libnoob_commit-ff835059cf06a5f3.rlib --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rlib --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rlib --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rlib --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rlib --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rlib --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rlib --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rlib --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rlib -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    691:  �[1m�[32m    Finished�[0m `dev` profile [unoptimized] target(s) in 15.59s
    692:  ##[group]Run cargo test --verbose
    693:  �[36;1mcargo test --verbose�[0m
    694:  shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'"
    695:  env:
    696:  CARGO_TERM_COLOR: always
    697:  CARGO_INCREMENTAL: 0
    698:  CARGO_PROFILE_DEV_DEBUG: 0
    699:  RUST_BACKTRACE: short
    700:  RUSTFLAGS: -D warnings
    701:  CARGO_UNSTABLE_SPARSE_REGISTRY: true
    702:  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    703:  CACHE_ON_FAILURE: true
    704:  OPENAI_API_KEY: dummy-key-for-tests
    ...
    
    804:  �[1m�[32m       Fresh�[0m serde_urlencoded v0.7.1
    805:  �[1m�[32m       Fresh�[0m rustls-webpki v0.101.7
    806:  �[1m�[32m       Fresh�[0m sct v0.7.1
    807:  �[1m�[32m       Fresh�[0m aho-corasick v1.1.3
    808:  �[1m�[32m       Fresh�[0m regex-syntax v0.8.5
    809:  �[1m�[32m       Fresh�[0m minimal-lexical v0.2.1
    810:  �[1m�[32m       Fresh�[0m regex-automata v0.4.9
    811:  �[1m�[32m       Fresh�[0m nom v7.1.3
    812:  �[1m�[32m       Fresh�[0m rustls v0.21.12
    813:  �[1m�[32m       Fresh�[0m darling_macro v0.14.4
    814:  �[1m�[32m       Fresh�[0m windows-targets v0.48.5
    815:  �[1m�[32m       Fresh�[0m h2 v0.3.26
    816:  �[1m�[32m       Fresh�[0m http-body v0.4.6
    817:  �[1m�[32m       Fresh�[0m darling_core v0.20.11
    818:  �[1m�[32m       Fresh�[0m rand_core v0.6.4
    819:  �[1m�[32m       Fresh�[0m thiserror-impl v1.0.69
    820:  �[1m�[32m       Fresh�[0m httpdate v1.0.3
    821:  �[1m�[32m       Fresh�[0m once_cell_polyfill v1.70.1
    822:  �[1m�[32m       Fresh�[0m base64 v0.22.1
    823:  �[1m�[32m       Fresh�[0m base64 v0.21.7
    824:  �[1m�[32m       Fresh�[0m utf8parse v0.2.2
    825:  �[1m�[32m       Fresh�[0m anstyle v1.0.10
    826:  �[1m�[32m       Fresh�[0m rustls-pemfile v1.0.4
    827:  �[1m�[32m       Fresh�[0m anstyle-parse v0.2.6
    828:  �[1m�[32m       Fresh�[0m thiserror v1.0.69
    829:  �[1m�[32m       Fresh�[0m anstyle-wincon v3.0.8
    ...
    
    878:  �[1m�[32m       Fresh�[0m clap_lex v0.7.4
    879:  �[1m�[32m       Fresh�[0m heck v0.4.1
    880:  �[1m�[32m       Fresh�[0m heck v0.5.0
    881:  �[1m�[32m       Fresh�[0m clap_derive v4.5.32
    882:  �[1m�[32m       Fresh�[0m clap_builder v4.5.39
    883:  �[1m�[32m       Fresh�[0m strum_macros v0.24.3
    884:  �[1m�[32m       Fresh�[0m bit-set v0.5.3
    885:  �[1m�[32m       Fresh�[0m async-convert v1.0.0
    886:  �[1m�[32m       Fresh�[0m reqwest v0.12.19
    887:  �[1m�[32m       Fresh�[0m derive_builder v0.12.0
    888:  �[1m�[32m       Fresh�[0m rand_core v0.9.3
    889:  �[1m�[32m       Fresh�[0m derive_builder_macro v0.20.2
    890:  �[1m�[32m       Fresh�[0m reqwest-eventsource v0.4.0
    891:  �[1m�[32m       Fresh�[0m ref-cast-impl v1.0.24
    892:  �[1m�[32m       Fresh�[0m serde_derive_internals v0.29.1
    893:  �[1m�[32m       Fresh�[0m thiserror-impl v2.0.12
    894:  �[1m�[32m       Fresh�[0m lazy_static v1.5.0
    895:  �[1m�[32m       Fresh�[0m thiserror v2.0.12
    896:  �[1m�[32m       Fresh�[0m schemars_derive v0.9.0
    ...
    
    908:  �[1m�[32m       Fresh�[0m bstr v1.12.0
    909:  �[1m�[32m       Fresh�[0m async-openai-macros v0.1.0
    910:  �[1m�[32m       Fresh�[0m dyn-clone v1.0.19
    911:  �[1m�[32m       Fresh�[0m maplit v1.0.2
    912:  �[1m�[32m       Fresh�[0m rustc-hash v1.1.0
    913:  �[1m�[32m       Fresh�[0m jiff v0.2.14
    914:  �[1m�[32m       Fresh�[0m async-openai v0.28.2
    915:  �[1m�[32m       Fresh�[0m spinners v4.1.1
    916:  �[1m�[32m       Fresh�[0m env_logger v0.11.8
    917:  �[1m�[32m       Fresh�[0m tiktoken-rs v0.7.0
    918:  �[1m�[32m       Fresh�[0m schemars v0.9.0
    919:  �[1m�[32m       Fresh�[0m clap-verbosity-flag v3.0.3
    920:  �[1m�[32m       Fresh�[0m rand v0.9.1
    921:  �[1m�[32m       Fresh�[0m question v0.2.2
    922:  �[1m�[32m   Compiling�[0m noob-commit v0.6.1 (D:\a\noob-commit\noob-commit)
    923:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name noob_commit --edition=2021 src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=436c44146f042eb6 -C extra-filename=-a190d4928fb47a95 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rlib --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rlib --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rlib --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rlib --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rlib --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rlib --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rlib --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rlib --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rlib --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rlib --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rlib --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rlib --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rlib -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    924:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name noob_commit --edition=2021 src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=3e830b9ec7ab3c43 -C extra-filename=-161ca60800c9a189 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rlib --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rlib --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rlib --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rlib --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rlib --extern noob_commit=D:\a\noob-commit\noob-commit\target\debug\deps\libnoob_commit-ff835059cf06a5f3.rlib --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rlib --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rlib --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rlib --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rlib --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rlib --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rlib --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rlib --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rlib -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    925:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name mock_commit --edition=2021 examples\mock_commit.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=1d7f00b34b5f201b --out-dir D:\a\noob-commit\noob-commit\target\debug\examples -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rlib --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rlib --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rlib --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rlib --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rlib --extern noob_commit=D:\a\noob-commit\noob-commit\target\debug\deps\libnoob_commit-ff835059cf06a5f3.rlib --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rlib --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rlib --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rlib --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rlib --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rlib --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rlib --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rlib --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rlib -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    926:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name integration_tests --edition=2021 tests\integration_tests.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=a702febb42802601 -C extra-filename=-6867bea98590d5e0 --out-dir D:\a\noob-commit\noob-commit\target\debug\deps -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rlib --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rlib --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rlib --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rlib --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rlib --extern noob_commit=D:\a\noob-commit\noob-commit\target\debug\deps\libnoob_commit-ff835059cf06a5f3.rlib --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rlib --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rlib --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rlib --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rlib --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rlib --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rlib --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rlib --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rlib -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    927:  �[1m�[32m     Running�[0m `C:\Users\runneradmin\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name basic_usage --edition=2021 examples\basic_usage.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=7eb320d2f3a3f3b1 --out-dir D:\a\noob-commit\noob-commit\target\debug\examples -C strip=debuginfo -L dependency=D:\a\noob-commit\noob-commit\target\debug\deps --extern async_openai=D:\a\noob-commit\noob-commit\target\debug\deps\libasync_openai-fccc75ca7106f482.rlib --extern clap=D:\a\noob-commit\noob-commit\target\debug\deps\libclap-fe21660eeb4cd17f.rlib --extern clap_verbosity_flag=D:\a\noob-commit\noob-commit\target\debug\deps\libclap_verbosity_flag-79fa9ebf88b48f52.rlib --extern env_logger=D:\a\noob-commit\noob-commit\target\debug\deps\libenv_logger-a34692009ab91d7a.rlib --extern log=D:\a\noob-commit\noob-commit\target\debug\deps\liblog-abed7029a041c495.rlib --extern noob_commit=D:\a\noob-commit\noob-commit\target\debug\deps\libnoob_commit-ff835059cf06a5f3.rlib --extern question=D:\a\noob-commit\noob-commit\target\debug\deps\libquestion-608546790b4b55b0.rlib --extern rand=D:\a\noob-commit\noob-commit\target\debug\deps\librand-1abfec22a4bdfa93.rlib --extern schemars=D:\a\noob-commit\noob-commit\target\debug\deps\libschemars-0e58c0cc11a78d7a.rlib --extern serde=D:\a\noob-commit\noob-commit\target\debug\deps\libserde-f8a21f79b9c17eeb.rlib --extern serde_json=D:\a\noob-commit\noob-commit\target\debug\deps\libserde_json-53b1dd7da452ac8f.rlib --extern spinners=D:\a\noob-commit\noob-commit\target\debug\deps\libspinners-f78581367d55b4f9.rlib --extern tiktoken_rs=D:\a\noob-commit\noob-commit\target\debug\deps\libtiktoken_rs-e49a61253cd1e2cd.rlib --extern tokio=D:\a\noob-commit\noob-commit\target\debug\deps\libtokio-9575de1fc878e801.rlib -D warnings -L native=D:\a\noob-commit\noob-commit\target\debug\build\ring-255895a6ee505966\out -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.52.6\lib -L native=C:\Users\runneradmin\.cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_msvc-0.48.5\lib`
    928:  �[1m�[32m    Finished�[0m `test` profile [unoptimized] target(s) in 1.05s
    929:  �[1m�[32m     Running�[0m `D:\a\noob-commit\noob-commit\target\debug\deps\noob_commit-a190d4928fb47a95.exe`
    930:  running 7 tests
    931:  test tests::test_commit_deserialization ... ok
    932:  test tests::test_commit_serialization ... ok
    933:  test tests::test_commit_advice_to_string ... ok
    934:  test tests::test_commit_creation ... ok
    935:  test tests::test_commit_to_string ... ok
    936:  test tests::test_commit_with_empty_description ... ok
    937:  test tests::test_commit_with_multiline_description ... ok
    938:  test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    939:  �[1m�[32m     Running�[0m `D:\a\noob-commit\noob-commit\target\debug\deps\noob_commit-161ca60800c9a189.exe`
    940:  running 0 tests
    941:  test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
    942:  �[1m�[32m     Running�[0m `D:\a\noob-commit\noob-commit\target\debug\deps\integration_tests-6867bea98590d5e0.exe`
    943:  running 9 tests
    944:  test cli_tests::test_emoji_usage ... ok
    945:  test cli_tests::test_all_flags_present ... ok
    946:  test cli_tests::test_default_values ... ok
    947:  test cli_tests::test_max_input_chars_flag ... ok
    948:  test test_non_git_directory ... ok
    949:  test test_max_input_chars_truncation ... FAILED
    950:  test test_dry_run_without_openai_key ... ok
    951:  test test_help_command ... ok
    952:  test test_version_command ... ok
    953:  failures:
    954:  ---- test_max_input_chars_truncation stdout ----
    955:  thread 'test_max_input_chars_truncation' panicked at tests\integration_tests.rs:218:10:
    956:  Failed to commit: Os { code: 267, kind: NotADirectory, message: "The directory name is invalid." }
    957:  stack backtrace:
    958:  0: std::panicking::begin_panic_handler
    959:  at /rustc/ccf3198de316b488ee17441935182e9d5292b4d3/library\std\src\panicking.rs:697
    960:  1: core::panicking::panic_fmt
    961:  at /rustc/ccf3198de316b488ee17441935182e9d5292b4d3/library\core\src\panicking.rs:75
    962:  2: core::result::unwrap_failed
    963:  at /rustc/ccf3198de316b488ee17441935182e9d5292b4d3/library\core\src\result.rs:1761
    964:  3: core::result::Result<T,E>::expect
    965:  4: integration_tests::test_max_input_chars_truncation::{{closure}}
    966:  5: integration_tests::test_max_input_chars_truncation::{{closure}}
    967:  6: core::ops::function::FnOnce::call_once
    968:  7: core::ops::function::FnOnce::call_once
    969:  at /rustc/ccf3198de316b488ee17441935182e9d5292b4d3/library\core\src\ops\function.rs:250
    970:  note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
    971:  failures:
    972:  test_max_input_chars_truncation
    973:  test result: FAILED. 8 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.73s
    974:  �[1m�[31merror�[0m�[1m:�[0m test failed, to rerun pass `--test integration_tests`
    975:  ##[error]Process completed with exit code 1.
    976:  Post job cleanup.
    

    @qodo-code-review
    Copy link
    Contributor

    qodo-code-review bot commented Jun 6, 2025

    PR Code Suggestions ✨

    Latest suggestions up to a1b877a

    CategorySuggestion                                                                                                                                    Impact
    Incremental [*]
    Handle zero token calculation

    The code calculates the maximum allowed tokens but doesn't handle the case where
    the calculated value might be zero or negative. This could happen with very long
    messages or certain model configurations, potentially causing issues when
    setting max_tokens in the API request.

    src/main.rs [680-689]

     let allowed_max_tokens = match tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages) {
    -    Ok(tokens) => tokens,
    +    Ok(tokens) if tokens > 0 => tokens,
    +    Ok(_) => {
    +        info!(
    +            "⚠️ Calculated max tokens is zero or negative. Falling back to user-defined max_tokens ({}).",
    +            cli.max_tokens
    +        );
    +        cli.max_tokens as usize
    +    },
         Err(e) => {
             info!(
                 "⚠️ Failed to calculate max tokens with tiktoken-rs for model '{}': {}. Falling back to user-defined max_tokens ({}).",
                 &cli.model, e, cli.max_tokens
             );
             cli.max_tokens as usize
         }
     };
    • Apply / Chat
    Suggestion importance[1-10]: 7

    __

    Why: The suggestion addresses a valid edge case where tiktoken_rs::get_chat_completion_max_tokens could return zero or negative tokens, which would be problematic for API requests. Adding this validation prevents potential runtime issues and provides appropriate fallback behavior.

    Medium
    Improve environment file detection

    The current code checks if a filename starts with ".env" and is not exactly
    ".env.otherthings", but this could match partial filenames like ".env-example"
    or ".env_sample". To properly filter environment files, use a more precise check
    that ensures it's either exactly ".env" or starts with ".env." followed by
    additional characters.

    src/main.rs [223-226]

     let fname = filename.to_ascii_lowercase();
    -if fname.starts_with(".env") && fname != ".env.otherthings" {
    +if fname == ".env" || (fname.starts_with(".env.") && fname != ".env.otherthings") {
         return true;
     }
    • Apply / Chat
    Suggestion importance[1-10]: 6

    __

    Why: The suggestion correctly identifies that the current .env file detection using starts_with(".env") could match unintended files like .env-example or .enviroment. The improved logic to check for exact .env or .env. prefix is more precise and prevents false positives.

    Low
    • More

    Previous suggestions

    ✅ Suggestions up to commit 97d63df
    CategorySuggestion                                                                                                                                    Impact
    Possible issue
    Fix .env file detection

    The current implementation doesn't correctly handle paths containing .env files.
    It checks if a filename starts with ".env" but this would match files like
    ".env-example" or ".environment". Use a more precise check to ensure only actual
    .env files are blocked.

    src/main.rs [221-225]

     // Treat any .env file as a security file unless it's the special
     // `.env.otherthings` which is explicitly allowed.
    -if filename.starts_with(".env") && filename != ".env.otherthings" {
    +if (filename == ".env" || filename.starts_with(".env.")) && filename != ".env.otherthings" {
         return true;
     }

    [Suggestion processed]

    Suggestion importance[1-10]: 7

    __

    Why: Valid concern about overly broad .env file matching. The current implementation would incorrectly flag files like .env-example as security files. The suggested fix improves precision by checking for exact .env match or .env. prefix.

    Medium
    General
    Fix token limit fallback
    Suggestion Impact:The commit addressed the same issue but with a different approach. Instead of using a hardcoded fallback value, it expanded the error handling with a match statement that logs the error and still uses cli.max_tokens as the fallback, maintaining the original behavior but with better error reporting.

    code diff:

    -    let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
    -        .unwrap_or(cli.max_tokens as usize);
    +    let allowed_max_tokens = match tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages) {
    +        Ok(tokens) => tokens,
    +        Err(e) => {
    +            info!(
    +                "⚠️ Failed to calculate max tokens with tiktoken-rs for model '{}': {}. Falling back to user-defined max_tokens ({}).",
    +                &cli.model, e, cli.max_tokens
    +            );
    +            cli.max_tokens as usize
    +        }
    +    };

    The code unwraps to cli.max_tokens if get_chat_completion_max_tokens fails, but
    this could lead to inconsistency since cli.max_tokens is u16 while the function
    returns usize. Use a more appropriate fallback value to avoid potential overflow
    issues.

    src/main.rs [680-681]

     let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
    -    .unwrap_or(cli.max_tokens as usize);
    +    .unwrap_or(4096); // Use a reasonable default token limit

    [Suggestion processed]

    Suggestion importance[1-10]: 3

    __

    Why: The suggestion misunderstands the intent. Using cli.max_tokens as fallback respects user preferences when tiktoken fails, while hardcoding 4096 ignores user-specified limits. The u16 to usize conversion is safe and doesn't cause overflow.

    Low

    Copy link
    Contributor

    @gemini-code-assist gemini-code-assist bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Code Review

    This pull request introduces significant improvements to noob-commit, including enhanced .env file filtering for better security, dynamic calculation of maximum response tokens using tiktoken-rs for more reliable API calls, an increased default for max-input-chars, and a more precise system prompt. The changes are well-implemented and the updates to tests are appropriate.

    I have one suggestion regarding logging for the new token calculation logic, which I believe would improve debuggability.

    Summary of Findings

    • Error Logging for Token Calculation: When tiktoken_rs::get_chat_completion_max_tokens fails, the error is silently ignored, and the system falls back to the user-defined max_tokens. It's suggested to log this failure to aid in debugging and inform the user.
    • Dependency Versioning (Cargo.lock): The project now includes two versions of the async-openai crate (0.14.3 via tiktoken-rs and 0.28.2 directly). This is handled by Cargo but is a minor point of observation regarding dependency management. (Severity: low, not commented due to review settings)
    • Code Formatting: Minor whitespace and formatting changes were observed, likely due to cargo fmt. These are stylistic and do not impact functionality. (Severity: low, not commented due to review settings)

    Merge Readiness

    The pull request introduces valuable enhancements and is mostly in good shape. I recommend addressing the suggested logging improvement for the token calculation to enhance maintainability and user feedback. Once this medium-severity suggestion is considered, the PR should be in an excellent state for merging. As an AI, I am not authorized to approve pull requests; please ensure further review and approval from team members.

    Copy link

    @coderabbitai coderabbitai bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Actionable comments posted: 1

    🧹 Nitpick comments (4)
    src/main.rs (4)

    81-86: 200 000-char default may exhaust memory for very large diffs
    A single diff that large is rare but not impossible (e.g. vendored code). Consider a soft cap plus a warning rather than loading the full string into memory by default.


    586-594: Log message before truncation hides the final size
    After truncate the diff length is cli.max_input_chars plus the “…(diff truncated)” suffix, so the logged “to {} characters” value is slightly misleading. Either subtract the suffix length or log the actual final length.


    651-678: Duplicate message construction – keep one source of truth
    messages and tk_messages are manually kept in sync. A future edit risks diverging content/role order. Extract a small helper that returns both formats from the same data to avoid drift.


    680-682: Silently falling back on unknown models hides configuration errors
    When get_chat_completion_max_tokens errors you default to the CLI limit without signalling the user. Log a warning so mis-typed model names are obvious.

    -let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
    -    .unwrap_or(cli.max_tokens as usize);
    +let allowed_max_tokens = match tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages) {
    +    Ok(v) => v,
    +    Err(e) => {
    +        log::warn!("tiktoken_rs: unknown model '{}': {}", cli.model, e);
    +        cli.max_tokens as usize
    +    }
    +};
    📜 Review details

    Configuration used: CodeRabbit UI
    Review profile: CHILL
    Plan: Pro

    📥 Commits

    Reviewing files that changed from the base of the PR and between 9055a03 and 97d63df.

    ⛔ Files ignored due to path filters (1)
    • Cargo.lock is excluded by !**/*.lock
    📒 Files selected for processing (3)
    • Cargo.toml (1 hunks)
    • src/main.rs (7 hunks)
    • tests/integration_tests.rs (2 hunks)
    ⏰ Context from checks skipped due to timeout of 90000ms (9)
    • GitHub Check: Test (macos-latest, beta)
    • GitHub Check: Test (ubuntu-latest, beta)
    • GitHub Check: Test (ubuntu-latest, nightly)
    • GitHub Check: Test (windows-latest, nightly)
    • GitHub Check: Test (macos-latest, stable)
    • GitHub Check: Test (windows-latest, beta)
    • GitHub Check: Test (windows-latest, stable)
    • GitHub Check: Test (macos-latest, nightly)
    • GitHub Check: Code Coverage
    🔇 Additional comments (3)
    Cargo.toml (1)

    27-27:

    Details

    ✅ Verification successful

    Verify that the async-openai feature really exists on tiktoken-rs 0.7
    Crate feature names occasionally drift between versions. If the feature flag is misspelled, the build will silently ignore it and you’ll get a compile-time “unrecognised feature” error later.


    🏁 Script executed:

    #!/bin/bash
    # List the published features for the exact crate / version
    cargo search tiktoken-rs --limit 1 | cut -d' ' -f1 | xargs cargo metadata --no-deps --format-version 1 | jq '.packages[] | select(.name=="tiktoken-rs") | .features'

    Length of output: 660


    🏁 Script executed:

    #!/bin/bash
    # Fetch the list of feature flags for tiktoken-rs v0.7.0 from crates.io
    curl -s "https://crates.io/api/v1/crates/tiktoken-rs/0.7.0" | jq '.version.features | keys'

    Length of output: 127


    async-openai feature confirmed
    Fetched feature list for tiktoken-rs v0.7.0 from crates.io and verified that "async-openai" is published. No changes needed.

    • File: Cargo.toml (line 27)

    tests/integration_tests.rs (1)

    155-159: Assertion update looks good – the test now matches the new default of 200 000 characters.

    src/main.rs (1)

    703-704: Potential precision loss converting usizeu16
    std::cmp::min ensures the value is ≤ cli.max_tokens (u16), so the cast is safe today. If the CLI flag is ever widened to u32, this silent cast will truncate. Prefer u32 in the struct and here.

    Comment on lines 222 to 224
    // `.env.otherthings` which is explicitly allowed.
    if filename.starts_with(".env") && filename != ".env.otherthings" {
    return true;
    Copy link
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Suggestion: Fix .env file detection

    Suggested change
    // `.env.otherthings` which is explicitly allowed.
    if filename.starts_with(".env") && filename != ".env.otherthings" {
    return true;
    // `.env.otherthings` which is explicitly allowed.
    if (filename == ".env" || filename.starts_with(".env.")) && filename != ".env.otherthings" {
    return true;

    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
    src/main.rs Outdated
    Comment on lines 680 to 681
    let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
    .unwrap_or(cli.max_tokens as usize);
    Copy link
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Suggestion: Fix token limit fallback

    Suggested change
    let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
    .unwrap_or(cli.max_tokens as usize);
    let allowed_max_tokens = tiktoken_rs::get_chat_completion_max_tokens(&cli.model, &tk_messages)
    .unwrap_or(4096); // Use a reasonable default token limit

    Co-authored-by: qodo-merge-pro[bot] <151058649+qodo-merge-pro[bot]@users.noreply.github.com>
    @openhands-ai
    Copy link

    openhands-ai bot commented Jun 6, 2025

    Looks like there are a few issues preventing this PR from being merged!

    • GitHub Actions are failing:
      • CI

    If you'd like me to help, just leave a comment, like

    @OpenHands please fix the failing actions on PR #20

    Feel free to include any additional details that might help me get this PR into a better state.

    You can manage your notification settings

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    2 participants