diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f6c26977bbb993b180afd759658dcf5ea6619cd0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,194 @@ +木兰宽松许可证,第2版 + +木兰宽松许可证,第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体” 是指提交贡献的机构及其“关联实体”。 + +“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是 +指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可 +以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定 +撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡 +献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软 +件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“ +关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或 +其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权 +行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定 +的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“ +本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对 +任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于 +何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文 +版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3, 请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan +PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. + +Mulan Permissive Software License,Version 2 + +Mulan Permissive Software License,Version 2 (Mulan PSL v2) + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall +be subject to Mulan PSL v2 (this License) with the following terms and +conditions: + +0. Definition + +Software means the program and related documents which are licensed under +this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular +Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its +copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its +Affiliates. + +Affiliates means entities that control, are controlled by, or are under +common control with the acting entity under this License, ‘control’ means +direct or indirect ownership of at least fifty percent (50%) of the voting +power, capital or other securities of controlled or commonly controlled +entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable copyright license to reproduce, use, modify, or distribute its +Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable (except for revocation under this Section) patent license to +make, have made, use, offer for sale, sell, import or otherwise transfer its +Contribution, where such patent license is only limited to the patent claims +owned or controlled by such Contributor now or in future which will be +necessarily infringed by its Contribution alone, or by combination of the +Contribution with the Software to which the Contribution was contributed. +The patent license shall not apply to any modification of the Contribution, +and any other combination which includes the Contribution. If you or your +Affiliates directly or indirectly institute patent litigation (including a +cross claim or counterclaim in a litigation) or other patent enforcement +activities against any individual or entity by alleging that the Software or +any Contribution in it infringes patents, then any patent license granted to +you under this License for the Software shall terminate as of the date such +litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service +marks, or product names of Contributor, except as required to fulfill notice +requirements in section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, +whether in source or executable forms, provided that you provide recipients +with a copy of this License and retain copyright, patent, trademark and +disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR +COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT +LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING +FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO +MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION +AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF +DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION +SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + +How to Apply the Mulan Permissive Software License,Version 2 +(Mulan PSL v2) to Your Software + +To apply the Mulan PSL v2 to your work, for easy identification by +recipients, you are suggested to complete following three steps: + +i. Fill in the blanks in following statement, including insert your software +name, the year of the first publication of your software, and your name +identified as the copyright owner; + +ii. Create a file named "LICENSE" which contains the whole context of this +License in the first directory of your software package; + +iii. Attach the statement to the appropriate annotated syntax at the +beginning of each source file. + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan +PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. diff --git a/euler-copilot-web-0.9.6.tar.gz b/euler-copilot-web-0.9.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2a2968bff5eab873d42701716a1e5224f93a8c88 Binary files /dev/null and b/euler-copilot-web-0.9.6.tar.gz differ diff --git a/euler-copilot-web.spec b/euler-copilot-web.spec new file mode 100644 index 0000000000000000000000000000000000000000..19b00ed63ddd673046f1ba6841717b55ff3e33af --- /dev/null +++ b/euler-copilot-web.spec @@ -0,0 +1,319 @@ +AutoReq: no +%undefine __find_requires +# Be sure buildpolicy set to do nothing +%define __spec_install_post %{nil} +# Something that need for rpm-4.1 +%define _missing_doc_files_terminate_build 0 +# Disable debug package generation +%define debug_package %{nil} + +%ifarch aarch64 +%define _electron_arch arm64 +%define _electron_build_dir linux-arm64-unpacked +%else +%define _electron_arch x64 +%define _electron_build_dir linux-unpacked +%endif + +BuildArch: aarch64 x86_64 +Name: euler-copilot-web +Version: 0.9.6 +Release: 3%{?dist} +License: MulanPSL-2.0 +Summary: openEuler 智能化解决方案 Web 前端 +Source0: %{name}-%{version}.tar.gz +Source1: offline_node_modules-%{_electron_arch}.tar.zst.part0 +Source2: offline_node_modules-%{_electron_arch}.tar.zst.part1 +Source3: offline_node_modules-%{_electron_arch}.tar.zst.part2 +Source4: offline_node_modules-%{_electron_arch}.tar.zst.part3 + +URL: https://gitee.com/openeuler/euler-copilot-web +Vendor: openEuler +Packager: openEuler + +BuildRequires: curl +BuildRequires: zstd + +Requires: nginx + +%description +openEuler 智能化解决方案 Web 前端 + +%package -n euler-copilot-desktop +# Electron 客户端 +Group: Applications/Utilities +Summary: openEuler 智能化解决方案桌面客户端 +Requires: at-spi2-core +Requires: gtk3 +Requires: libXScrnSaver +Requires: libnotify +Requires: nss +Requires: xdg-utils +Requires: (libXtst or libXtst6) +Requires: (libuuid or libuuid1) +Requires(post): /bin/sh +Requires(postun): /bin/sh + +%description -n euler-copilot-desktop +openEuler 智能化解决方案桌面客户端 + + +%prep +%setup -q + + +%build +# Extract Node.js version using grep+sed for compatibility +NODE_VER=$(grep '"node":' package.json | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | head -1) +NODE_LINK="https://mirrors.huaweicloud.com/nodejs/v${NODE_VER}/node-v${NODE_VER}-linux-%{_electron_arch}.tar.xz" +# Download and install Node.js into a subdirectory +NODE_HOME="$PWD/.node-v${NODE_VER}" +mkdir -p "$NODE_HOME" +curl -sSL "$NODE_LINK" | tar -xJ -C "$NODE_HOME" --strip-components=1 +# Set NODE_HOME and update PATH, then test Node.js installation +export NODE_HOME +export PATH="$NODE_HOME/bin:$PATH" +node -v + +# Setup npm mirror +npm config set registry https://mirrors.huaweicloud.com/repository/npm/ + +# Setup mirrors for Electron +export ELECTRON_MIRROR="https://mirrors.huaweicloud.com/electron/" + +# Install pnpm globally +npm install -g pnpm +pnpm -v + +# Download Electron binaries to cache directory +ELECTRON_VER=$(grep -Po '(?<="electron": ")[^"]+' package.json) +PACKAGE_NAME="electron-v$ELECTRON_VER-linux-%{_electron_arch}.zip" +# Electron cache directory +CACHE_DIR="$HOME/.cache/electron" +if [ ! -d "$CACHE_DIR" ]; then + mkdir -p "$CACHE_DIR" +fi +# Only download if not already present +if [ ! -f "$CACHE_DIR/$PACKAGE_NAME" ]; then + curl -sSL "https://mirrors.huaweicloud.com/electron/$ELECTRON_VER/$PACKAGE_NAME" \ + -o "$CACHE_DIR/$PACKAGE_NAME" +fi + +# 合并并解压离线 node_modules +cat %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part0 \ + %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part1 \ + %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part2 \ + %{_sourcedir}/offline_node_modules-%{_electron_arch}.tar.zst.part3 \ + > offline_node_modules-%{_electron_arch}.tar.zst + +if [ -f offline_node_modules-%{_electron_arch}.tar.zst ]; then + zstd -d offline_node_modules-%{_electron_arch}.tar.zst -c | tar -xf - +fi + +# Install pnpm packages +# pnpm install --offline +# Build Electron app +pnpm run package:linux + +# Build Web app +pnpm run build + + +%install + +# Web 主包安装 +mkdir -p %{buildroot}/usr/share/euler-copilot-web +cp -a %{_builddir}/%{name}-%{version}/dist/. %{buildroot}/usr/share/euler-copilot-web/ +chmod -R a+rX %{buildroot}/usr/share/euler-copilot-web + +# nginx 配置安装 +mkdir -p %{buildroot}/etc/nginx/conf.d +cp -a %{_builddir}/%{name}-%{version}/build/linux/nginx.conf.local.tmpl %{buildroot}/etc/nginx/conf.d/euler-copilot-web.conf + +# Electron 客户端安装 +mkdir -p %{buildroot}/opt/Intelligence +mkdir -p %{buildroot}/usr/share/applications +# 创建图标目录 +mkdir -p %{buildroot}/usr/share/icons/hicolor/16x16/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/24x24/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/32x32/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/48x48/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/64x64/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/128x128/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/256x256/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/256x256@2/apps +mkdir -p %{buildroot}/usr/share/icons/hicolor/512x512/apps + +# 复制构件到目标目录 +cp -a %{_builddir}/%{name}-%{version}/release/openeuler-intelligence-%{version}/%{_electron_build_dir}/* %{buildroot}/opt/Intelligence/ +# 拷贝桌面入口文件和图标 +cp -a %{_builddir}/%{name}-%{version}/build/linux/euler-copilot-desktop.desktop %{buildroot}/usr/share/applications/ +cp -a %{_builddir}/%{name}-%{version}/build/icons/16x16.png %{buildroot}/usr/share/icons/hicolor/16x16/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/24x24.png %{buildroot}/usr/share/icons/hicolor/24x24/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/32x32.png %{buildroot}/usr/share/icons/hicolor/32x32/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/48x48.png %{buildroot}/usr/share/icons/hicolor/48x48/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/64x64.png %{buildroot}/usr/share/icons/hicolor/64x64/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/128x128.png %{buildroot}/usr/share/icons/hicolor/128x128/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/256x256.png %{buildroot}/usr/share/icons/hicolor/256x256/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/256x256@2x.png %{buildroot}/usr/share/icons/hicolor/256x256@2/apps/euler-copilot-desktop.png +cp -a %{_builddir}/%{name}-%{version}/build/icons/512x512.png %{buildroot}/usr/share/icons/hicolor/512x512/apps/euler-copilot-desktop.png + + +%files +# Web 主包安装内容 +%dir /usr/share/euler-copilot-web +%dir /usr/share/euler-copilot-web/assets +%attr(0644, root, root) /usr/share/euler-copilot-web/*.* +%attr(0644, root, root) /usr/share/euler-copilot-web/assets/* +%config(noreplace) /etc/nginx/conf.d/euler-copilot-web.conf + + +%files -n euler-copilot-desktop +# 应用安装目录及其所有内容 +%dir /opt/Intelligence +%attr(0755, root, root) /opt/Intelligence/** +# 桌面与图标 +%attr(0644, root, root) /usr/share/applications/euler-copilot-desktop.desktop +%attr(0644, root, root) /usr/share/icons/hicolor/16x16/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/24x24/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/32x32/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/48x48/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/64x64/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/128x128/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/256x256/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/256x256@2/apps/euler-copilot-desktop.png +%attr(0644, root, root) /usr/share/icons/hicolor/512x512/apps/euler-copilot-desktop.png + + +%post +#!/bin/bash +echo "========================================================================" +echo "openEuler Intelligence 前端服务安装完成!" +echo "" +echo "已安装 nginx 配置文件: /etc/nginx/conf.d/euler-copilot-web.conf" +echo "Web 文件安装目录: /usr/share/euler-copilot-web" +echo "" +echo "服务配置信息:" +echo " - Web 服务端口: 8080" +echo " - 访问路径:" +echo " * 主页: http://your-server:8080/" +echo " * 登录页: http://your-server:8080/login" +echo " - API 代理: http://your-server:8080/api/ -> http://127.0.0.1:8002/api/" +echo " - 静态资源: /assets/ (30天缓存)" +echo "" +echo "安全特性: XSS防护、内容类型保护、HSTS、CSP策略已启用" +echo "" +echo "请检查配置文件并手动启动或重启 nginx 服务:" +echo " # systemctl start nginx (首次启动)" +echo " # systemctl restart nginx (重启服务)" +echo " # systemctl enable nginx (开机自启)" +echo "" +echo "注意: 请确保后端 API 服务在 127.0.0.1:8002 端口运行" +echo "========================================================================" + + +%postun +#!/bin/bash +echo "========================================================================" +echo "openEuler Intelligence 前端服务已卸载!" +echo "" +echo "已移除的文件:" +echo " - Web 文件目录: /usr/share/euler-copilot-web" +echo " - nginx 配置文件: /etc/nginx/conf.d/euler-copilot-web.conf" +echo "" +echo "服务影响:" +echo " - Web 服务 (端口 8080) 已停止" +echo " - 如需继续使用 nginx,请手动重启服务:" +echo " # systemctl restart nginx" +echo "" +echo "注意: 若过去已手动安装 nginx,nginx 服务本身未被卸载,仅移除了相关配置" +echo "========================================================================" + + +%post -n euler-copilot-desktop -p /bin/sh +#!/bin/bash + +if type update-alternatives 2>/dev/null >&1; then + # Remove previous link if it doesn't use update-alternatives + if [ -L '/usr/bin/euler-copilot-desktop' -a -e '/usr/bin/euler-copilot-desktop' -a "`readlink '/usr/bin/euler-copilot-desktop'`" != '/etc/alternatives/euler-copilot-desktop' ]; then + rm -f '/usr/bin/euler-copilot-desktop' + fi + update-alternatives --install '/usr/bin/euler-copilot-desktop' 'euler-copilot-desktop' '/opt/Intelligence/euler-copilot-desktop' 100 || ln -sf '/opt/Intelligence/euler-copilot-desktop' '/usr/bin/euler-copilot-desktop' +else + ln -sf '/opt/Intelligence/euler-copilot-desktop' '/usr/bin/euler-copilot-desktop' +fi + +# Check if user namespaces are supported by the kernel and working with a quick test: +if ! { [[ -L /proc/self/ns/user ]] && unshare --user true; }; then + # Use SUID chrome-sandbox only on systems without user namespaces: + chmod 4755 '/opt/Intelligence/chrome-sandbox' || true +else + chmod 0755 '/opt/Intelligence/chrome-sandbox' || true +fi + +if hash update-mime-database 2>/dev/null; then + update-mime-database /usr/share/mime || true +fi + +if hash update-desktop-database 2>/dev/null; then + update-desktop-database /usr/share/applications || true +fi + +# Install apparmor profile. (Ubuntu 24+) +# First check if the version of AppArmor running on the device supports our profile. +# This is in order to keep backwards compatibility with Ubuntu 22.04 which does not support abi/4.0. +# In that case, we just skip installing the profile since the app runs fine without it on 22.04. +# +# Those apparmor_parser flags are akin to performing a dry run of loading a profile. +# https://wiki.debian.org/AppArmor/HowToUse#Dumping_profiles +# +# Unfortunately, at the moment AppArmor doesn't have a good story for backwards compatibility. +# https://askubuntu.com/questions/1517272/writing-a-backwards-compatible-apparmor-profile +if apparmor_status --enabled > /dev/null 2>&1; then + APPARMOR_PROFILE_SOURCE='/opt/Intelligence/resources/apparmor-profile' + APPARMOR_PROFILE_TARGET='/etc/apparmor.d/euler-copilot-desktop' + if apparmor_parser --skip-kernel-load --debug "$APPARMOR_PROFILE_SOURCE" > /dev/null 2>&1; then + cp -f "$APPARMOR_PROFILE_SOURCE" "$APPARMOR_PROFILE_TARGET" + + # Updating the current AppArmor profile is not possible and probably not meaningful in a chroot'ed environment. + # Use cases are for example environments where images for clients are maintained. + # There, AppArmor might correctly be installed, but live updating makes no sense. + if ! { [ -x '/usr/bin/ischroot' ] && /usr/bin/ischroot; } && hash apparmor_parser 2>/dev/null; then + # Extra flags taken from dh_apparmor: + # > By using '-W -T' we ensure that any abstraction updates are also pulled in. + # https://wiki.debian.org/AppArmor/Contribute/FirstTimeProfileImport + apparmor_parser --replace --write-cache --skip-read-cache "$APPARMOR_PROFILE_TARGET" + fi + else + echo "Skipping the installation of the AppArmor profile as this version of AppArmor does not seem to support the bundled profile" + fi +fi + + +%postun -n euler-copilot-desktop -p /bin/sh +#!/bin/bash + +# Delete the link to the binary +if type update-alternatives >/dev/null 2>&1; then + update-alternatives --remove 'euler-copilot-desktop' '/usr/bin/euler-copilot-desktop' +else + rm -f '/usr/bin/euler-copilot-desktop' +fi + +APPARMOR_PROFILE_DEST='/etc/apparmor.d/euler-copilot-desktop' + +# Remove apparmor profile. +if [ -f "$APPARMOR_PROFILE_DEST" ]; then + rm -f "$APPARMOR_PROFILE_DEST" +fi + + +%changelog +* Wed Jun 04 2025 openEuler - 0.9.6-3 +- 修复 GNOME Dock 图标显示问题 + +* Wed Jun 04 2025 openEuler - 0.9.6-2 +- 增加安装后提示信息 + +* Thu Apr 17 2025 openEuler - 0.9.6-1 +- Initial release diff --git a/offline_node_modules-arm64.tar.zst.part0 b/offline_node_modules-arm64.tar.zst.part0 new file mode 100644 index 0000000000000000000000000000000000000000..985fa69690bdefb5db2281a0bf77aad6ad736a79 Binary files /dev/null and b/offline_node_modules-arm64.tar.zst.part0 differ diff --git a/offline_node_modules-arm64.tar.zst.part1 b/offline_node_modules-arm64.tar.zst.part1 new file mode 100644 index 0000000000000000000000000000000000000000..2b1b26e13af48ec7d2589b9337b190a87c890f76 Binary files /dev/null and b/offline_node_modules-arm64.tar.zst.part1 differ diff --git a/offline_node_modules-arm64.tar.zst.part2 b/offline_node_modules-arm64.tar.zst.part2 new file mode 100644 index 0000000000000000000000000000000000000000..dbf5e9e8199296a9e291d1e1705a3c208e26a65a Binary files /dev/null and b/offline_node_modules-arm64.tar.zst.part2 differ diff --git a/offline_node_modules-arm64.tar.zst.part3 b/offline_node_modules-arm64.tar.zst.part3 new file mode 100644 index 0000000000000000000000000000000000000000..2f82c1dbcf683583fbaf66c53b41f0e1b3d9b910 Binary files /dev/null and b/offline_node_modules-arm64.tar.zst.part3 differ diff --git a/offline_node_modules-x64.tar.zst.part0 b/offline_node_modules-x64.tar.zst.part0 new file mode 100644 index 0000000000000000000000000000000000000000..55ca7963df9b7ad15bec93a5a0eec37513f34c30 Binary files /dev/null and b/offline_node_modules-x64.tar.zst.part0 differ diff --git a/offline_node_modules-x64.tar.zst.part1 b/offline_node_modules-x64.tar.zst.part1 new file mode 100644 index 0000000000000000000000000000000000000000..fb02355bb65c4f958360a26d4c9069ae0223f94b Binary files /dev/null and b/offline_node_modules-x64.tar.zst.part1 differ diff --git a/offline_node_modules-x64.tar.zst.part2 b/offline_node_modules-x64.tar.zst.part2 new file mode 100644 index 0000000000000000000000000000000000000000..60dceeeff732f65ae1f89b58fb59e76eeec840ba Binary files /dev/null and b/offline_node_modules-x64.tar.zst.part2 differ diff --git a/offline_node_modules-x64.tar.zst.part3 b/offline_node_modules-x64.tar.zst.part3 new file mode 100644 index 0000000000000000000000000000000000000000..800e10e7854e98f0b70dcbf464c164e0dc028a2a Binary files /dev/null and b/offline_node_modules-x64.tar.zst.part3 differ