Compare commits

...

692 Commits

Author SHA1 Message Date
AI Christianson 18dd8a7c06 get rid of pointless fn 2025-03-16 12:53:00 -04:00
AI Christianson 80e8a712ac verbose console logging by default for server 2025-03-16 10:05:53 -04:00
AI Christianson 3c0319d50f server config 2025-03-15 22:45:15 -04:00
AI Christianson 8d44ba0824 expert/web enabled based on config 2025-03-15 22:16:50 -04:00
AI Christianson 1dc9326154 get model from config 2025-03-15 22:02:05 -04:00
AI Christianson c848c04ee3 only migrate in main 2025-03-15 21:48:51 -04:00
AI Christianson fee23fcc21 add /v1/spawn-agent 2025-03-15 21:35:43 -04:00
AI Christianson 510e1016f8 make it so we have only one server entrypoint 2025-03-15 16:34:49 -04:00
AI Christianson 64a04e2535 make 1818 the default port 2025-03-15 16:24:34 -04:00
AI Christianson c18c4dbd22 session API endpoint 2025-03-15 16:12:17 -04:00
AI Christianson 77cfbdeca7 webui -> server 2025-03-15 15:14:56 -04:00
AI Christianson e0aab1021b use pydantic models 2025-03-15 14:29:42 -04:00
Ariel Frischer 5d07a7f7b8
Merge pull request #137 from ariel-frischer/use-correct-37-sonnet-state-modifier
Use correct state_modifier when using openrouter claude 3.7
2025-03-15 09:54:27 -07:00
Ariel Frischer 6c159d39d4 feat(agent_utils.py): add get_model_name_from_chat_model function to improve model handling
refactor(build_agent_kwargs): simplify state modifier logic by using model name instead of model attribute
2025-03-15 09:48:52 -07:00
Andrew I. Christianson cde8eee4fa
Merge pull request #136 from ariel-frischer/fix-undefined-model-2
Fix undefined model.model when using openrouter sonnet 3.7
2025-03-15 12:41:09 -04:00
Ariel Frischer f1274b3164 refactor(anthropic_token_limiter.py): update model parameter type in state_modifier to BaseChatModel for better compatibility
feat(anthropic_token_limiter.py): add get_model_name_from_chat_model function to extract model name from BaseChatModel instances
style(anthropic_token_limiter.py): format code for better readability and consistency in function definitions and logging messages
2025-03-15 09:37:26 -07:00
Andrew I. Christianson 9225ec3f2a
Merge pull request #135 from ariel-frischer/fix-undefined-model
fix(agent_utils.py): add check for model attribute to prevent errors …
2025-03-15 12:25:37 -04:00
Ariel Frischer bef504d756 fix(agent_utils.py): add check for model attribute to prevent errors when model does not have 'model' attribute 2025-03-15 09:23:01 -07:00
AI Christianson 75636f0477 webui -> server 2025-03-15 10:02:05 -04:00
Andrew I. Christianson a3dfb81840
Merge pull request #133 from andrewdkennedy1/detect-shell-env
Update shell.py for native windows support
2025-03-14 20:32:11 -04:00
Andrew 05eb50bd97
Update shell.py
adding windows support so shell commands run native without wsl
2025-03-14 16:37:32 -07:00
AI Christianson 46dd75a7e3 fixed session panel 2025-03-14 18:02:21 -04:00
AI Christianson e692f383c4 logos 2025-03-14 17:46:33 -04:00
AI Christianson 6e5f58e18d move theme toggle to right side 2025-03-14 17:37:35 -04:00
AI Christianson 7671312435 get rid of Sessions heading 2025-03-14 17:29:32 -04:00
AI Christianson f7aaccec76 ux 2025-03-14 17:28:21 -04:00
AI Christianson f1277aadf1 session panel spacing 2025-03-14 17:08:14 -04:00
Andrew I. Christianson aaf09c5df6
Merge pull request #132 from ariel-frischer/fix-token-limiter-2
Fix Sonnet 3.7 Token Limiter - Adjust Effective Max Input Tokens
2025-03-14 16:42:39 -04:00
AI Christianson 997c5e7ea7 make session list take up full width 2025-03-14 16:33:04 -04:00
Ariel Frischer 92faf8fc2d feat(anthropic_token_limiter): add get_provider_and_model_for_agent_type function to streamline provider and model retrieval based on agent type
fix(anthropic_token_limiter): refactor get_model_token_limit to use the new get_provider_and_model_for_agent_type function for cleaner code
test(anthropic_token_limiter): add unit tests for get_provider_and_model_for_agent_type and adjust_claude_37_token_limit functions to ensure correctness and coverage
2025-03-14 13:31:51 -07:00
AI Christianson 7d85dc2b05 click overlap event issue 2025-03-14 16:27:10 -04:00
Ariel Frischer 29c9cac4f4 feat(main.py): reorganize litellm configuration to improve clarity and maintainability
feat(agent_utils.py): add model detection utilities for Claude 3.7 models
fix(agent_utils.py): update get_model_token_limit to handle Claude 3.7 token limits correctly
test(model_detection.py): add unit tests for model detection utilities
chore(agent_utils.py): remove deprecated is_anthropic_claude function and related tests
style(agent_utils.py): format code for better readability and consistency
2025-03-14 13:10:44 -07:00
Andrew I. Christianson fe3adbd241
Merge pull request #131 from therality/master
Remove get_aider_executable and associated test
2025-03-14 15:40:39 -04:00
Will 5445a5c4a9 Removing get_aider_executable test as no longer relevant 2025-03-14 15:35:34 -04:00
Will 39ed523288 Removing get_aidr_executable as no longer a depedency 2025-03-14 15:29:11 -04:00
Andrew I. Christianson 0fe019bc9a
Merge pull request #130 from therality/master
Adding prompt-toolkit as dependency
2025-03-14 15:26:25 -04:00
Will 3f28ea80aa
Merge branch 'ai-christianson:master' into master 2025-03-14 15:25:35 -04:00
AI Christianson 0c40fa72c3 style/hmr 2025-03-14 15:09:22 -04:00
AI Christianson 07c6c2e5b5 fix hot reload on dev server 2025-03-14 10:25:22 -04:00
AI Christianson fe3984329d make sure session list hides when open and window expanded 2025-03-14 10:16:23 -04:00
AI Christianson 0a46e3c92b FAB color 2025-03-14 10:11:42 -04:00
AI Christianson 8a507f245e floating action button for sessions panel 2025-03-14 10:08:17 -04:00
AI Christianson af16879dd6 ui styling 2025-03-14 09:15:11 -04:00
AI Christianson f29658fee8 ui styling 2025-03-14 08:54:24 -04:00
Will 996608e4e3 Adding prompt-toolkit as dependency 2025-03-13 21:37:04 -04:00
AI Christianson 262c9f7d77 fix dark colors 2025-03-13 20:02:50 -04:00
AI Christianson d5d250b215 fix dark theme 2025-03-13 19:53:00 -04:00
AI Christianson 9f24c6bef9 remove junk 2025-03-13 18:47:36 -04:00
AI Christianson 1ced6ece4c agent ui components 2025-03-13 18:25:21 -04:00
AI Christianson a9c7f92687 style 2025-03-13 16:48:29 -04:00
AI Christianson 4685550605 integrate shadcn 2025-03-13 15:19:11 -04:00
AI Christianson a2129641ae Revert "shadcn integration"
This reverts commit 9d585f38b5.
2025-03-13 14:13:04 -04:00
AI Christianson 9d585f38b5 shadcn integration 2025-03-13 13:51:35 -04:00
AI Christianson fa66066c07 set up frontend/ infra 2025-03-13 12:18:54 -04:00
AI Christianson c511cefc67 add check for fallback handler 2025-03-13 08:48:51 -04:00
AI Christianson f08e9455b6 version bump 2025-03-13 07:17:26 -04:00
AI Christianson be0b566edb fix ERROR - Error getting expert guidance for planning: module 'ra_aid.agent_utils' has no attribute 'process_thinking_content' 2025-03-13 07:11:32 -04:00
AI Christianson be415ca968 fix config param error 2025-03-13 07:02:25 -04:00
AI Christianson 715d5f483d version bump 2025-03-13 07:02:25 -04:00
Andrew I. Christianson 85cabe4d37
Merge pull request #126 from nahsra/patch-1
Fix dev dependencies instructions
2025-03-12 19:37:48 -04:00
Arshan Dabirsiaghi 80cafa9a40
fix dev dependencies instructions 2025-03-12 19:15:54 -04:00
AI Christianson 26b1dbe966 reasoning assistance docs 2025-03-12 17:09:27 -04:00
Andrew I. Christianson a9656552a9
Merge pull request #124 from ariel-frischer/fix-token-limiter
Fix Sonnet 3.7 Token Limiter API Errors
2025-03-12 14:59:33 -04:00
Ariel Frischer b6f0f6a577 fix(llm.py): remove unnecessary thinking_kwargs from ChatOpenAI parameters to streamline client creation 2025-03-12 11:50:32 -07:00
Ariel Frischer 77a256317a feat: add session and trajectory models to track application state and events
- Introduce a new `Session` model to store information about each program run, including command line arguments and environment details.
- Implement a `Trajectory` model to log significant events and errors during execution, enhancing debugging and monitoring capabilities.
- Update various repository classes to support session and trajectory management, allowing for better tracking of user interactions and system behavior.
- Modify existing functions to record relevant events in the trajectory, ensuring comprehensive logging of application activities.
- Enhance error handling by logging errors to the trajectory, providing insights into failures and system performance.

feat(vsc): add initial setup for VS Code extension "ra-aid" with essential files and configurations
chore(vsc): create tasks.json for managing build and watch tasks in VS Code
chore(vsc): add .vscodeignore to exclude unnecessary files from the extension package
docs(vsc): create CHANGELOG.md to document changes and updates for the extension
docs(vsc): add README.md with instructions and information about the extension
feat(vsc): include esbuild.js for building and bundling the extension
chore(vsc): add eslint.config.mjs for TypeScript linting configuration
chore(vsc): create package.json with dependencies and scripts for the extension
feat(vsc): implement extension logic in src/extension.ts with webview support
test(vsc): add initial test suite in extension.test.ts for extension functionality
chore(vsc): create tsconfig.json for TypeScript compiler options
docs(vsc): add vsc-extension-quickstart.md for guidance on extension development
2025-03-12 11:47:21 -07:00
Ariel Frischer fdd73f149c feat(agent_utils.py): add support for sonnet_35_state_modifier for Claude 3.5 models to enhance token management
chore(anthropic_message_utils.py): remove debug print statements to clean up code and improve readability
chore(anthropic_token_limiter.py): remove debug print statements and replace with logging for better monitoring
test(test_anthropic_token_limiter.py): update tests to verify correct behavior of sonnet_35_state_modifier without patching internal logic
2025-03-12 11:16:54 -07:00
AI Christianson 12d27952d5 add --show-cost flag 2025-03-12 10:21:06 -04:00
AI Christianson 826c53e01a improve prompts 2025-03-12 08:24:41 -04:00
Ariel Frischer 7cfbcb5a2e chore(anthropic_token_limiter.py): comment out max_input_tokens and related debug prints to clean up code and reduce clutter during execution 2025-03-12 00:12:39 -07:00
Ariel Frischer d15d249929 fix(test_agent_utils.py): add name parameter to mock_react calls to ensure consistency in agent creation tests 2025-03-11 23:55:43 -07:00
Ariel Frischer 8d2d273c6b refactor(tests): move token limit tests from test_agent_utils.py to test_anthropic_token_limiter.py for better organization and clarity 2025-03-11 23:53:37 -07:00
Ariel Frischer e42f281f94 chore(anthropic_message_utils.py): remove unused fix_anthropic_message_content function to clean up codebase
chore(anthropic_token_limiter.py): remove import of fix_anthropic_message_content as it is no longer needed
test: add unit tests for has_tool_use and is_tool_pair functions to ensure correct functionality
test: enhance test coverage for anthropic_trim_messages with tool use scenarios to validate message handling
2025-03-11 23:48:08 -07:00
Ariel Frischer 376d486db8 refactor(anthropic_message_utils.py): clean up whitespace and improve code readability by removing unnecessary blank lines and aligning code formatting
fix(anthropic_message_utils.py): add warning in docstring for anthropic_trim_messages function to indicate incomplete implementation and clarify behavior
fix(anthropic_message_utils.py): ensure consistent formatting in conditional statements and improve readability of logical checks
2025-03-11 23:38:31 -07:00
Ariel Frischer a3284c9d7e feat(anthropic_token_limiter.py): add dataclass import for future use and improve code readability by restructuring import statements 2025-03-11 23:37:20 -07:00
Ariel Frischer ee73c85b02 feat(anthropic_message_utils.py): add utilities for handling Anthropic-specific message formats and trimming to improve message processing
fix(agent_utils.py): remove debug print statement for max_input_tokens to clean up code
refactor(anthropic_token_limiter.py): update state_modifier to use anthropic_trim_messages for better token management and maintain message structure
2025-03-11 23:24:57 -07:00
Ariel Frischer 09ba1ee0b9 refactor(anthropic_token_limiter.py): rename messages_to_dict to message_to_dict for consistency and clarity
feat(anthropic_token_limiter.py): add convert_message_to_litellm_format function to standardize message format for litellm
fix(anthropic_token_limiter.py): update wrapped_token_counter to handle only BaseMessage objects and improve token counting logic
chore(anthropic_token_limiter.py): add debug print statements to track token counts before and after trimming messages
2025-03-11 21:26:57 -07:00
AI Christianson c8fbd942ac session model 2025-03-11 20:11:14 -04:00
Ariel Frischer 5c9a1e81d2 feat(main.py): refactor imports for better organization and readability
feat(main.py): add DEFAULT_MODEL constant to centralize model configuration
feat(main.py): enhance logging and error handling for better debugging
feat(main.py): implement state_modifier for managing token limits in agent state
feat(anthropic_token_limiter.py): create utilities for handling token limits with Anthropic models
feat(output.py): add print_messages_compact function for debugging message output
test(anthropic_token_limiter.py): add unit tests for token limit utilities and state management
2025-03-11 14:03:18 -07:00
AI Christianson 376fe18b83 activity panel 2025-03-11 14:55:43 -04:00
AI Christianson 89ee1d96ef vsc icon 2025-03-11 14:15:37 -04:00
AI Christianson 750c0d893b vscode extension 2025-03-11 13:32:46 -04:00
AI Christianson 37764c7d56 fix tests 2025-03-11 11:25:27 -04:00
AI Christianson ae9cf5021b record trajectory at all steps 2025-03-11 11:01:05 -04:00
AI Christianson 5d899d3d13 trajectory 2025-03-11 08:56:12 -04:00
AI Christianson d0985b6b84 store trajectory for tasks 2025-03-11 08:41:59 -04:00
AI Christianson 7038a61693 mock repos for test 2025-03-11 08:41:51 -04:00
AI Christianson 96093e8dfc trajectory for stage transitions 2025-03-11 08:34:08 -04:00
Andrew I. Christianson b4b0fdd686
Merge pull request #120 from ariel-frischer/cost-display
Add Cost Display for Default ReAct Agent
2025-03-10 20:12:01 -04:00
Ariel Frischer 4aa1b0ba93 refactor(agent_utils.py): remove unused run_research_agent and run_web_research_agent functions to clean up code and improve maintainability
refactor(agent_utils.py): import run_research_agent and run_web_research_agent from their respective modules to streamline the code structure and enhance clarity
2025-03-10 17:09:05 -07:00
Ariel Frischer c4b2d2bb51 fix(agent_utils.py): remove merge conflict markers and clean up imports to ensure code integrity
refactor(agent_utils.py): consolidate research agent imports for better organization and readability
2025-03-10 17:07:24 -07:00
Ariel Frischer 89e4556e7b feat: implement trajectory model and repository for tracking agent actions
This commit introduces a new `Trajectory` model to the database, which tracks the sequence of actions taken by agents, including tool executions and their results. The addition of the `TrajectoryRepository` allows for storing and retrieving these trajectories, enabling better analysis of agent behavior and debugging of issues.

Additionally, the commit refactors existing code to utilize the new repository and model, improving the overall architecture and maintainability of the codebase. This change is essential for enhancing the capabilities of the agent system and providing a more robust framework for future development.
2025-03-10 17:05:34 -07:00
Ariel Frischer 4d4eb6cadb fix(tests): add cost_cb parameter to fake_print_agent_output function to enhance flexibility in testing
style(tests): add newline at the end of test_handle_api_error_resource_exhausted function for consistency with PEP 8 guidelines
2025-03-10 17:03:42 -07:00
Ariel Frischer 8f2adc7f61 fix(output.py): update subtitle text from "Total Cost" to "Cost" for clarity in cost information display 2025-03-10 17:01:00 -07:00
Ariel Frischer f43c5e72b6 feat(output.py): add get_cost_subtitle function to generate cost subtitles for agent output
refactor(output.py): simplify subtitle generation in print_agent_output function by using get_cost_subtitle
2025-03-10 16:58:39 -07:00
Ariel Frischer 416689b030 feat(agent_utils.py): pass callback to print_agent_output to track costs and tokens
feat(output.py): enhance print_agent_output to display cost and token information in the output panel
2025-03-10 16:51:42 -07:00
AI Christianson 909825bf1b refactor: extract get_most_recent_id 2025-03-10 19:37:39 -04:00
AI Christianson b3010bb649 add error info to trajectory records 2025-03-10 19:12:14 -04:00
AI Christianson 78983ec20b add trajectory table 2025-03-10 18:59:42 -04:00
AI Christianson a18998be0d add project info to reasoning assist prompts 2025-03-10 18:01:56 -04:00
AI Christianson 3db7cc2ca9 improve prompt 2025-03-10 17:47:31 -04:00
AI Christianson b5e4c64042 improve prompts; make list_directory more resilient 2025-03-10 16:41:09 -04:00
AI Christianson 7d579f5557 improve prompts 2025-03-10 15:37:38 -04:00
AI Christianson e81421a95a improve prompts 2025-03-10 15:30:22 -04:00
AI Christianson c98c107ce3 use expert model for reasoning assisted mode 2025-03-10 14:58:47 -04:00
AI Christianson 51fa86b5c4 refactor: extract run_task_implementation_agent 2025-03-10 14:44:34 -04:00
AI Christianson d8dcc8ca86 refactor: extract run_planning_agent 2025-03-10 14:19:06 -04:00
AI Christianson a437a1e8c3 prompt improvements 2025-03-10 13:46:08 -04:00
AI Christianson 4f2c36b958 refactor: extract research agent 2025-03-10 13:33:00 -04:00
Ariel Frischer 2899b5f848
feat(agent_utils.py): add AnthropicCallbackHandler to track token usage and costs for Anthropic models (#118)
style(agent_utils.py): format imports and code for better readability
refactor(agent_utils.py): standardize model name and cost calculation logic for clarity and maintainability
chore(anthropic_callback_handler.py): create a new file for the AnthropicCallbackHandler implementation and related functions
2025-03-10 07:08:12 -04:00
Ariel Frischer ddd0e2ae2d feat(agent_utils.py): add AnthropicCallbackHandler to track token usage and costs for Anthropic models
style(agent_utils.py): format imports and code for better readability
refactor(agent_utils.py): standardize model name and cost calculation logic for clarity and maintainability
chore(anthropic_callback_handler.py): create a new file for the AnthropicCallbackHandler implementation and related functions
2025-03-10 01:18:44 -07:00
AI Christianson d194868cff fix binary detection 2025-03-08 22:36:06 -05:00
Ariel Frischer 053908448f
fix(env_inv.py): handle None values in sorting of installations to prevent errors (#117) 2025-03-08 21:03:06 -05:00
AI Christianson d0bf78c5f0 support reasoning assistance in research phase. 2025-03-08 19:32:05 -05:00
AI Christianson 0a143e8fff improve prompts 2025-03-08 17:08:10 -05:00
AI Christianson eaf79fbee5 fix tests; improve prompts 2025-03-08 16:29:17 -05:00
AI Christianson fd772ee369 disable reasoning assistance by default 2025-03-08 15:36:21 -05:00
AI Christianson 35f91aa128 add flags to force enable/disable reasoning assistance 2025-03-08 15:36:00 -05:00
AI Christianson ff653c7208 reasoning assistance for implementation tasks 2025-03-08 15:12:13 -05:00
AI Christianson cfb0ec148f extract thinking processing 2025-03-08 14:48:46 -05:00
AI Christianson 8f1e072e20 improve reasoning assistance 2025-03-08 14:23:35 -05:00
AI Christianson 2130334837 improve reasoning assistance prompt 2025-03-08 13:50:10 -05:00
AI Christianson d7fb269f4d improve reasoning assistance prompt 2025-03-08 13:37:38 -05:00
AI Christianson e64c4066a6 implement reasoning-guided workflows 2025-03-08 13:35:06 -05:00
AI Christianson c323098aec include environment information in prompts 2025-03-08 12:01:40 -05:00
AI Christianson f1a33fc1c0 add environment inventory 2025-03-08 10:58:23 -05:00
AI Christianson b9241780d0 fix test 2025-03-08 09:30:52 -05:00
AI Christianson b262305592 thinking model docs 2025-03-08 09:05:59 -05:00
AI Christianson eff01b62aa improve prompts 2025-03-08 09:05:54 -05:00
AI Christianson c1b84cd645 tokens for qwq 2025-03-08 08:56:16 -05:00
AI Christianson b4d7cd30ce changelog 2025-03-08 08:32:17 -05:00
AI Christianson 96dbd1c4e7 add --show-thoughts flag 2025-03-08 08:31:45 -05:00
AI Christianson 4d2b10c80c fix tests 2025-03-08 08:16:21 -05:00
AI Christianson ffc340a82f changelog 2025-03-08 08:10:17 -05:00
AI Christianson 4a63946df5 upgrade langchain/langgraph deps 2025-03-08 07:57:50 -05:00
AI Christianson e49cce301f support think tag on expert 2025-03-07 21:37:34 -05:00
AI Christianson cf150173aa support think tag 2025-03-07 20:29:37 -05:00
AI Christianson 66287baf0e qwq 2025-03-07 19:56:40 -05:00
AI Christianson e08a8feabc fix tests 2025-03-07 19:21:44 -05:00
AI Christianson 1643518b50 version bump 2025-03-07 18:57:19 -05:00
AI Christianson 58c0739cfc fix tests 2025-03-07 18:47:12 -05:00
AI Christianson 60e4616313 fix agent context 2025-03-07 18:33:45 -05:00
AI Christianson 3607803bf5 use interrupt for tighter control of agent loop 2025-03-07 17:31:27 -05:00
AI Christianson 638776c8f8 fix test 2025-03-07 14:28:14 -05:00
AI Christianson 6e39d39b42 version bump 2025-03-07 14:14:34 -05:00
AI Christianson faf9821c84 update docs for memory management 2025-03-07 14:05:29 -05:00
AI Christianson 089bd9b368 add --wipe-project-memory flag 2025-03-07 12:06:40 -05:00
AI Christianson 95f9d8c2c4 clean up docs 2025-03-07 11:41:22 -05:00
AI Christianson 9e9c3ad3d2 should exit propagation 2025-03-07 11:25:46 -05:00
AI Christianson 77856bfa0c set agent_should_exit in gc agents 2025-03-07 10:35:02 -05:00
AI Christianson 53406f1ddf include memory in status panel 2025-03-07 09:45:38 -05:00
AI Christianson 85a461e048 fix web research 2025-03-07 09:16:39 -05:00
AI Christianson f0e098cd82 fix tests 2025-03-07 09:02:32 -05:00
AI Christianson 97716a941a fix tests 2025-03-07 08:51:35 -05:00
AI Christianson 756b7bf85a fix tests 2025-03-07 08:35:44 -05:00
AI Christianson 4ea13c6675 get rid of vercel 2025-03-07 08:31:50 -05:00
AI Christianson c637807e08 handle sonnet thinking tokens in expert tool 2025-03-06 10:30:58 -05:00
AI Christianson 254a9f4d13 version check 2025-03-05 14:46:39 -05:00
AI Christianson 07a5900b59 version 2025-03-05 07:43:18 -05:00
AI Christianson 0b621b6008 allow multiple string replacements 2025-03-04 21:34:29 -05:00
AI Christianson c9f3f37ca3 get rid of global memory 2025-03-04 21:25:37 -05:00
AI Christianson 5bd8c76a22 config repository 2025-03-04 21:01:08 -05:00
AI Christianson 3e68dd3fa6 add fixed_string param to ripgrep tool 2025-03-04 19:26:11 -05:00
AI Christianson 60a6707107 track agent depth via context 2025-03-04 19:05:33 -05:00
AI Christianson a1b268fdf4 get rid of global memory work log refs 2025-03-04 18:30:52 -05:00
AI Christianson d907a0ea9c key snippets 2025-03-04 17:49:17 -05:00
AI Christianson 47cb6b65ef fix duplicate implementation 2025-03-04 15:14:17 -05:00
AI Christianson 600bf355d9 use repo pattern 2025-03-04 14:59:45 -05:00
AI Christianson 0afed55809 get rid of dead code around implementation_requested 2025-03-04 13:10:52 -05:00
AI Christianson 7845f4d876 remove dead code 2025-03-04 12:46:14 -05:00
AI Christianson e9c6aa7b4f prompt improvements 2025-03-04 09:51:02 -05:00
AI Christianson bf96ddec45 fix tests 2025-03-04 09:33:00 -05:00
AI Christianson a0775e3792 ciayn fixes 2025-03-04 09:20:46 -05:00
AI Christianson fb030e9049 disallow repeat tool calls 2025-03-04 08:33:22 -05:00
AI Christianson 5dfb41b000 ignore .ra-aid in rg by default 2025-03-04 08:02:22 -05:00
AI Christianson 3d5b5850b4 multiple tool results in ciayn 2025-03-04 07:59:05 -05:00
AI Christianson bee7416bf2 ciayn fixes 2025-03-04 07:44:50 -05:00
AI Christianson 535c870568 fix validation 2025-03-04 01:48:12 -05:00
AI Christianson 13729f16ce AST-based parsing and validation of tool calls 2025-03-04 01:32:59 -05:00
AI Christianson 4859a4cdc5 fixes 2025-03-04 00:57:15 -05:00
AI Christianson 9cae0ef1fc project file and ciayn improvements 2025-03-04 00:49:48 -05:00
AI Christianson bd02bffc55 ciayn fixes 2025-03-03 23:50:55 -05:00
AI Christianson e45cd78c7f better ciayn status 2025-03-03 23:40:15 -05:00
AI Christianson 039aa8f22a ciayn improvements 2025-03-03 23:07:58 -05:00
AI Christianson 035544c77a research notes repo 2025-03-03 22:31:51 -05:00
AI Christianson 6562b6c332 fix binary file detection 2025-03-03 18:43:49 -05:00
AI Christianson 5202d2e7f3 use context vars for human input repo 2025-03-03 17:58:55 -05:00
AI Christianson fc58aa0b77 key snippets context var 2025-03-03 17:27:41 -05:00
AI Christianson ffd1ef15d4 adjust gc thresholds 2025-03-03 17:00:08 -05:00
AI Christianson 36e4004db0 use context vars for key facts repo 2025-03-03 16:58:03 -05:00
AI Christianson dd9af78693 eradicate dead coad 2025-03-03 08:06:12 -05:00
AI Christianson bc9d11e6e2 remove refs to global memory key snippets (dead code/obsolete) 2025-03-03 07:54:37 -05:00
AI Christianson 539af1d537 get rid of key snippet global memory refs 2025-03-02 22:00:40 -05:00
AI Christianson bd05dee716 include key facts/snippets in chat mode 2025-03-02 21:29:18 -05:00
AI Christianson 1c95080897 cleanup 2025-03-02 20:56:16 -05:00
AI Christianson 80e8d9134b include last human input in research prompt 2025-03-02 20:54:39 -05:00
AI Christianson 9a69bb173e do not gc key facts/snippets associated with current human input 2025-03-02 20:27:52 -05:00
AI Christianson f88ad5bc7a associate key facts and snippets with latest human input 2025-03-02 20:18:00 -05:00
AI Christianson 186904c0ca added human input table 2025-03-02 20:06:04 -05:00
AI Christianson d4353b1824 localize delete_key_snippets with gc agent 2025-03-02 19:56:42 -05:00
AI Christianson 332cbec826 key snippet gc 2025-03-02 19:41:48 -05:00
AI Christianson 772ce3e049 only access snippets via repository 2025-03-02 19:33:03 -05:00
AI Christianson cb3504016f fix tests 2025-03-02 19:18:45 -05:00
AI Christianson 038e7b886c key snippets db 2025-03-02 19:06:51 -05:00
AI Christianson be2eb298a5 improve prompts 2025-03-02 16:31:33 -05:00
AI Christianson 073c68d010 cleanup 2025-03-02 16:30:22 -05:00
AI Christianson 746649a1bb cleanup 2025-03-02 16:20:36 -05:00
AI Christianson 935a013a4c key facts repository 2025-03-02 16:00:55 -05:00
AI Christianson 8819f463a1 fix output 2025-03-02 15:28:32 -05:00
AI Christianson 714d55e50a fix tests/ra_aid/tools/test_memory.py::test_emit_key_facts_triggers_cleaner 2025-03-02 15:27:46 -05:00
AI Christianson 7ec6535eef gc fixups 2025-03-02 15:18:16 -05:00
AI Christianson 2418506d7e gc status panels 2025-03-02 15:04:25 -05:00
AI Christianson d41416b4d7 run gc in db ctx 2025-03-02 14:52:11 -05:00
AI Christianson 1855cc3252 cleaner -> gc 2025-03-02 14:44:39 -05:00
AI Christianson 14c9bdfdc7 key facts gc 2025-03-02 14:37:42 -05:00
AI Christianson 17ab6d2a50 refactor: agents/ -> agent_backends/ 2025-03-02 14:16:15 -05:00
AI Christianson 5736144d89 remove old prompts.py 2025-03-02 13:52:45 -05:00
AI Christianson fd1025f74c refactor prompts 2025-03-02 13:47:39 -05:00
AI Christianson c3504ee5e5 update docs to reflect standalone mode 2025-03-02 13:08:53 -05:00
AI Christianson cd29014282 collect verbose logs in files by default 2025-03-02 12:54:00 -05:00
AI Christianson c3f32d640d logging docs 2025-03-02 12:44:40 -05:00
AI Christianson 09bd7cbf4b add log mode and log level, support for logging to files in .ra-aid/logs/ 2025-03-02 12:18:27 -05:00
AI Christianson f89d40527d log to file 2025-03-01 22:50:54 -05:00
AI Christianson 23d5e267f4 key fact db 2025-03-01 22:41:35 -05:00
AI Christianson 50d618c8f8 improve prompts 2025-03-01 21:05:18 -05:00
Ariel Frischer e960a68d29
Binary Skipped ascii filetype fix (#108)
* chore: refactor code for improved readability and maintainability

- Standardize variable naming conventions for consistency.
- Improve logging messages for better clarity and debugging.
- Remove unnecessary imports and clean up code structure.
- Enhance error handling and logging in various modules.
- Update comments and docstrings for better understanding.
- Optimize imports and organize them logically.
- Ensure consistent formatting across files for better readability.
- Refactor functions to reduce complexity and improve performance.
- Add missing type hints and annotations for better code clarity.
- Improve test coverage and organization in test files.

style(tests): apply consistent formatting and spacing in test files for improved readability and maintainability

* chore(tests): remove redundant test for ensure_tables_created with no models to streamline test suite and reduce maintenance overhead

* fix(memory.py): update is_binary_file function to correctly identify binary files by returning True for non-text mime types
2025-02-28 06:47:35 -05:00
AI Christianson 429f854fb8 catch more rate limit errors 2025-02-27 22:42:06 -05:00
AI Christianson 99bbcdbc2f update docs on google gemini 2025-02-27 20:52:03 -05:00
AI Christianson 9924c70471 version bump 2025-02-27 11:45:45 -05:00
AI Christianson 346e22b5cb improve agent crash detection 2025-02-27 11:41:36 -05:00
AI Christianson 9202cf0d6d improve agent_should_exit logic 2025-02-27 10:46:57 -05:00
AI Christianson 9403b8c57f improve agent context inheritance 2025-02-27 10:31:55 -05:00
AI Christianson 6c85a39bbb added agent_should_exit context 2025-02-27 10:14:17 -05:00
AI Christianson 6d2b0a148d support context for ripgrep 2025-02-27 10:04:59 -05:00
AI Christianson a8030104fc version bump 2025-02-27 09:43:22 -05:00
AI Christianson d11393c898 improve chat prompt 2025-02-27 09:42:32 -05:00
AI Christianson fbc4e05d4e version bump 2025-02-27 09:25:06 -05:00
AI Christianson a791e9f2d9 improve prompts 2025-02-27 09:19:31 -05:00
AI Christianson 79ca08137c improve prompts 2025-02-27 09:15:32 -05:00
AI Christianson d6bcf44700 turn request_task_implementation return val into a string and add prompt to fix duplicated work. 2025-02-27 09:06:43 -05:00
AI Christianson 8760e6e152 turn request_implementation return val into a string and add prompt to fix duplicated work. 2025-02-27 08:52:54 -05:00
AI Christianson 1ce52774d7 fix langgraph prebuilt dep; remove modification tools from research phase 2025-02-27 08:36:16 -05:00
AI Christianson c89a92e4f0 prompts + remove oneshot in research 2025-02-26 22:09:04 -05:00
AI Christianson c83815c836 fix new project detection 2025-02-26 21:19:08 -05:00
AI Christianson 9f6089d0d7 improve prompts 2025-02-26 20:50:48 -05:00
AI Christianson 4cfb377bb1 improve prompts 2025-02-26 20:29:18 -05:00
AI Christianson 6b7d2374ee disable related if aider disabled 2025-02-26 20:27:03 -05:00
AI Christianson 65b8619517 aider-free mode 2025-02-26 20:15:00 -05:00
AI Christianson 4aeb52e41d enable file editing tools 2025-02-26 20:01:00 -05:00
AI Christianson 28d9032ca5 agent context 2025-02-26 19:30:08 -05:00
AI Christianson 724dbd4fda db migrations 2025-02-26 16:21:38 -05:00
AI Christianson e6d98737a8 fix logging 2025-02-26 15:25:43 -05:00
AI Christianson dbf4d954e1 base db infra 2025-02-26 11:44:18 -05:00
AI Christianson f05d30ff50 add db deps 2025-02-25 21:35:07 -05:00
AI Christianson 012d95cf00 version bump 2025-02-25 19:03:22 -05:00
AI Christianson 840abf96f7 fix tests 2025-02-25 18:38:00 -05:00
AI Christianson 9c76745bcc improve binary file filtering 2025-02-25 18:34:28 -05:00
AI Christianson 94d655ce91 skip binary files; update deps 2025-02-25 18:32:29 -05:00
AI Christianson 8d1e4a96bd improve prompts 2025-02-25 17:41:17 -05:00
AI Christianson f5de1e55b4 update deps 2025-02-25 17:41:08 -05:00
AI Christianson 0199f450ee version bump 2025-02-25 17:14:29 -05:00
AI Christianson 3f2a706ff6 improve prompts 2025-02-25 17:13:17 -05:00
AI Christianson 78793bb786 media query logo 2025-02-25 15:59:24 -05:00
AI Christianson 8c8ae5384d version bump 2025-02-25 15:34:03 -05:00
AI Christianson d3b4d9b8d9 fix capture bug 2025-02-25 15:13:33 -05:00
AI Christianson 7ae4c61af6 fix interactive capture; fix prompts 2025-02-25 14:59:13 -05:00
AI Christianson eede183110 fix junk in command capture 2025-02-25 14:46:53 -05:00
AI Christianson 2e13b2bf4d remove file 2025-02-25 14:16:50 -05:00
AI Christianson 804ebd76a5 fix windows 2025-02-25 14:15:28 -05:00
AI Christianson f14863a06d improve interactive history capture 2025-02-25 14:02:43 -05:00
AI Christianson a866b38883 fix linux interactive commands 2025-02-25 13:42:00 -05:00
AI Christianson ea44e5dd6a linux fixes 2025-02-25 13:41:55 -05:00
Mark Varkevisser d163a74c47
Add Windows compatibility improvements (#105)
* Add Windows compatibility improvements

1. Add error handling for Windows-specific modules
2. Update README with Windows installation instructions
3. Add Windows-specific tests
4. Improve cross-platform support in interactive.py

* Fix: Add missing subprocess import in Windows compatibility tests

* Improve Windows compatibility:

1. Add detailed error handling for Windows I/O operations
2. Enhance timeout messages with more descriptive information
3. Add comprehensive comments explaining Windows-specific code

* Fix WebUI: Improve message display, add syntax highlighting, animations, and fix WebSocket communication
2025-02-25 13:41:29 -05:00
AI Christianson 2f132bdeb5 version bump 2025-02-25 11:14:52 -05:00
AI Christianson 495ed838ea upgrade aider; optimize prompts 2025-02-25 11:12:12 -05:00
AI Christianson d8f1618b2b prompt improvements 2025-02-25 08:59:55 -05:00
AI Christianson 860eb484c7 prompt improvements 2025-02-25 08:54:29 -05:00
AI Christianson ac9aeece2a prompt improvements 2025-02-24 20:05:50 -05:00
AI Christianson 7b4359eb28 version bump 2025-02-24 19:57:22 -05:00
AI Christianson c37e5b0ac1 optimize prompts 2025-02-24 19:56:47 -05:00
AI Christianson 47d548180a version bump 2025-02-24 19:15:18 -05:00
AI Christianson 52722f6600 use latest aider; update tool calling prompts and minimize return values to improve tool calling performance 2025-02-24 19:08:12 -05:00
AI Christianson cc93961bf3 version bump 2025-02-24 15:49:47 -05:00
AI Christianson b600bd8d48 show version at startup 2025-02-24 15:45:56 -05:00
AI Christianson 6591400ad6 fix anthropic key error msg 2025-02-24 15:35:45 -05:00
AI Christianson 7f85e93431 sonnet 3.7 2025-02-24 14:44:40 -05:00
AI Christianson 04913bdaf3 fix bug where model selection on anthropic was always using default 2025-02-24 14:35:09 -05:00
AI Christianson 2c18655fb7 bump langgraph/langchain versions 2025-02-24 13:33:25 -05:00
dancompton e5593305d3
fix: f-string unmatched [ (#104) 2025-02-20 19:46:26 -05:00
AI Christianson ba1c0f7b38 fix tests 2025-02-19 20:06:41 -05:00
AI Christianson 5d262206ec version bump 2025-02-19 20:01:49 -05:00
AI Christianson f9c83d496c Reapply "add app headers for openrouter"
This reverts commit 56ccd938f7.
2025-02-19 19:33:34 -05:00
user 56ccd938f7 Revert "add app headers for openrouter"
This reverts commit 0eb2176ee5.
2025-02-19 19:25:41 -05:00
AI Christianson 0eb2176ee5 add app headers for openrouter 2025-02-19 19:22:18 -05:00
Ariel Frischer 396d7033fa
Show fallback models in config panel (#103)
* feat(readme): update experimental fallback handler description for clarity and add recommendation for OPENAI_API_KEY
feat(main.py): refactor status display logic into a separate build_status function for better readability and maintainability
feat(fallback_handler.py): add debug logging for fallback handler model selection process
chore(todo.md): create a new TODO file to track future improvements and tasks

* chore(todo.md): remove outdated TODO list file to clean up the repository

* feat(main.py): add wrench emoji to FallbackHandler status message for better visibility
2025-02-18 23:15:18 -05:00
AI Christianson ca49e509a8 use create_react_agent for sonnet via openrouter 2025-02-18 22:09:06 -05:00
Ariel Frischer 2cde1f0392
fix(dependencies): update langgraph and aider-chat versions for compatibility and improvements (#98)
feat(dependencies): specify minimum version for litellm to ensure required features are available
2025-02-18 18:14:34 -05:00
AI Christianson ba92f49a91 fix bug where we sent reasoning_effort to models that do not support it. fixes #91 2025-02-17 19:08:06 -05:00
AI Christianson 8a2f0efb99 get rid of debug print 2025-02-17 18:54:30 -05:00
Ariel Frischer 9b0027a922
Merge pull request #90 from ariel-frischer/fallback-tools
Experimental Tool Fallback Handler
2025-02-17 15:39:49 -08:00
Ariel Frischer 5a4710b3be feat(tests): add --test-cmd-timeout argument to README and implement timeout for test command execution
fix(config): define DEFAULT_TEST_CMD_TIMEOUT for consistent test command timeout handling
fix(main.py): remove unused AgentInterrupt import and update test command timeout handling
fix(programmer.py): adjust interactive command execution to use model-specific latency
fix(handle_user_defined_test_cmd_execution.py): update timeout handling for test command execution
test(tests): update tests to verify timeout behavior for test command execution
2025-02-17 15:38:20 -08:00
Ariel Frischer e6ba8f5dff
Merge pull request #95 from ariel-frischer/test-cmd-args
feat: add `--test-cmd-timeout` option to specify timeout for test command
2025-02-17 15:25:09 -08:00
AI Christianson 7c3c616531 use base latency in programmer tool 2025-02-17 18:21:49 -05:00
Ariel Frischer becf8a1fd6 feat(dependabot): add dependabot configuration for daily updates of Python packages
docs(README.md): enhance documentation with installation, configuration, and usage guides
docs(contributing.md): create a contributing guide to encourage community involvement
docs(getting-help.md): add a section for reporting issues and community support
docs(quickstart): reorganize and enhance quickstart documentation for better clarity
style(docusaurus.config.ts): update footer copyright and GitHub link for accuracy
fix(models_params.py): add default base latency parameter for model configurations
feat(usage): add usage examples for creating games and modern web apps with RA.Aid
chore(remove): delete outdated quickstart and tutorial files to streamline documentation
2025-02-17 15:20:54 -08:00
Ariel Frischer 685d098f21 feat(docusaurus): add Vercel analytics plugin to enhance performance tracking
feat(models_params.py): add DEFAULT_BASE_LATENCY constant and integrate it into model parameters for latency management
fix(package.json): add @docusaurus/plugin-vercel-analytics dependency to support new analytics feature
2025-02-17 15:19:01 -08:00
AI Christianson e8e4dac038 add base latency model param 2025-02-17 18:11:33 -05:00
AI Christianson 13aa77a389 add vercel analytics to docs 2025-02-17 14:22:50 -05:00
Ariel Frischer 581dc4b761 feat: add `--test-cmd-timeout` option to specify timeout for test command execution
This change introduces a new command-line option `--test-cmd-timeout` to allow users to set a timeout for the execution of test commands. The default timeout is set to 300 seconds. This enhancement provides users with more control over the execution time of their test commands, helping to prevent indefinite hangs during testing.

Additionally, the codebase has been updated to utilize this new timeout setting in relevant areas, ensuring consistent behavior across the application.
2025-02-17 11:03:19 -08:00
Ariel Frischer 9ff09b9b93 refactor(shell.py): rename expected_runtime_seconds parameter to timeout for clarity and consistency in function signature 2025-02-17 10:45:49 -08:00
Ariel Frischer e9d578c2dc
chore(dependabot): add dependabot configuration for daily pip updates to automate dependency management (#94) 2025-02-15 06:57:31 -05:00
AI Christianson 7624d3c006 update README 2025-02-14 19:08:17 -05:00
AI Christianson 16760d513b update README with links to docs 2025-02-14 19:03:59 -05:00
AI Christianson 28beca458a favicon 2025-02-14 18:03:56 -05:00
AI Christianson 237e227b2a open models docs 2025-02-14 17:51:21 -05:00
Ariel Frischer 81354df48b fix(ciayn_agent.py): correct spelling of "execute" in error message for clarity
refactor(ciayn_agent.py): improve error handling by chaining exceptions for better debugging
docs(output.py): update docstring to include agent_type parameter for clarity on agent behavior
2025-02-14 14:45:33 -08:00
Ariel Frischer 4a2a0b691c chore(llm.py): remove unused import of BaseMessage to clean up code and improve readability 2025-02-14 14:42:56 -08:00
AI Christianson fc90bc740d open models docs 2025-02-14 17:42:50 -05:00
Ariel Frischer 119afd8600 refactor(tool_configs.py): remove unused get_all_tools_simple function to clean up code and improve maintainability 2025-02-14 14:41:42 -08:00
Ariel Frischer 7c828053d3 chore(main.py): remove deprecated fallback tool arguments to simplify configuration and reduce complexity 2025-02-14 14:40:46 -08:00
AI Christianson e9fe7e363a fix gh link in docs 2025-02-14 17:33:58 -05:00
AI Christianson 4866ca9995 fix docs order 2025-02-14 17:31:59 -05:00
AI Christianson 3f6c156261 fix docs 2025-02-14 17:30:11 -05:00
AI Christianson 193d4c6955 docs cleanup 2025-02-14 17:25:18 -05:00
AI Christianson feecfea3b8 initial open models docs. 2025-02-14 17:22:26 -05:00
Ariel Frischer 69281c31db chore(llm.py): remove unused merge_chat_history function to clean up codebase
chore(test_fallback_handler.py): remove references to the removed merge_chat_history function in tests to maintain consistency
2025-02-14 14:20:11 -08:00
AI Christianson cc16aa81da docs 2025-02-14 17:16:37 -05:00
Ariel Frischer f65918cfd3 refactor(ciayn_agent.py): remove unused variables tool_failure_current_provider and tool_failure_current_model to clean up the code and improve readability 2025-02-14 14:11:33 -08:00
Ariel Frischer 9f78e7d36c chore(issue.md): remove outdated issue documentation for LLM Tool Call Fallback Feature as it is no longer relevant 2025-02-14 14:07:51 -08:00
AI Christianson 81198f91e8 usage guides 2025-02-14 17:04:43 -05:00
Ariel Frischer 56ddd967c0 fix(imports): remove redundant import of models_params in __main__.py for cleaner code
style(fallback_handler.py): format error message for better readability
style(test_llm.py): format exception assertion for better readability
2025-02-14 13:54:36 -08:00
Ariel Frischer 27400d6225 feat(ciayn_agent.py): add fallback_fixed_msg to inform users about fallback tool handling
fix(ciayn_agent.py): ensure error message is logged in chat history when fallback response is empty
2025-02-14 13:54:06 -08:00
AI Christianson 1681234ab9 modern web app examples 2025-02-14 16:52:47 -05:00
Ariel Frischer f3a5ce6d8e chore(ciayn_agent.py): remove debug logging for extracted tool call to clean up logs and reduce verbosity 2025-02-14 13:50:43 -08:00
Ariel Frischer 0df5d43333 feat(main.py): import models_params and set default temperature for models that support it to improve user experience
fix(ciayn_agent.py): update fallback tool error messages to use FallbackToolExecutionError for better error handling
fix(config.py): remove unnecessary blank line to maintain code style consistency
fix(fallback_handler.py): raise FallbackToolExecutionError for better error clarity when tools are not found
fix(llm.py): set default temperature to 0.7 and notify user when not provided for models that support it
test(test_llm.py): update tests to check for default temperature behavior and improve error messages for unsupported providers
2025-02-14 13:50:32 -08:00
AI Christianson 3bd0e0e716 added create a modern web app usage example placeholder 2025-02-14 16:45:57 -05:00
AI Christianson 7e3f2e1260 docs cleanup 2025-02-14 16:39:20 -05:00
AI Christianson d399c34640 docs cleanup 2025-02-14 16:39:15 -05:00
AI Christianson 3136e100fe docs cleanup 2025-02-14 16:29:59 -05:00
AI Christianson 1060117871 docs/intro 2025-02-14 16:28:57 -05:00
AI Christianson b8021519a6 installation docs 2025-02-14 16:22:26 -05:00
AI Christianson dbf3d83523 installation docs 2025-02-14 16:20:02 -05:00
AI Christianson 35cd07c324 uv install 2025-02-14 16:14:37 -05:00
Ariel Frischer 6970a885e4 chore(docs): update documentation and assets for RA.Aid project using Docusaurus
- Add new versioned documentation for RA.Aid project.
- Include installation instructions, quick starts, and markdown features.
- Add configuration files for Docusaurus setup.
- Introduce new images and logos for branding.
- Create a sidebar for better navigation in documentation.
- Implement a .gitignore file for the docs directory to exclude unnecessary files.

feat(docs): add SVG illustrations for Docusaurus documentation to enhance visual appeal
feat(docs): create tsconfig.json for improved TypeScript support in Docusaurus
fix(pyproject.toml): update dependencies to latest versions for better compatibility and features
fix(__main__.py): improve expert provider selection logic based on available API keys
feat(llm.py): implement function to fetch available OpenAI models and select expert model
fix(file_listing.py): enhance file listing functionality to include hidden files option and improve error handling
fix(deepseek_chat.py): add timeout and max_retries parameters to ChatDeepseekReasoner initialization
fix(version.py): bump version to 0.14.1 for release readiness

feat(models_params.py): add default_temperature to model parameters for consistency and configurability
refactor(interactive.py): enhance run_interactive_command to support expected runtime and improve output capture
fix(prompts.py): update instructions to clarify file modification methods
refactor(provider_strategy.py): streamline expert model selection logic for clarity and maintainability
chore(tool_configs.py): update tool imports to reflect changes in write_file functionality
refactor(agent.py): enhance LLM initialization to include temperature and improve error handling
feat(memory.py): normalize file paths in emit_related_files to prevent duplicates
feat(programmer.py): add get_aider_executable function to retrieve the aider executable path
test: add comprehensive tests for new features and refactor existing tests for clarity and coverage
2025-02-14 13:11:10 -08:00
AI Christianson a805d1f0ad tabs 2025-02-14 16:10:41 -05:00
AI Christianson 7ef1cd8a67 clean up docs 2025-02-14 16:05:22 -05:00
Ariel Frischer d5e2e0a9a0 refactor(agent_utils.py, ciayn_agent.py): remove unused import cpm to clean up code and improve readability
style(tests): format code for better readability and consistency in test files
test(tests): update assertions and test cases for better clarity and maintainability
2025-02-14 13:04:41 -08:00
AI Christianson 0e8d26b4cd api key instructions 2025-02-14 15:55:50 -05:00
AI Christianson 183c06ce46 docs 2025-02-14 15:53:44 -05:00
AI Christianson 2287d7a97e docs 2025-02-14 15:22:51 -05:00
AI Christianson 08c00b2cf1 put installation on its own page 2025-02-14 15:20:57 -05:00
AI Christianson 80900188d5 recommended setup 2025-02-14 15:16:57 -05:00
AI Christianson 370401b1eb Recommended config 2025-02-14 15:03:27 -05:00
AI Christianson 719962ea19 create quickstarts dir 2025-02-14 14:58:16 -05:00
AI Christianson d33cfb23bd rename intro page 2025-02-14 14:51:16 -05:00
AI Christianson cfc9586f0f link logo to landing page 2025-02-14 14:49:26 -05:00
AI Christianson f46d4d9b62 Docs link 2025-02-14 13:57:15 -05:00
AI Christianson 0dbfebe245 get rid of logo text 2025-02-14 13:54:02 -05:00
AI Christianson 3a30495409 dark mode by default 2025-02-14 13:46:33 -05:00
AI Christianson 1d2a94572b logo 2025-02-14 13:43:43 -05:00
AI Christianson 767391a2e6 simplify docs 2025-02-14 13:12:59 -05:00
AI Christianson 23a7d5c739 remove blog from docs/ 2025-02-14 12:52:32 -05:00
AI Christianson f033b64dfa docusaurus initialization 2025-02-14 12:33:39 -05:00
Ariel Frischer 7a2c766824 test(agent_utils): add config parameter to mock_ciayn assertions for better clarity and flexibility in tests 2025-02-13 20:18:02 -08:00
Ariel Frischer 90b3070aa2 chore(agent_utils.py): remove debug print statement for config to clean up output
chore(fallback_handler.py): comment out cpm call for tool call result to reduce logging noise
2025-02-13 20:14:07 -08:00
Ariel Frischer efec91579a refactor(ciayn_agent.py): remove unnecessary raise statement and debug log to clean up code 2025-02-13 20:09:47 -08:00
Ariel Frischer 15ce534f8f feat(agent_utils.py): add debug print for config to assist in troubleshooting
feat(ciayn_agent.py): pass config to CiaynAgent for improved functionality
fix(ciayn_agent.py): handle tool execution errors more gracefully with msg_list
feat(fallback_handler.py): enhance handle_failure method to utilize msg_list for better context
feat(fallback_handler.py): implement init_msg_list to manage message history effectively
test(test_fallback_handler.py): add unit tests for init_msg_list to ensure correct behavior
2025-02-13 20:09:21 -08:00
Ariel Frischer 9caa46bc78 refactor(agent_utils.py): remove redundant agent_type parameter from _handle_fallback_response and run_agent_with_retry functions to simplify function signatures
feat(agent_utils.py): retrieve agent_type within _handle_fallback_response to maintain functionality while improving code clarity
2025-02-13 19:16:13 -08:00
Ariel Frischer 5733eb06f5 fix(test_fallback_handler.py): update lambda function to accept default argument for args to prevent potential errors during invocation 2025-02-13 19:14:06 -08:00
Ariel Frischer cc1945facd feat(agent_utils.py): change SystemMessage to HumanMessage for fallback responses in React to improve message clarity
fix(fallback_handler.py): update tool invocation logic to handle missing tools and raise appropriate exceptions for better error handling
test(tests): add comprehensive tests for fallback handler functionality, including loading models, extracting tool names, and invoking tools to ensure robustness and reliability
2025-02-13 18:48:45 -08:00
Ariel Frischer 09abba512d test(tests): add tests for fallback handler to ensure proper error handling and counter incrementing
feat(tests): introduce FallbackToolExecutionError to improve error specificity in fallback handling tests
2025-02-13 18:21:54 -08:00
Ariel Frischer 15a3291254 refactor(agent_utils.py): remove unnecessary debug log statement to clean up code
refactor(fallback_handler.py): improve error handling by raising a specific exception when all fallback models fail
test(fallback_handler.py): update tests to reflect changes in the fallback handler's error handling and initialization
fix(test_llm.py): update error messages in tests for unsupported providers to be more descriptive and accurate
2025-02-13 18:20:00 -08:00
Ariel Frischer ac13ce746a feat(agent_utils.py): add cpm function import for enhanced logging in run_agent_with_retry
fix(agent_utils.py): set default value of fallback_handler to None in run_agent_with_retry
chore(ciayn_agent.py): comment out debug log for generated code to reduce verbosity
fix(fallback_handler.py): change fallback_enabled config key to experimental_fallback_handler for better clarity
refactor(test_ciayn_agent.py): update invoke method in DummyModel to return AIMessage instead of a custom Response class
test(test_ciayn_agent.py): comment out test_retry_logic_with_failure_recovery for future implementation and focus on existing tests
2025-02-13 17:57:27 -08:00
Ariel Frischer c7712e0114 fix(tests): update type hints in test_agent_utils.py for better clarity and type safety
refactor(tests): modify DummyAgent's stream method to use more descriptive parameter names and types for improved readability
2025-02-13 17:10:26 -08:00
Ariel Frischer cd8d1c459d feat(readme): document new command line arguments for experimental features
feat(main.py): add --experimental-fallback-handler argument to enable fallback handler
fix(agent_utils.py): modify init_fallback_handler to check for experimental fallback handler flag
fix(config.py): increase DEFAULT_MAX_TOOL_FAILURES to allow more retries before failure
2025-02-13 17:01:46 -08:00
Ariel Frischer 2420dfbb4f refactor(agent_utils.py): extract fallback handler initialization into a separate function to improve code readability and maintainability
fix(ciayn_agent.py): reset fallback handler after executing tool to ensure proper state management
style(fallback_handler.py): format method signature for better readability
2025-02-13 16:53:22 -08:00
Ariel Frischer 63e48db9de feat(agent_utils.py): add _handle_fallback_response function to streamline fallback handling logic
refactor(agent_utils.py): extract fallback handling logic from run_agent_with_retry to improve code readability
fix(ciayn_agent.py): update stream method parameter name for consistency
chore(agents_alias.py): reorder import statements to follow best practices
style(fallback_handler.py): reorder exception imports for consistency and clarity
2025-02-13 16:47:31 -08:00
Ariel Frischer 115cde98b6 feat(agent_utils.py): add FallbackToolExecutionError exception to handle fallback tool execution failures
fix(ciayn_agent.py): improve error message template for tool call errors to provide clearer guidance
refactor(ciayn_agent.py): update comment for clarity regarding fallback tool invocation
fix(output.py): clarify that CiaynAgent handles tool execution errors internally
fix(fallback_handler.py): raise FallbackToolExecutionError for better error handling in fallback scenarios
2025-02-13 16:42:59 -08:00
Ariel Frischer e2cd51c66d feat(agent_utils.py): add SystemMessage import and improve logging messages for clarity
fix(agent_utils.py): handle fallback responses more effectively and ensure fallback handler is optional
refactor(ciayn_agent.py): streamline prompt building and extract tool call logic into a separate method
chore(ciayn_agent.py): remove commented-out code and improve fallback response handling
chore(exceptions.py): remove unused CiaynToolExecutionError class to clean up code
chore(fallback_handler.py): simplify fallback response handling logic
chore(logging_config.py): add debug print statement for logging handler usage
chore(prompts.py): update prompts for clarity and maintainability
2025-02-13 16:14:24 -08:00
AI Christianson 66aa13f6ee Version bump. 2025-02-13 09:50:00 -05:00
AI Christianson 93a3f8ccd7 remove reference to write_file_tool 2025-02-13 09:47:19 -05:00
AI Christianson 1084faaf0b normalize/dedupe files for programmer tool 2025-02-13 09:45:32 -05:00
AI Christianson 972ea5284a be more conservative with external process i/o to prevent hung situations 2025-02-13 09:00:29 -05:00
AI Christianson 09e30f2a24 validate expected_runtime_seconds 2025-02-13 08:37:43 -05:00
AI Christianson 098f4a9c53 integrate expected_runtime_seconds with run_shell_command 2025-02-13 08:34:38 -05:00
AI Christianson abfa5a1d6a add expected_runtime_seconds and shutdown processes w/ grace period that run too long. 2025-02-13 08:29:17 -05:00
AI Christianson c5c27c9f87 enforce byte limit in interactive commands 2025-02-13 08:03:16 -05:00
AI Christianson 7d5eb4ca80 relax aider version req. for compatibility with RA.Aid-swe-bench 2025-02-13 07:41:54 -05:00
Ariel Frischer 646d509c22 feat(agent_utils.py): add agent_type retrieval to enhance fallback handling logic
feat(ciayn_agent.py): implement chat_history in CiaynAgent for improved context management during tool execution
refactor(ciayn_agent.py): streamline fallback response handling and logging for better clarity and maintainability
2025-02-13 00:24:31 -08:00
AI Christianson e6b34e4ebc normalize related file paths 2025-02-12 22:12:55 -05:00
AI Christianson f91237ee02 update aider dep 2025-02-12 21:57:42 -05:00
AI Christianson 6e512166f4 upgrade langchain/langgraph deps 2025-02-12 21:54:45 -05:00
Jose M Leon 10ad8aa8d5
FIX aider flags (#89) 2025-02-12 21:46:14 -05:00
Ariel Frischer e508e4d1f2 feat(agent_utils.py): introduce get_agent_type function to determine agent type and improve code clarity
refactor(agent_utils.py): update _run_agent_stream to utilize agent type for output printing
fix(ciayn_agent.py): modify _execute_tool to handle BaseMessage and improve error reporting
feat(ciayn_agent.py): add extract_tool_name method to identify tool names from code
chore(agents_alias.py): create agents_alias module to avoid circular imports and define RAgents type
refactor(config.py): remove direct import of CiaynAgent and update RAgents definition
fix(output.py): update print_agent_output to accept agent type for better error handling
fix(exceptions.py): add CiaynToolExecutionError for distinguishing tool execution failures
refactor(fallback_handler.py): improve logging and error handling in fallback mechanism
2025-02-12 17:55:43 -08:00
Jose M Leon 9bd0edfd10
FEAT print config at the beginning (#88) 2025-02-12 18:52:24 -05:00
Ariel Frischer 96b41458a1 feat(agent_utils.py): refactor agent stream handling to improve clarity and maintainability by introducing reset_agent_completion_flags function
feat(fallback_handler.py): enhance fallback handling by allowing RAgents type and improving error handling
fix(config.py): update RAgents type definition to include both CompiledGraph and CiaynAgent for better type safety
refactor(fallback_handler.py): streamline fallback model invocation and response handling for improved readability and functionality
2025-02-12 15:35:31 -08:00
AI Christianson 23dfc024e3 Version bump. 2025-02-12 18:09:38 -05:00
AI Christianson e3d0de332f use parent tty width 2025-02-12 18:07:38 -05:00
AI Christianson 3d3b3cfba4 set env vars to disable common interactive modes 2025-02-12 18:04:27 -05:00
AI Christianson 18b0ce230e handle raw input in interactive 2025-02-12 17:59:34 -05:00
AI Christianson 7bae09e829 add pyte; improve status panel output 2025-02-12 17:21:03 -05:00
AI Christianson 1fbaeac308 use aider from the current env 2025-02-12 17:17:30 -05:00
AI Christianson 4d14b9747f fix interactive command input 2025-02-12 17:08:37 -05:00
AI Christianson 0c8a4009dc fix bug where completion message was wiped too early 2025-02-12 16:58:39 -05:00
Ariel Frischer 6e8b0f2e42 chore(output.py): remove debug print statements for cleaner code and improved readability 2025-02-12 13:50:37 -08:00
Ariel Frischer 803acc6166 feat(agent_utils.py): convert fallback response to string for prompt concatenation to ensure proper formatting
refactor(fallback_handler.py): change failed_messages from set to list for ordered message handling
refactor(fallback_handler.py): update handle_failure method to accept ToolExecutionError type for better type safety
refactor(fallback_handler.py): implement _reset_on_new_failure method to encapsulate failure reset logic
feat(fallback_handler.py): add construct_prompt_msg_list method to create structured message list for fallback tool calls
2025-02-12 13:39:25 -08:00
AI Christianson a169ed8517 disable put_complete_file_contents; improve prompts; improve status panel output 2025-02-12 16:20:24 -05:00
Ariel Frischer af9f95ceb1 refactor(agent_utils.py): remove the _handle_tool_execution_error function and simplify error handling in run_agent_with_retry
feat(fallback_handler.py): enhance handle_failure method to extract tool name from ToolExecutionError and improve fallback logic
fix(exceptions.py): update ToolExecutionError to include base_message for better error context
feat(output.py): add base_message to ToolExecutionError for improved debugging
chore(tool_configs.py): update get_all_tools function to specify return type
style(logging_config.py): reorder imports for consistency
test(tests): add tests for new error handling and fallback logic in agent_utils and fallback_handler
2025-02-12 13:07:12 -08:00
AI Christianson 905ed2c8fc improve expert model auto detection 2025-02-12 15:55:47 -05:00
AI Christianson e3a705eb9b auto detect openai expert models 2025-02-12 15:40:21 -05:00
AI Christianson c9d7e90312 lower interactive shell history to conserve context; improve prompts 2025-02-12 15:26:48 -05:00
AI Christianson 94f0d96654 lower interactive shell history to conserve context; improve prompts 2025-02-12 15:26:36 -05:00
AI Christianson 6f9ed9562d increase history; fix test 2025-02-12 15:01:02 -05:00
AI Christianson dc079c5d0e improve interactive tty process capture 2025-02-12 14:58:58 -05:00
AI Christianson 7598d42cf9 set temperature param on all initialize_llm calls 2025-02-12 14:15:05 -05:00
AI Christianson d54203b819 fix tests 2025-02-12 13:52:45 -05:00
AI Christianson 087009918b fix tests 2025-02-12 13:50:45 -05:00
AI Christianson a1371fc7e0 support default temp on a per-model basis; show status panel 2025-02-12 13:38:52 -05:00
AI Christianson 264f5025ed Refactor write file tool so it is easier for LLMs to use properly. 2025-02-12 11:51:19 -05:00
Ariel Frischer a7322eaef2 refactor(fallback_handler.py): clean up code by removing unused imports and comments to enhance readability
refactor(fallback_handler.py): extract tool call extraction logic into a separate method for better organization and maintainability
refactor(fallback_handler.py): introduce _parse_tool_arguments method to handle argument parsing, improving code clarity and reusability
2025-02-11 18:38:52 -08:00
Ariel Frischer 67ecf72a6c feat(fallback): implement fallback handler for tool execution errors to enhance error resilience and user experience
refactor(fallback): streamline fallback model selection and invocation process for improved maintainability
fix(config): reduce maximum tool failures from 3 to 2 to tighten error handling thresholds
style(console): improve error message formatting and logging for better clarity and debugging
chore(main): remove redundant fallback tool model handling from main function to simplify configuration management
2025-02-11 18:35:34 -08:00
Ariel Frischer 1388067769 refactor(agent_utils.py): refactor run_agent_with_retry function for better readability and maintainability by extracting helper functions
feat(agent_utils.py): add new helper functions for handling API errors and managing interrupt signals
fix(agent_utils.py): improve error handling in tool execution and retry logic
feat(fallback_handler.py): enhance fallback handling by binding tools correctly during retries
test(tests): add unit tests for new helper functions and refactored logic in agent_utils.py
2025-02-11 12:16:04 -08:00
Ariel Frischer de489584e5 refactor(fallback_handler.py): improve code readability by formatting imports and restructuring for loops
fix(fallback_handler.py): ensure fallback models have a default type of "prompt" and handle exceptions properly during fallback attempts
2025-02-11 01:10:22 -08:00
Ariel Frischer d39be05e39 docs(fallback_handler.py): add detailed docstrings to FallbackHandler methods to improve code documentation and clarity on functionality 2025-02-11 00:44:39 -08:00
Ariel Frischer 3d622911a6 feat(fallback_handler.py): add console notification for tool fallback activation to improve user feedback during failures 2025-02-11 00:40:02 -08:00
Ariel Frischer 0521b3ff9a feat(config.py): add RETRY_FALLBACK_COUNT and RETRY_FALLBACK_DELAY
to configure retry behavior for fallback models

refactor(fallback_handler.py): enhance fallback handling logic to
support both prompt-based and function-calling fallbacks with retries

fix(fallback_handler.py): update fallback model selection to return
dictionaries for better structure and access to model properties
2025-02-11 00:38:15 -08:00
Ariel Frischer 55abf6e5dd feat(fallback_handler): implement FallbackHandler class to manage tool failures and fallback logic
refactor(ciayn_agent): integrate FallbackHandler into CiaynAgent for improved failure handling
fix(agent_utils): add missing newline for better readability in run_agent_with_retry function
test(fallback_handler): add unit tests for FallbackHandler to ensure correct failure handling and fallback logic
2025-02-10 23:37:15 -08:00
Ariel Frischer d8ee4e04f4 feat(fallback): implement automatic fallback to alternative LLM models on consecutive failures to enhance user experience and prevent infinite error loops
refactor(ciayn_agent): restructure tool failure handling to track consecutive failures and fallback attempts more effectively
fix(logging): add pretty logging option for improved log readability
chore(config): define valid providers for LLM selection and update fallback model loading logic
test(ciayn_agent): add unit tests for fallback logic and tool failure handling to ensure reliability and correctness
2025-02-10 14:13:19 -08:00
AI Christianson 589233aaff fix tests 2025-02-10 12:13:14 -05:00
AI Christianson aca62d0c92 update logo 2025-02-10 11:45:36 -05:00
AI Christianson 149e8e2251 set timeouts on llm clients 2025-02-10 11:41:27 -05:00
AI Christianson 26b0f1bdd5 update logo 2025-02-10 11:41:03 -05:00
Ariel Frischer 45b993cfd0 feat(issue): add LLM Tool Call Fallback Feature documentation to outline the new functionality for automatic fallback to alternative LLM models after consecutive failures
feat(ciayn_agent): implement fallback mechanism in CiaynAgent to handle tool call failures and switch to alternative models
feat(__main__): add command line arguments for fallback configuration in the main application
feat(llm): add validation for required environment variables for LLM providers and merge chat histories during fallback
fix(config): define default values for maximum tool failures in configuration
test(ciayn_agent): add unit tests for fallback logic and tool call execution with retries and error handling
test(llm): enhance tests for LLM initialization and environment variable validation
2025-02-09 22:07:23 -08:00
Jose M Leon 00a455d586
FIX do not default to o1 model (#82) 2025-02-08 20:28:10 -05:00
AI Christianson 0c86900ce4 Reduce tool count to make tool calling more reliable. 2025-02-08 18:26:08 -05:00
AI Christianson 13016278e5 prompt improvements 2025-02-08 16:10:24 -05:00
AI Christianson 4c0c2e2ccf prompt improvements 2025-02-08 15:54:18 -05:00
AI Christianson f40e11ee21 improve work logging; use reasoning_effort=high for openai expert models; improve prompts 2025-02-08 14:36:08 -05:00
AI Christianson 5fad3fc755 make cwd/current date available to more agents 2025-02-08 13:58:16 -05:00
AI Christianson ea992960c1 prompt improvements 2025-02-08 13:36:30 -05:00
AI Christianson 2e31bb4ba9 upgrade langgraph deps 2025-02-08 13:34:26 -05:00
AI Christianson c27a75bc26 get rid of pointless truncation message 2025-02-08 12:44:55 -05:00
AI Christianson 5861f3a2bf Adjust token/bytes ratio to resolve errors on swebench-lite. 2025-02-08 08:07:37 -05:00
AI Christianson b673cf61b6 white logo 2025-02-06 19:16:11 -05:00
AI Christianson c59989783d Add python-Levenshtein to deps 2025-02-05 16:17:33 -05:00
AI Christianson 6f865575ee
Update README.md 2025-02-04 15:06:28 -05:00
AI Christianson 04a12b920c README logo 2025-02-04 10:14:48 -05:00
AI Christianson a822ae1332
Update README.md 2025-02-03 15:56:30 -05:00
AI Christianson 0270a9a349 Version bump. 2025-02-02 18:54:27 -05:00
AI Christianson 038f057e59 Fix tests. 2025-02-02 18:53:01 -05:00
AI Christianson 53ccc46392 Add model params for o1 and o3-mini. 2025-02-02 18:48:41 -05:00
Ariel Frischer c14fad6d14
Merge pull request #78 from ariel-frischer/fix-token-limit-bug
Fix token limit bug with custom --research/--planner args
2025-02-01 13:06:37 -08:00
Ariel Frischer 1cc5b8e16c refactor: clean up imports and improve code formatting for better readability
fix: ensure proper error handling and logging in WebSocket connections
feat: enhance WebSocket server to handle streaming and error messages more effectively
chore: update model parameters and configurations for better performance and maintainability
test: improve test coverage for model token limits and agent creation logic
2025-02-01 13:00:15 -08:00
Ariel Frischer c2ba638a95 feat(agent_utils.py): enhance get_model_token_limit to support agent types for better configuration management
test(agent_utils.py): add tests for get_model_token_limit with different agent types to ensure correct functionality
2025-02-01 12:55:36 -08:00
AI Christianson dd8b9c0d30 Improve prompts. 2025-01-31 17:45:47 -05:00
Ariel Frischer 960d7fb3df
Merge pull request #76 from ariel-frischer/aider-v0.73.0
update aider-chat version from 0.72.1 to 0.73.0
2025-01-31 14:39:51 -08:00
Ariel Frischer 6ac28a417e fix(dependencies): update aider-chat version from 0.72.1 to 0.73.0 to incorporate bug fixes and improvements 2025-01-31 14:37:25 -08:00
AI Christianson a840460aaa Fix gh release build. 2025-01-31 17:16:03 -05:00
AI Christianson a3be03c302 Use python 3.12 for release builds. 2025-01-31 17:13:54 -05:00
AI Christianson e95c13a6d0 Fix temperature param handling. 2025-01-31 17:10:49 -05:00
AI Christianson e3414890ff Add logic to handle whether a model supports temperature or not. 2025-01-31 17:04:52 -05:00
AI Christianson 1c463fca17 Add supports_temperature model param. 2025-01-31 16:35:43 -05:00
AI Christianson a387f70a74 Get rid of obsolete models_tokens.py 2025-01-31 16:06:30 -05:00
AI Christianson f7e02fc98e Refactor models_tokens to be models_params so we can track multiple parameters on a per-model basis. 2025-01-31 16:05:44 -05:00
AI Christianson 7913df4db1 fix tests 2025-01-31 14:46:01 -05:00
AI Christianson e059ba3c49 Fix token estimation 2025-01-31 14:39:02 -05:00
Will a3d19cc15d
Correcting URLs that were referencing ai-christianson/ra-aid - should be ai-christianson/RA.Aid (#69) 2025-01-31 10:15:40 -05:00
Jose M Leon 0e188c961b
FEAT WebUI (#61)
* FEAT webui to run RA.Aid from a browser

* FEAT startin webui from ra-aid cmd

* FEAT updating readme

* FEAT adding ADR for webui

* FEAT marking webui as alpha feature
2025-01-29 20:10:10 -05:00
Ariel Frischer 1b239f07bf
fix(ciayn_agent.py): convert list input to string to handle create-react-agent tool calls correctly (#66) 2025-01-29 17:42:59 -05:00
Ariel Frischer b00fd47573
feat(Makefile): add commands for code checking and fixing using ruff (#63)
refactor(ra_aid/__init__.py): reorganize imports for better readability
refactor(ra_aid/__main__.py): clean up imports and improve structure
refactor(ra_aid/agent_utils.py): streamline imports and improve organization
refactor(ra_aid/agents/ciayn_agent.py): enhance code structure and readability
refactor(ra_aid/chat_models/deepseek_chat.py): tidy up imports for clarity
refactor(ra_aid/config.py): maintain consistent formatting and organization
refactor(ra_aid/console/__init__.py): improve import structure for clarity
refactor(ra_aid/console/cowboy_messages.py): enhance code readability
refactor(ra_aid/console/formatting.py): clean up formatting functions for consistency
refactor(ra_aid/console/output.py): improve output handling for better clarity
refactor(ra_aid/dependencies.py): enhance dependency checking structure
refactor(ra_aid/env.py): streamline environment validation logic
refactor(ra_aid/exceptions.py): improve exception handling structure
refactor(ra_aid/file_listing.py): enhance file listing functionality
refactor(ra_aid/llm.py): improve language model initialization logic
refactor(ra_aid/logging_config.py): tidy up logging configuration
refactor(ra_aid/models_tokens.py): maintain consistent formatting
refactor(ra_aid/proc/interactive.py): enhance subprocess handling
refactor(ra_aid/project_info.py): improve project information handling
refactor(ra_aid/project_state.py): streamline project state management
refactor(ra_aid/provider_strategy.py): enhance provider validation logic
refactor(ra_aid/tests/test_env.py): improve test structure and readability
refactor(ra_aid/text/__init__.py): maintain consistent import structure
refactor(ra_aid/text/processing.py): enhance text processing functions
refactor(ra_aid/tool_configs.py): improve tool configuration structure
refactor(ra_aid/tools/__init__.py): tidy up tool imports for clarity
refactor(ra_aid/tools/agent.py): enhance agent tool functionality
refactor(ra_aid/tools/expert.py): improve expert tool handling
refactor(ra_aid/tools/file_str_replace.py): streamline file string replacement logic
refactor(ra_aid/tools/fuzzy_find.py): enhance fuzzy find functionality
refactor(ra_aid/tools/handle_user_defined_test_cmd_execution.py): improve test command execution logic
refactor(ra_aid/tools/human.py): enhance human interaction handling
refactor(ra_aid/tools/list_directory.py): improve directory listing functionality
refactor(ra_aid/tools/memory.py): streamline memory management functions
refactor(ra_aid/tools/programmer.py): enhance programming task handling
refactor(ra_aid/tools/read_file.py): improve file reading functionality
refactor(ra_aid/tools/reflection.py): maintain consistent function structure
refactor(ra_aid/tools/research.py): enhance research tool handling
refactor(ra_aid/tools/ripgrep.py): improve ripgrep search functionality
refactor(ra_aid/tools/ripgrep.py): enhance ripgrep search command handling
refactor(ra_aid/tools/ripgrep.py): improve search result handling
refactor(ra_aid/tools/ripgrep.py): streamline search parameters handling
refactor(ra_aid/tools/ripgrep.py): enhance error handling for search operations
refactor(ra_aid/tools/ripgrep.py): improve output formatting for search results
refactor(ra_aid/tools/ripgrep.py): maintain consistent command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search result display
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(ra_aid/tools/ripgrep.py): enhance search command execution logic
refactor(ra_aid/tools/ripgrep.py): improve search command output formatting
refactor(ra_aid/tools/ripgrep.py): streamline search command construction
refactor(ra_aid/tools/ripgrep.py): enhance search command error handling
refactor(ra_aid/tools/ripgrep.py): improve search command output handling
refactor(ra_aid/tools/ripgrep.py): maintain consistent search command structure
refactor(

style(server.ts): update variable naming from lowercase 'port' to uppercase 'PORT' for consistency and clarity
feat(server.ts): allow server to listen on a configurable port using process.env.PORT or default to PORT
style(shell.py): reorder import statements for better organization and readability
style(shell.py): remove unnecessary blank lines for cleaner code
style(web_search_tavily.py): reorder import statements for better organization
style(write_file.py): format code for consistency and readability
style(extract_changelog.py): format code for consistency and readability
style(generate_swebench_dataset.py): format code for consistency and readability
style(test_ciayn_agent.py): format code for consistency and readability
style(test_cowboy_messages.py): format code for consistency and readability
style(test_interactive.py): format code for consistency and readability
style(test_agent_utils.py): format code for consistency and readability
style(test_default_provider.py): format code for consistency and readability
style(test_env.py): format code for consistency and readability
style(test_llm.py): format code for consistency and readability
style(test_main.py): format code for consistency and readability
style(test_programmer.py): format code for consistency and readability
style(test_provider_integration.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_utils.py): format code for consistency and readability
style(test_execution.py): format code for consistency and readability
style(test_expert.py): format code for consistency and readability
style(test_file_str_replace.py): format code for consistency and readability
style(test_fuzzy_find.py): format code for consistency and readability
style(test_handle_user_defined_test_cmd_execution.py): format code for consistency and readability
style(test_list_directory.py): format code for consistency and readability
style(test_user_defined_test_cmd_execution.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and readability
style(test_tool_configs.py): format code for consistency and

style(tests): standardize string quotes to double quotes for consistency across test files
style(tests): format code for better readability by adjusting spacing and line breaks
style(tests): remove unnecessary blank lines to improve code cleanliness
style(tests): ensure consistent use of whitespace around operators and after commas
style(tests): align comments and docstrings for better visual structure and clarity
2025-01-29 16:38:58 -05:00
Jose M Leon b44f1c73eb
FIX prevent duplicate files (#64) 2025-01-29 14:48:02 -05:00
Jose M Leon 90b8875a73
REFACTOR handle user defined test cmd (#59) 2025-01-27 08:41:02 -05:00
Jose M Leon d89f8990a3
FEAT Run tests during Github CICD (#58) 2025-01-27 08:40:20 -05:00
Jose M Leon 64b2e5b3db
Merge pull request #56 from leonj1/feat_test_cmd
FEAT support test-cmd
2025-01-26 20:05:54 -05:00
Jose Leon 3896236fa1 wip 2025-01-25 04:15:01 +00:00
Ariel Frischer 9533ff1957
Merge pull request #55 from ariel-frischer/fix-temp
Fix failing tests around llm.py refactoring
2025-01-24 18:15:01 -08:00
Ariel Frischer 2d4615e655 refactor(llm.py): simplify temperature handling logic for better readability and maintainability
fix(llm.py): ensure default temperature is set correctly for different providers
2025-01-24 17:09:01 -08:00
Ariel Frischer 6c4acfea8b
Added Provider/Model Override Arguments to Seperate Research/Planner Configurations (#53)
* feat: add research and planner provider/model options to enhance configurability for research and planning tasks
refactor: create get_effective_model_config function to streamline provider/model resolution logic
test: add unit tests for effective model configuration and environment validation for research and planner providers

* refactor(agent_utils.py): remove get_effective_model_config function to simplify code and improve readability
style(agent_utils.py): format debug log statements for better readability
fix(agent_utils.py): update run_agent functions to directly use config without effective model config
feat(agent_utils.py): enhance logging for command execution in programmer.py
test(tests): remove tests related to get_effective_model_config function as it has been removed

* chore(tests): remove outdated tests for research and planner agent configurations to clean up the test suite and improve maintainability

* style(tests): apply consistent formatting and spacing in test_provider_integration.py for improved readability and maintainability
2025-01-24 18:00:47 -05:00
AI Christianson 54fdebfc3a Do not incorrectly give temp parameter to expert model. 2025-01-24 10:37:35 -05:00
Ariel Frischer 5240fb2617
feat(agent_utils.py): integrate litellm to retrieve model token limits for better flexibility (#51)
fix(agent_utils.py): rename max_tokens to max_input_tokens for clarity in state_modifier function
fix(models_tokens.py): update deepseek-reasoner token limit to 64000 for accuracy
test(agent_utils.py): add tests for litellm integration and fallback logic in get_model_token_limit function
2025-01-23 14:48:30 -05:00
AI Christianson c0499ab795 Bump version 2025-01-22 11:10:47 -05:00
Ariel Frischer 686ab42f88
Add Deepseek Provider Support and Custom Deepseek Reasoner Chat Model (#50)
* chore: Add DeepSeek provider environment variable support in env.py

* feat: Add DeepSeek provider validation strategy in provider_strategy.py

* feat: Add support for DEEPSEEK provider in initialize_llm function

* feat: Create ChatDeepseekReasoner for custom handling of R1 models

* feat: Configure custom OpenAI client for DeepSeek API integration

* chore: Remove unused json import from deepseek_chat.py

* refactor: Simplify invocation_params and update acompletion_with_retry method

* feat: Override _generate to ensure message alternation in DeepseekReasoner

* feat: Add support for ChatDeepseekReasoner in LLM initialization

* feat: Use custom ChatDeepseekReasoner for DeepSeek models in OpenRouter

* fix: Remove redundant condition for DeepSeek model initialization

* feat: Add DeepSeek support for expert model initialization in llm.py

* feat: Add DeepSeek model handling for OpenRouter in expert LLM initialization

* fix: Update model name checks for DeepSeek and OpenRouter providers

* refactor: Extract common logic for LLM initialization into reusable methods

* test: Add unit tests for DeepSeek and OpenRouter functionality

* test: Refactor tests to match updated LLM initialization and helpers

* fix: Import missing helper functions to resolve NameError in tests

* fix: Resolve NameError and improve environment variable fallback logic

* feat(readme): add DeepSeek API key requirements to documentation for better clarity on environment variables
feat(main.py): include DeepSeek as a supported provider in argument parsing for enhanced functionality
feat(deepseek_chat.py): implement ChatDeepseekReasoner class for handling DeepSeek reasoning models
feat(llm.py): add DeepSeek client creation logic to support DeepSeek models in the application
feat(models_tokens.py): define token limits for DeepSeek models to manage resource allocation
fix(provider_strategy.py): correct validation logic for DeepSeek environment variables to ensure proper configuration
chore(memory.py): refactor global memory structure for better readability and maintainability in the codebase
2025-01-22 07:21:10 -05:00
Ariel Frischer 7a68de2d06
Add Aider config File Argument Support (#43)
* feat(main.py): add --aider-config argument to specify aider config file path for better configuration management
feat(programmer.py): include aider config in command if specified to enhance functionality
test: add unit test for aider config flag inclusion in command to ensure correct behavior
chore: update requirements-dev.txt to include pytest-mock for testing enhancements

* test(tests/ra_aid/test_programmer.py): remove unnecessary comments to improve code readability and maintainability
2025-01-21 13:17:59 -05:00
Ariel Frischer 46e7340ddb
Add configurable --recursion-limit argument (#46)
* test: Add unit tests for argument parsing in __main__.py

* test: Update tests to remove invalid argument and improve error handling

* test: Fix test_missing_message to handle missing argument cases correctly

* test: Fix test_missing_message to reflect argument parsing behavior

* test: Combine recursion limit tests and verify global config updates

* fix: Include recursion_limit in config for recursion limit tests

* test: Mock dependencies and validate recursion limit in global config

* test: Remove commented-out code and clean up test_main.py

* test: Remove self-evident comments and improve test assertions in test_main.py

* fix: Mock user input and handle temperature in global config tests

* fix: Fix test failures by correcting mock targets and handling temperature

* test: Update temperature validation to check argument passing to initialize_llm

* fix: Correct mock for ask_human and access kwargs in temperature test

* fix: Patch the entire ask_human function in test_chat_mode_implies_hil

* docs: Add recursion limit option to README documentation

* docs: Update README.md with all available command line arguments

* feat(config): add DEFAULT_RECURSION_LIMIT constant to set default recursion depth
feat(main.py): add --recursion-limit argument to configure maximum recursion depth for agent operations
fix(main.py): validate that recursion limit is positive before processing
refactor(main.py): use args.recursion_limit in agent configuration instead of hardcoded value
refactor(agent_utils.py): update agent configuration to use recursion limit from global memory or default value
refactor(run_research_agent): clean up comments and improve readability
refactor(run_web_research_agent): clean up comments and improve readability
refactor(run_planning_agent): clean up comments and improve readability
refactor(run_task_implementation_agent): clean up comments and improve readability
delete(test_main.py): remove obsolete test for chat mode and HIL configuration
2025-01-21 11:46:56 -05:00
Jose M Leon e886d98c0e
FIX Issue 42: Error with Levenshtein (#44)
* FIX install error from Levenshtein by removing that dep in favor of python native

* FIX error during git push

* fixes

* wip

* wip
2025-01-21 11:46:15 -05:00
Ariel Frischer 1029be7df9
chore(dependencies): update aider-chat version from 0.69.1 to 0.72.1 to incorporate latest features and fixes (#47) 2025-01-21 11:45:54 -05:00
Ariel Frischer 32fcf914ed
Set Default Max Token Limit with Provider/Model Dictionary and Limit Tokens for Anthropic Claude React Agent (#45)
* feat(agent_utils.py): add get_model_token_limit function to retrieve token limits for models based on provider and model name
feat(models_tokens.py): create models_tokens module to store token limits for various models and providers
test(agent_utils.py): implement unit tests for get_model_token_limit and create_agent functions to ensure correct behavior and error handling

* test: Add unit tests for token limiting and agent creation functionality

* fix: Correct indentation and add missing test function for error handling

* fix: Update test assertion to use messages_modifier instead of state_modifier

* feat(agent_utils.py): add limit_tokens function to manage message token limits and preserve system message
fix(agent_utils.py): update get_model_token_limit to handle exceptions and return None on error
fix(ciayn_agent.py): set default max_tokens to DEFAULT_TOKEN_LIMIT in CiaynAgent initialization
feat(models_tokens.py): define DEFAULT_TOKEN_LIMIT for consistent token limit management across agents
style(agent_utils.py): improve code formatting and consistency in function definitions and comments
style(agent_utils.py): refactor imports for better organization and readability
fix(test_agent_utils.py): correct test assertion to use state_modifier instead of messages_modifier for create_agent function

* refactor(agent_utils.py): improve docstring clarity and formatting for limit_tokens function to enhance readability
refactor(test_agent_utils.py): format test assertions for consistency and readability in agent creation tests

* feat: Update limit_tokens function to support Dict type for state parameter

* feat: Update limit_tokens to handle both list and dict input types

* refactor: Extract duplicate token trimming logic into helper function

* refactor: Rename and update message trimming functions for clarity

* refactor: Extract agent kwargs logic into a helper method for reuse

* refactor: Rename _build_agent_kwargs to build_agent_kwargs for clarity

* fix: Ensure state_modifier is passed correctly for agent creation

* test: Add tests for create_agent token limiting configuration

* refactor: Simplify CiaynAgent instantiation to only use max_tokens parameter

* refactor: Remove is_react_agent parameter from build_agent_kwargs function

* test: Fix test assertions for state_modifier in agent creation tests

* fix: Update agent creation to handle checkpointer and simplify tests

* test: Remove unnecessary assertions from agent creation test

* feat: Implement token limiting configuration for create_agent function

* refactor: Remove unused model info and token limit retrieval code

* test: Fix assertion errors in agent creation tests and update state_modifier handling

* test: Remove commented-out code and clarify assertions in tests

* test: Fix assertion in test_create_agent_anthropic_token_limiting_disabled

* feat(main.py): add --limit-tokens argument to control token limiting in agent state
fix(main.py): include limit_tokens in configuration to ensure proper state management

* test: Refactor agent creation tests for improved readability and consistency

* test: Modify error handling in create_agent test to use side_effect on get_model_token_limit

* test: Improve error handling in create_agent test to verify fallback behavior

* test: Trigger exception on get_model_token_limit in error handling test

* refactor(agent_utils.py): remove unused config parameter from create_agent function to simplify the function signature
fix(agent_utils.py): ensure config is always retrieved from _global_memory with a default value to prevent potential errors
test(tests/test_agent_utils.py): remove outdated test for create_agent error handling to clean up the test suite

* feat: Add debug print for agent_kwargs in create_agent function

* refactor: Replace lambda with inner function for state_modifier in agent_utils

* refactor: Simplify limit_tokens function to return only message sequences

* feat: Add debug print statements to show token trimming details in trim_messages

* PAIN

* feat(main.py): add debug print statement for args.chat to assist in troubleshooting chat mode
feat(agent_utils.py): implement estimate_messages_tokens function to calculate total tokens in messages
refactor(agent_utils.py): replace token counting logic in trim_messages_with_removal with estimate_messages_tokens for clarity
refactor(agent_utils.py): modify state_modifier to accept model and max_tokens parameters for better flexibility
refactor(agent_utils.py): update build_agent_kwargs to pass model to state_modifier for improved functionality

* feat: Add .direnvrc to manage Python virtual environment activation

* refactor: Update state_modifier to handle first message token count and trim messages

* chore: remove unused .direnvrc file to clean up project structure
feat: add .envrc to .gitignore to prevent environment configuration file from being tracked
fix: update help text for --disable-limit-tokens argument for clarity
refactor: clean up imports in agent_utils.py for better readability
refactor: remove unused functions and comments in agent_utils.py to streamline code
test: add unit tests for state_modifier function to ensure correct message trimming behavior

* refactor: Remove commented-out code in create_agent function

* feat: Add is_anthropic_claude method to check provider and model name

* fix: Correct search/replace block to match existing lines in agent_utils.py

* fix(main.py): update help text for --disable-limit-tokens argument to clarify it applies to react agents
refactor(agent_utils.py): streamline token limit retrieval and improve readability by removing redundant checks and restructuring code
refactor(agent_utils.py): modify build_agent_kwargs to use is_anthropic_claude for clarity and maintainability

* test: Update tests to pass config argument to get_model_token_limit()

* refactor(agent_utils.py): remove unnecessary print statements and improve function signatures for clarity
refactor(agent_utils.py): consolidate provider and model_name retrieval into config parameter for better maintainability

* test: Remove redundant token limiting tests from agent creation logic

* test: Refactor test_state_modifier to use mock_messages fixture

* test(tests): update test description for clarity on state_modifier behavior and use mock_messages for assertions to ensure consistency

* refactor(agent_utils.py): simplify token limit retrieval by removing unnecessary variable initialization and defaulting to None in get method

* chore(main.py): remove debug print statement for args.chat to clean up output
2025-01-20 14:41:29 -05:00
AI Christianson 0c39166172 Increase recusion limit; Handle 429 better; Improve prompts. 2025-01-09 15:52:51 -05:00
AI Christianson 63be5248e1 Extract tool reflection. 2025-01-09 15:35:14 -05:00
AI Christianson 8d0bacdcda Prompt improvements. 2025-01-09 15:18:33 -05:00
AI Christianson 5ffedb6941 Fix test_file_as_directory. 2025-01-09 15:04:21 -05:00
AI Christianson d01d2a4865 Integrate project info into chat prompt. 2025-01-09 15:01:39 -05:00
AI Christianson b631a4bf57 Get project info programmatically to save tokens. 2025-01-09 14:43:42 -05:00
AI Christianson 557ffd959b Prompt improvements. 2025-01-09 13:54:50 -05:00
AI Christianson 4b24dbe960 Improve work log handling. 2025-01-09 13:42:26 -05:00
AI Christianson ba82f41fa0 Only include work_log key if needed, to save tokens. 2025-01-09 12:57:58 -05:00
AI Christianson 094257e0af Add unit tests for CiaynAgent._does_not_conform_to_pattern. 2025-01-09 11:51:08 -05:00
AI Christianson 80d2d2fa60 Better handle 429 errors on openrouter. 2025-01-09 11:42:13 -05:00
AI Christianson d115b8d5fe Improve prompts for better open model support. 2025-01-09 11:06:58 -05:00
Benedikt Terhechte bfc0e9c626
Changes (#37)
* add way to extract tool use

* respect aiderignore for listing files

* properly use filetypes in ripgrep
2025-01-09 09:46:32 -05:00
AI Christianson 0449564109 Fix bug where directories are added as related files. 2025-01-08 17:04:24 -05:00
AI Christianson 4dd424ecc3 release: version 0.12.0 2025-01-04 15:42:31 -05:00
AI Christianson 7310f0244d docs: update CHANGELOG for unreleased changes 2025-01-04 15:40:32 -05:00
AI Christianson cd49c2bd48 test: update test suite for Gemini integration
- Add mock_gemini parameter to test functions
- Update Gemini API configuration tests
- Fix date-based assertions in directory listing tests
- Minor syntax fixes in test files
2025-01-04 15:36:13 -05:00
arthrod ffe5138a99
Adding Gemini API due to openrouter's limitations. (#34) 2025-01-04 07:19:05 -05:00
agentmarketbot 937c8c2a6a
agent bot commit (#31) 2025-01-02 16:41:02 -05:00
Jose M Leon dbfd4134da
FEAT add test coverage report (#28) 2025-01-01 09:36:03 -05:00
Jose M Leon 726b551449
FEAT add function to check for dependencies on startup (#27) 2025-01-01 09:35:41 -05:00
Guillermo Creus Botella 07c71408b7
Add default support for OpenAI models (#29)
* add support for default OpenAI provider

* clarify CLI options
2025-01-01 09:34:51 -05:00
AI Christianson 8e805dba6d SWEBench updates. 2024-12-31 08:51:21 -05:00
AI Christianson 4fca32a508 SWEBench updates. 2024-12-31 08:36:19 -05:00
AI Christianson 9303736418 Bump python version 2024-12-30 18:26:37 -05:00
AI Christianson bf86de2597 SWEBench updates. 2024-12-30 17:54:21 -05:00
AI Christianson 1e2917990e SWEBench updates. 2024-12-30 14:01:14 -05:00
AI Christianson 8b7eb76be6 SWEBench updates. 2024-12-30 13:25:51 -05:00
AI Christianson 34acb462f9 Version bump 2024-12-30 12:38:30 -05:00
Will ccb4756035
macOS compatibility (#23)
* Correcting URL for github; ra-aid.git -> RA.Aid.git

* Additional fix to cloning instructions

* Initial draft of tweaks to add macOS compatibility

* Changing LS test to check for not-zero instead of specific error code

* Further macOS compatibility tweaks - dealing with mystery control characters

* Additional compatibility for macOS - flag as macOS, and detect and change command based it

* Removing unneeded variable
2024-12-30 12:38:06 -05:00
AI Christianson 96c4620df0 Version bump 2024-12-30 08:51:10 -05:00
Jose M Leon 567d1ab49d
FIX SyntaxError: f-string expression part cannot include a backslash (#25)
* FIX unit tests

* FEAT run tests prior to git push

* FIX SyntaxError: f-string expression part cannot include a backslash
2024-12-30 08:45:21 -05:00
AI Christianson 712663b086 Version bump 2024-12-29 14:55:25 -05:00
AI Christianson a8084f15f9 Fix typo 2024-12-29 14:52:39 -05:00
Will d3a4684d69
Corrected typo in documentation for the GitHub URL (#22)
* Correcting URL for github; ra-aid.git -> RA.Aid.git

* Additional fix to cloning instructions
2024-12-29 11:47:24 -05:00
AI Christianson 9d4c74e05c Improve prompts. 2024-12-28 19:28:49 -05:00
AI Christianson 97b7fe0c45 Improve prompts. 2024-12-28 19:12:23 -05:00
AI Christianson 99d0b1f440 Improve prompts. 2024-12-28 19:12:00 -05:00
AI Christianson 595add4606 Version bump 2024-12-28 18:37:05 -05:00
AI Christianson a28ed59bca Add --temperature CLI parameter. 2024-12-28 18:36:24 -05:00
AI Christianson ace34633de Adjustments to get smaller agent models working better. 2024-12-28 18:19:42 -05:00
AI Christianson 35db6b633f Adjustments to get smaller agent models working better. 2024-12-28 17:41:06 -05:00
AI Christianson 8b50b741fa Fix test. 2024-12-28 17:36:31 -05:00
AI Christianson 684b076dbf Adjustments to get smaller agent models working better. 2024-12-28 17:31:41 -05:00
AI Christianson 19e203be7e Use create_react_agent for claude. 2024-12-28 17:19:12 -05:00
AI Christianson 87cd67715c Add note about env var validation improvements. 2024-12-28 16:59:28 -05:00
AI Christianson 0838952025 Get rid of llm_test.py 2024-12-28 16:57:06 -05:00
AI Christianson cf485bd96c Merge llm-fn-call: resolve changelog conflicts 2024-12-28 16:56:34 -05:00
Jose M Leon 8b3f4d736c
FEAT fix command line args and env var dependencies on anthropic (#21)
* FIX provider cmdline args

* FIX Issue 18

* FIX ensure research-only requires a model
2024-12-28 16:53:57 -05:00
AI Christianson 406d1a5358 ciayn 2024-12-28 16:44:06 -05:00
AI Christianson 13b953bf7f extract creat agent method 2024-12-28 15:39:33 -05:00
AI Christianson fd664c0886 changelog 2024-12-28 15:36:09 -05:00
AI Christianson 2af7f8a623 ciayn 2024-12-28 15:18:58 -05:00
AI Christianson 5c5df65694 ciayn 2024-12-28 15:11:43 -05:00
AI Christianson 6f10db811e ciayn 2024-12-28 15:09:32 -05:00
AI Christianson 4cb98370c2 ciayn 2024-12-28 14:58:16 -05:00
AI Christianson ac2bdfd69b ciayn 2024-12-28 14:54:31 -05:00
AI Christianson 9074cae2f5 ciayn 2024-12-28 14:47:34 -05:00
AI Christianson 535be97c1f ciayn 2024-12-28 14:41:39 -05:00
AI Christianson d8a3c88624 add ciayn agent 2024-12-28 14:31:14 -05:00
AI Christianson c704117444 create compatible class structure 2024-12-28 14:02:52 -05:00
AI Christianson 377a670ac8 Merge branch 'master' into llm-fn-call 2024-12-28 12:22:34 -05:00
AI Christianson 9944ec9ea4 Fix tests. 2024-12-27 19:59:05 -05:00
AI Christianson bd2fd07b1b Version bump 2024-12-27 19:55:57 -05:00
AI Christianson 5976727359 Make read_file always output status panel. 2024-12-27 19:55:15 -05:00
AI Christianson 1198834261 agent 2024-12-27 19:54:04 -05:00
AI Christianson 83e094bba0 initial working agent 2024-12-27 18:56:47 -05:00
AI Christianson 1c007980d9 Initial llm fn calling experiment 2024-12-27 18:32:02 -05:00
AI Christianson f1727c76d4 Simplify planning stage by executing tasks directly. Make research notes available to more agents/tools. 2024-12-27 17:04:03 -05:00
AI Christianson 10b58bb2db Simplify planning stage by executing tasks directly. Make research notes available to more agents/tools. 2024-12-27 17:03:47 -05:00
AI Christianson f2ce6a7ab0 Improve prompts and fix web research prompt integration. 2024-12-27 15:26:54 -05:00
AI Christianson b8d231b5a1 Add WIP evaluation script. 2024-12-27 09:23:13 -05:00
AI Christianson 868835ece8 Fix logging on interrupt. 2024-12-26 17:28:39 -05:00
AI Christianson 5f0605dbc0 Version bump 2024-12-26 15:21:44 -05:00
AI Christianson 298c9d4ab7
Replit (#16)
Add replit configuration.
2024-12-26 12:21:45 -05:00
user b218bebeec Fix bug where nested agents were not using specified provider. 2024-12-26 07:13:14 -05:00
user 8018bce252 Fix variable reference. 2024-12-26 07:08:28 -05:00
AI Christianson 408eff73a9
Merge pull request #14 from leonj1/feat_support_version
FEAT support version arg
2024-12-25 23:30:07 -05:00
Jose Leon 6c3c89c8a0 FEAT support version arg 2024-12-26 04:20:42 +00:00
AI Christianson 7b664b802f
Merge pull request #10 from leonj1/feat_verbose_logging
FEAT add verbose logging
2024-12-25 21:40:58 -05:00
Jose Leon 204f44cda0 FEAT add verbose logging 2024-12-26 00:45:57 +00:00
AI Christianson 64fc0f6b99
Merge pull request #6 from leonj1/fix_support_more_py_versions
FIX support Python 3.8 and 3.13
2024-12-25 16:38:14 -05:00
Jose Leon d1982ed773 FIX support Python 3.8 and 3.13 2024-12-25 21:22:59 +00:00
user 82ef0468f2 Version bump 2024-12-24 09:35:55 -05:00
user 74abb10861 Update README.md with web research 2024-12-24 09:34:29 -05:00
user eb5cc50291 Update list of files for programmer tool. 2024-12-24 09:08:47 -05:00
user 1bcf3b4544 Added web research demo. 2024-12-24 08:56:40 -05:00
user f0985ed11c Fix tests. 2024-12-24 08:49:40 -05:00
user 25b1dae8cb Clean up imports. 2024-12-24 08:33:10 -05:00
user 72f8c33e43 Fix bugs. 2024-12-24 08:31:08 -05:00
user c0fa79fe77 Improve web research prompts. 2024-12-24 06:54:56 -05:00
AI Christianson 90e5924ab2
Merge pull request #5 from leonj1/feat_aider_args
FEAT support future aider flags
2024-12-23 19:39:12 -05:00
Jose Leon e507fd87bd FEAT allow flexiblity to support future aider flags 2024-12-24 00:25:05 +00:00
user 1ab7ce60ea Tavily integration 2024-12-23 17:20:24 -05:00
user f5482dce2a Added web research tool config. 2024-12-23 17:08:07 -05:00
user 48f4fbc41d Add Tavily tool. 2024-12-23 16:48:47 -05:00
user ffff89d8e7 Add tavily to deps. 2024-12-23 16:45:52 -05:00
user 137fc98553 Make web research tool available to agents. 2024-12-23 16:44:57 -05:00
user c1f9a40936 Add request_web_research tool. 2024-12-23 16:40:38 -05:00
user 481d80dc53 Add web research agent fn. 2024-12-23 16:36:40 -05:00
user 38ddab6068 Pass config to agent loop. 2024-12-23 16:30:27 -05:00
user d08dbe0372 Added web research agent prompt 2024-12-23 16:26:33 -05:00
user f9fd6a4cde Add web research prompt section. 2024-12-23 16:21:28 -05:00
user ebfdcf821e Version bump 2024-12-23 15:53:23 -05:00
user aea69af9c1 Version bump 2024-12-23 14:57:08 -05:00
user 21611953d7 Clean up exception handling. 2024-12-23 14:54:28 -05:00
user 6591fdae65 Cleanup README. 2024-12-23 14:40:41 -05:00
user 224e69aa4c Add new info about interrupting agents. 2024-12-23 14:38:39 -05:00
user e7bd11d949 Add demo with interruption. 2024-12-23 14:27:52 -05:00
user 8ffcac867b Interruption UX. 2024-12-23 14:23:10 -05:00
user 1d8b44e1a6 Improve interruption UX. 2024-12-23 14:10:54 -05:00
user 34fcb76ad8 Improve agent interruption UX by allowing user to specify feedback or exit the program entirely. 2024-12-23 14:06:24 -05:00
user f7523e86d8 Improve agent interruption UX by allowing user to specify feedback or exit the program entirely. 2024-12-23 14:05:59 -05:00
user 35a1fb716f Improved prompts. 2024-12-23 13:37:25 -05:00
user e5035569fa Include work log in task agent context. 2024-12-23 13:06:37 -05:00
user f569bb14b1 Fix unit test warnings. 2024-12-23 12:56:08 -05:00
user bfe438379f Fix test warning. 2024-12-23 12:46:37 -05:00
user 12843978b7 Fix expert related files reading. 2024-12-23 12:46:28 -05:00
user 9a283f3f43 Fix expert unit tests. 2024-12-23 12:38:38 -05:00
user 04d45425ee Fix work log tests. 2024-12-23 12:36:59 -05:00
user a0250855da Include work log in agent context. 2024-12-23 12:18:48 -05:00
user 9a53940dcd Track agent depth for all agents. 2024-12-23 12:05:39 -05:00
user c261c741f9 Fix expert file reading for context. 2024-12-23 11:58:40 -05:00
user 0399c5e346 Improve work log format. 2024-12-23 11:46:46 -05:00
user 87ec7c0268 Add initial work log. 2024-12-23 11:36:28 -05:00
user 243cd55615 Update changelog. 2024-12-23 11:23:03 -05:00
user 9948dfef90 Do not put file ID in file paths when reading for expert context. 2024-12-23 11:21:13 -05:00
user e75f3fc2c3 Added chat mode demo. 2024-12-23 10:57:03 -05:00
user c8dcb6811e Added chat mode demo. 2024-12-23 10:53:57 -05:00
user 336e31c841 Version bump 2024-12-23 10:42:18 -05:00
user 30f032ef2f Start IDs on 1 for better UX and to not confuse the LLMs. 2024-12-23 10:40:58 -05:00
user 88c844e49f Optimize first prompt in chat mode to avoid unnecessary LLM call. 2024-12-23 10:38:49 -05:00
user 25253dcbfa Improve prompts. 2024-12-23 10:12:27 -05:00
user 7fab72a96c Improve prompts. 2024-12-23 09:40:44 -05:00
user 5ab26dc892 Specify aider-chat version. 2024-12-23 09:39:38 -05:00
user 29448b006b Improve prompts. 2024-12-23 09:39:29 -05:00
user 6e7b41a354 Version bump 2024-12-22 17:03:43 -05:00
user cd307cf8fa Improve prompts. 2024-12-22 17:03:19 -05:00
user 2ff452f20a Version bump 2024-12-22 16:00:53 -05:00
user b7cf27be9e Improve prompts. 2024-12-22 16:00:15 -05:00
user 4cdb6c4ce0 docs: add chat mode documentation to README 2024-12-22 15:54:05 -05:00
user b28e5b30b4 Do not show file ID in user-facing panel. 2024-12-22 15:29:23 -05:00
user 5ddceabae1 Rename delete_related_files to deregister_related_files. 2024-12-22 15:17:39 -05:00
user 678722f37f Allow agents to deregister related files 2024-12-22 15:09:10 -05:00
user 79360f761c Introduce dedicated RESEARCH_ONLY_PROMPT. 2024-12-22 15:00:39 -05:00
user 80486ec533 Convert related files system to ID-based storage
- Refactored related files storage to use dictionary with integer IDs as keys
- Added related_file_id_counter for generating unique file IDs
- Updated get_related_files() to return formatted strings with IDs
- Added delete_related_files() function for removing files by ID
- Maintained duplicate file path handling to preserve original IDs
- All tests passing
2024-12-22 14:39:16 -05:00
user 497c24c894 Improve messages. 2024-12-22 14:05:59 -05:00
user f80545d693 Allow graceful interruption of agents. 2024-12-22 14:00:17 -05:00
user 6d51a9e1ef Prompt improvements. 2024-12-22 12:14:28 -05:00
user c677da1e11 Improve expert prompt. 2024-12-22 11:29:08 -05:00
user 6a0dd0a950 Prompt improvements. 2024-12-22 11:21:41 -05:00
user 7cf1884b34 Expert prompt tweaks. 2024-12-22 11:12:13 -05:00
user 51663dc479 Fix task completion tracking. 2024-12-22 10:05:43 -05:00
user c73e9ada84 Improve error status display. 2024-12-22 10:02:50 -05:00
user 59af95acf7 Enforce research recursion limit. 2024-12-22 09:54:05 -05:00
user c6068bf85c Add tests for LLM initialization. 2024-12-22 09:02:58 -05:00
user 53adb4d6e6 Improve UX. 2024-12-22 08:45:12 -05:00
user 7ab0e671ea Get rid of vi bindings by default. 2024-12-22 08:36:42 -05:00
user c41fac82b7 Include known context in research prompt. 2024-12-21 20:20:00 -05:00
user 5be2792612 Improve tool return values. 2024-12-21 15:40:19 -05:00
user 5053b36d8b Fix printing of agent output. 2024-12-21 15:35:05 -05:00
user f0f7487485 Handle completion messages. 2024-12-21 15:31:04 -05:00
user 5344aa9e14 Allow chat mode to do implementation. 2024-12-21 14:42:18 -05:00
user ef4748f009 Fix run_planning_agent config. 2024-12-21 14:36:39 -05:00
user a01b8ebf36 Add request_implementation tool. 2024-12-21 14:20:06 -05:00
user ba51f99da5 Added request_research_and_implementation. 2024-12-21 14:16:12 -05:00
user ecb6796008 Extract run_planning_agent. 2024-12-21 14:10:55 -05:00
user c65fe077b3 Added plan_implementation_completed. 2024-12-21 13:59:55 -05:00
user 2b0efe5fd2 Cleanup. 2024-12-21 13:56:18 -05:00
user f92c30b4e6 Allow individual tasks to be marked completed. 2024-12-21 13:50:40 -05:00
user d44d309028 Allow planning agent to direct implementation of tasks. 2024-12-21 13:40:17 -05:00
user 37e36967ee Introduce run_task_implementation_agent. 2024-12-21 13:13:50 -05:00
user 85f56cb75c Use proper model config for research agent. 2024-12-21 12:53:31 -05:00
AI Christianson ae6052ed15 Introduce run_research_agent. 2024-12-21 12:19:43 -05:00
AI Christianson 2ac796cf2b Extricate research subtasks. 2024-12-21 11:27:14 -05:00
AI Christianson a9c6ea93b4 Return reason for failure. 2024-12-21 11:04:57 -05:00
AI Christianson 1fc64c5151 Allow chat agent to spawn research agent. 2024-12-21 10:58:08 -05:00
AI Christianson f712fcf9c8 Chat mode changelog. 2024-12-20 16:37:25 -05:00
AI Christianson 5b4aa746bf Support multiline chat input. 2024-12-20 16:07:03 -05:00
AI Christianson 1a125a0139 Added initial chat mode. 2024-12-20 15:46:53 -05:00
AI Christianson e8a619fcb1 Add initial chat mode prompts. 2024-12-20 15:24:39 -05:00
AI Christianson 942ec24f5e Version bump 2024-12-20 15:13:39 -05:00
AI Christianson 2ab2117d1b Version bump 2024-12-20 13:45:34 -05:00
AI Christianson f096a06119 Reduce model temperatures to 0. 2024-12-20 13:41:27 -05:00
AI Christianson 36b80038ca Disable PAGERs for shell commands so agent can work autonomously 2024-12-19 17:42:40 -05:00
AI Christianson fd24484939 Handle keyboard interrupt (ctrl-c.) 2024-12-19 17:36:51 -05:00
AI Christianson c4efac339a Handle keyboard interrupt (ctrl-c.) 2024-12-19 17:35:35 -05:00
AI Christianson 5ad8aeb013 Shorten programmer tool docstring for better compatibility. 2024-12-19 16:25:04 -05:00
AI Christianson 1a0c72075d Stop using rules for output formatting. 2024-12-19 15:59:15 -05:00
AI Christianson d7f8a45916 Fix duplicate task completed panel. 2024-12-19 15:17:54 -05:00
AI Christianson 0c6b4f98b3 Improve task completed panel. 2024-12-19 15:08:11 -05:00
AI Christianson 5029106bdd Use Rich padding. 2024-12-19 15:05:00 -05:00
AI Christianson 22aeb2812d Clean up display. 2024-12-19 14:56:24 -05:00
AI Christianson 5d579246d5 Fix import. 2024-12-19 14:40:04 -05:00
AI Christianson da1ae5676b Clean up imports. 2024-12-19 14:09:38 -05:00
AI Christianson bfb4453f11 Refactor: extract tool configs. 2024-12-19 14:08:53 -05:00
AI Christianson 86d5fae30f General fixes and README.md update 2024-12-19 13:54:12 -05:00
AI Christianson dad913b7fe - Added ask_human tool to allow human operator to answer questions asked by the agent. 2024-12-19 13:34:43 -05:00
AI Christianson 2c6a8cd000 Fix prompt template consistency. 2024-12-19 13:12:05 -05:00
AI Christianson 8ebf5bf23e Improve ripgrep tool status output. 2024-12-19 12:43:08 -05:00
AI Christianson 565dee74cf Adjust prompts based on tool availability/flags. 2024-12-19 12:37:18 -05:00
AI Christianson c6668fa866 Get rid of implementation args as they are not used. 2024-12-19 12:24:23 -05:00
AI Christianson 58622b8357 Make delete_tasks tool available to planning agent. 2024-12-19 12:20:38 -05:00
AI Christianson e392f6e0f1 update readme 2024-12-19 09:26:58 -05:00
AI Christianson 4bf8b8f88f update readme 2024-12-19 09:25:14 -05:00
AI Christianson be7041a814 update readme 2024-12-19 09:24:49 -05:00
AI Christianson b73e692de6 update readme 2024-12-19 09:23:57 -05:00
363 changed files with 85202 additions and 2715 deletions

12
.githooks/pre-push Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
echo "Running tests before push..."
make test
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "Tests failed. Push aborted."
exit 1
fi
exit 0

6
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"

View File

@ -23,7 +23,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
python-version: '3.12'
# Step 3: Install Normal and Dev Dependencies
- name: Install Dependencies

34
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,34 @@
name: Tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# Cancel any in-progress job or run
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
matrix:
python-version: ["3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Setup and Run Tests
run: |
make setup-dev
make test

13
.gitignore vendored
View File

@ -6,3 +6,16 @@ __pycache__/
/work
/dist
/.ra-aid
.coverage
/.venv
/venv
/.idea
/htmlcov
.envrc
appmap.log
*.swp
/vsc/node_modules
/vsc/dist
node_modules/
/frontend/common/dist
/frontend/web/dist/

1
.python-version Normal file
View File

@ -0,0 +1 @@
3.12.7

27
.replit Normal file
View File

@ -0,0 +1,27 @@
modules = ["python-3.10:v18-20230807-322e88b"]
run = "ra-aid --chat"
[nix]
channel = "stable-24_05"
[deployment]
run = ["sh", "-c", "ra-aid --chat"]
[env]
VIRTUAL_ENV = "/home/runner/${REPL_SLUG}/venv"
PATH = "${VIRTUAL_ENV}/bin:/home/runner/${REPL_SLUG}/.config/npm/node_global/bin:${PATH}"
PYTHONPATH = "$PYTHONPATH:/home/runner/${REPL_SLUG}"
# Package installation
[packager]
language = "python3"
ignoredPackages = ["unit_tests"]
[packager.features]
enabledForHosting = false
packageSearch = true
guessImports = true
[unitTest]
language = "python3"

View File

@ -5,6 +5,404 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.17.1] 2025-03-13
### Fixed
- Fixed bug with `process_thinking_content` function by moving it from `agent_utils` to `ra_aid.text.processing` module
- Fixed config parameter handling in research request functions
- Updated development setup instructions in README to use `pip install -e ".[dev]"` instead of `pip install -r requirements-dev.txt`
## [0.17.0] 2025-03-12
### Added
- Added support for think tags in models with the new extract_think_tag function
- Enhanced CiaynAgent and expert tool to extract and display thinking content from <think>...</think> tags
- Added model parameters for think tag support
- Added comprehensive testing for think tag functionality
- Added `--show-thoughts` flag to show thoughts of thinking models
- Added `--show-cost` flag to display cost information during agent operations
- Enhanced cost tracking with AnthropicCallbackHandler for monitoring token usage and costs
- Added Session and Trajectory models to track application state and agent actions
- Added comprehensive environment inventory system for collecting and providing system information to agents
- Added repository implementations for Session and Trajectory models
- Added support for reasoning assistance in research phase
- Added new config parameters for managing cost display and reasoning assistance
### Changed
- Updated langchain/langgraph deps
- Improved trajectory tracking for better debugging and analysis
- Enhanced prompts throughout the system for better performance
- Improved token management with better handling of thinking tokens in Claude models
- Updated project information inclusion in prompts
- Reorganized agent code with better extraction of core functionality
- Refactored anthropic token limiting for better control over token usage
### Fixed
- Fixed binary file detection
- Fixed environment inventory sorting
- Fixed token limiter functionality
- Various test improvements and fixes
## [0.16.1] 2025-03-07
### Changed
- Replaced thread-local storage with contextvars in agent_context.py for better context isolation
- Improved React agent execution with LangGraph's interrupt mechanism
- Enhanced _run_agent_stream function to properly handle agent state and continuation
### Fixed
- Fixed tests to work with the new implementation
## [0.16.0] 2025-03-07
### Added
- Database-backed memory system with SQLite (.ra-aid/pk.db)
- Repository pattern for memory access (KeyFactRepository, KeySnippetRepository, ResearchNoteRepository)
- Memory garbage collection with configurable thresholds
- "--wipe-project-memory" flag to reset memory
- Memory statistics in status panel
- Propagation depth control for agent_should_exit
- Fixed string parameter for ripgrep tool
- Support for Claude 3.7 Sonnet thinking tokens in expert tool
### Changed
- Enhanced file logging with support for .ra-aid/logs/
- Improved CiaynAgent with better tool validation and execution
- Memory-related prompt improvements
### Fixed
- Various bug fixes in tool execution
- Test improvements for memory system
## [0.15.2] - 2025-02-27
### Added
- Added agent_should_exit context functionality with propagation to parent contexts
- Improved agent crash detection with non-propagating crash state
- Enhanced ripgrep tool with better context support
- Improved agent context inheritance
- Added comprehensive test coverage for exit and crash handling
## [0.15.1] - 2025-02-27
### Fixed
- Improved chat prompt to prevent endless loop behavior with sonnet 3.7.
## [0.15.0] - 2025-02-27
### Added
- Added database infrastructure with models, connections, and migrations
- Added agent context system for improved context management
- Added aider-free mode with command line option to disable aider-related functionality
- Added database-related dependencies
### Changed
- Improved file editing tools with enhanced functionality
- Enhanced agent implementation tools with modified return values and logic
- Improved agent tool prompts for better clarity and effectiveness
- Fixed langgraph prebuilt dependency
### Fixed
- Fixed project state detection logic with added tests
## [0.14.9] - 2025-02-25
### Added
- Added binary file detection and filtering to prevent binary files from being added to related files
- Added python-magic dependency for improved binary file detection
- Added support for "thinking" budget parameter for Claude 3.7 Sonnet
### Changed
- Updated dependencies:
- langchain-anthropic from 0.3.7 to 0.3.8
- langchain-google-genai from 2.0.10 to 2.0.11
- Improved shell command tool description to recommend keeping commands under 300 words
- Enhanced binary file filtering to include detailed reporting of skipped files
- Updated test assertions to be more flexible with parameter checking
## [0.14.8] - 2025-02-25
### Changed
- Improved programmer.py tool prompts for better clarity on related files visibility
- Enhanced programmer tool to remind users to call emit_related_files on any new files created
- Updated README.md to use media queries for showing different logos based on color scheme preference
## [0.14.7] - 2025-02-25
### Added
- Windows compatibility improvements
- Add error handling for Windows-specific modules
- Add Windows-specific tests for compatibility
### Changed
- Improve cross-platform support in interactive.py
- WebUI improvements
- Improve message display
- Add syntax highlighting
- Add animations
- Expert tool prompt improvements
### Fixed
- WebUI improvements
- Fix WebSocket communication
- Interactive command handling improvements
- Fix interactive history capture
- Fix command capture bugs
- Multiple fixes for interactive command execution on both Linux and Windows
- Enhance error handling for interactive processes
## [0.14.6] - 2025-02-25
### Added
- Added `--no-git` flag to aider commands to prevent git operations
### Changed
- Updated aider-chat dependency from 0.75 to 0.75.1
- Improved prompts for better tool effectiveness
- Enhanced emit_key_snippet documentation to focus on upcoming work relevance
## [0.14.5] - 2025-02-24
### Changed
- Optimized prompts
## [0.14.4] - 2025-02-24
### Changed
- Updated aider-chat dependency from 0.74.2 to 0.75
- Improved tool calling performance by minimizing tool return values
- Replaced emit_key_snippets with emit_key_snippet for simpler code snippet management
- Simplified return values for multiple tools to improve tool calling accuracy
- Updated tool prompts to remove unnecessary context cleanup references
- Reorganized order of tools in read-only tools list
### Fixed
- Fixed tests to align with updated tool return values
- Updated test assertions to match new simplified tool outputs
## [0.14.3] - 2025-02-24
### Added
- Added support for Claude 3.7 Sonnet model
- Added version display in startup configuration panel
### Changed
- Updated language library dependencies (langgraph, langchain-core, langchain, langchain-openai, langchain-google-genai)
- Changed default Anthropic model from Claude 3.5 Sonnet to Claude 3.7 Sonnet
### Fixed
- Fixed f-string syntax error in write_file.py
- Fixed bug where model selection on Anthropic was always using default instead of respecting user selection
- Fixed Anthropic key error message to reference the correct variable
- Added test for user-specified Anthropic model selection
## [0.14.2] - 2025-02-19
### Added
- Added automatic fallback mechanism to alternative LLM models on consecutive failures
- Added FallbackHandler class to manage tool failures and fallback logic
- Added console notification for tool fallback activation
- Added detailed fallback configuration options in command line arguments
- Added validation for required environment variables for LLM providers
### Changed
- Enhanced CiaynAgent to handle chat history and improve context management
- Improved error handling and logging in fallback mechanism
- Streamlined fallback model selection and invocation process
- Refactored agent stream handling for better clarity
- Reduced maximum tool failures from 3 to 2
### Fixed
- Fixed tool execution error handling and retry logic
- Enhanced error resilience and user experience with fallback handler
- Improved error message formatting and logging
- Updated error handling to include base message for better debugging
## [0.14.1] - 2025-02-13
### Added
- Added expected_runtime_seconds parameter for shell commands with graceful process shutdown
- Added config printing at startup (#88)
### Changed
- Enforce byte limit in interactive commands
- Normalize/dedupe related file paths
- Relax aider version requirement for SWE-bench compatibility
- Upgrade langchain/langgraph dependencies
### Fixed
- Fixed aider flags (#89)
- Fixed write_file_tool references
## [0.14.0] - 2025-02-12
### Added
- Status panel showing tool/LLM status and outputs
- Automatic detection of OpenAI expert models
- Timeouts on LLM clients
### Changed
- Improved interactive TTY process capture and history handling
- Upgraded langgraph dependencies
- Improved prompts and work logging
- Refined token/bytes ratio handling
- Support default temperature on per-model basis
- Reduced tool count for more reliable tool calling
- Updated logo and branding assets
- Set environment variables to disable common interactive modes
### Fixed
- Various test fixes
- Bug fixes for completion message handling and file content operations
- Interactive command input improvements
- Use reasoning_effort=high for OpenAI expert models
- Do not default to o1 model (#82)
- Make current working directory and date available to more agents
## [0.13.2] - 2025-02-02
- Fix temperature parameter error for expert tool.
## [0.13.1] - 2025-01-31
### Added
- WebUI (#61)
- Support o3-mini
### Changed
- Convert list input to string to handle create-react-agent tool calls correctly (#66)
- Add commands for code checking and fixing using ruff (#63)
### Fixed
- Fix token estimation
- Fix tests
- Prevent duplicate files (#64)
- Ensure default temperature is set correctly for different providers
- Do not incorrectly give temp parameter to expert model
- Correcting URLs that were referencing ai-christianson/ra-aid - should be ai-christianson/RA.Aid (#69)
### Improved
- Integrate litellm to retrieve model token limits for better flexibility (#51)
- Handle user defined test cmd (#59)
- Run tests during Github CICD (#58)
- Refactor models_tokens to be models_params so we can track multiple parameters on a per-model basis.
## [0.13.0] - 2025-01-22
### Added
- Added Deepseek Provider Support and Custom Deepseek Reasoner Chat Model (#50)
- Added Aider config File Argument Support (#43)
- Added configurable --recursion-limit argument (#46)
- Set Default Max Token Limit with Provider/Model Dictionary (#45)
### Changed
- Updated aider-chat version from 0.69.1 to 0.72.1 (#47)
### Fixed
- Fixed Issue 42 related to Levenshtein (#44)
### Improved
- Various prompt improvements
- Better handling of 429 errors on openrouter
- Improved project info handling and token usage optimization
- Extracted tool reflection functionality
- Improved work log handling
- Added tests for CiaynAgent._does_not_conform_to_pattern
## [0.12.1] - 2025-01-08
- Fix bug where directories are added as related files.
## [0.12.0] - 2025-01-04
### Added
- Google Gemini AI provider support
- Dependency check functionality in ra_aid/dependencies.py
- Test coverage reporting to pytest commands
### Changed
- Updated minimum Python requirement to 3.9
- Updated OpenAI model defaults
- Modified test files to support new Gemini provider
- Updated SWE-bench dataset generation script with UV package management
### Fixed
- Date-based assertions in directory listing tests
## [0.11.3] - 2024-12-30
- MacOS fixes.
## [0.11.2] - 2024-12-30
- Fix SyntaxError: f-string expression part cannot include a backslash.
## [0.11.1] - 2024-12-29
- Improve prompts.
- Fix issue #24.
## [0.11.0] - 2024-12-28
- Add CiaynAgent to support models that do not have, or are not good at, agentic function calling.
- Improve env var validation.
- Add --temperature CLI parameter.
## [0.10.3] - 2024-12-27
- Fix logging on interrupt.
- Fix web research prompt.
- Simplify planning stage by executing tasks directly.
- Make research notes available to more agents/tools.
## [0.10.2] - 2024-12-26
- Add logging.
- Fix bug where anthropic is used in chat mode even if another provider is specified.
## [0.10.0] - 2024-12-24
- Added new web research agent.
## [0.9.1] - 2024-12-23
- Fix ask human multiline continuation.
## [0.9.0] - 2024-12-23
- Improve agent interruption UX by allowing user to specify feedback or exit the program entirely.
- Do not put file ID in file paths when reading for expert context.
- Agents log work internally, improving context information.
- Clear task list when plan is completed.
## [0.8.2] - 2024-12-23
- Optimize first prompt in chat mode to avoid unnecessary LLM call.
## [0.8.1] - 2024-12-22
- Improved prompts.
## [0.8.0] - 2024-12-22
- Chat mode.
- Allow agents to be interrupted.
## [0.7.1] - 2024-12-20
- Fix model parameters.
## [0.7.0] - 2024-12-20
- Make delete_tasks tool available to planning agent.
- Get rid of implementation args as they are not used.
- Improve ripgrep tool status output.
- Added ask_human tool to allow human operator to answer questions asked by the agent.
- Handle keyboard interrupt (ctrl-c.)
- Disable PAGERs for shell commands so agent can work autonomously.
- Reduce model temperatures to 0.
- Update dependencies.
## [0.6.4] - 2024-12-19
- Added monorepo_detected, existing_project_detected, and ui_detected tools so the agent can take specific actions.

View File

@ -1,4 +1,4 @@
include README.md
include LICENSE
include requirements*.txt
recursive-include agent_langchain *.py
include README.md
include CHANGELOG.md
recursive-include ra_aid/server/static *

22
Makefile Normal file
View File

@ -0,0 +1,22 @@
.PHONY: test setup-dev setup-hooks
test:
# for future consideration append --cov-fail-under=80 to fail test coverage if below 80%
python -m pytest --cov=ra_aid --cov-report=term-missing --cov-report=html
setup-dev:
pip install -e ".[dev]"
setup-hooks: setup-dev
pre-commit install
check:
ruff check
fix:
ruff check . --select I --fix # First sort imports
ruff format .
ruff check --fix
fix-basic:
ruff check --fix

468
README.md
View File

@ -1,31 +1,51 @@
```ascii
██▀███ ▄▄▄ ▄▄▄ ██▓▓█████▄
▓██ ▒ ██▒▒████▄ ▒████▄ ▓██▒▒██▀ ██▌
▓██ ░▄█ ▒▒██ ▀█▄ ▒██ ▀█▄ ▒██▒░██ █▌
▒██▀▀█▄ ░██▄▄▄▄██ ░██▄▄▄▄██ ░██░░▓█▄ ▌
░██▓ ▒██▒ ▓█ ▓██▒ ██▓ ▓█ ▓██▒░██░░▒████▓
░ ▒▓ ░▒▓░ ▒▒ ▓▒█░ ▒▓▒ ▒▒ ▓▒█░░▓ ▒▒▓ ▒
░▒ ░ ▒░ ▒ ▒▒ ░ ░▒ ▒ ▒▒ ░ ▒ ░ ░ ▒ ▒
░░ ░ ░ ▒ ░ ░ ▒ ▒ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░
░ ░
```
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-white-transparent.gif">
<source media="(prefers-color-scheme: light)" srcset="assets/logo-black-transparent.png">
<img src="assets/logo-black-transparent.png" alt="RA.Aid - Develop software autonomously." style="margin-bottom: 20px;">
</picture>
[![Python Versions](https://img.shields.io/badge/python-3.8%2B-blue)](https://www.python.org)
[![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE)
[![Status](https://img.shields.io/badge/status-Beta-yellow)]()
# RA.Aid
**Develop software autonomously.**
**RA.Aid is an AI software development agent.**
RA.Aid (pronounced "raid") helps you develop software autonomously. It is a standalone coding agent built on LangGraph's agent-based task execution framework. The tool provides an intelligent assistant that can help with research, planning, and implementation of multi-step development tasks. RA.Aid can optionally integrate with `aider` (https://aider.chat/) via the `--use-aider` flag to leverage its specialized code editing capabilities.
RA.Aid (ReAct Aid) was made by putting `aider` (https://aider.chat/) in a LangChain ReAct agent loop. This unique combination allows developers to leverage aider's code editing capabilities while benefiting from LangChain's agent-based task execution framework. The tool provides an intelligent assistant that can help with research, planning, and implementation of multi-step development tasks.
The result is **near-fully-autonomous software development**.
**Enjoying RA.Aid?** Show your support by giving us a star ⭐ on [GitHub](https://github.com/ai-christianson/RA.Aid)!
Here's a demo of RA.Aid adding a feature to itself:
<img src="assets/demo-ra-aid-task-1.gif" alt="RA.Aid Demo" autoplay loop style="width: 100%; max-width: 800px;">
## Documentation
Complete documentation is available at https://docs.ra-aid.ai
Key sections:
- [Installation Guide](https://docs.ra-aid.ai/quickstart/installation)
- [Recommended Configuration](https://docs.ra-aid.ai/quickstart/recommended)
- [Open Models Setup](https://docs.ra-aid.ai/quickstart/open-models)
- [Usage Examples](https://docs.ra-aid.ai/category/usage)
- [Logging System](https://docs.ra-aid.ai/configuration/logging)
- [Memory Management](https://docs.ra-aid.ai/configuration/memory-management)
- [Contributing Guide](https://docs.ra-aid.ai/contributing)
- [Getting Help](https://docs.ra-aid.ai/getting-help)
## Table of Contents
- [Features](#features)
- [Installation](#installation)
- [Usage](#usage)
- [Architecture](#architecture)
- [Dependencies](#dependencies)
- [Development Setup](#development-setup)
- [Contributing](#contributing)
- [License](#license)
- [Contact](#contact)
> 👋 **Pull requests are very welcome!** Have ideas for how to impove RA.Aid? Don't be shy - your help makes a real difference!
>
> 💬 **Join our Discord community:** [Click here to join](https://discord.gg/f6wYbzHYxV)
@ -43,6 +63,10 @@ Here's a demo of RA.Aid adding a feature to itself:
- **Automated Command Execution**: The agent can run shell commands automatically to accomplish tasks. While this makes it powerful, it also means you should carefully review its actions.
- **Ability to Leverage Expert Reasoning Models**: The agent can use advanced reasoning models such as OpenAI's o1 *just when needed*, e.g. to solve complex debugging problems or in planning for complex feature implementation.
- **Web Research Capabilities**: Leverages Tavily API for intelligent web searches to enhance research and gather real-world context for development tasks
- **Three-Stage Architecture**:
1. **Research**: Analyzes codebases and gathers context
2. **Planning**: Breaks down tasks into specific, actionable steps
@ -56,27 +80,16 @@ What sets RA.Aid apart is its ability to handle complex programming tasks that e
- Provide detailed explanations of existing code structure and functionality
- Execute sophisticated refactoring operations with proper planning
## Table of Contents
- [Features](#features)
- [Installation](#installation)
- [Usage](#usage)
- [Architecture](#architecture)
- [Dependencies](#dependencies)
- [Development Setup](#development-setup)
- [Contributing](#contributing)
- [License](#license)
- [Contact](#contact)
## Features
- **Three-Stage Architecture**: The workflow consists of three powerful stages:
1. **Research** 🔍 - Gather and analyze information
2. **Planning** 📋 - Develop execution strategy
3. **Implementation** ⚡ - Execute the plan with AI assistance
Each stage is powered by dedicated AI agents and specialized toolsets.
- **Advanced AI Integration**: Built on LangChain and leverages the latest LLMs for natural language understanding and generation.
- **Human-in-the-Loop Interaction**: Optional mode that enables the agent to ask you questions during task execution, ensuring higher accuracy and better handling of complex tasks that may require your input or clarification
- **Comprehensive Toolset**:
- Shell command execution
- Expert querying system
@ -90,6 +103,31 @@ What sets RA.Aid apart is its ability to handle complex programming tasks that e
## Installation
### Windows Installation
1. Install Python 3.8 or higher from [python.org](https://www.python.org/downloads/)
2. Install required system dependencies:
```powershell
# Install Chocolatey if not already installed (run in admin PowerShell)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install ripgrep using Chocolatey
choco install ripgrep
```
3. Install RA.Aid:
```powershell
pip install ra-aid
```
4. Install Windows-specific dependencies:
```powershell
pip install pywin32
```
5. Set up your API keys in a `.env` file:
```env
ANTHROPIC_API_KEY=your_anthropic_key
OPENAI_API_KEY=your_openai_key
```
### Unix/Linux Installation
RA.Aid can be installed directly using pip:
```bash
@ -98,14 +136,7 @@ pip install ra-aid
### Prerequisites
Before using RA.Aid, you'll need:
1. Python package `aider` installed and available in your PATH:
```bash
pip install aider-chat
```
2. API keys for the required AI services:
Before using RA.Aid, you'll need API keys for the required AI services:
```bash
# Set up API keys based on your preferred provider:
@ -113,7 +144,7 @@ pip install aider-chat
# For Anthropic Claude models (recommended)
export ANTHROPIC_API_KEY=your_api_key_here
# For OpenAI models
# For OpenAI models (optional)
export OPENAI_API_KEY=your_api_key_here
# For OpenRouter provider (optional)
@ -121,9 +152,15 @@ export OPENROUTER_API_KEY=your_api_key_here
# For OpenAI-compatible providers (optional)
export OPENAI_API_BASE=your_api_base_url
# For Gemini provider (optional)
export GEMINI_API_KEY=your_api_key_here
# For web research capabilities
export TAVILY_API_KEY=your_api_key_here
```
Note: The programmer tool (aider) will automatically select its model based on your available API keys:
Note: When using the `--use-aider` flag, the programmer tool (aider) will automatically select its model based on your available API keys:
- If ANTHROPIC_API_KEY is set, it will use Claude models
- If only OPENAI_API_KEY is set, it will use OpenAI models
- You can set multiple API keys to enable different features
@ -132,6 +169,9 @@ You can get your API keys from:
- Anthropic API key: https://console.anthropic.com/
- OpenAI API key: https://platform.openai.com/api-keys
- OpenRouter API key: https://openrouter.ai/keys
- Gemini API key: https://aistudio.google.com/app/apikey
Complete installation documentation is available in our [Installation Guide](https://docs.ra-aid.ai/quickstart/installation).
## Usage
@ -143,102 +183,52 @@ ra-aid -m "Your task or query here"
# Research-only mode (no implementation)
ra-aid -m "Explain the authentication flow" --research-only
# File logging with console warnings (default mode)
ra-aid -m "Add new feature" --log-mode file
# Console-only logging with detailed output
ra-aid -m "Add new feature" --log-mode console --log-level debug
```
More information is available in our [Usage Examples](https://docs.ra-aid.ai/category/usage), [Logging System](https://docs.ra-aid.ai/configuration/logging), and [Memory Management](https://docs.ra-aid.ai/configuration/memory-management) documentation.
### Command Line Options
- `-m, --message`: The task or query to be executed (required)
- `-m, --message`: The task or query to be executed (required except in chat mode)
- `--research-only`: Only perform research without implementation
- `--provider`: The LLM provider to use (choices: anthropic, openai, openrouter, openai-compatible, gemini)
- `--model`: The model name to use (required for non-Anthropic providers)
- `--use-aider`: Enable aider integration for code editing. When enabled, RA.Aid uses aider's specialized code editing capabilities instead of its own native file modification tools. This option is useful when you need aider's specific editing features or prefer its approach to code modifications. This feature is optional and disabled by default.
- `--research-provider`: Provider to use specifically for research tasks (falls back to --provider if not specified)
- `--research-model`: Model to use specifically for research tasks (falls back to --model if not specified)
- `--planner-provider`: Provider to use specifically for planning tasks (falls back to --provider if not specified)
- `--planner-model`: Model to use specifically for planning tasks (falls back to --model if not specified)
- `--cowboy-mode`: Skip interactive approval for shell commands
- `--provider`: Specify the model provider (See Model Configuration section)
- `--model`: Specify the model name (See Model Configuration section)
- `--expert-provider`: Specify the provider for the expert tool (defaults to OpenAI)
- `--expert-model`: Specify the model name for the expert tool (defaults to o1-preview for OpenAI)
### Model Configuration
RA.Aid supports multiple AI providers and models. The default model is Anthropic's Claude 3 Sonnet (`claude-3-5-sonnet-20241022`).
The programmer tool (aider) automatically selects its model based on your available API keys. It will use Claude models if ANTHROPIC_API_KEY is set, or fall back to OpenAI models if only OPENAI_API_KEY is available.
Note: The expert tool can be configured to use different providers (OpenAI, Anthropic, OpenRouter) using the --expert-provider flag along with the corresponding EXPERT_*API_KEY environment variables. Each provider requires its own API key set through the appropriate environment variable.
#### Environment Variables
RA.Aid supports multiple providers through environment variables:
- `ANTHROPIC_API_KEY`: Required for the default Anthropic provider
- `OPENAI_API_KEY`: Required for OpenAI provider
- `OPENROUTER_API_KEY`: Required for OpenRouter provider
- `OPENAI_API_BASE`: Required for OpenAI-compatible providers along with `OPENAI_API_KEY`
Expert Tool Environment Variables:
- `EXPERT_OPENAI_API_KEY`: API key for expert tool using OpenAI provider
- `EXPERT_ANTHROPIC_API_KEY`: API key for expert tool using Anthropic provider
- `EXPERT_OPENROUTER_API_KEY`: API key for expert tool using OpenRouter provider
- `EXPERT_OPENAI_API_BASE`: Base URL for expert tool using OpenAI-compatible provider
You can set these permanently in your shell's configuration file (e.g., `~/.bashrc` or `~/.zshrc`):
```bash
# Default provider (Anthropic)
export ANTHROPIC_API_KEY=your_api_key_here
# For OpenAI features and expert tool
export OPENAI_API_KEY=your_api_key_here
# For OpenRouter provider
export OPENROUTER_API_KEY=your_api_key_here
# For OpenAI-compatible providers
export OPENAI_API_BASE=your_api_base_url
```
Note: The expert tool defaults to OpenAI's o1-preview model with the OpenAI provider, but this can be configured using the --expert-provider flag along with the corresponding EXPERT_*_KEY environment variables.
#### Examples
1. **Using Anthropic (Default)**
```bash
# Uses default model (claude-3-5-sonnet-20241022)
ra-aid -m "Your task"
# Or explicitly specify:
ra-aid -m "Your task" --provider anthropic --model claude-3-5-sonnet-20241022
```
2. **Using OpenAI**
```bash
ra-aid -m "Your task" --provider openai --model gpt-4o
```
3. **Using OpenRouter**
```bash
ra-aid -m "Your task" --provider openrouter --model mistralai/mistral-large-2411
```
4. **Configuring Expert Provider**
The expert tool is used by the agent for complex logic and debugging tasks. It can be configured to use different providers (OpenAI, Anthropic, OpenRouter) using the --expert-provider flag along with the corresponding EXPERT_*API_KEY environment variables.
```bash
# Use Anthropic for expert tool
export EXPERT_ANTHROPIC_API_KEY=your_anthropic_api_key
ra-aid -m "Your task" --expert-provider anthropic --expert-model claude-3-5-sonnet-20241022
# Use OpenRouter for expert tool
export OPENROUTER_API_KEY=your_openrouter_api_key
ra-aid -m "Your task" --expert-provider openrouter --expert-model mistralai/mistral-large-2411
# Use default OpenAI for expert tool
export EXPERT_OPENAI_API_KEY=your_openai_api_key
ra-aid -m "Your task" --expert-provider openai --expert-model o1-preview
```
**Important Notes:**
- Performance varies between models. The default Claude 3 Sonnet model currently provides the best and most reliable results.
- Model configuration is done via command line arguments: `--provider` and `--model`
- The `--model` argument is required for all providers except Anthropic (which defaults to `claude-3-5-sonnet-20241022`)
- `--expert-provider`: The LLM provider to use for expert knowledge queries (choices: anthropic, openai, openrouter, openai-compatible, gemini)
- `--expert-model`: The model name to use for expert knowledge queries (required for non-OpenAI providers)
- `--hil, -H`: Enable human-in-the-loop mode for interactive assistance during task execution
- `--chat`: Enable chat mode with direct human interaction (implies --hil)
- `--log-mode`: Logging mode (choices: file, console)
- `file` (default): Logs to both file and console (only warnings and errors to console)
- `console`: Logs to console only at the specified log level with no file logging
- `--log-level`: Set specific logging level (debug, info, warning, error, critical)
- With `--log-mode=file`: Controls the file logging level (console still shows only warnings+)
- With `--log-mode=console`: Controls the console logging level directly
- Default: warning
- `--experimental-fallback-handler`: Enable experimental fallback handler to attempt to fix too calls when the same tool fails 3 times consecutively. (OPENAI_API_KEY recommended as openai has the top 5 tool calling models.) See `ra_aid/tool_leaderboard.py` for more info.
- `--pretty-logger`: Enables colored panel-style formatted logging output for better readability.
- `--temperature`: LLM temperature (0.0-2.0) to control randomness in responses
- `--disable-limit-tokens`: Disable token limiting for Anthropic Claude react agents
- `--recursion-limit`: Maximum recursion depth for agent operations (default: 100)
- `--test-cmd`: Custom command to run tests. If set user will be asked if they want to run the test command
- `--auto-test`: Automatically run tests after each code change
- `--max-test-cmd-retries`: Maximum number of test command retry attempts (default: 3)
- `--test-cmd-timeout`: Timeout in seconds for test command execution (default: 300)
- `--version`: Show program version number and exit
- `--server`: Launch the server with web interface (alpha feature)
- `--server-host`: Host to listen on for server (default: 0.0.0.0) (alpha feature)
- `--server-port`: Port to listen on for server (default: 1818) (alpha feature)
### Example Tasks
@ -272,6 +262,88 @@ Note: The expert tool defaults to OpenAI's o1-preview model with the OpenAI prov
ra-aid -m "Refactor the database connection code to use connection pooling" --cowboy-mode
```
### Human-in-the-Loop Mode
Enable interactive mode to allow the agent to ask you questions during task execution:
```bash
ra-aid -m "Implement a new feature" --hil
# or
ra-aid -m "Implement a new feature" -H
```
This mode is particularly useful for:
- Complex tasks requiring human judgment
- Clarifying ambiguous requirements
- Making architectural decisions
- Validating critical changes
- Providing domain-specific knowledge
### Web Research
<img src="assets/demo-web-research-1.gif" alt="RA.Aid Demo" autoplay loop style="width: 100%; max-width: 800px;">
The agent features autonomous web research capabilities powered by the [Tavily](https://tavily.com/) API, seamlessly integrating real-world information into its problem-solving workflow. Web research is conducted automatically when the agent determines additional context would be valuable - no explicit configuration required.
For example, when researching modern authentication practices or investigating new API requirements, the agent will autonomously:
- Search for current best practices and security recommendations
- Find relevant documentation and technical specifications
- Gather real-world implementation examples
- Stay updated on latest industry standards
While web research happens automatically as needed, you can also explicitly request research-focused tasks:
```bash
# Focused research task with web search capabilities
ra-aid -m "Research current best practices for API rate limiting" --research-only
```
Make sure to set your TAVILY_API_KEY environment variable to enable this feature.
### Chat Mode
<img src="assets/demo-chat-mode-1.gif" alt="Chat Mode Demo" autoplay loop style="display: block; margin: 0 auto; width: 100%; max-width: 800px;">
Enable with `--chat` to transform ra-aid into an interactive assistant that guides you through research and implementation tasks. Have a natural conversation about what you want to build, explore options together, and dispatch work - all while maintaining context of your discussion. Perfect for when you want to think through problems collaboratively rather than just executing commands.
### Server with Web Interface
RA.Aid includes a modern server with web interface that provides:
- Beautiful dark-themed chat interface
- Real-time streaming of command output
- Request history with quick resubmission
- Responsive design that works on all devices
To launch the server with web interface:
```bash
# Start with default settings (0.0.0.0:1818)
ra-aid --server
# Specify custom host and port
ra-aid --server --server-host 127.0.0.1 --server-port 3000
```
Command line options for server with web interface:
- `--server`: Launch the server with web interface
- `--server-host`: Host to listen on (default: 0.0.0.0)
- `--server-port`: Port to listen on (default: 1818)
After starting the server, open your web browser to the displayed URL (e.g., http://localhost:1818). The interface provides:
- Left sidebar showing request history
- Main chat area with real-time output
- Input box for typing requests
- Automatic reconnection handling
- Error reporting and status messages
All ra-aid commands sent through the web interface automatically use cowboy mode for seamless execution.
### Command Interruption and Feedback
<img src="assets/demo-chat-mode-interrupted-1.gif" alt="Command Interrupt Demo" autoplay loop style="display: block; margin: 0 auto; width: 100%; max-width: 800px;">
You can interrupt the agent at any time by pressing `Ctrl-C`. This pauses the agent, allowing you to provide feedback, adjust your instructions, or steer the execution in a new direction. Press `Ctrl-C` again if you want to completely exit the program.
### Shell Command Automation with Cowboy Mode 🏇
The `--cowboy-mode` flag enables automated shell command execution without confirmation prompts. This is useful for:
@ -291,16 +363,131 @@ ra-aid -m "Update all deprecated API calls" --cowboy-mode
- Ensure you have a clean working tree before running
- Review changes in git diff before committing
### Environment Variables
### Model Configuration
See the [Model Configuration](#model-configuration) section for details on provider-specific environment variables.
RA.Aid supports multiple AI providers and models. The default model is Anthropic's Claude 3 Sonnet (`claude-3-7-sonnet-20250219`).
When using the `--use-aider` flag, the programmer tool (aider) automatically selects its model based on your available API keys. It will use Claude models if ANTHROPIC_API_KEY is set, or fall back to OpenAI models if only OPENAI_API_KEY is available.
Note: The expert tool can be configured to use different providers (OpenAI, Anthropic, OpenRouter, Gemini) using the --expert-provider flag along with the corresponding EXPERT_*API_KEY environment variables. Each provider requires its own API key set through the appropriate environment variable.
#### Environment Variables
RA.Aid supports multiple providers through environment variables:
- `ANTHROPIC_API_KEY`: Required for the default Anthropic provider
- `OPENAI_API_KEY`: Required for OpenAI provider
- `OPENROUTER_API_KEY`: Required for OpenRouter provider
- `DEEPSEEK_API_KEY`: Required for DeepSeek provider
- `OPENAI_API_BASE`: Required for OpenAI-compatible providers along with `OPENAI_API_KEY`
- `GEMINI_API_KEY`: Required for Gemini provider
Expert Tool Environment Variables:
- `EXPERT_OPENAI_API_KEY`: API key for expert tool using OpenAI provider
- `EXPERT_ANTHROPIC_API_KEY`: API key for expert tool using Anthropic provider
- `EXPERT_OPENROUTER_API_KEY`: API key for expert tool using OpenRouter provider
- `EXPERT_OPENAI_API_BASE`: Base URL for expert tool using OpenAI-compatible provider
- `EXPERT_GEMINI_API_KEY`: API key for expert tool using Gemini provider
- `EXPERT_DEEPSEEK_API_KEY`: API key for expert tool using DeepSeek provider
You can set these permanently in your shell's configuration file (e.g., `~/.bashrc` or `~/.zshrc`):
```bash
# Default provider (Anthropic)
export ANTHROPIC_API_KEY=your_api_key_here
# For OpenAI features and expert tool
export OPENAI_API_KEY=your_api_key_here
# For OpenRouter provider
export OPENROUTER_API_KEY=your_api_key_here
# For OpenAI-compatible providers
export OPENAI_API_BASE=your_api_base_url
# For Gemini provider
export GEMINI_API_KEY=your_api_key_here
```
### Custom Model Examples
1. **Using Anthropic (Default)**
```bash
# Uses default model (claude-3-7-sonnet-20250219)
ra-aid -m "Your task"
# Or explicitly specify:
ra-aid -m "Your task" --provider anthropic --model claude-3-5-sonnet-20241022
```
2. **Using OpenAI**
```bash
ra-aid -m "Your task" --provider openai --model gpt-4o
```
3. **Using OpenRouter**
```bash
ra-aid -m "Your task" --provider openrouter --model mistralai/mistral-large-2411
```
4. **Using DeepSeek**
```bash
# Direct DeepSeek provider (requires DEEPSEEK_API_KEY)
ra-aid -m "Your task" --provider deepseek --model deepseek-reasoner
# DeepSeek via OpenRouter
ra-aid -m "Your task" --provider openrouter --model deepseek/deepseek-r1
```
4. **Configuring Expert Provider**
The expert tool is used by the agent for complex logic and debugging tasks. It can be configured to use different providers (OpenAI, Anthropic, OpenRouter, Gemini, openai-compatible) using the --expert-provider flag along with the corresponding EXPERT_*API_KEY environment variables.
```bash
# Use Anthropic for expert tool
export EXPERT_ANTHROPIC_API_KEY=your_anthropic_api_key
ra-aid -m "Your task" --expert-provider anthropic --expert-model claude-3-5-sonnet-20241022
# Use OpenRouter for expert tool
export OPENROUTER_API_KEY=your_openrouter_api_key
ra-aid -m "Your task" --expert-provider openrouter --expert-model mistralai/mistral-large-2411
# Use DeepSeek for expert tool
export DEEPSEEK_API_KEY=your_deepseek_api_key
ra-aid -m "Your task" --expert-provider deepseek --expert-model deepseek-reasoner
# Use default OpenAI for expert tool
export EXPERT_OPENAI_API_KEY=your_openai_api_key
ra-aid -m "Your task" --expert-provider openai --expert-model o1
# Use Gemini for expert tool
export EXPERT_GEMINI_API_KEY=your_gemini_api_key
ra-aid -m "Your task" --expert-provider gemini --expert-model gemini-2.0-flash-thinking-exp-1219
```
Aider specific Environment Variables you can add:
- `AIDER_FLAGS`: Optional comma-separated list of flags to pass to the underlying aider tool (e.g., "yes-always,dark-mode")
```bash
# Optional: Configure aider behavior
export AIDER_FLAGS="yes-always,dark-mode,no-auto-commits"
```
Note: For `AIDER_FLAGS`, you can specify flags with or without the leading `--`. Multiple flags should be comma-separated, and spaces around flags are automatically handled. For example, both `"yes-always,dark-mode"` and `"--yes-always, --dark-mode"` are valid.
**Important Notes:**
- Performance varies between models. The default Claude 3 Sonnet model currently provides the best and most reliable results.
- Model configuration is done via command line arguments: `--provider` and `--model`
- The `--model` argument is required for all providers except Anthropic (which defaults to `claude-3-7-sonnet-20250219`)
More information is available in our [Open Models Setup](https://docs.ra-aid.ai/quickstart/open-models) guide.
## Architecture
RA.Aid implements a three-stage architecture for handling development and research tasks:
1. **Research Stage**:
1. **Research Stage**:
- Gathers information and context
- Analyzes requirements
- Identifies key components and dependencies
@ -326,6 +513,7 @@ RA.Aid implements a three-stage architecture for handling development and resear
### Core Dependencies
- `langchain-anthropic`: LangChain integration with Anthropic's Claude
- `tavily-python`: Tavily API client for web research
- `langgraph`: Graph-based workflow management
- `rich>=13.0.0`: Terminal formatting and output
- `GitPython==3.1.41`: Git repository management
@ -341,8 +529,8 @@ RA.Aid implements a three-stage architecture for handling development and resear
1. Clone the repository:
```bash
git clone https://github.com/ai-christianson/ra-aid.git
cd ra-aid
git clone https://github.com/ai-christianson/RA.Aid.git
cd RA.Aid
```
2. Create and activate a virtual environment:
@ -353,7 +541,7 @@ source venv/bin/activate # On Windows use `venv\Scripts\activate`
3. Install development dependencies:
```bash
pip install -r requirements-dev.txt
pip install -e ".[dev]"
```
4. Run tests:
@ -391,6 +579,8 @@ git push origin feature/your-feature-name
- Keep commits focused and message clear
- Ensure all tests pass before submitting PR
More information is available in our [Contributing Guide](https://docs.ra-aid.ai/contributing).
## License
This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
@ -399,6 +589,6 @@ Copyright (c) 2024 AI Christianson
## Contact
- **Issues**: Please report bugs and feature requests on our [Issue Tracker](https://github.com/ai-christianson/ra-aid/issues)
- **Repository**: [https://github.com/ai-christianson/ra-aid](https://github.com/ai-christianson/ra-aid)
- **Documentation**: [https://github.com/ai-christianson/ra-aid#readme](https://github.com/ai-christianson/ra-aid#readme)
- **Issues**: Please report bugs and feature requests on our [Issue Tracker](https://github.com/ai-christianson/RA.Aid/issues)
- **Repository**: [https://github.com/ai-christianson/RA.Aid](https://github.com/ai-christianson/RA.Aid)
- **Documentation**: [https://github.com/ai-christianson/RA.Aid#readme](https://github.com/ai-christianson/RA.Aid#readme)

20
adr/webui.md Normal file
View File

@ -0,0 +1,20 @@
# A couple thoughts:
1. I like that you're using websockets. I think a bi-directional message passing is what we will ultimately need, and this sets up the groundwork for that.
2. Since rn we're just sending raw ra-aid text output to the front-end, an easy win to make it render nicer would be to put it in a non-wrapping or similar.
3. I like the minimal html/js as an initial setup.
Thoughts for down the line if we merge this (the following would be in future PRs):
1. We'll ultimately want to stream structured objects from the agent
* Rn, the code has a ton of cases like console.print(Panel(panel_content, title="Expert Context", border_style="blue")). We will want to abstract these calls and have something like a send_agent_output function. Depending on config (e.g. CLI use vs web ui use), that would send an object onto the web socket stream, or send output to the console.
2. We need a way to send user inputs back to the agent, e.g. anything currently using stdin (we don't use stdin directly rn, but we do have things that use tty or prompt the user for input which ultimately do use stdin)
3. Tricky run_shell_command is really powerful, and it essentially passes fully interactive TTY through to the user. If we want to keep the same UX, we could do this potentially by using tty.js on the front-end and streaming the tty over websocket. Alternatively, we could simply disable TTY tools like run_shell_command or restrict them to a non-tty mode (e.g. simple command running, stdout/stderr capture only)
4. Ideally we should keep the websocket and any API endpoints friendly to machine endpoints. JSON objects over websocket + any JSON REST endpoints we might need would satisfy this.
5. The UX itself should be carefully considered. IMO one of the big benefits of a web UI is to be able to have the agent doing work which I can direct from a mobile device, so I think an efficient mobile-first UI would be ideal. For this, my initial thought was something like react + shadcn.
6. Initially I had considered https://socket.io/. In this PR, we're just going straight to websockets, which is cool and has one less dependency. Not sure if socket.io would be worth it, but wanted to mention it. The overall architecture wouldn't change.
7. Semi-related: we should have a way to send logs to a directory or to a logging backend.
@leonj1 I think starting with a small PR like this and then incrementally adding to the web UI is a good approach.
@sosacrazy126 would be interested in your thoughts since I know you were working on webui as well, want to respect the work you've done.

BIN
assets/RA-black-bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
assets/RA-black-square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
assets/demo-chat-mode-1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

BIN
assets/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

16
components.json Normal file
View File

@ -0,0 +1,16 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "frontend/common/tailwind.config.js",
"css": "frontend/common/src/styles/global.css",
"baseColor": "zinc",
"cssVariables": true
},
"aliases": {
"components": "@ra-aid/common/components",
"utils": "@ra-aid/common/utils"
}
}

20
docs/.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

41
docs/README.md Normal file
View File

@ -0,0 +1,41 @@
# Website
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
### Installation
```
$ yarn
```
### Local Development
```
$ yarn start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
### Build
```
$ yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
### Deployment
Using SSH:
```
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
$ GIT_USER=<Your GitHub username> yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

View File

@ -0,0 +1,8 @@
{
"label": "Configuration",
"position": 3,
"link": {
"type": "generated-index",
"description": "Configure RA.Aid for optimal performance and behavior."
}
}

View File

@ -0,0 +1,167 @@
# Logging System
RA.Aid includes a powerful and flexible logging system that helps you troubleshoot issues and monitor the tool's operation. This document explains how to configure and use the logging features effectively.
## Overview
The logging system in RA.Aid provides:
- Configurable logging modes for different use cases
- Multiple log levels for controlling verbosity
- File logging with rotation and backup capabilities
- Pretty console logging with formatted display
- Comprehensive log messages capturing agent activity
## Command Line Options
RA.Aid provides the following command line options to control logging behavior:
### Log Mode
The `--log-mode` option determines where logs are directed:
```bash
ra-aid -m "Add new feature" --log-mode file
```
Available modes:
- `file` (default): Logs are written to both file and console
- Console shows only warnings and errors
- File contains all logs at the specified log level
- `console`: Logs are only shown in the console at the specified log level
- No log files are created
### Log Level
The `--log-level` option controls the verbosity of logging:
```bash
ra-aid -m "Add new feature" --log-level debug
```
Available levels (case-insensitive):
- `debug`: Most verbose, includes detailed debugging information
- `info`: General information about operations
- `warning` (default): Potential issues that might need attention
- `error`: Error conditions that prevent normal operation
- `critical`: Critical errors that may cause the application to terminate
The log level affects different outputs depending on the log mode:
- With `--log-mode=file`: Controls the file logging level, while console still shows only warnings and errors
- With `--log-mode=console`: Controls the console logging level directly
### Pretty Logger
The `--pretty-logger` option enables formatted panel-style logging output:
```bash
ra-aid -m "Add new feature" --pretty-logger
```
When enabled, log messages appear in colored panels with titles indicating the log level:
- 🔥 CRITICAL: Bold red panels for critical errors
- ❌ ERROR: Red panels for errors
- ⚠️ WARNING: Yellow panels for warnings
- INFO: Green panels for informational messages
- 🐞 DEBUG: Blue panels for debug messages
## Log Files
When `--log-mode=file` is used, RA.Aid creates and maintains log files with the following characteristics:
### Location
Log files are stored in the `.ra-aid/logs/` directory in your current working directory:
```
.ra-aid/logs/ra_aid_YYYYMMDD_HHMMSS.log
```
RA.Aid automatically creates this directory if it doesn't exist.
### Naming Convention
Log files follow a timestamp-based naming pattern:
```
ra_aid_YYYYMMDD_HHMMSS.log
```
Where:
- `YYYYMMDD`: Year, month, and day when the log file was created
- `HHMMSS`: Hour, minute, and second when the log file was created
Example: `ra_aid_20250301_143027.log`
### Log Rotation
RA.Aid uses automatic log rotation to manage log file size and prevent excessive disk usage:
- Maximum file size: 5 MB
- Maximum backup files: 100
When a log file reaches 5 MB, it is renamed with a numeric suffix (e.g., `.1`, `.2`), and a new log file is created. Up to 100 backup files are maintained.
## Examples
### Basic Usage (Default)
Use the default file logging mode with warnings and errors:
```bash
ra-aid -m "Add new feature"
```
### Detailed File Logging
Log everything including debug messages to file (console still shows only warnings+):
```bash
ra-aid -m "Add new feature" --log-level debug
```
### Console-Only Debugging
Get detailed debug logs in the console without creating log files:
```bash
ra-aid -m "Add new feature" --log-mode console --log-level debug
```
### Informational Console Logging
Get informational console output without debug details:
```bash
ra-aid -m "Add new feature" --log-mode console --log-level info
```
### Pretty Logging Output
Use formatted panel-style logging for better readability:
```bash
ra-aid -m "Add new feature" --pretty-logger
```
## Debugging Tips
- For troubleshooting issues, start with `--log-mode console --log-level debug`
- Examine log files in `.ra-aid/logs/` for historical issues
- Use `--pretty-logger` when working with complex tasks for better log clarity
- For production use, the default settings (`--log-mode file --log-level warning`) provide a good balance of information without excessive output
## Log Message Format
Standard log messages follow this format:
```
YYYY-MM-DD HH:MM:SS,MS - logger_name - LEVEL - Message text
```
Example:
```
2025-03-01 14:30:27,123 - ra_aid.agent_utils - WARNING - Command execution timeout after 60 seconds
```

View File

@ -0,0 +1,124 @@
# Memory Management
## Introduction
RA.Aid's memory system enables the agent to persist knowledge across sessions, creating a more efficient and coherent experience. The memory stores key facts, code snippets, and research notes about your project, allowing RA.Aid to build on previous work and avoid redundant operations.
This persistent memory gives RA.Aid the ability to:
- Remember important project facts and architectural decisions
- Store relevant code snippets with their file locations
- Preserve research findings and technical notes
- Build contextual understanding of your project over time
## Database Architecture
RA.Aid's memory is stored in a SQLite database file located in a hidden `.ra-aid` directory within your current working directory. The specific file path is:
```
.ra-aid/pk.db
```
This database implements several key tables:
- `KeyFact`: Stores important facts about your project
- `KeySnippet`: Preserves code snippets with their file paths and line numbers
- `ResearchNote`: Contains detailed research findings
- `HumanInput`: Tracks user inputs to provide context for memory items
All memory items have timestamps (created_at, updated_at) that help with relevance tracking and garbage collection.
The memory system uses thread-local state via Python's contextvars to ensure thread safety when multiple components access the database simultaneously.
## Memory Repositories and Garbage Collection
RA.Aid implements the repository pattern for database access, with specialized repositories for each memory type:
- `KeyFactRepository`
- `KeySnippetRepository`
- `ResearchNoteRepository`
Each repository provides methods to add, query, and delete items while abstracting the underlying database implementation.
To prevent uncontrolled growth of the memory database, RA.Aid implements automatic garbage collection that triggers when specific thresholds are exceeded:
- Facts: > 50 items
- Snippets: > 35 items
- Notes: > 30 items
When garbage collection activates, specialized agents analyze all stored items, considering factors like:
- Relevance to the current task
- Age of the memory items
- Relationship to other items
- Overall importance
Memory items associated with the current human input are protected from garbage collection to preserve context for the active task.
## CLI Commands and Configuration
RA.Aid provides a CLI flag to completely reset the memory database:
```bash
ra-aid --wipe-project-memory [other arguments]
```
This flag deletes the entire `.ra-aid/pk.db` database file, giving you a fresh start with no stored memory.
The memory statistics are displayed in the status panel when you start RA.Aid, showing:
- The number of facts, snippets, and notes currently stored
- A reminder about the `--wipe-project-memory` flag when memory items exist
### When to Wipe Memory
You might want to wipe project memory in these situations:
1. **Major Codebase Changes**: When your project has undergone significant refactoring or structural changes, making the stored memory items obsolete.
2. **Fresh Start**: When beginning a new phase of development and you want to clear out irrelevant historical context.
3. **Incorrect Information**: If the agent has stored incorrect or outdated information that's affecting its performance.
4. **Troubleshooting**: When unexpected behavior might be related to the stored memory items.
## Troubleshooting
Common memory-related issues and their solutions:
### Issue: Agent recalling outdated information
**Solution**: Use `--wipe-project-memory` to reset the memory database, especially after major code changes.
### Issue: Database lockup or corruption
**Solution**:
1. Ensure RA.Aid has properly shut down before starting a new session
2. If issues persist, use `--wipe-project-memory` to recreate the database
3. Check the logs in `.ra-aid/logs/` for specific errors
### Issue: Memory items seem irrelevant
**Solution**:
- Let the automatic garbage collection work by continuing to use RA.Aid
- For immediate reset, use `--wipe-project-memory`
### Issue: Missing .ra-aid directory
**Solution**: The directory is automatically created when you run RA.Aid. If it's missing, simply run RA.Aid again.
## Examples / Use Cases
### Example 1: Wiping memory after major refactoring
```bash
# After refactoring your project structure
ra-aid --wipe-project-memory -m "Update the authentication system"
```
### Example 2: Starting a new development phase
```bash
# Before starting work on a new major feature
ra-aid --wipe-project-memory -m "Implement payment processing system"
```
### Example 3: Checking memory status without wiping
```bash
# Check the memory statistics in the status panel
ra-aid -m "Show me the project structure"
# Look for the 💾 Memory: X facts, Y snippets, Z notes line
```
### Example 4: Using memory during ongoing development
When working on a complex feature over multiple sessions, memory allows RA.Aid to:
1. Remember architectural decisions from previous sessions
2. Recall the context of partially implemented features
3. Build on previous research without repeating the same queries
4. Maintain awareness of project constraints and requirements

View File

@ -0,0 +1,96 @@
# Reasoning Assistance
## Overview
Reasoning Assistance is a feature in RA.Aid that helps weaker models make better decisions about tool usage and task planning. It leverages a stronger model (typically your expert model) to provide strategic guidance to the main agent model at the beginning of each agent stage.
This feature is particularly useful when working with less capable models that may struggle with complex reasoning, tool selection, or planning. By providing expert guidance upfront, these models can perform more effectively and produce better results.
## How It Works
When reasoning assistance is enabled, RA.Aid performs the following steps at the beginning of each agent stage (research, planning, implementation):
1. Makes a one-off call to the expert model with a specialized prompt that includes:
- A description of the current task and stage
- The complete list of available tools
- Instructions to provide strategic guidance on approaching the task
2. Incorporates the expert model's response into the main agent's prompt.
3. The main agent then proceeds with execution, guided by the expert's recommendations on which tools to use and how to approach the task
## Configuration
### Command Line Flags
You can enable or disable reasoning assistance using these command-line flags:
```bash
# Enable reasoning assistance
ra-aid -m "Your task description" --reasoning-assistance
# Disable reasoning assistance (overrides model defaults)
ra-aid -m "Your task description" --no-reasoning-assistance
```
## Examples
### Using Reasoning Assistance with Weaker Models
```bash
# Use qwen-qwq-32b as the expert model to provide guidance
ra-aid --model qwen-32b-coder-instruct --expert-model qwen-qwq-32b --reasoning-assistance -m "Create a simple web server in Python"
```
### Disabling Reasoning Assistance for Strong Models
Reasoning assistance has different defaults depending on which model is used. If you would like to explicitly disable reasoning assistance, use the `--no-reasoning-assistance` flag.
```bash
# Use Claude 3 Opus without reasoning assistance
ra-aid -m "Create a simple web server in Python" --model claude-3-opus-20240229 --no-reasoning-assistance
```
## Benefits and Use Cases
Reasoning assistance provides several advantages:
1. **Better Tool Selection**: Helps models choose the right tools for specific tasks
2. **Improved Planning**: Provides strategic guidance on how to approach complex problems
3. **Reduced Errors**: Decreases the likelihood of tool misuse or inefficient approaches
4. **Model Flexibility**: Allows using weaker models more effectively by augmenting their reasoning capabilities
5. **Consistency**: Ensures more consistent behavior across different models
Common use cases include:
- Working with open-source models that have less robust tool use capabilities
- Tackling complex tasks that require careful planning and tool sequencing
- Ensuring consistent behavior when switching between different models
## Best Practices
For optimal results with reasoning assistance:
1. **Use Strong Expert Models**: The quality of reasoning assistance depends on the expert model's capabilities. Use the strongest model available for the expert role.
2. **Enable for Weaker Models**: Enable reasoning assistance by default for models known to struggle with tool selection or complex reasoning.
3. **Disable for Strong Models**: Models like Claude 3 Opus or GPT-4 typically don't need reasoning assistance and might perform better without it.
4. **Custom Tasks**: For highly specialized or unusual tasks, manually enabling reasoning assistance can be beneficial even for stronger models.
5. **Review Generated Guidance**: If debugging issues, examine the expert guidance provided to understand how it's influencing the agent's behavior.
## Troubleshooting
Common issues and solutions:
| Issue | Possible Solution |
|-------|-------------------|
| Reasoning assistance seems to make no difference | Verify both `--reasoning-assistance` flag is set and check the logs to confirm the expert model is being called |
| Expert model provides irrelevant or incorrect agent guidance | Try using a stronger expert model with `--expert-model` flag |
| Agent ignores expert guidance | Some models may not correctly follow the guidance format; try a different agent model |
| Slow performance | Reasoning assistance requires an additional model call at the start of each stage; disable it for simpler tasks if speed is critical |
| Conflicting approach with custom instructions | If you're providing specific instructions that conflict with reasoning assistance, use `--no-reasoning-assistance` |
If problems persist, check if the expert model and agent model are compatible, and consider adjusting the temperature setting to control randomness in both models.

View File

@ -0,0 +1,140 @@
# Thinking Models
RA.Aid supports models that can reveal their internal reasoning process, providing greater transparency into how they arrive at their responses. This feature, called "thinking models," helps users better understand the model's decision-making and logic.
## Overview
Thinking models allow you to see the model's internal reasoning process separately from its final response. This offers several benefits:
- **Transparency**: Understand how the model interprets your instructions and reasons through problems
- **Debugging**: Identify where a model's reasoning might go astray
- **Learning**: Gain insights into the model's approach to problem-solving
- **Trust**: Build greater confidence in the model's outputs by seeing its thought process
RA.Aid extracts and displays thinking content in special "💭 Thoughts" panels, keeping the main response clean while still providing access to the reasoning behind it.
## How Thinking Models Work in RA.Aid
RA.Aid supports two different methods for implementing thinking models:
### 1. Explicit Think Tags
Some models, like `qwen-qwq-32b`, use explicit XML-style thinking tags to delineate their reasoning process:
```
<think>
First, I need to understand what this code does.
The function seems to be parsing a configuration file...
</think>
The function parse_config() has an issue with its error handling...
```
RA.Aid extracts the content between these `<think>...</think>` tags and displays it separately from the main response.
### 2. Native Thinking Mode
More advanced models, like Claude 3.7 Sonnet, have native thinking capabilities built in at the API level. When RA.Aid uses these models, it sends special configuration parameters in the API request:
```python
{"thinking": {"type": "enabled", "budget_tokens": 12000}}
```
These models return structured responses with separate thinking and response content, which RA.Aid processes and displays accordingly.
## Configuration and Setup
### Enabling Thinking Models
To enable the display of thinking content, use the `--show-thoughts` CLI flag when running RA.Aid:
```bash
ra-aid -m "Add error handling to the database module" --show-thoughts
```
When this flag is enabled, RA.Aid will display thinking content in separate panels whenever it's available from the model.
### Supported Models
Currently, the following models support thinking mode in RA.Aid:
| Model | Provider | Type |
|-------|----------|------|
| qwen-qwq-32b | openai-compatible | Explicit think tags |
| claude-3-7-sonnet-20250219 | anthropic | Native thinking mode |
Each model's support is configured in the `models_params.py` file using the appropriate parameter.
## Examples and Usage
### Using a Model with Explicit Think Tags
When using the `qwen-qwq-32b` model with the `--show-thoughts` flag:
```bash
ra-aid -m "Refactor the error handling logic" --provider openai-compatible --model qwen-qwq-32b --show-thoughts
```
The model might include explicit think tags in its response:
```
<think>
Let me analyze the existing error handling logic:
1. Current approach uses try/except blocks scattered throughout
2. Error messages are inconsistent
3. There's no central logging mechanism
I should suggest a unified error handling approach with proper logging.
</think>
I recommend refactoring the error handling logic by implementing a centralized error handler...
```
RA.Aid will extract this thinking content and display it in a separate panel titled "💭 Thoughts", while showing only the actual response in the main output.
### Using a Model with Native Thinking
When using Claude 3.7 Sonnet with the `--show-thoughts` flag:
```bash
ra-aid -m "Debug the database connection issue" --provider anthropic --model claude-3-7-sonnet-20250219 --show-thoughts
```
RA.Aid configures the model to use its native thinking mode, and then processes the structured response to show thinking content separately.
### Without the --show-thoughts Flag
If you run RA.Aid without the `--show-thoughts` flag, the thinking content is still extracted from the model responses, but it won't be displayed in the console. This gives you a cleaner output focused only on the model's final responses.
## Troubleshooting and Best Practices
### Common Issues
#### Thinking content not appearing
If you're not seeing thinking content despite using the `--show-thoughts` flag:
- Ensure you're using a model that supports thinking (qwen-qwq-32b or claude-3-7-sonnet-20250219)
- Verify that the model is properly configured in your environment
- Check that the model is actually including thinking content in its responses (not all prompts will generate thinking)
#### Excessive or irrelevant thinking
If the thinking content is too verbose or irrelevant:
- Try to formulate more specific and concise prompts
- Consider using a different model if the thinking style doesn't meet your needs
### Best Practices
For the most effective use of thinking models:
1. **Use selectively**: Enable `--show-thoughts` when you need to understand the model's reasoning process, but consider disabling it for routine tasks to keep output concise.
2. **Choose the right model**: Different models have different thinking styles. Claude models tend to provide more structured and methodical reasoning, while other models might have different approaches.
3. **Ask questions that benefit from reasoning**: Complex problem-solving, debugging, and analysis tasks benefit most from seeing the model's thought process.
4. **Compare thinking with output**: Use the thinking content to evaluate the quality of the model's reasoning and identify potential flaws in its approach.
5. **Provide clear instructions**: When the model's thinking seems off-track, provide clearer instructions in your next prompt to guide its reasoning process.

79
docs/docs/contributing.md Normal file
View File

@ -0,0 +1,79 @@
# Contributing to RA.Aid
Welcome to the RA.Aid community! We're thrilled you're interested in contributing. This project thrives thanks to contributors like you, and we're excited to have you join us on this journey.
## Ways to Contribute
There are many valuable ways to contribute to RA.Aid:
### 1. Join Our Community
- Join our Discord community to connect with other users and contributors
- Help answer questions from other users
- Share your experiences and use cases
- Provide feedback and suggestions
### 2. Report Issues
- Found a bug? Open an issue on our [GitHub repository](https://github.com/ai-christianson/RA.Aid/issues)
- Before creating a new issue, please check if it already exists
- Include as much detail as possible:
- Steps to reproduce
- Expected vs actual behavior
- Your environment (OS, Python version, etc.)
- Any relevant error messages
### 3. Contribute to Documentation
- Our documentation lives in the `docs/` folder
- Found a typo? Have an idea for better explanations? Open a PR!
- You can use RA.Aid itself to help draft documentation changes
- Even small improvements are welcome
### 4. Code Contributions
- Look for issues labeled "help wanted" or "good first issue" on our GitHub
- Feel free to pick up any open issue - don't be shy!
- **You can even use RA.Aid to help understand the codebase and make changes**
- Before starting work on larger changes, please open an issue to discuss
## Making Your First Contribution
1. Fork the repository
2. Create a branch for your changes
3. Make your changes
4. Write/update tests if needed
5. Submit a Pull Request
6. Wait for review and address any feedback
Don't hesitate to ask questions if you're unsure about anything. Remember: every expert was once a beginner!
## Development Setup
1. Clone the repository:
```bash
git clone https://github.com/ai-christianson/RA.Aid.git
cd RA.Aid
```
2. Create and activate a virtual environment:
```bash
python -m venv venv
source venv/bin/activate
```
3. Install in dev mode:
```bash
pip install -e .
```
4. Run RA.Aid:
```bash
ra-aid -m "Your task or query here"
```
## This is Your Project Too
RA.Aid is a community project that grows stronger with each contribution. Whether it's fixing a typo in documentation, reporting a bug, or adding a new feature - every contribution matters and is valued.
Don't feel like you need to make massive changes to contribute. Small, focused contributions are often the best way to start. Use what you know, and learn as you go!

29
docs/docs/getting-help.md Normal file
View File

@ -0,0 +1,29 @@
# Getting Help
## Troubleshooting Common Issues
Before seeking external help, check the following:
### Check the Logs
RA.Aid maintains detailed logs that can help diagnose many common issues. By default, logs are stored in the `.ra-aid/logs/` directory in your working directory.
1. Check the most recent log file in `.ra-aid/logs/` directory
2. Look for ERROR or WARNING level messages that might indicate what went wrong
3. For more detailed logging options, see the [Logging documentation](/configuration/logging)
### Common Problems
- **Error connecting to API**: Verify your API key is set correctly
- **Command not found**: Ensure RA.Aid is installed properly and in your PATH
- **Script execution failures**: Check that required dependencies are installed
## Bug Reports and Feature Requests
If you encounter any issues or have ideas for improvements, please file them on our [GitHub Issues page](https://github.com/ai-christianson/RA.Aid/issues).
## Community Support
Join our Discord community to chat with other users and get help:
- [Join the Discord Server](https://discord.gg/f6wYbzHYxV)

58
docs/docs/intro.md Normal file
View File

@ -0,0 +1,58 @@
---
sidebar_position: 1
slug: /
---
# Welcome to RA.Aid
RA.Aid (pronounced "raid") is your AI-powered development companion that helps you build software autonomously. As a standalone coding agent built on LangChain's agent-based task execution framework, RA.Aid can handle research, planning, and implementation of your development tasks. Whether you're working on new features, refactoring code, or researching solutions, RA.Aid makes development faster and more efficient.
## Why RA.Aid?
- 🤖 **Autonomous Development**: Let RA.Aid handle complex programming tasks while you focus on the big picture
- 🔍 **Smart Research**: Automatically researches solutions and best practices
- 📋 **Intelligent Planning**: Breaks down complex tasks into manageable steps
- 💬 **Interactive Mode**: Get help when you need it through natural conversation
## Quick Start
Ready to get started? Jump right to:
- [Installation Guide](/quickstart/installation)
- [Basic Usage Examples](/usage/modern-web-app)
### Basic Example
Here's how simple it is to use RA.Aid:
```bash
# Install RA.Aid
pip install ra-aid
# Set up API keys
export ANTHROPIC_API_KEY=your_key_here
export OPENAI_API_KEY=your_key_here
export TAVILY_API_KEY=your_key_here
# Start using it
ra-aid -m "Add input validation to the login form"
```
## Key Features
- **Three-Stage Workflow**: Research → Planning → Implementation
- **Web Research**: Automatically searches for best practices and solutions
- **Interactive Mode**: Get help when you need it through natural conversation
- **Multiple AI Providers**: Support for various AI models to suit your needs
- **Git Integration**: Works seamlessly with your version control
- **Standalone Code Agent**: Built-in code modification capabilities by default
- **Optional Aider Integration**: Use the `--use-aider` flag to leverage aider's specialized code editing abilities
## Next Steps
- Check out the [Installation Guide](/quickstart/installation) to set up RA.Aid
- See [Usage Examples](/usage/modern-web-app) to get started quickly
- Read our [Contributing Guide](/contributing) to get involved
- Join our [Discord Community](https://discord.gg/f6wYbzHYxV) for help and discussions
Ready to revolutionize your development workflow? Let's get started! 🚀

View File

@ -0,0 +1,8 @@
{
"label": "Quick Start",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

View File

@ -0,0 +1,70 @@
---
sidebar_position: 1
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Installation
Getting started is easy! You can install RA.Aid using any of these three methods - pick the one that works best for you:
<Tabs groupId="install-method">
<TabItem value="uv" label="UV" default>
Create a new Python 3.12 virtual environment and install RA.Aid:
First install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
```bash
uv venv -p 3.12
```
<Tabs groupId="operating-system">
<TabItem value="unix" label="Unix/macOS">
```bash
source .venv/bin/activate
```
</TabItem>
<TabItem value="windows" label="Windows">
```bash
.venv\Scripts\activate
```
</TabItem>
</Tabs>
```bash
uv pip install ra-aid
```
</TabItem>
<TabItem value="pip" label="pip">
Install RA.Aid using pip:
```bash
pip install ra-aid
```
:::note
If you're using Python 3.13 or newer, we recommend using the UV installation method instead due to compatibility issues with newer Python versions.
:::
</TabItem>
<TabItem value="macos" label="macOS">
Install RA.Aid using Homebrew:
```bash
brew tap ai-christianson/homebrew-ra-aid
brew install ra-aid
```
</TabItem>
</Tabs>
Once installed, see the [Recommended Configuration](recommended) to set up RA.Aid with the recommended settings.

View File

@ -0,0 +1,215 @@
---
sidebar_position: 3
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Open Models Configuration
RA.Aid supports a variety of open source and compatible model providers. This guide covers configuration options and best practices for using different models with RA.Aid.
## Overview
<Tabs groupId="provider-overview">
<TabItem value="providers" label="Supported Providers" default>
RA.Aid supports these model providers:
| Provider | Description | Key Features |
|----------|-------------|--------------|
| DeepSeek | Chinese hedge fund who creates sophisticated LLMs | Strong, open models like R1 |
| OpenRouter | Multi-model gateway service | Access to 100+ models, unified API interface, pay-per-token |
| OpenAI-compatible | Self-hosted model endpoints | Compatible with Llama, Mistral and other open models |
| Anthropic | Claude model series | 200k token context, strong tool use, JSON/XML parsing |
| Gemini | Google's multimodal models | Code generation in 20+ languages, parallel request support |
</TabItem>
<TabItem value="setup" label="Quick Setup">
### Basic Configuration
1. Set your provider's API key:
```bash
# Choose the appropriate provider
export DEEPSEEK_API_KEY=your_key
export OPENROUTER_API_KEY=your_key
export OPENAI_API_KEY=your_key
export ANTHROPIC_API_KEY=your_key
export GEMINI_API_KEY=your_key
```
2. Run RA.Aid with your chosen provider:
```bash
ra-aid -m "Your task" --provider <provider> --model <model>
```
</TabItem>
</Tabs>
## Provider Configuration
<Tabs groupId="model-provider">
<TabItem value="deepseek" label="DeepSeek" default>
### DeepSeek Models
DeepSeek offers powerful reasoning models optimized for complex tasks.
```bash
# Environment setup
export DEEPSEEK_API_KEY=your_api_key_here
# Basic usage
ra-aid -m "Your task" --provider deepseek --model deepseek-reasoner
# With temperature control
ra-aid -m "Your task" --provider deepseek --model deepseek-reasoner --temperature 0.7
```
**Available Models:**
- `deepseek-reasoner`: Optimized for reasoning tasks
- Access via OpenRouter: `deepseek/deepseek-r1`
</TabItem>
<TabItem value="openrouter" label="OpenRouter">
### OpenRouter Integration
OpenRouter provides access to multiple open source models through a single API.
```bash
# Environment setup
export OPENROUTER_API_KEY=your_api_key_here
# Example commands
ra-aid -m "Your task" --provider openrouter --model mistralai/mistral-large-2411
ra-aid -m "Your task" --provider openrouter --model deepseek/deepseek-r1
```
**Popular Models:**
- `mistralai/mistral-large-2411`
- `anthropic/claude-3`
- `deepseek/deepseek-r1`
</TabItem>
<TabItem value="openai-compatible" label="OpenAI-compatible">
### OpenAI-compatible Endpoints
Use OpenAI-compatible API endpoints with custom hosting solutions.
```bash
# Environment setup
export OPENAI_API_KEY=your_api_key_here
export OPENAI_API_BASE=https://your-api-endpoint
# Usage
ra-aid -m "Your task" --provider openai-compatible --model your-model-name
```
**Configuration Options:**
- Set custom base URL with `OPENAI_API_BASE`
- Supports temperature control
- Compatible with most OpenAI-style APIs
</TabItem>
<TabItem value="gemini" label="Google Gemini">
### Google Gemini Models
Google's Gemini models offer powerful multimodal capabilities with extensive code generation support.
```bash
# Environment setup
export GEMINI_API_KEY=your_api_key_here
# Basic usage
ra-aid -m "Your task" --provider gemini --model gemini-1.5-pro-latest
# With temperature control
ra-aid -m "Your task" --provider gemini --model gemini-1.5-flash-latest --temperature 0.5
```
**Available Models:**
- `gemini-pro`: Original Gemini Pro model
- `gemini-1.5-flash-latest`: Latest Gemini 1.5 Flash model (fast responses)
- `gemini-1.5-pro-latest`: Latest Gemini 1.5 Pro model (strong reasoning)
- `gemini-1.5-flash`: Gemini 1.5 Flash release
- `gemini-1.5-pro`: Gemini 1.5 Pro release
- `gemini-1.0-pro`: Original Gemini 1.0 Pro model
**Configuration Notes:**
- All Gemini models support a 128,000 token context window
- Temperature control is supported for creative vs. deterministic responses
- Obtain your API key from [AI Studio](https://aistudio.google.com/app/apikey)
</TabItem>
</Tabs>
## Advanced Configuration
<Tabs groupId="advanced-config">
<TabItem value="expert" label="Expert Model">
### Expert Tool Configuration
Configure the expert model for specialized tasks; this usually benefits from a more powerful, slower, reasoning model:
```bash
# DeepSeek expert
export EXPERT_DEEPSEEK_API_KEY=your_key
ra-aid -m "Your task" --expert-provider deepseek --expert-model deepseek-reasoner
# OpenRouter expert
export EXPERT_OPENROUTER_API_KEY=your_key
ra-aid -m "Your task" --expert-provider openrouter --expert-model mistralai/mistral-large-2411
# Gemini expert
export EXPERT_GEMINI_API_KEY=your_key
ra-aid -m "Your task" --expert-provider gemini --expert-model gemini-2.0-flash-thinking-exp-1219
```
</TabItem>
<TabItem value="temperature" label="Temperature Control">
### Temperature Settings
Control model creativity vs determinism:
```bash
# More deterministic (good for coding)
ra-aid -m "Your task" --temperature 0.2
# More creative (good for brainstorming)
ra-aid -m "Your task" --temperature 0.8
```
**Note:** Not all models support temperature control. Check provider documentation.
</TabItem>
</Tabs>
## Best Practices
- Set environment variables in your shell configuration file
- Use lower temperatures (0.1-0.3) for coding tasks
- Test different models to find the best fit for your use case
- Consider using expert mode for complex programming tasks
## Environment Variables
Complete list of supported environment variables:
| Variable | Provider | Purpose |
|----------|----------|----------|
| `OPENROUTER_API_KEY` | OpenRouter | Main API access |
| `DEEPSEEK_API_KEY` | DeepSeek | Main API access |
| `OPENAI_API_KEY` | OpenAI-compatible | API access |
| `OPENAI_API_BASE` | OpenAI-compatible | Custom endpoint |
| `ANTHROPIC_API_KEY` | Anthropic | API access |
| `GEMINI_API_KEY` | Gemini | API access |
| `EXPERT_OPENROUTER_API_KEY` | OpenRouter | Expert tool |
| `EXPERT_DEEPSEEK_API_KEY` | DeepSeek | Expert tool |
| `EXPERT_GEMINI_API_KEY` | Gemini | Expert tool |
## Troubleshooting
- Verify API keys are set correctly
- Check endpoint URLs for OpenAI-compatible setups
- Monitor API rate limits and quotas

View File

@ -0,0 +1,76 @@
---
sidebar_position: 2
---
# Recommended Config
This configuration combines the strengths of multiple AI models to provide the best experience:
- Anthropic Sonnet excels at driving the agent's core reasoning and planning
- OpenAI's models provide robust debugging and logical analysis capabilities
- Tavily web search integration allows the agent to find relevant information online
:::info
RA.Aid must be installed before using these configurations. If you haven't installed it yet, please see the [Installation Guide](installation).
:::
## Getting API Keys
To use RA.Aid with the recommended configuration, you'll need to obtain API keys from the following services:
1. **OpenAI API Key**: Create an account at [OpenAI's platform](https://platform.openai.com) and generate an API key from your dashboard.
2. **Anthropic API Key**: Sign up at [Anthropic's Console](https://console.anthropic.com), then generate an API key from the API Keys section.
3. **Tavily API Key** (optional): Create an account at [Tavily](https://app.tavily.com/sign-in) and get your API key from the dashboard.
Please keep your API keys secure and never share them publicly. Each service has its own pricing and usage terms.
## Configuration
Configure your API keys:
```bash
# For OpenAI (required)
export OPENAI_API_KEY=your_api_key_here
# For Anthropic (required)
export ANTHROPIC_API_KEY=your_api_key_here
# For web search capability (optional)
export TAVILY_API_KEY=your_api_key_here
```
## Basic Usage
Start RA.Aid in interactive chat mode:
```bash
ra-aid --chat
```
Or run with a single command:
```bash
ra-aid -m "Help me understand this code"
```
If you prefer to use aider's specialized code editing capabilities instead of RA.Aid's built-in file modification tools:
```bash
ra-aid -m "Implement this feature" --use-aider
```
You can control logging verbosity and location using the `--log-mode` and `--log-level` options:
```bash
# Log to file (with only warnings to console)
ra-aid -m "Your task" --log-mode file --log-level debug
# Log everything to console
ra-aid -m "Your task" --log-mode console --log-level info
```
For more detailed logging configuration, see the [Logging documentation](../configuration/logging.md).
For information on RA.Aid's memory management and how to reset memory when needed, see the [Memory Management documentation](../configuration/memory-management.md).

View File

@ -0,0 +1,8 @@
{
"label": "Usage",
"position": 4,
"link": {
"type": "generated-index",
"description": "Learn how to use RA.Aid effectively in different scenarios."
}
}

View File

@ -0,0 +1,19 @@
# Create a Game using RA.Aid
RA.Aid can work on almost any kind of software, including writing games in languages like C++.
## Creating the Initial Game
To get started with creating a game, you can use RA.Aid with a simple command like:
```
ra-aid -m "Create a basic breakout clone in C++ using opengl."
```
## Adding Features
Once your base game is working, you can add features like this:
```
ra-aid -m "Add score tracking/display to the main screen."
```

View File

@ -0,0 +1,45 @@
# Create a Modern Web App
When using AI tools like RA.Aid to create a modern web application, it's most effective to break down the work from a high level into discrete tasks. This guide will walk you through a practical example of building a Next.js application with common modern features.
## Setting Up a Fresh Next.js Application
To get started with a new Next.js project, you can use RA.Aid with a simple command like:
```
ra-aid -m "Initialize a new nextjs app."
```
RA.Aid will execute the necessary commands and set up a clean Next.js project for you with the latest best practices. It'll even search the web to read documentation about the latest version of Next.
## Adding shadcn/ui Components
Once your base Next.js application is ready, you can add the shadcn/ui component library. Tell RA.Aid:
```
ra-aid -m "Install shadcn into this project and put a few examples of shadcn components on the main page."
```
This will configure your project with shadcn/ui's CLI, set up the necessary styling, and add your first components.
## Integrating Prisma with SQLite
For database integration, you can add Prisma ORM with SQLite. Simply instruct RA.Aid:
```
ra-aid -m "Integrate prisma/sqlite into this project."
```
RA.Aid will handle the Prisma setup, create your database schema, and set up your first model.
## Adding Features Incrementally
With the foundation in place, you can start adding features one by one. Here's an example:
```
ra-aid -m "Add a simple user registration form. Include fields for email and password."
```
Keep your feature requests focused and specific. This allows RA.Aid to implement them effectively while maintaining code quality.
Remember to build your application incrementally, testing each feature as it's added. This approach helps manage complexity and ensures a stable development process.

View File

@ -0,0 +1,17 @@
# Work with an Existing Mono Repo using RA.Aid
RA.Aid is good at handling complex monorepo projects. For example, if you you have an app set up like this:
```
app/
web/
backend/
```
You can run RA.Aid at the top level and give it commands like this:
```
ra-aid -m "Update the user form to support birthdates. Be sure to also update the DB model and migration scripts."
```
RA.Aid will proceed to work on multiple high-level components of your application.

74
docs/docusaurus.config.ts Normal file
View File

@ -0,0 +1,74 @@
import {themes as prismThemes} from 'prism-react-renderer';
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';
const config: Config = {
title: 'RA-Aid Documentation',
favicon: 'img/favicon.ico',
url: 'https://docs.ra-aid.ai',
baseUrl: '/',
onDuplicateRoutes: 'ignore',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
i18n: {
defaultLocale: 'en',
locales: ['en'],
},
plugins: [],
presets: [
[
'classic',
{
docs: {
sidebarPath: './sidebars.ts',
routeBasePath: '/',
},
theme: {
customCss: './src/css/custom.css',
},
} satisfies Preset.Options,
],
],
themeConfig: {
navbar: {
logo: {
alt: 'Site Logo',
src: 'img/logo-black-transparent.png',
srcDark: 'img/logo-white-transparent.gif',
href: 'https://ra-aid.ai'
},
items: [
{
type: 'doc',
position: 'left',
docId: 'intro',
label: 'Docs',
},
{
href: 'https://github.com/ai-christianson/RA.Aid',
label: 'GitHub',
position: 'right',
},
],
},
footer: {
style: 'dark',
copyright: `Copyright © ${new Date().getFullYear()} AI Christianson. Built with RA.Aid and Docusaurus.`,
},
prism: {
theme: prismThemes.github,
darkTheme: prismThemes.dracula,
},
colorMode: {
defaultMode: 'dark',
respectPrefersColorScheme: false,
},
} satisfies Preset.ThemeConfig,
};
export default config;

17934
docs/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

49
docs/package.json Normal file
View File

@ -0,0 +1,49 @@
{
"name": "docs",
"version": "0.0.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
"start": "node scripts/version.js && docusaurus start",
"generate-version": "node scripts/version.js",
"build": "npm run generate-version && docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc",
"version-json": "node scripts/version.js"
},
"dependencies": {
"@docusaurus/core": "3.7.0",
"@docusaurus/preset-classic": "3.7.0",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.7.0",
"@docusaurus/tsconfig": "3.7.0",
"@docusaurus/types": "3.7.0",
"typescript": "~5.6.2"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 3 chrome version",
"last 3 firefox version",
"last 5 safari version"
]
},
"engines": {
"node": ">=18.0"
}
}

31
docs/scripts/README.md Normal file
View File

@ -0,0 +1,31 @@
# Docusaurus Scripts
This directory contains utility scripts for the Docusaurus documentation site.
## version.js
This script reads the version from `../../ra_aid/__version__.py` and creates a `version.json` file in the Docusaurus `static/` directory, which will be included in the built site.
### Usage
The script is automatically run as part of the build and start processes via npm scripts defined in `package.json`, but can also be run manually:
```bash
# From docs directory
npm run version-json
# Or directly
node scripts/version.js
```
### Output
The script creates a `static/version.json` file with the following format:
```json
{
"version": "x.y.z"
}
```
This file will be available at `/version.json` in the built site, allowing client-side version checks.

62
docs/scripts/version.js Executable file
View File

@ -0,0 +1,62 @@
#!/usr/bin/env node
/**
* Script to read version from ra_aid/__version__.py and create version.json
* in the Docusaurus static directory.
*/
const fs = require('fs');
const path = require('path');
// Paths
const versionFilePath = path.resolve(__dirname, '../../ra_aid/__version__.py');
const outputPath = path.resolve(__dirname, '../static/version.json');
/**
* Extract version string from the __version__.py file
* @param {string} content - The file content
* @returns {string|null} - Extracted version or null if not found
*/
function extractVersion(content) {
const regex = /__version__\s*=\s*["']([^"']+)["']/;
const match = content.match(regex);
return match ? match[1] : null;
}
// Main function to create version.json
function createVersionJson() {
try {
// Read version file
console.log(`Reading version from ${versionFilePath}...`);
const versionFileContent = fs.readFileSync(versionFilePath, 'utf8');
// Extract version
const version = extractVersion(versionFileContent);
if (!version) {
console.error('Failed to extract version from file');
process.exit(1);
}
console.log(`Extracted version: ${version}`);
// Create version JSON
const versionJson = JSON.stringify({ version }, null, 2);
// Ensure static directory exists
const staticDir = path.dirname(outputPath);
if (!fs.existsSync(staticDir)) {
console.log(`Creating directory: ${staticDir}`);
fs.mkdirSync(staticDir, { recursive: true });
}
// Write JSON file
fs.writeFileSync(outputPath, versionJson);
console.log(`Version JSON written to ${outputPath}`);
} catch (error) {
console.error(`Error creating version.json: ${error.message}`);
process.exit(1);
}
}
// Execute the main function
createVersionJson();

33
docs/sidebars.ts Normal file
View File

@ -0,0 +1,33 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
const sidebars: SidebarsConfig = {
// By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
// But you can create a sidebar manually
/*
tutorialSidebar: [
'intro',
'hello',
{
type: 'category',
label: 'Tutorial',
items: ['quickstarts/create-a-document'],
},
],
*/
};
export default sidebars;

View File

@ -0,0 +1,71 @@
import type {ReactNode} from 'react';
import clsx from 'clsx';
import Heading from '@theme/Heading';
import styles from './styles.module.css';
type FeatureItem = {
title: string;
Svg: React.ComponentType<React.ComponentProps<'svg'>>;
description: ReactNode;
};
const FeatureList: FeatureItem[] = [
{
title: 'Easy to Use',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
Docusaurus was designed from the ground up to be easily installed and
used to get your website up and running quickly.
</>
),
},
{
title: 'Focus on What Matters',
Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
description: (
<>
Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go
ahead and move your docs into the <code>docs</code> directory.
</>
),
},
{
title: 'Powered by React',
Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
description: (
<>
Extend or customize your website layout by reusing React. Docusaurus can
be extended while reusing the same header and footer.
</>
),
},
];
function Feature({title, Svg, description}: FeatureItem) {
return (
<div className={clsx('col col--4')}>
<div className="text--center">
<Svg className={styles.featureSvg} role="img" />
</div>
<div className="text--center padding-horiz--md">
<Heading as="h3">{title}</Heading>
<p>{description}</p>
</div>
</div>
);
}
export default function HomepageFeatures(): ReactNode {
return (
<section className={styles.features}>
<div className="container">
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
))}
</div>
</div>
</section>
);
}

View File

@ -0,0 +1,11 @@
.features {
display: flex;
align-items: center;
padding: 2rem 0;
width: 100%;
}
.featureSvg {
height: 200px;
width: 200px;
}

30
docs/src/css/custom.css Normal file
View File

@ -0,0 +1,30 @@
/**
* Any CSS included here will be global. The classic template
* bundles Infima by default. Infima is a CSS framework designed to
* work well for content-centric websites.
*/
/* You can override the default Infima variables here. */
:root {
--ifm-color-primary: #2e8555;
--ifm-color-primary-dark: #29784c;
--ifm-color-primary-darker: #277148;
--ifm-color-primary-darkest: #205d3b;
--ifm-color-primary-light: #33925d;
--ifm-color-primary-lighter: #359962;
--ifm-color-primary-lightest: #3cad6e;
--ifm-code-font-size: 95%;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
}
/* For readability concerns, you should choose a lighter palette in dark mode. */
[data-theme='dark'] {
--ifm-color-primary: #25c2a0;
--ifm-color-primary-dark: #21af90;
--ifm-color-primary-darker: #1fa588;
--ifm-color-primary-darkest: #1a8870;
--ifm-color-primary-light: #29d5b0;
--ifm-color-primary-lighter: #32d8b4;
--ifm-color-primary-lightest: #4fddbf;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}

1
docs/static/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
version.json

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
docs/static/img/docusaurus.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
docs/static/img/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

1
docs/static/img/logo.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -0,0 +1,171 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962">
<title>Easy to Use</title>
<g id="Group_12" data-name="Group 12" transform="translate(-57 -56)">
<g id="Group_11" data-name="Group 11" transform="translate(57 56)">
<path id="Path_83" data-name="Path 83" d="M1017.81,560.461c-5.27,45.15-16.22,81.4-31.25,110.31-20,38.52-54.21,54.04-84.77,70.28a193.275,193.275,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.282,657.282,0,0,0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07,5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12,52.29-235.46,134.74-296.47,155.97-115.41,369.76-110.57,523.43,7.88C941.15,276.621,1036.99,396.031,1017.81,560.461Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_84" data-name="Path 84" d="M986.56,670.771c-20,38.52-47.21,64.04-77.77,80.28a193.272,193.272,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.3,657.3,0,0,0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25,1.72c-100.17,7.36-253.82-6.43-321.42-143.29L382,283.981,444.95,445.6l20.09,51.59,55.37-75.98L549,381.981l130.2,149.27,36.8-81.27L970.78,657.9l14.21,11.59Z" transform="translate(-56 -106.019)" fill="#f2f2f2"/>
<path id="Path_85" data-name="Path 85" d="M302,282.962l26-57,36,83-31-60Z" opacity="0.1"/>
<path id="Path_86" data-name="Path 86" d="M610.5,753.821q-14.97-.675-29.97-.67L465.04,497.191Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_87" data-name="Path 87" d="M464.411,315.191,493,292.962l130,150-132-128Z" opacity="0.1"/>
<path id="Path_88" data-name="Path 88" d="M908.79,751.051a193.265,193.265,0,0,1-27.46,11.94L679.2,531.251Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<circle id="Ellipse_11" data-name="Ellipse 11" cx="3" cy="3" r="3" transform="translate(479 98.962)" fill="#f2f2f2"/>
<circle id="Ellipse_12" data-name="Ellipse 12" cx="3" cy="3" r="3" transform="translate(396 201.962)" fill="#f2f2f2"/>
<circle id="Ellipse_13" data-name="Ellipse 13" cx="2" cy="2" r="2" transform="translate(600 220.962)" fill="#f2f2f2"/>
<circle id="Ellipse_14" data-name="Ellipse 14" cx="2" cy="2" r="2" transform="translate(180 265.962)" fill="#f2f2f2"/>
<circle id="Ellipse_15" data-name="Ellipse 15" cx="2" cy="2" r="2" transform="translate(612 96.962)" fill="#f2f2f2"/>
<circle id="Ellipse_16" data-name="Ellipse 16" cx="2" cy="2" r="2" transform="translate(736 192.962)" fill="#f2f2f2"/>
<circle id="Ellipse_17" data-name="Ellipse 17" cx="2" cy="2" r="2" transform="translate(858 344.962)" fill="#f2f2f2"/>
<path id="Path_89" data-name="Path 89" d="M306,121.222h-2.76v-2.76h-1.48v2.76H299V122.7h2.76v2.759h1.48V122.7H306Z" fill="#f2f2f2"/>
<path id="Path_90" data-name="Path 90" d="M848,424.222h-2.76v-2.76h-1.48v2.76H841V425.7h2.76v2.759h1.48V425.7H848Z" fill="#f2f2f2"/>
<path id="Path_91" data-name="Path 91" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_92" data-name="Path 92" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<ellipse id="Ellipse_18" data-name="Ellipse 18" cx="544" cy="30" rx="544" ry="30" transform="translate(0 583.962)" fill="#3f3d56"/>
<path id="Path_93" data-name="Path 93" d="M624,677.981c0,33.137-14.775,24-33,24s-33,9.137-33-24,33-96,33-96S624,644.844,624,677.981Z" transform="translate(-56 -106.019)" fill="#ff6584"/>
<path id="Path_94" data-name="Path 94" d="M606,690.66c0,15.062-6.716,10.909-15,10.909s-15,4.153-15-10.909,15-43.636,15-43.636S606,675.6,606,690.66Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<rect id="Rectangle_97" data-name="Rectangle 97" width="92" height="18" rx="9" transform="translate(489 604.962)" fill="#2f2e41"/>
<rect id="Rectangle_98" data-name="Rectangle 98" width="92" height="18" rx="9" transform="translate(489 586.962)" fill="#2f2e41"/>
<path id="Path_95" data-name="Path 95" d="M193,596.547c0,55.343,34.719,100.126,77.626,100.126" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_96" data-name="Path 96" d="M270.626,696.673c0-55.965,38.745-101.251,86.626-101.251" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_97" data-name="Path 97" d="M221.125,601.564c0,52.57,22.14,95.109,49.5,95.109" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_98" data-name="Path 98" d="M270.626,696.673c0-71.511,44.783-129.377,100.126-129.377" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_99" data-name="Path 99" d="M254.3,697.379s11.009-.339,14.326-2.7,16.934-5.183,17.757-1.395,16.544,18.844,4.115,18.945-28.879-1.936-32.19-3.953S254.3,697.379,254.3,697.379Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_100" data-name="Path 100" d="M290.716,710.909c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7,8.879,4.009,10.9,19.761,4.053,32.19,3.953c3.588-.029,4.827-1.305,4.759-3.2C294.755,710.174,293.386,710.887,290.716,710.909Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_101" data-name="Path 101" d="M777.429,633.081c0,38.029,23.857,68.8,53.341,68.8" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_102" data-name="Path 102" d="M830.769,701.882c0-38.456,26.623-69.575,59.525-69.575" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_103" data-name="Path 103" d="M796.755,636.528c0,36.124,15.213,65.354,34.014,65.354" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_104" data-name="Path 104" d="M830.769,701.882c0-49.139,30.773-88.9,68.8-88.9" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_105" data-name="Path 105" d="M819.548,702.367s7.565-.233,9.844-1.856,11.636-3.562,12.2-.958,11.368,12.949,2.828,13.018-19.844-1.33-22.119-2.716S819.548,702.367,819.548,702.367Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_106" data-name="Path 106" d="M844.574,711.664c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479,6.1,2.755,7.487,13.579,2.785,22.119,2.716c2.465-.02,3.317-.9,3.27-2.2C847.349,711.159,846.409,711.649,844.574,711.664Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_107" data-name="Path 107" d="M949.813,724.718s11.36-1.729,14.5-4.591,16.89-7.488,18.217-3.667,19.494,17.447,6.633,19.107-30.153,1.609-33.835-.065S949.813,724.718,949.813,724.718Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_108" data-name="Path 108" d="M989.228,734.173c-12.86,1.659-30.153,1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833,9.109,5.516,10.783,20.975,1.725,33.835.065c3.712-.479,4.836-1.956,4.529-3.906C993.319,732.907,991.991,733.817,989.228,734.173Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_109" data-name="Path 109" d="M670.26,723.9s9.587-1.459,12.237-3.875,14.255-6.32,15.374-3.095,16.452,14.725,5.6,16.125-25.448,1.358-28.555-.055S670.26,723.9,670.26,723.9Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_110" data-name="Path 110" d="M703.524,731.875c-10.853,1.4-25.448,1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547,7.687,4.655,9.1,17.7,1.456,28.555.055c3.133-.4,4.081-1.651,3.822-3.3C706.977,730.807,705.856,731.575,703.524,731.875Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_111" data-name="Path 111" d="M178.389,719.109s7.463-1.136,9.527-3.016,11.1-4.92,11.969-2.409,12.808,11.463,4.358,12.553-19.811,1.057-22.23-.043S178.389,719.109,178.389,719.109Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_112" data-name="Path 112" d="M204.285,725.321c-8.449,1.09-19.811,1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2,5.984,3.624,7.085,13.781,1.133,22.23.043c2.439-.315,3.177-1.285,2.976-2.566C206.973,724.489,206.1,725.087,204.285,725.321Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_113" data-name="Path 113" d="M439.7,707.337c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873,42.118-36.793,93.694-36.793S439.7,677.117,439.7,707.337Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_114" data-name="Path 114" d="M439.7,699.9c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873S295.04,663.1,346.616,663.1,439.7,669.676,439.7,699.9Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(312.271 493.733)">
<path id="Path_40" data-name="Path 40" d="M99,52h91.791V89.153H99Z" transform="translate(5.904 -14.001)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M24.855,163.927A21.828,21.828,0,0,1,5.947,153a21.829,21.829,0,0,0,18.908,32.782H46.71V163.927Z" transform="translate(-3 -4.634)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M121.861,61.1l76.514-4.782V45.39A21.854,21.854,0,0,0,176.52,23.535H78.173L75.441,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L64.513,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L53.586,18.8a3.154,3.154,0,0,0-5.464,0L45.39,23.535c-.024,0-.046,0-.071,0l-4.526-4.525a3.153,3.153,0,0,0-5.276,1.414l-1.5,5.577-5.674-1.521a3.154,3.154,0,0,0-3.863,3.864L26,34.023l-5.575,1.494a3.155,3.155,0,0,0-1.416,5.278l4.526,4.526c0,.023,0,.046,0,.07L18.8,48.122a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,59.05a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,69.977a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,80.9a3.154,3.154,0,0,0,0,5.464L23.535,89.1,18.8,91.832a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,102.76a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,113.687a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,124.615a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,135.542a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,146.469a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,157.4a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,168.324a3.154,3.154,0,0,0,0,5.464l4.732,2.732A21.854,21.854,0,0,0,45.39,198.375H176.52a21.854,21.854,0,0,0,21.855-21.855V89.1l-76.514-4.782a11.632,11.632,0,0,1,0-23.219" transform="translate(-1.681 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,186.71h32.782V143H143Z" transform="translate(9.984 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M196.71,159.855a5.438,5.438,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(10.912 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,124.855h32.782V103H153Z" transform="translate(10.912 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M194.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.814,2.814,0,0,0,.349.035" transform="translate(12.767 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M65.087,56.891a2.732,2.732,0,0,1-2.732-2.732,8.2,8.2,0,0,0-16.391,0,2.732,2.732,0,0,1-5.464,0,13.659,13.659,0,0,1,27.319,0,2.732,2.732,0,0,1-2.732,2.732" transform="translate(0.478 -15.068)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,191.347h65.565a21.854,21.854,0,0,0,21.855-21.855V93H124.855A21.854,21.854,0,0,0,103,114.855Z" transform="translate(6.275 -10.199)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M173.216,129.787H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0-54.434H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.652H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186M189.585,61.611c-.013,0-.024-.007-.037-.005-3.377.115-4.974,3.492-6.384,6.472-1.471,3.114-2.608,5.139-4.473,5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932,3.053-6.346,5.646-1.5,2.762-2.529,4.442-4.5,4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879,2.606-6.3,4.808-1.5,2.328-2.552,3.746-4.551,3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807,2.153-6.224,3.954-1.346,1.709-2.4,3.062-4.621,2.977a1.093,1.093,0,0,0-.079,2.186c3.3.11,4.967-1.967,6.417-3.81,1.286-1.635,2.4-3.045,4.582-3.12,2.1-.09,3.091,1.218,4.584,3.327,1.417,2,3.026,4.277,6.263,4.394,3.391.114,5.022-2.42,6.467-4.663,1.292-2,2.406-3.734,4.535-3.807,1.959-.073,3.026,1.475,4.529,4.022,1.417,2.4,3.023,5.121,6.324,5.241,3.415.118,5.064-2.863,6.5-5.5,1.245-2.282,2.419-4.437,4.5-4.509,1.959-.046,2.981,1.743,4.492,4.732,1.412,2.79,3.013,5.95,6.365,6.071l.185,0c3.348,0,4.937-3.36,6.343-6.331,1.245-2.634,2.423-5.114,4.444-5.216Z" transform="translate(7.109 -13.11)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,186.71h43.71V143H83Z" transform="translate(4.42 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 109.327, 91.085)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="92.361" height="36.462" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(1.531 23.03)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="5.336" height="5.336" rx="1" transform="translate(16.797 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="5.336" height="5.336" rx="1" transform="translate(23.12 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="5.336" height="5.336" rx="1" transform="translate(29.444 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="5.336" height="5.336" rx="1" transform="translate(35.768 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="5.336" height="5.336" rx="1" transform="translate(42.091 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="5.336" height="5.336" rx="1" transform="translate(48.415 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="5.336" height="5.336" rx="1" transform="translate(54.739 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="5.336" height="5.336" rx="1" transform="translate(61.063 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="5.336" height="5.336" rx="1" transform="translate(67.386 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M1.093,0H14.518a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0ZM75,0H88.426a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H75a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,75,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(1.531 10.261)">
<path id="Path_52" data-name="Path 52" d="M1.093,0H6.218A1.093,1.093,0,0,1,7.31,1.093V4.242A1.093,1.093,0,0,1,6.218,5.335H1.093A1.093,1.093,0,0,1,0,4.242V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="5.336" height="5.336" rx="1" transform="translate(58.888 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="5.336" height="5.336" rx="1" transform="translate(65.212 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="5.336" height="5.336" rx="1" transform="translate(71.536 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="5.336" height="5.336" rx="1" transform="translate(77.859 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(91.05 9.546) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M1.093,0H6.219A1.093,1.093,0,0,1,7.312,1.093v3.15A1.093,1.093,0,0,1,6.219,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(1.531 16.584)">
<path id="Path_54" data-name="Path 54" d="M1.093,0h7.3A1.093,1.093,0,0,1,9.485,1.093v3.15A1.093,1.093,0,0,1,8.392,5.336h-7.3A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(10.671 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="5.336" height="5.336" rx="1" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="5.336" height="5.336" rx="1" transform="translate(25.295 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="5.336" height="5.336" rx="1" transform="translate(31.619 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="5.336" height="5.336" rx="1" transform="translate(37.942 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="5.336" height="5.336" rx="1" transform="translate(44.265 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="5.336" height="5.336" rx="1" transform="translate(50.589 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="5.336" height="5.336" rx="1" transform="translate(56.912 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="5.336" height="5.336" rx="1" transform="translate(63.236 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M1.094,0H8A1.093,1.093,0,0,1,9.091,1.093v3.15A1.093,1.093,0,0,1,8,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(80.428 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(1.531 29.627)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="5.336" height="5.336" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M1.093,0H31.515a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.244V1.093A1.093,1.093,0,0,1,1.093,0ZM34.687,0h3.942a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H34.687a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,34.687,0Z" transform="translate(25.294 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="5.336" height="5.336" rx="1" transform="translate(66.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="5.336" height="5.336" rx="1" transform="translate(72.327 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(83.59 2.273) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(78.255 3.063)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="88.927" height="2.371" rx="1.085" transform="translate(1.925 1.17)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="4.986" height="1.581" rx="0.723" transform="translate(4.1 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="4.986" height="1.581" rx="0.723" transform="translate(10.923 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="4.986" height="1.581" rx="0.723" transform="translate(16.173 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="4.986" height="1.581" rx="0.723" transform="translate(21.421 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="4.986" height="1.581" rx="0.723" transform="translate(26.671 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="4.986" height="1.581" rx="0.723" transform="translate(33.232 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="4.986" height="1.581" rx="0.723" transform="translate(38.48 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="4.986" height="1.581" rx="0.723" transform="translate(43.73 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="4.986" height="1.581" rx="0.723" transform="translate(48.978 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="4.986" height="1.581" rx="0.723" transform="translate(55.54 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="4.986" height="1.581" rx="0.723" transform="translate(60.788 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="4.986" height="1.581" rx="0.723" transform="translate(66.038 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="4.986" height="1.581" rx="0.723" transform="translate(72.599 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="4.986" height="1.581" rx="0.723" transform="translate(77.847 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="4.986" height="1.581" rx="0.723" transform="translate(83.097 1.566)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M146.71,159.855a5.439,5.439,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(6.275 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,124.855h43.71V103H83Z" transform="translate(4.42 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M134.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.811,2.811,0,0,0,.349.035" transform="translate(7.202 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M143.232,42.33a2.967,2.967,0,0,1-.535-.055,2.754,2.754,0,0,1-.514-.153,2.838,2.838,0,0,1-.471-.251,4.139,4.139,0,0,1-.415-.339,3.2,3.2,0,0,1-.338-.415A2.7,2.7,0,0,1,140.5,39.6a2.968,2.968,0,0,1,.055-.535,3.152,3.152,0,0,1,.152-.514,2.874,2.874,0,0,1,.252-.47,2.633,2.633,0,0,1,.753-.754,2.837,2.837,0,0,1,.471-.251,2.753,2.753,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,4.019,4.019,0,0,1,.339.415,2.786,2.786,0,0,1,.251.47,2.864,2.864,0,0,1,.208,1.049,2.77,2.77,0,0,1-.8,1.934,4.139,4.139,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459m21.855-1.366a2.789,2.789,0,0,1-1.935-.8,4.162,4.162,0,0,1-.338-.415,2.7,2.7,0,0,1-.459-1.519,2.789,2.789,0,0,1,.8-1.934,4.139,4.139,0,0,1,.415-.339,2.838,2.838,0,0,1,.471-.251,2.752,2.752,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,2.79,2.79,0,0,1,.8,1.934,3.069,3.069,0,0,1-.055.535,2.779,2.779,0,0,1-.153.514,3.885,3.885,0,0,1-.251.47,4.02,4.02,0,0,1-.339.415,4.138,4.138,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459" transform="translate(9.753 -15.532)" fill-rule="evenodd"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,170 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1041.277" height="554.141" viewBox="0 0 1041.277 554.141">
<title>Powered by React</title>
<g id="Group_24" data-name="Group 24" transform="translate(-440 -263)">
<g id="Group_23" data-name="Group 23" transform="translate(439.989 262.965)">
<path id="Path_299" data-name="Path 299" d="M1040.82,611.12q-1.74,3.75-3.47,7.4-2.7,5.67-5.33,11.12c-.78,1.61-1.56,3.19-2.32,4.77-8.6,17.57-16.63,33.11-23.45,45.89A73.21,73.21,0,0,1,942.44,719l-151.65,1.65h-1.6l-13,.14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107,1.16-95.51,1-11.11.12-69,.75H429l-44.75.48h-.48l-141.5,1.53-42.33.46a87.991,87.991,0,0,1-10.79-.54h0c-1.22-.14-2.44-.3-3.65-.49a87.38,87.38,0,0,1-51.29-27.54C116,678.37,102.75,655,93.85,629.64q-1.93-5.49-3.6-11.12C59.44,514.37,97,380,164.6,290.08q4.25-5.64,8.64-11l.07-.08c20.79-25.52,44.1-46.84,68.93-62,44-26.91,92.75-34.49,140.7-11.9,40.57,19.12,78.45,28.11,115.17,30.55,3.71.24,7.42.42,11.11.53,84.23,2.65,163.17-27.7,255.87-47.29,3.69-.78,7.39-1.55,11.12-2.28,66.13-13.16,139.49-20.1,226.73-5.51a189.089,189.089,0,0,1,26.76,6.4q5.77,1.86,11.12,4c41.64,16.94,64.35,48.24,74,87.46q1.37,5.46,2.37,11.11C1134.3,384.41,1084.19,518.23,1040.82,611.12Z" transform="translate(-79.34 -172.91)" fill="#f2f2f2"/>
<path id="Path_300" data-name="Path 300" d="M576.36,618.52a95.21,95.21,0,0,1-1.87,11.12h93.7V618.52Zm-78.25,62.81,11.11-.09V653.77c-3.81-.17-7.52-.34-11.11-.52ZM265.19,618.52v11.12h198.5V618.52ZM1114.87,279h-74V191.51q-5.35-2.17-11.12-4V279H776.21V186.58c-3.73.73-7.43,1.5-11.12,2.28V279H509.22V236.15c-3.69-.11-7.4-.29-11.11-.53V279H242.24V217c-24.83,15.16-48.14,36.48-68.93,62h-.07v.08q-4.4,5.4-8.64,11h8.64V618.52h-83q1.66,5.63,3.6,11.12h79.39v93.62a87,87,0,0,0,12.2,2.79c1.21.19,2.43.35,3.65.49h0a87.991,87.991,0,0,0,10.79.54l42.33-.46v-97H498.11v94.21l11.11-.12V629.64H765.09V721l11.12-.12V629.64H1029.7v4.77c.76-1.58,1.54-3.16,2.32-4.77q2.63-5.45,5.33-11.12,1.73-3.64,3.47-7.4v-321h76.42Q1116.23,284.43,1114.87,279ZM242.24,618.52V290.08H498.11V618.52Zm267,0V290.08H765.09V618.52Zm520.48,0H776.21V290.08H1029.7Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_301" data-name="Path 301" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" fill="#65617d"/>
<path id="Path_302" data-name="Path 302" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" opacity="0.2"/>
<path id="Path_303" data-name="Path 303" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_304" data-name="Path 304" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_305" data-name="Path 305" d="M377.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<rect id="Rectangle_137" data-name="Rectangle 137" width="47.17" height="31.5" transform="translate(680.92 483.65)" fill="#3f3d56"/>
<rect id="Rectangle_138" data-name="Rectangle 138" width="47.17" height="31.5" transform="translate(680.92 483.65)" opacity="0.1"/>
<rect id="Rectangle_139" data-name="Rectangle 139" width="47.17" height="31.5" transform="translate(678.92 483.65)" fill="#3f3d56"/>
<path id="Path_306" data-name="Path 306" d="M298.09,483.65v4.97l-47.17,1.26v-6.23Z" opacity="0.1"/>
<path id="Path_307" data-name="Path 307" d="M460.69,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6a4,4,0,0,1,3.95,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_308" data-name="Path 308" d="M265.19,481.32v181.2h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_309" data-name="Path 309" d="M194.59,319.15h177.5V467.4l-177.5,4Z" fill="#39374d"/>
<path id="Path_310" data-name="Path 310" d="M726.09,483.65v6.41l-47.17-1.26v-5.15Z" opacity="0.1"/>
<path id="Path_311" data-name="Path 311" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0L672,657.42a4,4,0,0,1-3.85-3.95V485.27a4,4,0,0,1,3.95-3.95H863.7a4,4,0,0,1,3.99,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_312" data-name="Path 312" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0V481.32h0a4,4,0,0,1,4,3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_313" data-name="Path 313" d="M775.59,319.15H598.09V467.4l177.5,4Z" fill="#39374d"/>
<path id="Path_314" data-name="Path 314" d="M663.19,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h0a4,4,0,0,1-4-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6A4,4,0,0,1,663.19,485.27Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_315" data-name="Path 315" d="M397.09,319.15h177.5V467.4l-177.5,4Z" fill="#4267b2"/>
<path id="Path_316" data-name="Path 316" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5,4.4-.02.98-.01Z" opacity="0.1"/>
<circle id="Ellipse_111" data-name="Ellipse 111" cx="51.33" cy="51.33" r="51.33" transform="translate(435.93 246.82)" fill="#fbbebe"/>
<path id="Path_317" data-name="Path 317" d="M617.94,550.07s-99.5,12-90,0c3.44-4.34,4.39-17.2,4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41,77-8.5c-4,13.13-2.69,31.57.35,48.88.89,5.05,1.92,10,3,14.7a344.66,344.66,0,0,0,9.65,33.92Z" transform="translate(-79.34 -172.91)" fill="#fbbebe"/>
<path id="Path_318" data-name="Path 318" d="M585.47,546c11.51-2.13,23.7-6,34.53-1.54,2.85,1.17,5.47,2.88,8.39,3.86s6.12,1.22,9.16,1.91c10.68,2.42,19.34,10.55,24.9,20s8.44,20.14,11.26,30.72l6.9,25.83c6,22.45,12,45.09,13.39,68.3a2437.506,2437.506,0,0,1-250.84,1.43c5.44-10.34,11-21.31,10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34,6.57-13.39,9.64-20.22,8.75-19.52,1.94-45.79,17.32-60.65,6.92-6.68,17-9.21,26.63-8.89,12.28.41,24.85,4.24,37,6.11C555.09,547.48,569.79,548.88,585.47,546Z" transform="translate(-79.34 -172.91)" fill="#ff6584"/>
<path id="Path_319" data-name="Path 319" d="M716.37,657.17l-.1,1.43v.1l-.17,2.3-1.33,18.51-1.61,22.3-.46,6.28-1,13.44v.17l-107,1-175.59,1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53,10.53,0,0,1,11.42-10.17c4.72.4,10.85.89,18.18,1.41l3,.22c42.33,2.94,120.56,6.74,199.5,2,1.66-.09,3.33-.19,5-.31,12.24-.77,24.47-1.76,36.58-3a10.53,10.53,0,0,1,11.6,11.23Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_320" data-name="Path 320" d="M429.08,725.44v-.84l175.62-1.91,107-1h.3v-.17l1-13.44.43-6,1.64-22.61,1.29-17.9v-.44a10.617,10.617,0,0,0-.11-2.47.3.3,0,0,0,0-.1,10.391,10.391,0,0,0-2-4.64,10.54,10.54,0,0,0-9.42-4c-12.11,1.24-24.34,2.23-36.58,3-1.67.12-3.34.22-5,.31-78.94,4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54,10.54,0,0,0-11.24,8.53,11,11,0,0,0-.18,1.64l-.68,22.16L429.54,710l-.44,14.36v1.12Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_321" data-name="Path 321" d="M716.67,664.18l-1.23,15.33-1.83,22.85-.46,5.72-1,12.81-.06.64v.17h0l-.15,1.48.11-1.48h-.29l-107,1-175.65,1.9v-.28l.49-14.36,1-28.06.64-18.65A6.36,6.36,0,0,1,434.3,658a6.25,6.25,0,0,1,3.78-.9c2.1.17,4.68.37,7.69.59,4.89.36,10.92.78,17.94,1.22,13,.82,29.31,1.7,48,2.42,52,2,122.2,2.67,188.88-3.17,3-.26,6.1-.55,9.13-.84a6.26,6.26,0,0,1,3.48.66,5.159,5.159,0,0,1,.86.54,6.14,6.14,0,0,1,2,2.46,3.564,3.564,0,0,1,.25.61A6.279,6.279,0,0,1,716.67,664.18Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_322" data-name="Path 322" d="M377.44,677.87v3.19a6.13,6.13,0,0,1-3.5,5.54l-40.1.77a6.12,6.12,0,0,1-3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_323" data-name="Path 323" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_324" data-name="Path 324" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" opacity="0.1"/>
<path id="Path_325" data-name="Path 325" d="M300.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_326" data-name="Path 326" d="M758.56,679.87v3.19a6.13,6.13,0,0,0,3.5,5.54l40.1.77a6.12,6.12,0,0,0,3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_327" data-name="Path 327" d="M678.72,517.57l52.25,1V509.9l-52.25-1Z" opacity="0.1"/>
<path id="Path_328" data-name="Path 328" d="M676.72,517.57l52.25,1V509.9l-52.25-1Z" fill="#3f3d56"/>
<path id="Path_329" data-name="Path 329" d="M534.13,486.79c.08,7-3.16,13.6-5.91,20.07a163.491,163.491,0,0,0-12.66,74.71c.73,11,2.58,22,.73,32.9s-8.43,21.77-19,24.9c17.53,10.45,41.26,9.35,57.76-2.66,8.79-6.4,15.34-15.33,21.75-24.11a97.86,97.86,0,0,1-13.31,44.75A103.43,103.43,0,0,0,637,616.53c4.31-5.81,8.06-12.19,9.72-19.23,3.09-13-1.22-26.51-4.51-39.5a266.055,266.055,0,0,1-6.17-33c-.43-3.56-.78-7.22.1-10.7,1-4.07,3.67-7.51,5.64-11.22,5.6-10.54,5.73-23.3,2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47,1.48-16.14,8.32-22,15.34-4.59,5.46-15.81,15.71-16.6,22.86-.72,6.59,5.1,17.63,6.09,24.58,1.3,9,2.22,6,7.3,11.52C532,478.05,534.07,482,534.13,486.79Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(670.271 615.768)">
<path id="Path_40" data-name="Path 40" d="M99,52h43.635V69.662H99Z" transform="translate(-49.132 -33.936)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M13.389,158.195A10.377,10.377,0,0,1,4.4,153a10.377,10.377,0,0,0,8.988,15.584H23.779V158.195Z" transform="translate(-3 -82.47)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M66.967,38.083l36.373-2.273V30.615A10.389,10.389,0,0,0,92.95,20.226H46.2l-1.3-2.249a1.5,1.5,0,0,0-2.6,0L41,20.226l-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-.034,0-2.152-2.151a1.5,1.5,0,0,0-2.508.672L25.21,21.4l-2.7-.723a1.5,1.5,0,0,0-1.836,1.837l.722,2.7-2.65.71a1.5,1.5,0,0,0-.673,2.509l2.152,2.152c0,.011,0,.022,0,.033l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6L20.226,41l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3A10.389,10.389,0,0,0,30.615,103.34H92.95A10.389,10.389,0,0,0,103.34,92.95V51.393L66.967,49.12a5.53,5.53,0,0,1,0-11.038" transform="translate(-9.836 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,163.779h15.584V143H143Z" transform="translate(-70.275 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M173.779,148.389a2.582,2.582,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-75.08 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,113.389h15.584V103H153Z" transform="translate(-75.08 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M183.389,108.944a1.3,1.3,0,1,0,0-2.6,1.336,1.336,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.337,1.337,0,0,0,.166.017" transform="translate(-84.691 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M52.188,48.292a1.3,1.3,0,0,1-1.3-1.3,3.9,3.9,0,0,0-7.792,0,1.3,1.3,0,1,1-2.6,0,6.493,6.493,0,0,1,12.987,0,1.3,1.3,0,0,1-1.3,1.3" transform="translate(-21.02 -28.41)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,139.752h31.168a10.389,10.389,0,0,0,10.389-10.389V93H113.389A10.389,10.389,0,0,0,103,103.389Z" transform="translate(-51.054 -53.638)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M141.1,94.017H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0-25.877H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.293H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m7.782-47.993c-.006,0-.011,0-.018,0-1.605.055-2.365,1.66-3.035,3.077-.7,1.48-1.24,2.443-2.126,2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344,1.451-3.017,2.684-.715,1.313-1.2,2.112-2.141,2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319,1.239-2.994,2.286-.713,1.106-1.213,1.781-2.164,1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815,3.815,0,0,0-2.959,1.879c-.64.812-1.14,1.456-2.2,1.415a.52.52,0,0,0-.037,1.039,3.588,3.588,0,0,0,3.05-1.811c.611-.777,1.139-1.448,2.178-1.483,1-.043,1.47.579,2.179,1.582.674.953,1.438,2.033,2.977,2.089,1.612.054,2.387-1.151,3.074-2.217.614-.953,1.144-1.775,2.156-1.81.931-.035,1.438.7,2.153,1.912.674,1.141,1.437,2.434,3.006,2.491,1.623.056,2.407-1.361,3.09-2.616.592-1.085,1.15-2.109,2.14-2.143.931-.022,1.417.829,2.135,2.249.671,1.326,1.432,2.828,3.026,2.886l.088,0c1.592,0,2.347-1.6,3.015-3.01.592-1.252,1.152-2.431,2.113-2.479Z" transform="translate(-55.378 -38.552)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,163.779h20.779V143H83Z" transform="translate(-41.443 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 51.971, 43.3)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="43.906" height="17.333" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(0.728 10.948)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="2.537" height="2.537" rx="1" transform="translate(7.985 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="2.537" height="2.537" rx="1" transform="translate(10.991 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="2.537" height="2.537" rx="1" transform="translate(13.997 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="2.537" height="2.537" rx="1" transform="translate(17.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="2.537" height="2.537" rx="1" transform="translate(20.009 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="2.537" height="2.537" rx="1" transform="translate(23.015 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="2.537" height="2.537" rx="1" transform="translate(26.021 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="2.537" height="2.537" rx="1" transform="translate(29.028 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="2.537" height="2.537" rx="1" transform="translate(32.034 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M.519,0H6.9A.519.519,0,0,1,7.421.52v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0ZM35.653,0h6.383a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H35.652a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,35.652,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(0.728 4.878)">
<path id="Path_52" data-name="Path 52" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="2.537" height="2.537" rx="1" transform="translate(31 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="2.537" height="2.537" rx="1" transform="translate(34.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="2.537" height="2.537" rx="1" transform="translate(37.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(43.283 4.538) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(0.728 7.883)">
<path id="Path_54" data-name="Path 54" d="M.519,0h3.47a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(5.073 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="2.537" height="2.537" rx="1" transform="translate(12.025 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="2.537" height="2.537" rx="1" transform="translate(15.031 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="2.537" height="2.537" rx="1" transform="translate(18.037 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="2.537" height="2.537" rx="1" transform="translate(21.042 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="2.537" height="2.537" rx="1" transform="translate(24.049 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="2.537" height="2.537" rx="1" transform="translate(27.055 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="2.537" height="2.537" rx="1" transform="translate(30.061 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M.52,0H3.8a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(38.234 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(0.728 14.084)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M.519,0H14.981A.519.519,0,0,1,15.5.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.018V.519A.519.519,0,0,1,.519,0Zm15.97,0h1.874a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H16.489a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,16.489,0Z" transform="translate(12.024 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="2.537" height="2.537" rx="1" transform="translate(31.376 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="2.537" height="2.537" rx="1" transform="translate(34.382 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(39.736 1.08) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(37.2 1.456)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="42.273" height="1.127" rx="0.564" transform="translate(0.915 0.556)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="2.37" height="0.752" rx="0.376" transform="translate(1.949 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="2.37" height="0.752" rx="0.376" transform="translate(5.193 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="2.37" height="0.752" rx="0.376" transform="translate(7.688 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="2.37" height="0.752" rx="0.376" transform="translate(10.183 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="2.37" height="0.752" rx="0.376" transform="translate(12.679 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="2.37" height="0.752" rx="0.376" transform="translate(15.797 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="2.37" height="0.752" rx="0.376" transform="translate(18.292 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="2.37" height="0.752" rx="0.376" transform="translate(20.788 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="2.37" height="0.752" rx="0.376" transform="translate(23.283 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="2.37" height="0.752" rx="0.376" transform="translate(26.402 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="2.37" height="0.752" rx="0.376" transform="translate(28.897 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="2.37" height="0.752" rx="0.376" transform="translate(31.393 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="2.37" height="0.752" rx="0.376" transform="translate(34.512 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="2.37" height="0.752" rx="0.376" transform="translate(37.007 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="2.37" height="0.752" rx="0.376" transform="translate(39.502 0.744)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M123.779,148.389a2.583,2.583,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-51.054 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,113.389h20.779V103H83Z" transform="translate(-41.443 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M123.389,108.944a1.3,1.3,0,1,0,0-2.6,1.338,1.338,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.335,1.335,0,0,0,.166.017" transform="translate(-55.859 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M141.8,38.745a1.41,1.41,0,0,1-.255-.026,1.309,1.309,0,0,1-.244-.073,1.349,1.349,0,0,1-.224-.119,1.967,1.967,0,0,1-.2-.161,1.52,1.52,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.41,1.41,0,0,1,.026-.255,1.5,1.5,0,0,1,.072-.244,1.364,1.364,0,0,1,.12-.223,1.252,1.252,0,0,1,.358-.358,1.349,1.349,0,0,1,.224-.119,1.309,1.309,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.968,1.968,0,0,1,.2.161,1.908,1.908,0,0,1,.161.2,1.322,1.322,0,0,1,.12.223,1.361,1.361,0,0,1,.1.5,1.317,1.317,0,0,1-.379.919,1.968,1.968,0,0,1-.2.161,1.346,1.346,0,0,1-.223.119,1.332,1.332,0,0,1-.5.1m10.389-.649a1.326,1.326,0,0,1-.92-.379,1.979,1.979,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.326,1.326,0,0,1,.379-.919,1.967,1.967,0,0,1,.2-.161,1.351,1.351,0,0,1,.224-.119,1.308,1.308,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.967,1.967,0,0,1,.2.161,1.326,1.326,0,0,1,.379.919,1.461,1.461,0,0,1-.026.255,1.323,1.323,0,0,1-.073.244,1.847,1.847,0,0,1-.119.223,1.911,1.911,0,0,1-.161.2,1.967,1.967,0,0,1-.2.161,1.294,1.294,0,0,1-.722.218" transform="translate(-69.074 -26.006)" fill-rule="evenodd"/>
</g>
<g id="React-icon" transform="translate(906.3 541.56)">
<path id="Path_330" data-name="Path 330" d="M263.668,117.179c0-5.827-7.3-11.35-18.487-14.775,2.582-11.4,1.434-20.477-3.622-23.382a7.861,7.861,0,0,0-4.016-1v4a4.152,4.152,0,0,1,2.044.466c2.439,1.4,3.5,6.724,2.672,13.574-.2,1.685-.52,3.461-.914,5.272a86.9,86.9,0,0,0-11.386-1.954,87.469,87.469,0,0,0-7.459-8.965c5.845-5.433,11.332-8.41,15.062-8.41V78h0c-4.931,0-11.386,3.514-17.913,9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712,0,9.216,2.959,15.062,8.356a84.687,84.687,0,0,0-7.405,8.947,83.732,83.732,0,0,0-11.4,1.972c-.412-1.793-.717-3.532-.932-5.2-.843-6.85.2-12.175,2.618-13.592a3.991,3.991,0,0,1,2.062-.466v-4h0a8,8,0,0,0-4.052,1c-5.039,2.9-6.168,11.96-3.568,23.328-11.153,3.443-18.415,8.947-18.415,14.757,0,5.828,7.3,11.35,18.487,14.775-2.582,11.4-1.434,20.477,3.622,23.382a7.882,7.882,0,0,0,4.034,1c4.931,0,11.386-3.514,17.913-9.611,6.527,6.061,12.982,9.539,17.913,9.539a8,8,0,0,0,4.052-1c5.039-2.9,6.168-11.96,3.568-23.328C256.406,128.511,263.668,122.988,263.668,117.179Zm-23.346-11.96c-.663,2.313-1.488,4.7-2.421,7.083-.735-1.434-1.506-2.869-2.349-4.3-.825-1.434-1.7-2.833-2.582-4.2C235.517,104.179,237.974,104.645,240.323,105.219Zm-8.212,19.1c-1.4,2.421-2.833,4.716-4.321,6.85-2.672.233-5.379.359-8.1.359-2.708,0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136c1.112-2.4,2.367-4.805,3.712-7.154,1.4-2.421,2.833-4.716,4.321-6.85,2.672-.233,5.379-.359,8.1-.359,2.708,0,5.415.126,8.069.341q2.232,3.2,4.339,6.814,2.044,3.523,3.73,7.136C234.692,119.564,233.455,121.966,232.11,124.315Zm5.792-2.331c.968,2.4,1.793,4.805,2.474,7.136-2.349.574-4.823,1.058-7.387,1.434.879-1.381,1.757-2.8,2.582-4.25C236.4,124.871,237.167,123.419,237.9,121.984ZM219.72,141.116a73.921,73.921,0,0,1-4.985-5.738c1.614.072,3.263.126,4.931.126,1.685,0,3.353-.036,4.985-.126A69.993,69.993,0,0,1,219.72,141.116ZM206.38,130.555c-2.546-.377-5-.843-7.352-1.417.663-2.313,1.488-4.7,2.421-7.083.735,1.434,1.506,2.869,2.349,4.3S205.5,129.192,206.38,130.555ZM219.63,93.241a73.924,73.924,0,0,1,4.985,5.738c-1.614-.072-3.263-.126-4.931-.126-1.686,0-3.353.036-4.985.126A69.993,69.993,0,0,1,219.63,93.241ZM206.362,103.8c-.879,1.381-1.757,2.8-2.582,4.25-.825,1.434-1.6,2.869-2.331,4.3-.968-2.4-1.793-4.805-2.474-7.136C201.323,104.663,203.8,104.179,206.362,103.8Zm-16.227,22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383,10.454-9.073c1.542-.663,3.228-1.255,4.967-1.811a86.122,86.122,0,0,0,4.034,10.92,84.9,84.9,0,0,0-3.981,10.866C193.38,127.525,191.694,126.915,190.134,126.252Zm9.647,25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9,86.9,0,0,0,11.386,1.954,87.465,87.465,0,0,0,7.459,8.965c-5.845,5.433-11.332,8.41-15.062,8.41A4.279,4.279,0,0,1,199.781,151.875Zm42.532-13.663c.843,6.85-.2,12.175-2.618,13.592a3.99,3.99,0,0,1-2.062.466c-3.712,0-9.216-2.959-15.062-8.356a84.689,84.689,0,0,0,7.405-8.947,83.731,83.731,0,0,0,11.4-1.972A50.194,50.194,0,0,1,242.313,138.212Zm6.9-11.96c-1.542.663-3.228,1.255-4.967,1.811a86.12,86.12,0,0,0-4.034-10.92,84.9,84.9,0,0,0,3.981-10.866c1.775.556,3.461,1.165,5.039,1.829,6.348,2.708,10.454,6.258,10.454,9.073C259.67,119.994,255.564,123.562,249.216,126.252Z" fill="#61dafb"/>
<path id="Path_331" data-name="Path 331" d="M320.8,78.4Z" transform="translate(-119.082 -0.328)" fill="#61dafb"/>
<circle id="Ellipse_112" data-name="Ellipse 112" cx="8.194" cy="8.194" r="8.194" transform="translate(211.472 108.984)" fill="#61dafb"/>
<path id="Path_332" data-name="Path 332" d="M520.5,78.1Z" transform="translate(-282.975 -0.082)" fill="#61dafb"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1129" height="663" viewBox="0 0 1129 663">
<title>Focus on What Matters</title>
<circle cx="321" cy="321" r="321" fill="#f2f2f2" />
<ellipse cx="559" cy="635.49998" rx="514" ry="27.50002" fill="#3f3d56" />
<ellipse cx="558" cy="627" rx="460" ry="22" opacity="0.2" />
<rect x="131" y="152.5" width="840" height="50" fill="#3f3d56" />
<path d="M166.5,727.3299A21.67009,21.67009,0,0,0,188.1701,749H984.8299A21.67009,21.67009,0,0,0,1006.5,727.3299V296h-840Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" opacity="0.2" />
<circle cx="181" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="217" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="253" cy="147.5" r="13" fill="#3f3d56" />
<rect x="168" y="213.5" width="337" height="386" rx="5.33505" fill="#606060" />
<rect x="603" y="272.5" width="284" height="22" rx="5.47638" fill="#2e8555" />
<rect x="537" y="352.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="396.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="440.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="484.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="865" y="552.5" width="88" height="26" rx="7.02756" fill="#3ecc5f" />
<path d="M1088.60287,624.61594a30.11371,30.11371,0,0,0,3.98291-15.266c0-13.79652-8.54358-24.98081-19.08256-24.98081s-19.08256,11.18429-19.08256,24.98081a30.11411,30.11411,0,0,0,3.98291,15.266,31.248,31.248,0,0,0,0,30.53213,31.248,31.248,0,0,0,0,30.53208,31.248,31.248,0,0,0,0,30.53208,30.11408,30.11408,0,0,0-3.98291,15.266c0,13.79652,8.54353,24.98081,19.08256,24.98081s19.08256-11.18429,19.08256-24.98081a30.11368,30.11368,0,0,0-3.98291-15.266,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53213Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="460.31783" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="429.78574" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<path d="M1144.93871,339.34489a91.61081,91.61081,0,0,0,7.10658-10.46092l-50.141-8.23491,54.22885.4033a91.566,91.566,0,0,0,1.74556-72.42605l-72.75449,37.74139,67.09658-49.32086a91.41255,91.41255,0,1,0-150.971,102.29805,91.45842,91.45842,0,0,0-10.42451,16.66946l65.0866,33.81447-69.40046-23.292a91.46011,91.46011,0,0,0,14.73837,85.83669,91.40575,91.40575,0,1,0,143.68892,0,91.41808,91.41808,0,0,0,0-113.02862Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M981.6885,395.8592a91.01343,91.01343,0,0,0,19.56129,56.51431,91.40575,91.40575,0,1,0,143.68892,0C1157.18982,436.82067,981.6885,385.60008,981.6885,395.8592Z" transform="translate(-35.5 -118.5)" opacity="0.1" />
<path d="M365.62,461.43628H477.094v45.12043H365.62Z" transform="translate(-35.5 -118.5)" fill="#fff" fill-rule="evenodd" />
<path d="M264.76252,608.74122a26.50931,26.50931,0,0,1-22.96231-13.27072,26.50976,26.50976,0,0,0,22.96231,39.81215H291.304V608.74122Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M384.17242,468.57061l92.92155-5.80726V449.49263a26.54091,26.54091,0,0,0-26.54143-26.54143H331.1161l-3.31768-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622-3.31767-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622L301.257,417.205a3.83043,3.83043,0,0,0-6.63536,0L291.304,422.9512c-.02919,0-.05573.004-.08625.004l-5.49674-5.49541a3.8293,3.8293,0,0,0-6.4071,1.71723l-1.81676,6.77338L270.607,424.1031a3.82993,3.82993,0,0,0-4.6912,4.69253l1.84463,6.89148-6.77072,1.81411a3.8315,3.8315,0,0,0-1.71988,6.40975l5.49673,5.49673c0,.02787-.004.05574-.004.08493l-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74621,3.31768L259.0163,466.081a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768L259.0163,558.976a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768A26.54091,26.54091,0,0,0,291.304,635.28265H450.55254A26.5409,26.5409,0,0,0,477.094,608.74122V502.5755l-92.92155-5.80727a14.12639,14.12639,0,0,1,0-28.19762" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,635.28265h39.81214V582.19979H424.01111Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15393-.59852A6.62668,6.62668,0,1,0,482.80568,590.21q-.2203-.22491-.44457-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39414-.10218-.59056-.15262a6.63957,6.63957,0,1,0-13.10086,0c-.1964.05042-.39414.09687-.59056.15262a6.62767,6.62767,0,1,0-11.39688,6.56369,26.52754,26.52754,0,1,0,44.23127,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M437.28182,555.65836H477.094V529.11693H437.28182Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,545.70532a3.31768,3.31768,0,0,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M317.84538,466.081a3.31768,3.31768,0,0,1-3.31767-3.31768,9.953,9.953,0,1,0-19.90608,0,3.31768,3.31768,0,1,1-6.63535,0,16.58839,16.58839,0,1,1,33.17678,0,3.31768,3.31768,0,0,1-3.31768,3.31768" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M370.92825,635.28265h79.62429A26.5409,26.5409,0,0,0,477.094,608.74122v-92.895H397.46968a26.54091,26.54091,0,0,0-26.54143,26.54143Z" transform="translate(-35.5 -118.5)" fill="#ffff50" fill-rule="evenodd" />
<path d="M457.21444,556.98543H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0-66.10674H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.29459H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414M477.094,474.19076c-.01592,0-.0292-.008-.04512-.00663-4.10064.13934-6.04083,4.24132-7.75274,7.86024-1.78623,3.78215-3.16771,6.24122-5.43171,6.16691-2.50685-.09024-3.94007-2.92222-5.45825-5.91874-1.74377-3.44243-3.73438-7.34667-7.91333-7.20069-4.04227.138-5.98907,3.70784-7.70631,6.857-1.82738,3.35484-3.07084,5.39455-5.46887,5.30033-2.55727-.09289-3.91619-2.39536-5.48877-5.06013-1.75306-2.96733-3.77951-6.30359-7.8775-6.18946-3.97326.13669-5.92537,3.16507-7.64791,5.83912-1.82207,2.82666-3.09872,4.5492-5.52725,4.447-2.61832-.09289-3.9706-2.00388-5.53522-4.21611-1.757-2.4856-3.737-5.299-7.82308-5.16231-3.88567.13271-5.83779,2.61434-7.559,4.80135-1.635,2.07555-2.9116,3.71846-5.61218,3.615a1.32793,1.32793,0,1,0-.09555,2.65414c4.00377.134,6.03154-2.38873,7.79257-4.6275,1.562-1.9853,2.91027-3.69855,5.56441-3.78879,2.55594-.10882,3.75429,1.47968,5.56707,4.04093,1.7212,2.43385,3.67465,5.19416,7.60545,5.33616,4.11789.138,6.09921-2.93946,7.8536-5.66261,1.56861-2.43385,2.92221-4.53461,5.50734-4.62352,2.37944-.08892,3.67466,1.79154,5.50072,4.885,1.72121,2.91557,3.67069,6.21865,7.67977,6.36463,4.14709.14332,6.14965-3.47693,7.89475-6.68181,1.51155-2.77092,2.93814-5.38791,5.46621-5.4755,2.37944-.05573,3.62025,2.11668,5.45558,5.74622,1.71459,3.388,3.65875,7.22591,7.73019,7.37321l.22429.004c4.06614,0,5.99571-4.08074,7.70364-7.68905,1.51154-3.19825,2.94211-6.21069,5.3972-6.33411Z" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M344.38682,635.28265h53.08286V582.19979H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15394-.59852A6.62667,6.62667,0,1,0,416.45211,590.21q-.2203-.22491-.44458-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39413-.10218-.59054-.15262a6.63957,6.63957,0,1,0-13.10084,0c-.19641.05042-.39414.09687-.59055.15262a6.62767,6.62767,0,1,0-11.39689,6.56369,26.52755,26.52755,0,1,0,44.2313,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M344.38682,555.65836h53.08286V529.11693H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M410.74039,545.70532a3.31768,3.31768,0,1,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M424.01111,447.8338a3.60349,3.60349,0,0,1-.65028-.06636,3.34415,3.34415,0,0,1-.62372-.18579,3.44679,3.44679,0,0,1-.572-.30522,5.02708,5.02708,0,0,1-.50429-.4114,3.88726,3.88726,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.60248,3.60248,0,0,1,.06636-.65027,3.82638,3.82638,0,0,1,.18447-.62373,3.48858,3.48858,0,0,1,.30656-.57064,3.197,3.197,0,0,1,.91436-.91568,3.44685,3.44685,0,0,1,.572-.30523,3.344,3.344,0,0,1,.62372-.18578,3.06907,3.06907,0,0,1,1.30053,0,3.22332,3.22332,0,0,1,1.19436.491,5.02835,5.02835,0,0,1,.50429.41139,4.8801,4.8801,0,0,1,.41139.50429,3.38246,3.38246,0,0,1,.30522.57064,3.47806,3.47806,0,0,1,.25215,1.274A3.36394,3.36394,0,0,1,426.36,446.865a5.02708,5.02708,0,0,1-.50429.4114,3.3057,3.3057,0,0,1-1.84463.55737m26.54143-1.65884a3.38754,3.38754,0,0,1-2.35024-.96877,5.04185,5.04185,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.38659,3.38659,0,0,1,.96744-2.34892,5.02559,5.02559,0,0,1,.50429-.41139,3.44685,3.44685,0,0,1,.572-.30523,3.3432,3.3432,0,0,1,.62373-.18579,3.06952,3.06952,0,0,1,1.30052,0,3.22356,3.22356,0,0,1,1.19436.491,5.02559,5.02559,0,0,1,.50429.41139,3.38792,3.38792,0,0,1,.96876,2.34892,3.72635,3.72635,0,0,1-.06636.65026,3.37387,3.37387,0,0,1-.18579.62373,4.71469,4.71469,0,0,1-.30522.57064,4.8801,4.8801,0,0,1-.41139.50429,5.02559,5.02559,0,0,1-.50429.41139,3.30547,3.30547,0,0,1-1.84463.55737" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

8
docs/tsconfig.json Normal file
View File

@ -0,0 +1,8 @@
{
// This file is not used in compilation. It is here just for a nice editor experience.
"extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
},
"exclude": [".docusaurus", "build"]
}

View File

@ -0,0 +1,11 @@
import * as React from "react";
import { type VariantProps } from "class-variance-authority";
declare const buttonVariants: (props?: ({
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
size?: "default" | "sm" | "lg" | "icon" | null | undefined;
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
asChild?: boolean;
}
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
export { Button, buttonVariants };

View File

@ -0,0 +1,44 @@
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva } from "class-variance-authority";
import { cn } from "../../utils";
const buttonVariants = cva("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", {
variants: {
variant: {
default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2",
sm: "h-8 rounded-md px-3 text-xs",
lg: "h-10 rounded-md px-8",
icon: "h-9 w-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
});
const Button = React.forwardRef((_a, ref) => {
var { className, variant, size, asChild = false } = _a, props = __rest(_a, ["className", "variant", "size", "asChild"]);
const Comp = asChild ? Slot : "button";
return (React.createElement(Comp, Object.assign({ className: cn(buttonVariants({ variant, size, className })), ref: ref }, props)));
});
Button.displayName = "Button";
export { Button, buttonVariants };

View File

@ -0,0 +1,8 @@
import * as React from "react";
declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };

View File

@ -0,0 +1,44 @@
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import * as React from "react";
import { cn } from "../../utils";
const Card = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement("div", Object.assign({ ref: ref, className: cn("rounded-xl border bg-card text-card-foreground shadow", className) }, props)));
});
Card.displayName = "Card";
const CardHeader = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement("div", Object.assign({ ref: ref, className: cn("flex flex-col space-y-1.5 p-6", className) }, props)));
});
CardHeader.displayName = "CardHeader";
const CardTitle = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement("h3", Object.assign({ ref: ref, className: cn("font-semibold leading-none tracking-tight", className) }, props)));
});
CardTitle.displayName = "CardTitle";
const CardDescription = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement("p", Object.assign({ ref: ref, className: cn("text-sm text-muted-foreground", className) }, props)));
});
CardDescription.displayName = "CardDescription";
const CardContent = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement("div", Object.assign({ ref: ref, className: cn("p-6 pt-0", className) }, props)));
});
CardContent.displayName = "CardContent";
const CardFooter = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement("div", Object.assign({ ref: ref, className: cn("flex items-center p-6 pt-0", className) }, props)));
});
CardFooter.displayName = "CardFooter";
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };

View File

@ -0,0 +1,9 @@
export * from './button';
export * from './card';
export * from './collapsible';
export * from './floating-action-button';
export * from './input';
export * from './layout';
export * from './sheet';
export * from './switch';
export * from './scroll-area';

View File

@ -0,0 +1,9 @@
export * from './button';
export * from './card';
export * from './collapsible';
export * from './floating-action-button';
export * from './input';
export * from './layout';
export * from './sheet';
export * from './switch';
export * from './scroll-area';

View File

@ -0,0 +1,5 @@
import * as React from "react";
export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
}
declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
export { Input };

View File

@ -0,0 +1,19 @@
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import * as React from "react";
import { cn } from "../../utils";
const Input = React.forwardRef((_a, ref) => {
var { className, type } = _a, props = __rest(_a, ["className", "type"]);
return (React.createElement("input", Object.assign({ type: type, className: cn("flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50", className), ref: ref }, props)));
});
Input.displayName = "Input";
export { Input };

View File

@ -0,0 +1,4 @@
import * as React from "react";
import * as SwitchPrimitives from "@radix-ui/react-switch";
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitives.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
export { Switch };

View File

@ -0,0 +1,21 @@
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import * as React from "react";
import * as SwitchPrimitives from "@radix-ui/react-switch";
import { cn } from "../../utils";
const Switch = React.forwardRef((_a, ref) => {
var { className } = _a, props = __rest(_a, ["className"]);
return (React.createElement(SwitchPrimitives.Root, Object.assign({ className: cn("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input", className) }, props, { ref: ref }),
React.createElement(SwitchPrimitives.Thumb, { className: cn("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0") })));
});
Switch.displayName = SwitchPrimitives.Root.displayName;
export { Switch };

11
frontend/common/dist/index.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
import './styles/global.css';
export * from './utils/types';
export * from './utils';
export * from './components/ui';
export * from './components/TimelineStep';
export * from './components/TimelineFeed';
export * from './components/SessionDrawer';
export * from './components/SessionSidebar';
export * from './components/DefaultAgentScreen';
export declare const hello: () => void;
export { getSampleAgentSteps, getSampleAgentSessions } from './utils/sample-data';

22
frontend/common/dist/index.js vendored Normal file
View File

@ -0,0 +1,22 @@
// Entry point for @ra-aid/common package
import './styles/global.css';
// Export types first to avoid circular references
export * from './utils/types';
// Export utility functions
export * from './utils';
// Export UI components
export * from './components/ui';
// Export timeline components
export * from './components/TimelineStep';
export * from './components/TimelineFeed';
// Export session navigation components
export * from './components/SessionDrawer';
export * from './components/SessionSidebar';
// Export main screens
export * from './components/DefaultAgentScreen';
// Export the hello function (temporary example)
export const hello = () => {
console.log("Hello from @ra-aid/common");
};
// Directly export sample data functions
export { getSampleAgentSteps, getSampleAgentSessions } from './utils/sample-data';

1572
frontend/common/dist/styles/global.css vendored Normal file

File diff suppressed because it is too large Load Diff

7
frontend/common/dist/utils.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
import { type ClassValue } from "clsx";
/**
* Merges class names with Tailwind CSS classes
* Combines clsx for conditional logic and tailwind-merge for handling conflicting tailwind classes
*/
export declare function cn(...inputs: ClassValue[]): string;
export * from './utils';

11
frontend/common/dist/utils.js vendored Normal file
View File

@ -0,0 +1,11 @@
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge";
/**
* Merges class names with Tailwind CSS classes
* Combines clsx for conditional logic and tailwind-merge for handling conflicting tailwind classes
*/
export function cn(...inputs) {
return twMerge(clsx(inputs));
}
// Re-export everything from utils directory
export * from './utils';

3155
frontend/common/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
{
"name": "@ra-aid/common",
"version": "1.0.0",
"private": true,
"main": "src/index.ts",
"types": "src/index.ts",
"scripts": {
"build": "tsc && postcss src/styles/global.css -o dist/styles/global.css",
"dev": "tsc --watch",
"watch:css": "postcss src/styles/global.css -o dist/styles/global.css --watch",
"watch": "concurrently \"npm run dev\" \"npm run watch:css\"",
"prepare": "npm run build"
},
"dependencies": {
"@radix-ui/react-collapsible": "^1.1.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-popover": "^1.0.7",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.0.0",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-switch": "^1.1.3",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"lucide-react": "^0.363.0",
"tailwind-merge": "^2.2.0",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@types/react": "^18.2.64",
"@types/react-dom": "^18.2.21",
"autoprefixer": "^10.4.17",
"concurrently": "^8.2.2",
"postcss": "^8.4.35",
"postcss-cli": "^10.1.0",
"tailwindcss": "^3.4.1",
"typescript": "^5.0.0"
},
"peerDependencies": {
"react": ">=18.0.0",
"react-dom": ">=18.0.0"
}
}

View File

@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,258 @@
import React, { useState, useEffect } from 'react';
import { createPortal } from 'react-dom';
import { PanelLeft } from 'lucide-react';
import {
Button,
Layout
} from './ui';
import { SessionDrawer } from './SessionDrawer';
import { SessionList } from './SessionList';
import { TimelineFeed } from './TimelineFeed';
import { getSampleAgentSessions, getSampleAgentSteps } from '../utils/sample-data';
import logoBlack from '../assets/logo-black-transparent.png';
import logoWhite from '../assets/logo-white-transparent.gif';
/**
* DefaultAgentScreen component
*
* Main application screen for displaying agent sessions and their steps.
* Handles state management, responsive design, and UI interactions.
*/
export const DefaultAgentScreen: React.FC = () => {
// State for drawer open/close
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
// State for selected session
const [selectedSessionId, setSelectedSessionId] = useState<string | null>(null);
// State for theme (dark is default)
const [isDarkTheme, setIsDarkTheme] = useState(true);
// Get sample data
const sessions = getSampleAgentSessions();
const allSteps = getSampleAgentSteps();
// Set up theme on component mount
useEffect(() => {
const isDark = setupTheme();
setIsDarkTheme(isDark);
}, []);
// Set initial selected session if none selected
useEffect(() => {
if (!selectedSessionId && sessions.length > 0) {
setSelectedSessionId(sessions[0].id);
}
}, [sessions, selectedSessionId]);
// Close drawer when window resizes to desktop width
useEffect(() => {
const handleResize = () => {
// Check if we're at desktop size (corresponds to md: breakpoint in Tailwind)
if (window.innerWidth >= 768 && isDrawerOpen) {
setIsDrawerOpen(false);
}
};
// Add event listener
window.addEventListener('resize', handleResize);
// Clean up event listener on component unmount
return () => window.removeEventListener('resize', handleResize);
}, [isDrawerOpen]);
// Filter steps for selected session
const selectedSessionSteps = selectedSessionId
? allSteps.filter(step => sessions.find(s => s.id === selectedSessionId)?.steps.some(s => s.id === step.id))
: [];
// Handle session selection
const handleSessionSelect = (sessionId: string) => {
setSelectedSessionId(sessionId);
setIsDrawerOpen(false); // Close drawer on selection (mobile)
};
// Toggle theme function
const toggleTheme = () => {
const newIsDark = !isDarkTheme;
setIsDarkTheme(newIsDark);
// Update document element class
if (newIsDark) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
// Save to localStorage
localStorage.setItem('theme', newIsDark ? 'dark' : 'light');
};
// Render header content
const headerContent = (
<div className="w-full flex items-center justify-between h-full px-4">
<div className="flex-initial">
{/* Use the appropriate logo based on theme */}
<img
src={isDarkTheme ? logoWhite : logoBlack}
alt="RA.Aid Logo"
className="h-8"
/>
</div>
<div className="flex-initial ml-auto">
{/* Theme toggle button */}
<Button
variant="ghost"
size="icon"
onClick={toggleTheme}
aria-label={isDarkTheme ? "Switch to light mode" : "Switch to dark mode"}
>
{isDarkTheme ? (
// Sun icon for light mode toggle
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<circle cx="12" cy="12" r="5" />
<line x1="12" y1="1" x2="12" y2="3" />
<line x1="12" y1="21" x2="12" y2="23" />
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64" />
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78" />
<line x1="1" y1="12" x2="3" y2="12" />
<line x1="21" y1="12" x2="23" y2="12" />
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36" />
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22" />
</svg>
) : (
// Moon icon for dark mode toggle
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
</svg>
)}
</Button>
</div>
</div>
);
// Sidebar content with sessions list
const sidebarContent = (
<div className="h-full flex flex-col px-4 py-3">
<SessionList
sessions={sessions}
onSelectSession={handleSessionSelect}
currentSessionId={selectedSessionId || undefined}
className="flex-1 pr-1 -mr-1"
/>
</div>
);
// Render drawer
const drawerContent = (
<SessionDrawer
sessions={sessions}
currentSessionId={selectedSessionId || undefined}
onSelectSession={handleSessionSelect}
isOpen={isDrawerOpen}
onClose={() => setIsDrawerOpen(false)}
/>
);
// Render main content
const mainContent = (
selectedSessionId ? (
<>
<h2 className="text-xl font-semibold mb-4">
Session: {sessions.find(s => s.id === selectedSessionId)?.name || 'Unknown'}
</h2>
<TimelineFeed
steps={selectedSessionSteps}
/>
</>
) : (
<div className="flex items-center justify-center h-full">
<p className="text-muted-foreground">Select a session to view details</p>
</div>
)
);
// Floating action button component that uses Portal to render at document body level
const FloatingActionButton = ({ onClick }: { onClick: () => void }) => {
// Only render the portal on the client side, not during SSR
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
return () => setMounted(false);
}, []);
const button = (
<Button
variant="default"
size="icon"
onClick={onClick}
aria-label="Toggle sessions panel"
className="h-14 w-14 rounded-full shadow-xl bg-zinc-800 hover:bg-zinc-700 text-zinc-100 flex items-center justify-center border-2 border-zinc-700 dark:border-zinc-600"
>
<PanelLeft className="h-6 w-6" />
</Button>
);
const container = (
<div className="fixed bottom-6 right-6 z-[9999] md:hidden" style={{ pointerEvents: 'auto' }}>
{button}
</div>
);
// Return null during SSR, or the portal on the client
return mounted ? createPortal(container, document.body) : null;
};
return (
<>
<Layout
header={headerContent}
sidebar={sidebarContent}
drawer={drawerContent}
>
{mainContent}
</Layout>
<FloatingActionButton onClick={() => setIsDrawerOpen(true)} />
</>
);
};
// Helper function for theme setup
const setupTheme = () => {
// Check if theme preference is stored in localStorage
const storedTheme = localStorage.getItem('theme');
// Default to dark mode unless explicitly set to light
const isDark = storedTheme ? storedTheme === 'dark' : true;
// Apply theme to document
if (isDark) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
return isDark;
};

View File

@ -0,0 +1,47 @@
import React from 'react';
import {
Sheet,
SheetContent,
SheetHeader,
SheetTitle,
SheetClose
} from './ui/sheet';
import { AgentSession } from '../utils/types';
import { getSampleAgentSessions } from '../utils/sample-data';
import { SessionList } from './SessionList';
interface SessionDrawerProps {
onSelectSession?: (sessionId: string) => void;
currentSessionId?: string;
sessions?: AgentSession[];
isOpen?: boolean;
onClose?: () => void;
}
export const SessionDrawer: React.FC<SessionDrawerProps> = ({
onSelectSession,
currentSessionId,
sessions = getSampleAgentSessions(),
isOpen = false,
onClose
}) => {
return (
<Sheet open={isOpen} onOpenChange={onClose}>
<SheetContent
side="left"
className="w-full sm:max-w-md border-r border-border p-4"
>
<SheetHeader className="px-2">
<SheetTitle>Sessions</SheetTitle>
</SheetHeader>
<SessionList
sessions={sessions}
currentSessionId={currentSessionId}
onSelectSession={onSelectSession}
className="h-[calc(100vh-9rem)] mt-4"
wrapperComponent={SheetClose}
/>
</SheetContent>
</Sheet>
);
};

View File

@ -0,0 +1,93 @@
import React from 'react';
import { ScrollArea } from './ui/scroll-area';
import { AgentSession } from '../utils/types';
import { getSampleAgentSessions } from '../utils/sample-data';
interface SessionListProps {
onSelectSession?: (sessionId: string) => void;
currentSessionId?: string;
sessions?: AgentSession[];
className?: string;
wrapperComponent?: React.ElementType;
closeAction?: React.ReactNode;
}
export const SessionList: React.FC<SessionListProps> = ({
onSelectSession,
currentSessionId,
sessions = getSampleAgentSessions(),
className = '',
wrapperComponent: WrapperComponent = 'button',
closeAction
}) => {
// Get status color
const getStatusColor = (status: string) => {
switch (status) {
case 'active':
return 'bg-blue-500';
case 'completed':
return 'bg-green-500';
case 'error':
return 'bg-red-500';
default:
return 'bg-gray-500';
}
};
// Format timestamp
const formatDate = (date: Date) => {
return date.toLocaleDateString([], {
month: 'short',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
};
return (
<ScrollArea className={className}>
<div className="space-y-1.5 pt-1.5 pb-2">
{sessions.map((session) => {
const buttonContent = (
<>
<div className={`w-2.5 h-2.5 rounded-full ${getStatusColor(session.status)} mt-1.5 mr-3 flex-shrink-0`} />
<div className="flex-1 min-w-0 pr-1">
<div className="font-medium text-sm+ break-words">{session.name}</div>
<div className="text-xs text-muted-foreground mt-1 break-words">
{session.steps.length} steps {formatDate(session.updated)}
</div>
<div className="text-xs text-muted-foreground mt-0.5 break-words">
<span className="capitalize">{session.status}</span>
</div>
</div>
</>
);
return React.createElement(
WrapperComponent,
{
key: session.id,
onClick: () => onSelectSession?.(session.id),
className: `w-full flex items-start px-3 py-2.5 text-left rounded-md transition-colors hover:bg-accent/50 ${
currentSessionId === session.id ? 'bg-accent' : ''
}`
},
closeAction ? (
<>
{buttonContent}
<div className="ml-2 flex-shrink-0 self-center">
{React.cloneElement(closeAction as React.ReactElement, {
onClick: (e: React.MouseEvent) => {
e.stopPropagation();
onSelectSession?.(session.id);
}
})}
</div>
</>
) : buttonContent
);
})}
</div>
</ScrollArea>
);
};

View File

@ -0,0 +1,32 @@
import React from 'react';
import { AgentSession } from '../utils/types';
import { getSampleAgentSessions } from '../utils/sample-data';
import { SessionList } from './SessionList';
interface SessionSidebarProps {
onSelectSession?: (sessionId: string) => void;
currentSessionId?: string;
sessions?: AgentSession[];
className?: string;
}
export const SessionSidebar: React.FC<SessionSidebarProps> = ({
onSelectSession,
currentSessionId,
sessions = getSampleAgentSessions(),
className = ''
}) => {
return (
<div className={`flex flex-col h-full ${className}`}>
<div className="p-4 border-b border-border">
<h3 className="font-medium text-lg">Sessions</h3>
</div>
<SessionList
sessions={sessions}
currentSessionId={currentSessionId}
onSelectSession={onSelectSession}
className="flex-1"
/>
</div>
);
};

View File

@ -0,0 +1,45 @@
import React, { useMemo } from 'react';
import { TimelineStep } from './TimelineStep';
import { AgentStep } from '../utils/types';
interface TimelineFeedProps {
steps: AgentStep[];
maxHeight?: string;
}
export const TimelineFeed: React.FC<TimelineFeedProps> = ({
steps,
maxHeight
}) => {
// Always use 'desc' (newest first) sort order
const sortOrder = 'desc';
// Sort steps with newest first (desc order)
const sortedSteps = useMemo(() => {
return [...steps].sort((a, b) => {
return b.timestamp.getTime() - a.timestamp.getTime();
});
}, [steps]);
return (
<div className="w-full rounded-md bg-background">
<div
className="px-3 py-3 space-y-4 overflow-auto"
style={{ maxHeight: maxHeight || undefined }}
>
{sortedSteps.length > 0 ? (
sortedSteps.map((step) => (
<TimelineStep key={step.id} step={step} />
))
) : (
<div className="text-center text-muted-foreground py-12 border border-dashed border-border rounded-md">
<svg xmlns="http://www.w3.org/2000/svg" className="h-8 w-8 mx-auto mb-2 text-muted-foreground/50" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<p>No steps to display</p>
</div>
)}
</div>
</div>
);
}

View File

@ -0,0 +1,99 @@
import React from 'react';
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';
import { AgentStep } from '../utils/types';
interface TimelineStepProps {
step: AgentStep;
}
export const TimelineStep: React.FC<TimelineStepProps> = ({ step }) => {
// Get status color
const getStatusColor = (status: string) => {
switch (status) {
case 'completed':
return 'bg-green-500';
case 'in-progress':
return 'bg-blue-500';
case 'error':
return 'bg-red-500';
case 'pending':
return 'bg-yellow-500';
default:
return 'bg-gray-500';
}
};
// Get icon based on step type
const getTypeIcon = (type: string) => {
switch (type) {
case 'tool-execution':
return '🛠️';
case 'thinking':
return '💭';
case 'planning':
return '📝';
case 'implementation':
return '💻';
case 'user-input':
return '👤';
default:
return '▶️';
}
};
// Format timestamp
const formatTime = (timestamp: Date) => {
return timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
};
return (
<Collapsible className="w-full mb-5 border border-border rounded-md overflow-hidden shadow-sm hover:shadow-md transition-all duration-200">
<CollapsibleTrigger className="w-full flex items-center justify-between p-4 text-left hover:bg-accent/30 cursor-pointer group">
<div className="flex items-center space-x-3 min-w-0 flex-1 pr-3">
<div className={`flex-shrink-0 w-3 h-3 rounded-full ${getStatusColor(step.status)} ring-1 ring-ring/20`} />
<div className="flex-shrink-0 text-lg group-hover:scale-110 transition-transform">{getTypeIcon(step.type)}</div>
<div className="min-w-0 flex-1">
<div className="font-medium text-foreground break-words">{step.title}</div>
<div className="text-sm text-muted-foreground line-clamp-2">
{step.type === 'tool-execution' ? 'Run tool' : step.content.substring(0, 60)}
{step.content.length > 60 ? '...' : ''}
</div>
</div>
</div>
<div className="text-xs text-muted-foreground flex flex-col items-end flex-shrink-0 min-w-[70px] text-right">
<span className="font-medium">{formatTime(step.timestamp)}</span>
{step.duration && (
<span className="mt-1 px-2 py-0.5 bg-secondary/50 rounded-full">
{(step.duration / 1000).toFixed(1)}s
</span>
)}
</div>
</CollapsibleTrigger>
<CollapsibleContent>
<div className="p-5 bg-card/50 border-t border-border">
<div className="text-sm break-words text-foreground leading-relaxed">
{step.content}
</div>
{step.duration && (
<div className="mt-4 pt-3 border-t border-border/50">
<div className="text-xs text-muted-foreground flex items-center">
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-3.5 w-3.5 mr-1"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth={2}
>
<circle cx="12" cy="12" r="10" />
<polyline points="12 6 12 12 16 14" />
</svg>
Duration: {(step.duration / 1000).toFixed(1)} seconds
</div>
</div>
)}
</div>
</CollapsibleContent>
</Collapsible>
);
};

View File

@ -0,0 +1,57 @@
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "../../utils";
const buttonVariants = cva(
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
destructive:
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
outline:
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
secondary:
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2",
sm: "h-8 rounded-md px-3 text-xs",
lg: "h-10 rounded-md px-8",
icon: "h-9 w-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
);
export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean;
}
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button";
return (
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>
);
}
);
Button.displayName = "Button";
export { Button, buttonVariants };

View File

@ -0,0 +1,76 @@
import * as React from "react";
import { cn } from "../../utils";
const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
"rounded-xl border bg-card text-card-foreground shadow",
className
)}
{...props}
/>
));
Card.displayName = "Card";
const CardHeader = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex flex-col space-y-1.5 p-6", className)}
{...props}
/>
));
CardHeader.displayName = "CardHeader";
const CardTitle = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
<h3
ref={ref}
className={cn("font-semibold leading-none tracking-tight", className)}
{...props}
/>
));
CardTitle.displayName = "CardTitle";
const CardDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
CardDescription.displayName = "CardDescription";
const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
));
CardContent.displayName = "CardContent";
const CardFooter = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex items-center p-6 pt-0", className)}
{...props}
/>
));
CardFooter.displayName = "CardFooter";
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };

View File

@ -0,0 +1,27 @@
import * as React from "react"
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"
import { cn } from "../../utils"
const Collapsible = CollapsiblePrimitive.Root
const CollapsibleTrigger = CollapsiblePrimitive.Trigger
const CollapsibleContent = React.forwardRef<
React.ElementRef<typeof CollapsiblePrimitive.Content>,
React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Content>
>(({ className, children, ...props }, ref) => (
<CollapsiblePrimitive.Content
ref={ref}
className={cn(
"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
className
)}
{...props}
>
{children}
</CollapsiblePrimitive.Content>
))
CollapsibleContent.displayName = "CollapsibleContent"
export { Collapsible, CollapsibleTrigger, CollapsibleContent }

View File

@ -0,0 +1,36 @@
import React, { ReactNode } from 'react';
import { Button } from './button';
export interface FloatingActionButtonProps {
icon: ReactNode;
onClick: () => void;
ariaLabel?: string;
className?: string;
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
}
/**
* FloatingActionButton component
*
* A button typically used for primary actions on mobile layouts
* Designed to be used with the Layout component's floatingAction prop
*/
export const FloatingActionButton: React.FC<FloatingActionButtonProps> = ({
icon,
onClick,
ariaLabel = 'Action button',
className = '',
variant = 'default'
}) => {
return (
<Button
variant={variant}
size="icon"
onClick={onClick}
aria-label={ariaLabel}
className={`h-14 w-14 rounded-full shadow-xl bg-blue-600 hover:bg-blue-700 text-white flex items-center justify-center border-2 border-white dark:border-gray-800 ${className}`}
>
{icon}
</Button>
);
};

View File

@ -0,0 +1,9 @@
export * from './button';
export * from './card';
export * from './collapsible';
export * from './floating-action-button';
export * from './input';
export * from './layout';
export * from './sheet';
export * from './switch';
export * from './scroll-area';

View File

@ -0,0 +1,25 @@
import * as React from "react";
import { cn } from "../../utils";
export interface InputProps
extends React.InputHTMLAttributes<HTMLInputElement> {}
const Input = React.forwardRef<HTMLInputElement, InputProps>(
({ className, type, ...props }, ref) => {
return (
<input
type={type}
className={cn(
"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
className
)}
ref={ref}
{...props}
/>
);
}
);
Input.displayName = "Input";
export { Input };

View File

@ -0,0 +1,56 @@
import React from 'react';
/**
* Layout component using Tailwind Grid utilities
* This component creates a responsive layout with:
* - Sticky header at the top (z-index 30)
* - Sidebar on desktop (hidden on mobile)
* - Main content area with proper positioning
* - Optional floating action button for mobile navigation
*/
export interface LayoutProps {
header: React.ReactNode;
sidebar?: React.ReactNode;
drawer?: React.ReactNode;
children: React.ReactNode;
floatingAction?: React.ReactNode;
}
export const Layout: React.FC<LayoutProps> = ({
header,
sidebar,
drawer,
children,
floatingAction
}) => {
return (
<div className="grid min-h-screen grid-cols-1 grid-rows-[64px_1fr] md:grid-cols-[280px_1fr] lg:grid-cols-[320px_1fr] xl:grid-cols-[350px_1fr] bg-background text-foreground relative">
{/* Header - always visible, spans full width */}
<header className="sticky top-0 z-30 h-16 flex items-center bg-background border-b border-border col-span-full">
{header}
</header>
{/* Sidebar - hidden on mobile, visible on tablet/desktop */}
{sidebar && (
<aside className="hidden md:block fixed top-16 bottom-0 w-[280px] lg:w-[320px] xl:w-[350px] overflow-y-auto z-20 bg-background border-r border-border">
{sidebar}
</aside>
)}
{/* Main content area */}
<main className="overflow-y-auto p-4 row-start-2 col-start-1 md:col-start-2 md:h-[calc(100vh-64px)]">
{children}
</main>
{/* Mobile drawer - rendered outside grid */}
{drawer}
{/* Floating action button for mobile */}
{floatingAction && (
<div className="fixed bottom-6 right-6 z-50 md:hidden">
{floatingAction}
</div>
)}
</div>
);
};

View File

@ -0,0 +1,47 @@
import * as React from "react"
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
import { cn } from "../../utils"
const ScrollArea = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
>(({ className, children, ...props }, ref) => (
<ScrollAreaPrimitive.Root
ref={ref}
className={cn("relative overflow-hidden", className)}
{...props}
>
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
{children}
</ScrollAreaPrimitive.Viewport>
<ScrollBar />
<ScrollBar orientation="horizontal" />
<ScrollAreaPrimitive.Corner />
</ScrollAreaPrimitive.Root>
))
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
const ScrollBar = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
>(({ className, orientation = "vertical", ...props }, ref) => (
<ScrollAreaPrimitive.ScrollAreaScrollbar
ref={ref}
orientation={orientation}
className={cn(
"flex touch-none select-none transition-colors",
orientation === "vertical" &&
"h-full w-2.5 border-l border-l-transparent p-[1px]",
orientation === "horizontal" &&
"h-2.5 border-t border-t-transparent p-[1px]",
className
)}
{...props}
>
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
</ScrollAreaPrimitive.ScrollAreaScrollbar>
))
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
export { ScrollArea, ScrollBar }

View File

@ -0,0 +1,134 @@
import * as React from "react"
import * as SheetPrimitive from "@radix-ui/react-dialog"
import { cva, type VariantProps } from "class-variance-authority"
import { X } from "lucide-react"
import { cn } from "../../utils"
const Sheet = SheetPrimitive.Root
const SheetTrigger = SheetPrimitive.Trigger
const SheetClose = SheetPrimitive.Close
const SheetPortal = SheetPrimitive.Portal
const SheetOverlay = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Overlay
className={cn(
"fixed inset-0 z-70 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className
)}
{...props}
ref={ref}
/>
))
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
const sheetVariants = cva(
"fixed z-70 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
{
variants: {
side: {
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
left: "inset-y-0 left-0 h-full w-full border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
},
},
defaultVariants: {
side: "right",
},
}
)
interface SheetContentProps
extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
VariantProps<typeof sheetVariants> {}
const SheetContent = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Content>,
SheetContentProps
>(({ side = "right", className, children, ...props }, ref) => (
<SheetPortal>
<SheetOverlay />
<SheetPrimitive.Content
ref={ref}
className={cn(sheetVariants({ side }), className)}
{...props}
>
{children}
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</SheetPrimitive.Close>
</SheetPrimitive.Content>
</SheetPortal>
))
SheetContent.displayName = SheetPrimitive.Content.displayName
const SheetHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-2 text-center sm:text-left",
className
)}
{...props}
/>
)
SheetHeader.displayName = "SheetHeader"
const SheetFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className
)}
{...props}
/>
)
SheetFooter.displayName = "SheetFooter"
const SheetTitle = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Title
ref={ref}
className={cn("text-lg font-semibold text-foreground", className)}
{...props}
/>
))
SheetTitle.displayName = SheetPrimitive.Title.displayName
const SheetDescription = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
SheetDescription.displayName = SheetPrimitive.Description.displayName
export {
Sheet,
SheetTrigger,
SheetClose,
SheetContent,
SheetHeader,
SheetFooter,
SheetTitle,
SheetDescription,
}

View File

@ -0,0 +1,27 @@
import * as React from "react";
import * as SwitchPrimitives from "@radix-ui/react-switch";
import { cn } from "../../utils";
const Switch = React.forwardRef<
React.ElementRef<typeof SwitchPrimitives.Root>,
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
>(({ className, ...props }, ref) => (
<SwitchPrimitives.Root
className={cn(
"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
className
)}
{...props}
ref={ref}
>
<SwitchPrimitives.Thumb
className={cn(
"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"
)}
/>
</SwitchPrimitives.Root>
));
Switch.displayName = SwitchPrimitives.Root.displayName;
export { Switch };

View File

@ -0,0 +1,33 @@
// Entry point for @ra-aid/common package
import './styles/global.css';
// Export types first to avoid circular references
export * from './utils/types';
// Export utility functions
export * from './utils';
// Export UI components
export * from './components/ui';
// Export timeline components
export * from './components/TimelineStep';
export * from './components/TimelineFeed';
// Export session navigation components
export * from './components/SessionDrawer';
export * from './components/SessionSidebar';
// Export main screens
export * from './components/DefaultAgentScreen';
// Export the hello function (temporary example)
export const hello = (): void => {
console.log("Hello from @ra-aid/common");
};
// Directly export sample data functions
export {
getSampleAgentSteps,
getSampleAgentSessions
} from './utils/sample-data';

View File

@ -0,0 +1,80 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 47.4% 11.2%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 47.4% 11.2%;
--card: 0 0% 100%;
--card-foreground: 222.2 47.4% 11.2%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 100% 50%;
--destructive-foreground: 210 40% 98%;
--ring: 215 20.2% 65.1%;
--radius: 0.5rem;
}
.dark {
--background: 240 10% 3.9%; /* zinc-950 */
--foreground: 240 5% 96%; /* zinc-50 */
--card: 240 10% 3.9%; /* zinc-950 */
--card-foreground: 240 5% 96%; /* zinc-50 */
--popover: 240 10% 3.9%; /* zinc-950 */
--popover-foreground: 240 5% 96%; /* zinc-50 */
--primary: 240 5% 96%; /* zinc-50 */
--primary-foreground: 240 6% 10%; /* zinc-900 */
--secondary: 240 4% 16%; /* zinc-800 */
--secondary-foreground: 240 5% 96%; /* zinc-50 */
--muted: 240 4% 16%; /* zinc-800 */
--muted-foreground: 240 5% 65%; /* zinc-400 */
--accent: 240 4% 16%; /* zinc-800 */
--accent-foreground: 240 5% 96%; /* zinc-50 */
--destructive: 0 63% 31%; /* red-900 */
--destructive-foreground: 240 5% 96%; /* zinc-50 */
--border: 240 4% 16%; /* zinc-800 */
--input: 240 4% 16%; /* zinc-800 */
--ring: 240 5% 84%; /* zinc-300 */
--radius: 0.5rem;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
font-feature-settings: "rlig" 1, "calt" 1;
}
}

Some files were not shown because too many files have changed in this diff Show More