diff --git a/.github/workflows/autogpt-server-ci.yml b/.github/workflows/autogpt-server-ci.yml index 6eabaa132..6fb1d9c23 100644 --- a/.github/workflows/autogpt-server-ci.yml +++ b/.github/workflows/autogpt-server-ci.yml @@ -265,4 +265,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: autogptserver-AppImage-${{ matrix.platform-os }} - path: /Users/runner/work/AutoGPT/AutoGPT/rnd/autogpt_server/build/*.AppImage + path: /Users/runner/work/AutoGPT/AutoGPT/rnd/autogpt_server/dist/*.AppImage diff --git a/.gitignore b/.gitignore index d23d09da8..d7a9964ec 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,5 @@ pri* # ignore ig* .github_access_token +LICENSE.rtf +rnd/autogpt_server/settings.py diff --git a/assets/gpt_dark_RGB.png b/assets/gpt_dark_RGB.png new file mode 100644 index 000000000..e99d5ec6c Binary files /dev/null and b/assets/gpt_dark_RGB.png differ diff --git a/autogpt/poetry.lock b/autogpt/poetry.lock index 141f55957..a535be48f 100644 --- a/autogpt/poetry.lock +++ b/autogpt/poetry.lock @@ -359,7 +359,7 @@ watchdog = "4.0.0" webdriver-manager = "^4.0.1" [package.extras] -benchmark = ["agbenchmark @ file:///home/reinier/code/agpt/AutoGPT/benchmark"] +benchmark = ["agbenchmark @ file:///D:/AutoGPT/benchmark"] [package.source] type = "directory" @@ -1131,67 +1131,33 @@ files = [ ] [[package]] -name = "cx-freeze" -version = "7.0.0" +name = "cx_Freeze" +version = "7.1.1" description = "Create standalone executables from Python scripts" optional = false python-versions = ">=3.8" -files = [ - {file = "cx_Freeze-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:421920dbee2b4aab53a81f6c99d18b00baf622a328eae8e489f162154a46192a"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fa1ca4cf20c6ce45ce2e26bf8b2086525aaaa774e2ee1b16da4e0f9f18c7272"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a520bc6772325c0e38924da1d827fe370702f8df397f483691b94d36179beef6"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b89ed99a2f99fd2f3e28a91c85bdd75b4bfaf11b04729ba3282bfebdadadf880"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5174821c82826e5a57e43960877087f5af6073e3877b0b38a0be244111fe1a76"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cfd18cc00f3240b03d5bdf9515d59ace0881b5b5b6f2e7655d857d1fb71f351d"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bac44e65bdfce0839b9a6d15373ea084fda3cdbd902351cde530991b450c2b2d"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51a374f273d575827efe4f7ed9a88b6cab78abffacb858c829d7cbe4dc4ff56e"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-win32.whl", hash = "sha256:6603e6c47a15bd84bfbb20d92dc01d5e586b54928eb618461d2f14305471d570"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:d7ec847af5afbe3c638a096aae4ff5982a17d95e2fb7975e525ecf9505a185ea"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04b7a2e5c53f5d537f3d958ebf2b0a0a7cbe8daf980cb0087559a3e698abc582"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:50e7e78001d4f78e70a403ecb5507685854ce1e6c3ff37bec1920eb6f2256534"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d37ed560e86ca7958684701a6ae7f3300226d0d7c861ca5b90c78bf4c619ad2"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42145dc5c2c7a98c620b30b7e25661954817a13355c50c4219a4a4954b39db39"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9034d6f9c10d84d7edc0e4f4020e878de367e83c5877c039aa3c8b733bc318"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adc6bdba9ff8705745831620efb6ee5eff9ec6d31d9b8c56d2a61d6555299157"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37a3234c0e54b4afd561b47be4f22a6496f9436275fb7b59d90d7a3269fb4d6f"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83549f9f817cafa59ea2f6e2045c8fe119628458ff14bb732649b01b0a637f6d"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-win32.whl", hash = "sha256:c508cd354728367311a7deb5bb616eee441bf79c900e3129a49fd54a372dc223"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:8fb71d23dba27dc40393a8b460bbf64759899246cd595860f66493cee64f27a5"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:648fd0acb439efe22dced2430cbaeca87e5ca9ab315d148933104376cca9553d"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3125a8408da3ff4b0cf767689d678909f840dfe08633f5f2d3cfe333111dc334"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07e56b06c7ca0bd2fc37e3783908767dbe1926e1e2609edcaefcc749ab584329"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25531d5c61bb5e974d8a5d042f29a37a786e91c1d6f66e018fc50342a416f4e1"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f97154b4b60f6e1953ebce05803a5e11a35047d097fad60d7c181303b7c6ef6e"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2333db5cfa6db700c79fd45d614d38e9d698f1df2a3c7e21ccbcc63cc8a7a9b7"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:d45a58e0a9b010e0823c30fb8eb2077560d2bb0f78e4481a55bdb6ad0729f390"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0422dbd426fd9f4f4ec0cadc7e3192d38227464daa3eb215b03eb577cd9a49d4"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-win32.whl", hash = "sha256:2018e9cbf8172da09b311cfc3906503ee6ae88665ec77c543013173b2532b731"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae5facd782b220bca6828eb6fb1834540cf431b1a615cc63652641bd070b11e6"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f06368dd41568572818c4abfcf9b45449dced3fa9f1b5f29e3523ba4ff7fcfbb"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e203d90d8fa1cc4489b15edac7dfdd983518a02999f275897160fc0ecfa98e4c"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f800b0bc2df14c66fcf2f220ecf273c5942d0b982268d8e5ccc9ef2fa56e576f"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-win32.whl", hash = "sha256:c52641ce2484222f4d60f0acbc79b2dfbfb984493101a4806c5af0ad379ebc82"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:92a15613be3fcc7a310e825c92ae3e83a7e689ade00ce2ea981403e4317c7234"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:60a0f674b6a55fdf46d0cc59122551a79221ceecd038fed8533dcbceb9714435"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb15314e8395e9658a8a5e4e19558d0e096a68b76c744ba81ebc249061b7dd9e"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3290127acc67e830265265a911d9018640ffffb7fddb86eacb1e3d83ed4136c4"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-win32.whl", hash = "sha256:aa885f2fb29b9f7d9a7d8af223d38d98905484cc2356c474bb1d6fd1704323ad"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:fe4dbbfd52454c8ddb550f112713ee2ac36cc024303557763b605e35cdb6b9a8"}, - {file = "cx_freeze-7.0.0.tar.gz", hash = "sha256:b03f2854a15dd1e8962660d18882a71fefba0e1b6f68337193d4a072d1fc36e6"}, -] +files = [] +develop = true [package.dependencies] cx-Logging = {version = ">=3.1", markers = "sys_platform == \"win32\""} -filelock = {version = ">=3.11.0", markers = "sys_platform == \"linux\""} +dmgbuild = {version = ">=1.6.1", markers = "sys_platform == \"darwin\""} +filelock = {version = ">=3.12.3", markers = "sys_platform == \"linux\""} lief = {version = ">=0.12.0,<0.15.0", markers = "sys_platform == \"win32\""} patchelf = {version = ">=0.14", markers = "sys_platform == \"linux\" and (platform_machine == \"aarch64\" or platform_machine == \"armv7l\" or platform_machine == \"i686\" or platform_machine == \"ppc64le\" or platform_machine == \"s390x\" or platform_machine == \"x86_64\")"} -setuptools = ">=62.6,<70" +setuptools = ">=65.6.3,<71" wheel = ">=0.42.0,<=0.43.0" [package.extras] -dev = ["bump-my-version (==0.20.1)", "cibuildwheel (==2.17.0)", "pre-commit (==3.7.0)"] -doc = ["furo (==2024.1.29)", "myst-parser (==2.0.0)", "sphinx (==7.3.7)", "sphinx-new-tab-link (==0.4.0)", "sphinx-tabs (==3.4.5)"] -test = ["coverage (==7.4.4)", "pluggy (==1.4.0)", "pytest (==8.1.1)", "pytest-cov (==5.0.0)", "pytest-datafiles (==3.0.0)", "pytest-mock (==3.14.0)", "pytest-timeout (==2.3.1)", "pytest-xdist[psutil] (==3.6.0)"] +dev = ["bump-my-version (==0.24.0)", "cibuildwheel (==2.19.1)", "pre-commit (==3.5.0)", "pre-commit (==3.7.1)"] +doc = ["furo (==2024.5.6)", "myst-parser (==3.0.1)", "sphinx (==7.3.7)", "sphinx-new-tab-link (==0.4.0)", "sphinx-tabs (==3.4.5)"] +test = ["coverage (==7.5.4)", "pluggy (==1.5.0)", "pytest (==8.2.2)", "pytest-cov (==5.0.0)", "pytest-datafiles (==3.0.0)", "pytest-mock (==3.14.0)", "pytest-timeout (==2.3.1)", "pytest-xdist[psutil] (==3.6.1)"] + +[package.source] +type = "git" +url = "https://github.com/ntindle/cx_Freeze.git" +reference = "main" +resolved_reference = "876fe77c97db749b7b0aed93c12142a7226ee7e4" [[package]] name = "cx-logging" @@ -1340,6 +1306,27 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "dmgbuild" +version = "1.6.1" +description = "macOS command line utility to build disk images" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dmgbuild-1.6.1-py3-none-any.whl", hash = "sha256:45dba6af4a64872c6a91eb335ebeaf5e1f4f4f39c89fd77cf40e841bd1226166"}, + {file = "dmgbuild-1.6.1.tar.gz", hash = "sha256:7ced2603d684e29c22b4cd507d1e15a1907e91b86259924b8cfe480d80553b43"}, +] + +[package.dependencies] +ds-store = ">=1.1.0" +mac-alias = ">=2.0.1" + +[package.extras] +badge-icons = ["pyobjc-framework-Quartz (>=3.0.4)"] +dev = ["pre-commit", "tox"] +docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-tldr"] + [[package]] name = "docker" version = "7.0.0" @@ -1361,6 +1348,25 @@ urllib3 = ">=1.26.0" ssh = ["paramiko (>=2.4.3)"] websockets = ["websocket-client (>=1.3.0)"] +[[package]] +name = "ds-store" +version = "1.3.1" +description = "Manipulate Finder .DS_Store files from Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ds_store-1.3.1-py3-none-any.whl", hash = "sha256:fbacbb0bd5193ab3e66e5a47fff63619f15e374ffbec8ae29744251a6c8f05b5"}, + {file = "ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c"}, +] + +[package.dependencies] +mac-alias = ">=2.0.1" + +[package.extras] +dev = ["pre-commit", "tox"] +docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-tldr"] + [[package]] name = "duckduckgo-search" version = "6.1.7" @@ -3000,6 +3006,22 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.7)"] +[[package]] +name = "mac-alias" +version = "2.2.2" +description = "Generate/parse Mac OS Alias records from Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mac_alias-2.2.2-py3-none-any.whl", hash = "sha256:504ab8ac546f35bbd75ad014d6ad977c426660aa721f2cd3acf3dc2f664141bd"}, + {file = "mac_alias-2.2.2.tar.gz", hash = "sha256:c99c728eb512e955c11f1a6203a0ffa8883b26549e8afe68804031aa5da856b7"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-tldr"] + [[package]] name = "markupsafe" version = "2.1.3" @@ -5429,19 +5451,18 @@ tornado = ["tornado (>=5)"] [[package]] name = "setuptools" -version = "69.0.3" +version = "70.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, + {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" @@ -6978,4 +6999,4 @@ benchmark = ["agbenchmark"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "a378031626ad6640c66c53d2b58266d7d464462b69f0b5b5b95c317bd20c6b79" +content-hash = "0f198975b29b94700bd4b0179ebb285f4e12c2c5f408b0adb03916f06a064d15" diff --git a/autogpt/pyproject.toml b/autogpt/pyproject.toml index b5d08fb7b..b78ad9e69 100644 --- a/autogpt/pyproject.toml +++ b/autogpt/pyproject.toml @@ -57,7 +57,7 @@ agbenchmark = { path = "../benchmark", optional = true } # agbenchmark = {git = "https://github.com/Significant-Gravitas/AutoGPT.git", subdirectory = "benchmark", optional = true} psycopg2-binary = "^2.9.9" multidict = "6.0.5" -cx-freeze = "7.0.0" +cx-freeze = { git = "https://github.com/ntindle/cx_Freeze.git", rev = "main", develop = true } [tool.poetry.extras] benchmark = ["agbenchmark"] diff --git a/autogpt/setup.py b/autogpt/setup.py index 5fa328f35..d254a1f26 100644 --- a/autogpt/setup.py +++ b/autogpt/setup.py @@ -1,7 +1,9 @@ +import platform +from pathlib import Path from pkgutil import iter_modules -from shutil import which +from typing import Union -from cx_Freeze import Executable, setup +from cx_Freeze import Executable, setup # type: ignore packages = [ m.name @@ -11,11 +13,47 @@ packages = [ and ("poetry" in m.module_finder.path) # type: ignore ] -icon = ( - "../../assets/gpt_dark_RGB.icns" - if which("sips") - else "../../assets/gpt_dark_RGB.ico" -) +# set the icon based on the platform +icon = "../../assets/gpt_dark_RGB.ico" +if platform.system() == "Darwin": + icon = "../../assets/gpt_dark_RGB.icns" +elif platform.system() == "Linux": + icon = "../../assets/gpt_dark_RGB.png" + + +def txt_to_rtf(input_file: Union[str, Path], output_file: Union[str, Path]) -> None: + """ + Convert a text file to RTF format. + + Args: + input_file (Union[str, Path]): Path to the input text file. + output_file (Union[str, Path]): Path to the output RTF file. + + Returns: + None + """ + input_path = Path(input_file) + output_path = Path(output_file) + + with input_path.open("r", encoding="utf-8") as txt_file: + content = txt_file.read() + + # RTF header + rtf = r"{\rtf1\ansi\deff0 {\fonttbl {\f0 Times New Roman;}}\f0\fs24 " + + # Replace newlines with RTF newline + rtf += content.replace("\n", "\\par ") + + # Close RTF document + rtf += "}" + + with output_path.open("w", encoding="utf-8") as rtf_file: + rtf_file.write(rtf) + + +# Convert LICENSE to LICENSE.rtf +license_file = "LICENSE.rtf" +txt_to_rtf("../LICENSE", license_file) setup( @@ -55,6 +93,7 @@ setup( "target_name": "AutoGPT", "add_to_path": True, "install_icon": "../assets/gpt_dark_RGB.ico", + "license_file": license_file, }, }, ) diff --git a/rnd/autogpt_server/.gitignore b/rnd/autogpt_server/.gitignore index 26452b1c1..7fd0341ba 100644 --- a/rnd/autogpt_server/.gitignore +++ b/rnd/autogpt_server/.gitignore @@ -1,3 +1,6 @@ database.db database.db-journal -build/ \ No newline at end of file +build/ +config.json +secrets/* +!secrets/.gitkeep \ No newline at end of file diff --git a/rnd/autogpt_server/autogpt_server/app.py b/rnd/autogpt_server/autogpt_server/app.py index 298852129..debc26448 100644 --- a/rnd/autogpt_server/autogpt_server/app.py +++ b/rnd/autogpt_server/autogpt_server/app.py @@ -1,9 +1,17 @@ +from multiprocessing import freeze_support, set_start_method from autogpt_server.executor import ExecutionManager, ExecutionScheduler from autogpt_server.server import AgentServer from autogpt_server.util.process import AppProcess from autogpt_server.util.service import PyroNameServer +def get_config_and_secrets(): + from autogpt_server.util.settings import Settings + + settings = Settings() + return settings + + def run_processes(processes: list[AppProcess], **kwargs): """ Execute all processes in the app. The last process is run in the foreground. @@ -19,10 +27,14 @@ def run_processes(processes: list[AppProcess], **kwargs): def main(**kwargs): + settings = get_config_and_secrets() + set_start_method("spawn", force=True) + freeze_support() + run_processes( [ PyroNameServer(), - ExecutionManager(pool_size=5), + ExecutionManager(pool_size=settings.config.num_workers), ExecutionScheduler(), AgentServer(), ], diff --git a/rnd/autogpt_server/autogpt_server/server/server.py b/rnd/autogpt_server/autogpt_server/server/server.py index 40a87c2e7..c41ffbc27 100644 --- a/rnd/autogpt_server/autogpt_server/server/server.py +++ b/rnd/autogpt_server/autogpt_server/server/server.py @@ -1,8 +1,11 @@ +from typing import Annotated, Any, Dict import uuid +from fastapi.responses import JSONResponse +from fastapi.staticfiles import StaticFiles import uvicorn from contextlib import asynccontextmanager -from fastapi import APIRouter, FastAPI, HTTPException +from fastapi import APIRouter, Body, FastAPI, HTTPException from autogpt_server.data import db, execution, block from autogpt_server.data.graph import ( @@ -13,8 +16,10 @@ from autogpt_server.data.graph import ( Link, ) from autogpt_server.executor import ExecutionManager, ExecutionScheduler +from autogpt_server.util.data import get_frontend_path from autogpt_server.util.process import AppProcess from autogpt_server.util.service import get_service_client +from autogpt_server.util.settings import Settings class AgentServer(AppProcess): @@ -84,6 +89,17 @@ class AgentServer(AppProcess): endpoint=self.update_schedule, methods=["PUT"], ) + router.add_api_route( + path="/settings", + endpoint=self.update_configuration, + methods=["POST"], + ) + + app.mount( + path="/frontend", + app=StaticFiles(directory=get_frontend_path(), html=True), + name="example_files", + ) app.include_router(router) uvicorn.run(app, host="0.0.0.0", port=8000) @@ -123,11 +139,12 @@ class AgentServer(AppProcess): try: return self.execution_manager_client.add_execution(graph_id, node_input) except Exception as e: - msg = e.__str__().encode().decode('unicode_escape') + msg = e.__str__().encode().decode("unicode_escape") raise HTTPException(status_code=400, detail=msg) async def get_executions( - self, graph_id: str, run_id: str) -> list[execution.ExecutionResult]: + self, graph_id: str, run_id: str + ) -> list[execution.ExecutionResult]: graph = await get_graph(graph_id) if not graph: raise HTTPException(status_code=404, detail=f"Agent #{graph_id} not found.") @@ -152,3 +169,31 @@ class AgentServer(AppProcess): def get_execution_schedules(self, graph_id: str) -> dict[str, str]: execution_scheduler = self.execution_scheduler_client return execution_scheduler.get_execution_schedules(graph_id) + + def update_configuration( + self, + updated_settings: Annotated[ + Dict[str, Any], Body(examples=[{"config": {"num_workers": 10}}]) + ], + ): + settings = Settings() + try: + updated_fields = {"config": [], "secrets": []} + for key, value in updated_settings.get("config", {}).items(): + if hasattr(settings.config, key): + setattr(settings.config, key, value) + updated_fields["config"].append(key) + for key, value in updated_settings.get("secrets", {}).items(): + if hasattr(settings.secrets, key): + setattr(settings.secrets, key, value) + updated_fields["secrets"].append(key) + settings.save() + return JSONResponse( + content={ + "message": "Settings updated successfully", + "updated_fields": updated_fields, + }, + status_code=200, + ) + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) diff --git a/rnd/autogpt_server/autogpt_server/util/data.py b/rnd/autogpt_server/autogpt_server/util/data.py new file mode 100644 index 000000000..d9659623f --- /dev/null +++ b/rnd/autogpt_server/autogpt_server/util/data.py @@ -0,0 +1,35 @@ +import os +import pathlib +import sys + + +def get_secrets_path() -> pathlib.Path: + return get_data_path() / "secrets" + + +def get_config_path() -> pathlib.Path: + return get_data_path() + + +def get_frontend_path() -> pathlib.Path: + if getattr(sys, "frozen", False): + # The application is frozen + datadir = pathlib.Path(os.path.dirname(sys.executable)) / "example_files" + else: + # The application is not frozen + # Change this bit to match where you store your data files: + filedir = os.path.dirname(__file__) + datadir = pathlib.Path(filedir).parent.parent.parent / "example_files" + return pathlib.Path(datadir) + + +def get_data_path() -> pathlib.Path: + if getattr(sys, "frozen", False): + # The application is frozen + datadir = os.path.dirname(sys.executable) + else: + # The application is not frozen + # Change this bit to match where you store your data files: + filedir = os.path.dirname(__file__) + datadir = pathlib.Path(filedir).parent.parent + return pathlib.Path(datadir) diff --git a/rnd/autogpt_server/autogpt_server/util/process.py b/rnd/autogpt_server/autogpt_server/util/process.py index 88ae38511..764d1f947 100644 --- a/rnd/autogpt_server/autogpt_server/util/process.py +++ b/rnd/autogpt_server/autogpt_server/util/process.py @@ -2,7 +2,6 @@ import os import sys from abc import ABC, abstractmethod from multiprocessing import Process, freeze_support, set_start_method -from multiprocessing.spawn import freeze_support as freeze_support_spawn from typing import Optional @@ -10,10 +9,9 @@ class AppProcess(ABC): """ A class to represent an object that can be executed in a background process. """ + process: Optional[Process] = None - set_start_method('spawn', force=True) - freeze_support() - freeze_support_spawn() + set_start_method("spawn", force=True) @abstractmethod def run(self): diff --git a/rnd/autogpt_server/autogpt_server/util/settings.py b/rnd/autogpt_server/autogpt_server/util/settings.py new file mode 100644 index 000000000..2a60d58ab --- /dev/null +++ b/rnd/autogpt_server/autogpt_server/util/settings.py @@ -0,0 +1,108 @@ +import json +import os +from typing import Any, Dict, Generic, Set, Tuple, Type, TypeVar +from pydantic import BaseModel, Field, PrivateAttr +from pydantic_settings import ( + BaseSettings, + JsonConfigSettingsSource, + PydanticBaseSettingsSource, + SettingsConfigDict, +) + +from autogpt_server.util.data import get_config_path, get_data_path, get_secrets_path + +T = TypeVar("T", bound=BaseSettings) + + +class UpdateTrackingModel(BaseModel, Generic[T]): + _updated_fields: Set[str] = PrivateAttr(default_factory=set) + + def __setattr__(self, name: str, value) -> None: + if name in self.model_fields: + self._updated_fields.add(name) + super().__setattr__(name, value) + + + def mark_updated(self, field_name: str) -> None: + if field_name in self.model_fields: + self._updated_fields.add(field_name) + + def clear_updates(self) -> None: + self._updated_fields.clear() + + def get_updates(self) -> Dict[str, Any]: + return {field: getattr(self, field) for field in self._updated_fields} + + +class Config(UpdateTrackingModel["Config"], BaseSettings): + """Config for the server.""" + + num_workers: int = Field( + default=9, ge=1, le=100, description="Number of workers to use for execution." + ) + # Add more configuration fields as needed + + model_config = SettingsConfigDict( + json_file=[ + get_config_path() / "config.default.json", + get_config_path() / "config.json", + ], + env_file=".env", + env_file_encoding="utf-8", + extra="allow", + ) + + @classmethod + def settings_customise_sources( + cls, + settings_cls: Type[BaseSettings], + init_settings: PydanticBaseSettingsSource, + env_settings: PydanticBaseSettingsSource, + dotenv_settings: PydanticBaseSettingsSource, + file_secret_settings: PydanticBaseSettingsSource, + ) -> Tuple[PydanticBaseSettingsSource, ...]: + return (JsonConfigSettingsSource(settings_cls),) + + +class Secrets(UpdateTrackingModel["Secrets"], BaseSettings): + """Secrets for the server.""" + + database_password: str = "" + # Add more secret fields as needed + + model_config = SettingsConfigDict( + secrets_dir=get_secrets_path(), + env_file=".env", + env_file_encoding="utf-8", + extra="allow", + ) + + +class Settings(BaseModel): + config: Config = Config() + secrets: Secrets = Secrets() + + def save(self) -> None: + # Save updated config to JSON file + if self.config._updated_fields: + config_to_save = self.config.get_updates() + config_path = os.path.join(get_data_path(), "config.json") + if os.path.exists(config_path): + with open(config_path, "r+") as f: + existing_config: Dict[str, Any] = json.load(f) + existing_config.update(config_to_save) + f.seek(0) + json.dump(existing_config, f, indent=2) + f.truncate() + else: + with open(config_path, "w") as f: + json.dump(config_to_save, f, indent=2) + self.config.clear_updates() + + # Save updated secrets to individual files + secrets_dir = get_secrets_path() + for key in self.secrets._updated_fields: + secret_file = os.path.join(secrets_dir, key) + with open(secret_file, "w") as f: + f.write(str(getattr(self.secrets, key))) + self.secrets.clear_updates() diff --git a/rnd/autogpt_server/config.default.json b/rnd/autogpt_server/config.default.json new file mode 100644 index 000000000..cbc8006a2 --- /dev/null +++ b/rnd/autogpt_server/config.default.json @@ -0,0 +1,3 @@ +{ + "num_workers": 5 +} \ No newline at end of file diff --git a/rnd/autogpt_server/poetry.lock b/rnd/autogpt_server/poetry.lock index 50cf787bc..931d89b56 100644 --- a/rnd/autogpt_server/poetry.lock +++ b/rnd/autogpt_server/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "annotated-types" @@ -132,67 +132,33 @@ python-dateutil = "*" pytz = ">2021.1" [[package]] -name = "cx-freeze" -version = "7.0.0" +name = "cx_Freeze" +version = "7.1.1" description = "Create standalone executables from Python scripts" optional = false python-versions = ">=3.8" -files = [ - {file = "cx_Freeze-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:421920dbee2b4aab53a81f6c99d18b00baf622a328eae8e489f162154a46192a"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fa1ca4cf20c6ce45ce2e26bf8b2086525aaaa774e2ee1b16da4e0f9f18c7272"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a520bc6772325c0e38924da1d827fe370702f8df397f483691b94d36179beef6"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b89ed99a2f99fd2f3e28a91c85bdd75b4bfaf11b04729ba3282bfebdadadf880"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5174821c82826e5a57e43960877087f5af6073e3877b0b38a0be244111fe1a76"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cfd18cc00f3240b03d5bdf9515d59ace0881b5b5b6f2e7655d857d1fb71f351d"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bac44e65bdfce0839b9a6d15373ea084fda3cdbd902351cde530991b450c2b2d"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51a374f273d575827efe4f7ed9a88b6cab78abffacb858c829d7cbe4dc4ff56e"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-win32.whl", hash = "sha256:6603e6c47a15bd84bfbb20d92dc01d5e586b54928eb618461d2f14305471d570"}, - {file = "cx_Freeze-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:d7ec847af5afbe3c638a096aae4ff5982a17d95e2fb7975e525ecf9505a185ea"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04b7a2e5c53f5d537f3d958ebf2b0a0a7cbe8daf980cb0087559a3e698abc582"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:50e7e78001d4f78e70a403ecb5507685854ce1e6c3ff37bec1920eb6f2256534"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d37ed560e86ca7958684701a6ae7f3300226d0d7c861ca5b90c78bf4c619ad2"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42145dc5c2c7a98c620b30b7e25661954817a13355c50c4219a4a4954b39db39"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9034d6f9c10d84d7edc0e4f4020e878de367e83c5877c039aa3c8b733bc318"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adc6bdba9ff8705745831620efb6ee5eff9ec6d31d9b8c56d2a61d6555299157"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37a3234c0e54b4afd561b47be4f22a6496f9436275fb7b59d90d7a3269fb4d6f"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83549f9f817cafa59ea2f6e2045c8fe119628458ff14bb732649b01b0a637f6d"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-win32.whl", hash = "sha256:c508cd354728367311a7deb5bb616eee441bf79c900e3129a49fd54a372dc223"}, - {file = "cx_Freeze-7.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:8fb71d23dba27dc40393a8b460bbf64759899246cd595860f66493cee64f27a5"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:648fd0acb439efe22dced2430cbaeca87e5ca9ab315d148933104376cca9553d"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3125a8408da3ff4b0cf767689d678909f840dfe08633f5f2d3cfe333111dc334"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07e56b06c7ca0bd2fc37e3783908767dbe1926e1e2609edcaefcc749ab584329"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25531d5c61bb5e974d8a5d042f29a37a786e91c1d6f66e018fc50342a416f4e1"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f97154b4b60f6e1953ebce05803a5e11a35047d097fad60d7c181303b7c6ef6e"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2333db5cfa6db700c79fd45d614d38e9d698f1df2a3c7e21ccbcc63cc8a7a9b7"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:d45a58e0a9b010e0823c30fb8eb2077560d2bb0f78e4481a55bdb6ad0729f390"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0422dbd426fd9f4f4ec0cadc7e3192d38227464daa3eb215b03eb577cd9a49d4"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-win32.whl", hash = "sha256:2018e9cbf8172da09b311cfc3906503ee6ae88665ec77c543013173b2532b731"}, - {file = "cx_Freeze-7.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae5facd782b220bca6828eb6fb1834540cf431b1a615cc63652641bd070b11e6"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f06368dd41568572818c4abfcf9b45449dced3fa9f1b5f29e3523ba4ff7fcfbb"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e203d90d8fa1cc4489b15edac7dfdd983518a02999f275897160fc0ecfa98e4c"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f800b0bc2df14c66fcf2f220ecf273c5942d0b982268d8e5ccc9ef2fa56e576f"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-win32.whl", hash = "sha256:c52641ce2484222f4d60f0acbc79b2dfbfb984493101a4806c5af0ad379ebc82"}, - {file = "cx_Freeze-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:92a15613be3fcc7a310e825c92ae3e83a7e689ade00ce2ea981403e4317c7234"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:60a0f674b6a55fdf46d0cc59122551a79221ceecd038fed8533dcbceb9714435"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb15314e8395e9658a8a5e4e19558d0e096a68b76c744ba81ebc249061b7dd9e"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3290127acc67e830265265a911d9018640ffffb7fddb86eacb1e3d83ed4136c4"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-win32.whl", hash = "sha256:aa885f2fb29b9f7d9a7d8af223d38d98905484cc2356c474bb1d6fd1704323ad"}, - {file = "cx_Freeze-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:fe4dbbfd52454c8ddb550f112713ee2ac36cc024303557763b605e35cdb6b9a8"}, - {file = "cx_freeze-7.0.0.tar.gz", hash = "sha256:b03f2854a15dd1e8962660d18882a71fefba0e1b6f68337193d4a072d1fc36e6"}, -] +files = [] +develop = true [package.dependencies] -cx-Logging = {version = ">=3.1", markers = "sys_platform == \"win32\""} -filelock = {version = ">=3.11.0", markers = "sys_platform == \"linux\""} +cx_Logging = {version = ">=3.1", markers = "sys_platform == \"win32\""} +dmgbuild = {version = ">=1.6.1", markers = "sys_platform == \"darwin\""} +filelock = {version = ">=3.12.3", markers = "sys_platform == \"linux\""} lief = {version = ">=0.12.0,<0.15.0", markers = "sys_platform == \"win32\""} -patchelf = {version = ">=0.14", markers = "sys_platform == \"linux\" and (platform_machine == \"aarch64\" or platform_machine == \"armv7l\" or platform_machine == \"i686\" or platform_machine == \"ppc64le\" or platform_machine == \"s390x\" or platform_machine == \"x86_64\")"} -setuptools = ">=62.6,<70" +patchelf = {version = ">=0.14", markers = "sys_platform == \"linux\" and (platform_machine == \"x86_64\" or platform_machine == \"i686\" or platform_machine == \"aarch64\" or platform_machine == \"armv7l\" or platform_machine == \"ppc64le\" or platform_machine == \"s390x\")"} +setuptools = ">=65.6.3,<71" wheel = ">=0.42.0,<=0.43.0" [package.extras] -dev = ["bump-my-version (==0.20.1)", "cibuildwheel (==2.17.0)", "pre-commit (==3.7.0)"] -doc = ["furo (==2024.1.29)", "myst-parser (==2.0.0)", "sphinx (==7.3.7)", "sphinx-new-tab-link (==0.4.0)", "sphinx-tabs (==3.4.5)"] -test = ["coverage (==7.4.4)", "pluggy (==1.4.0)", "pytest (==8.1.1)", "pytest-cov (==5.0.0)", "pytest-datafiles (==3.0.0)", "pytest-mock (==3.14.0)", "pytest-timeout (==2.3.1)", "pytest-xdist[psutil] (==3.6.0)"] +dev = ["bump-my-version (==0.24.0)", "cibuildwheel (==2.19.1)", "pre-commit (==3.5.0)", "pre-commit (==3.7.1)"] +doc = ["furo (==2024.5.6)", "myst-parser (==3.0.1)", "sphinx (==7.3.7)", "sphinx-new-tab-link (==0.4.0)", "sphinx-tabs (==3.4.5)"] +test = ["coverage (==7.5.4)", "pluggy (==1.5.0)", "pytest (==8.2.2)", "pytest-cov (==5.0.0)", "pytest-datafiles (==3.0.0)", "pytest-mock (==3.14.0)", "pytest-timeout (==2.3.1)", "pytest-xdist[psutil] (==3.6.1)"] + +[package.source] +type = "git" +url = "https://github.com/ntindle/cx_Freeze.git" +reference = "main" +resolved_reference = "876fe77c97db749b7b0aed93c12142a7226ee7e4" [[package]] name = "cx-logging" @@ -224,6 +190,46 @@ files = [ {file = "cx_Logging-3.2.0.tar.gz", hash = "sha256:bdbad6d2e6a0cc5bef962a34d7aa1232e88ea9f3541d6e2881675b5e7eab5502"}, ] +[[package]] +name = "dmgbuild" +version = "1.6.1" +description = "macOS command line utility to build disk images" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dmgbuild-1.6.1-py3-none-any.whl", hash = "sha256:45dba6af4a64872c6a91eb335ebeaf5e1f4f4f39c89fd77cf40e841bd1226166"}, + {file = "dmgbuild-1.6.1.tar.gz", hash = "sha256:7ced2603d684e29c22b4cd507d1e15a1907e91b86259924b8cfe480d80553b43"}, +] + +[package.dependencies] +ds-store = ">=1.1.0" +mac-alias = ">=2.0.1" + +[package.extras] +badge-icons = ["pyobjc-framework-Quartz (>=3.0.4)"] +dev = ["pre-commit", "tox"] +docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-tldr"] + +[[package]] +name = "ds-store" +version = "1.3.1" +description = "Manipulate Finder .DS_Store files from Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ds_store-1.3.1-py3-none-any.whl", hash = "sha256:fbacbb0bd5193ab3e66e5a47fff63619f15e374ffbec8ae29744251a6c8f05b5"}, + {file = "ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c"}, +] + +[package.dependencies] +mac-alias = ">=2.0.1" + +[package.extras] +dev = ["pre-commit", "tox"] +docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-tldr"] + [[package]] name = "exceptiongroup" version = "1.2.1" @@ -506,6 +512,22 @@ files = [ {file = "lief-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:2db3eb282a35daf51f89c6509226668a08fb6a6d1f507dd549dd9f077585db11"}, ] +[[package]] +name = "mac-alias" +version = "2.2.2" +description = "Generate/parse Mac OS Alias records from Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mac_alias-2.2.2-py3-none-any.whl", hash = "sha256:504ab8ac546f35bbd75ad014d6ad977c426660aa721f2cd3acf3dc2f664141bd"}, + {file = "mac_alias-2.2.2.tar.gz", hash = "sha256:c99c728eb512e955c11f1a6203a0ffa8883b26549e8afe68804031aa5da856b7"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-tldr"] + [[package]] name = "markupsafe" version = "2.1.5" @@ -846,6 +868,25 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.3.4" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.3.4-py3-none-any.whl", hash = "sha256:11ad8bacb68a045f00e4f862c7a718c8a9ec766aa8fd4c32e39a0594b207b53a"}, + {file = "pydantic_settings-2.3.4.tar.gz", hash = "sha256:c5802e3d62b78e82522319bbc9b8f8ffb28ad1c988a99311d04f2a6051fca0a7"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + [[package]] name = "pyflakes" version = "3.2.0" @@ -1631,4 +1672,4 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "17f25b61da5f54bb4bb13cecfedda56d23c097aacb95bb213f13ce63ee08c761" +content-hash = "a243c28b48b60e14513fc18629096a7f9d1c60ae7b05a6c50125c1d4c045033e" diff --git a/rnd/autogpt_server/pyproject.toml b/rnd/autogpt_server/pyproject.toml index 2de400fa7..028a52c45 100644 --- a/rnd/autogpt_server/pyproject.toml +++ b/rnd/autogpt_server/pyproject.toml @@ -25,10 +25,11 @@ tenacity = "^8.3.0" apscheduler = "^3.10.4" croniter = "^2.0.5" pytest-asyncio = "^0.23.7" +pydantic-settings = "^2.3.4" [tool.poetry.group.dev.dependencies] -cx-freeze = "7.0.0" +cx-freeze = { git = "https://github.com/ntindle/cx_Freeze.git", rev = "main", develop = true } poethepoet = "^0.26.1" httpx = "^0.27.0" pytest-watcher = "^0.4.2" @@ -85,4 +86,4 @@ patterns = ["*.py"] ignore_patterns = [] [tool.pytest.ini_options] -asyncio_mode = "auto" \ No newline at end of file +asyncio_mode = "auto" diff --git a/rnd/autogpt_server/secrets/.gitkeep b/rnd/autogpt_server/secrets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/rnd/autogpt_server/setup.py b/rnd/autogpt_server/setup.py index c83cf2f22..690905023 100644 --- a/rnd/autogpt_server/setup.py +++ b/rnd/autogpt_server/setup.py @@ -1,7 +1,9 @@ +import platform +from pathlib import Path from pkgutil import iter_modules -from shutil import which +from typing import Union -from cx_Freeze import Executable, setup +from cx_Freeze import Executable, setup # type: ignore packages = [ m.name @@ -9,13 +11,52 @@ packages = [ if m.ispkg and m.module_finder and "poetry" in m.module_finder.path # type: ignore ] packages.append("collections") +packages.append("autogpt_server.util.service") +packages.append("autogpt_server.executor.manager") +packages.append("autogpt_server.util.service") + +# set the icon based on the platform +icon = "../../assets/gpt_dark_RGB.ico" +if platform.system() == "Darwin": + icon = "../../assets/gpt_dark_RGB.icns" +elif platform.system() == "Linux": + icon = "../../assets/gpt_dark_RGB.png" + + +def txt_to_rtf(input_file: Union[str, Path], output_file: Union[str, Path]) -> None: + """ + Convert a text file to RTF format. + + Args: + input_file (Union[str, Path]): Path to the input text file. + output_file (Union[str, Path]): Path to the output RTF file. + + Returns: + None + """ + input_path = Path(input_file) + output_path = Path(output_file) + + with input_path.open("r", encoding="utf-8") as txt_file: + content = txt_file.read() + + # RTF header + rtf = r"{\rtf1\ansi\deff0 {\fonttbl {\f0 Times New Roman;}}\f0\fs24 " + + # Replace newlines with RTF newline + rtf += content.replace("\n", "\\par ") + + # Close RTF document + rtf += "}" + + with output_path.open("w", encoding="utf-8") as rtf_file: + rtf_file.write(rtf) + + +# Convert LICENSE to LICENSE.rtf +license_file = "LICENSE.rtf" +txt_to_rtf("../../LICENSE", license_file) -# if mac use the icns file, otherwise use the ico file -icon = ( - "../../assets/gpt_dark_RGB.icns" - if which("sips") - else "../../assets/gpt_dark_RGB.ico" -) setup( name="AutoGPT Server", @@ -41,30 +82,48 @@ setup( "packages": packages, "includes": [ "autogpt_server", - "uvicorn.loops.auto", - "uvicorn.protocols.http.auto", - "uvicorn.protocols.websockets.auto", - "uvicorn.lifespan.on", + "prisma", ], # Exclude the two module from readability.compat as it causes issues "excludes": ["readability.compat.two"], + "include_files": [ + # source, destination in the bundle + # (../frontend, example_files) would also work but you'd need to load the frontend differently in the data.py to correctly get the path when frozen + ("../example_files", "example_files"), + ], }, # Mac .app specific options "bdist_mac": { "bundle_name": "AutoGPT", "iconfile": "../../assets/gpt_dark_RGB.icns", - # "include_resources": ["IMG_3775.jpeg"], }, # Mac .dmg specific options "bdist_dmg": { "applications_shortcut": True, "volume_label": "AutoGPTServer", + "background": "builtin-arrow", + + "license": { + "default-language": "en_US", + "licenses": {"en_US": license_file}, + "buttons": { + "en_US": [ + "English", + "Agree", + "Disagree", + "Print", + "Save", + "If you agree, click Agree to continue the installation. If you do not agree, click Disagree to cancel the installation.", + ] + }, + }, }, # Windows .msi specific options "bdist_msi": { "target_name": "AutoGPTServer", "add_to_path": True, "install_icon": "../../assets/gpt_dark_RGB.ico", + "license_file": license_file, }, # Linux .appimage specific options "bdist_appimage": {}, diff --git a/rnd/example_files/index.html b/rnd/example_files/index.html new file mode 100644 index 000000000..0c3c960b1 --- /dev/null +++ b/rnd/example_files/index.html @@ -0,0 +1,19 @@ + + + +
+