AutoGPT icon indicating copy to clipboard operation
AutoGPT copied to clipboard

refactor(agent, forge): Move library code from `autogpt` to `forge`

Open kcze opened this issue 10 months ago • 15 comments

Background

The goal of this PR is to move reusable code (including components) to forge so AutoGPT agent is built using forge.

Changes 🏗️

The vast majority of changes are import updates, other are sporadic removals and necessary updates (for example to fix circular deps):

  • Changed CommandOutput = Any to remove coupling with ContextItem (no longer needed)
  • Removed unused Singleton class
  • Reluctantly moved speech to forge due to coupling (tts needs to be changed into component)
  • Moved function_specs_from_commands and core/resource/model_providers to llm/providers (resources were a core thing and are no longer relevant)
  • Keep tests in autogpt to reduce changes in this PR
  • Removed unused memory-related code from tests
  • Removed duplicated classes: FancyConsoleFormatter, BelowLevelFilter
  • prompt_settings.yaml is in both autogpt and forge because for some reason doesn't work when placed in just one dir (need to be taken care of)
  • Removed config param from clean_input, it wasn't used and caused circular dependency
  • Renamed BaseAgentActionProposal to ActionProposal
  • Updated pyproject.toml in forge and autogpt
  • Moved Action* models from forge/components/action_history/model.py to forge/models/action.py as those are relevant to the entire agent and not just EventHistoryComponent + to reduce coupling
  • Renamed DEFAULT_ASK_COMMAND to ASK_COMMAND and DEFAULT_FINISH_COMMAND to FINISH_COMMAND
  • Renamed AutoGptFormatter to ForgeFormatter and moved to forge
  • Includes https://github.com/Significant-Gravitas/AutoGPT/pull/7148

PR Quality Scorecard ✨

  • [x] Have you used the PR description template?   +2 pts
  • [ ] Is your pull request atomic, focusing on a single change?   +5 pts
  • [ ] Have you linked the GitHub issue(s) that this PR addresses?   +5 pts
  • [ ] Have you documented your changes clearly and comprehensively?   +5 pts
  • [ ] Have you changed or added a feature?   -4 pts
    • [ ] Have you added/updated corresponding documentation?   +4 pts
    • [ ] Have you added/updated corresponding integration tests?   +5 pts
  • [ ] Have you changed the behavior of AutoGPT?   -5 pts
    • [ ] Have you also run agbenchmark to verify that these changes do not regress performance?   +10 pts

PR Type

enhancement, bug_fix


Description

  • Introduced new configuration management classes in forge/config/schema.py to enhance system and user settings management.
  • Developed a new user input utility function in forge/utils/input.py to streamline input handling and improve error management.
  • Initialized the event_history module in forge/components/event_history/__init__.py to better organize event-related classes and functions.
  • Updated the LLM providers initialization in forge/llm/providers/__init__.py to include a new utility function, enhancing command specifications handling.
  • Enhanced the logging system by integrating new filters and formatters in forge/logging/__init__.py.
  • Fixed incorrect imports in the SDK initialization file forge/sdk/__init__.py, removing references to a non-existent errors module and adding necessary exception handling utilities.

Changes walkthrough 📝

Relevant files
Enhancement
schema.py
Add Configuration Management Classes                                         

autogpts/forge/forge/config/schema.py

  • Added new classes SystemConfiguration, SystemSettings, and
    UserConfigurable for configuration management.
  • These classes support the configuration of system-wide settings and
    user-specific settings.
  • +352/-1 
    input.py
    Implement User Input Handling Utility                                       

    autogpts/forge/forge/utils/input.py

  • Added a new utility function clean_input to handle user input with
    error handling for keyboard interrupts.
  • +19/-0   
    __init__.py
    Update LLM Providers Initialization                                           

    autogpts/forge/forge/llm/providers/init.py

  • Updated imports to include new utility function
    function_specs_from_commands.
  • +2/-0     
    __init__.py
    Enhance Logging Initialization with New Components             

    autogpts/forge/forge/logging/init.py

    • Added imports for new logging filters and formatters.
    +2/-13   
    Configuration changes
    __init__.py
    Initialize Event History Module                                                   

    autogpts/forge/forge/components/event_history/init.py

  • Created an initialization file for the event_history module to manage
    action proposals and results.
  • +10/-0   
    Bug_fix
    __init__.py
    Correct SDK Initialization Imports                                             

    autogpts/forge/forge/sdk/init.py

  • Removed erroneous import of deleted module errors.
  • Added import for exception handling utilities.
  • +2/-2     

    💡 PR-Agent usage: Comment /help on the PR to get a list of all available PR-Agent tools and their descriptions

    kcze avatar Apr 25 '24 22:04 kcze

    Deploy Preview for auto-gpt-docs canceled.

    Name Link
    Latest commit 9681973639e1fe26021d062830bbb396a5f08be5
    Latest deploy log https://app.netlify.com/sites/auto-gpt-docs/deploys/6644cd26f1152100086f270e

    netlify[bot] avatar Apr 25 '24 22:04 netlify[bot]

    This pull request has conflicts with the base branch, please resolve those so we can evaluate the pull request.

    github-actions[bot] avatar May 07 '24 11:05 github-actions[bot]

    Conflicts have been resolved! 🎉 A maintainer will review the pull request shortly.

    github-actions[bot] avatar May 07 '24 18:05 github-actions[bot]

    Codecov Report

    Attention: Patch coverage is 56.20915% with 67 lines in your changes are missing coverage. Please review.

    Project coverage is 22.02%. Comparing base (4f81246) to head (5fa755f).

    :exclamation: Current head 5fa755f differs from pull request most recent head 9681973. Consider uploading reports for the commit 9681973 to get more accurate results

    Files Patch % Lines
    ...pt/core/planning/prompt_strategies/initial_plan.py 0.00% 7 Missing :warning:
    ...pt/core/planning/prompt_strategies/next_ability.py 0.00% 7 Missing :warning:
    ...ogpts/autogpt/autogpt/app/agent_protocol_server.py 0.00% 6 Missing :warning:
    ...ogpt/core/ability/builtins/query_language_model.py 0.00% 6 Missing :warning:
    autogpts/autogpt/autogpt/core/planning/simple.py 0.00% 6 Missing :warning:
    autogpts/autogpt/autogpt/app/main.py 73.68% 4 Missing and 1 partial :warning:
    .../core/planning/prompt_strategies/name_and_goals.py 0.00% 5 Missing :warning:
    ...ogpt/autogpt/core/runner/cli_web_app/server/api.py 0.00% 4 Missing :warning:
    autogpts/autogpt/autogpt/core/ability/base.py 0.00% 3 Missing :warning:
    autogpts/autogpt/autogpt/app/configurator.py 66.66% 2 Missing :warning:
    ... and 11 more
    Additional details and impacted files
    @@             Coverage Diff             @@
    ##           master    #7106       +/-   ##
    ===========================================
    - Coverage   44.68%   22.02%   -22.66%     
    ===========================================
      Files         133       64       -69     
      Lines        6315     2651     -3664     
      Branches      823      303      -520     
    ===========================================
    - Hits         2822      584     -2238     
    + Misses       3382     2034     -1348     
    + Partials      111       33       -78     
    
    Flag Coverage Δ
    Linux 22.02% <56.20%> (-22.58%) :arrow_down:
    Windows 21.91% <56.20%> (-20.86%) :arrow_down:
    autogpt-agent 22.02% <56.20%> (-22.63%) :arrow_down:
    macOS 22.02% <56.20%> (-21.97%) :arrow_down:

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

    :umbrella: View full report in Codecov by Sentry.
    :loudspeaker: Have feedback on the report? Share it here.

    codecov[bot] avatar May 07 '24 18:05 codecov[bot]

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    PR Description updated to latest commit (https://github.com/Significant-Gravitas/AutoGPT/commit/5fa755f2b8fa9ffda7dfee2d53ea36bc37387a43)

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    PR Review 🔍

    ⏱️ Estimated effort to review [1-5]

    5, due to the extensive changes across multiple files involving refactoring, moving components, and integrating new utilities. The PR touches on various critical areas such as configuration, logging, file storage, and command execution, which requires thorough review and testing to ensure compatibility and functionality are maintained.

    🧪 Relevant tests

    No

    ⚡ Possible issues

    Possible Bug: The refactoring and renaming of classes and methods without corresponding updates in all locations might lead to runtime errors. For example, if any old references to moved or renamed methods are not updated, it could cause failures.

    Performance Concerns: The extensive changes in core components like logging, command handling, and file storage might affect the performance. It's crucial to benchmark the new implementation against the old to ensure there are no regressions.

    🔒 Security concerns

    No specific security concerns detected in the provided PR diff. However, it's recommended to ensure that all data handling, especially with file operations and external command executions, are securely managed to prevent any potential vulnerabilities.

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    PR Code Suggestions ✨

    CategorySuggestions                                                                                                                                                       
    Best practice
    Replace mutable default arguments with safer alternatives.

    Replace the mutable default argument {} with None and initialize it inside the function to
    avoid potential bugs related to mutable default arguments.

    autogpts/forge/forge/config/schema.py [99]

    -def build_agent_configuration(cls, overrides: dict = {}) -> S:
    +def build_agent_configuration(cls, overrides: Optional[dict] = None) -> S:
    +    if overrides is None:
    +        overrides = {}
     
    
    Use isinstance() for type checks to support inheritance.

    Replace the use of type() with isinstance() for checking object types, which is more
    idiomatic and supports inheritance.

    autogpts/forge/forge/config/schema.py [56]

    -if type(from_env) is str else from_env()
    +if isinstance(from_env, str) else from_env()
     
    
    Ensure files are properly closed by using context management in file operations.

    Use context management for file operations to ensure that files are properly closed after
    operations, preventing resource leaks.

    autogpts/forge/forge/file_storage/local.py [52]

    -file = open(full_path, mode)  # type: ignore
    -return file
    +with open(full_path, mode) as file:  # type: ignore
    +    return file
     
    
    Specify file encoding explicitly when opening files to handle different system encodings.

    To ensure that the json_loads function handles different encodings properly, explicitly
    specify the encoding when opening files. This avoids issues with systems where the default
    encoding is not UTF-8.

    autogpts/forge/forge/agent/base.py [37-38]

    -with open(ai_settings_file, encoding="utf-8") as file:
    +with open(ai_settings_file, mode='r', encoding="utf-8") as file:
         config_params = yaml.load(file, Loader=yaml.SafeLoader) or {}
     
    
    Improve import specificity for better code clarity and to avoid conflicts.

    Consider using a more specific import statement for ActionProposal to avoid potential
    conflicts and improve code clarity. Instead of importing ActionProposal directly under a
    generic module path, specify the exact module where ActionProposal is defined.

    autogpts/autogpt/autogpt/agents/prompt_strategies/one_shot.py [9]

    -from forge.agent.base import ActionProposal
    +from forge.agent.base.action_proposal import ActionProposal
     
    
    Enhancement
    Improve exception handling by catching specific error types.

    Use a more specific exception handling instead of catching a general ValidationError. This
    will make the error handling more precise and informative.

    autogpts/forge/forge/config/schema.py [140-144]

     except ValidationError as e:
    +    if all(e["type"] == "value_error.missing" for e in e.errors()):
    +        return None
    +    elif all(e["type"] == "type_error" for e in e.errors()):
    +        # Handle type errors specifically
    +        pass
    +    else:
    +        raise
     
    
    Add error handling around input functions to manage exceptions and maintain robustness.

    Add error handling for the clean_input function to manage exceptions or invalid inputs
    effectively.

    autogpts/autogpt/autogpt/app/main.py [201]

    -answer = clean_input("Resume? [Y/n]")
    +try:
    +    answer = clean_input("Resume? [Y/n]")
    +except ValueError as e:
    +    logger.error(f"Invalid input: {e}")
    +    continue  # or handle appropriately
     
    
    Use a custom exception for JSON parsing errors to enhance error clarity and robustness.

    Consider using a more specific exception than ValueError when handling JSON parsing errors
    in json_loads. A custom exception like JSONParsingError could provide clearer error
    handling and make the codebase more robust.

    autogpts/forge/forge/agent/base.py [43-45]

    -raise ValueError(
    +raise JSONParsingError(
         f"Failed to parse JSON string: {json_str}", *json_result.errors
     )
     
    
    Use a more descriptive name for the thoughts variable to enhance code readability and clarity.

    Consider using a more descriptive variable or type name than thoughts to clarify its
    purpose and contents, especially if it holds complex data structures or important business
    logic.

    autogpts/autogpt/autogpt/agents/prompt_strategies/one_shot.py [46]

    -thoughts: AssistantThoughts
    +assistantThoughts: AssistantThoughts  # More descriptive, indicating the specific type of thoughts
     
    
    Maintainability
    Improve variable naming for better code readability.

    Use a more explicit variable name than SC to improve code readability and maintainability.

    autogpts/forge/forge/config/schema.py [70]

    -SC = TypeVar("SC", bound=SystemConfiguration)
    +SystemConfigType = TypeVar("SystemConfigType", bound=SystemConfiguration)
     
    
    Refactor repeated regex patterns into a shared constant to reduce duplication and improve maintainability.

    To improve the maintainability and readability of the code, consider refactoring the
    repeated regex pattern used in extract_dict_from_json and extract_list_from_json into a
    shared constant. This will reduce duplication and make future changes easier.

    autogpts/forge/forge/agent/base.py [52]

    -pattern = r"```(?:json|JSON)*([\s\S]*?)```"
    +JSON_CODE_BLOCK_PATTERN = r"```(?:json|JSON)*([\s\S]*?)```"
    +# Use the constant in the functions
    +pattern = JSON_CODE_BLOCK_PATTERN
     
    
    Consolidate imports from the same module into a single line for clarity and reduced verbosity.

    Since AssistantChatMessage, ChatMessage, and CompletionModelFunction are related and
    imported from the same module, consider using a single line import to reduce verbosity and
    improve readability.

    autogpts/autogpt/autogpt/agents/prompt_strategies/one_shot.py [15-19]

    -from forge.llm.providers.schema import (
    -    AssistantChatMessage,
    -    ChatMessage,
    -    CompletionModelFunction,
    -)
    +from forge.llm.providers.schema import AssistantChatMessage, ChatMessage, CompletionModelFunction
     
    
    Bug
    Correct a typo in the dictionary key.

    Correct the typo in the dictionary key from 'minumum' to 'minimum'.

    autogpts/forge/forge/json/schema.py [51]

    -schema["minumum"] = self.minimum
    +schema["minimum"] = self.minimum
     
    
    Ensure input handling respects specific configurations by passing the configuration context.

    Replace the direct use of clean_input with a version that includes configuration context
    to ensure that any specific configurations related to input handling are respected.

    autogpts/autogpt/autogpt/app/main.py [174-176]

     load_existing_agent = clean_input(
    +    config,
         "Enter the number or name of the agent to run,"
         " or hit enter to create a new one:"
     )
     
    
    Prevent unintended behavior by checking for non-empty input before loading agent state.

    Implement a check to ensure the answer variable is not empty before proceeding to load the
    agent state, to prevent unintended behavior.

    autogpts/autogpt/autogpt/app/main.py [202-203]

    -if answer == "" or answer.lower() == "y":
    +if answer.strip() and answer.lower() == "y":
         agent_state = agent_manager.load_agent_state(load_existing_agent)
     
    
    Ensure that AssistantThoughts is properly defined or imported to avoid runtime errors.

    To avoid potential runtime errors, ensure that the AssistantThoughts class or type is
    properly defined or imported in the current module, as it is used in the
    OneShotAgentActionProposal class.

    autogpts/autogpt/autogpt/agents/prompt_strategies/one_shot.py [46]

    +from forge.thoughts import AssistantThoughts  # Assuming the correct import path
     class OneShotAgentActionProposal(ActionProposal):
         thoughts: AssistantThoughts
     
    
    Security
    Enhance security by using yaml.safe_load for YAML file operations.

    Replace the direct use of yaml.load with yaml.safe_load to avoid potential security risks
    associated with loading arbitrary YAML content.

    autogpts/forge/forge/utils/file_operations.py [71]

    -data = yaml.load(file, Loader=yaml.SafeLoader)
    +data = yaml.safe_load(file)
     
    
    Reliability
    Replace assert with error handling in production code to ensure reliability.

    Replace the use of assert for checking json_result in production code with a more robust
    error handling strategy. Assertions can be disabled in some Python execution environments,
    leading to potential bugs.

    autogpts/forge/forge/agent/base.py [35]

    -assert json_result is not None  # by virtue of return_errors=True
    +if json_result is None:
    +    raise JSONParsingError("No result returned from JSON parsing.")
     
    
    Performance
    Optimize character stripping in AIProfile.load using regex for better performance.

    Use a more efficient method for stripping characters in AIProfile.load. Instead of using
    multiple replace calls, consider using a regex substitution which can handle all
    replacements in one pass.

    autogpts/forge/forge/agent/base.py [44-49]

    +import re
     ai_goals = [
    -    str(goal).strip("{}").replace("'", "").replace('"', "")
    +    re.sub(r"[{}'"]", "", str(goal))
         if isinstance(goal, dict)
         else str(goal)
         for goal in config_params.get("ai_goals", [])
     ]
     
    
    Possible issue
    Ensure that the new class definition includes all necessary methods and properties from the base class.

    To ensure that the OneShotAgentActionProposal class is correctly integrated into the new
    forge framework, verify that all methods and properties from the BaseAgentActionProposal
    (from the old codebase) are either implemented or intentionally omitted in the new class
    definition.

    autogpts/autogpt/autogpt/agents/prompt_strategies/one_shot.py [45-46]

     class OneShotAgentActionProposal(ActionProposal):
    +    # Ensure all necessary methods and properties are included
         thoughts: AssistantThoughts
    +    # Add other methods and properties as needed
     
    

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    Changelog updates: 🔄

    2024-05-07

    Added

    • Introduced new JSON and schema configuration files in forge.
    • Added new logging filters and formatters to forge.

    Changed

    • Refactored codebase to move reusable components and utilities from autogpt to forge.
    • Updated various imports and configurations to align with the new forge structure.
    • Moved tests related to moved components to forge.

    Fixed

    • Addressed circular dependencies arising from the refactor.
    • Resolved issues with environment variable configurations in forge.

    to commit the new content to the CHANGELOG.md file, please type: '/update_changelog --pr_update_changelog.push_changelog_changes=true'

    PR-Agent was enabled for this repository. To continue using it, please link your git user with your CodiumAI identity here.

    PR Analysis 🔬

    • This screen contains a list of code components that were changed in this PR.
    • You can initiate specific actions for each component, by checking the relevant boxes.
    • After you check a box, the action will be performed automatically by PR-Agent.
    • Results will appear as a comment on the PR, typically after 30-60 seconds.
    fileChanged components
    one_shot.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    OneShotAgentActionProposal
    (class)
     
    +2/-2
     
    configurator.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    apply_overrides_to_config
    (function)
     
    +3/-3
     
    main.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    run_auto_gpt
    (function)
     
    +3/-6
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    update_user
    (function)
     
    +2/-2
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    get_user_feedback
    (function)
     
    +2/-2
     
    setup.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    interactively_revise_ai_settings
    (function)
     
    +4/-12
     
    simple.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    SimpleAgent
    (class)
     
    +2/-4
     
    conftest.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    memory_item
    (function)
     
    +10/-0
     
    test_config.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    test_create_config_gpt4only
    (function)
     
    +2/-2
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    test_create_config_gpt3only
    (function)
     
    +2/-2
     
    test_web_search.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    test_google_search
    (function)
     
    +2/-2
     
    base.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    propose_action
    (method of BaseAgent)
     
    +2/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    execute
    (method of BaseAgent)
     
    +6/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    do_not_execute
    (method of BaseAgent)
     
    +6/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    run_pipeline
    (method of BaseAgent)
     
    +75/-0
     
    components.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    AgentComponent
    (class)
     
    +14/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    ComponentEndpointError
    (class)
     
    +6/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    EndpointPipelineError
    (class)
     
    +2/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    ComponentSystemError
    (class)
     
    +3/-0
     
    protocols.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    after_parse
    (method of AfterParse)
     
    +2/-0
     
    action_history.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    ActionProposal
    (class)
     
    +3/-0
     
    user_interaction.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    ask_user
    (function)
     
    +6/-0
     
    watchdog.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    __init__
    (method of WatchdogComponent)
     
    +8/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    after_parse
    (method of WatchdogComponent)
     
    +32/-0
     
    ai_directives.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    from_file
    (method of AIDirectives)
     
    +17/-0
     
    ai_profile.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    AIProfile
    (class)
     
    +62/-0
     
    config.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    assert_config_has_openai_api_key
    (function)
     
    +45/-0
     
    schema.py
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    UserConfigurable
    (function)
     
    +18/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    SystemConfiguration
    (class)
     
    +34/-0
     
    • [ ] Test
    • [ ] Docs
    • [ ] Improve
    • [ ] Similar
     
    SystemSettings
    (class)
     
    +10/-0
     

    💡 Usage guide:

    Using static code analysis capabilities, the analyze tool scans the PR code changes and find the code components (methods, functions, classes) that changed in the PR.

    The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on any PR:

    /analyze
    

    Language that are currently supported: Python, Java, C++, JavaScript, TypeScript, C#. See more information about the tool in the docs.

    This pull request has conflicts with the base branch, please resolve those so we can evaluate the pull request.

    github-actions[bot] avatar May 09 '24 09:05 github-actions[bot]

    Component agent docs should be moved to forge docs :)

    Pwuts avatar May 10 '24 07:05 Pwuts

    Conflicts have been resolved! 🎉 A maintainer will review the pull request shortly.

    github-actions[bot] avatar May 10 '24 18:05 github-actions[bot]

    @kcze Would you like me to force merge it in. Assuming your later PRs eventually fix the CI's

    Swiftyos avatar May 13 '24 11:05 Swiftyos

    This pull request has conflicts with the base branch, please resolve those so we can evaluate the pull request.

    github-actions[bot] avatar May 14 '24 14:05 github-actions[bot]

    Conflicts have been resolved! 🎉 A maintainer will review the pull request shortly.

    github-actions[bot] avatar May 15 '24 14:05 github-actions[bot]