diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0af75919d..d463d345b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,8 +5,13 @@ repos:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
+- repo: https://github.com/psf/black
+ rev: 23.7.0
+ hooks:
+ - id: black
- repo: https://github.com/pycqa/isort
rev: 5.12.0
hooks:
- id: isort
name: isort (python)
+ args: ["--profile", "black"]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f775821cf..f82557454 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,54 +1,1869 @@
-# Changelog
+# CHANGELOG
+
+
+
+## v0.5.5 (2023-07-17)
+
+### Fix
+
+* fix: loguru exception handling for invalid recordings (#361)
+
+* raise ValueError
+
+* improve exception handling
+
+* Update crud.py
+
+* use assert
+
+* reorganize catch
+
+* Update openadapt/replay.py
+
+* Update openadapt/visualize.py
+
+* Update openadapt/events.py
+
+* Update openadapt/crud.py
+
+---------
+
+Co-authored-by: Richard Abrich <richard.abrich@gmail.com> ([`7aba45b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7aba45be73cb3cc4807f08ebc7bf36a9e9e5c2fb))
+
+
+## v0.5.4 (2023-07-17)
+
+### Fix
+
+* fix(utils): prevent duplicate log messages (#339) (#366)
+
+* fix(utils): prevent duplicate log messages (#339)
+
+Acquire a lock in utils.configure_logging. Otherwise this function has
+a race where two threads can both call logger.remove(), and then both
+call logger.add(), creating two identical sinks.
+
+* refactor(record): remove redundant configure_logging calls
+
+configure_logging is already called at the module level so there's no
+need to call it with identical arguments in various functions.
+
+* fixup! fix(utils): prevent duplicate log messages (#339) ([`cf1a782`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf1a7825692b787e72eb4459c302371dab31e952))
+
+* fix: add test fixtures (#356)
+
+* fix: add test fixtures
+
+* revert test_summary.py ([`0ee5397`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0ee5397ea1ab4b324e5fd699b858fe30892a3491))
+
+
+## v0.5.3 (2023-07-17)
+
+### Fix
+
+* fix: support more objective-c objects (#323)
+
+* Update _macos.py
+
+* Update _macos.py
+
+* Update _macos.py
+
+* add bug report option
+
+* Update _macos.py
+
+* undo formatting
+
+* refactor
+
+* split
+
+* remove debug line
+
+* Update _macos.py
+
+* Update _macos.py
+
+* Update _macos.py
+
+* Update _macos.py
+
+* reorganize
+
+* Update _macos.py
+
+* Update _macos.py
+
+* nonetype
+
+* Update _macos.py ([`be0774f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/be0774fc8e5004830c7b0a578432f04b849ff68b))
+
+
+## v0.5.2 (2023-07-17)
+
+### Chore
+
+* chore: add isort as pre-commit hook (#319)
+
+* Add precommit hooks for isort, check-yaml, end-of-file-fixer, trailing-whitespaces
+
+* Updated README on setting up precommit hooks
+
+* Add updated poetry.lock
+
+* Fix step numbering of pre-commit section in README.md ([`72da341`](https://github.com/OpenAdaptAI/OpenAdapt/commit/72da3414d782e2da75a818971572e003920ae0e0))
+
+### Documentation
+
+* docs: Create Use Case issue template (#324)
+
+* initial draft
+
+* new line issue
+
+* update link
+
+* address comment
+
+* add numbers ([`20fb5a3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/20fb5a3a3a1ab9969c7cb401f01a6e581980de7b))
+
+* docs: update `install` section of README.md (#344)
+
+* run `poetry lock --no-update`
+
+* fix: update CONTRIBUTING.md
+
+fix typo in 3 words and make pytest code word
+
+* fix: add required dependencies
+
+* add seup.md
+
+* add setup.md
+
+* remove typo
+
+* rename temporarily
+
+* rename to SETUP.md
+
+* update README to include more documentation on
+
+-- when someone should use the install script vs. follow the steps here?
+
+* remove requirements.txt
+
+* add link to installation
+
+* rename typo: prerequisite
+
+* link to start: https://openadapt.ai/#start
+
+* reomve .venv as requirements.txt is no longer used
+
+* update installation instructions
+
+* update the Windows Installtion command (in favour of):
+
+1. https://github.com/OpenAdaptAI/OpenAdaptWeb/pull/30/files#r1252126510
+2. https://github.com/OpenAdaptAI/OpenAdaptWeb/pull/30/files#r1252128457
+
+* addressing comment:
+https://github.com/OpenAdaptAI/OpenAdapt/pull/344#discussion_r1252173873
+
+* address the comment:
+
+https://github.com/OpenAdaptAI/OpenAdapt/pull/344#discussion_r1252175219
+
+* address the comment:
+
+https://github.com/OpenAdaptAI/OpenAdapt/pull/344/files#r1252175602
+
+* add .venv to address the comment:
+
+https://github.com/OpenAdaptAI/OpenAdapt/pull/344/files#r1252172932
+
+and
+
+https://github.com/OpenAdaptAI/OpenAdapt/pull/289/files#r1252150636 ([`755dd55`](https://github.com/OpenAdaptAI/OpenAdapt/commit/755dd555a6cda5bb99ac21893a7cbefb4c73bf0b))
+
+### Fix
+
+* fix: windows.get_active_window() (#333)
+
+* return top_window of the active app
+
+* remove runtime exception
+
+* handle runtime error
+
+* handle COMerror
+
+* add logger.warning
+
+* add logger.warning
+
+* add get_properties
+
+* remove unnecessary imports
+
+* remove -> Desktop
+
+* monkey patching
+
+* fix get_properties
+
+* monkey patch __class__
+
+* fix monkey patching
+
+* format with black ([`d3f07c9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d3f07c9892bbf9b6682788486d89c64cf2443537))
+
+### Unknown
+
+* update `config.SCRUB_ENABLED` to False (#373) ([`3f32883`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3f328830380468e95932e1fab9c2c390112069a3))
-
## v0.5.1 (2023-07-04)
### Fix
-* Add pympler and psutil ([`f853839`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f8538398d3c0da51dbd6fb56f3e891c7558df6fb))
+* fix: add pympler and psutil ([`f853839`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f8538398d3c0da51dbd6fb56f3e891c7558df6fb))
+
## v0.5.0 (2023-07-03)
### Feature
-* Add progress bar in `record.py` and `visualize.py` ([`3e12fd4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3e12fd4910f41da17506fae75f3d459c5b26e42b))
+* feat: add progress bar in `record.py` and `visualize.py`
+
+* run `poetry lock --no-update`
+
+* add alive-progress via poetry and in code
+
+* add progress bar in visualization
+
+* add a check for MAX_EVENT = None
+
+* update the title for the Progress bAr
+ (better for USer pov)
+
+* update the requirement.txt
+
+* ran ` black --line-length 80 <file>`
+on record.py and visualize.py
+
+* remove all progress bar from record
+
+* add tqdm progress bar in recrod.py
+
+* add tqdm for visualiztion
+
+* remove alive-progress
+
+* consistent tqdm api
+
+--add dynamic_cols: to enable adjustments when window is resized
+
+Order:
+--total
+-description
+--unit
+--Optional[bar_format]
+--colour
+--dynamic_ncols
+
+* Update requirements.txt
+
+Co-authored-by: Aaron <57018940+0dm@users.noreply.github.com>
+
+* Address comemnt:
+https://github.com/MLDSAI/OpenAdapt/pull/318#discussion_r1244598202
+
+* remove incorrect indent
+
+* remove rows
+
+* try to fix distorted table in html
+
+* add custom queue class
+
+* lint --line-length 80
+
+* fix `NotImplementedError` for MacOs
+-- using custom MyQueue class
+
+* rename custom -> thirdparty_customization
+
+* rename to something useful
+
+* address comments
+
+* rename dir to customized_imports
+
+* rename to extensions
+https://github.com/MLDSAI/OpenAdapt/pull/318#discussion_r1246073970
+
+---------
+
+Co-authored-by: Aaron <57018940+0dm@users.noreply.github.com> ([`3e12fd4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3e12fd4910f41da17506fae75f3d459c5b26e42b))
+
## v0.4.0 (2023-07-03)
### Feature
-* **install:** Download and install MacOS dependencies ([`25b70c0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/25b70c0af2d33c92003b574c56f55b027321b162))
+* feat(install): download and install MacOS dependencies
+
+* add messages
+
+* add download python line
+
+* created cleanup func
+
+* helper functions created
+
+* partially down python downloading
+
+* python installation script complete
+
+* added git (and brew)
+
+* added git (and brew)
+
+* add tesseract and refactor
+
+* works on current macbook
+
+* install python with brew
+
+* install python with brew
+
+* check if pyenv is needed
+
+* merge2
+
+* merge2
+
+* simplify brew call
+
+* finished testing
+
+* Less output
+
+* split line
+
+* Revert adding svg file
+This reverts commit 5601407207b085c254cf86b2f425be2eddd741c1.
+
+* remove unnecessary things
+
+* remove ps1 edit
+
+* remove ps1 edits
+
+* make the ps1 the same
+
+* Remove space
+
+* add poetry and aesthetic changes
+
+* small changes
+
+* add brew to path if needed
+
+* switch to pip3
+
+* switch to pip3.10 ([`25b70c0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/25b70c0af2d33c92003b574c56f55b027321b162))
+
## v0.3.1 (2023-07-03)
### Fix
-* **window:** Prevent SegmentationFault ([`cf0fc0b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf0fc0bebb984b1bc3b9f61920bf8d048361b220))
+* fix(window): prevent SegmentationFault ([`cf0fc0b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf0fc0bebb984b1bc3b9f61920bf8d048361b220))
+
## v0.3.0 (2023-07-02)
### Feature
-* **record:** Memory profiling ([`ef0d5eb`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ef0d5ebcf400c216c0b16c7ffb552391544b0a0c))
+* feat(record): memory profiling
+
+* tracemalloc
+
+* pympler
+
+* todo
+
+* changed position of tracemalloc stats collection
+
+* updated requirements.txt
+
+* memory leak fix and cleanup
+
+* removed todo
+
+* changed printing to logging
+
+* alphabetical order
+
+* changes to tracemalloc usage
+
+* plot memory usage
+
+* memory writer terminates with performance writer
+
+* add MemoryStat table to database
+
+* remove todo
+
+* switch from writing/reading memory using file to saving/retrieving from database
+
+* add memory legend to performance plot
+
+* prevent error from child processes terminating
+
+* style changes
+
+* moved PLOT_PERFORMANCE to config.py
+
+* only display memory legend if there is memory data
+
+* moved memory logging into function
+
+* removed unnecessary call to row2dicts
+
+* rename memory_usage to memory_usage_bytes
+
+* replaced alembic revision
+
+* remove start_time_deltas; minor refactor
+
+* fix indent
+
+---------
+
+Co-authored-by: Krish Patel <65433817+KrishPatel13@users.noreply.github.com>
+Co-authored-by: Richard Abrich <richard.abrich@mldsai.com>
+Co-authored-by: Richard Abrich <richard.abrich@gmail.com> ([`ef0d5eb`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ef0d5ebcf400c216c0b16c7ffb552391544b0a0c))
+
## v0.2.0 (2023-07-02)
+### Documentation
+
+* docs: contributing
+
+* Update README.md
+
+* Update pull_request_template.md
+
+* Add import order
+
+* Add Poetry conflicts
+
+* Add Richard's better import order explanation: ([`5b9f735`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5b9f735da42c0bcdda2e47747f2acabb0f5f45fd))
+
### Feature
-* Stop listener ([`385963c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/385963ce098fbb9bdbe7adce8be97ea6213b0c20))
+* feat: stop listener
-### Documentation
+* created listener for "oa.stop" sequence
+
+* fixed issue with comparing objects of diff types
+
+* moved list of sequences to config.STOP_SEQUENCES and changed code to accomadate multiple stop sequences, + minor changes to naming and logging
+
+* moved list of stop sequences to config.STOP_SEQUENCES
+
+* filter out stop sequence in crud.get_action_events
+
+* combined keyboard listeners for macOS compatability
+
+* style changes
+
+* code cleanup
+
+* special char support
+
+* change to config.STOP_STRS and split by character in record.py and crud.py
+
+* black
+
+* add todo and fix special char functionality
+
+* fix filter_stop_sequences
+
+* added SPECIAL_CHAR_STOP_SEQUENCES and STOP_SEQUENCES that combines STOP_STRS and SPECIAL_CHAR_STOP_SEQUENCES
+
+* STOP_SEQUENCES moved to config.py
+
+* black
+
+* black ([`385963c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/385963ce098fbb9bdbe7adce8be97ea6213b0c20))
+
+### Unknown
+
+* Update config.py (#332) ([`aa49489`](https://github.com/OpenAdaptAI/OpenAdapt/commit/aa49489c0d8d116cae9bcd5ab9747cef52096b15))
-* Contributing ([`5b9f735`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5b9f735da42c0bcdda2e47747f2acabb0f5f45fd))
## v0.1.0 (2023-06-29)
-### Feature
+### Chore
-* **install:** Install tesseract, remove vcredist (windows) ([`ddb7d78`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ddb7d78d28dfbfb4c7004d1feede67ce743e916d))
-* **release:** Initial development version 0.1.0 ([#325](https://github.com/OpenAdaptAI/OpenAdapt/issues/325)) ([`5ab0e01`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5ab0e011cf42b61fd8ebc41035e29c14583fd7de))
+* chore(release): Use PAT token to bypass branch protection for release github action (#326)
+
+* feat(release): Initial development version 0.1.0
+
+* use PAT token to bypass branch protection for release github action ([`d456bc2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d456bc2c7e888d76258a9c966a69becba1660f1d))
### Documentation
-* Add note on making major release in CONTRIBUTING.md ([`e097189`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e0971897c9210a614cc65c1e1e69d510bb7a61ed))
+* docs: Add note on making major release in CONTRIBUTING.md ([`e097189`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e0971897c9210a614cc65c1e1e69d510bb7a61ed))
+
+### Feature
+
+* feat(install): install tesseract, remove vcredist (windows)
+
+* test only tesseract
+
+* test only tesseract
+
+* test tesseract only
+
+* uncomment the last line
+
+* try to redirect
+
+* change the description for failed message
+
+* add OCR
+
+* test python
+
+* format function calling
+
+* Update Description
+
+* prepare for git test
+
+* test Git
+
+* update the VSCppRedistCMD
+
+* using Write-Host
+
+* Use ';' for the return command
+
+* full test
+
+* add description for all arguments
+
+* test tesseract on pc with out it
+
+* fix order for the installtion
+
+* uncomment the remove-gitinstaller
+
+* Stop deletion of Openadapt if the pytest fails
+
+* add the Cleanupfailure parameter to the apt comman
+
+* make user oriented messages
+
+* rewrite comments
+
+* do not exit on pytest fail
+
+* remove VS C++ Redistributable
+
+* remove VS C++ installtion consts
+
+* fix pytest fail exit
+
+* redirect the output to null
+
+* rename the param
+
+* remove unneccessary line
+
+* try a new powershell window for poetry shell
+
+* add colours to messages
+
+* try to fix NSIS error
+
+* fix file name
+
+* different approach to fix NSIS
+
+* different approach to fix tesseract
+
+* try to fic NSIS error
+
+* try to fix NSIS error
+
+* remove line
+
+* remove uneccssary comment
+
+* remove unsupported dcostrings
+
+* remove unused arugs
+
+* redirect output to null
+
+* ran `poetry lock --no-update` to fix the warning
+
+* Address comment:
+https://github.com/MLDSAI/OpenAdapt/pull/312#discussion_r1244105576
+
+* Address comment:
+https://github.com/MLDSAI/OpenAdapt/pull/312#discussion_r1244073425
+
+* Address comment:
+https://github.com/MLDSAI/OpenAdapt/pull/312#discussion_r1244070600
+
+* imporve resuability and readability
+
+* remove redirection to null ([`ddb7d78`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ddb7d78d28dfbfb4c7004d1feede67ce743e916d))
+
+* feat(release): Initial development version 0.1.0 (#325) ([`5ab0e01`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5ab0e011cf42b61fd8ebc41035e29c14583fd7de))
+
+### Unknown
+
+* Merge pull request #178 from Mustaballer/publishing-with-pypi
+
+Automatic Publishing with PyPi ([`a37b62f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a37b62f32b30fe13484846408fea28fa0c344fd0))
+
+* Update CONTRIBUTING.md referring to comments ([`84b623e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/84b623e466f0cb26ac0726d295a0930be64c70bc))
+
+* Merge pull request #306 from dianzrong/expand-on-demo-replay-strategy
+
+Fix Summary test ([`d56dd57`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d56dd572b106a9ccb46022e9a85ecbfc1f12357f))
+
+* Merge pull request #229 from angelala3252/feat/tracing
+
+Implement tracing ([`5cdc8fd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5cdc8fd16d717cbe4fe7e32f855e2034a72fd8f7))
+
+* Merge pull request #315 from MLDSAI/feat/max_table_str_len
+
+max_table_str_len ([`c92e2e6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c92e2e606ee0f6b766e67473e95d074f8c1cb207))
+
+* max_table_str_len ([`4051804`](https://github.com/OpenAdaptAI/OpenAdapt/commit/40518049c92a5ab56774f49e2ebcc5c2169c12dd))
+
+* Merge pull request #201 from dianzrong/update
+
+Implement Updating ([`27b89b7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/27b89b7925b85b5157af02449cbeee1ddebd2dd3))
+
+* Merge pull request #313 from MLDSAI/feat/obfuscate_config_logs
+
+config.obfuscate ([`495a280`](https://github.com/OpenAdaptAI/OpenAdapt/commit/495a2804baf02f13a3e433ec3cb3ed1037cce3ea))
+
+* don't obfuscate defaults ([`abac4e5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/abac4e50acb728679248cdb160621b8361ab6236))
+
+* remove publish action and rename to release.yml ([`9b340ee`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9b340eebc1ca439a659bd781fc234d7e36809927))
+
+* config.obfuscate ([`79c41f5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/79c41f5af2a79a4739d42a696bb37eb98374f1dc))
+
+* comments ([`a87e202`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a87e20247926993821c147232d014f0cfd779e86))
+
+* Merge pull request #310 from KrishPatel13/feature/install
+
+Add Tesseract OCR in for powershell script ([`ac27a79`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ac27a7996df90101860111c238272510509b6747))
+
+* remove python3.10 as it works on mac not on window ([`52b0f58`](https://github.com/OpenAdaptAI/OpenAdapt/commit/52b0f58b7f24db2524ce3a21668e2ccca9e05a77))
+
+* for cosistency remove the paranthesis ([`47019d6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/47019d664afba550c034f78db2e0467aa3ff729e))
+
+* refresh the path everytime ([`55b288a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/55b288ad3b0e7a7365e1e73afe7c47d33a237884))
+
+* remove uneccessary code ([`16c18e5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/16c18e5c521a9460ef1db812b59978b5098dd25b))
+
+* ran format document ([`acef0be`](https://github.com/OpenAdaptAI/OpenAdapt/commit/acef0bebdb33efb5a1948f760534a18347828bb9))
+
+* add function for Vs C++ redist
+
+and beautify hte code for better readability ([`2029cc4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2029cc4501939ba328407181e4f29b1d32a3a70d))
+
+* made a function for git installtion ([`babe791`](https://github.com/OpenAdaptAI/OpenAdapt/commit/babe791d7d0010133b853daed8516ff8b16d6d3b))
+
+* remove redundant if condition and also fails on windows:
+as python3.10 is not a valid command ([`388ce67`](https://github.com/OpenAdaptAI/OpenAdapt/commit/388ce6756b811ccc826a0fd5ce791e6c1859b063))
+
+* simplify the refresh command ([`ab56341`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ab56341d9a98643db4b143d0721fc88ec7a781cc))
+
+* Organize Tesseract Installation ([`d3f479e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d3f479e98e2782c5337a283ac0f69201906971bf))
+
+* Merge pull request #292 from KrishPatel13/feature/scrub_mp4
+
+Scrubbing for mp4 files ([`fee2c72`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fee2c72e6b67fac5f84a9bd91c2d78dcc8e901a6))
+
+* organize imports ([`f2671f7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f2671f7ba6715e5874fbec986ba9d01d62ba4d0e))
+
+* Merge branch 'main' into feature/scrub_mp4 ([`e81ac67`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e81ac67f8c71c8d32d3f442450e68915148ef0bf))
+
+* Merge pull request #307 from 0dm/add-python-levenshtein ([`dd36aec`](https://github.com/OpenAdaptAI/OpenAdapt/commit/dd36aecbc2ab54c757ebb5fdc125926343e2ca1d))
+
+* remove typo ([`bf412a3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bf412a37bac35a77176fa5edaaabeeae4a183ddb))
+
+* add Poetry to .ps1 script ([`45f8978`](https://github.com/OpenAdaptAI/OpenAdapt/commit/45f8978d487a0731a07877d9556d4eb391805c7d))
+
+* Add Tesseract OCR in ps1 ([`d078183`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d078183063f56ecda832c9e99dc12b09c76bcb63))
+
+* add guard for module ([`4de7536`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4de753678ec6bc3b6129c55c840e38287b0e91a1))
+
+* tpyo in docstring ([`61831c8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/61831c82987c69c38abee2778fabfb4dcf5341b0))
+
+* add mmoviepy in requirements ([`9f3cc39`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9f3cc3941a2ad9d5d95480bc7368561e4fb502ad))
+
+* add the following
+--scrub_all_entities
+--crop_start_time
+--crop_end_time
+--playback_speed_multiplier ([`d760390`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d760390cb72cc975c514af662a8354a16e46a57b))
+
+* add moviepy via poetry ([`a6a352b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a6a352bb040b697040c63019e3a0d95bb36457b8))
+
+* Update requirements.txt ([`95ee413`](https://github.com/OpenAdaptAI/OpenAdapt/commit/95ee413bb8b66cfe835d43945934f5ed74475980))
+
+* Add run app ([`90cfaa9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/90cfaa9dc58b989316dd7b9c44d20cef4af7f567))
+
+* add python-Levenshtein ([`8f386de`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8f386defb3998aaec092528b51586914551eb617))
+
+* Reformat ([`a35bbea`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a35bbeaaab830e7491cfbcc1f67d5ad653ad0bd3))
+
+* Fix typo ([`fc44273`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fc44273d1681a36414ca94e799eee073920ab169))
+
+* merged ([`0c95a2d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0c95a2d05c4dd994021b47737a567f74ca3ecc0f))
+
+* small fixes ([`e3178fe`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e3178fe17c1732b1c19a21597583b508eb60121e))
+
+* small fixes ([`dfe46e8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/dfe46e80fc1db65a756d065144cb0f389ddd9fd8))
+
+* Merge branch 'update' of https://github.com/dianzrong/puterbot into update ([`754c921`](https://github.com/OpenAdaptAI/OpenAdapt/commit/754c921f935a9951ebf85b9585a23a51d2a9f248))
+
+* after initial test ([`2f7debc`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2f7debcc52c1d2491a7a8d8ed7fc21f06ba0769e))
+
+* after initial test ([`18b0e4c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/18b0e4c5e3cd2edccbefbeec228d0aa6460012d5))
+
+* add newlines after docstrings ([`60dceb2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/60dceb2716e0f097f715dcc1ef66c68aab43f112))
+
+* better log ([`655a968`](https://github.com/OpenAdaptAI/OpenAdapt/commit/655a96807a929b4b7d8674047aa92d1623577111))
+
+* log exception ([`4b9c68a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4b9c68a5e6dc154eef2bb09dc004c56175b9e01c))
+
+* log exception ([`8686418`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8686418e05aada677c9434974630415d11552fb0))
+
+* merge ([`9f067a4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9f067a48257e53ebe632e4e846e4421e4c5c1234))
+
+* Merge branch 'MLDSAI:main' into expand-on-demo-replay-strategy ([`18a1d29`](https://github.com/OpenAdaptAI/OpenAdapt/commit/18a1d2924b0198396cd03ddbe009f660f3a32854))
+
+* add checker for punkt ([`4e5866d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4e5866d907a714834beaea34a9c990daa451e609))
+
+* Merge branch 'MLDSAI:main' into feature/scrub_mp4 ([`b25c102`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b25c102cbec4d6a420f7ba948b3a0b0ee455e820))
+
+* add checker for punkt ([`4bcb474`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4bcb474b4cdf7d95bed21f795c206c9466eb972e))
+
+* add check for tokenizer ([`0ed8dfd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0ed8dfda4bd9bb354a8cc4449877663675acd7c8))
+
+* Merge pull request #298 from KrishPatel13/fix/pywinauto
+
+add pywinauto using poetry ([`5c443a9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5c443a977b9ce07ebefa006e0d322a1b8d3604ed))
+
+* temporary changes to
+time performance of specific lines ([`683c3cf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/683c3cfb9306d3bc6fb560b9427208b32b6a3bea))
+
+* Merge branch 'MLDSAI:main' into feature/scrub_mp4 ([`8b23e20`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8b23e200d371a0777ae463757a1e4b6b7ea252e8))
+
+* Merge branch 'fix/pywinauto' of https://github.com/KrishPatel13/OpenAdapt into fix/pywinauto ([`fc9755f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fc9755f54503da5970cc6bc666ba6b8fbe503791))
+
+* add marker for pywinauto and
+ran poetry update ([`ee0a8e2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ee0a8e258f50ab2ab7b343212b7a68928d2aa80f))
+
+* Merge branch 'MLDSAI:main' into fix/pywinauto ([`224cde1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/224cde1cad750ce0daec6702a974ebaded03134f))
+
+* Merge pull request #297 from dianzrong/expand-on-demo-replay-strategy
+
+Refactored test to use custom replay strategy ([`767e362`](https://github.com/OpenAdaptAI/OpenAdapt/commit/767e362810d327627873cc6e7367bf4fd8f934d7))
+
+* Merge pull request #299 from MLDSAI/abrichr-patch-3
+
+Update README.md ([`3b72e81`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3b72e81caaee044df1fdc74f554aea449fa38997))
+
+* Update README.md ([`a7ea91d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a7ea91d98ac84708b849a79a4cee2155855f02d9))
+
+* ran black ([`ee26831`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ee268317bed793ab888dc5a62e07f18859b65e1f))
+
+* Typo ([`5263afa`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5263afa216460b751b3483caf52bd907aa35223f))
+
+* diff strategy name ([`84a7de7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/84a7de71c382107ab20d405a67b8b9597ac8ca84))
+
+* linted ([`e976414`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e976414bcaad492ffc8095f4d817d89927a5f359))
+
+* add pywinauto using poetry ([`1682be3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1682be3ee95dcbc4604dcf3586651303c910ad47))
+
+* added custom ReplayStrategy to tests ([`0a9ee9d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0a9ee9d24638f3a8edd0d84e550009b1d2af5ea3))
+
+* Addressed comment:
+https://github.com/MLDSAI/OpenAdapt/pull/292#discussion_r1235435386 ([`93b04d1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/93b04d1ac6193c297703c94bcfdb70f03faec9bb))
+
+* Addressed comment:
+https://github.com/MLDSAI/OpenAdapt/pull/292/files/3e3c8b33a5b7c985bb6be23adcdac4edea8b1636#r1235436174 ([`f43cdef`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f43cdefe7bd130db098e8148597cb3bcceae5b61))
+
+* Addressed comment:
+https://github.com/MLDSAI/OpenAdapt/pull/292#discussion_r1235436360 ([`84a5162`](https://github.com/OpenAdaptAI/OpenAdapt/commit/84a516226823c33c631af5b0dbceceb32afe6c66))
+
+* addressed
+https://github.com/MLDSAI/OpenAdapt/pull/292#discussion_r1235432965 ([`00fb7d6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/00fb7d6077d71fe5cac385c049db6ab1e808bd71))
+
+* remove the sample files and resources dir ([`6cb6217`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6cb6217e61655d2b2adcec242c51e581fef05e4b))
+
+* added documentation ([`ed26aad`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ed26aad56183d74473c5d81e442e08df2b41e45c))
+
+* Merge branch 'MLDSAI:main' into update ([`b961eab`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b961eabeeaa1822ab114b2edd4524f888624f6f4))
+
+* remove unrequired import from requirements.txt ([`3e3c8b3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3e3c8b33a5b7c985bb6be23adcdac4edea8b1636))
+
+* formatting and test ([`e93eece`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e93eece99915f00621c1f89fd6cd9414a74a4655))
+
+* minor change to scrub.py ([`4b194d4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4b194d429a9a65e37d90ebf5177fd46bb67ddb7e))
+
+* add scrub under scripts/ to scrub mp4 ([`3ff2346`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3ff234603d8e98055e4a69c5fa561bee455a280d))
+
+* add ffmpeg-python in requirements.txt and
+add sample mp4 video under resources/ ([`4dc03bf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4dc03bf2bf5362cec9e859cffc9c1e419e309290))
+
+* style changes ([`fac1efb`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fac1efb4e026bad59df92e40951d2c2e3dc42823))
+
+* renamed @logging decorator to @trace, style changes ([`db24c49`](https://github.com/OpenAdaptAI/OpenAdapt/commit/db24c49d6d83631b825b6706c3efa316f9ac5030))
+
+* Update __init__.py ([`04d407d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/04d407d2846cbf2025075f30453371562400668a))
+
+* Merge branch 'main' into publishing-with-pypi ([`6c12e36`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6c12e36c340c13a5c9cf0e01de195056e206a4d6))
+
+* Merge pull request #283 from MLDSAI/abrichr-patch-2 ([`aa31545`](https://github.com/OpenAdaptAI/OpenAdapt/commit/aa3154557c65529849a9333de19171a9e7312fa3))
+
+* Update README.md ([`8cc3860`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8cc3860a6d3f8516db64f543f07d9a2636904650))
+
+* Merge pull request #282 from MLDSAI/abrichr-patch-2
+
+Update README.md ([`cf0c339`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf0c3395303a1cb4cc4293f111c1fd69881957f2))
+
+* Update README.md ([`66c3d70`](https://github.com/OpenAdaptAI/OpenAdapt/commit/66c3d7061eb1d0a66052294c7f3d5c56902ce737))
+
+* Merge pull request #207 from 0dm/clear-data
+
+added openadapt.renew ([`15a5cca`](https://github.com/OpenAdaptAI/OpenAdapt/commit/15a5ccae1e81aa098734cecefa6d57dcb48ea4ed))
+
+* Merge pull request #268 from 0dm/poetry
+
+Use Poetry for dependencies ([`bde3816`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bde381684cc51c71d5e8169edaaca808352c0521))
+
+* remove license and update readme image ([`c6f30f1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c6f30f11a574a0a9d4b3e0896ac83c92a147516f))
+
+* Merge pull request #204 from jesicasusanto/feat/windowstate_for_windows
+
+Windowstate for windows ([`f837d62`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f837d623dd717628db7c74093907560451d6695f))
+
+* reorder authors alphabetically, and add placeholder license ([`983781c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/983781c8d578f599d9e2655ebaab16f02a5e90fd))
+
+* adjusted imports, added to readme ([`5a75be9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5a75be93af444b59765eb786505ff0b6c0c5e9a9))
+
+* add spacy files ([`e9d053a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e9d053a2d05bb9538c0130597e3c47e36e3c89ee))
+
+* update for nicegui ([`b20b060`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b20b060ec51cd22b738746a80bc101a726669a79))
+
+* Merge remote-tracking branch 'upstream/main' into poetry ([`17a12ad`](https://github.com/OpenAdaptAI/OpenAdapt/commit/17a12adbeae6d593e7adb235f83c4ee34e1e009c))
+
+* add noqa + newline after docstring ([`482ab56`](https://github.com/OpenAdaptAI/OpenAdapt/commit/482ab56694aa4606814e696a6a0425d51f34207f))
+
+* add docstring to main ([`a8fa74f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a8fa74f20d05cc1474f85ceeb33c7914dae52f97))
+
+* serialize_rect -> dictify_rect ([`580c294`](https://github.com/OpenAdaptAI/OpenAdapt/commit/580c294966a2b473caa9c994f02fa7b92f07a22a))
+
+* split docstrings to be <= 80 chars per line ([`8f0b179`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8f0b179dbaf37266459459e094a69093e6ad0b7d))
+
+* Merge branch 'publishing-with-pypi' of https://github.com/Mustaballer/puterbot into publishing-with-pypi ([`567ea8f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/567ea8f64360269926cf630e0153222b80443693))
+
+* Update author list pyproject.toml ([`1a65973`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1a659732e2f62969f98220cd706fd27dc3d33068))
+
+* Merge pull request #266 from dianzrong/add-contributing-md
+
+Update Contributing Templates ([`8653d0c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8653d0cdf3bcb263989a0817f4475c2e9e93edc9))
+
+* Merge pull request #215 from Mustaballer/github-actions-lint-tests
+
+Github actions for automatic testing and linting ([`0cd5c54`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0cd5c54fd1c300706d172dc7046ccfe557bcfea6))
+
+* Merge pull request #272 from KrishPatel13/feature/semantic_scrub
+
+Feature/semantic scrub ([`a11b76b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a11b76baf849537bf0cb6c7c8fa27187402f0c3f))
+
+* add comment for SCRUB_COLOR and
+remove unused import ([`e2bcbca`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e2bcbca2b7a4f29c528d35dccc8f78c0f84c7aac))
+
+* removed test_window ([`09680c6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/09680c6b602f03d6848ce8ef42d0c01a2f1ca64b))
+
+* Merge branch 'main' into clear-data ([`ab0c6b3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ab0c6b39c5f13c402652c1e1ade6cbf675f46fc2))
+
+* fix visualizatoin->red color ([`93b32b8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/93b32b8bcc4c55e9fffa1268d741578ca3ab1940))
+
+* Merge pull request #169 from jesicasusanto/feat/sam_mixin
+
+add sam_mixin.py ([`8fd1af7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8fd1af73a3a460275c2d3fd474c38d4f2dbb3790))
+
+* Merge branch 'main' into feat/sam_mixin ([`e3b4056`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e3b4056510a650701d601d1b984e677c5932ef16))
+
+* Merge pull request #67 from dianzrong/expand-on-demo-replay-strategy
+
+SummaryReplayStrategyMixin ([`2c0e860`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2c0e860d6029336788a604360383ceaf886953ec))
+
+* Merge pull request #135 from 0dm/add-GUI
+
+GUI + Installer ([`3e1ebb9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3e1ebb94eda47f251e2c0b9f10e4146e97c7458e))
+
+* turn values into placeholders ([`40fd85e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/40fd85ea2748f32d9fb477db816113a2ab06865f))
+
+* fix visualization error:
+
+color must be int or single element tuple ([`ab4427c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ab4427c40ddd083c07dbb2e9275e4860ee945799))
+
+* add scrub_cahr for force_scrubbing key char ([`438b22f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/438b22f8206f303f882c2f05d733ca40921a54be))
+
+* Remove SCRUB_CHAR from config ([`b6ab737`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b6ab7371c19ccc5bf97f2deaaa92328b458fce47))
+
+* Merge branch 'main' into github-actions-lint-tests ([`eba635e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/eba635e3f15feee0b1049a7fd6a77d3f0c729520))
+
+* Aesthetic changes to PR template ([`e5973d4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e5973d4e7de485c10c3569778afa2c0e69bef4e7))
+
+* Removed operators from scrub and
+changed the test_scrub ([`d03aae7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d03aae77a99041c29de56566fc2b7d0c3da5c904))
+
+* Add .idea to gitignore ([`5a28170`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5a28170d7e4f31916e376d8b8785f219d8d47445))
+
+* Merge branch 'main' into publishing-with-pypi ([`cbdf887`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cbdf887f9fbf71dcd1499f4cb65efdbca1fe26ef))
+
+* Merge branch 'MLDSAI:main' into feat/windowstate_for_windows ([`43ead42`](https://github.com/OpenAdaptAI/OpenAdapt/commit/43ead422f11337381000778d1c8430ddada2ed12))
+
+* Merge branch 'MLDSAI:main' into feat/sam_mixin ([`a0f17c3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a0f17c31108d1b667f792a06af7467d15b77edd4))
+
+* undo changes ([`f6e0caf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f6e0cafc13bc041eb94c18873f7d68b9bf485b85))
+
+* fix conflict ([`347eb3d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/347eb3dfdf4387904da3bcce291eabc2bdd6fb9a))
+
+* fix merge conflict ([`ba4348a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ba4348a067e3db35c8beb0e8bbac06a35a9bdcd3))
+
+* Update pyproject.toml ([`8871555`](https://github.com/OpenAdaptAI/OpenAdapt/commit/88715551d2afcae0a0c501ac86705e13ddbeb965))
+
+* Revert "merged changes"
+
+This reverts commit 2066147107c63379ac20cdc95ba3d3fa63fe2603. ([`12c9243`](https://github.com/OpenAdaptAI/OpenAdapt/commit/12c9243ff5fc7b40fd1bca34c03465c54074e0ed))
+
+* Revert "remove uneccesary files and"
+
+This reverts commit 806e717049ae4ad76843134c907fa604534b5b28. ([`fb170e1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fb170e1f06479a03912e285f70d7baec4b8b72f4))
+
+* Revert "Fix for Visualization"
+
+This reverts commit 6d717f535a15867727065e48d0b7e92c3904204e. ([`7fc3439`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7fc3439491b93f3c0d579783b1c3992ed5b516bd))
+
+* comments ([`330d999`](https://github.com/OpenAdaptAI/OpenAdapt/commit/330d9999c19956d6eb788e3ca97dbe5358f309f9))
+
+* Update pyproject.toml ([`d814d8a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d814d8a93dc5b9147edef0830c871b315b2b6055))
+
+* added scripts ([`1eb2085`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1eb20858f40e5494ee41192987b8541439a98174))
+
+* Update pyproject.toml ([`853fef2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/853fef2a290bc24ad3f7afe372052abf3e4451ac))
+
+* create pyproject ([`2e6b487`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2e6b48772fc683dccacd4ae3c3e74653a622ef35))
+
+* Request test output ([`ff8614a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ff8614a7120d0a205a5cb47d1725bb3e0eb2f370))
+
+* Merge branch 'main' into feat/tracing ([`70bf019`](https://github.com/OpenAdaptAI/OpenAdapt/commit/70bf019d4c7361954c46adf103dd7f7115d6f199))
+
+* Merge pull request #248 from dianzrong/add-contributing-md
+
+Make OS Option Optional ([`6a77a3a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6a77a3adf72378c60be4c3f985c3a6a6b39e755a))
+
+* Merge pull request #263 from MLDSAI/abrichr-patch-2
+
+Update README.md ([`1095399`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1095399db4b5180b61d360ca3a4790ef7350b725))
+
+* Update README.md ([`dd1725b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/dd1725bed56f939856e47c8c317243c355c66cf5))
+
+* Add value to feature request ([`1cd9acc`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1cd9acc57885b75d1b361846ccffda73c75cb228))
+
+* Simpler bug form ([`3cd2876`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3cd28761033277c320249cd722ae310e0ac41dc9))
+
+* Add <br> ([`047afce`](https://github.com/OpenAdaptAI/OpenAdapt/commit/047afce4ed927e599b8cc60311e054ef0ad21b9d))
+
+* Update bug_form.yml ([`9fbd59e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9fbd59eb36b0c31be61d9d1cbfc83273c93e2f95))
+
+* remove optional sections ([`27072ff`](https://github.com/OpenAdaptAI/OpenAdapt/commit/27072ffcb9745d10455114632e9b1e7d04a353c0))
+
+* Attempt to add new lines ([`9630394`](https://github.com/OpenAdaptAI/OpenAdapt/commit/963039448be9fdd35340ebb92436e3cff058101b))
+
+* Remove optional required sections ([`6d3ead0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6d3ead0193ca3fa14e90d043624bc19f90bbd084))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`794925c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/794925cb9e7da19cee5fd9060aed4b965400d4ba))
+
+* remove uneccesary files and
+add .idea in .gitignore ([`806e717`](https://github.com/OpenAdaptAI/OpenAdapt/commit/806e717049ae4ad76843134c907fa604534b5b28))
+
+* Fix for Visualization ([`6d717f5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6d717f535a15867727065e48d0b7e92c3904204e))
+
+* merged changes ([`2066147`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2066147107c63379ac20cdc95ba3d3fa63fe2603))
+
+* Merge pull request #256 from MLDSAI/abrichr-patch-2
+
+Update README.md ([`8c1c84b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8c1c84ba006cd97ce445902ea0def696097cf7aa))
+
+* Update README.md ([`1123353`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1123353d509db1c161983e2bc9073fcadab49f0c))
+
+* Merge pull request #254 from MLDSAI/abrichr-patch-2
+
+Update README.md ([`fe255ce`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fe255ceae7508dd648e6d0c5adc60ccc0775324c))
+
+* Update README.md ([`af72ed6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/af72ed6d5bc14de571e89a9725a60bdec77dbb2b))
+
+* Merge pull request #253 from MLDSAI/abrichr-patch-2
+
+Update README.md ([`a1b5daa`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a1b5daa05fa743b9d890a9ca8a620be665f3acde))
+
+* Update README.md ([`da1dd46`](https://github.com/OpenAdaptAI/OpenAdapt/commit/da1dd46810a668e311db7b60a6a3e3369b72b5f9))
+
+* Update new feature template ([`717a1c1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/717a1c145970202600909d92eab1d865fb336219))
+
+* Make OS optional ([`fbe5008`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fbe500830e24ef6c876152f3827566af1df20312))
+
+* Merge pull request #247 from MLDSAI/abrichr-patch-2
+
+Update README.md ([`912566a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/912566a3f65fc7f18ef2e0f2bb9c9e310bd5965f))
+
+* Update README.md ([`0818046`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0818046adeb04216896ecb65a7c5b011451bd750))
+
+* Merge pull request #245 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`f1e3ca2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f1e3ca236e21bbfe344049cf524a9c1d0c9bffc3))
+
+* Update README.md ([`685b20c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/685b20ce9488bf00976a30d4c15f9b5fbe633ace))
+
+* Update README.md ([`19fbab4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/19fbab464f3590473a828aa5876f66b68086f4ce))
+
+* Update README.md ([`0306a38`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0306a385ff907ac1c8c90df68238c87975314954))
+
+* Update README.md ([`6524683`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6524683073143856a423d3fa8996393ba671381a))
+
+* Merge remote-tracking branch 'upstream/main' into clear-data ([`b88fa55`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b88fa554bcdaab524a2028624cb724ebf9a40de1))
+
+* add todo for future improvement ([`4fb0ba5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4fb0ba5de771c262b959ec368dfe8495b18ad80e))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`c54103c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c54103c9b4bdad630c6fbb3e1f075f6b855cda7b))
+
+* Merge pull request #161 from dianzrong/add-contributing-md
+
+Create CONTRIBUTING.md ([`f5cbdd2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f5cbdd2cf1e71a957dcf5ea5f2110609777b3a85))
+
+* Merge pull request #241 from 0dm/scrubbing-changes
+
+Scrubbing changes ([`180a774`](https://github.com/OpenAdaptAI/OpenAdapt/commit/180a7745c341b56de9bc642c75551111bfb5860a))
+
+* Merge pull request #243 from KrishPatel13/update/install
+
+Add TODO in Installation Scripts ([`7ce0479`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7ce0479e7c0772efe7ef753ea74379aaf03a64ee))
+
+* add link in TODO ([`6369256`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6369256993e4965b4b63b79c38a07cf55b1f335c))
+
+* add TODO:
+Tesseract OCR installation ([`5f6610e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5f6610ec9c93c4429c516dd7e48da1e87c4d8941))
+
+* Correct typo ([`386c14f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/386c14f738fe61597ff9cd46608cdadaca190272))
+
+* resolve merge conflicts ([`df22ff8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/df22ff833ba0a1bddace5fbe4337888ddb3651a6))
+
+* Merge pull request #142 from AvidEslami/crop_active_window
+
+Crop Screenshot to fit the Bounds of a WindowEvent (#108 ([`e3fd5c7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e3fd5c77aad994663d7f691f0a55844b18c545dc))
+
+* Merge branch 'main' into clear-data ([`b5fdc81`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b5fdc8194eab905a219861fae6904398e3f4344b))
+
+* add black ([`5501191`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5501191fc6818898f2eea4e166a72ec33fe83b07))
+
+* requested changes ([`76b1396`](https://github.com/OpenAdaptAI/OpenAdapt/commit/76b139685b198ae7c539ceb3672c6f16adc26c23))
+
+* fix window data to have hierarchy ([`4a58ad4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4a58ad4bf7b7a355d5e9784424665f8efda02985))
+
+* changes ([`b20a4d9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b20a4d93c70da86d56acfea0601f35f9dd89d876))
+
+* false by default ([`9975a09`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9975a0955fb520822b235dd5d548e33afa7601d7))
+
+* Merge remote-tracking branch 'upstream/main' into silence-warnings ([`3cd8daa`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3cd8daabb18e877975850c4d0696b0d58e165a8c))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`df78d57`](https://github.com/OpenAdaptAI/OpenAdapt/commit/df78d5781336167c2eb272776180fae9d92b228c))
+
+* Add github action bot name and email ([`1ff6435`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1ff6435c47f3e0545041b75255053d96ea50cbbe))
+
+* Merge pull request #239 from KrishPatel13/main
+
+Fix Pytest ([`b92309c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b92309cedd928943d3cbb9aa4e76d50a14eeb6d7))
+
+* Fix Pytest ([`d399970`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d399970c58d64708b4d8c21c70ef1b936f03b0f5))
+
+* rename localfilepicker ([`bbb3fca`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bbb3fca54e30737a1dbffc0ac39e87901705bdad))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`0666809`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0666809e678f61bb2458cd0ff95d18219ae19bc6))
+
+* doc: fix incorrect version bump example ([`281b77c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/281b77c6dd0f1227b3977fdabd6e98d51b20a44b))
+
+* enqueue log messages to make logging multiprocess-safe ([`eb3deb0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/eb3deb0035c260ad0ed714e316a3870b6882d166))
+
+* Merge pull request #211 from KrishPatel13/feature/scrub-final
+
+feat(scrub): Scrubbing and Fix Atomacos ([`d784d37`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d784d374826fec74a0dc7a2ac636ac56510958e5))
+
+* Merge pull request #225 from 0dm/pickling_investigation
+
+Use pickle.HIGHEST_PROTOCOL ([`45b77ce`](https://github.com/OpenAdaptAI/OpenAdapt/commit/45b77ce1ac05d085e1eae8e761f2ee5918713e02))
+
+* ran black on scrub.py ([`5ceea9a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5ceea9a73d59bb782f41c2308677557652338afe))
+
+* Merge branch 'MLDSAI:main' into feat/windowstate_for_windows ([`1638d96`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1638d96ed1d7940fe4f54b42cfc69f02dd48719e))
+
+* add serialize_rect function ([`b5d9d7e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b5d9d7e4c04cf9120d1feb34694db749c0a084b4))
+
+* addressed reviewed comments ([`075cfff`](https://github.com/OpenAdaptAI/OpenAdapt/commit/075cfff684da1a2c43ee7bdb535f6d8b8d03f38e))
+
+* Add publish action to github, reformat CONTRIBUTING.md, set up git release config pyproject.toml ([`e63d455`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e63d455879be169b48cb542931da4a4bf9e8204f))
+
+* serialize RECT object ([`d0a0800`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d0a0800a7ba76bcd71cf3bec43e5d298aa68ab1c))
+
+* Merge branch 'MLDSAI:main' into feature/scrub-final ([`23b5228`](https://github.com/OpenAdaptAI/OpenAdapt/commit/23b5228d6d38d342f8efb1cf3919ea606ef4691c))
+
+* fix get_descendants_info performance ([`371b7c2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/371b7c209dde35c155fde4d1f8e3c19a3a1131ce))
+
+* allow for python3 -m openadapt.app ([`6789dcd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6789dcdef898b8490f9783ee9c2b5f2c040e4682))
+
+* Merge branch 'silence-warnings' into add-GUI ([`45a651f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/45a651f308bc908a2cf89eac7f6b40e42cce0332))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`cc0107f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cc0107f04e1382e3b79701a9eff8e30735362caf))
+
+* Merge remote-tracking branch 'upstream/main' into clear-data ([`b922155`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b9221554db6281e8c9c0e29059e3b390b5be6e3a))
+
+* Merge remote-tracking branch 'upstream/main' into silence-warnings ([`cf3b7ce`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf3b7cee589e3de2bcc89fad81304f827bfbb4fd))
+
+* Merge remote-tracking branch 'upstream/main' into pickling_investigation ([`9ea3953`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9ea39536a87ae70b838a61c20e0601237354e43c))
+
+* Merge branch 'MLDSAI:main' into feat/tracing ([`3da5b64`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3da5b64411d4f1d3c1fad00baec33cabc4ec660e))
+
+* removed indentation since not necessary with logging ([`65fb226`](https://github.com/OpenAdaptAI/OpenAdapt/commit/65fb226e9a0ef7136bfb838a5ea5c5a85cfae5aa))
+
+* added tracing for most functions (except those that would be redundant) ([`e325c2e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e325c2e0716044402db97a0c9fdd3473d73f9c62))
+
+* Merge branch 'publishing-with-pypi' of https://github.com/Mustaballer/puterbot into publishing-with-pypi ([`84c2e14`](https://github.com/OpenAdaptAI/OpenAdapt/commit/84c2e14d63bbe315d2ff91219638a00af9a5f740))
+
+* Merge branch 'main' into publishing-with-pypi ([`89386f3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/89386f3d03c570aec9ea63975fa46dcddc15493e))
+
+* use repository_username and repository_password instead of pypi_token in release.yml ([`e19dcfd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e19dcfd77cf34cbe940b571f5e273b2437a41cf0))
+
+* Merge pull request #217 from KrishPatel13/install
+
+Add openadapt/install ([`7db7cc9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7db7cc9215c30b0594e08245cc97fa74a0760d48))
+
+* add pickle dumps state ([`28b409f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/28b409fac4d36ac608d9babc0a090ffef1310db1))
+
+* use highest_protocol ([`76fb5ec`](https://github.com/OpenAdaptAI/OpenAdapt/commit/76fb5ec18652f0fd34952e7a1336c7a4189d0326))
+
+* fix typo ([`c36f13e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c36f13e2087a0bf5c33bccdf440179a38c90826f))
+
+* Add CONTRIBUTING.md ([`871d1e7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/871d1e7d20513fb4afac19fea1e2b12d5102da62))
+
+* merge ([`9b64cc7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9b64cc7affe1e6cdfdbc6abb0adb400f020e7faf))
+
+* better checks if changes are needed ([`8e66364`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8e663645c1942ef49bd2dec11897cff0b7e232ee))
+
+* Check if stashing is needed ([`d564bf4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d564bf4e7f6780c72ae664ca2599aeceb9bf53b4))
+
+* check if stashing is needed ([`cf9afa6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf9afa6e5c457586cdd2950a47d1adc00185c58a))
+
+* added pull request template ([`bdb3ba8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bdb3ba81fdfa3f5ce6c650838b72543cef90bae8))
+
+* add issue template to contributing ([`92889d9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/92889d96da5aa8d9fdb8e6c0ad136ab3e82ac5c3))
+
+* new feature template and add config to templates ([`6821222`](https://github.com/OpenAdaptAI/OpenAdapt/commit/682122278fd7464402ded7f0a9adfd68ebb49a4a))
+
+* remove print ([`192217a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/192217a0a72da63dabd58b25628610dafe579092))
+
+* add docstrings ([`feaf63a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/feaf63a7bc7effcf652dc0adfcf2d18047dfa1a2))
+
+* change docstring ([`5d92e22`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5d92e22bf0ee8fa9daa0621252de1cae8c9ffd32))
+
+* remove ws, reduce market point size ([`d582549`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d582549c8ad4c43964587befbd641b8d8d16949a))
+
+* update gitignore ([`38cf23c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/38cf23c975cd4d368c4e6684360bf3dd8e35d5bd))
+
+* sync branch ([`7778049`](https://github.com/OpenAdaptAI/OpenAdapt/commit/777804900fb21cfb8a20bbd82881ab8648ae9899))
+
+* update .gitignore and requirements.txt ([`f7e2517`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f7e251753c3d64518283f54e57be0b4c95b1dd79))
+
+* fix inaccurate mask by adding more input points ([`90be2d1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/90be2d1763789dcae8220504367a141c224cfe26))
+
+* black sam.py ([`abcd31d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/abcd31d033e65961bb0b6447dde3ca9f663450af))
+
+* remove unnecessary lines of code ([`ad39a80`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ad39a80b45e59449a1c2e33efb98a5262f75b4f7))
+
+* added test for to check for duplicate descendants ([`fe0c267`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fe0c26764b5b386b895a0b8743fba825d66c7d7d))
+
+* def get_descendants_info ([`40ed70b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/40ed70bf309056bdc02cd4c235ceb9c567e67dcf))
+
+* use regex for excluding src and alembic directories ([`74e58c2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/74e58c271ed7a1942f2c125f8d2c9827758e87e0))
+
+* exclude src from black check ([`9c2daa0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9c2daa0ce90119d143745e3c047781cc2511424a))
+
+* Try Krish approach for failing dependency in requirements.txt ([`2460ca3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2460ca3d58e84dd16fc590c544df6ae5b215055f))
+
+* add version to black, and moved around in requirements.txt ([`ce320b6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ce320b691a707322490012b1511d177b5227fc3c))
+
+* use config file ([`8c70f6f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8c70f6f5471f8c63edd84b5633735536042e1469))
+
+* use config.DB_FPATH ([`b7ed43e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b7ed43e5c5e09e1ab43bfa8afe0f11eaa2c2ee6b))
+
+* Update CONTRIBUTING.md with issues ([`c9fab2f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c9fab2f9b06fc6427a17f6c43710078ef76762a5))
+
+* renamed the template folder ([`d595c35`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d595c35865c960575fc31bd3c97269db346373f1))
+
+* Rename bug_form.yaml to bug_form.yml ([`598efe0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/598efe0ed7b12634eb4685c271abf37e80587ee6))
+
+* Initial bug form ([`22dd66d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/22dd66d99f21c813a1350f01a64bb0501af69010))
+
+* improve formatting ([`bbbfde9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bbbfde9892a23109b8e202f99f14cf8ccd3b6352))
+
+* refactor openadapt to OpenAdapt ([`853331b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/853331bdd6b88675df7de77889bda48213cf9309))
+
+* puterbot -> openadapt ([`aa6e5a3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/aa6e5a389be08aed607d081703c20e122d06b332))
+
+* remove optional scrubbing for images for now ([`ad01102`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ad011025daa1aaf4c83aafe026c9ab20069eab1d))
+
+* organized the requirements.txt ([`392a465`](https://github.com/OpenAdaptAI/OpenAdapt/commit/392a465dde6a4a55c65710b9113d40fc6863f73b))
+
+* created mock unit test ([`e505888`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e50588851a7d61967d8ed4868eb1f9e978919db4))
+
+* fixed recording stop button ([`a680c4d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a680c4dd1fe85c64d47a03766880976ebbcea6a3))
+
+* save & sync switch states ([`e3732a3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e3732a3bfaa109fb3d0c21fe3cd44ac26efca5ec))
+
+* suggestions implemented ([`a61c812`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a61c812899d3a65b44a092f1ba5357b2559093e0))
+
+* remove unused file ([`56d3cff`](https://github.com/OpenAdaptAI/OpenAdapt/commit/56d3cff2cd7b57e786edbfc572e06dad97bbaf68))
+
+* fic utils.py L477 Todo ([`f495c4c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f495c4c68b33dc8f731517e893579cb3605b1d72))
+
+* add openadapt/install
+add install_openadapt.ps1 (from OpenAdaptAi/install repo)
+add install_openadapt.sh (from OpenAdaptAi/install repo)
+update spacy model from _lg to _trf ([`760be83`](https://github.com/OpenAdaptAI/OpenAdapt/commit/760be832fc4e250363ebf34de4065d5162e17732))
+
+* fix main ([`c4edfef`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c4edfef8bbeafa1a67519121964eb9f8107cd0a1))
+
+* change state to include all props ([`86766ef`](https://github.com/OpenAdaptAI/OpenAdapt/commit/86766eface00a7896234ac69dccbce2cc39e5920))
+
+* Merge branch 'clear-data' into add-GUI ([`f165494`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f1654940f424844300c5fab2a372fa69052ad60f))
+
+* remove commented line ([`93e9ba1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/93e9ba12cff6ba773135f3ea998040fa0b4abf73))
+
+* added changes from review, fixed pyinstaller ([`77818ec`](https://github.com/OpenAdaptAI/OpenAdapt/commit/77818ec30440f71422b935adda511ee445dacde9))
+
+* Exclude migration files in black check and lint checks ([`d4c4b7a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d4c4b7aa1403d9ae326f581a0bbdc67c63aeafae))
+
+* code reformating ([`389d373`](https://github.com/OpenAdaptAI/OpenAdapt/commit/389d373403b7d42f0da4e8bad984265d3eb8ff51))
+
+* add scrubbing features ([`dab2967`](https://github.com/OpenAdaptAI/OpenAdapt/commit/dab2967bfde00b025e0148eeba3beaf8df700fa0))
+
+* Copied main.yml from closed PR, and replaced reST doctsring style with Google Python Style ([`a9a062a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a9a062addf31820810e3541e9530328c2a5093a2))
+
+* scrubbing in diff images ([`37968e5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/37968e5b79fe217d9fc674b228a05e3eb0e7427f))
+
+* refactor
+
+added some comments and moved to scripts/reset_db.py ([`b728c98`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b728c98a7c97496dcc5c1dc636f6ff47170303c1))
+
+* remove blank lines ([`318c344`](https://github.com/OpenAdaptAI/OpenAdapt/commit/318c34441e140525c0884da31acc7f25f7bb9ba9))
+
+* resolves a TODO in utils
+Moved DIRNAME_PERFORMANCE_PLOTS = "performance" in config ([`f72de4c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f72de4c604d2bb556cfafd2811636b4f5c46fa77))
+
+* Added function docstrings
+
+fix typo is_seperated ([`d5b303d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d5b303dce17f49ed1caabab8ce27d0007b328272))
+
+* moved the text_sep, prefix and suffix
+from models.py to config
+also move language to config
+also moves the masking char to scrub ([`c69caf3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c69caf31901dce72ea43c719e9fa7ced158a3061))
+
+* Added Testing Section ([`8ec83b0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8ec83b0d44f2640127995d5e474181417dd7cda4))
+
+* purely summarizes now ([`f197253`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f19725346066757d38bd1a6e15b945ca6b4f7679))
+
+* Update Readme
+convert back all hyphenated and scrubbed text back to hyphenated form ([`99bbb9a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/99bbb9ab6974176a38ad4527d108909c2809a26f))
+
+* ran black, flake-8 and pylint ([`89430e2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/89430e23be4c04a27be71a1976e300932a92e971))
+
+* 255 -> (255,)
+single element tuple ([`80edc68`](https://github.com/OpenAdaptAI/OpenAdapt/commit/80edc68f73f2f0d14ad5c07f7dc3f3118bc497d4))
+
+* implement get_active_element_state(x, y) ([`113933e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/113933e9a5dad4588681cacb03195c1b1dd6a911))
+
+* Merge branch 'feat/windowstate_for_windows' of https://github.com/jesicasusanto/PAT into feat/windowstate_for_windows ([`37da667`](https://github.com/OpenAdaptAI/OpenAdapt/commit/37da6671afd6e061990741eed4ff6bfaefd6720c))
+
+* implement get_window_state() ([`97a9eba`](https://github.com/OpenAdaptAI/OpenAdapt/commit/97a9eba63d4c934287906b70c6c18cf0dbb1f9c1))
+
+* add .db-journal in .gitignore ([`03c1fc0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/03c1fc0c9a907c10ed77802c66268fdfbaac1c3e))
+
+* fixed
+255 -> (255,0,0) in config due to failing test ([`faab021`](https://github.com/OpenAdaptAI/OpenAdapt/commit/faab021df63d88a0393c9863a11b1906d4515b17))
+
+* Scrubbing Before Visualization Final Version ([`1296995`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1296995dbfb8cedd619543e25ca4aa052a5d2376))
+
+* make action_event a required parameter ([`df80ac0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/df80ac02c078f891aa1b15fcc52a2b3d1ea50f23))
+
+* Refactored start.py to increase Python usage ([`c5ff8b7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c5ff8b7ce526e110454ff886aa638811e66a62a3))
+
+* encapsulated into method "run_app" ([`25d82b5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/25d82b5cf5696924d58ad6038df433332cd448a5))
+
+* Added semantic release tool to pyproject.toml and updated github action ([`97863ee`](https://github.com/OpenAdaptAI/OpenAdapt/commit/97863ee540ded5381f80c55a2987a1af586063f9))
+
+* switch approach to incorporate scale_ratios ([`376cc66`](https://github.com/OpenAdaptAI/OpenAdapt/commit/376cc66632f089bbf9f06abe1dd3b9c9b557d3ff))
+
+* last line may need to be changed ([`fe77bb9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fe77bb9f089cc7cc6f1ad78500dd8ad4e2622701))
+
+* Changed the update file to be a python file ([`b29905a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b29905ab6d27c0175c2b63248f5f253b21d608a1))
+
+* added openadapt.renew ([`f6fba8a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f6fba8a40788f1757b31fc78d1a5a7dbcb8d485e))
+
+* trying to fix the scrubbing configurations ([`b4a3b60`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b4a3b60baa821df17568583fe3e0656e6f0bf6d2))
+
+* Add scrub module
+Add test_scrub module
+Add Scrubbing config in config.py
+Add presidio and required packages in requirements.txt ([`ce67fd1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ce67fd194385319b6cc1e43a0f9d08d382380947))
+
+* allow window_event to be passed, if not passed retrieve from action_event relationship ([`2cafcf3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2cafcf31e33ec849b32d3da40e9abf78b9db60eb))
+
+* Merge branch 'MLDSAI:main' into crop_active_window ([`69642a4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/69642a4dc98b415635c9ce851047c1899b61cd22))
+
+* Merge branch 'MLDSAI:main' into feat/windowstate_for_windows ([`e26c201`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e26c2015635a13e02d00e2d17fec7ea3935952c7))
+
+* implement get_active_window_meta() ([`3ec8b1f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3ec8b1f508fb4a7ccae5f5b888109b474847af6d))
+
+* Create update.sh
+
+Initial commit ([`b909b8d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b909b8d7019f673ea97a3269dd047a5a6be8cc8e))
+
+* remove newline ([`e044d13`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e044d134925a95b22dc7b23b35ec6f579c7fd3b6))
+
+* more configurable ([`400370c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/400370c44ddf6835724a6f9483f502172b14daf8))
+
+* Merge branch 'silence-warnings' into add-GUI ([`33f8cc9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/33f8cc91bf8ffbe011e746afc7c6bdc66ce2e603))
+
+* added filter for loguru ([`b534bc4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b534bc4f9fc38724b3058ffcb40727e4efdba90f))
+
+* add SHOW_PLOTS ([`8ea9773`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8ea9773416dadbe32a10293b3d63e4d8477039cd))
+
+* add RESIZE_RATIO ([`f221598`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f22159801e8651ed3b7575135a8b2a0ea7ed3d5d))
+
+* undo whitespace ([`ce3bcbf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ce3bcbf958b8179220d4a8ceb0e258763c157341))
+
+* removed code for testing ([`e63ae6b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e63ae6b736dd258957dc7a29889ded2d09364c7d))
+
+* removed code for testing ([`56ae587`](https://github.com/OpenAdaptAI/OpenAdapt/commit/56ae587dc32074c9e645ec0d9c288ccd216f9890))
+
+* fixed sam.py ([`a0989b6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a0989b6d26771516c08d858cd138b485b04e49a6))
+
+* fixed indent and added visualization ([`ba40792`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ba40792b65434a1d6874b02a7316ec191a08b166))
+
+* Remove unnecessary changes ([`6b8a564`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6b8a56420f0d2729c802f08d5b566bc0f9dc50ad))
+
+* Merge pull request #191 from MLDSAI/abrichr-patch-1
+
+Update config.py ([`2bbe036`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2bbe036845cff2bf5668a3bdd00aec7fc90dbc18))
+
+* Update config.py ([`d615950`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d6159500aa3e1d7669f9fd4f8323dfa2d53cd2fe))
+
+* Merge pull request #122 from MLDSAI/feat/save-event-performance
+
+Save performance data to db ([`5ce11ea`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5ce11ea96ee72f698710c1f2b4652f84dd2bdf01))
+
+* migration ([`04cb8db`](https://github.com/OpenAdaptAI/OpenAdapt/commit/04cb8dbe70fe0b091a882829819b143c1e20c8b2))
+
+* fix ([`d2eaed3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d2eaed3a43e3eaca2b78ee60cbde380872f3dfcf))
+
+* fix ([`60de470`](https://github.com/OpenAdaptAI/OpenAdapt/commit/60de4701021950547041640e5c4a41ab60cfe0d1))
+
+* fixes ([`e0a1b23`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e0a1b2365ecd30653e281898804f79b21ede3053))
+
+* Merge branch 'main' into feat/save-event-performance ([`b576793`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b576793e267c317934fc7c3f531be6b166b33ddb))
+
+* Merge branch 'main' into feat/save-event-performance ([`f31d094`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f31d0940290a823128f8cc8964b3b9abf82e9fa6))
+
+* fixes ([`4aca87d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4aca87d4f34cc59309dcd0c6e3a6f41faa3f14e8))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`bfd4af7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bfd4af73f7278f24ca155ce4ccdfa6dd20ceded2))
+
+* add PerformanceStat alembic migration script ([`7130b49`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7130b49207b7305d64e451212bc822a944b9572a))
+
+* Merge pull request #182 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`08dac61`](https://github.com/OpenAdaptAI/OpenAdapt/commit/08dac61f2c468aa09725caacb1e4db0004b25725))
+
+* Update README.md ([`a0e8b71`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a0e8b718f8ff9a58ca7069fbf74f7dc9b2a322ad))
+
+* Merge pull request #120 from atineoSE/macOS_improvements
+
+MacOS improvements ([`20976c5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/20976c55861981555c5e0034743df98befa79dee))
+
+* documentation ([`e1d4496`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e1d44961cd6b677c38e3e7b7e7a36f51e99050c1))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`c5cb169`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c5cb1692718ffea5574f0dfc46362a0997572d6d))
+
+* Merge branch 'main' into macOS_improvements ([`0d40517`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0d4051734a16fad3467a678078ac31b29b9cb278))
+
+* Merge pull request #179 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`75041fc`](https://github.com/OpenAdaptAI/OpenAdapt/commit/75041fc817f32b70f3bc03cf5a56329a760dbbf6))
+
+* Update README.md ([`c27fc3b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c27fc3bf3b1b3e18dd63b95d72c42cbf87139835))
+
+* Updated README with hosted image instead of relative image for visualize.py ([`f498c7d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f498c7dc21a71123cf7c797725771c1a73edab80))
+
+* Added github actions for automatic publishing when releasing a new version ([`059651e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/059651e976f4aaf9d9b9b5c7859be7ca207f927e))
+
+* Create pyproject.toml config using Test PyPi ([`686505d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/686505dfadd344028782fd7151d2070ed9204512))
+
+* Merge pull request #176 from MLDSAI/fix/window
+
+wrap with try/except ([`2777019`](https://github.com/OpenAdaptAI/OpenAdapt/commit/277701932da3b53576e1566a81d6e94e653a92ff))
+
+* import pickle ([`be6e7e0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/be6e7e0bc74f68f89c6fce94718d9b6272dc4bd6))
+
+* revert; try pickling ([`3fcbb17`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3fcbb1745fdc159c0d6dc2c1efe9005b523aebcc))
+
+* try except in trigger_action_event ([`cba2573`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cba257397064726831606744aed43bdacc885754))
+
+* wrap with try/except ([`a457f50`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a457f50556509125b90bbf8e3d199daefebdb658))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`8fc3d40`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8fc3d407ad82c029711840185555575b058d5413))
+
+* remove unnecessary imports ([`a87f667`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a87f66703a7f732e4b5dae69950ec240f8502cc7))
+
+* remove unnecessary imports ([`95c9aa9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/95c9aa9422f0d1e848320f09a0f93dd6264c74fb))
+
+* add bbox functions ([`66a28a8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/66a28a8136ea8d9cb1f4dfe4673fba8103f79418))
+
+* Merge branch 'MLDSAI:main' into feat/sam_mixin ([`6b6b287`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6b6b2871b50afdccb6e9dc35415cd16f7bc7cdb6))
+
+* Merge pull request #151 from MLDSAI/feat/window_state
+
+Window state ([`4ea4ba8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4ea4ba83241793a85df8c424bb248047ebca749b))
+
+* merge main ([`ec13a78`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ec13a782c872caed47e477afe70c1d28b5279262))
+
+* fix ([`2692811`](https://github.com/OpenAdaptAI/OpenAdapt/commit/269281181fcfed5bfb8f1021a3213f6b891379e8))
+
+* wip ([`222b294`](https://github.com/OpenAdaptAI/OpenAdapt/commit/222b29444b62c984087a5d5684899ba089f78a36))
+
+* remove test changes ([`e8eab59`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e8eab593cfc779f858fa5aabc0d8ce879bc1babd))
+
+* remove unused import ([`6677df3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6677df3202aa2bbecb52815c59c4c8f8d16e6f0f))
+
+* fix ([`98abc16`](https://github.com/OpenAdaptAI/OpenAdapt/commit/98abc16f2a4917a2ec9fb2c95fb7093048362926))
+
+* ForceFloat ([`97e0838`](https://github.com/OpenAdaptAI/OpenAdapt/commit/97e0838610e3efc4fe874fda52aef4803381c0a6))
+
+* wip ([`cc1dfea`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cc1dfeadcb2071aaf738bdc22d16ceef29571562))
+
+* added basic temporary test ([`8634267`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8634267badddc152b73206f91410c0f85fef6c70))
+
+* config.RECORD_READ_ACTIVE_ELEMENT_STATE, .REPLAY_STRIP_ELEMENT_STATE ([`15f7c31`](https://github.com/OpenAdaptAI/OpenAdapt/commit/15f7c317ffb04602c6c3e944e84b2d6edd5b002d))
+
+* merged changes ([`579feea`](https://github.com/OpenAdaptAI/OpenAdapt/commit/579feea567cf8a21fc63e923266a8ef007816ca0))
+
+* replace other func with get_screenshot_bbox ([`0cbeb7e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0cbeb7e98129efd1c4401b0b891296dada0413cc))
+
+* Merge branch 'feat/sam_mixin' of https://github.com/jesicasusanto/PAT into feat/sam_mixin ([`27f65e7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/27f65e7fa55a8788b1fbbee4d2d6ee6a7e93048a))
+
+* fix sam_mixin.py ([`bb707a6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/bb707a6089d06a3be352b9deadc8db0ea1364991))
+
+* Update util.py ([`1551c56`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1551c56681876b6cd0e77396caacc54e0fc29df5))
+
+* Update util.py ([`6237304`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6237304b99a433c0443ec24add5a920cc51ae5df))
+
+* Merge branch 'MLDSAI:main' into feat/sam_mixin ([`413f0c9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/413f0c935fec40df7b0a8298fced2ce401a365d8))
+
+* Merge pull request #159 from dianzrong/touchpad
+
+Updated README to note trackpad/touchpad limitations ([`fe8be21`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fe8be21ea2da6898ca6d051762e47f59b2a3bb56))
+
+* add sam_Mixin ([`8f2d67e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8f2d67e340c40f66e1b8bc29d49bee7a51375806))
+
+* create sam_mixin ([`63a569f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/63a569f494c6db97cf3a589f8c9a78e8f1d04629))
+
+* modularization + fixes ([`f9b7029`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f9b70298497a0e54480cef494f37e504348d588a))
+
+* Add Github Action info
+
+Added the exact linter used in the GitHub Action ([`23ca868`](https://github.com/OpenAdaptAI/OpenAdapt/commit/23ca868a89201d8654aae4b53c24a1ce43c34a77))
+
+* implemented pyinstaller ([`fa43c57`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fa43c57b088c571da047bb85ba151d35a2e167fc))
+
+* added file picker for import
+
+todo: work on export ([`03b5295`](https://github.com/OpenAdaptAI/OpenAdapt/commit/03b5295588cca194bec1a8750c03ab5439b8822b))
+
+* Merge remote-tracking branch 'upstream/main' into add-GUI ([`062cde9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/062cde9d71cc94405373aafb8acc59222f9dada2))
+
+* Create CONTRIBUTING.md
+
+Rough draft ([`20abe2a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/20abe2a848face4dad010cb9e2888941617c2ae9))
+
+* Add instructions for troubleshooting ([`cf1bee4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cf1bee48e932df0b4281be0c3497cbc532a2dfaf))
+
+* Improve description ([`1346f09`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1346f0982327f78e4f4748d6bfb6916d01d58743))
+
+* Add information on how to set up permissions on macOS ([`a7c0ad9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a7c0ad9dd8dd20e27cdc6773012800b915ad0a3a))
+
+* Ignore packages in editable mode ([`e0df478`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e0df4782045d822c779defb31e8a678f1006f04a))
+
+* Add missing dependencies and import pynput in editable mode ([`907b6de`](https://github.com/OpenAdaptAI/OpenAdapt/commit/907b6de7145c9b69b1f1333a74e7f0cda3442d15))
+
+* deprecate old ui, add import/export recording ([`c8ad9fe`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c8ad9fe31b91ea483719ac23e687ecbb7c686847))
+
+* Reformatted limitations in the README and added that most touchpad and trackpad gestures aren't supported ([`88aecca`](https://github.com/OpenAdaptAI/OpenAdapt/commit/88aecca63742f7baaecbd1dd149155d8709bd6ad))
+
+* working StatefulReplayStrategy ([`fc8cb2a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fc8cb2a1c83f42db60a0e849f3ce7f5085983442))
+
+* share button
+
+could use it for exporting? or just sharing openadapt ([`a95661f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a95661fd72aa95b4032f23cd292d865c0c0b9193))
+
+* align dialog buttons ([`2bee6dd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2bee6dd77d8367ee895096b45107f330f576ca62))
+
+* wip ([`163308b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/163308b584686816c9344b84ce35fd21ac4a816c))
+
+* NiceGUI WIP
+
+code needs a little bit of clean up but is functional ([`359fbaf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/359fbaf371db2290e143415c5f47bf82627702e5))
+
+* wip ([`f92f362`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f92f362e2fa4e64e45c8adad538aa7981d67a95d))
+
+* wip ([`c1c7615`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c1c7615648b5b055e06def5382840dcfa873376b))
+
+* wip ([`2542329`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2542329cb66f0e6c03a145b1ccbaa1407637776d))
+
+* Merge pull request #126 from 0dm/#109
+
+#109 renamed all instances of puterbot to openadapt ([`754b854`](https://github.com/OpenAdaptAI/OpenAdapt/commit/754b8541389c05dab2a2aa0bc99f9a8e0da0ecf4))
+
+* MAX_TABLE_CHILDREN ([`b8481ee`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b8481ee018e5bb9c7049b7d80801964b7c3c7986))
+
+* save window state (mac) ([`99dc235`](https://github.com/OpenAdaptAI/OpenAdapt/commit/99dc2355073ad5db3d20a86d3fc5ba7febddaa86))
+
+* Merge branch 'MLDSAI:main' into expand-on-demo-replay-strategy ([`1f09c07`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1f09c0758590562aaa2b38a9cb47c245623b1ecb))
+
+* Fixed initializer ([`13a930b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/13a930b51578998688143ca37c52cc6ceb0a2d6a))
+
+* small error with initializer ([`fbc2486`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fbc24861037fbe44e20e23e66654bddde650d35a))
+
+* Merge branch '#109' into add-GUI ([`09d1303`](https://github.com/OpenAdaptAI/OpenAdapt/commit/09d1303d52338b280e37457ba6aa75a76f73c44b))
+
+* resolved merge conflict ([`8508583`](https://github.com/OpenAdaptAI/OpenAdapt/commit/850858375ea3195d7d8136d75c4aac38af6ce597))
+
+* Merge remote-tracking branch 'upstream/main' into #109 ([`3bd935c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3bd935c65384f778db27a531c0315a3e1699214d))
+
+* Revert "Merge branch 'main' into #109"
+
+This reverts commit cb5373b6238b91c4576aca04228f3c416c1f5e6e, reversing
+changes made to 796e35a2ccf7c12df3b20a5903355ab4d07ab68a. ([`605e3fb`](https://github.com/OpenAdaptAI/OpenAdapt/commit/605e3fbd66147e557222ded08d124475cc45890c))
+
+* Merge branch 'main' into #109 ([`cb5373b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cb5373b6238b91c4576aca04228f3c416c1f5e6e))
+
+* Created tests for the helper functions in summary_mixin.py ([`3895474`](https://github.com/OpenAdaptAI/OpenAdapt/commit/38954743171f5fa68f125451f69bd1fe01ee2a66))
+
+* Moved SummaryReplayStrategyMixin up ([`8aab461`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8aab4615d436da1cc61b536afcc265e8793e44bd))
+
+* Formatting changes and changed ascii text to only contain words ([`becb3a8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/becb3a8ba1916d54cb128d9e9f5d246da4cf862d))
+
+* Additional formatting changes ([`e0ddbe8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e0ddbe847e4652fff19b628a91f894d0d0b1bf2e))
+
+* Used black and the Google Python style guide to imrpove formatting. ([`2dcf6cd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2dcf6cdccb1e2d98f3fffdf3e477e7b4c41c6f79))
+
+* Removed finding the last screenshot ([`a0ead1f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a0ead1f383f9ff061ea4d02ea61be650ec507d02))
+
+* Merge pull request #119 from 0dm/#103
+
+#103 : Rename InputEvent(s) to ActionEvent(s) ([`27efb0a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/27efb0af5d304caf67ca19acb3ea45c5078c2742))
+
+* Update app.py
+
+added logo button ([`8220fe4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8220fe41696d576c652d8fd5de096e4fee01c125))
+
+* Add Functioning GUI
+
+requires tkinter ([`c2db59d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c2db59d868bfff0e1b489c59a9e201f34b3abf9f))
+
+* #103 : Refactor InputEvent => ActionEvent ([`7e537d4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7e537d47588ee897d7162a46a5b077af10fb1b8b))
+
+* Revert "resolved #103"
+
+This reverts commit b7c99373fb35e54f7e2efdafa09baa5aa818992c. ([`659b9d7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/659b9d7201afe5aa4bd4561523629da3da9c3617))
+
+* Add newline ([`0844f9c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0844f9c7960adadfc03a6c9571aec2b4a4b9b997))
+
+* Merge remote-tracking branch 'upstream/main' into #109 ([`796e35a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/796e35a2ccf7c12df3b20a5903355ab4d07ab68a))
+
+* Use _insert for writing perf stats to db ([`1564d56`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1564d56bdd0b30d7e2d8351fd6604f7af927dd1a))
+
+* Merge pull request #129 from MLDSAI/fix/prompt_truncation
+
+fix prompt truncation; fix diff_mask ([`0ab8213`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0ab8213e511127415045460f881cf691404c0e49))
+
+* fix prompt truncation; fix diff_mask ([`dd045ef`](https://github.com/OpenAdaptAI/OpenAdapt/commit/dd045ef74f0159e1b2fe8c12c8c7b8425e2c3866))
+
+* #109 renamed all instances of puterbot to openadapt ([`0e4e0ca`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0e4e0caae143e5eeafdfce419af27f5867126d13))
+
+* Revert performance plot to off by default ([`c1cb8de`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c1cb8dedd7624ef1bd1df833617d4a52ba855fe4))
+
+* Save event performances data. Closes #85 Fixes #93 ([`8ced5bd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8ced5bd6db4ff78945801f8e9391e56b0af02947))
+
+* Merge pull request #121 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`4f22e89`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4f22e890179583eaa7c0fdb9dd635d30b712700d))
+
+* Update README.md ([`447969d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/447969d056807da4985c3e33e1462aac864b1d7f))
+
+* resolved #103
+
+🔨 ([`b7c9937`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b7c99373fb35e54f7e2efdafa09baa5aa818992c))
+
+* Merge pull request #115 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`3f310d0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3f310d0b072d020c54336fef06e4341abe634c16))
+
+* Update README.md ([`089295e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/089295e296ce0e2a0d947554681433bca2037b97))
+
+* Merge pull request #110 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`2aa96d2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2aa96d269f59986f7f94aeabbd06c2b0ff23b2c7))
+
+* Update README.md ([`1566cdf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1566cdf79e810f984fe3d49c23a5cfa1219c8e1c))
+
+* Merge remote-tracking branch 'upstream/main' ([`b49d1cd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b49d1cd940efcf88b95a4db676649c47054060ee))
+
+* Merge pull request #107 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`e944074`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e944074b3a0a5751592d2a6919c48776b10b245b))
+
+* Update README.md ([`e0ed5fa`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e0ed5fa755d3f7eec6219cda9f08e7a79f75d2db))
+
+* Merge pull request #106 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`9eb420d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9eb420dc4865203b8de5efc0c8e170dc5a83b6ad))
+
+* Update README.md ([`793ef07`](https://github.com/OpenAdaptAI/OpenAdapt/commit/793ef07a3c18aec6704c9ffcaf0ba2ccf1f36e1e))
+
+* Merge pull request #101 from MLDSAI/abrichr-patch-1
+
+Update README.md ([`02b718c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/02b718c9590d4fc1e88874e12b312096667f57c8))
+
+* Update README.md ([`3f1e00f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3f1e00f8d76187d1e2906284151e951e1c2ea40a))
+
+* Update demo.py ([`67396e3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/67396e3306eb4f57581339c098fe580f46d0a0fd))
+
+* wip fastapi
+
+fastapi on localhost ([`cdaee2a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cdaee2a01dfe0325a246d17b2bf9f3d90a1d487d))
+
+* Update README.md ([`29419e1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/29419e15aa9488f270ab1b7a18272bc805c84a78))
+
+* Integrated SummaryReplayStrategyMixin into the DemoReplayStrategy ([`e6c67fb`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e6c67fb243512be5e8666f1f1e3463c65e93239b))
+
+* Refactored into a into a SummaryReplayStrategyMixin. Am open to changing the function parameters of get_summary and what attributes SummaryReplayStrategyMixin has ([`2116cf6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2116cf6c93fccd285e7d5716acb1bc3184a3a151))
+
+* Small type change ([`fad5430`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fad5430322d33b283223b4f5a872fa316b348f29))
+
+* Removed print statements ([`b897ac8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b897ac831c226023f1adc7d7cff57aa3f3a51d49))
+
+* Added the needed libraries for DemoReplayStrategy ([`9c570fd`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9c570fd4e6627fa96d6cf8e59edcf690d9019728))
+
+* Changed the method in which the OCR and ASCII texts are summarized and compared. ([`0a53330`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0a53330e8fe45fe7ae85cf00419c1924eed2b771))
+
+* Changed the way window_changed was added ([`626c209`](https://github.com/OpenAdaptAI/OpenAdapt/commit/626c2099cfac8550aabf3500b842348f92952cf9))
+
+* Fixed error ([`d4968b6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d4968b61fe63dd4a4fafcd831544081343744a22))
+
+* Merge remote-tracking branch 'origin/main' ([`33ee2d5`](https://github.com/OpenAdaptAI/OpenAdapt/commit/33ee2d5b5b34aca28f23ec08e48e30b4e2d71ff7))
+
+* Used ASCII to check the summarization of the OCR text ([`f34cec2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f34cec23172ce52ad03ac33559a1f3722add6cc3))
+
+* Merge branch 'MLDSAI:main' into main ([`daaf679`](https://github.com/OpenAdaptAI/OpenAdapt/commit/daaf6797dcb7a53354f4096431d4e122c834d88f))
+
+* Used the OCR text to note in the prompt to add a note at the front of the string to indicate whether the screen changed ([`f5e935d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f5e935d37eb719f178357159f3a77a24df5aef5e))
+
+* Update README.md ([`17f8e64`](https://github.com/OpenAdaptAI/OpenAdapt/commit/17f8e64d53934af44b16f5eab989dc5fa6e4c991))
+
+* Update README.md ([`d37b157`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d37b157a2aa55393688fd2036af09358e8156352))
+
+* Update README.md ([`02cfb5a`](https://github.com/OpenAdaptAI/OpenAdapt/commit/02cfb5a007a7b4241a1bcb8a01bb0caeae618564))
+
+* Merge pull request #31 from MLDSAI/fix/sys_platform
+
+pywin32 on windows only ([`76aa27b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/76aa27b8bd4a995a254e4d2f7b647893b16abcc2))
+
+* pywin32 on windows only ([`228a4b3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/228a4b317c02c28812c215bb36785c9c3cd48ade))
+
+* get_screenshot -> take_screenshot ([`18327f0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/18327f01ddd5ddb1511e2c173e9846aef5bd3676))
+
+* Update README.md ([`8a563bb`](https://github.com/OpenAdaptAI/OpenAdapt/commit/8a563bb5951260a950dff32407edbd1ea6362d88))
+
+* rename completion_history -> result_history ([`6892cf4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6892cf4aff2d215f9e8dec42b43556f7a561d65c))
+
+* add InputEvent.__str__; improve demo ([`549ef67`](https://github.com/OpenAdaptAI/OpenAdapt/commit/549ef6751042e585bc345b108b6e176779414813))
+
+* Merge pull request #25 from MLDSAI/feat/ascii
+
+add ascii_mixin.py ([`cb28427`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cb28427dc694d1ad0cc99b7b4fefb7d728f0e219))
+
+* update docstring ([`5c09b2d`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5c09b2d867e77ea156fefca577c6ace9403fffc3))
+
+* update docstring ([`6abfb4c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6abfb4cb61032c7379f6bfacc68ee2cc49ccd446))
+
+* add ascii_mixin.py ([`c8d2006`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c8d20067dffc26679588225c395fdba592efbae4))
+
+* fix typo ([`1b84542`](https://github.com/OpenAdaptAI/OpenAdapt/commit/1b84542ffe54310aba5c81c3cd2bbf2f2bb4ebe3))
+
+* upate README ([`af9c923`](https://github.com/OpenAdaptAI/OpenAdapt/commit/af9c923d8441d16af3b13e43c62796d5ca291493))
+
+* fix type ([`e7ba06c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/e7ba06c5df340dea7a050fbce51785a01cd83b4a))
+
+* Merge pull request #23 from MLDSAI/refactor/screenshots
+
+refactor screenshots ([`da13e5f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/da13e5f5fbccb5d82ab77015d0a9afcbf76ccaa9))
+
+* Screenshot.take_screenshot; fix fps ([`0657e43`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0657e432048892a1b9e515c594b92916fdb38c12))
+
+* refactor screenshots ([`f34c5f6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f34c5f67786ead7d5d8b56bc62d44957b24c3c7a))
+
+* Merge pull request #21 from MLDSAI/feat/llm_ocr_demo
+
+add llm_ocr_demo.py and related mixins ([`09e36f8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/09e36f8ed876f26b63ab679dbe86d4248062813b))
+
+* update README ([`61764bf`](https://github.com/OpenAdaptAI/OpenAdapt/commit/61764bf656ebc88a01e5c907f4788789dd417994))
+
+* minor refactor ([`5c309ae`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5c309ae481a8165282b46825c8125b5676d14ec9))
+
+* add TODO ([`a899fa2`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a899fa24cbaff33cbf610a0110d841e94d1b5104))
+
+* improve log_fps ([`4afa820`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4afa820a9f99ae4d15d3ad70c231bbbb475c7769))
+
+* log_fps ([`0e058f6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0e058f6ed3ab907d49aea2ac35b90be411a759b3))
+
+* docs; types ([`b4b51da`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b4b51da89f910d1d7170cc146eda502d9ff2f0a1))
+
+* update docstring ([`fc9de32`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fc9de3227808b4e51e33515991ec8c289dbe82ab))
+
+* add llm_mixin.py; ocr_mixin.py; llm_ocr_demo.py ([`12f0ff0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/12f0ff0e8a5bb51137ac531116c8aeb8b2873e64))
+
+* Merge pull request #20 from MLDSAI/fix/round_timestamps
+
+add round_timestamps ([`601208c`](https://github.com/OpenAdaptAI/OpenAdapt/commit/601208cd4948984130a63948af8acff6d45792cf))
+
+* NUM_TIMESTAMP_DIGITS=6 ([`74b2410`](https://github.com/OpenAdaptAI/OpenAdapt/commit/74b2410a29ccd146988a546948df6fa53e49d4ea))
+
+* read/write properties instead of globals in NaiveReplayStrategy ([`5828baa`](https://github.com/OpenAdaptAI/OpenAdapt/commit/5828baabe9643eccb5f1bf1c1f8178d0b06d953d))
+
+* add round_timestamps ([`2e2e2a7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/2e2e2a74e559c166a3b4eb595d8fb8c20a07167a))
+
+* Update README ([`fd7e825`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fd7e825a820e54ab09d42ae5d9be2acc2576d3ea))
+
+* update visualize.png ([`d486d6f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/d486d6f9f609dd2093865b073f655b0a831d6a43))
+
+* update README ([`eaa76a7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/eaa76a74fd9d0c3df41c6ec1b29df0fa11f1ccd3))
+
+* Merge pull request #18 from MLDSAI/feat/replay_strategies
+
+Add puterbot/strategies ([`a75665b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a75665b643346df6a3d0f98b931cb8d0894e7e75))
+
+* Merge branch 'main' into feat/replay_strategies ([`76097e4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/76097e4dd8fcf12698b1b06d5688053410343da3))
+
+* add missing pywin32 ([`91942a3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/91942a33dcf7521008cff5aef5ac60a46d41392c))
+
+* update README ([`44cafc4`](https://github.com/OpenAdaptAI/OpenAdapt/commit/44cafc46e82990035e8c879f5293219a1ee8fb5d))
+
+* Update README and docs ([`7969e98`](https://github.com/OpenAdaptAI/OpenAdapt/commit/7969e985c83a43780807a71d6d845049dcae0e18))
+
+* add assets/visualize.png; add back_populates; update README ([`4461031`](https://github.com/OpenAdaptAI/OpenAdapt/commit/446103128fe9ce4a7ef92b7e5c5bf7906c902a7d))
+
+* Add puterbot/strategies ([`a7ce3e8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a7ce3e8f351f59b6a3ba18d4b212a92175dca4ad))
+
+* Update README.md ([`f8f3438`](https://github.com/OpenAdaptAI/OpenAdapt/commit/f8f3438b223aef8377e4da02e456c82e010d1199))
+
+* Update README.md ([`6ec32b6`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6ec32b65b419f2a99c456b27aa9497d53a7e4163))
+
+* Merge pull request #16 from MLDSAI/feat/task_description
+
+add Recording.task_description; recording.py types and documentation ([`0325fc3`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0325fc347f55cb50499fbb91cb5d3e200f721acd))
+
+* add Recording.task_description; recording.py types and documentation ([`0299a05`](https://github.com/OpenAdaptAI/OpenAdapt/commit/0299a05e3a7fb86bac2ace1ad2dd98b6411aafe9))
+
+* Update README.md ([`93bfdf9`](https://github.com/OpenAdaptAI/OpenAdapt/commit/93bfdf9773c3566ce4fed7545201dcb9ee4c3107))
+
+* Update README.md ([`b69a3b7`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b69a3b7f0515fcc618804301e78c0c7db1e68ef4))
+
+* Merge pull request #10 from MLDSAI/ag23
+
+Update README ([`91c57f0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/91c57f0d6647592284122c1f6832b4704843bf11))
+
+* update README ([`4c745fa`](https://github.com/OpenAdaptAI/OpenAdapt/commit/4c745fa4d1469bb63b7f5b47e303b9b908c748d5))
+
+* Update README ([`ca09082`](https://github.com/OpenAdaptAI/OpenAdapt/commit/ca09082a16008c602cf8a4190f35f4345e86f910))
+
+* Update README ([`971dd36`](https://github.com/OpenAdaptAI/OpenAdapt/commit/971dd3619a62317998ac4e63d5f3da4433923db5))
+
+* update README.md ([`426930f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/426930f640c3fd1ca5900c54b519292287940c64))
+
+* Update README.md ([`6f80aa0`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6f80aa0bc83b04682143001eee8278a2daf8a614))
+
+* update README.md ([`a9ed8e8`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a9ed8e85b26ce6e47af29fa6634accdf3f6601a8))
+
+* update README.md ([`3305fd1`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3305fd161e263ff13478ec601355d109fdac0a71))
+
+* remove legacy build instructions ([`c097825`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c09782525a9e0303a4d3a2996ef2cf011081caca))
+
+* update README.md ([`03c0964`](https://github.com/OpenAdaptAI/OpenAdapt/commit/03c09645a75326d86607486eef13faa023475200))
+
+* Update README.md ([`fe2f22e`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fe2f22ec64204dde16aadcad680501bc5dcdb14b))
+
+* Update README.md ([`c674839`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c6748393aff703ac0b3d7b5fa450f057c6a9f9d9))
+
+* add test_events.py ([`c276e7b`](https://github.com/OpenAdaptAI/OpenAdapt/commit/c276e7bd0850e04254a56f86dfeef138cb15c2df))
+
+* add alembic version ([`3e531fc`](https://github.com/OpenAdaptAI/OpenAdapt/commit/3e531fc68f67b32b26e74b76993fb88aab5ad934))
+
+* add alembic LICENCE requirements.txt setup.py; fix README ([`b7e7b58`](https://github.com/OpenAdaptAI/OpenAdapt/commit/b7e7b581b0582c6bea8c073182efd07b2588a001))
+
+* improve README ([`fb85635`](https://github.com/OpenAdaptAI/OpenAdapt/commit/fb856353cfbc6b4711829f20a986385871a8c059))
+
+* Add Submitting an Issue section to README.md ([`6372a76`](https://github.com/OpenAdaptAI/OpenAdapt/commit/6372a76080b6ba949d657022368c0e1b5f0d4019))
+
+* update puterbot/README.md ([`46a7621`](https://github.com/OpenAdaptAI/OpenAdapt/commit/46a76219dbde2672a87ab51790810f2086dc48fe))
+
+* Update README.md ([`a57c92f`](https://github.com/OpenAdaptAI/OpenAdapt/commit/a57c92fd15f964ef17986dfa040f171459ab0354))
+
+* Update README.md ([`9a9bf17`](https://github.com/OpenAdaptAI/OpenAdapt/commit/9a9bf17747a02842ecf29dc96e75498bfd4e2d0c))
+
+* add puterbot/, .gitignore ([`22774ce`](https://github.com/OpenAdaptAI/OpenAdapt/commit/22774cef0d8b3f10ac07c98b402cfe6c03c6bbdb))
+
+* add README.md ([`cd67c61`](https://github.com/OpenAdaptAI/OpenAdapt/commit/cd67c61e4b961d350d5385d996c285bea3851c8f))
diff --git a/assets/fixtures.sql b/assets/fixtures.sql
new file mode 100644
index 000000000..d5144d8eb
--- /dev/null
+++ b/assets/fixtures.sql
@@ -0,0 +1,8 @@
+-- assets/fixtures.sql
+
+-- Insert sample recordings
+INSERT INTO recording (timestamp, monitor_width, monitor_height, double_click_interval_seconds, double_click_distance_pixels, platform, task_description)
+VALUES
+ ('2023-06-28 10:15:00', 1920, 1080, 0.5, 10, 'Windows', 'Task 1'),
+ ('2023-06-29 14:30:00', 1366, 768, 0.3, 8, 'Mac', 'Task 2'),
+ ('2023-06-30 09:45:00', 2560, 1440, 0.7, 12, 'Linux', 'Task 3');
diff --git a/openadapt/config.py b/openadapt/config.py
index e1b283033..6525b6527 100644
--- a/openadapt/config.py
+++ b/openadapt/config.py
@@ -38,7 +38,7 @@
"ACTION_TEXT_NAME_PREFIX": "<",
"ACTION_TEXT_NAME_SUFFIX": ">",
# SCRUBBING CONFIGURATIONS
- "SCRUB_ENABLED": True,
+ "SCRUB_ENABLED": False,
"SCRUB_CHAR": "*",
"SCRUB_LANGUAGE": "en",
# TODO support lists in getenv_fallback
diff --git a/openadapt/crud.py b/openadapt/crud.py
index 2066b22d9..19625a0ad 100644
--- a/openadapt/crud.py
+++ b/openadapt/crud.py
@@ -175,6 +175,7 @@ def _get(table, recording_timestamp):
def get_action_events(recording):
+ assert recording, "Invalid recording."
action_events = _get(ActionEvent, recording.timestamp)
# filter out stop sequences listed in STOP_SEQUENCES and Ctrl + C
filter_stop_sequences(action_events)
@@ -246,15 +247,13 @@ def get_screenshots(recording, precompute_diffs=False):
for prev, cur in zip(screenshots, screenshots[1:]):
cur.prev = prev
- screenshots[0].prev = screenshots[0]
+ if screenshots:
+ screenshots[0].prev = screenshots[0]
# TODO: store diffs
if precompute_diffs:
logger.info("precomputing diffs...")
- [
- (screenshot.diff, screenshot.diff_mask)
- for screenshot in screenshots
- ]
+ [(screenshot.diff, screenshot.diff_mask) for screenshot in screenshots]
return screenshots
diff --git a/openadapt/events.py b/openadapt/events.py
index d4eaf5bcb..df026548e 100644
--- a/openadapt/events.py
+++ b/openadapt/events.py
@@ -25,6 +25,7 @@ def get_events(
logger.debug(f"raw_action_event_dicts=\n{pformat(raw_action_event_dicts)}")
num_action_events = len(action_events)
+ assert num_action_events > 0, "No action events found."
num_window_events = len(window_events)
num_screenshots = len(screenshots)
diff --git a/openadapt/record.py b/openadapt/record.py
index 1668e205d..59800ec38 100644
--- a/openadapt/record.py
+++ b/openadapt/record.py
@@ -134,7 +134,6 @@ def process_events(
terminate_event: An event to signal the termination of the process.
"""
- utils.configure_logging(logger, LOG_LEVEL)
utils.set_start_time(recording_timestamp)
logger.info(f"starting")
@@ -278,7 +277,6 @@ def write_events(
the number of events left to be written.
"""
- utils.configure_logging(logger, LOG_LEVEL)
utils.set_start_time(recording_timestamp)
logger.info(f"{event_type=} starting")
signal.signal(signal.SIGINT, signal.SIG_IGN)
@@ -436,7 +434,6 @@ def read_screen_events(
recording_timestamp: The timestamp of the recording.
"""
- utils.configure_logging(logger, LOG_LEVEL)
utils.set_start_time(recording_timestamp)
logger.info(f"starting")
while not terminate_event.is_set():
@@ -463,7 +460,6 @@ def read_window_events(
recording_timestamp: The timestamp of the recording.
"""
- utils.configure_logging(logger, LOG_LEVEL)
utils.set_start_time(recording_timestamp)
logger.info(f"starting")
prev_window_data = {}
@@ -513,7 +509,6 @@ def performance_stats_writer(
terminate_event: An event to signal the termination of the process.
"""
- utils.configure_logging(logger, LOG_LEVEL)
utils.set_start_time(recording_timestamp)
logger.info("performance stats writer starting")
signal.signal(signal.SIGINT, signal.SIG_IGN)
@@ -535,7 +530,6 @@ def performance_stats_writer(
def memory_writer(
recording_timestamp: float, terminate_event: multiprocessing.Event, record_pid: int
):
- utils.configure_logging(logger, LOG_LEVEL)
utils.set_start_time(recording_timestamp)
logger.info("Memory writer starting")
signal.signal(signal.SIGINT, signal.SIG_IGN)
@@ -677,7 +671,7 @@ def read_mouse_events(
terminate_event.wait()
mouse_listener.stop()
-
+@logger.catch
@trace(logger)
def record(
task_description: str,
@@ -689,7 +683,6 @@ def record(
task_description: a text description of the task that will be recorded
"""
- utils.configure_logging(logger, LOG_LEVEL)
logger.info(f"{task_description=}")
recording = create_recording(task_description)
diff --git a/openadapt/replay.py b/openadapt/replay.py
index a96d6a22e..a594054ec 100644
--- a/openadapt/replay.py
+++ b/openadapt/replay.py
@@ -10,7 +10,7 @@
LOG_LEVEL = "INFO"
-
+@logger.catch
def replay(
strategy_name: str,
timestamp: Union[str, None] = None,
diff --git a/openadapt/utils.py b/openadapt/utils.py
index ed396aa7b..778560ee0 100644
--- a/openadapt/utils.py
+++ b/openadapt/utils.py
@@ -6,6 +6,7 @@
import inspect
import os
import sys
+import threading
import time
from loguru import logger
@@ -20,6 +21,8 @@
EMPTY = (None, [], {}, "")
+_logger_lock = threading.Lock()
+
def get_now_dt_str(dt_format=config.DT_FMT):
"""
@@ -42,22 +45,24 @@ def configure_logging(logger, log_level):
# TODO: redact log messages (https://github.com/Delgan/loguru/issues/17#issuecomment-717526130)
log_level_override = os.getenv("LOG_LEVEL")
log_level = log_level_override or log_level
- logger.remove()
- logger_format = (
- "{time:YYYY-MM-DD HH:mm:ss.SSS} | "
- "{level: <8} | "
- "{name}:{function}:{line} "
- "- {message}"
- )
- logger.add(
- StreamHandler(sys.stderr),
- colorize=True,
- level=log_level,
- enqueue=True,
- format=logger_format,
- filter=config.filter_log_messages if config.IGNORE_WARNINGS else None,
- )
- logger.debug(f"{log_level=}")
+
+ with _logger_lock:
+ logger.remove()
+ logger_format = (
+ "{time:YYYY-MM-DD HH:mm:ss.SSS} | "
+ "{level: <8} | "
+ "{name}:{function}:{line} "
+ "- {message}"
+ )
+ logger.add(
+ StreamHandler(sys.stderr),
+ colorize=True,
+ level=log_level,
+ enqueue=True,
+ format=logger_format,
+ filter=config.filter_log_messages if config.IGNORE_WARNINGS else None,
+ )
+ logger.debug(f"{log_level=}")
def row2dict(row, follow=True):
diff --git a/openadapt/visualize.py b/openadapt/visualize.py
index 9a2e96f3d..f91747643 100644
--- a/openadapt/visualize.py
+++ b/openadapt/visualize.py
@@ -149,7 +149,7 @@ def dict2html(obj, max_children=MAX_TABLE_CHILDREN, max_len=MAX_TABLE_STR_LEN):
html_str = head + middle + tail
return html_str
-
+@logger.catch
def main():
configure_logging(logger, LOG_LEVEL)
diff --git a/openadapt/window/_macos.py b/openadapt/window/_macos.py
index 6c33181b0..57048ba0b 100644
--- a/openadapt/window/_macos.py
+++ b/openadapt/window/_macos.py
@@ -6,6 +6,9 @@
import AppKit
import ApplicationServices
import Quartz
+import Foundation
+import re
+import plistlib
def get_active_window_state():
@@ -14,8 +17,8 @@ def get_active_window_state():
meta = get_active_window_meta()
data = get_window_data(meta)
title_parts = [
- meta['kCGWindowOwnerName'],
- meta['kCGWindowName'],
+ meta["kCGWindowOwnerName"],
+ meta["kCGWindowName"],
]
title_parts = [part for part in title_parts if part]
title = " ".join(title_parts)
@@ -47,14 +50,12 @@ def get_active_window_state():
def get_active_window_meta():
windows = Quartz.CGWindowListCopyWindowInfo(
(
- Quartz.kCGWindowListExcludeDesktopElements |
- Quartz.kCGWindowListOptionOnScreenOnly
+ Quartz.kCGWindowListExcludeDesktopElements
+ | Quartz.kCGWindowListOptionOnScreenOnly
),
Quartz.kCGNullWindowID,
)
- active_windows_info = [
- win for win in windows if win['kCGWindowLayer'] == 0
- ]
+ active_windows_info = [win for win in windows if win["kCGWindowLayer"] == 0 and win["kCGWindowOwnerName"] != "Window Server"]
active_window_info = active_windows_info[0]
return active_window_info
@@ -63,7 +64,7 @@ def get_active_window(window_meta):
pid = window_meta["kCGWindowOwnerPID"]
app_ref = ApplicationServices.AXUIElementCreateApplication(pid)
error_code, window = ApplicationServices.AXUIElementCopyAttributeValue(
- app_ref, 'AXFocusedWindow', None
+ app_ref, "AXFocusedWindow", None
)
if error_code:
logger.error("Error getting focused window")
@@ -98,13 +99,14 @@ def dump_state(element, elements=None):
state[k] = _state
return state
else:
- error_code, attr_names = (
- ApplicationServices.AXUIElementCopyAttributeNames(element, None)
+ error_code, attr_names = ApplicationServices.AXUIElementCopyAttributeNames(
+ element, None
)
if attr_names:
state = {}
for attr_name in attr_names:
-
+ if attr_name is None:
+ continue
# don't traverse back up
# for WindowEvents:
if "parent" in attr_name.lower():
@@ -113,14 +115,19 @@ def dump_state(element, elements=None):
if attr_name in ("AXTopLevelUIElement", "AXWindow"):
continue
- error_code, attr_val = (
- ApplicationServices.AXUIElementCopyAttributeValue(
- element, attr_name, None,
- )
+ (
+ error_code,
+ attr_val,
+ ) = ApplicationServices.AXUIElementCopyAttributeValue(
+ element,
+ attr_name,
+ None,
)
# for ActionEvents
- if attr_name == "AXRole" and "application" in attr_val.lower():
+ if attr_val is not None and (
+ attr_name == "AXRole" and "application" in attr_val.lower()
+ ):
continue
_state = dump_state(attr_val, elements)
@@ -135,14 +142,59 @@ def dump_state(element, elements=None):
def deepconvert_objc(object):
"""Convert all contents of an ObjC object to Python primitives."""
value = object
+ strings = (
+ str,
+ AppKit.NSString,
+ ApplicationServices.AXTextMarkerRangeRef,
+ ApplicationServices.AXUIElementRef,
+ ApplicationServices.AXTextMarkerRef,
+ Quartz.CGPathRef,
+ )
+
if isinstance(object, AppKit.NSNumber):
value = int(object)
elif isinstance(object, AppKit.NSArray) or isinstance(object, list):
value = [deepconvert_objc(x) for x in object]
elif isinstance(object, AppKit.NSDictionary) or isinstance(object, dict):
- value = dict(object)
- for k, v in value.items():
- value[k] = deepconvert_objc(v)
+ value = {deepconvert_objc(k): deepconvert_objc(v) for k, v in object.items()}
+ elif isinstance(object, strings):
+ value = str(object)
+ # handle core-foundation class AXValueRef
+ elif isinstance(object, ApplicationServices.AXValueRef):
+ # convert to dict - note: this object is not iterable
+ # TODO: access directly, e.g. via ApplicationServices.AXUIElementCopyAttributeValue
+ rep = repr(object)
+ x_value = re.search(r"x:([\d.]+)", rep)
+ y_value = re.search(r"y:([\d.]+)", rep)
+ w_value = re.search(r"w:([\d.]+)", rep)
+ h_value = re.search(r"h:([\d.]+)", rep)
+ type_value = re.search(r"type\s?=\s?(\w+)", rep)
+ value = {
+ "x": float(x_value.group(1)) if x_value else None,
+ "y": float(y_value.group(1)) if y_value else None,
+ "w": float(w_value.group(1)) if w_value else None,
+ "h": float(h_value.group(1)) if h_value else None,
+ "type": type_value.group(1) if type_value else None,
+ }
+ elif isinstance(object, Foundation.NSURL):
+ value = str(object.absoluteString())
+ elif isinstance(object, Foundation.__NSCFAttributedString):
+ value = str(object.string())
+ elif isinstance(object, Foundation.__NSCFData):
+ value = {
+ deepconvert_objc(k): deepconvert_objc(v)
+ for k, v in plistlib.loads(object).items()
+ }
+ elif isinstance(object, plistlib.UID):
+ value = object.data
+ else:
+ if object and not (isinstance(object, bool) or isinstance(object, int)):
+ logger.warning(
+ f"Unknown type: {type(object)} - "
+ f"Please report this on GitHub: "
+ f"https://github.com/MLDSAI/OpenAdapt/issues/new?assignees=&labels=bug&projects=&template=bug_form.yml&title=%5BBug%5D%3A+"
+ )
+ logger.warning(f"{object=}")
if value:
value = atomacos._converter.Converter().convert_value(value)
return value
diff --git a/openadapt/window/_windows.py b/openadapt/window/_windows.py
index f56b1605a..40b74250b 100644
--- a/openadapt/window/_windows.py
+++ b/openadapt/window/_windows.py
@@ -1,9 +1,5 @@
-import collections
-import sys
from loguru import logger
import pywinauto
-from pywinauto import Desktop
-import time
from pprint import pprint
import pickle
@@ -82,12 +78,12 @@ def get_active_element_state(x: int, y: int):
"""
active_window = get_active_window()
active_element = active_window.from_point(x, y)
- properties = active_element.get_properties()
+ properties = get_properties(active_element)
properties["rectangle"] = dictify_rect(properties["rectangle"])
return properties
-def get_active_window(depth=10, max_width=10, filename=None) -> Desktop:
+def get_active_window():
"""
Get the active window object.
@@ -95,8 +91,8 @@ def get_active_window(depth=10, max_width=10, filename=None) -> Desktop:
Desktop: The active window object.
"""
app = pywinauto.application.Application(backend="uia").connect(active_only=True)
- window = app.active()
- return window
+ window = app.top_window()
+ return window.wrapper_object()
def get_element_properties(element):
@@ -120,8 +116,7 @@ def get_element_properties(element):
'children': [{'prop1': 'child_value1', 'prop2': 'child_value2',
'children': []}]}
"""
-
- properties = element.get_properties()
+ properties = get_properties(element)
children = element.children()
if children:
@@ -143,6 +138,37 @@ def dictify_rect(rect):
return rect_dict
+def get_properties(element):
+ """
+ Retrieves specific writable properties of an element.
+
+ This function retrieves a dictionary of writable properties for a given element.
+ It achieves this by temporarily modifying the class of the element object using
+ monkey patching.This approach is necessary because in some cases, the original
+ class of the element may have a `get_properties()` function that raises errors.
+
+ Args:
+ element: The element for which to retrieve writable properties.
+
+ Returns:
+ A dictionary containing the writable properties of the element,
+ with property names as keys and their corres
+ ponding values.
+
+ """
+ _element_class = element.__class__
+
+ class TempElement(element.__class__):
+ writable_props = pywinauto.base_wrapper.BaseWrapper.writable_props
+
+ # Instantiate the subclass
+ element.__class__ = TempElement
+ # Retrieve properties using get_properties()
+ properties = element.get_properties()
+ element.__class__ = _element_class
+ return properties
+
+
def main():
"""
Test function for retrieving and inspecting the state of the active window.
diff --git a/pyproject.toml b/pyproject.toml
index 5633b2bb8..6fc69d1a2 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "openadapt"
-version = "0.5.1"
+version = "0.5.5"
description = "GUI Process Automation with Transformers"
authors = [
'Mustafa Abdulrahman ',
@@ -87,6 +87,11 @@ url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_t
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
+[tool.isort]
+profile = "black"
+group_by_package = true
+from_first = true
+
[tool.poetry.scripts]
visualize = "openadapt.visualize:main"
record = "openadapt.record:start"
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 000000000..f018d074c
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,42 @@
+import os
+import pytest
+
+from sqlalchemy import create_engine, text
+
+from openadapt.config import ROOT_DIRPATH
+from openadapt.models import db
+
+@pytest.fixture(scope="session")
+def setup_database(request):
+ # Create a new database or connect to an existing one
+ db_url = ROOT_DIRPATH / "temp.db"
+ engine = create_engine(
+ f"sqlite:///{db_url}"
+ )
+
+ # Create the database tables (if necessary)
+ db.Base.metadata.create_all(bind=engine)
+
+ # Read the SQL file and execute the statements to seed the database
+ with open(ROOT_DIRPATH / 'assets/fixtures.sql', 'r') as file:
+ statements = file.read()
+
+ with engine.connect() as connection:
+ connection.execute(text(statements))
+
+ # Define the teardown function
+ def teardown():
+ # Add code here to drop tables, clean up resources, etc.
+ # This code will be executed after the tests complete (whether or not they pass)
+ # Replace it with the appropriate cleanup operations for your project
+ # Example: db.Base.metadata.drop_all(bind=engine)
+
+ # Close the database connection (if necessary)
+ engine.dispose()
+ os.remove(db_url)
+
+ # Register the teardown function to be called after the tests complete
+ request.addfinalizer(teardown)
+
+ # Return the database connection object or engine for the tests to use
+ return engine
diff --git a/tests/openadapt/test_summary.py b/tests/openadapt/test_summary.py
index 66d099d8c..ba6fe5d4c 100644
--- a/tests/openadapt/test_summary.py
+++ b/tests/openadapt/test_summary.py
@@ -36,3 +36,4 @@ def test_summary_sentence():
she very soon finished it off."
actual = REPLAY.get_summary(story, 1)
assert fuzz.WRatio(actual, story) > 50
+
\ No newline at end of file