Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix:better_stop #643

Merged
merged 11 commits into from
Jan 10, 2025
Merged

fix:better_stop #643

merged 11 commits into from
Jan 10, 2025

Conversation

JarbasAl
Copy link
Member

@JarbasAl JarbasAl commented Jan 9, 2025

related OpenVoiceOS/OVOS-workshop#323

Summary by CodeRabbit

  • Chores

    • Updated GitHub Actions workflows to use Python 3.10 across multiple configuration files.
    • Updated ovos-plugin-manager dependency to version 0.8.0.
    • Updated ovos-workshop dependency to version 3.3.4.
  • Improvements

    • Enhanced intent and conversation services with improved session management.
    • Refined skill stopping mechanisms with more robust error handling.
    • Updated tests to align with new stopping logic and improve clarity.
    • Adjusted scoring logic in the FakeFMSkill to enhance match confidence evaluation.

Copy link

coderabbitai bot commented Jan 9, 2025

Walkthrough

This pull request encompasses modifications across multiple GitHub Actions workflow configurations and core intent service files. The changes primarily involve updating Python versions in workflow files, removing support for older Python versions (3.8 and below), and enhancing session management in intent services. The modifications aim to streamline testing infrastructure and improve intent handling by introducing more robust session tracking and management mechanisms.

Changes

File Change Summary
.github/workflows/build_tests.yml Reduced Python version matrix from 3.8-3.11 to 3.10-3.11
.github/workflows/coverage.yml Updated Python version from 3.9 to 3.10
.github/workflows/pipaudit.yml Removed Python 3.7 and 3.8, keeping 3.9, 3.10, and 3.11
.github/workflows/sync_tx.yml Updated Python version from 3.9 to 3.10
.github/workflows/license_tests.yml Updated exclude parameter to include attrs in license check
ovos_core/intent_services/__init__.py Enhanced session handling in _emit_match_message method and added send_cancel_event method
ovos_core/intent_services/converse_service.py Added updated_session to PipelineMatch, improved event listener cleanup
ovos_core/intent_services/stop_service.py Refined skill stopping logic, added session management
requirements/requirements.txt Updated ovos-plugin-manager version from >=0.5.6 to >=0.8.0, updated ovos-workshop version from >=3.1.2 to >=3.3.4
test/end2end/session/test_stop.py Updated expected messages for old and new stop mechanisms
test/end2end/session/test_sched.py Changed intent_context assignment for accuracy
test/end2end/session/test_ocp.py Modified expected message sequences in various test cases
test/end2end/skill-fake-fm/__init__.py Changed initial value of score in search_fakefm method

Possibly related PRs

  • feat/pipeline_plugins_opm #527: The changes in the workflow configuration for .github/workflows/build_tests.yml involve modifications to the Python version matrix, which is directly related to the main PR's changes in the same file regarding the Python version matrix.
  • trust semantic versioning #538: This PR updates the version constraints in requirements.txt, which may indirectly relate to the Python version changes in the main PR as it affects the overall environment setup.
  • fix:bracket_expansion #618: The changes in the StopService class in ovos_core/intent_services/stop_service.py may relate to the overall workflow and dependency management, although it does not directly connect to the main PR's changes in the workflow files.

Suggested labels

dependencies

Suggested reviewers

  • goldyfruit
  • j1nx
  • builderjer

Poem

🐰 Workflows dance, versions shift and sway,
Python's path evolves another day.
Sessions tracked with rabbit-like precision,
Code hops forward with each revision!
Leap of progress, clean and bright! 🚀


📜 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 56635be and cf5e1a9.

📒 Files selected for processing (2)
  • .github/workflows/license_tests.yml (1 hunks)
  • requirements/requirements.txt (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • requirements/requirements.txt
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: end2end_tests (3.9)
🔇 Additional comments (1)
.github/workflows/license_tests.yml (1)

40-40: Verify attrs package license compatibility

The addition of 'attrs' to the license check exclusions needs verification. Let's check its license and document why it's being excluded.

Run this script to check attrs' license:

Please document in a comment why attrs needs to be excluded from license checks. This helps maintain transparency about license compliance decisions.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 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.
    • Generate unit testing code for this file.
    • 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 generate unit testing code for this file.
    • @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 generate unit testing code.
    • @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.

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. (Beta)
  • @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 to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai 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.

@github-actions github-actions bot added the fix label Jan 9, 2025
JarbasAl added a commit to OpenVoiceOS/ovos-plugin-manager that referenced this pull request Jan 9, 2025
JarbasAl added a commit to OpenVoiceOS/ovos-plugin-manager that referenced this pull request Jan 9, 2025
JarbasAl added a commit to OpenVoiceOS/ovos-plugin-manager that referenced this pull request Jan 9, 2025
Copy link

codecov bot commented Jan 9, 2025

Codecov Report

Attention: Patch coverage is 87.50000% with 3 lines in your changes missing coverage. Please review.

Project coverage is 71.01%. Comparing base (23f0bab) to head (cf5e1a9).
Report is 164 commits behind head on dev.

Files with missing lines Patch % Lines
ovos_core/intent_services/stop_service.py 86.36% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##              dev     #643      +/-   ##
==========================================
- Coverage   75.33%   71.01%   -4.33%     
==========================================
  Files          15       15              
  Lines        3094     1639    -1455     
==========================================
- Hits         2331     1164    -1167     
+ Misses        763      475     -288     
Flag Coverage Δ
end2end 54.42% <87.50%> (?)
unittests 47.89% <4.16%> (-27.45%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@JarbasAl JarbasAl marked this pull request as ready for review January 9, 2025 18:57
@github-actions github-actions bot added fix and removed fix labels Jan 9, 2025
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

🔭 Outside diff range comments (3)
.github/workflows/pipaudit.yml (1)

Line range hint 17-18: Update GitHub Actions to latest versions

The workflow uses outdated GitHub Actions versions that should be updated:

  • actions/checkout@v2 should be updated to v4
  • actions/setup-python@v1 should be updated to v4
🧰 Tools
🪛 actionlint (1.7.4)

17-17: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

.github/workflows/build_tests.yml (1)

Line range hint 22-24: Update GitHub Actions to latest versions

The workflow uses outdated GitHub Actions versions that should be updated:

  • actions/checkout@v2 should be updated to v4
  • actions/setup-python@v1 should be updated to v4
🧰 Tools
🪛 actionlint (1.7.4)

22-22: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

.github/workflows/coverage.yml (1)

Line range hint 11-18: Fix Python version inconsistency

The PYTHON environment variable is set to '3.9' but the workflow uses Python 3.10. This inconsistency should be fixed.

Apply this change:

    runs-on: ubuntu-latest
    env:
-     PYTHON: '3.9'
+     PYTHON: '3.10'

Additionally, update the outdated GitHub Actions:

-   - uses: actions/checkout@master
+   - uses: actions/checkout@v4
-   - name: Setup Python
-     uses: actions/setup-python@master
+   - name: Setup Python
+     uses: actions/setup-python@v4
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 83ba17d and 8cca764.

📒 Files selected for processing (8)
  • .github/workflows/build_tests.yml (1 hunks)
  • .github/workflows/coverage.yml (1 hunks)
  • .github/workflows/pipaudit.yml (1 hunks)
  • .github/workflows/sync_tx.yml (1 hunks)
  • ovos_core/intent_services/__init__.py (2 hunks)
  • ovos_core/intent_services/converse_service.py (1 hunks)
  • ovos_core/intent_services/stop_service.py (5 hunks)
  • requirements/requirements.txt (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: end2end_tests (3.9)
🔇 Additional comments (10)
ovos_core/intent_services/stop_service.py (5)

55-61: LGTM! Good improvement in skill filtering.

The addition of session-based blacklist filtering prevents attempting to stop skills that are explicitly blacklisted, improving the robustness of the stop mechanism.


116-119: LGTM! Improved result handling.

The explicit stopped flag makes the result handling more clear and maintainable.


162-162: LGTM! Enhanced logging and session management.

Good improvements:

  • Added logging for global stop events
  • Added debug logging for skill stop attempts
  • Properly updating and returning session state

Also applies to: 173-181


252-259: LGTM! Consistent improvements across stop handlers.

The changes maintain symmetry with match_stop_high, ensuring consistent logging and session handling in both high and low priority stop scenarios.

Also applies to: 262-262


120-132: Track TTS origin for more accurate cleanup.

The TODO comment indicates that speech origin is not currently tracked, which could lead to stopping TTS from unrelated skills.

Run this script to check if TTS tracking is implemented elsewhere:

ovos_core/intent_services/converse_service.py (1)

345-345: LGTM! Improved session state propagation.

The addition of updated_session to the PipelineMatch return value ensures that session state changes are properly propagated through the intent pipeline.

ovos_core/intent_services/__init__.py (1)

279-279: LGTM! Completed session state propagation chain.

The changes properly handle session state propagation:

  • Uses updated session from match when available
  • Ensures session state is serialized in reply context

Also applies to: 309-312

requirements/requirements.txt (1)

13-13: Verify compatibility with dependent packages

The minimum version requirement for ovos-plugin-manager has been increased significantly from 0.5.6 to 0.8.0. While maintaining the same upper bound of <1.0.0, this change might affect compatibility with other packages.

Let's verify the compatibility with other packages and check for any breaking changes:

✅ Verification successful

Version bump appears safe based on codebase analysis

The increase in minimum version requirement for ovos-plugin-manager from 0.5.6 to 0.8.0 appears safe. The package is used extensively throughout the codebase but primarily for its template classes and utility functions, which typically maintain backward compatibility. The upper bound remains at <1.0.0, protecting against potential breaking changes.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for compatibility issues and breaking changes

# Check if any other packages in requirements.txt depend on ovos-plugin-manager
pip index dependencies ovos-plugin-manager==0.8.0 | grep -f <(cat requirements/requirements.txt | cut -d'>' -f1)

# Check changelog/release notes for breaking changes
gh api repos/OpenVoiceOS/ovos-plugin-manager/releases | jq -r '.[].body' | grep -i "breaking"

Length of output: 358


Script:

#!/bin/bash
# Search for imports and usage of ovos-plugin-manager
rg -l "from ovos_plugin_manager|import ovos_plugin_manager" --type python

# Search for any configuration files that might reference the package
fd -e yaml -e toml -e ini -e cfg | xargs rg "ovos.plugin.manager|ovos_plugin_manager"

# Check setup.py/pyproject.toml for dependencies
fd "setup.py|pyproject.toml" | xargs cat

Length of output: 21553


Script:

#!/bin/bash
# Search for any imports or usage of ovos-plugin-manager in Python files
rg "from ovos_plugin_manager|import ovos_plugin_manager|ovos[_\.]plugin[_\.]manager" -t py

# Also check for any potential version constraints in requirements files
fd "requirements.txt" | xargs cat

Length of output: 4368

.github/workflows/pipaudit.yml (1)

14-14: LGTM: Python version matrix update

Removing Python 3.7 and 3.8 from the test matrix aligns with the project's direction to modernize the Python version requirements.

.github/workflows/build_tests.yml (1)

19-19: Verify Python version matrix consistency across workflows

The Python version matrix in this workflow (3.10, 3.11) is more restrictive compared to pipaudit.yml (3.9, 3.10, 3.11). This inconsistency might lead to confusion:

  • build_tests.yml: Python 3.10, 3.11
  • pipaudit.yml: Python 3.9, 3.10, 3.11

Please ensure this is intentional and update the matrices to be consistent across workflows.

.github/workflows/sync_tx.yml Show resolved Hide resolved
@github-actions github-actions bot added fix and removed fix labels Jan 9, 2025
coderabbitai bot added a commit that referenced this pull request Jan 9, 2025
Docstrings generation was requested by @JarbasAl.

* #643 (comment)

The following files were modified:

* `ovos_core/intent_services/__init__.py`
* `ovos_core/intent_services/converse_service.py`
* `ovos_core/intent_services/stop_service.py`
Copy link

coderabbitai bot commented Jan 9, 2025

Note

We have generated docstrings for this pull request, at #644

coderabbitai bot and others added 2 commits January 9, 2025 19:47
Docstrings generation was requested by @JarbasAl.

* #643 (comment)

The following files were modified:

* `ovos_core/intent_services/__init__.py`
* `ovos_core/intent_services/converse_service.py`
* `ovos_core/intent_services/stop_service.py`

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
no need for 2 handlers, decrease complexity

the only difference is an emitted event that is not listened too anywhere
@github-actions github-actions bot added fix and removed fix labels Jan 9, 2025
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: 0

🧹 Nitpick comments (3)
ovos_core/intent_services/converse_service.py (2)

359-359: Consider defensive copying of the session object.

While adding the session to PipelineMatch is a good improvement for session state tracking, consider creating a deep copy of the session object to prevent any unintended modifications after this point.

-                                     updated_session=session,
+                                     updated_session=session.copy(),

Line range hint 316-359: Good session management pattern implementation.

The addition of session state tracking in the pipeline match provides a clean way to propagate session changes through the conversation pipeline. This architectural pattern will help with:

  • Debugging conversation flow
  • State management across the system
  • Tracing skill interactions

Consider documenting this pattern in the project's architectural documentation to establish it as a best practice.

test/end2end/session/test_stop.py (1)

144-153: Enhanced cleanup process for stop operation.

The changes introduce a more comprehensive cleanup sequence that:

  1. Properly terminates ongoing skill activities
  2. Forces timeout of conversations
  3. Stops any ongoing speech
  4. Updates skill usage timestamps

This enhancement ensures a more thorough cleanup when stopping skills.

Consider documenting these cleanup steps in the core documentation to help skill developers understand the complete stop sequence.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4fa2355 and 040042f.

📒 Files selected for processing (4)
  • ovos_core/intent_services/__init__.py (2 hunks)
  • ovos_core/intent_services/converse_service.py (2 hunks)
  • ovos_core/intent_services/stop_service.py (7 hunks)
  • test/end2end/session/test_stop.py (6 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • ovos_core/intent_services/init.py
  • ovos_core/intent_services/stop_service.py
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: end2end_tests (3.9)
🔇 Additional comments (6)
ovos_core/intent_services/converse_service.py (1)

316-338: Well-documented method signature and behavior!

The enhanced docstring provides comprehensive documentation of the method's purpose, parameters, return values, and implementation details. This improvement in documentation clarity will help developers better understand and use the method.

test/end2end/session/test_stop.py (5)

70-75: LGTM! Protocol simplification in stop response handling.

The changes streamline the stop protocol by focusing on response messages rather than tracking both request and response messages. This simplification maintains effective test coverage while reducing redundant checks.


226-234: LGTM! Improved test documentation and consistent protocol.

The changes maintain consistency with the simplified stop protocol while adding helpful comments that explain the purpose of each framework's response message.


313-316: LGTM! Consistent cleanup process across implementations.

The changes ensure that both old and new stop implementations follow the same thorough cleanup process, maintaining consistency in the codebase.


334-336: LGTM! Enhanced response validation.

The addition of explicit checks for both message type and result field improves test robustness by ensuring the stop operation reports success correctly.


357-377: LGTM! Comprehensive failure scenario coverage.

The changes improve test coverage by:

  1. Validating speak messages during failed stop attempts
  2. Ensuring proper fallback behavior through the pipeline
  3. Verifying the complete message sequence in failure scenarios

@github-actions github-actions bot removed the fix label Jan 9, 2025
@github-actions github-actions bot added the fix label Jan 9, 2025
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

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between f30ff53 and 3c5de47.

📒 Files selected for processing (1)
  • test/end2end/session/test_sched.py (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: end2end_tests (3.9)
  • GitHub Check: mycroft_tests (3.9)
🔇 Additional comments (1)
test/end2end/session/test_sched.py (1)

113-114: Verify context propagation in core functionality.

The changes to how context is obtained suggest potential issues with context propagation in the core system. Please verify:

  1. Whether the context is properly maintained throughout the event chain in the core system
  2. If there are similar context handling issues in other event-triggering scenarios
  3. If this fix should be accompanied by changes to the core event scheduling system

test/end2end/session/test_sched.py Show resolved Hide resolved
@github-actions github-actions bot added fix and removed fix labels Jan 10, 2025
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: 0

🧹 Nitpick comments (1)
test/end2end/skill-fake-fm/__init__.py (1)

Line range hint 18-35: Consider documenting the confidence score thresholds

The score calculation logic (base 30 + 35 for "fake" + 20/-30 for media type + index) seems to be part of the test infrastructure. Consider adding comments explaining the significance of these thresholds and how they relate to the stop behavior being tested.

+        # Base confidence score for FakeFM skill
         score = 30
+        # Boost confidence if "fake" keyword is present
         if "fake" in phrase:
             score += 35
+        # Adjust confidence based on media type matching
         if media_type == MediaType.RADIO:
             score += 20
         else:
             score -= 30
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 3c5de47 and 56635be.

📒 Files selected for processing (2)
  • test/end2end/session/test_ocp.py (2 hunks)
  • test/end2end/skill-fake-fm/__init__.py (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: end2end_tests (3.9)
  • GitHub Check: license_tests
🔇 Additional comments (4)
test/end2end/session/test_ocp.py (2)

148-148: LGTM! Clear documentation of expected behavior.

The added comment "nothing to play" effectively documents the purpose of the "speak" message in the test sequence.


353-356: LGTM! Verify the expected number of query responses.

The test now expects five query responses instead of one, which better reflects the actual behavior of the media search pipeline.

Run this script to verify the expected number of query responses:

✅ Verification successful

Verified: Five query responses is the correct expectation

The codebase consistently expects exactly 5 "ovos.common_play.query.response" messages across all test scenarios (generic search, radio, explicit skill search) in multiple test files. This is a well-established pattern in the OpenVoiceOS Common Play pipeline.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the number of query responses in the codebase
# Look for patterns where multiple query responses are emitted

ast-grep --pattern 'emit($_, "ovos.common_play.query.response")'

Length of output: 66


Script:

#!/bin/bash
# Search for query response message pattern in various forms
echo "=== Searching for query response message ==="
rg "ovos\.common_play\.query\.response" -A 3 -B 3

echo -e "\n=== Searching for emit patterns in test files ==="
fd "test.*\.py$" --exec rg "emit.*response" -A 2 -B 2 {}

echo -e "\n=== Looking for message definitions ==="
rg "common_play.*query.*response" -A 2 -B 2

Length of output: 19073

test/end2end/skill-fake-fm/__init__.py (2)

18-18: Verify the impact of reduced confidence score on stop behavior

The initial score reduction from 50 to 30 will result in lower match confidence scores for all search results. Given that this PR is focused on improving stop behavior, we should verify if this change affects the skill's stop responsiveness.

Let's check for related test cases:


Line range hint 18-35: Verify test coverage for lower confidence thresholds

Since this is a test skill and the confidence scores have been lowered, we should ensure that existing test cases still provide adequate coverage for edge cases.

Let's check for existing test coverage:

@github-actions github-actions bot added fix and removed fix labels Jan 10, 2025
@JarbasAl JarbasAl merged commit 07baa29 into dev Jan 10, 2025
9 of 10 checks passed
@JarbasAl JarbasAl deleted the stop branch January 10, 2025 02:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant