diff --git a/.gitignore b/.gitignore index fb6db00..cdb2626 100755 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ frontend/dist frontend/backend dist/ build/ +*.egg-info/ .env.* .DS_Store npm-debug.log* diff --git a/mirix/__init__.py b/mirix/__init__.py index 271ca77..eaa5abd 100755 --- a/mirix/__init__.py +++ b/mirix/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.1.5" +__version__ = "0.2.3" # import clients diff --git a/mirix/queue/message_pb2.py b/mirix/queue/message_pb2.py index 84f68e4..e97e3bf 100644 --- a/mirix/queue/message_pb2.py +++ b/mirix/queue/message_pb2.py @@ -2,7 +2,7 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # NO CHECKED-IN PROTOBUF GENCODE # source: message.proto -# Protobuf Python Version: 6.33.0 +# Protobuf Python Version: 5.29.0 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -11,8 +11,8 @@ from google.protobuf.internal import builder as _builder _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, - 6, - 33, + 5, + 29, 0, '', 'message.proto' diff --git a/poetry.lock b/poetry.lock index 4a0e928..b473546 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -1176,6 +1176,8 @@ files = [ {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f47617f698838ba98f4ff4189aef02e7343952df3a615f847bb575c3feb177a7"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af41be48a4f60429d5cad9d22175217805098a9ef7c40bfef44f7669fb9d74d8"}, {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, @@ -1185,6 +1187,8 @@ files = [ {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5"}, {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, @@ -1194,6 +1198,8 @@ files = [ {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d"}, {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, @@ -1203,6 +1209,8 @@ files = [ {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929"}, {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, @@ -1210,6 +1218,8 @@ files = [ {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269"}, + {file = "greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681"}, {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, @@ -1219,6 +1229,8 @@ files = [ {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28a3c6b7cd72a96f61b0e4b2a36f681025b60ae4779cc73c1535eb5f29560b10"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52206cd642670b0b320a1fd1cbfd95bca0e043179c1d8a045f2c6109dfe973be"}, {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, diff --git a/pyproject.toml b/pyproject.toml index 852d141..b721b20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "mirix" -version = "0.1.5" +version = "0.2.3" description = "Multi-Agent Personal Assistant with an Advanced Memory System" readme = "README.md" license = {text = "Apache License 2.0"} diff --git a/scripts/packaging/build_packages.sh b/scripts/packaging/build_packages.sh index 2c03217..905797f 100755 --- a/scripts/packaging/build_packages.sh +++ b/scripts/packaging/build_packages.sh @@ -9,6 +9,17 @@ BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' # No Color +# Function to restore pyproject.toml on exit +restore_pyproject() { + if [ -f "pyproject.toml.backup" ]; then + echo -e "${BLUE}Restoring pyproject.toml...${NC}" + mv pyproject.toml.backup pyproject.toml + fi +} + +# Set trap to restore pyproject.toml on exit (success or failure) +trap restore_pyproject EXIT + echo -e "${BLUE}=================================================${NC}" echo -e "${BLUE} Mirix Package Build Script${NC}" echo -e "${BLUE}=================================================${NC}" @@ -28,9 +39,23 @@ rm -rf dist/ rm -rf *.egg-info rm -rf mirix_client.egg-info rm -rf mirix_server.egg-info +rm -rf intuit_ecms_client.egg-info +rm -rf intuit_ecms_server.egg-info +rm -rf jl_ecms_client.egg-info +rm -rf jl_ecms_server.egg-info echo -e "${GREEN}✓ Cleaned${NC}" echo "" +# Temporarily rename pyproject.toml to prevent it from overriding setup scripts +echo -e "${BLUE}[1.5/5] Temporarily moving pyproject.toml...${NC}" +if [ -f "pyproject.toml" ]; then + mv pyproject.toml pyproject.toml.backup + echo -e "${GREEN}✓ Moved pyproject.toml${NC}" +else + echo -e "${BLUE} pyproject.toml already moved${NC}" +fi +echo "" + # Install build dependencies echo -e "${BLUE}[2/5] Installing build dependencies...${NC}" pip install --upgrade setuptools wheel twine @@ -38,11 +63,11 @@ echo -e "${GREEN}✓ Build tools ready${NC}" echo "" # Build client package -echo -e "${BLUE}[3/5] Building mirix-client package...${NC}" +echo -e "${BLUE}[3/5] Building jl-ecms-client package...${NC}" python scripts/packaging/setup_client.py sdist bdist_wheel if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Client package built successfully${NC}" - CLIENT_VERSION=$(ls dist/mirix_client-*.whl | head -1 | grep -oP '\d+\.\d+\.\d+') + CLIENT_VERSION=$(ls dist/intuit_ecms_client-*.whl 2>/dev/null | head -1 | sed -E 's/.*-([0-9]+\.[0-9]+\.[0-9]+)-.*/\1/') echo -e " Version: ${GREEN}${CLIENT_VERSION}${NC}" else echo -e "${RED}✗ Client package build failed${NC}" @@ -51,11 +76,11 @@ fi echo "" # Build server package -echo -e "${BLUE}[4/5] Building mirix-server package...${NC}" +echo -e "${BLUE}[4/5] Building jl-ecms-server package...${NC}" python scripts/packaging/setup_server.py sdist bdist_wheel if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Server package built successfully${NC}" - SERVER_VERSION=$(ls dist/mirix_server-*.whl | head -1 | grep -oP '\d+\.\d+\.\d+') + SERVER_VERSION=$(ls dist/intuit_ecms_server-*.whl 2>/dev/null | head -1 | sed -E 's/.*-([0-9]+\.[0-9]+\.[0-9]+)-.*/\1/') echo -e " Version: ${GREEN}${SERVER_VERSION}${NC}" else echo -e "${RED}✗ Server package build failed${NC}" @@ -69,23 +94,30 @@ echo -e "${BLUE}=================================================${NC}" echo -e "Built packages in: ${GREEN}dist/${NC}" echo "" echo -e "Client Package:" -ls -lh dist/mirix_client-* | awk '{print " " $9 " (" $5 ")"}' +ls -lh dist/intuit_ecms_client-* 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' echo "" echo -e "Server Package:" -ls -lh dist/mirix_server-* | awk '{print " " $9 " (" $5 ")"}' +ls -lh dist/intuit_ecms_server-* 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' echo "" echo -e "${BLUE}=================================================${NC}" echo -e "${GREEN}✓ All packages built successfully!${NC}" echo "" echo "To install locally:" -echo -e " ${BLUE}pip install dist/mirix_client-${CLIENT_VERSION}-py3-none-any.whl${NC}" -echo -e " ${BLUE}pip install dist/mirix_server-${SERVER_VERSION}-py3-none-any.whl${NC}" +echo -e " ${BLUE}pip install dist/intuit_ecms_client-${CLIENT_VERSION}-py3-none-any.whl${NC}" +echo -e " ${BLUE}pip install dist/intuit_ecms_server-${SERVER_VERSION}-py3-none-any.whl${NC}" echo "" echo "To publish to PyPI:" -echo -e " ${BLUE}twine upload dist/mirix-client-${CLIENT_VERSION}*${NC}" -echo -e " ${BLUE}twine upload dist/mirix-server-${SERVER_VERSION}*${NC}" +echo -e " ${BLUE}twine upload dist/jl-ecms-client-${CLIENT_VERSION}*${NC}" +echo -e " ${BLUE}twine upload dist/jl-ecms-server-${SERVER_VERSION}*${NC}" echo "" echo "To test packages:" echo -e " ${BLUE}twine check dist/*${NC}" echo "" +# Restore pyproject.toml +if [ -f "pyproject.toml.backup" ]; then + mv pyproject.toml.backup pyproject.toml + echo -e "${GREEN}✓ Restored pyproject.toml${NC}" + echo "" +fi + diff --git a/scripts/packaging/setup_client.py b/scripts/packaging/setup_client.py index 17ca702..673387a 100644 --- a/scripts/packaging/setup_client.py +++ b/scripts/packaging/setup_client.py @@ -12,7 +12,8 @@ """ import os -from setuptools import setup, find_packages + +from setuptools import find_packages, setup # Read the contents of README file this_directory = os.path.abspath(os.path.dirname(__file__)) @@ -43,12 +44,15 @@ def get_version(): "pytz>=2024.1", ] +# Change to project root directory so we can use relative paths +os.chdir(project_root) + setup( - name="mirix-client", + name="jl-ecms-client", version=get_version(), author="Mirix AI", author_email="yuwang@mirix.io", - description="Mirix Client - Lightweight Python client for Mirix AI server", + description="Intuit ECMS Client - Lightweight Python client for Intuit ECMS server", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/Mirix-AI/MIRIX", @@ -65,7 +69,7 @@ def get_version(): "mirix.schemas.openai", "mirix.helpers", ], - package_dir={"": project_root}, + package_dir={"": "."}, include_package_data=True, package_data={ "mirix": [], @@ -100,4 +104,3 @@ def get_version(): license="Apache License 2.0", zip_safe=False, ) - diff --git a/scripts/packaging/setup_server.py b/scripts/packaging/setup_server.py index cb13384..04566c9 100644 --- a/scripts/packaging/setup_server.py +++ b/scripts/packaging/setup_server.py @@ -18,7 +18,8 @@ """ import os -from setuptools import setup, find_packages + +from setuptools import find_packages, setup # Read the contents of README file this_directory = os.path.abspath(os.path.dirname(__file__)) @@ -28,16 +29,21 @@ with open(os.path.join(project_root, "README.md"), encoding="utf-8") as f: long_description = f.read() + # Get version def get_version(): import re + version_file = os.path.join(project_root, "mirix", "__init__.py") with open(version_file, "r", encoding="utf-8") as version_f: - version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_f.read(), re.M) + version_match = re.search( + r"^__version__ = ['\"]([^'\"]*)['\"]", version_f.read(), re.M + ) if version_match: return version_match.group(1) raise RuntimeError("Unable to find version string.") + # Server dependencies (comprehensive) server_dependencies = [ # Core dependencies @@ -48,32 +54,27 @@ def get_version(): "Markdown>=3.5.0", "Pillow>=10.2.0,<11.0.0", "scikit-image>=0.22.0", - # LLM APIs "openai==1.72.0", "tiktoken>=0.5.0", "google-genai>=0.4.0", "anthropic>=0.23.0", "cohere>=4.0.0", - # FastAPI and server "fastapi>=0.104.1", "uvicorn[standard]>=0.31.1", "python-multipart>=0.0.6", "httpx>=0.25.0", "httpx_sse>=0.3.0", - # Database "sqlalchemy>=2.0.0", "psycopg2-binary>=2.9.0", "pg8000>=1.30.0", "pgvector>=0.2.0", "redis>=5.0.0", # Redis client - # Pydantic and validation "pydantic>=2.0.0", "pydantic-settings>=2.0.0", - # Utilities "python-dotenv>=1.0.0", "demjson3>=3.0.0", @@ -90,26 +91,27 @@ def get_version(): "anyio>=4.7.0", "pyyaml>=6.0.0", "requests>=2.31.0", - # LlamaIndex "llama_index>=0.9.0", "llama-index-embeddings-google-genai>=0.1.0", - # Composio and MCP "composio>=0.3.0", "mcp>=0.1.0", - # Google APIs "google-auth>=2.0.0", "google-auth-oauthlib>=1.0.0", "google-auth-httplib2>=0.1.0", "google-api-python-client>=2.0.0", - # Observability "opentelemetry-api>=1.20.0", "opentelemetry-sdk>=1.20.0", "opentelemetry-exporter-otlp>=1.20.0", "opentelemetry-instrumentation-requests>=0.41b0", + # Voice processing + "SpeechRecognition>=3.10.0", + "pydub>=0.25.0", + # Protobuf (for queue message serialization) - compatible with pynumaflow + "protobuf>=3.20,<6.0", ] # Optional dependencies @@ -125,22 +127,17 @@ def get_version(): "ruff>=0.1.0", "pyright>=1.1.0", ], - "voice": [ - "SpeechRecognition>=3.10.0", - "pydub>=0.25.0", - ], - "full": [ - "SpeechRecognition>=3.10.0", - "pydub>=0.25.0", - ], } +# Change to project root directory so we can use relative paths +os.chdir(project_root) + setup( - name="mirix-server", + name="jl-ecms-server", version=get_version(), author="Mirix AI", author_email="yuwang@mirix.io", - description="Mirix Server - Multi-Agent Personal Assistant with Advanced Memory System", + description="Intuit ECMS Server - Multi-Agent Personal Assistant with Advanced Memory System", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/Mirix-AI/MIRIX", @@ -152,10 +149,10 @@ def get_version(): }, # Include all packages packages=find_packages( - where=project_root, - exclude=["tests*", "scripts*", "frontend*", "public_evaluations*", "samples*"] + where=".", + exclude=["tests*", "scripts*", "frontend*", "public_evaluations*", "samples*"], ), - package_dir={"": project_root}, + package_dir={"": "."}, include_package_data=True, package_data={ "mirix": [ @@ -198,4 +195,3 @@ def get_version(): license="Apache License 2.0", zip_safe=False, ) - diff --git a/scripts/start_server.py b/scripts/start_server.py old mode 100644 new mode 100755