diff --git a/.gitignore b/.gitignore index f0705e2a209279548525fad3c965cf7ade727889..0d9ec8e3144572b8413f3b0d3234c5e1c711bba8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,20 @@ .DS_Store Thumbs.db +.idea/ +.vscode/ + +.env +.env.* +!.env.example +!.env.*.example *.log *.pid *.seed *.tmp *.temp +__pycache__/ +*.py[cod] node_modules/ dist/ @@ -25,7 +34,7 @@ tmp-*/ build/ out/ -packages/aios-management-web/server/src/management-runtime/ +packages/daedalus-agent-management-web/server/src/management-runtime/ *.db *.db-shm @@ -48,4 +57,4 @@ docker/integration/.runtime/ tests/e2e/config.json tests/e2e/.runtime/ -.codex/ \ No newline at end of file +.codex/ diff --git a/README.md b/README.md index 6a7fdc4a1f3516932f84af1f434aa8f23329ebca..8fa3f7fb374869419dc50885d8297fe198acd148 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 快速部署手册 +# daedalus-agent 快速部署手册 解决方案由一体化容器和对话应用构成,一体化容器中内置智能体集群构建与管理所需的全部组件,对话应用使用活字格构建,提供实现对话式交互。 @@ -11,11 +11,11 @@ ## 步骤1:启动容器 ```bash -docker volume create aios-data -docker run -d --restart unless-stopped --name aios --cap-add NET_ADMIN -p 3030-3050:3030-3050 -p 1883:1883 -p 9000:9000 -v aios-data:/var/aios crpi-4auaoyyj6r36p6lb.cn-hangzhou.personal.cr.aliyuncs.com/huozige_lab/aios-hzg-x64:[版本号] +docker volume create daedalus-agent-data +docker run -d --restart unless-stopped --name daedalus-agent --cap-add NET_ADMIN -p 3030-3050:3030-3050 -p 1883:1883 -p 9000:9000 -v daedalus-agent-data:/var/daedalus-agent crpi-4auaoyyj6r36p6lb.cn-hangzhou.personal.cr.aliyuncs.com/huozige_lab/daedalus-agent-x64:[版本号] ``` -`[版本号]` 请参考项目 Release,例如 `20260702.01`。运行数据保存在 Docker volume `aios-data` 中;如需隔离多套环境,请替换为新的 volume 名称。详细说明见 [docker/README.md](./docker/README.md)。 +`[版本号]` 请参考项目 Release,例如 `20260702.01`。运行数据保存在 Docker volume `daedalus-agent-data` 中;如需隔离多套环境,请替换为新的 volume 名称。详细说明见 [docker/README.md](./docker/README.md)。 ## 步骤2:登录管理控制台 @@ -29,8 +29,8 @@ http://127.0.0.1:3030 默认账号: -- 用户名:`aios` -- 初始密码:`123456` +- 用户名:`admin` +- 初始密码:`admin` 首次登录后请按提示修改密码。 @@ -81,14 +81,14 @@ Ontology zip 需通过 `huozige-ontology-builder` 构建,[点击阅读使用 ## 步骤6:对接对话应用 -对话应用采用活字格构建,可使用 `https://gitee.com/low-code-dev-lab/aios-cui-hzg`。 +对话应用采用活字格构建,可使用 `https://gitee.com/low-code-dev-lab/daedalus-agent-cui-hzg`。 发布后在应用全局变量中配置: -- `AIOS_SERVER_IP` -- `AIOS_MQTT_CHANNEL_PASSWORD` -- `AIOS_S3_SECRET_ACCESS_KEY` -- `AIOS_MANAGEMENT_CONSOLE_TOKEN` +- `DA_SERVER_IP` +- `DA_MQTT_CHANNEL_PASSWORD` +- `DA_S3_SECRET_ACCESS_KEY` +- `DA_MANAGEMENT_CONSOLE_TOKEN` MQTT/MinIO 密码可在 `系统设置` 页面中 `基础设置` 选项卡获取;管理控制台 Token 在 `访问令牌` 选项卡中创建。 @@ -114,3 +114,9 @@ MQTT/MinIO 密码可在 `系统设置` 页面中 `基础设置` 选项卡获取 | 20 | 通过 | 986/986 | 0 | 1.64 | 11.857s | 17.119s | 21.945s | 202.39% | 1.66GiB | | 50 | 通过 | 1000/1000 | 0 | 1.67 | 28.185s | 40.100s | 58.307s | 199.70% | 2.05GiB | | 100 | 通过 | 998/998 | 0 | 1.66 | 56.599s | 74.609s | 93.801s | 180.19% | 2.13GiB | + +## 本地开发文件 + +本地 `.env`、`.env.*`、测试运行配置、运行状态、报告和常见构建缓存均不应提交到版本库。仓库允许提交 `.env.example` 和 `.env.*.example` 作为脱敏模板;真实 API Key、MQTT/S3 凭据和访问令牌只能写入被 `.gitignore` 覆盖的本地文件或仓库外临时配置。 + +集成与压测的本地配置及运行文件约定见 [test/README.md](./test/README.md),Docker 构建与测试说明见 [docker/BUILD.md](./docker/BUILD.md)。 diff --git a/docker/BUILD.md b/docker/BUILD.md index 60f4cb26d5788cf2b2cdd045f8cf52da3c430074..4fca08e468edfe629d00cc193e01f8157b25b920 100644 --- a/docker/BUILD.md +++ b/docker/BUILD.md @@ -2,15 +2,16 @@ `docker/` 是唯一保留的 Docker 构建入口。仓库不再提供独立的 kernel/apps Dockerfile,也不再需要先构建子镜像。 -构建过程中只复制 Docker 启动脚本、运行模板和离线二进制资源。核心运行逻辑和站点包通过版本化安装获取: +构建过程中会直接使用当前仓库内的 DAEDALUS_AGENT 源码,并通过版本化安装获取第三方工具: -- `openclaw`、`clawhub`、`@tobilu/qmd`、`mcporter`、`agent-browser`、`aios-apps-invoke-cli` 通过 npm 安装。 -- `aios-management-web` 通过 npm 安装,并把包内 `dist`、`server`、`scripts` 放入镜像。 -- OpenClaw 插件和全局 skills 通过 `openclaw plugins install` / `openclaw skills install` 从 npm/clawhub 安装。 +- `daedalus-agent-apps-invoke-cli` 和 `daedalus-agent-mqtt-channel` 从当前仓库源码构建、打包并安装。 +- `daedalus-agent-management-web` 从当前仓库源码构建,并把 `dist`、`server`、`scripts` 放入镜像。 +- `daedalus-agent-call-app-service`、`daedalus-agent-transfer-file`、`daedalus-agent-make-chart-image`、`daedalus-agent-self-improving-agent` 从当前仓库复制;其余全局 skills 仍通过 ClawHub 安装。 +- `openclaw`、`clawhub`、`@tobilu/qmd`、`mcporter`、`agent-browser` 等第三方工具通过 npm 安装。 Docker 资产统一放在 `docker/assets`;`docker/internal` 只保留构建脚本和离线 vendor 资源。 -`tool-builder` 阶段会优先使用 `docker/internal/kernel/vendor/npm` 中匹配包名和版本的本地 `.tgz`。例如可用 `npm pack openclaw@2026.6.10 --pack-destination docker/internal/kernel/vendor/npm` 预先放入本地包;未命中时才从 `AIOS_BUILD_NPM_REGISTRY` 下载。 +`tool-builder` 阶段会优先使用 `docker/internal/kernel/vendor/npm` 中匹配包名和版本的本地 `.tgz`。例如可用 `npm pack openclaw@2026.7.1 --pack-destination docker/internal/kernel/vendor/npm` 预先放入本地包;未命中时才从 `DA_BUILD_NPM_REGISTRY` 下载。 ## 推荐脚本 @@ -26,6 +27,26 @@ X64: powershell -ExecutionPolicy Bypass -File .\docker\build-x64.ps1 ``` +Linux X64(自动下载缺失的 vendor 文件后构建): + +```bash +chmod +x docker/build-x64.sh +docker/build-x64.sh +``` + +该脚本的下载步骤也在临时 Docker 容器中执行,因此宿主机无需安装 Node.js、npm 或 curl。已存在的 vendor 文件会被跳过,可安全地重复运行。常用参数: + +```bash +docker/build-x64.sh --version 20260601.01 --pull +docker/build-x64.sh --image-name registry.example.com/daedalus-agent --image-tag 20260601.01 +``` + +如果 npm 包来自需要认证的 registry,可通过环境变量传入令牌: + +```bash +NODE_AUTH_TOKEN=*** docker/build-x64.sh --npm-registry https://registry.example.com +``` + 两个脚本默认使用 `local` tag,也支持指定版本: ```bash @@ -41,7 +62,7 @@ powershell -ExecutionPolicy Bypass -File .\docker\build-x64.ps1 -Version 2026060 ```bash docker build \ -f docker/Dockerfile \ - -t aios-arm64:local \ + -t daedalus-agent-arm64:local \ --platform linux/arm64 \ --build-arg TARGETARCH=arm64 \ . @@ -50,7 +71,7 @@ docker build \ ```powershell docker build ` -f .\docker\Dockerfile ` - -t aios-x64:local ` + -t daedalus-agent-x64:local ` --platform linux/amd64 ` --build-arg TARGETARCH=amd64 ` . @@ -60,6 +81,12 @@ docker build ` ## 测试 +OpenClaw 版本、Node 版本、迁移顺序、插件所有权和防重启风暴契约: + +```bash +npm --prefix test run test:upgrade-contract +``` + Docker 容器测试放在根目录 `test`,目录按职责拆分为 `common/`、`prepare/`、`case/`、`suite/`。常规入口优先使用 suite: ```powershell @@ -86,7 +113,7 @@ cp test/integration/config.integration.sample.json test/integration/config.integ cp test/stress/config.stress.sample.json test/stress/config.stress.json ``` -`test/integration/config.integration.json` 和 `test/stress/config.stress.json` 已被 `.gitignore` 忽略;仓库只提交对应的 sample 文件。模型配置放在 `llm` 节点中,例如 `llm.key`、`llm.url`、`llm.model`、`llm.modelName`;镜像配置放在 `image` 节点中,例如 `image.skipBuild`、`image.imageTag`;容器配置放在 `container` 节点中,例如 `container.skipRun`、`container.skipCleanup`、`container.containerName`。 +`test/integration/config.integration.json`、`test/stress/config.stress.json`、对应的 `run-state*.json` 和 `test/.runtime/` 已被 `.gitignore` 忽略;仓库只提交对应的 sample 或 suite 公共配置。真实密钥只能写入这些本地文件或仓库外的私有配置,不得写入 suite 公共配置。根规则也会忽略 `.env`、`.env.*`、Python 缓存和 IDE 本地配置,同时允许提交脱敏的 `.env.example`、`.env.*.example` 模板。模型配置放在 `llm` 节点中,例如 `llm.key`、`llm.url`、`llm.model`、`llm.modelName`;镜像配置放在 `image` 节点中,例如 `image.skipBuild`、`image.imageTag`;容器配置放在 `container` 节点中,例如 `container.skipRun`、`container.skipCleanup`、`container.containerName`。 `image.imageTag` 为空时脚本会按当前架构构建默认本地镜像;填入已有镜像 tag 或 image id 时,脚本会跳过构建并直接用该镜像创建新容器。`container.containerName` 为空时默认使用 `container-HHmm`。`container.skipRun` 为 `true` 时复用已有容器,不执行 `docker run`;`container.skipCleanup` 为 `true` 时测试结束后保留容器和运行数据。`storage.mode` 默认 `volume`,`storage.volumeName` 可指定 Docker volume 名称;如需临时回退本地目录映射,可设为 `bind`。集成测试写入 `test/integration/run-state.integration.json`,压测写入 `test/stress/run-state.stress.json`。 diff --git a/docker/Dockerfile b/docker/Dockerfile index 959c76676dd2d87cbf4331d470205bca7499b17b..dae418001f59b39496efd126d837bf8f0239fa40 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,60 +1,96 @@ # syntax=docker/dockerfile:1.7 -ARG OPENCLAW_VERSION=2026.6.10 +ARG OPENCLAW_VERSION=2026.7.1 +ARG NODE_VERSION=24.18.0 ARG AEDES_VERSION=1.1.0 -ARG AIOS_APPS_INVOKE_CLI_VERSION=1.0.3 -ARG AIOS_MANAGEMENT_WEB_NPM_VERSION=1.0.17 -ARG AIOS_BUILD_NPM_REGISTRY=https://registry.npmjs.org +ARG DA_BUILD_NPM_REGISTRY=https://registry.npmjs.org -FROM node:24-bookworm-slim AS runtime-base +FROM node:${NODE_VERSION}-bookworm-slim AS npm-builder-base + +COPY docker/internal/kernel/build-scripts/npm-ci-with-retry.sh /usr/local/bin/npm-ci-with-retry +RUN chmod +x /usr/local/bin/npm-ci-with-retry + +FROM npm-builder-base AS local-package-builder + +ARG DA_BUILD_NPM_REGISTRY=https://registry.npmjs.org + +WORKDIR /src/daedalus-agent-apps-invoke-cli +COPY packages/daedalus-agent-apps-invoke-cli/package.json packages/daedalus-agent-apps-invoke-cli/package-lock.json ./ +RUN --mount=type=cache,target=/root/.npm,sharing=locked \ + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm-ci-with-retry --ignore-scripts +COPY packages/daedalus-agent-apps-invoke-cli/README.md packages/daedalus-agent-apps-invoke-cli/tsconfig.json packages/daedalus-agent-apps-invoke-cli/tsconfig.build.json ./ +COPY packages/daedalus-agent-apps-invoke-cli/src ./src +RUN set -eux; \ + npm run build; \ + mkdir -p /build/npm; \ + npm pack --ignore-scripts --pack-destination /build/npm; \ + mv /build/npm/daedalus-agent-apps-invoke-cli-*.tgz /build/npm/daedalus-agent-apps-invoke-cli.tgz; \ + node -p 'require("./package.json").version' > /build/npm/daedalus-agent-apps-invoke-cli.version + +WORKDIR /src/daedalus-agent-mqtt-channel +COPY extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package.json extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package-lock.json ./ +RUN --mount=type=cache,target=/root/.npm,sharing=locked \ + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm-ci-with-retry --foreground-scripts +COPY extensions/openclaw-plugins/daedalus-agent-mqtt-channel/tsconfig.json ./ +COPY extensions/openclaw-plugins/daedalus-agent-mqtt-channel/*.ts ./ +COPY extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src ./src +COPY extensions/openclaw-plugins/daedalus-agent-mqtt-channel/openclaw.plugin.json extensions/openclaw-plugins/daedalus-agent-mqtt-channel/README.md extensions/openclaw-plugins/daedalus-agent-mqtt-channel/CHANGELOG.md extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.env.example extensions/openclaw-plugins/daedalus-agent-mqtt-channel/config.example.json ./ +RUN set -eux; \ + npm run build; \ + npm pack --ignore-scripts --pack-destination /build/npm; \ + mv /build/npm/daedalus-agent-mqtt-channel-*.tgz /build/npm/daedalus-agent-mqtt-channel.tgz + +FROM node:${NODE_VERSION}-bookworm-slim AS runtime-base ARG TARGETARCH ARG UV_VERSION=0.11.24 ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Asia/Shanghai -ENV AIOS_ROOT=/var/aios -ENV AIOS_TOOLCHAIN_DIR=/opt/aios-toolchain -ENV AIOS_SHARED_GROUP=aios -ENV AIOS_SERVICE_USER=aios-svc -ENV AIOS_SERVICE_GROUP=aios-svc -ENV AIOS_OPENCLAW_USER=aios-agent -ENV AIOS_OPENCLAW_GROUP=aios -ENV AIOS_RUN_MODE=container -ENV AIOS_DATA_DIR=/var/aios/startup-state/data -ENV AIOS_ONTOLOGY_DIR=/var/aios/ontology -ENV AIOS_OPENCLAW_HOME=/var/aios/.openclaw -ENV AIOS_OPENCLAW_WORKSPACE_DIR=/var/aios/.openclaw/workspaces/default -ENV AIOS_WORKSPACE_TEMPLATES_DIR=/var/aios/workspace-templates -ENV AIOS_TMP_DIR=/var/aios/.openclaw/tmp -ENV NPM_CONFIG_PREFIX=/var/aios/.openclaw/packages/npm -ENV NPM_CONFIG_CACHE=/var/aios/.openclaw/packages/npm/cache +ENV DA_ROOT=/var/daedalus-agent +ENV DA_TOOLCHAIN_DIR=/opt/daedalus-agent-toolchain +ENV DA_SHARED_GROUP=daedalus-agent +ENV DA_SERVICE_USER=daedalus-svc +ENV DA_SERVICE_GROUP=daedalus-svc +ENV DA_OPENCLAW_USER=daedalus-agent +ENV DA_OPENCLAW_GROUP=daedalus-agent +ENV DA_RUN_MODE=container +ENV DA_DATA_DIR=/var/daedalus-agent/startup-state/data +ENV DA_ONTOLOGY_DIR=/var/daedalus-agent/ontology +ENV DA_OPENCLAW_HOME=/var/daedalus-agent/.openclaw +ENV DA_OPENCLAW_WORKSPACE_DIR=/var/daedalus-agent/.openclaw/workspaces/default +ENV DA_WORKSPACE_TEMPLATES_DIR=/var/daedalus-agent/workspace-templates +ENV DA_TMP_DIR=/var/daedalus-agent/.openclaw/tmp +ENV NPM_CONFIG_PREFIX=/var/daedalus-agent/.openclaw/packages/npm +ENV NPM_CONFIG_CACHE=/var/daedalus-agent/.openclaw/packages/npm/cache ENV NPM_CONFIG_REGISTRY=https://registry.npmmirror.com ENV NPM_CONFIG_UPDATE_NOTIFIER=false ENV NPM_CONFIG_FUND=false ENV NPM_CONFIG_AUDIT=false -ENV UV_PACKAGE_ROOT=/var/aios/.openclaw/packages/uv -ENV UV_TOOL_DIR=/var/aios/.openclaw/packages/uv/tools -ENV UV_TOOL_BIN_DIR=/var/aios/.openclaw/packages/uv/bin -ENV UV_CACHE_DIR=/var/aios/.openclaw/packages/uv/cache +ENV UV_PACKAGE_ROOT=/var/daedalus-agent/.openclaw/packages/uv +ENV UV_TOOL_DIR=/var/daedalus-agent/.openclaw/packages/uv/tools +ENV UV_TOOL_BIN_DIR=/var/daedalus-agent/.openclaw/packages/uv/bin +ENV UV_CACHE_DIR=/var/daedalus-agent/.openclaw/packages/uv/cache ENV UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple ENV UV_LINK_MODE=copy -ENV PIP_PACKAGE_ROOT=/var/aios/.openclaw/packages/pip -ENV PIP_CACHE_DIR=/var/aios/.openclaw/packages/pip/cache +ENV PIP_PACKAGE_ROOT=/var/daedalus-agent/.openclaw/packages/pip +ENV PIP_CACHE_DIR=/var/daedalus-agent/.openclaw/packages/pip/cache ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple -ENV VIRTUAL_ENV=/var/aios/.openclaw/packages/pip/venv -ENV XDG_CONFIG_HOME=/var/aios/.openclaw/.config -ENV XDG_CACHE_HOME=/var/aios/.openclaw/cache -ENV PATH=/var/aios/.openclaw/packages/npm/bin:/var/aios/.openclaw/packages/pip/venv/bin:/var/aios/.openclaw/packages/uv/bin:/opt/aios-toolchain/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV VIRTUAL_ENV=/var/daedalus-agent/.openclaw/packages/pip/venv +ENV XDG_CONFIG_HOME=/var/daedalus-agent/.openclaw/.config +ENV XDG_CACHE_HOME=/var/daedalus-agent/.openclaw/cache +ENV PATH=/var/daedalus-agent/.openclaw/packages/npm/bin:/var/daedalus-agent/.openclaw/packages/pip/venv/bin:/var/daedalus-agent/.openclaw/packages/uv/bin:/opt/daedalus-agent-toolchain/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV EXIFTOOL_PATH=/usr/bin/exiftool ENV FFMPEG_PATH=/usr/bin/ffmpeg ENV FFPROBE_PATH=/usr/bin/ffprobe ENV AGENT_BROWSER_EXECUTABLE_PATH= -ENV OPENCLAW_COMMAND=/opt/aios-toolchain/bin/openclaw -ENV QMD_COMMAND=/opt/aios-toolchain/bin/qmd -ENV QMD_EMBED_MODEL=/opt/aios-vendor/qmd-models/embeddinggemma-300M-Q8_0.gguf -ENV QMD_RERANK_MODEL=/opt/aios-vendor/qmd-models/qwen3-reranker-0.6b-q8_0.gguf -ENV QMD_GENERATE_MODEL=/opt/aios-vendor/qmd-models/qmd-query-expansion-1.7B-q4_k_m.gguf +ENV OPENCLAW_COMMAND=/opt/daedalus-agent-toolchain/bin/openclaw +ENV OPENCLAW_NO_RESPAWN=1 +ENV NODE_COMPILE_CACHE=/var/daedalus-agent/.openclaw/cache/node-compile +ENV QMD_COMMAND=/opt/daedalus-agent-toolchain/bin/qmd +ENV QMD_EMBED_MODEL=/opt/daedalus-agent-vendor/qmd-models/embeddinggemma-300M-Q8_0.gguf +ENV QMD_RERANK_MODEL=/opt/daedalus-agent-vendor/qmd-models/qwen3-reranker-0.6b-q8_0.gguf +ENV QMD_GENERATE_MODEL=/opt/daedalus-agent-vendor/qmd-models/qmd-query-expansion-1.7B-q4_k_m.gguf SHELL ["/bin/bash", "-o", "pipefail", "-c"] @@ -121,11 +157,11 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ echo Asia/Shanghai > /etc/timezone RUN set -eux; \ - mkdir -p "${AIOS_TOOLCHAIN_DIR}/bin"; \ - python3 -m venv "${AIOS_TOOLCHAIN_DIR}/python"; \ - "${AIOS_TOOLCHAIN_DIR}/python/bin/pip" install --no-cache-dir "uv==${UV_VERSION}"; \ - ln -sf "${AIOS_TOOLCHAIN_DIR}/python/bin/uv" "${AIOS_TOOLCHAIN_DIR}/bin/uv"; \ - ln -sf "${AIOS_TOOLCHAIN_DIR}/python/bin/uvx" "${AIOS_TOOLCHAIN_DIR}/bin/uvx.real"; \ + mkdir -p "${DA_TOOLCHAIN_DIR}/bin"; \ + python3 -m venv "${DA_TOOLCHAIN_DIR}/python"; \ + "${DA_TOOLCHAIN_DIR}/python/bin/pip" install --no-cache-dir "uv==${UV_VERSION}"; \ + ln -sf "${DA_TOOLCHAIN_DIR}/python/bin/uv" "${DA_TOOLCHAIN_DIR}/bin/uv"; \ + ln -sf "${DA_TOOLCHAIN_DIR}/python/bin/uvx" "${DA_TOOLCHAIN_DIR}/bin/uvx.real"; \ printf '%s\n' \ '#!/usr/bin/env bash' \ 'set -euo pipefail' \ @@ -136,12 +172,12 @@ RUN set -eux; \ ' exec markitdown "$@"' \ ' fi' \ '' \ - ' if [[ -n "${AIOS_BUILTIN_UV_TOOL_BIN_DIR:-}" && -x "${AIOS_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" ]]; then' \ - ' exec "${AIOS_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" "$@"' \ + ' if [[ -n "${DA_BUILTIN_UV_TOOL_BIN_DIR:-}" && -x "${DA_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" ]]; then' \ + ' exec "${DA_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" "$@"' \ ' fi' \ '' \ - ' if [[ -x /opt/aios-seed/uv-package/bin/markitdown ]]; then' \ - ' exec /opt/aios-seed/uv-package/bin/markitdown "$@"' \ + ' if [[ -x /opt/daedalus-agent-seed/uv-package/bin/markitdown ]]; then' \ + ' exec /opt/daedalus-agent-seed/uv-package/bin/markitdown "$@"' \ ' fi' \ 'fi' \ '' \ @@ -151,28 +187,28 @@ RUN set -eux; \ ' exec markitdown "$@"' \ ' fi' \ '' \ - ' if [[ -n "${AIOS_BUILTIN_UV_TOOL_BIN_DIR:-}" && -x "${AIOS_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" ]]; then' \ - ' exec "${AIOS_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" "$@"' \ + ' if [[ -n "${DA_BUILTIN_UV_TOOL_BIN_DIR:-}" && -x "${DA_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" ]]; then' \ + ' exec "${DA_BUILTIN_UV_TOOL_BIN_DIR}/markitdown" "$@"' \ ' fi' \ '' \ - ' if [[ -x /opt/aios-seed/uv-package/bin/markitdown ]]; then' \ - ' exec /opt/aios-seed/uv-package/bin/markitdown "$@"' \ + ' if [[ -x /opt/daedalus-agent-seed/uv-package/bin/markitdown ]]; then' \ + ' exec /opt/daedalus-agent-seed/uv-package/bin/markitdown "$@"' \ ' fi' \ 'fi' \ '' \ - 'exec /opt/aios-toolchain/python/bin/uvx "$@"' \ - > "${AIOS_TOOLCHAIN_DIR}/bin/uvx"; \ - chmod +x "${AIOS_TOOLCHAIN_DIR}/bin/uvx" + 'exec /opt/daedalus-agent-toolchain/python/bin/uvx "$@"' \ + > "${DA_TOOLCHAIN_DIR}/bin/uvx"; \ + chmod +x "${DA_TOOLCHAIN_DIR}/bin/uvx" RUN set -eux; \ - groupadd --system "${AIOS_SHARED_GROUP}"; \ - groupadd --system "${AIOS_SERVICE_GROUP}"; \ - useradd --system --gid "${AIOS_SERVICE_GROUP}" --groups "${AIOS_SHARED_GROUP}" --home-dir "${AIOS_ROOT}/management" --no-create-home --shell /bin/bash "${AIOS_SERVICE_USER}"; \ - useradd --system --gid "${AIOS_OPENCLAW_GROUP}" --home-dir "${AIOS_OPENCLAW_HOME}" --no-create-home --shell /bin/bash "${AIOS_OPENCLAW_USER}"; \ - mkdir -p "${AIOS_ROOT}/logs" "${AIOS_OPENCLAW_HOME}/logs"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${AIOS_ROOT}" "${AIOS_ROOT}/logs" "${AIOS_OPENCLAW_HOME}" "${AIOS_OPENCLAW_HOME}/logs"; \ - chmod 2750 "${AIOS_ROOT}"; \ - chmod 2770 "${AIOS_ROOT}/logs" "${AIOS_OPENCLAW_HOME}" "${AIOS_OPENCLAW_HOME}/logs" + groupadd --system "${DA_SHARED_GROUP}"; \ + groupadd --system "${DA_SERVICE_GROUP}"; \ + useradd --system --gid "${DA_SERVICE_GROUP}" --groups "${DA_SHARED_GROUP}" --home-dir "${DA_ROOT}/management" --no-create-home --shell /bin/bash "${DA_SERVICE_USER}"; \ + useradd --system --gid "${DA_OPENCLAW_GROUP}" --home-dir "${DA_OPENCLAW_HOME}" --no-create-home --shell /bin/bash "${DA_OPENCLAW_USER}"; \ + mkdir -p "${DA_ROOT}/logs" "${DA_OPENCLAW_HOME}/logs"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${DA_ROOT}" "${DA_ROOT}/logs" "${DA_OPENCLAW_HOME}" "${DA_OPENCLAW_HOME}/logs"; \ + chmod 2750 "${DA_ROOT}"; \ + chmod 2770 "${DA_ROOT}/logs" "${DA_OPENCLAW_HOME}" "${DA_OPENCLAW_HOME}/logs" FROM runtime-base AS tool-builder @@ -182,11 +218,10 @@ ARG CLAWHUB_VERSION=0.23.0 ARG QMD_VERSION=2.5.3 ARG AGENT_BROWSER_VERSION=0.31.0 ARG MCPORTER_VERSION=0.12.0 -ARG AIOS_APPS_INVOKE_CLI_VERSION -ARG AIOS_BUILD_NPM_REGISTRY=https://registry.npmjs.org -ARG AIOS_CLAWHUB_FETCH_TIMEOUT_MS=300000 +ARG DA_BUILD_NPM_REGISTRY=https://registry.npmjs.org +ARG DA_CLAWHUB_FETCH_TIMEOUT_MS=300000 -RUN mkdir -p "${AIOS_TOOLCHAIN_DIR}" +RUN mkdir -p "${DA_TOOLCHAIN_DIR}" RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \ @@ -197,94 +232,95 @@ COPY docker/internal/kernel/build-scripts/install-versioned-npm-global.sh /usr/l COPY docker/internal/kernel/build-scripts/patch-clawhub-timeouts.cjs /usr/local/bin/patch-clawhub-timeouts RUN chmod +x /usr/local/bin/install-versioned-npm-global /usr/local/bin/patch-clawhub-timeouts -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/daedalus-agent-vendor-src,readonly \ --mount=type=cache,target=/root/.npm,sharing=locked \ - --mount=type=cache,target=/opt/aios-build-cache/npm-tools,sharing=locked \ + --mount=type=cache,target=/opt/daedalus-agent-build-cache/npm-tools,sharing=locked \ install-versioned-npm-global "openclaw" "${OPENCLAW_VERSION}" RUN set -eux; \ - mv "${AIOS_TOOLCHAIN_DIR}/bin/openclaw" "${AIOS_TOOLCHAIN_DIR}/bin/openclaw.real"; \ + mv "${DA_TOOLCHAIN_DIR}/bin/openclaw" "${DA_TOOLCHAIN_DIR}/bin/openclaw.real"; \ printf '%s\n' \ '#!/usr/bin/env bash' \ 'set -euo pipefail' \ - 'preload="${AIOS_OPENCLAW_SHARED_FS_PRELOAD:-/opt/aios-assets/scripts/openclaw-shared-fs-defaults.cjs}"' \ + 'preload="${DA_OPENCLAW_SHARED_FS_PRELOAD:-/opt/daedalus-agent-assets/scripts/openclaw-shared-fs-defaults.cjs}"' \ 'if [[ -f "${preload}" ]]; then' \ ' case " ${NODE_OPTIONS:-} " in' \ ' *" --require ${preload} "*|*" --require=${preload} "*) ;;' \ ' *) export NODE_OPTIONS="--require ${preload}${NODE_OPTIONS:+ ${NODE_OPTIONS}}" ;;' \ ' esac' \ 'fi' \ - 'exec /opt/aios-toolchain/bin/openclaw.real "$@"' \ - > "${AIOS_TOOLCHAIN_DIR}/bin/openclaw"; \ - chmod +x "${AIOS_TOOLCHAIN_DIR}/bin/openclaw" + 'exec /opt/daedalus-agent-toolchain/bin/openclaw.real "$@"' \ + > "${DA_TOOLCHAIN_DIR}/bin/openclaw"; \ + chmod +x "${DA_TOOLCHAIN_DIR}/bin/openclaw" -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/daedalus-agent-vendor-src,readonly \ --mount=type=cache,target=/root/.npm,sharing=locked \ - --mount=type=cache,target=/opt/aios-build-cache/npm-tools,sharing=locked \ + --mount=type=cache,target=/opt/daedalus-agent-build-cache/npm-tools,sharing=locked \ install-versioned-npm-global "clawhub" "${CLAWHUB_VERSION}" -RUN OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS="${AIOS_CLAWHUB_FETCH_TIMEOUT_MS}" \ - CLAWHUB_REQUEST_TIMEOUT_MS="${AIOS_CLAWHUB_FETCH_TIMEOUT_MS}" \ +RUN OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS="${DA_CLAWHUB_FETCH_TIMEOUT_MS}" \ + CLAWHUB_REQUEST_TIMEOUT_MS="${DA_CLAWHUB_FETCH_TIMEOUT_MS}" \ node /usr/local/bin/patch-clawhub-timeouts -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/daedalus-agent-vendor-src,readonly \ --mount=type=cache,target=/root/.npm,sharing=locked \ - --mount=type=cache,target=/opt/aios-build-cache/npm-tools,sharing=locked \ + --mount=type=cache,target=/opt/daedalus-agent-build-cache/npm-tools,sharing=locked \ install-versioned-npm-global "@tobilu/qmd" "${QMD_VERSION}" -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,from=local-package-builder,source=/build/npm,target=/tmp/daedalus-agent-local-npm,readonly \ --mount=type=cache,target=/root/.npm,sharing=locked \ - --mount=type=cache,target=/opt/aios-build-cache/npm-tools,sharing=locked \ - install-versioned-npm-global "aios-apps-invoke-cli" "${AIOS_APPS_INVOKE_CLI_VERSION}" + --mount=type=cache,target=/opt/daedalus-agent-build-cache/npm-tools,sharing=locked \ + DA_BUILD_NPM_VENDOR_DIR=/tmp/daedalus-agent-local-npm \ + install-versioned-npm-global "daedalus-agent-apps-invoke-cli" "$(cat /tmp/daedalus-agent-local-npm/daedalus-agent-apps-invoke-cli.version)" -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/daedalus-agent-vendor-src,readonly \ --mount=type=cache,target=/root/.npm,sharing=locked \ - --mount=type=cache,target=/opt/aios-build-cache/npm-tools,sharing=locked \ + --mount=type=cache,target=/opt/daedalus-agent-build-cache/npm-tools,sharing=locked \ install-versioned-npm-global "mcporter" "${MCPORTER_VERSION}" -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/daedalus-agent-vendor-src,readonly \ --mount=type=cache,target=/root/.npm,sharing=locked \ - --mount=type=cache,target=/opt/aios-build-cache/npm-tools,sharing=locked \ + --mount=type=cache,target=/opt/daedalus-agent-build-cache/npm-tools,sharing=locked \ set -eux; \ if [[ "${TARGETARCH}" == "amd64" ]]; then \ install-versioned-npm-global "agent-browser" "${AGENT_BROWSER_VERSION}"; \ - ln -sf "../lib/node_modules/agent-browser/bin/agent-browser-linux-x64" "${AIOS_TOOLCHAIN_DIR}/bin/agent-browser"; \ - test -x "${AIOS_TOOLCHAIN_DIR}/bin/agent-browser"; \ + ln -sf "../lib/node_modules/agent-browser/bin/agent-browser-linux-x64" "${DA_TOOLCHAIN_DIR}/bin/agent-browser"; \ + test -x "${DA_TOOLCHAIN_DIR}/bin/agent-browser"; \ fi -RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/aios-vendor-src,readonly \ +RUN --mount=type=bind,source=docker/internal/kernel/vendor,target=/tmp/daedalus-agent-vendor-src,readonly \ set -eux; \ mkdir -p /opt/agent-browser; \ if [[ "${TARGETARCH}" == "amd64" ]]; then \ - chrome_zip="$(find /tmp/aios-vendor-src/chrome -name chrome-linux64.zip -print -quit)"; \ + chrome_zip="$(find /tmp/daedalus-agent-vendor-src/chrome -name chrome-linux64.zip -print -quit)"; \ test -n "${chrome_zip}"; \ unzip -q "${chrome_zip}" -d /opt/agent-browser; \ fi FROM tool-builder AS seed-builder -ARG AIOS_CLAWHUB_FETCH_TIMEOUT_MS=180000 -ARG AIOS_BUILD_NPM_REGISTRY=https://registry.npmjs.org - -ENV HOME=/opt/aios-seed/home -ENV AIOS_OPENCLAW_HOME=/opt/aios-seed/home/.openclaw -ENV AIOS_OPENCLAW_WORKSPACE_DIR=/opt/aios-seed/workspace-default -ENV OPENCLAW_HOME=/opt/aios-seed/home -ENV OPENCLAW_WORKSPACE_DIR=/opt/aios-seed/workspace-default -ENV XDG_CONFIG_HOME=/opt/aios-seed/home/.config -ENV XDG_CACHE_HOME=/opt/aios-seed/home/.cache -ENV NPM_CONFIG_PREFIX=/opt/aios-toolchain +ARG DA_CLAWHUB_FETCH_TIMEOUT_MS=180000 +ARG DA_BUILD_NPM_REGISTRY=https://registry.npmjs.org + +ENV HOME=/opt/daedalus-agent-seed/home +ENV DA_OPENCLAW_HOME=/opt/daedalus-agent-seed/home/.openclaw +ENV DA_OPENCLAW_WORKSPACE_DIR=/opt/daedalus-agent-seed/workspace-default +ENV OPENCLAW_HOME=/opt/daedalus-agent-seed/home +ENV OPENCLAW_WORKSPACE_DIR=/opt/daedalus-agent-seed/workspace-default +ENV XDG_CONFIG_HOME=/opt/daedalus-agent-seed/home/.config +ENV XDG_CACHE_HOME=/opt/daedalus-agent-seed/home/.cache +ENV NPM_CONFIG_PREFIX=/opt/daedalus-agent-toolchain ENV NPM_CONFIG_CACHE=/root/.npm -ENV UV_PACKAGE_ROOT=/opt/aios-seed/uv-package -ENV UV_TOOL_DIR=/opt/aios-seed/uv-package/tools -ENV UV_TOOL_BIN_DIR=/opt/aios-seed/uv-package/bin -ENV UV_CACHE_DIR=/opt/aios-seed/home/.cache/uv -ENV OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS=${AIOS_CLAWHUB_FETCH_TIMEOUT_MS} -ENV CLAWHUB_REQUEST_TIMEOUT_MS=${AIOS_CLAWHUB_FETCH_TIMEOUT_MS} +ENV UV_PACKAGE_ROOT=/opt/daedalus-agent-seed/uv-package +ENV UV_TOOL_DIR=/opt/daedalus-agent-seed/uv-package/tools +ENV UV_TOOL_BIN_DIR=/opt/daedalus-agent-seed/uv-package/bin +ENV UV_CACHE_DIR=/opt/daedalus-agent-seed/home/.cache/uv +ENV OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS=${DA_CLAWHUB_FETCH_TIMEOUT_MS} +ENV CLAWHUB_REQUEST_TIMEOUT_MS=${DA_CLAWHUB_FETCH_TIMEOUT_MS} RUN set -eux; \ - mkdir -p "${HOME}" "${AIOS_OPENCLAW_HOME}" "${AIOS_OPENCLAW_WORKSPACE_DIR}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${AIOS_OPENCLAW_HOME}/skills" "${UV_TOOL_DIR}" "${UV_TOOL_BIN_DIR}" "${UV_CACHE_DIR}" /opt/aios-seed/scripts /opt/aios-seed/workspace-templates/default; \ - printf '{}\n' > "${AIOS_OPENCLAW_HOME}/openclaw.json" + mkdir -p "${HOME}" "${DA_OPENCLAW_HOME}" "${DA_OPENCLAW_WORKSPACE_DIR}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${DA_OPENCLAW_HOME}/skills" "${UV_TOOL_DIR}" "${UV_TOOL_BIN_DIR}" "${UV_CACHE_DIR}" /opt/daedalus-agent-seed/scripts /opt/daedalus-agent-seed/workspace-templates/default; \ + printf '{}\n' > "${DA_OPENCLAW_HOME}/openclaw.json" RUN set -eux; \ printf '%s\n' \ @@ -301,11 +337,11 @@ RUN set -eux; \ '}' \ 'trap cleanup EXIT' \ '' \ - 'max_attempts="${AIOS_SEED_SKILL_INSTALL_ATTEMPTS:-6}"' \ - 'delay_seconds="${AIOS_SEED_SKILL_INSTALL_RETRY_DELAY_SECONDS:-20}"' \ + 'max_attempts="${DA_SEED_SKILL_INSTALL_ATTEMPTS:-6}"' \ + 'delay_seconds="${DA_SEED_SKILL_INSTALL_RETRY_DELAY_SECONDS:-20}"' \ 'attempt=1' \ 'while true; do' \ - ' if XDG_CACHE_HOME="${cache_home}" XDG_CONFIG_HOME="${config_home}" openclaw skills install "${skill}" --global --force "$@"; then' \ + ' if XDG_CACHE_HOME="${cache_home}" XDG_CONFIG_HOME="${config_home}" openclaw skills install "${skill}" --global --force --acknowledge-clawhub-risk "$@"; then' \ ' exit 0' \ ' fi' \ ' if (( attempt >= max_attempts )); then' \ @@ -318,21 +354,25 @@ RUN set -eux; \ > /usr/local/bin/install-seed-skill; \ chmod +x /usr/local/bin/install-seed-skill -RUN openclaw plugins install aios-mqtt-channel +RUN --mount=type=bind,from=local-package-builder,source=/build/npm,target=/tmp/daedalus-agent-local-npm,readonly \ + --mount=type=cache,target=/root/.npm,sharing=locked \ + set -eux; \ + mqtt_project="${DA_OPENCLAW_HOME}/npm/projects/daedalus-agent-mqtt-channel"; \ + mkdir -p "${mqtt_project}"; \ + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm install --omit=dev --prefix "${mqtt_project}" /tmp/daedalus-agent-local-npm/daedalus-agent-mqtt-channel.tgz; \ + test -f "${mqtt_project}/node_modules/daedalus-agent-mqtt-channel/openclaw.plugin.json" -RUN skill="aios-call-app-service"; \ - install-seed-skill "${skill}" +COPY extensions/clawhub-skills/daedalus-agent-call-app-service ${DA_OPENCLAW_HOME}/skills/daedalus-agent-call-app-service -RUN skill="aios-transfer-file"; \ - install-seed-skill "${skill}"; \ - NPM_CONFIG_REGISTRY="${AIOS_BUILD_NPM_REGISTRY}" npm install --omit=dev --prefix "${AIOS_OPENCLAW_HOME}/skills/aios-transfer-file" +COPY extensions/clawhub-skills/daedalus-agent-transfer-file ${DA_OPENCLAW_HOME}/skills/daedalus-agent-transfer-file +RUN --mount=type=cache,target=/root/.npm,sharing=locked \ + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm ci --omit=dev --prefix "${DA_OPENCLAW_HOME}/skills/daedalus-agent-transfer-file" -RUN skill="aios-make-chart-image"; \ - install-seed-skill "${skill}"; \ - NPM_CONFIG_REGISTRY="${AIOS_BUILD_NPM_REGISTRY}" npm install --omit=dev --prefix "${AIOS_OPENCLAW_HOME}/skills/aios-make-chart-image" +COPY extensions/clawhub-skills/daedalus-agent-make-chart-image ${DA_OPENCLAW_HOME}/skills/daedalus-agent-make-chart-image +RUN --mount=type=cache,target=/root/.npm,sharing=locked \ + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm ci --omit=dev --prefix "${DA_OPENCLAW_HOME}/skills/daedalus-agent-make-chart-image" -RUN skill="aios-self-improving-agent"; \ - install-seed-skill "${skill}" +COPY extensions/clawhub-skills/daedalus-agent-self-improving-agent ${DA_OPENCLAW_HOME}/skills/daedalus-agent-self-improving-agent RUN skill="@steipete/video-frames"; \ install-seed-skill "${skill}" @@ -376,21 +416,20 @@ RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \ RUN set -eux; \ rm -rf "${XDG_CACHE_HOME}" "${HOME}/.npm" -FROM node:24-bookworm-slim AS web-installer +FROM npm-builder-base AS web-installer -ARG AIOS_MANAGEMENT_WEB_NPM_VERSION -ARG AIOS_BUILD_NPM_REGISTRY=https://registry.npmjs.org +ARG DA_BUILD_NPM_REGISTRY=https://registry.npmjs.org WORKDIR /tmp/web-src -COPY packages/aios-management-web/package.json packages/aios-management-web/package-lock.json ./ +COPY packages/daedalus-agent-management-web/package.json packages/daedalus-agent-management-web/package-lock.json ./ RUN --mount=type=cache,target=/root/.npm,sharing=locked \ set -eux; \ - NPM_CONFIG_REGISTRY="${AIOS_BUILD_NPM_REGISTRY}" npm ci -COPY packages/aios-management-web/index.html packages/aios-management-web/vite.config.js ./ -COPY packages/aios-management-web/public ./public -COPY packages/aios-management-web/src ./src -COPY packages/aios-management-web/server ./server -COPY packages/aios-management-web/scripts ./scripts + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm-ci-with-retry --foreground-scripts +COPY packages/daedalus-agent-management-web/index.html packages/daedalus-agent-management-web/vite.config.js ./ +COPY packages/daedalus-agent-management-web/public ./public +COPY packages/daedalus-agent-management-web/src ./src +COPY packages/daedalus-agent-management-web/server ./server +COPY packages/daedalus-agent-management-web/scripts ./scripts RUN set -eux; \ npm run build; \ npm prune --omit=dev; \ @@ -411,39 +450,38 @@ FROM runtime-base AS final ARG TARGETARCH ARG OPENCLAW_VERSION ARG AEDES_VERSION -ARG AIOS_MANAGEMENT_WEB_NPM_VERSION -ARG AIOS_BUILD_NPM_REGISTRY +ARG DA_BUILD_NPM_REGISTRY ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Asia/Shanghai -ENV AIOS_ROOT=/var/aios -ENV AIOS_SHARED_GROUP=aios -ENV AIOS_SERVICE_USER=aios-svc -ENV AIOS_SERVICE_GROUP=aios-svc -ENV AIOS_OPENCLAW_USER=aios-agent -ENV AIOS_OPENCLAW_GROUP=aios -ENV AIOS_APPS_HOME=/opt/aios-apps -ENV AIOS_WEB_HOME=/opt/aios-apps/web -ENV AIOS_OPENCLAW_HOME=/var/aios/.openclaw -ENV AIOS_OPENCLAW_WORKSPACE_DIR=/var/aios/.openclaw/workspaces/default -ENV AIOS_WORKSPACE_TEMPLATES_DIR=/var/aios/workspace-templates -ENV AIOS_ONTOLOGY_DIR=/var/aios/ontology -ENV AIOS_MANAGEMENT_ROOT=/var/aios/management -ENV AIOS_WEB_DATA_DIR=/var/aios/management/data -ENV AIOS_DATA_DIR=/var/aios/startup-state/data -ENV AIOS_TMP_DIR=/var/aios/.openclaw/tmp -ENV NPM_CONFIG_PREFIX=/var/aios/.openclaw/packages/npm -ENV NPM_CONFIG_CACHE=/var/aios/.openclaw/packages/npm/cache -ENV UV_PACKAGE_ROOT=/var/aios/.openclaw/packages/uv -ENV UV_TOOL_DIR=/var/aios/.openclaw/packages/uv/tools -ENV UV_TOOL_BIN_DIR=/var/aios/.openclaw/packages/uv/bin -ENV UV_CACHE_DIR=/var/aios/.openclaw/packages/uv/cache -ENV PIP_PACKAGE_ROOT=/var/aios/.openclaw/packages/pip -ENV PIP_CACHE_DIR=/var/aios/.openclaw/packages/pip/cache -ENV VIRTUAL_ENV=/var/aios/.openclaw/packages/pip/venv -ENV XDG_CONFIG_HOME=/var/aios/.openclaw/.config -ENV XDG_CACHE_HOME=/var/aios/.openclaw/cache -ENV PATH=/opt/aios/mqtt-broker/node_modules/.bin:/opt/aios-apps/web/node_modules/.bin:/var/aios/.openclaw/packages/npm/bin:/var/aios/.openclaw/packages/pip/venv/bin:/var/aios/.openclaw/packages/uv/bin:/opt/aios-toolchain/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV DA_ROOT=/var/daedalus-agent +ENV DA_SHARED_GROUP=daedalus-agent +ENV DA_SERVICE_USER=daedalus-svc +ENV DA_SERVICE_GROUP=daedalus-svc +ENV DA_OPENCLAW_USER=daedalus-agent +ENV DA_OPENCLAW_GROUP=daedalus-agent +ENV DA_APPS_HOME=/opt/daedalus-agent-apps +ENV DA_WEB_HOME=/opt/daedalus-agent-apps/web +ENV DA_OPENCLAW_HOME=/var/daedalus-agent/.openclaw +ENV DA_OPENCLAW_WORKSPACE_DIR=/var/daedalus-agent/.openclaw/workspaces/default +ENV DA_WORKSPACE_TEMPLATES_DIR=/var/daedalus-agent/workspace-templates +ENV DA_ONTOLOGY_DIR=/var/daedalus-agent/ontology +ENV DA_MANAGEMENT_ROOT=/var/daedalus-agent/management +ENV DA_WEB_DATA_DIR=/var/daedalus-agent/management/data +ENV DA_DATA_DIR=/var/daedalus-agent/startup-state/data +ENV DA_TMP_DIR=/var/daedalus-agent/.openclaw/tmp +ENV NPM_CONFIG_PREFIX=/var/daedalus-agent/.openclaw/packages/npm +ENV NPM_CONFIG_CACHE=/var/daedalus-agent/.openclaw/packages/npm/cache +ENV UV_PACKAGE_ROOT=/var/daedalus-agent/.openclaw/packages/uv +ENV UV_TOOL_DIR=/var/daedalus-agent/.openclaw/packages/uv/tools +ENV UV_TOOL_BIN_DIR=/var/daedalus-agent/.openclaw/packages/uv/bin +ENV UV_CACHE_DIR=/var/daedalus-agent/.openclaw/packages/uv/cache +ENV PIP_PACKAGE_ROOT=/var/daedalus-agent/.openclaw/packages/pip +ENV PIP_CACHE_DIR=/var/daedalus-agent/.openclaw/packages/pip/cache +ENV VIRTUAL_ENV=/var/daedalus-agent/.openclaw/packages/pip/venv +ENV XDG_CONFIG_HOME=/var/daedalus-agent/.openclaw/.config +ENV XDG_CACHE_HOME=/var/daedalus-agent/.openclaw/cache +ENV PATH=/opt/daedalus-agent/mqtt-broker/node_modules/.bin:/opt/daedalus-agent-apps/web/node_modules/.bin:/var/daedalus-agent/.openclaw/packages/npm/bin:/var/daedalus-agent/.openclaw/packages/pip/venv/bin:/var/daedalus-agent/.openclaw/packages/uv/bin:/opt/daedalus-agent-toolchain/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \ @@ -455,34 +493,34 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ rm -rf /var/lib/apt/lists/* RUN set -eux; \ - mkdir -p /opt/aios/mqtt-broker; \ - NPM_CONFIG_REGISTRY="${AIOS_BUILD_NPM_REGISTRY}" npm install --omit=dev --prefix /opt/aios/mqtt-broker "aedes@${AEDES_VERSION}" + mkdir -p /opt/daedalus-agent/mqtt-broker; \ + NPM_CONFIG_REGISTRY="${DA_BUILD_NPM_REGISTRY}" npm install --omit=dev --prefix /opt/daedalus-agent/mqtt-broker "aedes@${AEDES_VERSION}" -COPY --from=tool-builder /opt/aios-toolchain /opt/aios-toolchain +COPY --from=tool-builder /opt/daedalus-agent-toolchain /opt/daedalus-agent-toolchain COPY --from=tool-builder /opt/agent-browser /opt/agent-browser -COPY --from=seed-builder --chown=aios-svc:aios /opt/aios-seed /opt/aios-seed -COPY docker/internal/kernel/vendor/qmd-models /opt/aios-vendor/qmd-models -COPY --chown=aios-svc:aios docker/assets /opt/aios-assets -COPY --chown=aios-svc:aios docker/sample/run_after_startup.sh /opt/aios/sample/run_after_startup.sh +COPY --from=seed-builder --chown=daedalus-svc:daedalus-agent /opt/daedalus-agent-seed /opt/daedalus-agent-seed +COPY docker/internal/kernel/vendor/qmd-models /opt/daedalus-agent-vendor/qmd-models +COPY --chown=daedalus-svc:daedalus-agent docker/assets /opt/daedalus-agent-assets +COPY --chown=daedalus-svc:daedalus-agent docker/sample/run_after_startup.sh /opt/daedalus-agent/sample/run_after_startup.sh -USER aios-svc:aios +USER daedalus-svc:daedalus-agent RUN --mount=type=bind,source=docker/assets/workspace-templates/default,target=/tmp/default-template,readonly \ set -eux; \ - seed_home=/opt/aios-seed/home; \ + seed_home=/opt/daedalus-agent-seed/home; \ seed_openclaw_home="${seed_home}/.openclaw"; \ - seed_workspace=/opt/aios-seed/workspace-default; \ - workspace_template=/opt/aios-seed/workspace-templates/default; \ - built_in_manifest=/opt/aios-seed/data/build-in-component.json; \ - built_in_fingerprint=/opt/aios-seed/data/built-in-content.fingerprint; \ + seed_workspace=/opt/daedalus-agent-seed/workspace-default; \ + workspace_template=/opt/daedalus-agent-seed/workspace-templates/default; \ + built_in_manifest=/opt/daedalus-agent-seed/data/build-in-component.json; \ + built_in_fingerprint=/opt/daedalus-agent-seed/data/built-in-content.fingerprint; \ formatted_openclaw_version="$(printf '%s' "${OPENCLAW_VERSION}" | awk -F. '{printf "%04d.%02d.%02d", $1, $2, $3}')"; \ - npm_packages='["openclaw","clawhub","@tobilu/qmd","aios-apps-invoke-cli","mcporter"]'; \ + npm_packages='["openclaw","clawhub","@tobilu/qmd","daedalus-agent-apps-invoke-cli","mcporter"]'; \ pip_packages='["uv","markitdown[all]"]'; \ if [[ "${TARGETARCH}" == "amd64" ]]; then \ - npm_packages='["openclaw","clawhub","@tobilu/qmd","aios-apps-invoke-cli","mcporter","agent-browser"]'; \ + npm_packages='["openclaw","clawhub","@tobilu/qmd","daedalus-agent-apps-invoke-cli","mcporter","agent-browser"]'; \ fi; \ - mkdir -p "${AIOS_ROOT}" "${seed_openclaw_home}" "${seed_workspace}" "${workspace_template}" /opt/aios-seed/scripts /opt/aios-seed/data; \ - cp -a --no-preserve=ownership /opt/aios-assets/scripts/kernel-startup.sh /opt/aios-seed/scripts/startup.sh; \ - cp -a --no-preserve=ownership /opt/aios-assets/scripts/openclaw-shared-fs-defaults.cjs /opt/aios-seed/scripts/openclaw-shared-fs-defaults.cjs; \ + mkdir -p "${DA_ROOT}" "${seed_openclaw_home}" "${seed_workspace}" "${workspace_template}" /opt/daedalus-agent-seed/scripts /opt/daedalus-agent-seed/data; \ + cp -a --no-preserve=ownership /opt/daedalus-agent-assets/scripts/kernel-startup.sh /opt/daedalus-agent-seed/scripts/startup.sh; \ + cp -a --no-preserve=ownership /opt/daedalus-agent-assets/scripts/openclaw-shared-fs-defaults.cjs /opt/daedalus-agent-seed/scripts/openclaw-shared-fs-defaults.cjs; \ if [[ -d /tmp/default-template ]]; then \ cp -a /tmp/default-template/. "${workspace_template}/"; \ fi; \ @@ -491,21 +529,21 @@ RUN --mount=type=bind,source=docker/assets/workspace-templates/default,target=/t cp "${workspace_template}/${doc}" "${seed_workspace}/${doc}"; \ fi; \ done; \ - for tree in "${seed_openclaw_home}/skills" /opt/aios-seed/workspace-templates; do \ + for tree in "${seed_openclaw_home}/skills" /opt/daedalus-agent-seed/workspace-templates; do \ if [[ -d "${tree}" ]]; then \ find "${tree}" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d '' child; do \ { \ find "${child}" -type d -printf 'dir:%P\n' | sort; \ find "${child}" -type l -printf 'link:%P->%l\n' | sort; \ - find "${child}" -type f ! -name '.aios-builtin.fingerprint' -print0 | sort -z | xargs -0 -r sha256sum; \ - } | sha256sum | awk '{print $1}' > "${child}/.aios-builtin.fingerprint"; \ + find "${child}" -type f ! -name '.daedalus-agent-builtin.fingerprint' -print0 | sort -z | xargs -0 -r sha256sum; \ + } | sha256sum | awk '{print $1}' > "${child}/.daedalus-agent-builtin.fingerprint"; \ done; \ fi; \ done; \ - printf '%s\n' "{\"openclaw-version\":\"${formatted_openclaw_version}\",\"agent-template\":[\"default\"],\"ontology\":[],\"skill\":[\"aios-call-app-service\",\"aios-transfer-file\",\"aios-make-chart-image\",\"aios-self-improving-agent\",\"video-frames\",\"ffmpeg-video-editor\",\"multi-search-engine\",\"agent-browser-clawdbot\",\"skill-creator\",\"tesseract-ocr\",\"word-docx\",\"excel-xlsx\",\"powerpoint-pptx\",\"pdf\",\"mcporter\",\"markdown-converter\"],\"npm\":${npm_packages},\"pip\":${pip_packages}}" > "${built_in_manifest}"; \ + printf '%s\n' "{\"openclaw-version\":\"${formatted_openclaw_version}\",\"agent-template\":[\"default\"],\"ontology\":[],\"skill\":[\"daedalus-agent-call-app-service\",\"daedalus-agent-transfer-file\",\"daedalus-agent-make-chart-image\",\"daedalus-agent-self-improving-agent\",\"video-frames\",\"ffmpeg-video-editor\",\"multi-search-engine\",\"agent-browser-clawdbot\",\"skill-creator\",\"tesseract-ocr\",\"word-docx\",\"excel-xlsx\",\"powerpoint-pptx\",\"pdf\",\"mcporter\",\"markdown-converter\"],\"npm\":${npm_packages},\"pip\":${pip_packages}}" > "${built_in_manifest}"; \ { \ printf 'manifest:'; sha256sum "${built_in_manifest}"; \ - for tree in "${seed_openclaw_home}/skills" /opt/aios-seed/workspace-templates; do \ + for tree in "${seed_openclaw_home}/skills" /opt/daedalus-agent-seed/workspace-templates; do \ if [[ -d "${tree}" ]]; then \ printf 'tree:%s\n' "${tree}"; \ find "${tree}" -type d -printf 'dir:%P\n' | sort; \ @@ -514,15 +552,15 @@ RUN --mount=type=bind,source=docker/assets/workspace-templates/default,target=/t fi; \ done; \ } | sha256sum | awk '{print $1}' > "${built_in_fingerprint}"; \ - chmod +x /opt/aios-seed/scripts/*.sh + chmod +x /opt/daedalus-agent-seed/scripts/*.sh USER root RUN set -eux; \ mkdir -p \ - "${AIOS_ROOT}/generated" \ - "${AIOS_DATA_DIR}" \ - "${AIOS_OPENCLAW_HOME}" \ - "${AIOS_TMP_DIR}" \ + "${DA_ROOT}/generated" \ + "${DA_DATA_DIR}" \ + "${DA_OPENCLAW_HOME}" \ + "${DA_TMP_DIR}" \ "${NPM_CONFIG_PREFIX}" \ "${NPM_CONFIG_CACHE}" \ "${UV_PACKAGE_ROOT}" \ @@ -534,26 +572,26 @@ RUN set -eux; \ "${VIRTUAL_ENV}" \ "${XDG_CONFIG_HOME}" \ "${XDG_CACHE_HOME}" \ - "${AIOS_ROOT}/logs"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${AIOS_ROOT}" "${AIOS_OPENCLAW_HOME}" "${AIOS_TMP_DIR}" "${AIOS_ROOT}/logs"; \ - chmod 2750 "${AIOS_ROOT}"; \ - chmod 2770 "${AIOS_OPENCLAW_HOME}" "${AIOS_TMP_DIR}" "${AIOS_ROOT}/logs"; \ - cp /opt/aios-seed/home/.openclaw/openclaw.json /tmp/aios-seed-openclaw.json; \ - cp /opt/aios-seed/data/built-in-content.fingerprint "${AIOS_DATA_DIR}/.aios-builtin-content.fingerprint"; \ - cp /opt/aios-assets/config.json "${AIOS_ROOT}/generated/runtime-config.json"; \ - AIOS_KERNEL_ROOT="${AIOS_ROOT}" \ - AIOS_DATA_DIR="${AIOS_DATA_DIR}" \ - AIOS_LOG_DIR="${AIOS_ROOT}/logs" \ - AIOS_MQTT_CHANNEL_LOG_DIR="${AIOS_ROOT}/logs" \ - AIOS_OPENCLAW_HOME="/opt/aios-seed/home/.openclaw" \ - AIOS_OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR}" \ - AIOS_WORKSPACE_TEMPLATES_DIR="/opt/aios-seed/workspace-templates" \ - AIOS_TMP_DIR="${AIOS_TMP_DIR}" \ - AIOS_RUNTIME_CONFIG_JSON="${AIOS_ROOT}/generated/runtime-config.json" \ - OPENCLAW_HOME="/opt/aios-seed/home" \ - OPENCLAW_STATE_DIR="/opt/aios-seed/home/.openclaw" \ - OPENCLAW_CONFIG_PATH="/opt/aios-seed/home/.openclaw/openclaw.json" \ - OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR}" \ + "${DA_ROOT}/logs"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${DA_ROOT}" "${DA_OPENCLAW_HOME}" "${DA_TMP_DIR}" "${DA_ROOT}/logs"; \ + chmod 2750 "${DA_ROOT}"; \ + chmod 2770 "${DA_OPENCLAW_HOME}" "${DA_TMP_DIR}" "${DA_ROOT}/logs"; \ + cp /opt/daedalus-agent-seed/home/.openclaw/openclaw.json /tmp/daedalus-agent-seed-openclaw.json; \ + cp /opt/daedalus-agent-seed/data/built-in-content.fingerprint "${DA_DATA_DIR}/.daedalus-agent-builtin-content.fingerprint"; \ + cp /opt/daedalus-agent-assets/config.json "${DA_ROOT}/generated/runtime-config.json"; \ + DA_KERNEL_ROOT="${DA_ROOT}" \ + DA_DATA_DIR="${DA_DATA_DIR}" \ + DA_LOG_DIR="${DA_ROOT}/logs" \ + DA_MQTT_CHANNEL_LOG_DIR="${DA_ROOT}/logs" \ + DA_OPENCLAW_HOME="/opt/daedalus-agent-seed/home/.openclaw" \ + DA_OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR}" \ + DA_WORKSPACE_TEMPLATES_DIR="/opt/daedalus-agent-seed/workspace-templates" \ + DA_TMP_DIR="${DA_TMP_DIR}" \ + DA_RUNTIME_CONFIG_JSON="${DA_ROOT}/generated/runtime-config.json" \ + OPENCLAW_HOME="/opt/daedalus-agent-seed/home" \ + OPENCLAW_STATE_DIR="/opt/daedalus-agent-seed/home/.openclaw" \ + OPENCLAW_CONFIG_PATH="/opt/daedalus-agent-seed/home/.openclaw/openclaw.json" \ + OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR}" \ NPM_CONFIG_PREFIX="${NPM_CONFIG_PREFIX}" \ NPM_CONFIG_CACHE="${NPM_CONFIG_CACHE}" \ UV_PACKAGE_ROOT="${UV_PACKAGE_ROOT}" \ @@ -565,70 +603,71 @@ RUN set -eux; \ VIRTUAL_ENV="${VIRTUAL_ENV}" \ XDG_CONFIG_HOME="${XDG_CONFIG_HOME}" \ XDG_CACHE_HOME="${XDG_CACHE_HOME}" \ - TMPDIR="${AIOS_TMP_DIR}" \ - AIOS_OPENCLAW_USER="${AIOS_SERVICE_USER}" \ - bash -lc 'source /opt/aios-assets/scripts/kernel-startup.sh; export_runtime_environment; patch_openclaw_config; refresh_openclaw_plugin_registry'; \ - node --input-type=module -e 'import { DatabaseSync } from "node:sqlite"; const db = new DatabaseSync("/opt/aios-seed/home/.openclaw/state/openclaw.sqlite"); db.exec("PRAGMA wal_checkpoint(TRUNCATE); PRAGMA optimize;"); db.close();'; \ - cp /tmp/aios-seed-openclaw.json /opt/aios-seed/home/.openclaw/openclaw.json; \ - rm -rf /tmp/aios-seed-openclaw.json "${AIOS_ROOT}" "${AIOS_ROOT}/logs" + TMPDIR="${DA_TMP_DIR}" \ + DA_OPENCLAW_USER="${DA_SERVICE_USER}" \ + bash -lc 'source /opt/daedalus-agent-assets/scripts/kernel-startup.sh; export_runtime_environment; patch_openclaw_config; refresh_openclaw_plugin_registry'; \ + node --input-type=module -e 'import { DatabaseSync } from "node:sqlite"; const db = new DatabaseSync("/opt/daedalus-agent-seed/home/.openclaw/state/openclaw.sqlite"); db.exec("PRAGMA wal_checkpoint(TRUNCATE); PRAGMA optimize;"); db.close();'; \ + cp /tmp/daedalus-agent-seed-openclaw.json /opt/daedalus-agent-seed/home/.openclaw/openclaw.json; \ + rm -rf /tmp/daedalus-agent-seed-openclaw.json "${DA_ROOT}" "${DA_ROOT}/logs" RUN set -eux; \ - seed_mqtt_project="/opt/aios-seed/home/.openclaw/npm/projects/aios-mqtt-channel"; \ - seed_skill_parent="/opt/aios-seed/home/.openclaw/skills"; \ - test -d "${seed_mqtt_project}/node_modules/aios-mqtt-channel"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" \ - /opt/aios-seed \ - /opt/aios-seed/home \ - /opt/aios-seed/home/.openclaw \ + seed_mqtt_project="/opt/daedalus-agent-seed/home/.openclaw/npm/projects/daedalus-agent-mqtt-channel"; \ + seed_skill_parent="/opt/daedalus-agent-seed/home/.openclaw/skills"; \ + test -d "${seed_mqtt_project}/node_modules/daedalus-agent-mqtt-channel"; \ + chown -R root:"${DA_OPENCLAW_GROUP}" "${seed_mqtt_project}"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" \ + /opt/daedalus-agent-seed \ + /opt/daedalus-agent-seed/home \ + /opt/daedalus-agent-seed/home/.openclaw \ "${seed_skill_parent}" \ - /opt/aios-seed/workspace-default \ - /opt/aios-seed/workspace-templates \ - /opt/aios-seed/workspace-templates/default \ - /opt/aios-seed/scripts \ - /opt/aios-seed/data; \ + /opt/daedalus-agent-seed/workspace-default \ + /opt/daedalus-agent-seed/workspace-templates \ + /opt/daedalus-agent-seed/workspace-templates/default \ + /opt/daedalus-agent-seed/scripts \ + /opt/daedalus-agent-seed/data; \ chmod 2750 \ - /opt/aios-seed \ - /opt/aios-seed/home \ - /opt/aios-seed/home/.openclaw \ + /opt/daedalus-agent-seed \ + /opt/daedalus-agent-seed/home \ + /opt/daedalus-agent-seed/home/.openclaw \ "${seed_skill_parent}" \ - /opt/aios-seed/workspace-default \ - /opt/aios-seed/workspace-templates \ - /opt/aios-seed/workspace-templates/default \ - /opt/aios-seed/scripts \ - /opt/aios-seed/data; \ + /opt/daedalus-agent-seed/workspace-default \ + /opt/daedalus-agent-seed/workspace-templates \ + /opt/daedalus-agent-seed/workspace-templates/default \ + /opt/daedalus-agent-seed/scripts \ + /opt/daedalus-agent-seed/data; \ for seed_skill_root in "${seed_skill_parent}"/*; do \ [[ -d "${seed_skill_root}" ]] || continue; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${seed_skill_root}"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${seed_skill_root}"; \ chmod 0750 "${seed_skill_root}"; \ done; \ - chown root:"${AIOS_OPENCLAW_GROUP}" "${seed_mqtt_project}"; \ + chown root:"${DA_OPENCLAW_GROUP}" "${seed_mqtt_project}"; \ chmod 0750 "${seed_mqtt_project}"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" /opt/aios-seed/scripts/startup.sh /opt/aios-seed/scripts/openclaw-shared-fs-defaults.cjs; \ - chmod 0750 /opt/aios-seed/scripts/startup.sh; \ - chmod 0640 /opt/aios-seed/scripts/openclaw-shared-fs-defaults.cjs; \ - find /opt/aios-assets -type f -name '*.sh' -exec sed -i 's/\r$//' {} + + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" /opt/daedalus-agent-seed/scripts/startup.sh /opt/daedalus-agent-seed/scripts/openclaw-shared-fs-defaults.cjs; \ + chmod 0750 /opt/daedalus-agent-seed/scripts/startup.sh; \ + chmod 0640 /opt/daedalus-agent-seed/scripts/openclaw-shared-fs-defaults.cjs; \ + find /opt/daedalus-agent-assets -type f -name '*.sh' -exec sed -i 's/\r$//' {} + -COPY --from=web-installer --chown=aios-svc:aios /build/web/package.json ${AIOS_WEB_HOME}/package.json -COPY --from=web-installer --chown=aios-svc:aios /build/web/node_modules ${AIOS_WEB_HOME}/node_modules -COPY --from=web-installer --chown=aios-svc:aios /build/web/dist ${AIOS_WEB_HOME}/dist -COPY --from=web-installer --chown=aios-svc:aios /build/web/server ${AIOS_WEB_HOME}/server -COPY --from=web-installer --chown=aios-svc:aios /build/web/scripts ${AIOS_WEB_HOME}/scripts +COPY --from=web-installer --chown=daedalus-svc:daedalus-agent /build/web/package.json ${DA_WEB_HOME}/package.json +COPY --from=web-installer --chown=daedalus-svc:daedalus-agent /build/web/node_modules ${DA_WEB_HOME}/node_modules +COPY --from=web-installer --chown=daedalus-svc:daedalus-agent /build/web/dist ${DA_WEB_HOME}/dist +COPY --from=web-installer --chown=daedalus-svc:daedalus-agent /build/web/server ${DA_WEB_HOME}/server +COPY --from=web-installer --chown=daedalus-svc:daedalus-agent /build/web/scripts ${DA_WEB_HOME}/scripts COPY --from=minio-image /usr/bin/minio /usr/local/bin/minio COPY --from=mc-image /usr/bin/mc /usr/local/bin/mc -COPY docker/sample /opt/aios/sample +COPY docker/sample /opt/daedalus-agent/sample RUN set -eux; \ - mkdir -p "${AIOS_ROOT}" "${AIOS_MANAGEMENT_ROOT}" "${AIOS_WEB_DATA_DIR}" "${AIOS_OPENCLAW_HOME}/logs" "${AIOS_ROOT}/logs"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${AIOS_ROOT}" "${AIOS_MANAGEMENT_ROOT}" "${AIOS_WEB_DATA_DIR}"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${AIOS_ROOT}/logs"; \ - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${AIOS_OPENCLAW_HOME}" "${AIOS_OPENCLAW_HOME}/logs"; \ - chmod 2750 "${AIOS_ROOT}" "${AIOS_MANAGEMENT_ROOT}" "${AIOS_WEB_DATA_DIR}"; \ - chmod 2770 "${AIOS_ROOT}/logs" "${AIOS_OPENCLAW_HOME}" "${AIOS_OPENCLAW_HOME}/logs" + mkdir -p "${DA_ROOT}" "${DA_MANAGEMENT_ROOT}" "${DA_WEB_DATA_DIR}" "${DA_OPENCLAW_HOME}/logs" "${DA_ROOT}/logs"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${DA_ROOT}" "${DA_MANAGEMENT_ROOT}" "${DA_WEB_DATA_DIR}"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${DA_ROOT}/logs"; \ + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${DA_OPENCLAW_HOME}" "${DA_OPENCLAW_HOME}/logs"; \ + chmod 2750 "${DA_ROOT}" "${DA_MANAGEMENT_ROOT}" "${DA_WEB_DATA_DIR}"; \ + chmod 2770 "${DA_ROOT}/logs" "${DA_OPENCLAW_HOME}" "${DA_OPENCLAW_HOME}/logs" -VOLUME ["/var/aios"] +VOLUME ["/var/daedalus-agent"] EXPOSE 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 1883 9000 -ENTRYPOINT ["/usr/bin/tini", "--", "/bin/bash", "/opt/aios-assets/scripts/startup.sh"] +ENTRYPOINT ["/usr/bin/tini", "--", "/bin/bash", "/opt/daedalus-agent-assets/scripts/startup.sh"] diff --git a/docker/Dockerfile.dockerignore b/docker/Dockerfile.dockerignore index 77eb52397796f177b526cc9b0bf3d0006dd82f10..192cdcc31bcdba51586bf169a5679cc29c7d051a 100644 --- a/docker/Dockerfile.dockerignore +++ b/docker/Dockerfile.dockerignore @@ -18,8 +18,16 @@ !docker/sample/env.json !docker/sample/run_after_startup.sh !packages/ -!packages/aios-management-web/ -!packages/aios-management-web/** +!packages/daedalus-agent-apps-invoke-cli/ +!packages/daedalus-agent-apps-invoke-cli/** +!packages/daedalus-agent-management-web/ +!packages/daedalus-agent-management-web/** +!extensions/ +!extensions/clawhub-skills/ +!extensions/clawhub-skills/** +!extensions/openclaw-plugins/ +!extensions/openclaw-plugins/daedalus-agent-mqtt-channel/ +!extensions/openclaw-plugins/daedalus-agent-mqtt-channel/** test/ test/** @@ -34,6 +42,7 @@ docker/integration/** **/*.temp **/.env **/.env.* +!extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.env.example **/node_modules **/node_modules/** **/dist diff --git a/docker/README.md b/docker/README.md index 97a179b13828a0b95040510db4330b3dc947c06b..360c0b590d67706d48c474c017d9c8c7bbe3ada6 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,21 +1,21 @@ -# AIOS Docker 镜像 +# DAEDALUS_AGENT Docker 镜像 -`docker/` 是当前唯一 Docker 入口。镜像把内置 MQTT、内置 MinIO、OpenClaw gateway、management web 和 `aios-apps-invoke-cli serve` 放在同一个容器中运行,不再提供独立的 kernel/apps Docker 镜像。 +`docker/` 是当前唯一 Docker 入口。镜像把内置 MQTT、内置 MinIO、OpenClaw gateway、management web 和 `daedalus-agent-apps-invoke-cli serve` 放在同一个容器中运行,不再提供独立的 kernel/apps Docker 镜像。 -OpenClaw 进程以 `aios-agent` 身份运行;management web、invoke service、MQTT、MinIO 和顶层 supervisor 以 `aios-svc` 身份运行。`aios-agent` 的局域网访问受 Docker iptables 限制,只能访问本机、互联网和 `AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST` 中的局域网地址;`aios-svc` 不受该限制,用于访问管理控制台和业务系统。 +OpenClaw 进程以 `daedalus-agent` 身份运行;management web、invoke service、MQTT、MinIO 和顶层 supervisor 以 `daedalus-svc` 身份运行。`daedalus-agent` 的局域网访问受 Docker iptables 限制,只能访问本机、互联网和 `DA_INTERNAL_NETWORK_ALLOWLIST` 中的局域网地址;`daedalus-svc` 不受该限制,用于访问管理控制台和业务系统。 ## 运行 ```bash -docker volume create aios-data -docker run -d --restart unless-stopped --name aios --cap-add NET_ADMIN --network bridge --dns-search GRAPECITY.net -p 3030-3050:3030-3050 -p 1883:1883 -p 9000:9000 -v aios-data:/var/aios aios-arm64:local +docker volume create daedalus-agent-data +docker run -d --restart unless-stopped --name daedalus-agent --cap-add NET_ADMIN --network bridge --dns-search GRAPECITY.net -p 3030-3050:3030-3050 -p 1883:1883 -p 9000:9000 -v daedalus-agent-data:/var/daedalus-agent daedalus-agent-arm64:local ``` Windows X64 示例: ```powershell -docker volume create aios-data -docker run -d --restart unless-stopped --name aios --cap-add NET_ADMIN --network bridge --dns-search GRAPECITY.net -p 3030-3050:3030-3050 -p 1883:1883 -p 9000:9000 -v aios-data:/var/aios aios-x64:local +docker volume create daedalus-agent-data +docker run -d --restart unless-stopped --name daedalus-agent --cap-add NET_ADMIN --network bridge --dns-search GRAPECITY.net -p 3030-3050:3030-3050 -p 1883:1883 -p 9000:9000 -v daedalus-agent-data:/var/daedalus-agent daedalus-agent-x64:local ``` 必须保留的宿主机开放端口:`1883`、`9000`、`3031-3050`。`3030` 默认用于 management web;`3031-3050` 预留给后续本地 HTTP 服务。 @@ -23,86 +23,86 @@ docker run -d --restart unless-stopped --name aios --cap-add NET_ADMIN --network 运行数据首次需要提供: ```text -/var/aios/env.json -/var/aios/config.json +/var/daedalus-agent/env.json +/var/daedalus-agent/config.json ``` -如果缺失,容器会播种 `/opt/aios/sample/env.json` 和 `/opt/aios-assets/config.json` 到 `/var/aios` 并退出。确认文件后再次启动容器。 +如果缺失,容器会播种 `/opt/daedalus-agent/sample/env.json` 和 `/opt/daedalus-agent-assets/config.json` 到 `/var/daedalus-agent` 并退出。确认文件后再次启动容器。 使用 Docker volume 时,Windows 上可用 `docker cp` 将配置复制到本地编辑,再复制回容器: ```powershell -docker cp aios:/var/aios/env.json .\env.json -docker cp aios:/var/aios/config.json .\config.json +docker cp daedalus-agent:/var/daedalus-agent/env.json .\env.json +docker cp daedalus-agent:/var/daedalus-agent/config.json .\config.json # 编辑 .\env.json 和 .\config.json 后: -docker cp .\env.json aios:/var/aios/env.json -docker cp .\config.json aios:/var/aios/config.json -docker start aios +docker cp .\env.json daedalus-agent:/var/daedalus-agent/env.json +docker cp .\config.json daedalus-agent:/var/daedalus-agent/config.json +docker start daedalus-agent ``` -容器会确保 `/var/aios/run_after_startup.sh` 存在。该脚本在 MQTT、MinIO、OpenClaw gateway、management web 和 invoke service 全部就绪后执行,默认输出 `all is ok`;用户修改后重启容器即可生效。 +容器会确保 `/var/daedalus-agent/run_after_startup.sh` 存在。该脚本在 MQTT、MinIO、OpenClaw gateway、management web 和 invoke service 全部就绪后执行,默认输出 `all is ok`;用户修改后重启容器即可生效。 最小 `env.json`: ```json { - "AIOS_MANAGEMENT_CONSOLE_PORT": 3030, - "AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT": 16, - "AIOS_HUOZIGE_SERVER_IP": "" + "DA_MANAGEMENT_CONSOLE_PORT": 3030, + "DA_OPENCLAW_GATEWAY_MAX_CONCURRENT": 16, + "DA_HUOZIGE_SERVER_IP": "" } ``` -`AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT` 控制 OpenClaw gateway 执行 lane 并发数;容器启动时会写入 `/var/aios/.openclaw/openclaw.json` 的 `agents.defaults.maxConcurrent`。 +`DA_OPENCLAW_GATEWAY_MAX_CONCURRENT` 控制 OpenClaw gateway 执行 lane 并发数;容器启动时会写入 `/var/daedalus-agent/.openclaw/openclaw.json` 的 `agents.defaults.maxConcurrent`。 -管理控制台的系统状态采用缓存刷新机制:启动后默认延迟 60 秒首次采集,之后每 60 秒刷新一次,覆盖 MQTT、S3、内核、插件加载和调用服务等状态;可通过 `AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS`、`AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS`、`AIOS_SYSTEM_STATUS_TIMEOUT_MS` 调整。 +管理控制台的系统状态采用缓存刷新机制:启动后默认延迟 60 秒首次采集,之后每 60 秒刷新一次,覆盖 MQTT、S3、内核、插件加载和调用服务等状态;可通过 `DA_SYSTEM_STATUS_INITIAL_DELAY_MS`、`DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS`、`DA_SYSTEM_STATUS_TIMEOUT_MS` 调整。 如需允许 OpenClaw/agent 访问指定局域网地址,可追加: ```json { - "AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST": "192.168.1.10,10.20.0.0/16" + "DA_INTERNAL_NETWORK_ALLOWLIST": "192.168.1.10,10.20.0.0/16" } ``` ## 运行数据 -容器内挂载根固定为 `/var/aios`,推荐由命名 Docker volume 提供,不再区分 persisted kernel/apps 目录。运行时会派生这些持久化路径: +容器内挂载根固定为 `/var/daedalus-agent`,推荐由命名 Docker volume 提供,不再区分 persisted kernel/apps 目录。运行时会派生这些持久化路径: ```text -/var/aios/env.json -/var/aios/config.json -/var/aios/credentials.json -/var/aios/run_after_startup.sh -/var/aios/generated/runtime-env.json -/var/aios/generated/runtime-config.json -/var/aios/.openclaw/ -/var/aios/logs/ -/var/aios/management/data/ -/var/aios/ontology/ -/var/aios/workspace-templates/ -/var/aios/minio/ -/var/aios/mqtt/aedes/ -/var/aios/startup-state/ -/var/aios/scripts/ +/var/daedalus-agent/env.json +/var/daedalus-agent/config.json +/var/daedalus-agent/credentials.json +/var/daedalus-agent/run_after_startup.sh +/var/daedalus-agent/generated/runtime-env.json +/var/daedalus-agent/generated/runtime-config.json +/var/daedalus-agent/.openclaw/ +/var/daedalus-agent/logs/ +/var/daedalus-agent/management/data/ +/var/daedalus-agent/ontology/ +/var/daedalus-agent/workspace-templates/ +/var/daedalus-agent/minio/ +/var/daedalus-agent/mqtt/aedes/ +/var/daedalus-agent/startup-state/ +/var/daedalus-agent/scripts/ ``` -`/var/aios/.openclaw` 持久保存 OpenClaw 的 workspace、skills、plugins、状态和 npm/pip/uv 包安装目录。OpenClaw 可持久安装 npm、pip、venv、uv 包,默认路径为: +`/var/daedalus-agent/.openclaw` 持久保存 OpenClaw 的 workspace、skills、plugins、状态和 npm/pip/uv 包安装目录。OpenClaw 可持久安装 npm、pip、venv、uv 包,默认路径为: ```text -/var/aios/.openclaw/packages/npm/ -/var/aios/.openclaw/packages/pip/ -/var/aios/.openclaw/packages/uv/ +/var/daedalus-agent/.openclaw/packages/npm/ +/var/daedalus-agent/.openclaw/packages/pip/ +/var/daedalus-agent/.openclaw/packages/uv/ ``` -OpenClaw gateway 和管理控制台里的 OpenClaw CLI 调用都会使用同一组派生环境:`OPENCLAW_HOME=/var/aios`、`OPENCLAW_STATE_DIR=/var/aios/.openclaw`、`OPENCLAW_CONFIG_PATH=/var/aios/.openclaw/openclaw.json`。在容器内手工排查 `openclaw gateway status --json` 时也要带上这组变量;否则 root shell 会默认读取 `/root/.openclaw`,可能因缺少已配对的 device auth 而返回 `device identity required`。 +OpenClaw gateway 和管理控制台里的 OpenClaw CLI 调用都会使用同一组派生环境:`OPENCLAW_HOME=/var/daedalus-agent`、`OPENCLAW_STATE_DIR=/var/daedalus-agent/.openclaw`、`OPENCLAW_CONFIG_PATH=/var/daedalus-agent/.openclaw/openclaw.json`。在容器内手工排查 `openclaw gateway status --json` 时也要带上这组变量;否则 root shell 会默认读取 `/root/.openclaw`,可能因缺少已配对的 device auth 而返回 `device identity required`。 -`/var/aios/ontology` 采用永不覆盖策略:镜像内不包含 ontology 文件;启动时仅在目录不存在时创建并确保身份与权限。management console 可读写;OpenClaw 只读。 +`/var/daedalus-agent/ontology` 采用永不覆盖策略:镜像内不包含 ontology 文件;启动时仅在目录不存在时创建并确保身份与权限。management console 可读写;OpenClaw 只读。 -`aios-agent` 只允许写 `/var/aios/.openclaw/**` 和 `/var/aios/logs/**`。`/var/aios` 下其他目录对 OpenClaw 是只读或不可访问。共享访问通过统一组 `aios` 控制。 +`daedalus-agent` 只允许写 `/var/daedalus-agent/.openclaw/**` 和 `/var/daedalus-agent/logs/**`。`/var/daedalus-agent` 下其他目录对 OpenClaw 是只读或不可访问。共享访问通过统一组 `daedalus-agent` 控制。 ## 日志 -启动步骤耗时日志由 `AIOS_STARTUP_PROFILE` 控制,默认保留并输出。主要日志位于 `/var/aios/logs`: +启动步骤耗时日志由 `DA_STARTUP_PROFILE` 控制,默认保留并输出。主要日志位于 `/var/daedalus-agent/logs`: ```text mqtt-{yyyyMMdd}.log @@ -110,17 +110,17 @@ minio-{yyyyMMdd}.log kernel-{yyyyMMdd}.log apps-{yyyyMMdd}.log openclaw-{yyyyMMdd}.log -aios-management-web-{yyyyMMdd}.log -aios-apps-invoke-cli-{yyyyMMdd}.log -aios-mqtt-channel-{yyyyMMdd}.log -aios-mqtt-channel-chat-{yyyyMMdd}.log +daedalus-agent-management-web-{yyyyMMdd}.log +daedalus-agent-apps-invoke-cli-{yyyyMMdd}.log +daedalus-agent-mqtt-channel-{yyyyMMdd}.log +daedalus-agent-mqtt-channel-chat-{yyyyMMdd}.log ``` ## 服务守护 -顶层脚本守护 MQTT、MinIO、OpenClaw supervisor 和 apps supervisor。apps supervisor 内部以 `aios-svc` 守护 management web 和 `aios-apps-invoke-cli serve`;OpenClaw supervisor 内部守护 OpenClaw gateway。 +顶层脚本守护 MQTT、MinIO、OpenClaw supervisor 和 apps supervisor。apps supervisor 内部以 `daedalus-svc` 守护 management web 和 `daedalus-agent-apps-invoke-cli serve`;OpenClaw supervisor 内部守护 OpenClaw gateway。 -对话应用/业务应用所在的活字格服务器地址通过管理控制台“系统设置 -> 基础设置”统一配置。修改后管理控制台会同步维护 `AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST`:移除旧地址并加入新地址;白名单变更需重启容器后生效。OpenClaw/agent 侧仍只执行 CLI client,并连接固定内部 socket `/var/aios/run/app-invoke.sock`;真实业务系统访问由 `aios-svc` 运行的 invoke service 完成。 +对话应用/业务应用所在的活字格服务器地址通过管理控制台“系统设置 -> 基础设置”统一配置。修改后管理控制台会同步维护 `DA_INTERNAL_NETWORK_ALLOWLIST`:移除旧地址并加入新地址;白名单变更需重启容器后生效。OpenClaw/agent 侧仍只执行 CLI client,并连接固定内部 socket `/var/daedalus-agent/run/app-invoke.sock`;真实业务系统访问由 `daedalus-svc` 运行的 invoke service 完成。 ## 验收与压测 @@ -143,6 +143,8 @@ cp test/integration/config.integration.sample.json test/integration/config.integ cp test/stress/config.stress.sample.json test/stress/config.stress.json ``` +上述本地配置以及对应的 `run-state*.json`、`test/.runtime/` 已被 `.gitignore` 覆盖。真实模型密钥只能写入这些本地配置或仓库外的私有配置;不要修改并提交 suite 中的公共配置。`.env`、`.env.*` 同样默认忽略,只有脱敏的 `.env.example`、`.env.*.example` 模板允许提交。 + 运行底层集成测试脚本: ```bash diff --git a/docker/assets/config.json b/docker/assets/config.json index 22bb118f591f7abf9459c244d6a351a74b89756c..404d4f887c6caf72785901c0248249f432d69591 100644 --- a/docker/assets/config.json +++ b/docker/assets/config.json @@ -1,7 +1,7 @@ { "agents": { "defaults": { - "workspace": "/var/aios/.openclaw/workspaces/default", + "workspace": "/var/daedalus-agent/.openclaw/workspaces/default", "skipBootstrap": true } }, @@ -14,7 +14,7 @@ "memory": { "backend": "qmd", "qmd": { - "command": "/opt/aios-toolchain/bin/qmd", + "command": "/opt/daedalus-agent-toolchain/bin/qmd", "searchMode": "search", "includeDefaultMemory": false, "update": { @@ -27,15 +27,15 @@ }, "plugins": { "allow": [ - "aios-mqtt-channel" + "daedalus-agent-mqtt-channel" ], "load": { "paths": [ - "/opt/aios-seed/home/.openclaw/npm/projects/aios-mqtt-channel/node_modules/aios-mqtt-channel" + "/opt/daedalus-agent-seed/home/.openclaw/npm/projects/daedalus-agent-mqtt-channel/node_modules/daedalus-agent-mqtt-channel" ] }, "entries": { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { "enabled": true } } @@ -48,6 +48,9 @@ "dmScope": "per-channel-peer" }, "tools": { + "deny": [ + "skill_workshop" + ], "exec": { "mode": "full" } diff --git a/docker/assets/scripts/apps-startup.sh b/docker/assets/scripts/apps-startup.sh index 382da16257ea20874f7f9d5c3e3463e77b380f0c..54ee0521ab435fc07a4ec797b09e90eb3ae88ed8 100644 --- a/docker/assets/scripts/apps-startup.sh +++ b/docker/assets/scripts/apps-startup.sh @@ -3,24 +3,24 @@ set -Eeuo pipefail export TZ="${TZ:-Asia/Shanghai}" -declare -rx AIOS_ROOT="/var/aios" -AIOS_MANAGEMENT_ROOT="${AIOS_MANAGEMENT_ROOT:-${AIOS_ROOT}/management}" -declare -rx AIOS_ONTOLOGY_DIR="${AIOS_ONTOLOGY_DIR:-${AIOS_ROOT}/ontology}" -AIOS_SERVICE_USER="${AIOS_SERVICE_USER:-aios-svc}" -AIOS_SERVICE_GROUP="${AIOS_SERVICE_GROUP:-aios-svc}" -AIOS_OPENCLAW_GROUP="${AIOS_OPENCLAW_GROUP:-aios}" -AIOS_WEB_HOME="${AIOS_WEB_HOME:-/opt/aios-apps/web}" -AIOS_WEB_ENTRY="${AIOS_WEB_HOME}/server/index.js" -AIOS_INVOKE_CLI_COMMAND="${AIOS_INVOKE_CLI_COMMAND:-/opt/aios-toolchain/bin/aios-apps-invoke-cli}" -AIOS_APPS_RESTART_DELAY_SECONDS="${AIOS_APPS_RESTART_DELAY_SECONDS:-2}" -RUNTIME_ENV_JSON="${AIOS_RUNTIME_ENV_JSON:-${AIOS_ROOT}/generated/runtime-env.json}" -AIOS_LOG_DIR="${AIOS_LOG_DIR:-${AIOS_ROOT}/logs}" -LOG_DIR="${AIOS_LOG_DIR}" -AIOS_WEB_DATA_DIR="${AIOS_WEB_DATA_DIR:-${AIOS_MANAGEMENT_ROOT}/data}" -AIOS_RUN_DIR="${AIOS_RUN_DIR:-${AIOS_ROOT}/run}" -WEB_PID_FILE="${AIOS_RUN_DIR}/management-web.pid" -INVOKE_CLI_PID_FILE="${AIOS_RUN_DIR}/app-invoke.pid" -INVOKE_SOCKET_FILE="${AIOS_RUN_DIR}/app-invoke.sock" +declare -rx DA_ROOT="/var/daedalus-agent" +DA_MANAGEMENT_ROOT="${DA_MANAGEMENT_ROOT:-${DA_ROOT}/management}" +declare -rx DA_ONTOLOGY_DIR="${DA_ONTOLOGY_DIR:-${DA_ROOT}/ontology}" +DA_SERVICE_USER="${DA_SERVICE_USER:-daedalus-svc}" +DA_SERVICE_GROUP="${DA_SERVICE_GROUP:-daedalus-svc}" +DA_OPENCLAW_GROUP="${DA_OPENCLAW_GROUP:-daedalus-agent}" +DA_WEB_HOME="${DA_WEB_HOME:-/opt/daedalus-agent-apps/web}" +DA_WEB_ENTRY="${DA_WEB_HOME}/server/index.js" +DA_INVOKE_CLI_COMMAND="${DA_INVOKE_CLI_COMMAND:-/opt/daedalus-agent-toolchain/bin/daedalus-agent-apps-invoke-cli}" +DA_APPS_RESTART_DELAY_SECONDS="${DA_APPS_RESTART_DELAY_SECONDS:-2}" +RUNTIME_ENV_JSON="${DA_RUNTIME_ENV_JSON:-${DA_ROOT}/generated/runtime-env.json}" +DA_LOG_DIR="${DA_LOG_DIR:-${DA_ROOT}/logs}" +LOG_DIR="${DA_LOG_DIR}" +DA_WEB_DATA_DIR="${DA_WEB_DATA_DIR:-${DA_MANAGEMENT_ROOT}/data}" +DA_RUN_DIR="${DA_RUN_DIR:-${DA_ROOT}/run}" +WEB_PID_FILE="${DA_RUN_DIR}/management-web.pid" +INVOKE_CLI_PID_FILE="${DA_RUN_DIR}/app-invoke.pid" +INVOKE_SOCKET_FILE="${DA_RUN_DIR}/app-invoke.sock" RUNTIME_ENV_KEYS=() SHUTTING_DOWN=false STARTUP_STEP_TOTAL=8 @@ -116,7 +116,7 @@ write_daily_package_log() { local current_day log_file line local write_file=true - if [[ "${AIOS_PARENT_LOG_CAPTURE:-false}" == "true" && "$package_name" == "apps" ]]; then + if [[ "${DA_PARENT_LOG_CAPTURE:-false}" == "true" && "$package_name" == "apps" ]]; then write_file=false fi @@ -146,7 +146,7 @@ write_shell_log() { local line="$1" local log_file - if [[ "${AIOS_PARENT_LOG_CAPTURE:-false}" != "true" ]]; then + if [[ "${DA_PARENT_LOG_CAPTURE:-false}" != "true" ]]; then log_file="$(daily_package_log_file apps)" prepare_package_log_file "$log_file" write_json_log_line "$log_file" "apps" "apps.startup" "$(detect_log_level "$line")" "$line" @@ -234,7 +234,7 @@ profile_step() { local finished_at elapsed_ms shift - if [[ "$(normalize_bool "${AIOS_STARTUP_PROFILE:-true}")" != "true" ]]; then + if [[ "$(normalize_bool "${DA_STARTUP_PROFILE:-true}")" != "true" ]]; then "$@" return fi @@ -268,7 +268,7 @@ trap startup_error_trap ERR trap startup_exit_trap EXIT restart_delay_seconds() { - local delay="${AIOS_APPS_RESTART_DELAY_SECONDS}" + local delay="${DA_APPS_RESTART_DELAY_SECONDS}" delay="$(printf '%s' "$delay" | tr -d '[:space:]')" if [[ "$delay" =~ ^[0-9]+$ ]]; then @@ -280,7 +280,7 @@ restart_delay_seconds() { is_reserved_runtime_env_key() { case "$1" in - HOME|USER|LOGNAME|PATH|TZ|AIOS_ROOT|AIOS_MANAGEMENT_ROOT|AIOS_LOG_DIR|AIOS_ONTOLOGY_DIR|AIOS_SERVICE_USER|AIOS_SERVICE_GROUP|AIOS_OPENCLAW_GROUP|AIOS_WEB_HOME|AIOS_WEB_ENTRY|AIOS_INVOKE_CLI_COMMAND|AIOS_APPS_HOME|AIOS_WEB_DATA_DIR|AIOS_RUN_DIR|AIOS_RUNTIME_ENV_JSON|AIOS_APP_INVOKE_SOCKET_PATH) + HOME|USER|LOGNAME|PATH|TZ|DA_ROOT|DA_MANAGEMENT_ROOT|DA_LOG_DIR|DA_ONTOLOGY_DIR|DA_SERVICE_USER|DA_SERVICE_GROUP|DA_OPENCLAW_GROUP|DA_WEB_HOME|DA_WEB_ENTRY|DA_INVOKE_CLI_COMMAND|DA_APPS_HOME|DA_WEB_DATA_DIR|DA_RUN_DIR|DA_RUNTIME_ENV_JSON|DA_APP_INVOKE_SOCKET_PATH) return 0 ;; *) @@ -291,7 +291,7 @@ is_reserved_runtime_env_key() { is_readonly_runtime_env_key() { case "$1" in - AIOS_ROOT|AIOS_ONTOLOGY_DIR|AIOS_WEB_DATA_DIR) + DA_ROOT|DA_ONTOLOGY_DIR|DA_WEB_DATA_DIR) return 0 ;; *) @@ -302,14 +302,14 @@ is_readonly_runtime_env_key() { readonly_runtime_env_value() { case "$1" in - AIOS_ROOT) - printf '%s\n' "$AIOS_ROOT" + DA_ROOT) + printf '%s\n' "$DA_ROOT" ;; - AIOS_ONTOLOGY_DIR) - printf '%s\n' "$AIOS_ONTOLOGY_DIR" + DA_ONTOLOGY_DIR) + printf '%s\n' "$DA_ONTOLOGY_DIR" ;; - AIOS_WEB_DATA_DIR) - printf '%s\n' "$AIOS_WEB_DATA_DIR" + DA_WEB_DATA_DIR) + printf '%s\n' "$DA_WEB_DATA_DIR" ;; *) return 1 @@ -381,12 +381,12 @@ load_runtime_env_file() { } apply_runtime_defaults() { - AIOS_WEB_COMMAND="${AIOS_WEB_COMMAND:-node}" + DA_WEB_COMMAND="${DA_WEB_COMMAND:-node}" } ensure_service_directory() { local dir="$1" - local group="${AIOS_OPENCLAW_GROUP}" + local group="${DA_OPENCLAW_GROUP}" local mode="2750" local expected_mode local current @@ -401,8 +401,8 @@ ensure_service_directory() { expected_mode="${mode#0}" mkdir -p "$dir" current="$(stat -c '%U:%G:%a' "$dir" 2>/dev/null || true)" - if [[ "$current" != "${AIOS_SERVICE_USER}:${group}:${expected_mode}" ]]; then - chown "${AIOS_SERVICE_USER}:${group}" "$dir" 2>/dev/null || true + if [[ "$current" != "${DA_SERVICE_USER}:${group}:${expected_mode}" ]]; then + chown "${DA_SERVICE_USER}:${group}" "$dir" 2>/dev/null || true chmod "$mode" "$dir" 2>/dev/null || true fi } @@ -414,22 +414,22 @@ ensure_service_file() { expected_mode="${mode#0}" current="$(stat -c '%U:%G:%a' "$file" 2>/dev/null || true)" - if [[ "$current" != "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}:${expected_mode}" ]]; then - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "$file" 2>/dev/null || true + if [[ "$current" != "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}:${expected_mode}" ]]; then + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "$file" 2>/dev/null || true chmod "$mode" "$file" 2>/dev/null || true fi } ensure_shared_group_directory() { - ensure_service_directory "$1" "${AIOS_OPENCLAW_GROUP}" "${2:-2770}" + ensure_service_directory "$1" "${DA_OPENCLAW_GROUP}" "${2:-2770}" } ensure_shared_readonly_service_directory() { - ensure_service_directory "$1" "${AIOS_OPENCLAW_GROUP}" "${2:-2750}" + ensure_service_directory "$1" "${DA_OPENCLAW_GROUP}" "${2:-2750}" } ensure_shared_run_directory() { - ensure_service_directory "$1" "${AIOS_OPENCLAW_GROUP}" 2770 + ensure_service_directory "$1" "${DA_OPENCLAW_GROUP}" 2770 } ensure_shared_log_file() { @@ -439,8 +439,8 @@ ensure_shared_log_file() { expected_mode="${mode#0}" current="$(stat -c '%U:%G:%a' "$file" 2>/dev/null || true)" - if [[ "$current" != "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}:${expected_mode}" ]]; then - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "$file" 2>/dev/null || true + if [[ "$current" != "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}:${expected_mode}" ]]; then + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "$file" 2>/dev/null || true chmod "$mode" "$file" 2>/dev/null || true fi } @@ -449,9 +449,9 @@ ensure_shared_socket_file() { local file="$1" [[ -S "$file" ]] || return 1 - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "$file" 2>/dev/null || true + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "$file" 2>/dev/null || true chmod 0660 "$file" 2>/dev/null || true - [[ "$(stat -c '%U:%G:%a' "$file" 2>/dev/null || true)" == "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}:660" ]] + [[ "$(stat -c '%U:%G:%a' "$file" 2>/dev/null || true)" == "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}:660" ]] } wait_for_invoke_socket() { @@ -478,39 +478,39 @@ wait_for_invoke_socket() { } ensure_directories() { - ensure_service_directory "${AIOS_ROOT}" "${AIOS_OPENCLAW_GROUP}" 2750 - ensure_service_directory "${AIOS_MANAGEMENT_ROOT}" - ensure_service_directory "${AIOS_WEB_DATA_DIR}" - ensure_shared_readonly_service_directory "${AIOS_ONTOLOGY_DIR}" + ensure_service_directory "${DA_ROOT}" "${DA_OPENCLAW_GROUP}" 2750 + ensure_service_directory "${DA_MANAGEMENT_ROOT}" + ensure_service_directory "${DA_WEB_DATA_DIR}" + ensure_shared_readonly_service_directory "${DA_ONTOLOGY_DIR}" ensure_shared_group_directory "${LOG_DIR}" - ensure_shared_run_directory "${AIOS_RUN_DIR}" + ensure_shared_run_directory "${DA_RUN_DIR}" } seed_runtime_files() { - ensure_service_directory "${AIOS_ROOT}" "${AIOS_OPENCLAW_GROUP}" 2750 - ensure_service_directory "${AIOS_MANAGEMENT_ROOT}" - ensure_service_directory "${AIOS_WEB_DATA_DIR}" - ensure_shared_readonly_service_directory "${AIOS_ONTOLOGY_DIR}" + ensure_service_directory "${DA_ROOT}" "${DA_OPENCLAW_GROUP}" 2750 + ensure_service_directory "${DA_MANAGEMENT_ROOT}" + ensure_service_directory "${DA_WEB_DATA_DIR}" + ensure_shared_readonly_service_directory "${DA_ONTOLOGY_DIR}" ensure_shared_group_directory "${LOG_DIR}" - ensure_shared_run_directory "${AIOS_RUN_DIR}" + ensure_shared_run_directory "${DA_RUN_DIR}" } export_runtime_environment() { export TZ - export HOME="${AIOS_MANAGEMENT_ROOT}" - export USER="${AIOS_SERVICE_USER}" - export LOGNAME="${AIOS_SERVICE_USER}" - export AIOS_ROOT - export AIOS_MANAGEMENT_ROOT - export AIOS_ONTOLOGY_DIR - export AIOS_SERVICE_USER - export AIOS_SERVICE_GROUP - export AIOS_OPENCLAW_GROUP - export AIOS_LOG_DIR - export AIOS_WEB_DATA_DIR - export AIOS_RUN_DIR - export AIOS_INVOKE_CLI_COMMAND - export PATH="${AIOS_WEB_HOME}/node_modules/.bin:/opt/aios-toolchain/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + export HOME="${DA_MANAGEMENT_ROOT}" + export USER="${DA_SERVICE_USER}" + export LOGNAME="${DA_SERVICE_USER}" + export DA_ROOT + export DA_MANAGEMENT_ROOT + export DA_ONTOLOGY_DIR + export DA_SERVICE_USER + export DA_SERVICE_GROUP + export DA_OPENCLAW_GROUP + export DA_LOG_DIR + export DA_WEB_DATA_DIR + export DA_RUN_DIR + export DA_INVOKE_CLI_COMMAND + export PATH="${DA_WEB_HOME}/node_modules/.bin:/opt/daedalus-agent-toolchain/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" } build_runtime_env_args() { @@ -533,32 +533,32 @@ run_with_runtime_env() { mapfile -t runtime_env_args < <(build_runtime_env_args) ( - export HOME="${AIOS_MANAGEMENT_ROOT}" - export USER="${AIOS_SERVICE_USER}" - export LOGNAME="${AIOS_SERVICE_USER}" + export HOME="${DA_MANAGEMENT_ROOT}" + export USER="${DA_SERVICE_USER}" + export LOGNAME="${DA_SERVICE_USER}" export TZ="${TZ}" - export AIOS_ROOT - export AIOS_MANAGEMENT_ROOT="${AIOS_MANAGEMENT_ROOT}" - export AIOS_ONTOLOGY_DIR - export AIOS_LOG_DIR="${AIOS_LOG_DIR}" - export AIOS_SERVICE_USER="${AIOS_SERVICE_USER}" - export AIOS_SERVICE_GROUP="${AIOS_SERVICE_GROUP}" - export AIOS_OPENCLAW_GROUP="${AIOS_OPENCLAW_GROUP}" - export AIOS_WEB_HOME="${AIOS_WEB_HOME}" - export AIOS_INVOKE_CLI_COMMAND="${AIOS_INVOKE_CLI_COMMAND}" - export AIOS_WEB_DATA_DIR="${AIOS_WEB_DATA_DIR}" - export AIOS_RUN_DIR="${AIOS_RUN_DIR}" + export DA_ROOT + export DA_MANAGEMENT_ROOT="${DA_MANAGEMENT_ROOT}" + export DA_ONTOLOGY_DIR + export DA_LOG_DIR="${DA_LOG_DIR}" + export DA_SERVICE_USER="${DA_SERVICE_USER}" + export DA_SERVICE_GROUP="${DA_SERVICE_GROUP}" + export DA_OPENCLAW_GROUP="${DA_OPENCLAW_GROUP}" + export DA_WEB_HOME="${DA_WEB_HOME}" + export DA_INVOKE_CLI_COMMAND="${DA_INVOKE_CLI_COMMAND}" + export DA_WEB_DATA_DIR="${DA_WEB_DATA_DIR}" + export DA_RUN_DIR="${DA_RUN_DIR}" export PATH="${PATH}" for runtime_env_arg in "${runtime_env_args[@]}"; do export "${runtime_env_arg}" done - exec runuser --preserve-environment -u "${AIOS_SERVICE_USER}" -- "$@" + exec runuser --preserve-environment -u "${DA_SERVICE_USER}" -- "$@" ) } start_web() { log "starting web service" - run_with_runtime_env bash -lc "cd '${AIOS_WEB_HOME}' && exec ${AIOS_WEB_COMMAND} '${AIOS_WEB_ENTRY}'" > >(write_daily_package_log "apps" "[apps]") 2>&1 & + run_with_runtime_env bash -lc "cd '${DA_WEB_HOME}' && exec ${DA_WEB_COMMAND} '${DA_WEB_ENTRY}'" > >(write_daily_package_log "apps" "[apps]") 2>&1 & WEB_PID=$! printf '%s\n' "${WEB_PID}" > "${WEB_PID_FILE}" } @@ -566,7 +566,7 @@ start_web() { start_invoke_cli() { log "starting app invoke CLI service" rm -f "${INVOKE_SOCKET_FILE}" - run_with_runtime_env "${AIOS_INVOKE_CLI_COMMAND}" serve > >(write_daily_package_log "apps" "[apps]") 2>&1 & + run_with_runtime_env "${DA_INVOKE_CLI_COMMAND}" serve > >(write_daily_package_log "apps" "[apps]") 2>&1 & INVOKE_CLI_PID=$! wait_for_invoke_socket "${INVOKE_CLI_PID}" || true printf '%s\n' "${INVOKE_CLI_PID}" > "${INVOKE_CLI_PID_FILE}" diff --git a/docker/assets/scripts/kernel-startup.sh b/docker/assets/scripts/kernel-startup.sh index 6953128d8e6eb0dd2960cfbddc60342ad03d247a..e0eb41afb3bc40d5a40c591750089f58fbae628a 100644 --- a/docker/assets/scripts/kernel-startup.sh +++ b/docker/assets/scripts/kernel-startup.sh @@ -3,78 +3,82 @@ set -Eeuo pipefail export TZ="${TZ:-Asia/Shanghai}" -declare -rx AIOS_ROOT="/var/aios" -AIOS_KERNEL_ROOT="${AIOS_ROOT}" -AIOS_TOOLCHAIN_DIR="${AIOS_TOOLCHAIN_DIR:-/opt/aios-toolchain}" -AIOS_SERVICE_USER="${AIOS_SERVICE_USER:-aios-svc}" -AIOS_SERVICE_GROUP="${AIOS_SERVICE_GROUP:-aios-svc}" -AIOS_OPENCLAW_USER="${AIOS_OPENCLAW_USER:-aios-agent}" -AIOS_OPENCLAW_GROUP="${AIOS_OPENCLAW_GROUP:-aios}" -AIOS_DATA_DIR="${AIOS_DATA_DIR:-${AIOS_ROOT}/startup-state/data}" -AIOS_LOG_DIR="${AIOS_LOG_DIR:-${AIOS_ROOT}/logs}" -AIOS_MQTT_CHANNEL_LOG_DIR="${AIOS_MQTT_CHANNEL_LOG_DIR:-${AIOS_LOG_DIR}}" -declare -rx AIOS_ONTOLOGY_DIR="${AIOS_ONTOLOGY_DIR:-${AIOS_ROOT}/ontology}" -AIOS_OPENCLAW_HOME="${AIOS_OPENCLAW_HOME:-${AIOS_ROOT}/.openclaw}" -AIOS_OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR:-${AIOS_OPENCLAW_HOME}/workspaces/default}" -AIOS_WORKSPACE_TEMPLATES_DIR="${AIOS_WORKSPACE_TEMPLATES_DIR:-${AIOS_ROOT}/workspace-templates}" -AIOS_TMP_DIR="${AIOS_TMP_DIR:-${AIOS_OPENCLAW_HOME}/tmp}" -AIOS_KERNEL_SCRIPTS_DIR="${AIOS_SCRIPTS_DIR:-${AIOS_ROOT}/scripts}" -OPENCLAW_HOME="${OPENCLAW_HOME:-$(dirname "${AIOS_OPENCLAW_HOME}")}" -OPENCLAW_CONFIG_PATH="${AIOS_OPENCLAW_HOME}/openclaw.json" -OPENCLAW_STATE_DIR="${AIOS_OPENCLAW_HOME}" -OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR}" -SEED_HOME="${AIOS_SEED_HOME:-/opt/aios-seed/home}" +declare -rx DA_ROOT="/var/daedalus-agent" +DA_KERNEL_ROOT="${DA_ROOT}" +DA_TOOLCHAIN_DIR="${DA_TOOLCHAIN_DIR:-/opt/daedalus-agent-toolchain}" +DA_SERVICE_USER="${DA_SERVICE_USER:-daedalus-svc}" +DA_SERVICE_GROUP="${DA_SERVICE_GROUP:-daedalus-svc}" +DA_OPENCLAW_USER="${DA_OPENCLAW_USER:-daedalus-agent}" +DA_OPENCLAW_GROUP="${DA_OPENCLAW_GROUP:-daedalus-agent}" +DA_DATA_DIR="${DA_DATA_DIR:-${DA_ROOT}/startup-state/data}" +DA_LOG_DIR="${DA_LOG_DIR:-${DA_ROOT}/logs}" +DA_MQTT_CHANNEL_LOG_DIR="${DA_MQTT_CHANNEL_LOG_DIR:-${DA_LOG_DIR}}" +declare -rx DA_ONTOLOGY_DIR="${DA_ONTOLOGY_DIR:-${DA_ROOT}/ontology}" +DA_OPENCLAW_HOME="${DA_OPENCLAW_HOME:-${DA_ROOT}/.openclaw}" +DA_OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR:-${DA_OPENCLAW_HOME}/workspaces/default}" +DA_WORKSPACE_TEMPLATES_DIR="${DA_WORKSPACE_TEMPLATES_DIR:-${DA_ROOT}/workspace-templates}" +DA_TMP_DIR="${DA_TMP_DIR:-${DA_OPENCLAW_HOME}/tmp}" +DA_KERNEL_SCRIPTS_DIR="${DA_SCRIPTS_DIR:-${DA_ROOT}/scripts}" +OPENCLAW_HOME="${OPENCLAW_HOME:-$(dirname "${DA_OPENCLAW_HOME}")}" +OPENCLAW_CONFIG_PATH="${DA_OPENCLAW_HOME}/openclaw.json" +OPENCLAW_STATE_DIR="${DA_OPENCLAW_HOME}" +OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR}" +SEED_HOME="${DA_SEED_HOME:-/opt/daedalus-agent-seed/home}" SEED_OPENCLAW_HOME="${SEED_HOME}/.openclaw" SEED_OPENCLAW_STATE_DIR="${SEED_OPENCLAW_HOME}/state" SEED_NPM_ROOT="${SEED_OPENCLAW_HOME}/npm" -SEED_MQTT_PLUGIN_PATH="${SEED_NPM_ROOT}/projects/aios-mqtt-channel/node_modules/aios-mqtt-channel" -SEED_WORKSPACE_DIR="${AIOS_SEED_WORKSPACE_DIR:-/opt/aios-seed/workspace-default}" -SEED_TEMPLATES_DIR="${AIOS_SEED_TEMPLATES_DIR:-/opt/aios-seed/workspace-templates}" -SEED_SCRIPTS_DIR="/opt/aios-seed/scripts" -SEED_DATA_DIR="${AIOS_SEED_DATA_DIR:-/opt/aios-seed/data}" -SEED_UV_PACKAGE_ROOT="${AIOS_SEED_UV_PACKAGE_ROOT:-/opt/aios-seed/uv-package}" -SEED_BUILTIN_CONTENT_FINGERPRINT_FILE="${AIOS_SEED_BUILTIN_CONTENT_FINGERPRINT_FILE:-/opt/aios-seed/data/built-in-content.fingerprint}" -BUILTIN_UV_TOOL_BIN_DIR="${AIOS_BUILTIN_UV_TOOL_BIN_DIR:-${SEED_UV_PACKAGE_ROOT}/bin}" -RUNTIME_TEMPLATES_DIR="${AIOS_WORKSPACE_TEMPLATES_DIR}" -RUNTIME_CONFIG_JSON="${AIOS_RUNTIME_CONFIG_JSON:-${AIOS_ROOT}/generated/runtime-config.json}" -RUNTIME_ENV_JSON="${AIOS_RUNTIME_ENV_JSON:-${AIOS_ROOT}/generated/runtime-env.json}" -NPM_CONFIG_PREFIX="${NPM_CONFIG_PREFIX:-${AIOS_OPENCLAW_HOME}/packages/npm}" -NPM_CONFIG_CACHE="${NPM_CONFIG_CACHE:-${AIOS_OPENCLAW_HOME}/packages/npm/cache}" -UV_PACKAGE_ROOT="${UV_PACKAGE_ROOT:-${AIOS_OPENCLAW_HOME}/packages/uv}" +SEED_MQTT_PLUGIN_PATH="${SEED_NPM_ROOT}/projects/daedalus-agent-mqtt-channel/node_modules/daedalus-agent-mqtt-channel" +SEED_WORKSPACE_DIR="${DA_SEED_WORKSPACE_DIR:-/opt/daedalus-agent-seed/workspace-default}" +SEED_TEMPLATES_DIR="${DA_SEED_TEMPLATES_DIR:-/opt/daedalus-agent-seed/workspace-templates}" +SEED_SCRIPTS_DIR="/opt/daedalus-agent-seed/scripts" +SEED_DATA_DIR="${DA_SEED_DATA_DIR:-/opt/daedalus-agent-seed/data}" +SEED_UV_PACKAGE_ROOT="${DA_SEED_UV_PACKAGE_ROOT:-/opt/daedalus-agent-seed/uv-package}" +SEED_BUILTIN_CONTENT_FINGERPRINT_FILE="${DA_SEED_BUILTIN_CONTENT_FINGERPRINT_FILE:-/opt/daedalus-agent-seed/data/built-in-content.fingerprint}" +BUILTIN_UV_TOOL_BIN_DIR="${DA_BUILTIN_UV_TOOL_BIN_DIR:-${SEED_UV_PACKAGE_ROOT}/bin}" +RUNTIME_TEMPLATES_DIR="${DA_WORKSPACE_TEMPLATES_DIR}" +RUNTIME_CONFIG_JSON="${DA_RUNTIME_CONFIG_JSON:-${DA_ROOT}/generated/runtime-config.json}" +RUNTIME_ENV_JSON="${DA_RUNTIME_ENV_JSON:-${DA_ROOT}/generated/runtime-env.json}" +NPM_CONFIG_PREFIX="${NPM_CONFIG_PREFIX:-${DA_OPENCLAW_HOME}/packages/npm}" +NPM_CONFIG_CACHE="${NPM_CONFIG_CACHE:-${DA_OPENCLAW_HOME}/packages/npm/cache}" +UV_PACKAGE_ROOT="${UV_PACKAGE_ROOT:-${DA_OPENCLAW_HOME}/packages/uv}" UV_TOOL_DIR="${UV_TOOL_DIR:-${UV_PACKAGE_ROOT}/tools}" UV_TOOL_BIN_DIR="${UV_TOOL_BIN_DIR:-${UV_PACKAGE_ROOT}/bin}" UV_CACHE_DIR="${UV_CACHE_DIR:-${UV_PACKAGE_ROOT}/cache}" -PIP_PACKAGE_ROOT="${PIP_PACKAGE_ROOT:-${AIOS_OPENCLAW_HOME}/packages/pip}" +PIP_PACKAGE_ROOT="${PIP_PACKAGE_ROOT:-${DA_OPENCLAW_HOME}/packages/pip}" PIP_CACHE_DIR="${PIP_CACHE_DIR:-${PIP_PACKAGE_ROOT}/cache}" VIRTUAL_ENV="${VIRTUAL_ENV:-${PIP_PACKAGE_ROOT}/venv}" -XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${AIOS_OPENCLAW_HOME}/.config}" -XDG_CACHE_HOME="${XDG_CACHE_HOME:-${AIOS_OPENCLAW_HOME}/cache}" -TMPDIR="${TMPDIR:-${AIOS_TMP_DIR}}" -QMD_COMMAND="${QMD_COMMAND:-${AIOS_TOOLCHAIN_DIR}/bin/qmd}" -OPENCLAW_COMMAND="${OPENCLAW_COMMAND:-${AIOS_TOOLCHAIN_DIR}/bin/openclaw}" -DOCTOR_COMMAND="${DOCTOR_COMMAND:-${AIOS_TOOLCHAIN_DIR}/bin/doctor}" -OPENCLAW_PID_FILE="${AIOS_LOG_DIR}/openclaw.pid" +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${DA_OPENCLAW_HOME}/.config}" +XDG_CACHE_HOME="${XDG_CACHE_HOME:-${DA_OPENCLAW_HOME}/cache}" +TMPDIR="${TMPDIR:-${DA_TMP_DIR}}" +QMD_COMMAND="${QMD_COMMAND:-${DA_TOOLCHAIN_DIR}/bin/qmd}" +OPENCLAW_COMMAND="${OPENCLAW_COMMAND:-${DA_TOOLCHAIN_DIR}/bin/openclaw}" +DOCTOR_COMMAND="${DOCTOR_COMMAND:-${DA_TOOLCHAIN_DIR}/bin/doctor}" +OPENCLAW_PID_FILE="${DA_LOG_DIR}/openclaw.pid" OPENCLAW_RESTART_DELAY_SECONDS="${OPENCLAW_RESTART_DELAY_SECONDS:-2}" +OPENCLAW_FATAL_EXIT_CODE="${OPENCLAW_FATAL_EXIT_CODE:-78}" +OPENCLAW_MAX_RAPID_RESTARTS="${OPENCLAW_MAX_RAPID_RESTARTS:-5}" +OPENCLAW_RAPID_RESTART_WINDOW_SECONDS="${OPENCLAW_RAPID_RESTART_WINDOW_SECONDS:-60}" +OPENCLAW_MIGRATION_STAMP="${DA_OPENCLAW_HOME}/state/daedalus-agent-openclaw-migrated.version" RUNTIME_ENV_KEYS=() UV_PACKAGE_CHANGED=false UV_PACKAGE_NEEDS_REWRITE=false UV_PACKAGE_EXPECTED_STAMP="" -UV_PACKAGE_STAMP="${UV_PACKAGE_ROOT}/.aios-seed-uv-package.fingerprint" +UV_PACKAGE_STAMP="${UV_PACKAGE_ROOT}/.daedalus-agent-seed-uv-package.fingerprint" OPENCLAW_HOME_CHANGED=false -BUILTIN_CONTENT_STAMP="${AIOS_DATA_DIR}/.aios-builtin-content.fingerprint" +BUILTIN_CONTENT_STAMP="${DA_DATA_DIR}/.daedalus-agent-builtin-content.fingerprint" BUILTIN_CONTENT_CHANGED=false BUILTIN_CONTENT_FULL_SYNC=false BUILTIN_CONTENT_REPLACE_INCOMPLETE=false -OPENCLAW_PLUGIN_REGISTRY_STARTUP_STAMP="${AIOS_OPENCLAW_HOME}/state/plugin-registry-startup.fingerprint" +OPENCLAW_PLUGIN_REGISTRY_STARTUP_STAMP="${DA_OPENCLAW_HOME}/state/plugin-registry-startup.fingerprint" SEED_OPENCLAW_PLUGIN_REGISTRY_STARTUP_STAMP="${SEED_OPENCLAW_STATE_DIR}/plugin-registry-startup.fingerprint" PERMISSION_NORMALIZE_STAMP_VERSION=1 -PERMISSION_NORMALIZE_STAMP_ROOT="${AIOS_DATA_DIR}/.aios-normalized" +PERMISSION_NORMALIZE_STAMP_ROOT="${DA_DATA_DIR}/.daedalus-agent-normalized" WORKSPACE_PERMISSION_NORMALIZE_STAMP="${PERMISSION_NORMALIZE_STAMP_ROOT}/workspaces.permissions.fingerprint" TEMPLATE_PERMISSION_NORMALIZE_STAMP="${PERMISSION_NORMALIZE_STAMP_ROOT}/templates.permissions.fingerprint" -AIOS_FORCE_FULL_PERMISSION_NORMALIZE="${AIOS_FORCE_FULL_PERMISSION_NORMALIZE:-false}" -AIOS_SYNC_SEED_UV_PACKAGE="${AIOS_SYNC_SEED_UV_PACKAGE:-false}" -AIOS_LINK_SEED_SKILLS="${AIOS_LINK_SEED_SKILLS:-true}" -STARTUP_STEP_TOTAL=30 +DA_FORCE_FULL_PERMISSION_NORMALIZE="${DA_FORCE_FULL_PERMISSION_NORMALIZE:-false}" +DA_SYNC_SEED_UV_PACKAGE="${DA_SYNC_SEED_UV_PACKAGE:-false}" +DA_LINK_SEED_SKILLS="${DA_LINK_SEED_SKILLS:-true}" +STARTUP_STEP_TOTAL=31 STARTUP_STEP_INDEX=0 STARTUP_ACTIVE_STEP_INDEX=0 STARTUP_ACTIVE_STEP_NAME="" @@ -169,7 +173,7 @@ profile_step() { local finished_at elapsed_ms shift - if [[ "$(normalize_bool "${AIOS_STARTUP_PROFILE:-true}")" != "true" ]]; then + if [[ "$(normalize_bool "${DA_STARTUP_PROFILE:-true}")" != "true" ]]; then "$@" return fi @@ -204,7 +208,7 @@ trap startup_exit_trap EXIT is_reserved_runtime_env_key() { case "$1" in - HOME|USER|LOGNAME|TZ|AIOS_ROOT|AIOS_KERNEL_ROOT|AIOS_RUN_MODE|AIOS_TOOLCHAIN_DIR|AIOS_DATA_DIR|AIOS_KERNEL_DATA_DIR|AIOS_LOG_DIR|AIOS_MQTT_CHANNEL_LOG_DIR|AIOS_ONTOLOGY_DIR|AIOS_SERVICE_USER|AIOS_SERVICE_GROUP|AIOS_OPENCLAW_USER|AIOS_OPENCLAW_GROUP|AIOS_OPENCLAW_HOME|AIOS_OPENCLAW_WORKSPACE_DIR|AIOS_WORKSPACE_TEMPLATES_DIR|AIOS_TMP_DIR|OPENCLAW_HOME|OPENCLAW_CONFIG_PATH|OPENCLAW_STATE_DIR|OPENCLAW_WORKSPACE_DIR|NPM_CONFIG_PREFIX|NPM_CONFIG_CACHE|UV_PACKAGE_ROOT|UV_TOOL_DIR|UV_TOOL_BIN_DIR|UV_CACHE_DIR|PIP_PACKAGE_ROOT|PIP_CACHE_DIR|VIRTUAL_ENV|XDG_CONFIG_HOME|XDG_CACHE_HOME|TMPDIR|PATH|AGENT_BROWSER_EXECUTABLE_PATH|AIOS_BUILTIN_UV_TOOL_BIN_DIR|AIOS_OPENCLAW_SHARED_FS_PRELOAD|NODE_OPTIONS) + HOME|USER|LOGNAME|TZ|DA_ROOT|DA_KERNEL_ROOT|DA_RUN_MODE|DA_TOOLCHAIN_DIR|DA_DATA_DIR|DA_KERNEL_DATA_DIR|DA_LOG_DIR|DA_MQTT_CHANNEL_LOG_DIR|DA_ONTOLOGY_DIR|DA_SERVICE_USER|DA_SERVICE_GROUP|DA_OPENCLAW_USER|DA_OPENCLAW_GROUP|DA_OPENCLAW_HOME|DA_OPENCLAW_WORKSPACE_DIR|DA_WORKSPACE_TEMPLATES_DIR|DA_TMP_DIR|OPENCLAW_HOME|OPENCLAW_CONFIG_PATH|OPENCLAW_STATE_DIR|OPENCLAW_WORKSPACE_DIR|NPM_CONFIG_PREFIX|NPM_CONFIG_CACHE|UV_PACKAGE_ROOT|UV_TOOL_DIR|UV_TOOL_BIN_DIR|UV_CACHE_DIR|PIP_PACKAGE_ROOT|PIP_CACHE_DIR|VIRTUAL_ENV|XDG_CONFIG_HOME|XDG_CACHE_HOME|TMPDIR|PATH|AGENT_BROWSER_EXECUTABLE_PATH|DA_BUILTIN_UV_TOOL_BIN_DIR|DA_OPENCLAW_SHARED_FS_PRELOAD|NODE_OPTIONS) return 0 ;; *) @@ -215,7 +219,7 @@ is_reserved_runtime_env_key() { is_readonly_runtime_env_key() { case "$1" in - AIOS_ROOT|AIOS_DATA_DIR|AIOS_OPENCLAW_HOME|AIOS_OPENCLAW_WORKSPACE_DIR|AIOS_WORKSPACE_TEMPLATES_DIR|AIOS_ONTOLOGY_DIR|AIOS_TMP_DIR) + DA_ROOT|DA_DATA_DIR|DA_OPENCLAW_HOME|DA_OPENCLAW_WORKSPACE_DIR|DA_WORKSPACE_TEMPLATES_DIR|DA_ONTOLOGY_DIR|DA_TMP_DIR) return 0 ;; *) @@ -226,26 +230,26 @@ is_readonly_runtime_env_key() { readonly_runtime_env_value() { case "$1" in - AIOS_ROOT) - printf '%s\n' "$AIOS_ROOT" + DA_ROOT) + printf '%s\n' "$DA_ROOT" ;; - AIOS_ONTOLOGY_DIR) - printf '%s\n' "$AIOS_ONTOLOGY_DIR" + DA_ONTOLOGY_DIR) + printf '%s\n' "$DA_ONTOLOGY_DIR" ;; - AIOS_DATA_DIR) - printf '%s\n' "$AIOS_DATA_DIR" + DA_DATA_DIR) + printf '%s\n' "$DA_DATA_DIR" ;; - AIOS_OPENCLAW_HOME) - printf '%s\n' "$AIOS_OPENCLAW_HOME" + DA_OPENCLAW_HOME) + printf '%s\n' "$DA_OPENCLAW_HOME" ;; - AIOS_OPENCLAW_WORKSPACE_DIR) - printf '%s\n' "$AIOS_OPENCLAW_WORKSPACE_DIR" + DA_OPENCLAW_WORKSPACE_DIR) + printf '%s\n' "$DA_OPENCLAW_WORKSPACE_DIR" ;; - AIOS_WORKSPACE_TEMPLATES_DIR) - printf '%s\n' "$AIOS_WORKSPACE_TEMPLATES_DIR" + DA_WORKSPACE_TEMPLATES_DIR) + printf '%s\n' "$DA_WORKSPACE_TEMPLATES_DIR" ;; - AIOS_TMP_DIR) - printf '%s\n' "$AIOS_TMP_DIR" + DA_TMP_DIR) + printf '%s\n' "$DA_TMP_DIR" ;; *) return 1 @@ -262,7 +266,7 @@ normalize_bool() { daily_package_log_file() { local package_name="$1" - printf '%s/%s-%s.log\n' "$AIOS_LOG_DIR" "$package_name" "$(date +%Y%m%d)" + printf '%s/%s-%s.log\n' "$DA_LOG_DIR" "$package_name" "$(date +%Y%m%d)" } daily_package_log_file_in_dir() { @@ -282,9 +286,9 @@ prepare_package_log_file() { } prepare_mqtt_channel_log_files() { - prepare_package_log_file "$(daily_package_log_file_in_dir "$AIOS_MQTT_CHANNEL_LOG_DIR" aios-mqtt-channel)" - prepare_package_log_file "$(daily_package_log_file_in_dir "$AIOS_MQTT_CHANNEL_LOG_DIR" aios-mqtt-channel-chat)" - ensure_shared_runtime_directory "${AIOS_OPENCLAW_HOME}/logs" + prepare_package_log_file "$(daily_package_log_file_in_dir "$DA_MQTT_CHANNEL_LOG_DIR" daedalus-agent-mqtt-channel)" + prepare_package_log_file "$(daily_package_log_file_in_dir "$DA_MQTT_CHANNEL_LOG_DIR" daedalus-agent-mqtt-channel-chat)" + ensure_shared_runtime_directory "${DA_OPENCLAW_HOME}/logs" } json_log_timestamp() { @@ -358,7 +362,7 @@ write_daily_package_log() { local extra_log_file="" local write_file=true - if [[ "${AIOS_PARENT_LOG_CAPTURE:-false}" == "true" && "$package_name" == "kernel" ]]; then + if [[ "${DA_PARENT_LOG_CAPTURE:-false}" == "true" && "$package_name" == "kernel" ]]; then write_file=false fi @@ -399,7 +403,7 @@ write_shell_log() { local line="$1" local log_file - if [[ "${AIOS_PARENT_LOG_CAPTURE:-false}" != "true" ]]; then + if [[ "${DA_PARENT_LOG_CAPTURE:-false}" != "true" ]]; then log_file="$(daily_package_log_file kernel)" prepare_package_log_file "$log_file" write_json_log_line "$log_file" "kernel" "kernel.startup" "$(detect_log_level "$line")" "$line" @@ -684,7 +688,7 @@ function normalizeAllowlistEntry(rawEntry) { } function readAllowlistEntries() { - return splitRaw(env("AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST")); + return splitRaw(env("DA_INTERNAL_NETWORK_ALLOWLIST")); } try { @@ -832,19 +836,19 @@ enforce_agent_internal_network_block() { local allowed_endpoints local allowed_cidrs - agent_uid="$(id -u "$AIOS_OPENCLAW_USER" 2>/dev/null)" \ - || fail_agent_internal_network_blocker "user ${AIOS_OPENCLAW_USER} does not exist" + agent_uid="$(id -u "$DA_OPENCLAW_USER" 2>/dev/null)" \ + || fail_agent_internal_network_blocker "user ${DA_OPENCLAW_USER} does not exist" allowed_endpoints="$(collect_agent_allowed_internal_tcp_endpoints)" allowed_cidrs="$(collect_agent_internal_network_allowlist_cidrs)" \ - || fail_agent_internal_network_blocker "invalid AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST" + || fail_agent_internal_network_blocker "invalid DA_INTERNAL_NETWORK_ALLOWLIST" - configure_agent_netfilter_family iptables AIOS_AGENT_INTERNAL_BLOCK "$agent_uid" AGENT_INTERNAL_IPV4_CIDRS "$allowed_endpoints" "$allowed_cidrs" ipv4 - configure_agent_netfilter_family ip6tables AIOS_AGENT_INTERNAL_BLOCK6 "$agent_uid" AGENT_INTERNAL_IPV6_CIDRS "$allowed_endpoints" "$allowed_cidrs" ipv6 + configure_agent_netfilter_family iptables DA_INTERNAL_BLOCK "$agent_uid" AGENT_INTERNAL_IPV4_CIDRS "$allowed_endpoints" "$allowed_cidrs" ipv4 + configure_agent_netfilter_family ip6tables DA_INTERNAL_BLOCK6 "$agent_uid" AGENT_INTERNAL_IPV6_CIDRS "$allowed_endpoints" "$allowed_cidrs" ipv6 if [[ -n "$allowed_endpoints" ]]; then - log "agent internal network block installed for ${AIOS_OPENCLAW_USER} uid ${agent_uid}; allowed endpoints: $(printf '%s' "$allowed_endpoints" | tr '\n' ';')" + log "agent internal network block installed for ${DA_OPENCLAW_USER} uid ${agent_uid}; allowed endpoints: $(printf '%s' "$allowed_endpoints" | tr '\n' ';')" else - log "agent internal network block installed for ${AIOS_OPENCLAW_USER} uid ${agent_uid}; no internal MQTT/S3 endpoints detected" + log "agent internal network block installed for ${DA_OPENCLAW_USER} uid ${agent_uid}; no internal MQTT/S3 endpoints detected" fi if [[ -n "$allowed_cidrs" ]]; then log "allowed networks: $(printf '%s' "$allowed_cidrs" | tr '\n' ';')" @@ -922,7 +926,7 @@ move_replaced_builtin_child() { fi ensure_seed_target_directory "$(dirname "$target_child")" - replacement_root="${AIOS_DATA_DIR}/.aios-replaced/$(date +%Y%m%d%H%M%S)-$$" + replacement_root="${DA_DATA_DIR}/.daedalus-agent-replaced/$(date +%Y%m%d%H%M%S)-$$" replacement_target="${replacement_root}/$(basename "$target_child")" ensure_service_directory "$replacement_root" if mv "$target_child" "$replacement_target" 2>/dev/null; then @@ -978,10 +982,10 @@ ensure_seed_target_directory() { "$RUNTIME_TEMPLATES_DIR"|"$RUNTIME_TEMPLATES_DIR"/*) ensure_shared_readonly_service_directory "$target" ;; - "$AIOS_KERNEL_SCRIPTS_DIR"|"$AIOS_KERNEL_SCRIPTS_DIR"/*|"$AIOS_DATA_DIR"|"$AIOS_DATA_DIR"/*) + "$DA_KERNEL_SCRIPTS_DIR"|"$DA_KERNEL_SCRIPTS_DIR"/*|"$DA_DATA_DIR"|"$DA_DATA_DIR"/*) ensure_service_directory "$target" ;; - "$AIOS_OPENCLAW_HOME/agents"|"$AIOS_OPENCLAW_HOME/agents"/*|"$AIOS_OPENCLAW_HOME/skills"|"$AIOS_OPENCLAW_HOME/skills"/*|"$AIOS_OPENCLAW_HOME/workspaces"|"$AIOS_OPENCLAW_HOME/workspaces"/*|"$AIOS_OPENCLAW_HOME/plugins"|"$AIOS_OPENCLAW_HOME/plugins"/*|"$AIOS_OPENCLAW_HOME/.clawhub"|"$AIOS_OPENCLAW_HOME/.clawhub"/*|"$NPM_CONFIG_PREFIX"|"$NPM_CONFIG_PREFIX"/*|"$UV_PACKAGE_ROOT"|"$UV_PACKAGE_ROOT"/*|"$PIP_PACKAGE_ROOT"|"$PIP_PACKAGE_ROOT"/*) + "$DA_OPENCLAW_HOME/agents"|"$DA_OPENCLAW_HOME/agents"/*|"$DA_OPENCLAW_HOME/skills"|"$DA_OPENCLAW_HOME/skills"/*|"$DA_OPENCLAW_HOME/workspaces"|"$DA_OPENCLAW_HOME/workspaces"/*|"$DA_OPENCLAW_HOME/plugins"|"$DA_OPENCLAW_HOME/plugins"/*|"$DA_OPENCLAW_HOME/.clawhub"|"$DA_OPENCLAW_HOME/.clawhub"/*|"$NPM_CONFIG_PREFIX"|"$NPM_CONFIG_PREFIX"/*|"$UV_PACKAGE_ROOT"|"$UV_PACKAGE_ROOT"/*|"$PIP_PACKAGE_ROOT"|"$PIP_PACKAGE_ROOT"/*) ensure_shared_runtime_directory "$target" ;; *) @@ -997,10 +1001,10 @@ normalize_seed_target() { "$RUNTIME_TEMPLATES_DIR"|"$RUNTIME_TEMPLATES_DIR"/*) normalize_shared_readonly_service_path_root "$target" ;; - "$AIOS_KERNEL_SCRIPTS_DIR"|"$AIOS_KERNEL_SCRIPTS_DIR"/*|"$AIOS_DATA_DIR"|"$AIOS_DATA_DIR"/*) + "$DA_KERNEL_SCRIPTS_DIR"|"$DA_KERNEL_SCRIPTS_DIR"/*|"$DA_DATA_DIR"|"$DA_DATA_DIR"/*) normalize_service_path "$target" ;; - "$AIOS_OPENCLAW_HOME/agents"|"$AIOS_OPENCLAW_HOME/agents"/*|"$AIOS_OPENCLAW_HOME/skills"|"$AIOS_OPENCLAW_HOME/skills"/*|"$AIOS_OPENCLAW_HOME/workspaces"|"$AIOS_OPENCLAW_HOME/workspaces"/*|"$AIOS_OPENCLAW_HOME/plugins"|"$AIOS_OPENCLAW_HOME/plugins"/*|"$AIOS_OPENCLAW_HOME/.clawhub"|"$AIOS_OPENCLAW_HOME/.clawhub"/*|"$NPM_CONFIG_PREFIX"|"$NPM_CONFIG_PREFIX"/*|"$UV_PACKAGE_ROOT"|"$UV_PACKAGE_ROOT"/*|"$PIP_PACKAGE_ROOT"|"$PIP_PACKAGE_ROOT"/*) + "$DA_OPENCLAW_HOME/agents"|"$DA_OPENCLAW_HOME/agents"/*|"$DA_OPENCLAW_HOME/skills"|"$DA_OPENCLAW_HOME/skills"/*|"$DA_OPENCLAW_HOME/workspaces"|"$DA_OPENCLAW_HOME/workspaces"/*|"$DA_OPENCLAW_HOME/plugins"|"$DA_OPENCLAW_HOME/plugins"/*|"$DA_OPENCLAW_HOME/.clawhub"|"$DA_OPENCLAW_HOME/.clawhub"/*|"$NPM_CONFIG_PREFIX"|"$NPM_CONFIG_PREFIX"/*|"$UV_PACKAGE_ROOT"|"$UV_PACKAGE_ROOT"/*|"$PIP_PACKAGE_ROOT"|"$PIP_PACKAGE_ROOT"/*) normalize_shared_runtime_path_root "$target" ;; *) @@ -1060,7 +1064,7 @@ link_builtin_child_replace() { fi if ln -s "$src_child" "$target_child"; then - chown -h "${AIOS_OPENCLAW_USER}:${AIOS_OPENCLAW_GROUP}" "$target_child" 2>/dev/null || true + chown -h "${DA_OPENCLAW_USER}:${DA_OPENCLAW_GROUP}" "$target_child" 2>/dev/null || true else log "warning: unable to link built-in content from ${src_child} to ${target_child}" BUILTIN_CONTENT_REPLACE_INCOMPLETE=true @@ -1070,8 +1074,8 @@ link_builtin_child_replace() { builtin_child_matches_source() { local src_child="$1" local target_child="$2" - local src_stamp="${src_child}/.aios-builtin.fingerprint" - local target_stamp="${target_child}/.aios-builtin.fingerprint" + local src_stamp="${src_child}/.daedalus-agent-builtin.fingerprint" + local target_stamp="${target_child}/.daedalus-agent-builtin.fingerprint" if [[ ! -e "$target_child" ]]; then return 1 @@ -1097,7 +1101,7 @@ builtin_child_matches_source() { } cleanup_replaced_builtin_content() { - local target="${AIOS_DATA_DIR}/.aios-replaced" + local target="${DA_DATA_DIR}/.daedalus-agent-replaced" if [[ ! -d "$target" ]]; then return 0 @@ -1123,7 +1127,7 @@ sync_builtin_content_stamp() { if [[ -n "$expected_stamp" && "$expected_stamp" == "$current_stamp" ]]; then BUILTIN_CONTENT_FULL_SYNC=false if builtin_children_exist "$SEED_TEMPLATES_DIR" "$RUNTIME_TEMPLATES_DIR" \ - && builtin_children_exist "$SEED_OPENCLAW_HOME/skills" "$AIOS_OPENCLAW_HOME/skills"; then + && builtin_children_exist "$SEED_OPENCLAW_HOME/skills" "$DA_OPENCLAW_HOME/skills"; then BUILTIN_CONTENT_CHANGED=false else BUILTIN_CONTENT_CHANGED=true @@ -1287,7 +1291,7 @@ sync_missing_uv_package() { local tool_name entry_name runtime_tool_dir runtime_entry runtime_bin_path runtime_bin_target tmp_file local existing_stamp expected_stamp - if [[ "$(normalize_bool "$AIOS_SYNC_SEED_UV_PACKAGE")" != "true" ]]; then + if [[ "$(normalize_bool "$DA_SYNC_SEED_UV_PACKAGE")" != "true" ]]; then UV_PACKAGE_CHANGED=false UV_PACKAGE_NEEDS_REWRITE=false return 0 @@ -1400,43 +1404,43 @@ ensure_owned_file_mode() { } ensure_runtime_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2770}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2770}" } ensure_shared_runtime_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2770}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2770}" } ensure_runtime_file_mode() { - ensure_owned_file_mode "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-0660}" + ensure_owned_file_mode "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-0660}" } ensure_shared_runtime_file_mode() { - ensure_owned_file_mode "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-0660}" + ensure_owned_file_mode "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-0660}" } ensure_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2750}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2750}" } ensure_traversable_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2750 + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2750 } ensure_readable_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2750 + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2750 } ensure_shared_readonly_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2750}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2750}" } ensure_service_file_mode() { - ensure_owned_file_mode "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-0640}" + ensure_owned_file_mode "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-0640}" } ensure_shared_readonly_service_file_mode() { - ensure_owned_file_mode "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-0640}" + ensure_owned_file_mode "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-0640}" } normalize_runtime_path_root() { @@ -1496,7 +1500,7 @@ normalize_root_with_permission_stamp() { local expected_stamp="$3" local root_normalizer="$4" - if [[ "$(normalize_bool "$AIOS_FORCE_FULL_PERMISSION_NORMALIZE")" != "true" ]] \ + if [[ "$(normalize_bool "$DA_FORCE_FULL_PERMISSION_NORMALIZE")" != "true" ]] \ && permission_normalize_stamp_matches "$stamp_file" "$expected_stamp"; then log "skipping permission normalize for ${target}; stamp unchanged" "$root_normalizer" "$target" @@ -1511,9 +1515,9 @@ workspace_permission_normalize_stamp_content() { { printf 'version=%s\n' "$PERMISSION_NORMALIZE_STAMP_VERSION" printf 'kind=agent-workspaces\n' - printf 'target=%s\n' "${AIOS_OPENCLAW_HOME}/workspaces" - printf 'owner=%s\n' "$AIOS_SERVICE_USER" - printf 'group=%s\n' "$AIOS_OPENCLAW_GROUP" + printf 'target=%s\n' "${DA_OPENCLAW_HOME}/workspaces" + printf 'owner=%s\n' "$DA_SERVICE_USER" + printf 'group=%s\n' "$DA_OPENCLAW_GROUP" printf 'dir_mode=2770\n' printf 'agents_md_mode=0640\n' printf 'exec_file_mode=0770\n' @@ -1526,8 +1530,8 @@ template_permission_normalize_stamp_content() { printf 'version=%s\n' "$PERMISSION_NORMALIZE_STAMP_VERSION" printf 'kind=workspace-templates\n' printf 'target=%s\n' "$RUNTIME_TEMPLATES_DIR" - printf 'owner=%s\n' "$AIOS_SERVICE_USER" - printf 'group=%s\n' "$AIOS_OPENCLAW_GROUP" + printf 'owner=%s\n' "$DA_SERVICE_USER" + printf 'group=%s\n' "$DA_OPENCLAW_GROUP" printf 'dir_mode=2750\n' printf 'exec_file_mode=0750\n' printf 'file_mode=0640\n' @@ -1543,11 +1547,11 @@ normalize_agent_workspace_root() { fi if [[ -d "$target" ]]; then - ensure_owned_directory "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2770 + ensure_owned_directory "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2770 return 0 fi - ensure_owned_file_mode "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 0660 + ensure_owned_file_mode "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 0660 } normalize_shared_runtime_path_root_compat() { @@ -1573,22 +1577,22 @@ normalize_agent_workspace_path_root() { fi if [[ -d "$target" ]]; then - ensure_owned_directory "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2770 + ensure_owned_directory "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2770 return 0 fi if [[ "$(basename "$target")" == "AGENTS.md" ]]; then - ensure_owned_file_mode "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 0640 + ensure_owned_file_mode "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 0640 elif [[ -x "$target" ]]; then - ensure_owned_file_mode "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 0770 + ensure_owned_file_mode "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 0770 else - ensure_owned_file_mode "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 0660 + ensure_owned_file_mode "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 0660 fi } normalize_agent_workspace_tree_with_stamp() { normalize_root_with_permission_stamp \ - "${AIOS_OPENCLAW_HOME}/workspaces" \ + "${DA_OPENCLAW_HOME}/workspaces" \ "$WORKSPACE_PERMISSION_NORMALIZE_STAMP" \ "$(workspace_permission_normalize_stamp_content)" \ normalize_agent_workspace_root @@ -1680,17 +1684,17 @@ normalize_openclaw_home_metadata() { local shared_dir local shared_file - ensure_shared_runtime_directory "$AIOS_OPENCLAW_HOME" + ensure_shared_runtime_directory "$DA_OPENCLAW_HOME" local shared_dirs=( - "${AIOS_OPENCLAW_HOME}/agents" - "${AIOS_OPENCLAW_HOME}/skills" - "${AIOS_OPENCLAW_HOME}/workspaces" - "${AIOS_OPENCLAW_HOME}/plugins" - "${AIOS_OPENCLAW_HOME}/.clawhub" - "${AIOS_OPENCLAW_HOME}/devices" - "${AIOS_OPENCLAW_HOME}/devices/pairing" - "${AIOS_OPENCLAW_HOME}/identity" + "${DA_OPENCLAW_HOME}/agents" + "${DA_OPENCLAW_HOME}/skills" + "${DA_OPENCLAW_HOME}/workspaces" + "${DA_OPENCLAW_HOME}/plugins" + "${DA_OPENCLAW_HOME}/.clawhub" + "${DA_OPENCLAW_HOME}/devices" + "${DA_OPENCLAW_HOME}/devices/pairing" + "${DA_OPENCLAW_HOME}/identity" "$NPM_CONFIG_PREFIX" "$NPM_CONFIG_CACHE" "$UV_PACKAGE_ROOT" @@ -1711,14 +1715,14 @@ normalize_openclaw_home_metadata() { done local shared_files=( - "${AIOS_OPENCLAW_HOME}/openclaw.json" - "${AIOS_OPENCLAW_HOME}/plugins/installs.json" - "${AIOS_OPENCLAW_HOME}/update-check.json" - "${AIOS_OPENCLAW_HOME}/.clawhub/lock.json" - "${AIOS_OPENCLAW_HOME}/devices/pairing/device-auth.json" - "${AIOS_OPENCLAW_HOME}/devices/pairing/paired.json" - "${AIOS_OPENCLAW_HOME}/devices/pairing/pending.json" - "${AIOS_OPENCLAW_HOME}/identity/identity.json" + "${DA_OPENCLAW_HOME}/openclaw.json" + "${DA_OPENCLAW_HOME}/plugins/installs.json" + "${DA_OPENCLAW_HOME}/update-check.json" + "${DA_OPENCLAW_HOME}/.clawhub/lock.json" + "${DA_OPENCLAW_HOME}/devices/pairing/device-auth.json" + "${DA_OPENCLAW_HOME}/devices/pairing/paired.json" + "${DA_OPENCLAW_HOME}/devices/pairing/pending.json" + "${DA_OPENCLAW_HOME}/identity/identity.json" ) for shared_file in "${shared_files[@]}"; do ensure_shared_runtime_file_mode "$shared_file" @@ -1729,7 +1733,7 @@ normalize_openclaw_home_metadata() { normalize_seed_mqtt_plugin_ownership() { local plugin_path="$SEED_MQTT_PLUGIN_PATH" - local project_path="${SEED_NPM_ROOT}/projects/aios-mqtt-channel" + local project_path="${SEED_NPM_ROOT}/projects/daedalus-agent-mqtt-channel" local node_modules_path="${project_path}/node_modules" local current="" @@ -1739,15 +1743,15 @@ normalize_seed_mqtt_plugin_ownership() { current="$(stat -c '%U:%G' "$plugin_path" 2>/dev/null || true)" - ensure_owned_directory "$project_path" root "$AIOS_OPENCLAW_GROUP" 0750 - ensure_owned_directory "$node_modules_path" root "$AIOS_OPENCLAW_GROUP" 0750 - ensure_owned_directory "$plugin_path" root "$AIOS_OPENCLAW_GROUP" 0750 + ensure_owned_directory "$project_path" root "$DA_OPENCLAW_GROUP" 0750 + ensure_owned_directory "$node_modules_path" root "$DA_OPENCLAW_GROUP" 0750 + ensure_owned_directory "$plugin_path" root "$DA_OPENCLAW_GROUP" 0750 - if [[ "$current" == "root:${AIOS_OPENCLAW_GROUP}" ]]; then + if [[ "$current" == "root:${DA_OPENCLAW_GROUP}" ]]; then return 0 fi - if chown -R root:"$AIOS_OPENCLAW_GROUP" "$plugin_path" 2>/dev/null; then + if chown -R root:"$DA_OPENCLAW_GROUP" "$plugin_path" 2>/dev/null; then log "normalized seed MQTT plugin ownership for ${plugin_path}" else log "warning: unable to normalize seed MQTT plugin ownership for ${plugin_path}" @@ -1778,7 +1782,7 @@ normalize_uv_package_tree() { done < <(find "$UV_TOOL_DIR" -mindepth 2 -maxdepth 2 -type f -name 'uv-receipt.toml' -print0 2>/dev/null) while IFS= read -r -d '' link_path; do - chown -h "${AIOS_OPENCLAW_USER}:${AIOS_OPENCLAW_GROUP}" "$link_path" 2>/dev/null || true + chown -h "${DA_OPENCLAW_USER}:${DA_OPENCLAW_GROUP}" "$link_path" 2>/dev/null || true done < <(find "$UV_TOOL_DIR" "$UV_TOOL_BIN_DIR" -maxdepth 2 -type l -print0 2>/dev/null) if [[ -n "$UV_PACKAGE_EXPECTED_STAMP" ]]; then @@ -1812,7 +1816,7 @@ write_executable_file() { cat >"$target" </dev/null || true)" + openclaw_version="$(run_with_runtime_env "$DA_OPENCLAW_USER" "$OPENCLAW_COMMAND" --version 2>/dev/null || true)" { printf 'version=%s\n' "$openclaw_version" @@ -1873,7 +1877,7 @@ refresh_openclaw_plugin_registry() { return 0 fi - run_with_runtime_env "$AIOS_OPENCLAW_USER" "$OPENCLAW_COMMAND" plugins registry --refresh >/dev/null + run_with_runtime_env "$DA_OPENCLAW_USER" "$OPENCLAW_COMMAND" plugins registry --refresh >/dev/null write_shared_runtime_file "$OPENCLAW_PLUGIN_REGISTRY_STARTUP_STAMP" "$current_fingerprint" } @@ -1914,13 +1918,13 @@ start_openclaw_skill_seed() { return 0 fi - ensure_shared_runtime_directory "$AIOS_OPENCLAW_HOME/skills" - if [[ "$(normalize_bool "$AIOS_LINK_SEED_SKILLS")" == "true" ]]; then + ensure_shared_runtime_directory "$DA_OPENCLAW_HOME/skills" + if [[ "$(normalize_bool "$DA_LINK_SEED_SKILLS")" == "true" ]]; then log "linking shared skills" - link_builtin_children_if_needed "$SEED_OPENCLAW_HOME/skills" "$AIOS_OPENCLAW_HOME/skills" + link_builtin_children_if_needed "$SEED_OPENCLAW_HOME/skills" "$DA_OPENCLAW_HOME/skills" else log "syncing shared skills" - sync_builtin_children_replace_if_needed "$SEED_OPENCLAW_HOME/skills" "$AIOS_OPENCLAW_HOME/skills" + sync_builtin_children_replace_if_needed "$SEED_OPENCLAW_HOME/skills" "$DA_OPENCLAW_HOME/skills" fi } @@ -1952,25 +1956,25 @@ require_runtime_input_files() { ensure_runtime_env_defaults() { local temp_env - if jq -e 'has("AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST") and has("AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT")' "$RUNTIME_ENV_JSON" >/dev/null; then + if jq -e 'has("DA_INTERNAL_NETWORK_ALLOWLIST") and has("DA_OPENCLAW_GATEWAY_MAX_CONCURRENT")' "$RUNTIME_ENV_JSON" >/dev/null; then return fi temp_env="${RUNTIME_ENV_JSON}.tmp.$$" jq ' - (if has("AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST") then . else . + { "AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST": "" } end) - | (if has("AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT") then . else . + { "AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT": "16" } end) + (if has("DA_INTERNAL_NETWORK_ALLOWLIST") then . else . + { "DA_INTERNAL_NETWORK_ALLOWLIST": "" } end) + | (if has("DA_OPENCLAW_GATEWAY_MAX_CONCURRENT") then . else . + { "DA_OPENCLAW_GATEWAY_MAX_CONCURRENT": "16" } end) ' "$RUNTIME_ENV_JSON" > "$temp_env" mv "$temp_env" "$RUNTIME_ENV_JSON" ensure_service_file_mode "$RUNTIME_ENV_JSON" 0640 } normalize_openclaw_gateway_max_concurrent() { - local value="${AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT:-16}" + local value="${DA_OPENCLAW_GATEWAY_MAX_CONCURRENT:-16}" if [[ ! "$value" =~ ^[1-9][0-9]*$ ]]; then - startup_step_error "AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT must be a positive integer" - printf '[startup] AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT must be a positive integer, got: %s\n' "$value" >&2 + startup_step_error "DA_OPENCLAW_GATEWAY_MAX_CONCURRENT must be a positive integer" + printf '[startup] DA_OPENCLAW_GATEWAY_MAX_CONCURRENT must be a positive integer, got: %s\n' "$value" >&2 return 1 fi @@ -2032,21 +2036,21 @@ load_runtime_env_file() { ensure_directories() { local service_dirs=( - "$AIOS_KERNEL_SCRIPTS_DIR" - "$AIOS_DATA_DIR" + "$DA_KERNEL_SCRIPTS_DIR" + "$DA_DATA_DIR" ) local shared_readonly_service_dirs=( "$RUNTIME_TEMPLATES_DIR" - "$AIOS_ONTOLOGY_DIR" + "$DA_ONTOLOGY_DIR" ) local agent_dirs=( ) local shared_agent_dirs=( - "$AIOS_OPENCLAW_HOME" - "$AIOS_OPENCLAW_HOME/agents" - "$AIOS_OPENCLAW_HOME/skills" - "$AIOS_OPENCLAW_HOME/workspaces" - "$AIOS_OPENCLAW_WORKSPACE_DIR" + "$DA_OPENCLAW_HOME" + "$DA_OPENCLAW_HOME/agents" + "$DA_OPENCLAW_HOME/skills" + "$DA_OPENCLAW_HOME/workspaces" + "$DA_OPENCLAW_WORKSPACE_DIR" "$NPM_CONFIG_PREFIX" "$NPM_CONFIG_CACHE" "$UV_PACKAGE_ROOT" @@ -2059,13 +2063,13 @@ ensure_directories() { "$XDG_CONFIG_HOME" "$XDG_CONFIG_HOME/clawhub" "$XDG_CACHE_HOME" - "$AIOS_TMP_DIR" - "$AIOS_LOG_DIR" - "$AIOS_MQTT_CHANNEL_LOG_DIR" + "$DA_TMP_DIR" + "$DA_LOG_DIR" + "$DA_MQTT_CHANNEL_LOG_DIR" ) local dir - ensure_traversable_service_directory "$AIOS_ROOT" + ensure_traversable_service_directory "$DA_ROOT" for dir in "${service_dirs[@]}"; do ensure_service_directory "$dir" done @@ -2082,20 +2086,20 @@ ensure_directories() { seed_runtime_content() { profile_step "seed.sync_builtin_content_stamp" sync_builtin_content_stamp - profile_step "seed.sync_openclaw_home" sync_missing_openclaw_home "$SEED_OPENCLAW_HOME" "$AIOS_OPENCLAW_HOME" - profile_step "seed.sync_workspace" sync_missing_tree "$SEED_WORKSPACE_DIR" "$AIOS_OPENCLAW_WORKSPACE_DIR" + profile_step "seed.sync_openclaw_home" sync_missing_openclaw_home "$SEED_OPENCLAW_HOME" "$DA_OPENCLAW_HOME" + profile_step "seed.sync_workspace" sync_missing_tree "$SEED_WORKSPACE_DIR" "$DA_OPENCLAW_WORKSPACE_DIR" profile_step "seed.sync_templates" sync_builtin_children_replace_if_needed "$SEED_TEMPLATES_DIR" "$RUNTIME_TEMPLATES_DIR" - profile_step "seed.sync_scripts" sync_missing_tree "$SEED_SCRIPTS_DIR" "$AIOS_KERNEL_SCRIPTS_DIR" - profile_step "seed.sync_data" sync_missing_tree "$SEED_DATA_DIR" "$AIOS_DATA_DIR" + profile_step "seed.sync_scripts" sync_missing_tree "$SEED_SCRIPTS_DIR" "$DA_KERNEL_SCRIPTS_DIR" + profile_step "seed.sync_data" sync_missing_tree "$SEED_DATA_DIR" "$DA_DATA_DIR" profile_step "seed.sync_uv_package" sync_missing_uv_package "$SEED_UV_PACKAGE_ROOT" "$UV_PACKAGE_ROOT" profile_step "seed.rewrite_uv_paths" rewrite_uv_tool_install_paths profile_step "seed.normalize_openclaw_metadata" normalize_openclaw_home_metadata profile_step "seed.normalize_workspace_root" normalize_agent_workspace_tree_with_stamp profile_step "seed.normalize_templates_root" normalize_templates_tree_with_stamp - profile_step "seed.normalize_data_root" normalize_service_path "$AIOS_DATA_DIR" - profile_step "seed.ensure_ontology_root" ensure_shared_readonly_service_directory "$AIOS_ONTOLOGY_DIR" - profile_step "seed.normalize_scripts_root" normalize_service_path "$AIOS_KERNEL_SCRIPTS_DIR" - profile_step "seed.normalize_script_line_endings" normalize_shell_script_line_endings "$AIOS_KERNEL_SCRIPTS_DIR" + profile_step "seed.normalize_data_root" normalize_service_path "$DA_DATA_DIR" + profile_step "seed.ensure_ontology_root" ensure_shared_readonly_service_directory "$DA_ONTOLOGY_DIR" + profile_step "seed.normalize_scripts_root" normalize_service_path "$DA_KERNEL_SCRIPTS_DIR" + profile_step "seed.normalize_script_line_endings" normalize_shell_script_line_endings "$DA_KERNEL_SCRIPTS_DIR" profile_step "seed.normalize_uv_package" normalize_uv_package_tree "$UV_PACKAGE_ROOT" profile_step "seed.start_skill_seed" start_openclaw_skill_seed profile_step "seed.write_builtin_content_stamp" write_builtin_content_stamp @@ -2139,7 +2143,7 @@ export PIP_DISABLE_PIP_VERSION_CHECK=1 exec /usr/bin/python3 "$@"' cp "${python_shim}" "${python3_shim}" - chown "${AIOS_OPENCLAW_USER}:${AIOS_OPENCLAW_GROUP}" "${python3_shim}" + chown "${DA_OPENCLAW_USER}:${DA_OPENCLAW_GROUP}" "${python3_shim}" chmod 0775 "${python3_shim}" write_executable_file "${pip_shim}" 0775 \ @@ -2152,7 +2156,7 @@ export PIP_DISABLE_PIP_VERSION_CHECK=1 exec /usr/bin/python3 -m pip "$@"' cp "${pip_shim}" "${pip3_shim}" - chown "${AIOS_OPENCLAW_USER}:${AIOS_OPENCLAW_GROUP}" "${pip3_shim}" + chown "${DA_OPENCLAW_USER}:${DA_OPENCLAW_GROUP}" "${pip3_shim}" chmod 0775 "${pip3_shim}" fi @@ -2160,10 +2164,10 @@ exec /usr/bin/python3 -m pip "$@"' } patch_openclaw_config() { - local config_path="${AIOS_OPENCLAW_HOME}/openclaw.json" + local config_path="${DA_OPENCLAW_HOME}/openclaw.json" local config_source="$RUNTIME_CONFIG_JSON" local tmp_json - local gateway_auth_token="${AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN:-aios-local-gateway-token}" + local gateway_auth_token="${DA_OPENCLAW_GATEWAY_AUTH_TOKEN:-daedalus-agent-local-gateway-token}" local gateway_max_concurrent mkdir -p "$(dirname "$config_path")" @@ -2174,7 +2178,7 @@ patch_openclaw_config() { ' .memory.backend == "qmd" and .gateway.mode == "local" - and (.plugins.entries["aios-mqtt-channel"].enabled == true) + and (.plugins.entries["daedalus-agent-mqtt-channel"].enabled == true) and ((.plugins.load.paths // []) | index($seedMqttPluginPath) != null) ' "$config_path" >/dev/null 2>&1; then config_source="$config_path" @@ -2182,7 +2186,7 @@ patch_openclaw_config() { tmp_json="$(mktemp "${config_path}.tmp.XXXXXX")" if ! jq \ - --arg workspace "$AIOS_OPENCLAW_WORKSPACE_DIR" \ + --arg workspace "$DA_OPENCLAW_WORKSPACE_DIR" \ --arg qmdCommand "$QMD_COMMAND" \ --arg gatewayAuthToken "$gateway_auth_token" \ --arg seedMqttPluginPath "$SEED_MQTT_PLUGIN_PATH" \ @@ -2213,23 +2217,54 @@ patch_openclaw_config() { | .memory.qmd.includeDefaultMemory = false | .memory.qmd.update.startup = "idle" | .memory.qmd.limits.timeoutMs = 120000 - | .plugins.allow = ((.plugins.allow // []) + ["aios-mqtt-channel"] | unique) + | .plugins.bundledDiscovery = (.plugins.bundledDiscovery // "compat") + | .plugins.allow = ((.plugins.allow // []) + ["daedalus-agent-mqtt-channel"] | unique) | .plugins.load.paths = ((.plugins.load.paths // []) + [$seedMqttPluginPath] | unique) - | .plugins.entries["aios-mqtt-channel"].enabled = true + | .plugins.entries["daedalus-agent-mqtt-channel"].enabled = true ' "$config_source" > "$tmp_json"; then rm -f "$tmp_json" return 1 fi ensure_shared_runtime_file_mode "$tmp_json" - if ! runuser -u "$AIOS_SERVICE_USER" -- test -r "$tmp_json"; then + if ! runuser -u "$DA_SERVICE_USER" -- test -r "$tmp_json"; then rm -f "$tmp_json" - startup_step_error "patched OpenClaw config is not readable by ${AIOS_SERVICE_USER}: ${config_path}" + startup_step_error "patched OpenClaw config is not readable by ${DA_SERVICE_USER}: ${config_path}" return 1 fi mv -f -- "$tmp_json" "$config_path" ensure_shared_runtime_file_mode "$config_path" } +migrate_openclaw_state() { + local current_version previous_version migration_log + + current_version="$(run_with_runtime_env "$DA_OPENCLAW_USER" "$OPENCLAW_COMMAND" --version)" + previous_version="$(cat "$OPENCLAW_MIGRATION_STAMP" 2>/dev/null || true)" + if [[ -n "$current_version" && "$current_version" == "$previous_version" ]]; then + log "skipping OpenClaw state migration; version unchanged: ${current_version}" + return 0 + fi + + migration_log="$(mktemp "${DA_TMP_DIR}/openclaw-migration.XXXXXX.log")" + if ! run_with_runtime_env "$DA_OPENCLAW_USER" "$OPENCLAW_COMMAND" doctor --non-interactive >"$migration_log" 2>&1; then + sed 's/^/[openclaw-migration] /' "$migration_log" >&2 + rm -f "$migration_log" + startup_step_error "OpenClaw state migration failed for ${current_version}" + return 1 + fi + + sed 's/^/[openclaw-migration] /' "$migration_log" + if grep -Eiq 'blocked plugin candidate|unknown channel id' "$migration_log"; then + rm -f "$migration_log" + startup_step_error "OpenClaw migration detected a blocked or missing channel plugin" + return 1 + fi + rm -f "$migration_log" + + write_shared_runtime_file "$OPENCLAW_MIGRATION_STAMP" "$current_version" + log "OpenClaw state migration completed: ${previous_version:-unversioned} -> ${current_version}" +} + seed_openclaw_plugin_registry_cache() { local seed_registry_db="${SEED_OPENCLAW_STATE_DIR}/openclaw.sqlite" local seed_registry_stamp="$SEED_OPENCLAW_PLUGIN_REGISTRY_STARTUP_STAMP" @@ -2254,24 +2289,24 @@ export_runtime_environment() { fi export TZ - export AIOS_ROOT - export AIOS_KERNEL_ROOT - export AIOS_RUN_MODE="${AIOS_RUN_MODE:-}" - export AIOS_TOOLCHAIN_DIR - export AIOS_DATA_DIR - export AIOS_KERNEL_DATA_DIR="$AIOS_DATA_DIR" - export AIOS_LOG_DIR - export AIOS_MQTT_CHANNEL_LOG_DIR - export AIOS_ONTOLOGY_DIR - export AIOS_TMP_DIR - export AIOS_SERVICE_USER - export AIOS_SERVICE_GROUP - export AIOS_OPENCLAW_USER - export AIOS_OPENCLAW_GROUP - export HOME="$AIOS_OPENCLAW_HOME" - export AIOS_OPENCLAW_HOME - export AIOS_OPENCLAW_WORKSPACE_DIR - export AIOS_WORKSPACE_TEMPLATES_DIR + export DA_ROOT + export DA_KERNEL_ROOT + export DA_RUN_MODE="${DA_RUN_MODE:-}" + export DA_TOOLCHAIN_DIR + export DA_DATA_DIR + export DA_KERNEL_DATA_DIR="$DA_DATA_DIR" + export DA_LOG_DIR + export DA_MQTT_CHANNEL_LOG_DIR + export DA_ONTOLOGY_DIR + export DA_TMP_DIR + export DA_SERVICE_USER + export DA_SERVICE_GROUP + export DA_OPENCLAW_USER + export DA_OPENCLAW_GROUP + export HOME="$DA_OPENCLAW_HOME" + export DA_OPENCLAW_HOME + export DA_OPENCLAW_WORKSPACE_DIR + export DA_WORKSPACE_TEMPLATES_DIR export OPENCLAW_HOME export OPENCLAW_CONFIG_PATH export OPENCLAW_STATE_DIR @@ -2300,7 +2335,7 @@ build_runtime_path() { "${NPM_CONFIG_PREFIX}/bin" "${VIRTUAL_ENV}/bin" "${UV_TOOL_BIN_DIR}" - "${AIOS_TOOLCHAIN_DIR}/bin" + "${DA_TOOLCHAIN_DIR}/bin" "${SEED_NPM_ROOT}/bin" "${SEED_NPM_ROOT}/node_modules/.bin" ) @@ -2350,32 +2385,32 @@ run_with_runtime_env() { shift local runtime_env_args=() local runtime_env_arg - local runtime_home="$AIOS_OPENCLAW_HOME" + local runtime_home="$DA_OPENCLAW_HOME" mapfile -t runtime_env_args < <(build_runtime_env_args) ( - export AIOS_ROOT - export AIOS_KERNEL_ROOT="$AIOS_KERNEL_ROOT" - export AIOS_RUN_MODE="${AIOS_RUN_MODE:-}" + export DA_ROOT + export DA_KERNEL_ROOT="$DA_KERNEL_ROOT" + export DA_RUN_MODE="${DA_RUN_MODE:-}" export TZ="$TZ" - export AIOS_TOOLCHAIN_DIR="$AIOS_TOOLCHAIN_DIR" - export AIOS_DATA_DIR="$AIOS_DATA_DIR" - export AIOS_KERNEL_DATA_DIR="$AIOS_DATA_DIR" - export AIOS_LOG_DIR="$AIOS_LOG_DIR" - export AIOS_MQTT_CHANNEL_LOG_DIR="$AIOS_MQTT_CHANNEL_LOG_DIR" - export AIOS_ONTOLOGY_DIR - export AIOS_TMP_DIR="$AIOS_TMP_DIR" - export AIOS_SERVICE_USER="$AIOS_SERVICE_USER" - export AIOS_SERVICE_GROUP="$AIOS_SERVICE_GROUP" - export AIOS_OPENCLAW_USER="$AIOS_OPENCLAW_USER" - export AIOS_OPENCLAW_GROUP="$AIOS_OPENCLAW_GROUP" + export DA_TOOLCHAIN_DIR="$DA_TOOLCHAIN_DIR" + export DA_DATA_DIR="$DA_DATA_DIR" + export DA_KERNEL_DATA_DIR="$DA_DATA_DIR" + export DA_LOG_DIR="$DA_LOG_DIR" + export DA_MQTT_CHANNEL_LOG_DIR="$DA_MQTT_CHANNEL_LOG_DIR" + export DA_ONTOLOGY_DIR + export DA_TMP_DIR="$DA_TMP_DIR" + export DA_SERVICE_USER="$DA_SERVICE_USER" + export DA_SERVICE_GROUP="$DA_SERVICE_GROUP" + export DA_OPENCLAW_USER="$DA_OPENCLAW_USER" + export DA_OPENCLAW_GROUP="$DA_OPENCLAW_GROUP" export HOME="$runtime_home" export USER="$runtime_user" export LOGNAME="$runtime_user" - export AIOS_OPENCLAW_HOME="$AIOS_OPENCLAW_HOME" - export AIOS_OPENCLAW_WORKSPACE_DIR="$AIOS_OPENCLAW_WORKSPACE_DIR" - export AIOS_WORKSPACE_TEMPLATES_DIR="$AIOS_WORKSPACE_TEMPLATES_DIR" + export DA_OPENCLAW_HOME="$DA_OPENCLAW_HOME" + export DA_OPENCLAW_WORKSPACE_DIR="$DA_OPENCLAW_WORKSPACE_DIR" + export DA_WORKSPACE_TEMPLATES_DIR="$DA_WORKSPACE_TEMPLATES_DIR" export OPENCLAW_HOME="$OPENCLAW_HOME" export OPENCLAW_CONFIG_PATH="$OPENCLAW_CONFIG_PATH" export OPENCLAW_STATE_DIR="$OPENCLAW_STATE_DIR" @@ -2392,7 +2427,7 @@ run_with_runtime_env() { export XDG_CONFIG_HOME="$XDG_CONFIG_HOME" export XDG_CACHE_HOME="$XDG_CACHE_HOME" export TMPDIR="$TMPDIR" - export AIOS_BUILTIN_UV_TOOL_BIN_DIR="$BUILTIN_UV_TOOL_BIN_DIR" + export DA_BUILTIN_UV_TOOL_BIN_DIR="$BUILTIN_UV_TOOL_BIN_DIR" export PATH="$PATH" export AGENT_BROWSER_EXECUTABLE_PATH="${AGENT_BROWSER_EXECUTABLE_PATH:-}" export OPENCLAW_COMMAND="$OPENCLAW_COMMAND" @@ -2400,22 +2435,22 @@ run_with_runtime_env() { export QMD_EMBED_MODEL="${QMD_EMBED_MODEL:-}" export QMD_RERANK_MODEL="${QMD_RERANK_MODEL:-}" export QMD_GENERATE_MODEL="${QMD_GENERATE_MODEL:-}" - export AIOS_MQTT_CHANNEL_BROKER="${AIOS_MQTT_CHANNEL_BROKER:-}" - export AIOS_MQTT_CHANNEL_USERNAME="${AIOS_MQTT_CHANNEL_USERNAME:-}" - export AIOS_MQTT_CHANNEL_PASSWORD="${AIOS_MQTT_CHANNEL_PASSWORD:-}" - export AIOS_ADMIN_INBOUND_TOPIC="${AIOS_ADMIN_INBOUND_TOPIC:-}" - export AIOS_ADMIN_OUTBOUND_TOPIC="${AIOS_ADMIN_OUTBOUND_TOPIC:-}" - export AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE="${AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE:-}" - export AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE="${AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE:-}" + export DA_MQTT_CHANNEL_BROKER="${DA_MQTT_CHANNEL_BROKER:-}" + export DA_MQTT_CHANNEL_USERNAME="${DA_MQTT_CHANNEL_USERNAME:-}" + export DA_MQTT_CHANNEL_PASSWORD="${DA_MQTT_CHANNEL_PASSWORD:-}" + export DA_ADMIN_INBOUND_TOPIC="${DA_ADMIN_INBOUND_TOPIC:-}" + export DA_ADMIN_OUTBOUND_TOPIC="${DA_ADMIN_OUTBOUND_TOPIC:-}" + export DA_CHANNEL_INBOUND_TOPIC_TEMPLATE="${DA_CHANNEL_INBOUND_TOPIC_TEMPLATE:-}" + export DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE="${DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE:-}" for runtime_env_arg in "${runtime_env_args[@]}"; do export "${runtime_env_arg}" done - AIOS_OPENCLAW_SHARED_FS_PRELOAD="${AIOS_OPENCLAW_SHARED_FS_PRELOAD:-/opt/aios-assets/scripts/openclaw-shared-fs-defaults.cjs}" - export AIOS_OPENCLAW_SHARED_FS_PRELOAD - if [[ -f "$AIOS_OPENCLAW_SHARED_FS_PRELOAD" ]]; then + DA_OPENCLAW_SHARED_FS_PRELOAD="${DA_OPENCLAW_SHARED_FS_PRELOAD:-/opt/daedalus-agent-assets/scripts/openclaw-shared-fs-defaults.cjs}" + export DA_OPENCLAW_SHARED_FS_PRELOAD + if [[ -f "$DA_OPENCLAW_SHARED_FS_PRELOAD" ]]; then case " ${NODE_OPTIONS:-} " in - *" --require ${AIOS_OPENCLAW_SHARED_FS_PRELOAD} "*|*" --require=${AIOS_OPENCLAW_SHARED_FS_PRELOAD} "*) ;; - *) NODE_OPTIONS="--require ${AIOS_OPENCLAW_SHARED_FS_PRELOAD}${NODE_OPTIONS:+ ${NODE_OPTIONS}}" ;; + *" --require ${DA_OPENCLAW_SHARED_FS_PRELOAD} "*|*" --require=${DA_OPENCLAW_SHARED_FS_PRELOAD} "*) ;; + *) NODE_OPTIONS="--require ${DA_OPENCLAW_SHARED_FS_PRELOAD}${NODE_OPTIONS:+ ${NODE_OPTIONS}}" ;; esac export NODE_OPTIONS fi @@ -2425,14 +2460,14 @@ run_with_runtime_env() { } launch_openclaw() { - log "starting OpenClaw gateway as ${AIOS_OPENCLAW_USER}" - run_with_runtime_env "$AIOS_OPENCLAW_USER" "$OPENCLAW_COMMAND" gateway run --force + log "starting OpenClaw gateway as ${DA_OPENCLAW_USER}" + run_with_runtime_env "$DA_OPENCLAW_USER" "$OPENCLAW_COMMAND" gateway run --force } start_openclaw() { terminate_existing_openclaw_gateways - log "starting OpenClaw gateway as ${AIOS_OPENCLAW_USER}" - run_with_runtime_env "$AIOS_OPENCLAW_USER" "$OPENCLAW_COMMAND" gateway run --force > >(write_daily_package_log "openclaw" "[openclaw]") 2>&1 & + log "starting OpenClaw gateway as ${DA_OPENCLAW_USER}" + run_with_runtime_env "$DA_OPENCLAW_USER" "$OPENCLAW_COMMAND" gateway run --force > >(write_daily_package_log "openclaw" "[openclaw]") 2>&1 & OPENCLAW_PID=$! write_runtime_file "$OPENCLAW_PID_FILE" "$OPENCLAW_PID" } @@ -2502,6 +2537,8 @@ openclaw_supervisor_loop() { local child_pid="" local exit_code=0 local restart_delay + local started_at elapsed_seconds + local rapid_restart_count=0 local stopping=false restart_delay="$(normalize_restart_delay "$OPENCLAW_RESTART_DELAY_SECONDS" 2)" @@ -2521,6 +2558,7 @@ openclaw_supervisor_loop() { start_openclaw fi child_pid="$OPENCLAW_PID" + started_at="$SECONDS" if wait "$child_pid"; then exit_code=0 @@ -2529,11 +2567,27 @@ openclaw_supervisor_loop() { fi child_pid="" rm -f "$OPENCLAW_PID_FILE" + elapsed_seconds=$((SECONDS - started_at)) if [[ "$stopping" == "true" ]]; then break fi + if [[ "$exit_code" == "$OPENCLAW_FATAL_EXIT_CODE" ]]; then + log "OpenClaw gateway exited with fatal configuration code ${exit_code}; automatic restart disabled" + return "$exit_code" + fi + + if (( elapsed_seconds < OPENCLAW_RAPID_RESTART_WINDOW_SECONDS )); then + rapid_restart_count=$((rapid_restart_count + 1)) + else + rapid_restart_count=0 + fi + if (( rapid_restart_count >= OPENCLAW_MAX_RAPID_RESTARTS )); then + log "OpenClaw gateway rapid restart limit reached (${rapid_restart_count}); automatic restart disabled" + return "${exit_code:-1}" + fi + log "OpenClaw gateway exited with code ${exit_code}; restarting in ${restart_delay}s" sleep "$restart_delay" done @@ -2548,6 +2602,7 @@ main() { seed_runtime_content profile_step "patch_openclaw_config" patch_openclaw_config profile_step "seed.openclaw_plugin_registry_cache" seed_openclaw_plugin_registry_cache + profile_step "migrate_openclaw_state" migrate_openclaw_state profile_step "refresh_openclaw_plugin_registry" refresh_openclaw_plugin_registry profile_step "ensure_python_venv" ensure_python_venv profile_step "enforce_agent_internal_network_block" enforce_agent_internal_network_block diff --git a/docker/assets/scripts/mqtt-broker.js b/docker/assets/scripts/mqtt-broker.js index 677fe523bc70d5bf295d663fc7405a6ca0e3d1b2..c49391fa83e89f7341727aa2ec7b284f313ed044 100644 --- a/docker/assets/scripts/mqtt-broker.js +++ b/docker/assets/scripts/mqtt-broker.js @@ -2,7 +2,7 @@ const net = require("node:net"); const { createRequire } = require("node:module"); -const brokerHome = "/opt/aios/mqtt-broker"; +const brokerHome = "/opt/daedalus-agent/mqtt-broker"; const brokerRequire = createRequire(`${brokerHome}/package.json`); const { Aedes } = brokerRequire("aedes"); @@ -10,11 +10,11 @@ async function main() { const aedes = await Aedes.createBroker(); const host = "0.0.0.0"; const port = 1883; - const username = process.env.AIOS_MQTT_CHANNEL_USERNAME || "aios"; - const password = process.env.AIOS_MQTT_CHANNEL_PASSWORD; + const username = process.env.DA_MQTT_CHANNEL_USERNAME || "daedalus-agent"; + const password = process.env.DA_MQTT_CHANNEL_PASSWORD; if (!password) { - throw new Error("AIOS_MQTT_CHANNEL_PASSWORD is required"); + throw new Error("DA_MQTT_CHANNEL_PASSWORD is required"); } aedes.authenticate = (client, receivedUsername, receivedPassword, callback) => { diff --git a/docker/assets/scripts/openclaw-shared-fs-defaults.cjs b/docker/assets/scripts/openclaw-shared-fs-defaults.cjs index 77b685a0a643841dd181758bc6805c11c4782528..1ad0bdb06cf666bab028b51143c5d176294dbda2 100644 --- a/docker/assets/scripts/openclaw-shared-fs-defaults.cjs +++ b/docker/assets/scripts/openclaw-shared-fs-defaults.cjs @@ -2,8 +2,8 @@ const fs = require("node:fs"); const path = require("node:path"); const roots = [ - process.env.AIOS_OPENCLAW_HOME, - process.env.AIOS_LOG_DIR, + process.env.DA_OPENCLAW_HOME, + process.env.DA_LOG_DIR, process.env.OPENCLAW_STATE_DIR, process.env.NPM_CONFIG_PREFIX, process.env.NPM_CONFIG_CACHE, @@ -16,7 +16,7 @@ const roots = [ .map((value) => path.resolve(value)); const privateRoots = [ - process.env.AIOS_TMP_DIR, + process.env.DA_TMP_DIR, process.env.TMPDIR ] .filter((value) => typeof value === "string" && value.length > 0) diff --git a/docker/assets/scripts/startup.sh b/docker/assets/scripts/startup.sh index 791ee2b05e5f2b0c978bdf5280eada2617ed7f90..d68bb9b3ac76f72392db01d84b8b5c09650ab6ac 100644 --- a/docker/assets/scripts/startup.sh +++ b/docker/assets/scripts/startup.sh @@ -3,44 +3,44 @@ set -Eeuo pipefail export TZ="${TZ:-Asia/Shanghai}" -declare -rx AIOS_ROOT="/var/aios" -AIOS_OPENCLAW_HOME="${AIOS_ROOT}/.openclaw" -AIOS_OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_HOME}/workspaces/default" -AIOS_WORKSPACE_TEMPLATES_DIR="${AIOS_ROOT}/workspace-templates" -AIOS_ONTOLOGY_DIR="${AIOS_ROOT}/ontology" -AIOS_MANAGEMENT_ROOT="${AIOS_ROOT}/management" -AIOS_WEB_DATA_DIR="${AIOS_MANAGEMENT_ROOT}/data" -AIOS_STARTUP_STATE_DIR="${AIOS_ROOT}/startup-state" -AIOS_RUNTIME_DATA_DIR="${AIOS_STARTUP_STATE_DIR}/data" -AIOS_TMP_DIR="${AIOS_OPENCLAW_HOME}/tmp" -AIOS_SCRIPTS_DIR="${AIOS_ROOT}/scripts" -AIOS_SERVICE_USER="${AIOS_SERVICE_USER:-aios-svc}" -AIOS_SERVICE_GROUP="${AIOS_SERVICE_GROUP:-aios-svc}" -AIOS_OPENCLAW_USER="${AIOS_OPENCLAW_USER:-aios-agent}" -AIOS_OPENCLAW_GROUP="${AIOS_OPENCLAW_GROUP:-aios}" -GENERATED_DIR="${AIOS_ROOT}/generated" +declare -rx DA_ROOT="/var/daedalus-agent" +DA_OPENCLAW_HOME="${DA_ROOT}/.openclaw" +DA_OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_HOME}/workspaces/default" +DA_WORKSPACE_TEMPLATES_DIR="${DA_ROOT}/workspace-templates" +DA_ONTOLOGY_DIR="${DA_ROOT}/ontology" +DA_MANAGEMENT_ROOT="${DA_ROOT}/management" +DA_WEB_DATA_DIR="${DA_MANAGEMENT_ROOT}/data" +DA_STARTUP_STATE_DIR="${DA_ROOT}/startup-state" +DA_RUNTIME_DATA_DIR="${DA_STARTUP_STATE_DIR}/data" +DA_TMP_DIR="${DA_OPENCLAW_HOME}/tmp" +DA_SCRIPTS_DIR="${DA_ROOT}/scripts" +DA_SERVICE_USER="${DA_SERVICE_USER:-daedalus-svc}" +DA_SERVICE_GROUP="${DA_SERVICE_GROUP:-daedalus-svc}" +DA_OPENCLAW_USER="${DA_OPENCLAW_USER:-daedalus-agent}" +DA_OPENCLAW_GROUP="${DA_OPENCLAW_GROUP:-daedalus-agent}" +GENERATED_DIR="${DA_ROOT}/generated" RUNTIME_ENV_JSON="${GENERATED_DIR}/runtime-env.json" RUNTIME_CONFIG_JSON="${GENERATED_DIR}/runtime-config.json" -AIOS_LOG_DIR="${AIOS_LOG_DIR:-${AIOS_ROOT}/logs}" -LOG_DIR="${AIOS_LOG_DIR}" -MQTT_CHANNEL_LOG_DIR="${AIOS_MQTT_CHANNEL_LOG_DIR:-${LOG_DIR}}" -RUN_DIR="${AIOS_ROOT}/run" +DA_LOG_DIR="${DA_LOG_DIR:-${DA_ROOT}/logs}" +LOG_DIR="${DA_LOG_DIR}" +MQTT_CHANNEL_LOG_DIR="${DA_MQTT_CHANNEL_LOG_DIR:-${LOG_DIR}}" +RUN_DIR="${DA_ROOT}/run" INVOKE_SOCKET_FILE="${RUN_DIR}/app-invoke.sock" CONTAINER_RESTART_REQUEST_FILE="${RUN_DIR}/container-restart.request" -USER_ENV_JSON="${AIOS_ROOT}/env.json" -USER_CONFIG_JSON="${AIOS_ROOT}/config.json" -CREDENTIALS_JSON="${AIOS_ROOT}/credentials.json" -USER_AGENT_WORKSPACE_DIR="${AIOS_ROOT}/agent_workspace" -USER_STARTUP_SCRIPT="${AIOS_ROOT}/run_after_startup.sh" -LEGACY_USER_STARTUP_SCRIPT="${AIOS_ROOT}/startup.sh" -SAMPLE_STARTUP_SCRIPT="/opt/aios/sample/run_after_startup.sh" -SAMPLE_ENV_JSON="/opt/aios/sample/env.json" -SAMPLE_CONFIG_JSON="/opt/aios-assets/config.json" -KERNEL_STARTUP_SCRIPT="/opt/aios-assets/scripts/kernel-startup.sh" -APPS_STARTUP_SCRIPT="/opt/aios-assets/scripts/apps-startup.sh" -MQTT_BROKER_SCRIPT="/opt/aios-assets/scripts/mqtt-broker.js" -MINIO_DATA_DIR="${AIOS_ROOT}/minio/data" -AIOS_SERVICE_RESTART_DELAY_SECONDS="${AIOS_SERVICE_RESTART_DELAY_SECONDS:-2}" +USER_ENV_JSON="${DA_ROOT}/env.json" +USER_CONFIG_JSON="${DA_ROOT}/config.json" +CREDENTIALS_JSON="${DA_ROOT}/credentials.json" +USER_AGENT_WORKSPACE_DIR="${DA_ROOT}/agent_workspace" +USER_STARTUP_SCRIPT="${DA_ROOT}/run_after_startup.sh" +LEGACY_USER_STARTUP_SCRIPT="${DA_ROOT}/startup.sh" +SAMPLE_STARTUP_SCRIPT="/opt/daedalus-agent/sample/run_after_startup.sh" +SAMPLE_ENV_JSON="/opt/daedalus-agent/sample/env.json" +SAMPLE_CONFIG_JSON="/opt/daedalus-agent-assets/config.json" +KERNEL_STARTUP_SCRIPT="/opt/daedalus-agent-assets/scripts/kernel-startup.sh" +APPS_STARTUP_SCRIPT="/opt/daedalus-agent-assets/scripts/apps-startup.sh" +MQTT_BROKER_SCRIPT="/opt/daedalus-agent-assets/scripts/mqtt-broker.js" +MINIO_DATA_DIR="${DA_ROOT}/minio/data" +DA_SERVICE_RESTART_DELAY_SECONDS="${DA_SERVICE_RESTART_DELAY_SECONDS:-2}" MINIO_PID="" MQTT_PID="" KERNEL_PID="" @@ -61,7 +61,7 @@ STARTUP_ACTIVE_STEP_DONE=true STARTUP_SHELL_PID="${BASHPID}" log() { - printf '[aios] %s\n' "$*" + printf '[daedalus-agent] %s\n' "$*" } normalize_bool() { @@ -72,7 +72,7 @@ normalize_bool() { } restart_delay_seconds() { - local delay="${AIOS_SERVICE_RESTART_DELAY_SECONDS}" + local delay="${DA_SERVICE_RESTART_DELAY_SECONDS}" delay="$(printf '%s' "$delay" | tr -d '[:space:]')" if [[ "$delay" =~ ^[0-9]+$ ]]; then @@ -151,7 +151,7 @@ profile_step() { local finished_at elapsed_ms shift - if [[ "$(normalize_bool "${AIOS_STARTUP_PROFILE:-true}")" != "true" ]]; then + if [[ "$(normalize_bool "${DA_STARTUP_PROFILE:-true}")" != "true" ]]; then "$@" return fi @@ -217,22 +217,22 @@ start_container_restart_watcher() { require_input_files() { local seeded=false if [[ ! -f "${USER_ENV_JSON}" ]]; then - mkdir -p "${AIOS_ROOT}" + mkdir -p "${DA_ROOT}" cp "${SAMPLE_ENV_JSON}" "${USER_ENV_JSON}" seeded=true fi if [[ ! -f "${USER_CONFIG_JSON}" ]]; then - mkdir -p "${AIOS_ROOT}" + mkdir -p "${DA_ROOT}" cp "${SAMPLE_CONFIG_JSON}" "${USER_CONFIG_JSON}" seeded=true fi if [[ "${seeded}" == "true" ]]; then - startup_step_error "seeded sample config.json/env.json at ${AIOS_ROOT}; review the files and restart the container" + startup_step_error "seeded sample config.json/env.json at ${DA_ROOT}; review the files and restart the container" cat >&2 <&2 - printf '[aios] AIOS manages MQTT, MinIO, topics, and app invoke IPC internally.\n' >&2 + printf '[daedalus-agent] unsupported managed internal environment variables in %s:\n%s\n' "${USER_ENV_JSON}" "${unsupported}" >&2 + printf '[daedalus-agent] DAEDALUS_AGENT manages MQTT, MinIO, topics, and app invoke IPC internally.\n' >&2 return 1 fi } @@ -300,14 +300,14 @@ reject_unsupported_user_env() { ensure_user_env_defaults() { local temp_env - if jq -e 'has("AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST") and has("AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT")' "${USER_ENV_JSON}" >/dev/null; then + if jq -e 'has("DA_INTERNAL_NETWORK_ALLOWLIST") and has("DA_OPENCLAW_GATEWAY_MAX_CONCURRENT")' "${USER_ENV_JSON}" >/dev/null; then return fi temp_env="${USER_ENV_JSON}.tmp.$$" jq ' - (if has("AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST") then . else . + { "AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST": "" } end) - | (if has("AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT") then . else . + { "AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT": 16 } end) + (if has("DA_INTERNAL_NETWORK_ALLOWLIST") then . else . + { "DA_INTERNAL_NETWORK_ALLOWLIST": "" } end) + | (if has("DA_OPENCLAW_GATEWAY_MAX_CONCURRENT") then . else . + { "DA_OPENCLAW_GATEWAY_MAX_CONCURRENT": 16 } end) ' "${USER_ENV_JSON}" > "${temp_env}" mv "${temp_env}" "${USER_ENV_JSON}" ensure_service_file "${USER_ENV_JSON}" 0640 @@ -333,11 +333,11 @@ if (fs.existsSync(target)) { } payload.mqtt = { - username: "aios", + username: "daedalus-agent", password: payload.mqtt?.password || secret() }; payload.minio = { - username: "aios", + username: "daedalus-agent", password: payload.minio?.password || secret() }; function chinaISOString(date = new Date()) { @@ -368,29 +368,29 @@ NODE } ensure_directories() { - ensure_traversable_service_directory "${AIOS_ROOT}" + ensure_traversable_service_directory "${DA_ROOT}" ensure_service_directory "${GENERATED_DIR}" - ensure_service_directory "${AIOS_MANAGEMENT_ROOT}" - ensure_service_directory "${AIOS_WEB_DATA_DIR}" - ensure_service_directory "${AIOS_STARTUP_STATE_DIR}" - ensure_service_directory "${AIOS_RUNTIME_DATA_DIR}" - ensure_service_directory "${AIOS_SCRIPTS_DIR}" - ensure_shared_readonly_service_directory "${AIOS_ONTOLOGY_DIR}" - ensure_shared_readonly_service_directory "${AIOS_WORKSPACE_TEMPLATES_DIR}" - ensure_agent_writable_service_directory "${AIOS_OPENCLAW_HOME}" - ensure_agent_writable_service_directory "${AIOS_OPENCLAW_WORKSPACE_DIR}" - ensure_agent_writable_service_directory "${AIOS_TMP_DIR}" + ensure_service_directory "${DA_MANAGEMENT_ROOT}" + ensure_service_directory "${DA_WEB_DATA_DIR}" + ensure_service_directory "${DA_STARTUP_STATE_DIR}" + ensure_service_directory "${DA_RUNTIME_DATA_DIR}" + ensure_service_directory "${DA_SCRIPTS_DIR}" + ensure_shared_readonly_service_directory "${DA_ONTOLOGY_DIR}" + ensure_shared_readonly_service_directory "${DA_WORKSPACE_TEMPLATES_DIR}" + ensure_agent_writable_service_directory "${DA_OPENCLAW_HOME}" + ensure_agent_writable_service_directory "${DA_OPENCLAW_WORKSPACE_DIR}" + ensure_agent_writable_service_directory "${DA_TMP_DIR}" ensure_shared_log_directory "${LOG_DIR}" ensure_shared_log_directory "${MQTT_CHANNEL_LOG_DIR}" ensure_shared_run_directory "${RUN_DIR}" - mkdir -p "${AIOS_ROOT}/minio/config" "${AIOS_ROOT}/mqtt/aedes/config" "${AIOS_ROOT}/mqtt/aedes/persistence" - ensure_service_directory "${AIOS_ROOT}/minio" - ensure_service_directory "${AIOS_ROOT}/minio/config" + mkdir -p "${DA_ROOT}/minio/config" "${DA_ROOT}/mqtt/aedes/config" "${DA_ROOT}/mqtt/aedes/persistence" + ensure_service_directory "${DA_ROOT}/minio" + ensure_service_directory "${DA_ROOT}/minio/config" ensure_service_directory "${MINIO_DATA_DIR}" - ensure_service_directory "${AIOS_ROOT}/mqtt" - ensure_service_directory "${AIOS_ROOT}/mqtt/aedes" - ensure_service_directory "${AIOS_ROOT}/mqtt/aedes/config" - ensure_service_directory "${AIOS_ROOT}/mqtt/aedes/persistence" + ensure_service_directory "${DA_ROOT}/mqtt" + ensure_service_directory "${DA_ROOT}/mqtt/aedes" + ensure_service_directory "${DA_ROOT}/mqtt/aedes/config" + ensure_service_directory "${DA_ROOT}/mqtt/aedes/persistence" mkdir -p "${MINIO_DATA_DIR}" } @@ -425,16 +425,16 @@ ensure_directory_path_available() { return 0 fi - archive_root="${AIOS_STARTUP_STATE_DIR}/legacy-paths" - if [[ "$dir" == "$AIOS_STARTUP_STATE_DIR" || "$dir" == "${archive_root}"* ]]; then - archive_root="${AIOS_ROOT}/.startup-path-conflicts" + archive_root="${DA_STARTUP_STATE_DIR}/legacy-paths" + if [[ "$dir" == "$DA_STARTUP_STATE_DIR" || "$dir" == "${archive_root}"* ]]; then + archive_root="${DA_ROOT}/.startup-path-conflicts" fi mkdir -p "$archive_root" - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "$archive_root" 2>/dev/null || true + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "$archive_root" 2>/dev/null || true chmod 2750 "$archive_root" 2>/dev/null || true - archive_name="$(printf '%s' "${dir#${AIOS_ROOT}/}" | tr '/ ' '__' | tr -c 'A-Za-z0-9._-+' '_')" + archive_name="$(printf '%s' "${dir#${DA_ROOT}/}" | tr '/ ' '__' | tr -c 'A-Za-z0-9._-+' '_')" stamp="$(date '+%Y%m%dT%H%M%S%z')" archive_target="${archive_root}/${archive_name}.${stamp}" if [[ -e "$archive_target" || -L "$archive_target" ]]; then @@ -465,35 +465,35 @@ ensure_owned_file() { } ensure_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2750}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2750}" } ensure_shared_readonly_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2750}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2750}" } ensure_shared_log_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2770 + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2770 } ensure_shared_run_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2770 + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2770 } ensure_agent_writable_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-2770}" + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-2770}" } ensure_traversable_service_directory() { - ensure_owned_directory "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 2750 + ensure_owned_directory "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 2750 } ensure_service_file() { - ensure_owned_file "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-0640}" + ensure_owned_file "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-0640}" } ensure_shared_log_file() { - ensure_owned_file "$1" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" "${2:-0660}" + ensure_owned_file "$1" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" "${2:-0660}" } daily_package_log_file() { @@ -518,8 +518,8 @@ prepare_package_log_file() { } prepare_mqtt_channel_log_files() { - prepare_package_log_file "$(daily_package_log_file_in_dir "$MQTT_CHANNEL_LOG_DIR" aios-mqtt-channel)" - prepare_package_log_file "$(daily_package_log_file_in_dir "$MQTT_CHANNEL_LOG_DIR" aios-mqtt-channel-chat)" + prepare_package_log_file "$(daily_package_log_file_in_dir "$MQTT_CHANNEL_LOG_DIR" daedalus-agent-mqtt-channel)" + prepare_package_log_file "$(daily_package_log_file_in_dir "$MQTT_CHANNEL_LOG_DIR" daedalus-agent-mqtt-channel-chat)" } json_log_timestamp() { @@ -635,15 +635,15 @@ normalize_shared_readonly_service_path_root() { return 0 fi - ensure_owned_file "$target" "$AIOS_SERVICE_USER" "$AIOS_OPENCLAW_GROUP" 0640 + ensure_owned_file "$target" "$DA_SERVICE_USER" "$DA_OPENCLAW_GROUP" 0640 } sync_optional_user_files() { if [[ -d "${USER_AGENT_WORKSPACE_DIR}" ]]; then - mkdir -p "${AIOS_WORKSPACE_TEMPLATES_DIR}/default" - cp -a "${USER_AGENT_WORKSPACE_DIR}/." "${AIOS_WORKSPACE_TEMPLATES_DIR}/default/" - ensure_shared_readonly_service_directory "${AIOS_WORKSPACE_TEMPLATES_DIR}" - normalize_shared_readonly_service_path_root "${AIOS_WORKSPACE_TEMPLATES_DIR}/default" + mkdir -p "${DA_WORKSPACE_TEMPLATES_DIR}/default" + cp -a "${USER_AGENT_WORKSPACE_DIR}/." "${DA_WORKSPACE_TEMPLATES_DIR}/default/" + ensure_shared_readonly_service_directory "${DA_WORKSPACE_TEMPLATES_DIR}" + normalize_shared_readonly_service_path_root "${DA_WORKSPACE_TEMPLATES_DIR}/default" fi } @@ -668,11 +668,11 @@ ensure_default_startup_hook() { } generate_runtime_files() { - node - "${USER_ENV_JSON}" "${USER_CONFIG_JSON}" "${CREDENTIALS_JSON}" "${GENERATED_DIR}" "${AIOS_ROOT}" <<'NODE' + node - "${USER_ENV_JSON}" "${USER_CONFIG_JSON}" "${CREDENTIALS_JSON}" "${GENERATED_DIR}" "${DA_ROOT}" <<'NODE' const fs = require("node:fs"); const path = require("node:path"); -const [userEnvPath, userConfigPath, credentialsPath, generatedDir, aiosRoot] = process.argv.slice(2); +const [userEnvPath, userConfigPath, credentialsPath, generatedDir, productRoot] = process.argv.slice(2); function readJson(filePath) { return JSON.parse(fs.readFileSync(filePath, "utf8").replace(/^\uFEFF/, "")); } @@ -707,59 +707,59 @@ function positiveIntegerWithDefault(name, fallback) { return String(parsed); } -const prefix = "aios"; +const prefix = "daedalus-agent"; const mqtt = { - AIOS_MQTT_CHANNEL_BROKER: "mqtt://127.0.0.1:1883", - AIOS_MQTT_CHANNEL_USERNAME: "aios", - AIOS_MQTT_CHANNEL_PASSWORD: credentials.mqtt.password, - AIOS_ADMIN_INBOUND_TOPIC: `${prefix}/admin/inbound`, - AIOS_ADMIN_OUTBOUND_TOPIC: `${prefix}/admin/outbound`, - AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE: `${prefix}/agent/{agentId}/inbound`, - AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE: `${prefix}/agent/{agentId}/outbound` + DA_MQTT_CHANNEL_BROKER: "mqtt://127.0.0.1:1883", + DA_MQTT_CHANNEL_USERNAME: "daedalus-agent", + DA_MQTT_CHANNEL_PASSWORD: credentials.mqtt.password, + DA_ADMIN_INBOUND_TOPIC: `${prefix}/admin/inbound`, + DA_ADMIN_OUTBOUND_TOPIC: `${prefix}/admin/outbound`, + DA_CHANNEL_INBOUND_TOPIC_TEMPLATE: `${prefix}/agent/{agentId}/inbound`, + DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE: `${prefix}/agent/{agentId}/outbound` }; const s3 = { - AIOS_S3_ENDPOINT: "http://127.0.0.1:9000", - AIOS_S3_HOST: "127.0.0.1", - AIOS_S3_REGION: "local", - AIOS_S3_ACCESS_KEY_ID: "aios", - AIOS_S3_SECRET_ACCESS_KEY: credentials.minio.password, - AIOS_S3_FORCE_PATH_STYLE: "true", - AIOS_S3_ADMIN_INBOX_BUCKET: "aios-admin-inbox", - AIOS_S3_ADMIN_OUTBOX_BUCKET: "aios-admin-outbox", - AIOS_S3_AGENT_INBOX_BUCKET: "aios-agent-inbox", - AIOS_S3_AGENT_OUTBOX_BUCKET: "aios-agent-outbox" + DA_S3_ENDPOINT: "http://127.0.0.1:9000", + DA_S3_HOST: "127.0.0.1", + DA_S3_REGION: "local", + DA_S3_ACCESS_KEY_ID: "daedalus-agent", + DA_S3_SECRET_ACCESS_KEY: credentials.minio.password, + DA_S3_FORCE_PATH_STYLE: "true", + DA_S3_ADMIN_INBOX_BUCKET: "daedalus-admin-inbox", + DA_S3_ADMIN_OUTBOX_BUCKET: "daedalus-admin-outbox", + DA_S3_AGENT_INBOX_BUCKET: "daedalus-agent-inbox", + DA_S3_AGENT_OUTBOX_BUCKET: "daedalus-agent-outbox" }; const shared = { ...mqtt, ...s3, - AIOS_ROOT: aiosRoot, - AIOS_DATA_DIR: path.posix.join(aiosRoot, "startup-state/data"), - AIOS_OPENCLAW_HOME: path.posix.join(aiosRoot, ".openclaw"), - AIOS_OPENCLAW_WORKSPACE_DIR: path.posix.join(aiosRoot, ".openclaw/workspaces/default"), - AIOS_WORKSPACE_TEMPLATES_DIR: path.posix.join(aiosRoot, "workspace-templates"), - AIOS_ONTOLOGY_DIR: path.posix.join(aiosRoot, "ontology"), - AIOS_TMP_DIR: path.posix.join(aiosRoot, ".openclaw/tmp"), - AIOS_WEB_DATA_DIR: path.posix.join(aiosRoot, "management/data"), - AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST: valueWithDefault("AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST", ""), - AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT: positiveIntegerWithDefault("AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT", 16), - AIOS_MANAGEMENT_WEBSITE_TIMEOUT: String(value("AIOS_MANAGEMENT_WEBSITE_TIMEOUT", "180")), - AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS: positiveIntegerWithDefault("AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS", 60000), - AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS: positiveIntegerWithDefault("AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS", 60000), - AIOS_SYSTEM_STATUS_TIMEOUT_MS: positiveIntegerWithDefault("AIOS_SYSTEM_STATUS_TIMEOUT_MS", 5000), - AIOS_MANAGEMENT_CONSOLE_PORT: String(value("AIOS_MANAGEMENT_CONSOLE_PORT", "3030")), - PORT: String(value("AIOS_MANAGEMENT_CONSOLE_PORT", "3030")) + DA_ROOT: productRoot, + DA_DATA_DIR: path.posix.join(productRoot, "startup-state/data"), + DA_OPENCLAW_HOME: path.posix.join(productRoot, ".openclaw"), + DA_OPENCLAW_WORKSPACE_DIR: path.posix.join(productRoot, ".openclaw/workspaces/default"), + DA_WORKSPACE_TEMPLATES_DIR: path.posix.join(productRoot, "workspace-templates"), + DA_ONTOLOGY_DIR: path.posix.join(productRoot, "ontology"), + DA_TMP_DIR: path.posix.join(productRoot, ".openclaw/tmp"), + DA_WEB_DATA_DIR: path.posix.join(productRoot, "management/data"), + DA_INTERNAL_NETWORK_ALLOWLIST: valueWithDefault("DA_INTERNAL_NETWORK_ALLOWLIST", ""), + DA_OPENCLAW_GATEWAY_MAX_CONCURRENT: positiveIntegerWithDefault("DA_OPENCLAW_GATEWAY_MAX_CONCURRENT", 16), + DA_MANAGEMENT_WEBSITE_TIMEOUT: String(value("DA_MANAGEMENT_WEBSITE_TIMEOUT", "180")), + DA_SYSTEM_STATUS_INITIAL_DELAY_MS: positiveIntegerWithDefault("DA_SYSTEM_STATUS_INITIAL_DELAY_MS", 60000), + DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS: positiveIntegerWithDefault("DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS", 60000), + DA_SYSTEM_STATUS_TIMEOUT_MS: positiveIntegerWithDefault("DA_SYSTEM_STATUS_TIMEOUT_MS", 5000), + DA_MANAGEMENT_CONSOLE_PORT: String(value("DA_MANAGEMENT_CONSOLE_PORT", "3030")), + PORT: String(value("DA_MANAGEMENT_CONSOLE_PORT", "3030")) }; config.agents = config.agents || {}; config.agents.defaults = config.agents.defaults || {}; -config.agents.defaults.workspace = path.posix.join(aiosRoot, ".openclaw/workspaces/default"); +config.agents.defaults.workspace = path.posix.join(productRoot, ".openclaw/workspaces/default"); config.memory = config.memory || {}; config.memory.backend = "qmd"; config.memory.qmd = { ...(config.memory.qmd || {}), - command: "/opt/aios-toolchain/bin/qmd", + command: "/opt/daedalus-agent-toolchain/bin/qmd", searchMode: "search", includeDefaultMemory: false }; @@ -808,13 +808,13 @@ wait_for_http() { start_mqtt() { local username password - username="$(jq -r '.AIOS_MQTT_CHANNEL_USERNAME' "${RUNTIME_ENV_JSON}")" - password="$(jq -r '.AIOS_MQTT_CHANNEL_PASSWORD' "${RUNTIME_ENV_JSON}")" + username="$(jq -r '.DA_MQTT_CHANNEL_USERNAME' "${RUNTIME_ENV_JSON}")" + password="$(jq -r '.DA_MQTT_CHANNEL_PASSWORD' "${RUNTIME_ENV_JSON}")" log "starting internal MQTT broker" ( - export AIOS_MQTT_CHANNEL_USERNAME="${username}" - export AIOS_MQTT_CHANNEL_PASSWORD="${password}" + export DA_MQTT_CHANNEL_USERNAME="${username}" + export DA_MQTT_CHANNEL_PASSWORD="${password}" exec node "${MQTT_BROKER_SCRIPT}" ) > >(write_daily_package_log "mqtt") 2>&1 & MQTT_PID=$! @@ -824,8 +824,8 @@ start_mqtt() { start_minio() { local access_key secret_key - access_key="$(jq -r '.AIOS_S3_ACCESS_KEY_ID' "${RUNTIME_ENV_JSON}")" - secret_key="$(jq -r '.AIOS_S3_SECRET_ACCESS_KEY' "${RUNTIME_ENV_JSON}")" + access_key="$(jq -r '.DA_S3_ACCESS_KEY_ID' "${RUNTIME_ENV_JSON}")" + secret_key="$(jq -r '.DA_S3_SECRET_ACCESS_KEY' "${RUNTIME_ENV_JSON}")" log "starting internal MinIO" ( @@ -841,16 +841,16 @@ start_minio() { init_minio_buckets() { local access_key secret_key bucket - access_key="$(jq -r '.AIOS_S3_ACCESS_KEY_ID' "${RUNTIME_ENV_JSON}")" - secret_key="$(jq -r '.AIOS_S3_SECRET_ACCESS_KEY' "${RUNTIME_ENV_JSON}")" + access_key="$(jq -r '.DA_S3_ACCESS_KEY_ID' "${RUNTIME_ENV_JSON}")" + secret_key="$(jq -r '.DA_S3_SECRET_ACCESS_KEY' "${RUNTIME_ENV_JSON}")" log "initializing MinIO buckets" MC_HOST_local="http://${access_key}:${secret_key}@127.0.0.1:9000" \ mc mb --ignore-existing \ - "local/$(jq -r '.AIOS_S3_ADMIN_INBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ - "local/$(jq -r '.AIOS_S3_ADMIN_OUTBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ - "local/$(jq -r '.AIOS_S3_AGENT_INBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ - "local/$(jq -r '.AIOS_S3_AGENT_OUTBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ + "local/$(jq -r '.DA_S3_ADMIN_INBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ + "local/$(jq -r '.DA_S3_ADMIN_OUTBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ + "local/$(jq -r '.DA_S3_AGENT_INBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ + "local/$(jq -r '.DA_S3_AGENT_OUTBOX_BUCKET' "${RUNTIME_ENV_JSON}")" \ > >(write_daily_package_log "minio") 2>&1 } @@ -898,9 +898,9 @@ describe_app_invoke_socket() { app_invoke_socket_is_ready() { [[ -S "${INVOKE_SOCKET_FILE}" ]] || return 1 - chown "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}" "${INVOKE_SOCKET_FILE}" 2>/dev/null || true + chown "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}" "${INVOKE_SOCKET_FILE}" 2>/dev/null || true chmod 0660 "${INVOKE_SOCKET_FILE}" 2>/dev/null || true - [[ "$(stat -c '%U:%G:%a' "${INVOKE_SOCKET_FILE}" 2>/dev/null || true)" == "${AIOS_SERVICE_USER}:${AIOS_OPENCLAW_GROUP}:660" ]] + [[ "$(stat -c '%U:%G:%a' "${INVOKE_SOCKET_FILE}" 2>/dev/null || true)" == "${DA_SERVICE_USER}:${DA_OPENCLAW_GROUP}:660" ]] } kernel_log_since_start() { @@ -956,38 +956,38 @@ start_kernel() { log "starting kernel" TZ="${TZ}" \ - AIOS_SERVICE_USER="${AIOS_SERVICE_USER}" \ - AIOS_SERVICE_GROUP="${AIOS_SERVICE_GROUP}" \ - AIOS_OPENCLAW_USER="${AIOS_OPENCLAW_USER}" \ - AIOS_OPENCLAW_GROUP="${AIOS_OPENCLAW_GROUP}" \ - AIOS_DATA_DIR="${AIOS_RUNTIME_DATA_DIR}" \ - AIOS_LOG_DIR="${LOG_DIR}" \ - AIOS_MQTT_CHANNEL_LOG_DIR="${MQTT_CHANNEL_LOG_DIR}" \ - AIOS_ONTOLOGY_DIR="${AIOS_ONTOLOGY_DIR}" \ - AIOS_OPENCLAW_HOME="${AIOS_OPENCLAW_HOME}" \ - AIOS_OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR}" \ - AIOS_WORKSPACE_TEMPLATES_DIR="${AIOS_WORKSPACE_TEMPLATES_DIR}" \ - AIOS_TMP_DIR="${AIOS_TMP_DIR}" \ - AIOS_SCRIPTS_DIR="${AIOS_SCRIPTS_DIR}" \ - AIOS_RUNTIME_ENV_JSON="${RUNTIME_ENV_JSON}" \ - AIOS_RUNTIME_CONFIG_JSON="${RUNTIME_CONFIG_JSON}" \ - OPENCLAW_HOME="${AIOS_ROOT}" \ - OPENCLAW_STATE_DIR="${AIOS_OPENCLAW_HOME}" \ - OPENCLAW_CONFIG_PATH="${AIOS_OPENCLAW_HOME}/openclaw.json" \ - OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR}" \ - NPM_CONFIG_PREFIX="${AIOS_OPENCLAW_HOME}/packages/npm" \ - NPM_CONFIG_CACHE="${AIOS_OPENCLAW_HOME}/packages/npm/cache" \ - UV_PACKAGE_ROOT="${AIOS_OPENCLAW_HOME}/packages/uv" \ - UV_TOOL_DIR="${AIOS_OPENCLAW_HOME}/packages/uv/tools" \ - UV_TOOL_BIN_DIR="${AIOS_OPENCLAW_HOME}/packages/uv/bin" \ - UV_CACHE_DIR="${AIOS_OPENCLAW_HOME}/packages/uv/cache" \ - PIP_PACKAGE_ROOT="${AIOS_OPENCLAW_HOME}/packages/pip" \ - PIP_CACHE_DIR="${AIOS_OPENCLAW_HOME}/packages/pip/cache" \ - VIRTUAL_ENV="${AIOS_OPENCLAW_HOME}/packages/pip/venv" \ - XDG_CONFIG_HOME="${AIOS_OPENCLAW_HOME}/.config" \ - XDG_CACHE_HOME="${AIOS_OPENCLAW_HOME}/cache" \ - TMPDIR="${AIOS_TMP_DIR}" \ - AIOS_PARENT_LOG_CAPTURE=true \ + DA_SERVICE_USER="${DA_SERVICE_USER}" \ + DA_SERVICE_GROUP="${DA_SERVICE_GROUP}" \ + DA_OPENCLAW_USER="${DA_OPENCLAW_USER}" \ + DA_OPENCLAW_GROUP="${DA_OPENCLAW_GROUP}" \ + DA_DATA_DIR="${DA_RUNTIME_DATA_DIR}" \ + DA_LOG_DIR="${LOG_DIR}" \ + DA_MQTT_CHANNEL_LOG_DIR="${MQTT_CHANNEL_LOG_DIR}" \ + DA_ONTOLOGY_DIR="${DA_ONTOLOGY_DIR}" \ + DA_OPENCLAW_HOME="${DA_OPENCLAW_HOME}" \ + DA_OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR}" \ + DA_WORKSPACE_TEMPLATES_DIR="${DA_WORKSPACE_TEMPLATES_DIR}" \ + DA_TMP_DIR="${DA_TMP_DIR}" \ + DA_SCRIPTS_DIR="${DA_SCRIPTS_DIR}" \ + DA_RUNTIME_ENV_JSON="${RUNTIME_ENV_JSON}" \ + DA_RUNTIME_CONFIG_JSON="${RUNTIME_CONFIG_JSON}" \ + OPENCLAW_HOME="${DA_ROOT}" \ + OPENCLAW_STATE_DIR="${DA_OPENCLAW_HOME}" \ + OPENCLAW_CONFIG_PATH="${DA_OPENCLAW_HOME}/openclaw.json" \ + OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR}" \ + NPM_CONFIG_PREFIX="${DA_OPENCLAW_HOME}/packages/npm" \ + NPM_CONFIG_CACHE="${DA_OPENCLAW_HOME}/packages/npm/cache" \ + UV_PACKAGE_ROOT="${DA_OPENCLAW_HOME}/packages/uv" \ + UV_TOOL_DIR="${DA_OPENCLAW_HOME}/packages/uv/tools" \ + UV_TOOL_BIN_DIR="${DA_OPENCLAW_HOME}/packages/uv/bin" \ + UV_CACHE_DIR="${DA_OPENCLAW_HOME}/packages/uv/cache" \ + PIP_PACKAGE_ROOT="${DA_OPENCLAW_HOME}/packages/pip" \ + PIP_CACHE_DIR="${DA_OPENCLAW_HOME}/packages/pip/cache" \ + VIRTUAL_ENV="${DA_OPENCLAW_HOME}/packages/pip/venv" \ + XDG_CONFIG_HOME="${DA_OPENCLAW_HOME}/.config" \ + XDG_CACHE_HOME="${DA_OPENCLAW_HOME}/cache" \ + TMPDIR="${DA_TMP_DIR}" \ + DA_PARENT_LOG_CAPTURE=true \ /bin/bash "${KERNEL_STARTUP_SCRIPT}" > >(write_daily_package_log "kernel" "[kernel]") 2>&1 & KERNEL_PID=$! printf '%s\n' "${KERNEL_PID}" > "${RUN_DIR}/kernel.pid" @@ -1001,19 +1001,19 @@ start_apps() { log "starting apps" TZ="${TZ}" \ - AIOS_SERVICE_USER="${AIOS_SERVICE_USER}" \ - AIOS_SERVICE_GROUP="${AIOS_SERVICE_GROUP}" \ - AIOS_OPENCLAW_GROUP="${AIOS_OPENCLAW_GROUP}" \ - AIOS_WEB_HOME="/opt/aios-apps/web" \ - AIOS_INVOKE_CLI_COMMAND="/opt/aios-toolchain/bin/aios-apps-invoke-cli" \ - AIOS_APPS_HOME="/opt/aios-apps" \ - AIOS_LOG_DIR="${LOG_DIR}" \ - AIOS_ONTOLOGY_DIR="${AIOS_ONTOLOGY_DIR}" \ - AIOS_WEB_DATA_DIR="${AIOS_WEB_DATA_DIR}" \ - AIOS_MANAGEMENT_ROOT="${AIOS_MANAGEMENT_ROOT}" \ - AIOS_RUN_DIR="${RUN_DIR}" \ - AIOS_RUNTIME_ENV_JSON="${RUNTIME_ENV_JSON}" \ - AIOS_PARENT_LOG_CAPTURE=true \ + DA_SERVICE_USER="${DA_SERVICE_USER}" \ + DA_SERVICE_GROUP="${DA_SERVICE_GROUP}" \ + DA_OPENCLAW_GROUP="${DA_OPENCLAW_GROUP}" \ + DA_WEB_HOME="/opt/daedalus-agent-apps/web" \ + DA_INVOKE_CLI_COMMAND="/opt/daedalus-agent-toolchain/bin/daedalus-agent-apps-invoke-cli" \ + DA_APPS_HOME="/opt/daedalus-agent-apps" \ + DA_LOG_DIR="${LOG_DIR}" \ + DA_ONTOLOGY_DIR="${DA_ONTOLOGY_DIR}" \ + DA_WEB_DATA_DIR="${DA_WEB_DATA_DIR}" \ + DA_MANAGEMENT_ROOT="${DA_MANAGEMENT_ROOT}" \ + DA_RUN_DIR="${RUN_DIR}" \ + DA_RUNTIME_ENV_JSON="${RUNTIME_ENV_JSON}" \ + DA_PARENT_LOG_CAPTURE=true \ /bin/bash "${APPS_STARTUP_SCRIPT}" > >(write_daily_package_log "apps" "[apps]") 2>&1 & APPS_PID=$! printf '%s\n' "${APPS_PID}" > "${RUN_DIR}/apps.pid" @@ -1021,7 +1021,7 @@ start_apps() { wait_for_apps() { local port started_at web_ready invoke_ready - port="$(jq -r '.AIOS_MANAGEMENT_CONSOLE_PORT // 3030' "${RUNTIME_ENV_JSON}")" + port="$(jq -r '.DA_MANAGEMENT_CONSOLE_PORT // 3030' "${RUNTIME_ENV_JSON}")" started_at="$(date +%s)" while (( "$(date +%s)" - started_at < 120 )); do @@ -1061,16 +1061,16 @@ run_after_startup() { log "running run_after_startup hook: ${USER_STARTUP_SCRIPT}" normalize_shell_script_line_endings "${USER_STARTUP_SCRIPT}" - AIOS_OPENCLAW_HOME="${AIOS_OPENCLAW_HOME}" \ - AIOS_OPENCLAW_WORKSPACE_DIR="${AIOS_OPENCLAW_WORKSPACE_DIR}" \ - AIOS_WORKSPACE_TEMPLATES_DIR="${AIOS_WORKSPACE_TEMPLATES_DIR}" \ - AIOS_MANAGEMENT_ROOT="${AIOS_MANAGEMENT_ROOT}" \ - AIOS_WEB_DATA_DIR="${AIOS_WEB_DATA_DIR}" \ - AIOS_ONTOLOGY_DIR="${AIOS_ONTOLOGY_DIR}" \ - AIOS_LOG_DIR="${AIOS_LOG_DIR}" \ - AIOS_MQTT_CHANNEL_LOG_DIR="${MQTT_CHANNEL_LOG_DIR}" \ - AIOS_RUN_DIR="${RUN_DIR}" \ - runuser --preserve-environment -u "${AIOS_SERVICE_USER}" -- /bin/bash "${USER_STARTUP_SCRIPT}" + DA_OPENCLAW_HOME="${DA_OPENCLAW_HOME}" \ + DA_OPENCLAW_WORKSPACE_DIR="${DA_OPENCLAW_WORKSPACE_DIR}" \ + DA_WORKSPACE_TEMPLATES_DIR="${DA_WORKSPACE_TEMPLATES_DIR}" \ + DA_MANAGEMENT_ROOT="${DA_MANAGEMENT_ROOT}" \ + DA_WEB_DATA_DIR="${DA_WEB_DATA_DIR}" \ + DA_ONTOLOGY_DIR="${DA_ONTOLOGY_DIR}" \ + DA_LOG_DIR="${DA_LOG_DIR}" \ + DA_MQTT_CHANNEL_LOG_DIR="${MQTT_CHANNEL_LOG_DIR}" \ + DA_RUN_DIR="${RUN_DIR}" \ + runuser --preserve-environment -u "${DA_SERVICE_USER}" -- /bin/bash "${USER_STARTUP_SCRIPT}" } terminate_pid() { @@ -1234,7 +1234,7 @@ main() { profile_step "wait_for_kernel" wait_for_kernel profile_step "wait_for_apps" wait_for_apps profile_step "run_after_startup" run_after_startup - log "management console should be available on port $(jq -r '.AIOS_MANAGEMENT_CONSOLE_PORT // 3030' "${RUNTIME_ENV_JSON}")" + log "management console should be available on port $(jq -r '.DA_MANAGEMENT_CONSOLE_PORT // 3030' "${RUNTIME_ENV_JSON}")" supervise_children } diff --git a/docker/assets/workspace-templates/default/AGENTS.md b/docker/assets/workspace-templates/default/AGENTS.md index a9445c6cb7482d44acb40aab4746f34fbcc368c2..5329f8a3a9a0c4a9a5e2d0440e18cdcbe6fce18b 100644 --- a/docker/assets/workspace-templates/default/AGENTS.md +++ b/docker/assets/workspace-templates/default/AGENTS.md @@ -28,17 +28,17 @@ ## 业务系统优先 -- 回答问题前,需要先使用 `aios-call-app-service` 技能,优先调用现有系统接口,然后继续规划和执行。 +- 回答问题前,需要先使用 `daedalus-agent-call-app-service` 技能,优先调用现有系统接口,然后继续规划和执行。 - 不要将业务系统的调用结果和 `Ontology` 存储到记忆中。 - 禁止自行臆测、模拟、编造数据! ## 文件传输 -仅允许使用 Markdown 类型的文本与用户交流,如需传输文件需要使用 `aios-transfer-file` 技能。包括但不限于下列场景: +仅允许使用 Markdown 类型的文本与用户交流,如需传输文件需要使用 `daedalus-agent-transfer-file` 技能。包括但不限于下列场景: - 接收到的文本中包含文件 Uri(如 `file_input://` 开头)。 - 需要将文件、图片发给用户,如用户提到 `“将文件发给我”`、`“将文件传给我”` 等。 -- 如果需要发送多个文件,需要多次调用 `aios-transfer-file` 技能,分多次发送,每次仅发送一个文件。 +- 如果需要发送多个文件,需要多次调用 `daedalus-agent-transfer-file` 技能,分多次发送,每次仅发送一个文件。 ### senderId 文件隔离 @@ -58,7 +58,7 @@ OpenClaw 在 workspace 中处理生成、下载、上传文件时,必须先确 ## 图表图片 -需要把 JSON、Markdown 表格或 ECharts option 生成图表图片时,必须使用 `aios-make-chart-image` 技能。生成本地图片后,如需发送给用户,再使用 `aios-transfer-file` 技能。 +需要把 JSON、Markdown 表格或 ECharts option 生成图表图片时,必须使用 `daedalus-agent-make-chart-image` 技能。生成本地图片后,如需发送给用户,再使用 `daedalus-agent-transfer-file` 技能。 ## 网络搜索 diff --git a/docker/build-arm64.zsh b/docker/build-arm64.zsh index 714b03bbbbd01281b8cb95e55bc0244b29256ee8..81899fa17ed2c14e74fd93f19b9ecee806014356 100644 --- a/docker/build-arm64.zsh +++ b/docker/build-arm64.zsh @@ -1,8 +1,8 @@ #!/usr/bin/env zsh set -euo pipefail -image_name="${IMAGE_NAME:-aios-arm64}" -image_tag="${IMAGE_TAG:-local}" +image_name="${IMAGE_NAME:-daedalus-agent-arm64}" +image_tag="${IMAGE_TAG:-latest}" clawhub_fetch_timeout_ms="${CLAW_HUB_FETCH_TIMEOUT_MS:-180000}" no_cache=false pull=false @@ -38,8 +38,8 @@ while (( $# > 0 )); do Usage: build-arm64.zsh [options] Options: - --image-name Docker image name, default: aios-arm64 - --image-tag Shared Docker image tag, default: local + --image-name Docker image name, default: daedalus-agent-arm64 + --image-tag Shared Docker image tag, default: latest --version Alias of --image-tag --clawhub-fetch-timeout-ms ClawHub/OpenClaw request timeout, default: 180000 @@ -72,7 +72,7 @@ build_args=( --tag "${image_ref}" --platform linux/arm64 --build-arg TARGETARCH=arm64 - --build-arg "AIOS_CLAWHUB_FETCH_TIMEOUT_MS=${clawhub_fetch_timeout_ms}" + --build-arg "DA_CLAWHUB_FETCH_TIMEOUT_MS=${clawhub_fetch_timeout_ms}" ) if [[ "${no_cache}" == "true" ]]; then diff --git a/docker/build-local.sh b/docker/build-local.sh index 12138e38d0c26894697d5f3a00714b5b5018f5bc..eaf5daa9cfc60cab03e5cccd252a31bf71be8f2b 100644 --- a/docker/build-local.sh +++ b/docker/build-local.sh @@ -3,8 +3,8 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" -IMAGE_NAME="${IMAGE_NAME:-aios-arm64}" -IMAGE_TAG="${IMAGE_TAG:-local}" +IMAGE_NAME="${IMAGE_NAME:-daedalus-agent-arm64}" +IMAGE_TAG="${IMAGE_TAG:-latest}" TARGETARCH="${TARGETARCH:-arm64}" PLATFORM="${PLATFORM:-linux/${TARGETARCH}}" CLAW_HUB_FETCH_TIMEOUT_MS="${CLAW_HUB_FETCH_TIMEOUT_MS:-180000}" @@ -14,6 +14,6 @@ docker build \ -t "${IMAGE_NAME}:${IMAGE_TAG}" \ --platform "${PLATFORM}" \ --build-arg "TARGETARCH=${TARGETARCH}" \ - --build-arg "AIOS_CLAWHUB_FETCH_TIMEOUT_MS=${CLAW_HUB_FETCH_TIMEOUT_MS}" \ + --build-arg "DA_CLAWHUB_FETCH_TIMEOUT_MS=${CLAW_HUB_FETCH_TIMEOUT_MS}" \ --no-cache-filter seed-builder \ "${REPO_ROOT}" diff --git a/docker/build-x64.ps1 b/docker/build-x64.ps1 index 650093e90f44d3816ab230a7d89d4692d6f095ae..98d27323c7a20f79d48a0382fe362ad72b94ff9b 100644 --- a/docker/build-x64.ps1 +++ b/docker/build-x64.ps1 @@ -1,6 +1,6 @@ param( - [string]$ImageName = "aios-x64", - [string]$ImageTag = "local", + [string]$ImageName = "daedalus-agent-x64", + [string]$ImageTag = "latest", [string]$Version, [int]$ClawHubFetchTimeoutMs = 180000, [switch]$NoCache, @@ -32,7 +32,7 @@ $buildArgs = @( "--tag", $imageRef, "--platform", "linux/amd64", "--build-arg", "TARGETARCH=amd64", - "--build-arg", "AIOS_CLAWHUB_FETCH_TIMEOUT_MS=$ClawHubFetchTimeoutMs" + "--build-arg", "DA_CLAWHUB_FETCH_TIMEOUT_MS=$ClawHubFetchTimeoutMs" ) if ($NoCache) { diff --git a/docker/build-x64.sh b/docker/build-x64.sh new file mode 100755 index 0000000000000000000000000000000000000000..8ac8d642becb88100bc3d9de49a9abde46691365 --- /dev/null +++ b/docker/build-x64.sh @@ -0,0 +1,253 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" +DOCKERFILE="${SCRIPT_DIR}/Dockerfile" +VENDOR_ROOT="${SCRIPT_DIR}/internal/kernel/vendor" + +IMAGE_NAME="${IMAGE_NAME:-daedalus-agent-x64}" +IMAGE_TAG="${IMAGE_TAG:-latest}" +NPM_REGISTRY="${DA_BUILD_NPM_REGISTRY:-https://registry.npmjs.org}" +CLAW_HUB_FETCH_TIMEOUT_MS="${CLAW_HUB_FETCH_TIMEOUT_MS:-180000}" +DOWNLOAD_IMAGE="${DA_VENDOR_DOWNLOAD_IMAGE:-curlimages/curl:8.16.0}" +NPM_IMAGE="${DA_VENDOR_NPM_IMAGE:-node:24.18.0-bookworm-slim}" +NO_CACHE=false +PULL=false +SKIP_VENDOR=false + +usage() { + cat <<'EOF' +用法: docker/build-x64.sh [选项] + +下载构建所需的 vendor 文件,并构建 linux/amd64 Docker 镜像。 +宿主机只需安装 Docker Engine、Bash 及基础 Linux 命令。 + +选项: + --image-name <名称> 镜像名称,默认: daedalus-agent-x64 + --image-tag <标签> 镜像标签,默认: latest + --version <标签> --image-tag 的别名 + --npm-registry <地址> npm registry,默认: https://registry.npmjs.org + --clawhub-fetch-timeout-ms <毫秒> ClawHub/OpenClaw 请求超时,默认: 180000 + --skip-vendor 跳过 vendor 下载,仅构建镜像 + --no-cache 禁用 Docker 构建缓存 + --pull 更新下载工具、Node 和构建基础镜像 + -h, --help 显示帮助 + +可选环境变量: + NODE_AUTH_TOKEN 私有 npm registry 的访问令牌 + DA_VENDOR_DOWNLOAD_IMAGE 执行文件下载的容器镜像 + DA_VENDOR_NPM_IMAGE 执行 npm pack 的容器镜像 +EOF +} + +fail() { + echo "错误: $*" >&2 + exit 1 +} + +require_value() { + local option="$1" + local value="${2:-}" + [[ -n "${value}" ]] || fail "${option} 缺少参数" +} + +while (( $# > 0 )); do + case "$1" in + --image-name) + require_value "$1" "${2:-}" + IMAGE_NAME="$2" + shift 2 + ;; + --image-tag|--version) + require_value "$1" "${2:-}" + IMAGE_TAG="$2" + shift 2 + ;; + --npm-registry) + require_value "$1" "${2:-}" + NPM_REGISTRY="$2" + shift 2 + ;; + --clawhub-fetch-timeout-ms) + require_value "$1" "${2:-}" + CLAW_HUB_FETCH_TIMEOUT_MS="$2" + shift 2 + ;; + --skip-vendor) + SKIP_VENDOR=true + shift + ;; + --no-cache) + NO_CACHE=true + shift + ;; + --pull) + PULL=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + fail "未知选项: $1" + ;; + esac +done + +command -v docker >/dev/null 2>&1 || fail "未找到 docker 命令" +docker info >/dev/null 2>&1 || fail "无法连接 Docker Engine,请检查服务状态和当前用户权限" +[[ -f "${DOCKERFILE}" ]] || fail "未找到 Dockerfile: ${DOCKERFILE}" + +read_docker_arg() { + local name="$1" + local value + value="$(sed -n "s/^ARG ${name}=//p" "${DOCKERFILE}" | head -n 1)" + [[ -n "${value}" ]] || fail "Dockerfile 中未定义 ARG ${name} 的默认值" + printf '%s' "${value}" +} + +download_file() { + local url="$1" + local destination="$2" + local destination_dir + local destination_name + + if [[ -s "${destination}" ]]; then + echo "[vendor] 已存在,跳过: ${destination#"${REPO_ROOT}/"}" + return + fi + + destination_dir="$(dirname "${destination}")" + destination_name="$(basename "${destination}")" + mkdir -p "${destination_dir}" + rm -f "${destination}.part" + + echo "[vendor] 下载: ${destination_name}" + docker run --rm \ + --user "$(id -u):$(id -g)" \ + --volume "${destination_dir}:/downloads" \ + "${DOWNLOAD_IMAGE}" \ + --fail --location --retry 5 --retry-all-errors \ + --output "/downloads/${destination_name}.part" \ + "${url}" + + [[ -s "${destination}.part" ]] || fail "下载结果为空: ${destination_name}" + mv "${destination}.part" "${destination}" +} + +download_npm_package() { + local package_name="$1" + local package_version="$2" + local archive_name="$3" + local npm_vendor_dir="${VENDOR_ROOT}/npm" + local destination="${npm_vendor_dir}/${archive_name}" + local docker_args=(run --rm --user "$(id -u):$(id -g)") + + if [[ -s "${destination}" ]]; then + echo "[vendor] 已存在,跳过: ${destination#"${REPO_ROOT}/"}" + return + fi + + mkdir -p "${npm_vendor_dir}" + docker_args+=(--volume "${npm_vendor_dir}:/vendor") + docker_args+=(--env "NPM_CONFIG_REGISTRY=${NPM_REGISTRY}") + docker_args+=(--env "NPM_CONFIG_CACHE=/tmp/npm-cache") + if [[ -n "${NODE_AUTH_TOKEN:-}" ]]; then + docker_args+=(--env "NODE_AUTH_TOKEN=${NODE_AUTH_TOKEN}") + fi + docker_args+=( + "${NPM_IMAGE}" + bash -ceu ' + if [[ -n "${NODE_AUTH_TOKEN:-}" ]]; then + registry_key="${NPM_CONFIG_REGISTRY#http:}" + registry_key="${registry_key#https:}" + registry_key="${registry_key%/}/" + printf "%s:_authToken=%s\n" "${registry_key}" "${NODE_AUTH_TOKEN}" > /tmp/vendor.npmrc + export NPM_CONFIG_USERCONFIG=/tmp/vendor.npmrc + fi + npm pack "$1@$2" --pack-destination /vendor + ' + -- "${package_name}" "${package_version}" + ) + + echo "[vendor] npm pack: ${package_name}@${package_version}" + docker "${docker_args[@]}" + [[ -s "${destination}" ]] || fail "npm pack 未生成预期文件: ${destination}" +} + +prepare_vendor() { + local openclaw_version + local clawhub_version + local qmd_version + local agent_browser_version + local mcporter_version + local chrome_version="147.0.7727.57" + + openclaw_version="$(read_docker_arg OPENCLAW_VERSION)" + clawhub_version="$(read_docker_arg CLAWHUB_VERSION)" + qmd_version="$(read_docker_arg QMD_VERSION)" + agent_browser_version="$(read_docker_arg AGENT_BROWSER_VERSION)" + mcporter_version="$(read_docker_arg MCPORTER_VERSION)" + + download_npm_package "openclaw" "${openclaw_version}" "openclaw-${openclaw_version}.tgz" + download_npm_package "clawhub" "${clawhub_version}" "clawhub-${clawhub_version}.tgz" + download_npm_package "@tobilu/qmd" "${qmd_version}" "tobilu-qmd-${qmd_version}.tgz" + download_npm_package "mcporter" "${mcporter_version}" "mcporter-${mcporter_version}.tgz" + download_npm_package "agent-browser" "${agent_browser_version}" "agent-browser-${agent_browser_version}.tgz" + + download_file \ + "https://storage.googleapis.com/chrome-for-testing-public/${chrome_version}/linux64/chrome-linux64.zip" \ + "${VENDOR_ROOT}/chrome/${chrome_version}/chrome-linux64.zip" + download_file \ + "https://huggingface.co/ggml-org/embeddinggemma-300M-GGUF/resolve/main/embeddinggemma-300M-Q8_0.gguf" \ + "${VENDOR_ROOT}/qmd-models/embeddinggemma-300M-Q8_0.gguf" + download_file \ + "https://huggingface.co/ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/resolve/main/qwen3-reranker-0.6b-q8_0.gguf" \ + "${VENDOR_ROOT}/qmd-models/qwen3-reranker-0.6b-q8_0.gguf" + download_file \ + "https://huggingface.co/tobil/qmd-query-expansion-1.7B-gguf/resolve/main/qmd-query-expansion-1.7B-q4_k_m.gguf" \ + "${VENDOR_ROOT}/qmd-models/qmd-query-expansion-1.7B-q4_k_m.gguf" +} + +if [[ "${PULL}" == "true" ]]; then + echo "[准备] 更新下载和 npm 工具镜像" + docker pull --platform linux/amd64 "${DOWNLOAD_IMAGE}" + docker pull --platform linux/amd64 "${NPM_IMAGE}" +fi + +if [[ "${SKIP_VENDOR}" == "false" ]]; then + prepare_vendor +fi + +IMAGE_REF="${IMAGE_NAME}:${IMAGE_TAG}" +build_args=( + build + --file "${DOCKERFILE}" + --tag "${IMAGE_REF}" + --platform linux/amd64 + --build-arg TARGETARCH=amd64 + --build-arg "DA_BUILD_NPM_REGISTRY=${NPM_REGISTRY}" + --build-arg "DA_CLAWHUB_FETCH_TIMEOUT_MS=${CLAW_HUB_FETCH_TIMEOUT_MS}" +) + +if [[ "${NO_CACHE}" == "true" ]]; then + build_args+=(--no-cache) +else + build_args+=(--no-cache-filter seed-builder) +fi + +if [[ "${PULL}" == "true" ]]; then + build_args+=(--pull) +fi + +build_args+=("${REPO_ROOT}") + +echo "[构建] ${IMAGE_REF} (linux/amd64)" +docker "${build_args[@]}" + +actual_arch="$(docker image inspect "${IMAGE_REF}" --format '{{.Architecture}}')" +[[ "${actual_arch}" == "amd64" ]] || fail "镜像架构不是 amd64,而是 ${actual_arch}" + +echo "[完成] 已生成 x64 镜像: ${IMAGE_REF}" diff --git a/docker/docs/3rd-party-interactive-solution.md b/docker/docs/3rd-party-interactive-solution.md index e0b7a0b927228f1012d442c94f0dd067f2d31012..f407f40c5af4d6eccb6cefb820e996d7cb7d2574 100644 --- a/docker/docs/3rd-party-interactive-solution.md +++ b/docker/docs/3rd-party-interactive-solution.md @@ -1,13 +1,13 @@ # 内置 MQTT 与 MinIO 技术方案 -本文记录 AIOS Docker 镜像的内置 MQTT/S3 方案。AIOS 不支持用户配置外部 MQTT broker 或外部 S3 服务;`/var/aios/env.json` 中也不能配置这些地址和凭据。 +本文记录 DAEDALUS_AGENT Docker 镜像的内置 MQTT/S3 方案。DAEDALUS_AGENT 不支持用户配置外部 MQTT broker 或外部 S3 服务;`/var/daedalus-agent/env.json` 中也不能配置这些地址和凭据。 ## 凭据约定 用户不提供 MQTT/S3 凭据。启动脚本负责生成并持久化: ```text -/var/aios/credentials.json +/var/daedalus-agent/credentials.json ``` 文件格式: @@ -15,11 +15,11 @@ ```json { "mqtt": { - "username": "aios", + "username": "daedalus-agent", "password": "" }, "minio": { - "username": "aios", + "username": "daedalus-agent", "password": "" }, "generatedAt": "2026-05-30T00:00:00+08:00" @@ -32,25 +32,25 @@ MQTT broker 使用 `aedes`: -- 构建时安装到 `/opt/aios/mqtt-broker`。 -- 运行脚本为 `/opt/aios-assets/scripts/mqtt-broker.js`。 +- 构建时安装到 `/opt/daedalus-agent/mqtt-broker`。 +- 运行脚本为 `/opt/daedalus-agent-assets/scripts/mqtt-broker.js`。 - 监听 `0.0.0.0:1883`。 -- 用户名固定为 `aios`。 +- 用户名固定为 `daedalus-agent`。 - 密码来自 `credentials.json`。 -派生到 `/var/aios/generated/runtime-env.json` 的内部配置: +派生到 `/var/daedalus-agent/generated/runtime-env.json` 的内部配置: ```text -AIOS_MQTT_CHANNEL_BROKER=mqtt://127.0.0.1:1883 -AIOS_MQTT_CHANNEL_USERNAME=aios -AIOS_MQTT_CHANNEL_PASSWORD= -AIOS_ADMIN_INBOUND_TOPIC=aios/admin/inbound -AIOS_ADMIN_OUTBOUND_TOPIC=aios/admin/outbound -AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE=aios/agent/{agentId}/inbound -AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE=aios/agent/{agentId}/outbound +DA_MQTT_CHANNEL_BROKER=mqtt://127.0.0.1:1883 +DA_MQTT_CHANNEL_USERNAME=daedalus-agent +DA_MQTT_CHANNEL_PASSWORD= +DA_ADMIN_INBOUND_TOPIC=daedalus-agent/admin/inbound +DA_ADMIN_OUTBOUND_TOPIC=daedalus-agent/admin/outbound +DA_CHANNEL_INBOUND_TOPIC_TEMPLATE=daedalus-agent/agent/{agentId}/inbound +DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE=daedalus-agent/agent/{agentId}/outbound ``` -这些变量不是用户可配置项。应用调用链路不使用 MQTT topic,固定通过内部 socket `/var/aios/run/app-invoke.sock`,由 `aios-apps-invoke-cli serve` 处理。 +这些变量不是用户可配置项。应用调用链路不使用 MQTT topic,固定通过内部 socket `/var/daedalus-agent/run/app-invoke.sock`,由 `daedalus-agent-apps-invoke-cli serve` 处理。 ## MinIO @@ -65,32 +65,32 @@ FROM quay.io/minio/mc:latest AS mc-image - S3 API 监听 `:9000`。 - Console 绑定 `127.0.0.1:9001`。 -- 用户名固定为 `aios`。 +- 用户名固定为 `daedalus-agent`。 - 密码来自 `credentials.json`。 -- 数据目录为 `/var/aios/minio/data`。 +- 数据目录为 `/var/daedalus-agent/minio/data`。 -派生到 `/var/aios/generated/runtime-env.json` 的内部配置: +派生到 `/var/daedalus-agent/generated/runtime-env.json` 的内部配置: ```text -AIOS_S3_ENDPOINT=http://127.0.0.1:9000 -AIOS_S3_HOST=127.0.0.1 -AIOS_S3_REGION=local -AIOS_S3_ACCESS_KEY_ID=aios -AIOS_S3_SECRET_ACCESS_KEY= -AIOS_S3_FORCE_PATH_STYLE=true -AIOS_S3_ADMIN_INBOX_BUCKET=aios-admin-inbox -AIOS_S3_ADMIN_OUTBOX_BUCKET=aios-admin-outbox -AIOS_S3_AGENT_INBOX_BUCKET=aios-agent-inbox -AIOS_S3_AGENT_OUTBOX_BUCKET=aios-agent-outbox +DA_S3_ENDPOINT=http://127.0.0.1:9000 +DA_S3_HOST=127.0.0.1 +DA_S3_REGION=local +DA_S3_ACCESS_KEY_ID=daedalus-agent +DA_S3_SECRET_ACCESS_KEY= +DA_S3_FORCE_PATH_STYLE=true +DA_S3_ADMIN_INBOX_BUCKET=daedalus-admin-inbox +DA_S3_ADMIN_OUTBOX_BUCKET=daedalus-admin-outbox +DA_S3_AGENT_INBOX_BUCKET=daedalus-agent-inbox +DA_S3_AGENT_OUTBOX_BUCKET=daedalus-agent-outbox ``` bucket 初始化可重复执行。 ## 验收点 -- `credentials.json` 中 MQTT 和 MinIO 用户名均为 `aios`。 +- `credentials.json` 中 MQTT 和 MinIO 用户名均为 `daedalus-agent`。 - 两个密码随机生成且非空,重启后复用。 - `generated/runtime-env.json` 指向 `127.0.0.1` 的内置 MQTT/S3。 -- topic 前缀固定为 `aios`。 +- topic 前缀固定为 `daedalus-agent`。 - MinIO bucket 初始化可重复执行。 - 日志中不输出 API key、MQTT 密码或 MinIO 密码。 diff --git a/docker/docs/environment-variables.md b/docker/docs/environment-variables.md index bc8c76ea66c802369e0751ce224c34d6af6f59fd..2c33195a4c9c933631a347256b792de733c383a7 100644 --- a/docker/docs/environment-variables.md +++ b/docker/docs/environment-variables.md @@ -1,94 +1,97 @@ # Docker 环境变量清单 -AIOS Docker 支持通过 `/var/aios/env.json` 配置少量用户参数。MQTT、MinIO、S3、IPC 和运行时路径由启动脚本管理,不能由用户覆盖。 +DAEDALUS_AGENT Docker 支持通过 `/var/daedalus-agent/env.json` 配置少量用户参数。MQTT、MinIO、S3、IPC 和运行时路径由启动脚本管理,不能由用户覆盖。 ## 用户可配置变量 | 变量 | 默认值 | 说明 | | --- | --- | --- | -| `AIOS_MANAGEMENT_CONSOLE_PORT` | `3030` | management web 监听端口。建议宿主机映射整个 `3030-3050` 区间。 | -| `AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT` | `16` | OpenClaw gateway 执行 lane 并发数,启动时写入 `openclaw.json` 的 `agents.defaults.maxConcurrent`。 | -| `AIOS_HUOZIGE_SERVER_IP` | 空字符串 | 对话应用/业务应用所在的活字格服务器 IP 地址或主机名。通过管理控制台修改时会同步维护 `AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST`。 | -| `AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST` | 空字符串 | 允许 `aios-agent` 访问的局域网地址或 CIDR,支持逗号、空格、分号或 JSON 数组字符串。通过基础设置修改活字格服务器地址时会自动移除旧地址并加入新地址。 | -| `AIOS_MANAGEMENT_WEBSITE_TIMEOUT` | `180` | management web 访问内部管理动作的超时时间,单位秒。 | -| `AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS` | `60000` | 管理控制台启动后首次采集系统状态的延迟,单位毫秒;覆盖 MQTT、S3、内核、插件加载和调用服务等状态。 | -| `AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS` | `60000` | 首次采集完成后系统状态缓存的刷新间隔,单位毫秒。 | -| `AIOS_SYSTEM_STATUS_TIMEOUT_MS` | `5000` | 单次系统状态采集调用的超时时间,单位毫秒。 | +| `DA_MANAGEMENT_CONSOLE_PORT` | `3030` | management web 监听端口。建议宿主机映射整个 `3030-3050` 区间。 | +| `DA_OPENCLAW_GATEWAY_MAX_CONCURRENT` | `16` | OpenClaw gateway 执行 lane 并发数,启动时写入 `openclaw.json` 的 `agents.defaults.maxConcurrent`。 | +| `DA_HUOZIGE_SERVER_IP` | 空字符串 | 对话应用/业务应用所在的活字格服务器 IP 地址或主机名。通过管理控制台修改时会同步维护 `DA_INTERNAL_NETWORK_ALLOWLIST`。 | +| `DA_INTERNAL_NETWORK_ALLOWLIST` | 空字符串 | 允许 `daedalus-agent` 访问的局域网地址或 CIDR,支持逗号、空格、分号或 JSON 数组字符串。通过基础设置修改活字格服务器地址时会自动移除旧地址并加入新地址。 | +| `DA_MANAGEMENT_WEBSITE_TIMEOUT` | `180` | management web 访问内部管理动作的超时时间,单位秒。 | +| `DA_SYSTEM_STATUS_INITIAL_DELAY_MS` | `60000` | 管理控制台启动后首次采集系统状态的延迟,单位毫秒;覆盖 MQTT、S3、内核、插件加载和调用服务等状态。 | +| `DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS` | `60000` | 首次采集完成后系统状态缓存的刷新间隔,单位毫秒。 | +| `DA_SYSTEM_STATUS_TIMEOUT_MS` | `5000` | 单次系统状态采集调用的超时时间,单位毫秒。 | 最小 `env.json`: ```json { - "AIOS_MANAGEMENT_CONSOLE_PORT": 3030, - "AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT": 16, - "AIOS_HUOZIGE_SERVER_IP": "", - "AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST": "", - "AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS": 60000, - "AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS": 60000, - "AIOS_SYSTEM_STATUS_TIMEOUT_MS": 5000 + "DA_MANAGEMENT_CONSOLE_PORT": 3030, + "DA_OPENCLAW_GATEWAY_MAX_CONCURRENT": 16, + "DA_HUOZIGE_SERVER_IP": "", + "DA_INTERNAL_NETWORK_ALLOWLIST": "", + "DA_SYSTEM_STATUS_INITIAL_DELAY_MS": 60000, + "DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS": 60000, + "DA_SYSTEM_STATUS_TIMEOUT_MS": 5000 } ``` ## 容器启动调试变量 -这些变量通过 `docker run -e` 或编排系统注入,用于运维调试,不建议放入 `/var/aios/env.json`。 +这些变量通过 `docker run -e` 或编排系统注入,用于运维调试,不建议放入 `/var/daedalus-agent/env.json`。 | 变量 | 默认值 | 说明 | | --- | --- | --- | -| `AIOS_SERVICE_RESTART_DELAY_SECONDS` | `2` | 顶层 MQTT、MinIO、OpenClaw supervisor、apps supervisor 异常退出后的重启间隔。 | -| `AIOS_APPS_RESTART_DELAY_SECONDS` | `2` | apps supervisor 内部重启 management web 和 invoke service 的间隔。 | +| `DA_SERVICE_RESTART_DELAY_SECONDS` | `2` | 顶层 MQTT、MinIO、OpenClaw supervisor、apps supervisor 异常退出后的重启间隔。 | +| `DA_APPS_RESTART_DELAY_SECONDS` | `2` | apps supervisor 内部重启 management web 和 invoke service 的间隔。 | | `OPENCLAW_RESTART_DELAY_SECONDS` | `2` | OpenClaw gateway 重启间隔。 | -| `AIOS_STARTUP_PROFILE` | `true` | 是否输出启动步骤耗时日志。该日志必须保留。 | +| `OPENCLAW_FATAL_EXIT_CODE` | `78` | OpenClaw 配置错误退出码;命中后停止自动重启,保留现场供修复。 | +| `OPENCLAW_MAX_RAPID_RESTARTS` | `5` | 在快速失败窗口内允许的最大连续启动次数。 | +| `OPENCLAW_RAPID_RESTART_WINDOW_SECONDS` | `60` | 小于该运行时长的退出计为快速失败。 | +| `DA_STARTUP_PROFILE` | `true` | 是否输出启动步骤耗时日志。该日志必须保留。 | ## 只读系统变量 -这些变量由镜像和启动脚本固定,进程可读取,用户不能在 `/var/aios/env.json` 中覆盖: +这些变量由镜像和启动脚本固定,进程可读取,用户不能在 `/var/daedalus-agent/env.json` 中覆盖: | 变量 | 固定值 | 说明 | | --- | --- | --- | -| `AIOS_ROOT` | `/var/aios` | AIOS 容器运行根目录。 | -| `AIOS_DATA_DIR` | `/var/aios/startup-state/data` | 启动状态和 seed 指纹目录。 | -| `AIOS_OPENCLAW_HOME` | `/var/aios/.openclaw` | OpenClaw 持久化目录。 | -| `AIOS_OPENCLAW_WORKSPACE_DIR` | `/var/aios/.openclaw/workspaces/default` | 默认 workspace。 | -| `AIOS_WORKSPACE_TEMPLATES_DIR` | `/var/aios/workspace-templates` | workspace template 持久化目录。 | -| `AIOS_ONTOLOGY_DIR` | `/var/aios/ontology` | ontology 持久化目录,management console 读写,OpenClaw 只读。 | -| `AIOS_TMP_DIR` | `/var/aios/.openclaw/tmp` | OpenClaw 可写临时目录。 | -| `AIOS_WEB_DATA_DIR` | `/var/aios/management/data` | 管理控制台数据库和数据目录。 | +| `DA_ROOT` | `/var/daedalus-agent` | DAEDALUS_AGENT 容器运行根目录。 | +| `DA_DATA_DIR` | `/var/daedalus-agent/startup-state/data` | 启动状态和 seed 指纹目录。 | +| `DA_OPENCLAW_HOME` | `/var/daedalus-agent/.openclaw` | OpenClaw 持久化目录。 | +| `DA_OPENCLAW_WORKSPACE_DIR` | `/var/daedalus-agent/.openclaw/workspaces/default` | 默认 workspace。 | +| `DA_WORKSPACE_TEMPLATES_DIR` | `/var/daedalus-agent/workspace-templates` | workspace template 持久化目录。 | +| `DA_ONTOLOGY_DIR` | `/var/daedalus-agent/ontology` | ontology 持久化目录,management console 读写,OpenClaw 只读。 | +| `DA_TMP_DIR` | `/var/daedalus-agent/.openclaw/tmp` | OpenClaw 可写临时目录。 | +| `DA_WEB_DATA_DIR` | `/var/daedalus-agent/management/data` | 管理控制台数据库和数据目录。 | -OpenClaw 原生命令使用下列派生变量。它们不允许写入 `/var/aios/env.json`,也不写入 `/var/aios/generated/runtime-env.json`;启动脚本会在启动 OpenClaw gateway 时注入,管理控制台执行 `openclaw` CLI 时也会强制注入同一组值,避免命令落到调用用户的 `~/.openclaw`: +OpenClaw 原生命令使用下列派生变量。它们不允许写入 `/var/daedalus-agent/env.json`,也不写入 `/var/daedalus-agent/generated/runtime-env.json`;启动脚本会在启动 OpenClaw gateway 时注入,管理控制台执行 `openclaw` CLI 时也会强制注入同一组值,避免命令落到调用用户的 `~/.openclaw`: | 变量 | 固定值 | 说明 | | --- | --- | --- | -| `OPENCLAW_HOME` | `/var/aios` | OpenClaw 的有效 home,等于 `AIOS_OPENCLAW_HOME` 的父目录。 | -| `OPENCLAW_STATE_DIR` | `/var/aios/.openclaw` | OpenClaw 状态目录,必须与 `AIOS_OPENCLAW_HOME` 一致。 | -| `OPENCLAW_CONFIG_PATH` | `/var/aios/.openclaw/openclaw.json` | OpenClaw 配置文件路径。 | -| `OPENCLAW_WORKSPACE_DIR` | `/var/aios/.openclaw/workspaces/default` | OpenClaw 默认 workspace。 | -| `OPENCLAW_GATEWAY_TOKEN` | 内部生成值 | CLI 连接 gateway 使用的本地 token,来源同 `AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN`。 | -| `AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN` | `aios-local-gateway-token` | gateway 本地认证 token;未显式注入时使用默认值。 | -| `AIOS_OPENCLAW_CLI_TMP_DIR` | `/tmp/aios-openclaw-cli` | 管理控制台执行 OpenClaw CLI 时使用的临时目录。 | +| `OPENCLAW_HOME` | `/var/daedalus-agent` | OpenClaw 的有效 home,等于 `DA_OPENCLAW_HOME` 的父目录。 | +| `OPENCLAW_STATE_DIR` | `/var/daedalus-agent/.openclaw` | OpenClaw 状态目录,必须与 `DA_OPENCLAW_HOME` 一致。 | +| `OPENCLAW_CONFIG_PATH` | `/var/daedalus-agent/.openclaw/openclaw.json` | OpenClaw 配置文件路径。 | +| `OPENCLAW_WORKSPACE_DIR` | `/var/daedalus-agent/.openclaw/workspaces/default` | OpenClaw 默认 workspace。 | +| `OPENCLAW_GATEWAY_TOKEN` | 内部生成值 | CLI 连接 gateway 使用的本地 token,来源同 `DA_OPENCLAW_GATEWAY_AUTH_TOKEN`。 | +| `DA_OPENCLAW_GATEWAY_AUTH_TOKEN` | `daedalus-agent-local-gateway-token` | gateway 本地认证 token;未显式注入时使用默认值。 | +| `DA_OPENCLAW_CLI_TMP_DIR` | `/tmp/daedalus-agent-openclaw-cli` | 管理控制台执行 OpenClaw CLI 时使用的临时目录。 | ## 系统自动生成变量 -下列变量写入 `/var/aios/generated/runtime-env.json`,供内部组件使用,用户不能在 `/var/aios/env.json` 中配置: - -- `AIOS_ROOT` -- `AIOS_DATA_DIR` -- `AIOS_OPENCLAW_HOME` -- `AIOS_OPENCLAW_WORKSPACE_DIR` -- `AIOS_WORKSPACE_TEMPLATES_DIR` -- `AIOS_ONTOLOGY_DIR` -- `AIOS_TMP_DIR` -- `AIOS_WEB_DATA_DIR` -- `AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS` -- `AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS` -- `AIOS_SYSTEM_STATUS_TIMEOUT_MS` -- `AIOS_MQTT_CHANNEL_BROKER` -- `AIOS_MQTT_CHANNEL_USERNAME` -- `AIOS_MQTT_CHANNEL_PASSWORD` -- `AIOS_ADMIN_INBOUND_TOPIC` -- `AIOS_ADMIN_OUTBOUND_TOPIC` -- `AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE` -- `AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE` -- 所有 `AIOS_S3_*` - -内置 MQTT 固定为 `mqtt://127.0.0.1:1883`,内置 MinIO 固定为 `http://127.0.0.1:9000`。应用调用 IPC socket 固定为 `/var/aios/run/app-invoke.sock`,不提供环境变量配置项。 +下列变量写入 `/var/daedalus-agent/generated/runtime-env.json`,供内部组件使用,用户不能在 `/var/daedalus-agent/env.json` 中配置: + +- `DA_ROOT` +- `DA_DATA_DIR` +- `DA_OPENCLAW_HOME` +- `DA_OPENCLAW_WORKSPACE_DIR` +- `DA_WORKSPACE_TEMPLATES_DIR` +- `DA_ONTOLOGY_DIR` +- `DA_TMP_DIR` +- `DA_WEB_DATA_DIR` +- `DA_SYSTEM_STATUS_INITIAL_DELAY_MS` +- `DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS` +- `DA_SYSTEM_STATUS_TIMEOUT_MS` +- `DA_MQTT_CHANNEL_BROKER` +- `DA_MQTT_CHANNEL_USERNAME` +- `DA_MQTT_CHANNEL_PASSWORD` +- `DA_ADMIN_INBOUND_TOPIC` +- `DA_ADMIN_OUTBOUND_TOPIC` +- `DA_CHANNEL_INBOUND_TOPIC_TEMPLATE` +- `DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE` +- 所有 `DA_S3_*` + +内置 MQTT 固定为 `mqtt://127.0.0.1:1883`,内置 MinIO 固定为 `http://127.0.0.1:9000`。应用调用 IPC socket 固定为 `/var/daedalus-agent/run/app-invoke.sock`,不提供环境变量配置项。 diff --git a/docker/docs/openclaw-2026.7.1-model-comparison.md b/docker/docs/openclaw-2026.7.1-model-comparison.md new file mode 100644 index 0000000000000000000000000000000000000000..87c198b912fcd94492a75f9e07a2e85273448434 --- /dev/null +++ b/docker/docs/openclaw-2026.7.1-model-comparison.md @@ -0,0 +1,116 @@ +# deepseek-v4-flash 与 gpt-5.4 集成测试对比 + +测试日期:2026-07-17 +OpenClaw:2026.7.1 +镜像:`daedalus-agent-arm64:openclaw-2026.7.1-upgrade`(`sha256:cf6756494ae81de8c75535375bfa8d2cbfd4a7044183d2f83ee76d62a1a9026e`) + +## 结论 + +在当前 DAEDALUS_AGENT/OpenClaw 工具链和指定 OpenAI-compatible 服务上,`deepseek-v4-flash` 明显比 `gpt-5.4` 更适合作为近期生产候选,但两者均未达到完整验收标准。 + +- 两个模型的完整流程通过率均为 0/3。 +- DeepSeek 每轮都通过文件输出,且两轮运行到重启后的 Skill/记忆阶段;失败主要是最终答案收敛和严格格式遵循。 +- GPT-5.4 文件输出严格成功率为 1/3;两轮出现上游 `HTTP 400`,OpenClaw 判定为请求 schema 或 tool payload 被服务拒绝。 +- 在可比较的基础交互中,DeepSeek 的 Agent 回声平均快约 21%;模型 HTTP 200 响应样本也明显更快。 +- GPT-5.4 的问题不能全部归因于模型本身:两次 400 表明指定服务对 GPT-5.4 的工具请求兼容性也是关键变量。 + +因此,当前建议是:优先继续验证 DeepSeek;GPT-5.4 在解决上游工具请求兼容性之前,不进入生产灰度。 + +## 测试方法 + +本轮只比较两个模型,不使用历史结果充当本轮样本。 + +- 每个模型执行 3 次完整集成流程,共 6 次。 +- 每轮使用全新的容器和 Docker volume,防止记忆、会话、包和配置残留。 +- 两个模型使用相同 Base URL、同一凭据、同一镜像、同一主机、相同 context/max token 和超时配置。 +- 每轮覆盖:启动、模型注册、Agent 创建、Skill 上传、本体安装、容器重启、Agent 回声、文件输出、本体真实调用、三类包安装、重启持久化、Skill 描述、包记忆及 sender 隔离。 +- 凭据只写入临时配置;不进入报告和版本库。 +- 判定同时保留两种口径:严格断言结果,以及业务是否实际完成。这样可以区分工具失败和输出格式失败。 + +## 逐轮结果 + +| 模型 | 轮次 | 通过步骤 | 最终结果 | 失败性质 | +| --- | ---: | ---: | --- | --- | +| deepseek-v4-flash | 1 | 31 | 包记忆召回没有返回安装清单 | 把“准备检查记忆文件”作为最终 `block-idle`,长任务未收敛 | +| deepseek-v4-flash | 2 | 30 | 重启后 Skill 描述失败 | 被前序安装任务状态污染,跨任务上下文收敛失败 | +| deepseek-v4-flash | 3 | 21 | 本体版本严格断言失败 | 真实调用成功且版本正确,但附带解释文字,违反“只返回版本号” | +| gpt-5.4 | 1 | 25 | 包安装验证超时 | 包安装请求收到上游 400,返回通用错误,120 秒内未形成可验证安装状态 | +| gpt-5.4 | 2 | 20 | 文件输出会话超时 | 上游 400 拒绝 schema/tool payload;客户端最终等到 240 秒超时 | +| gpt-5.4 | 3 | 20 | 文件输出 URI 缺失 | HTTP 调用成功,但未返回 `file_output://`,工具工作流未完成 | + +完整流程严格通过率:DeepSeek 0/3,GPT-5.4 0/3。 + +## 能力检查点 + +| 检查点 | deepseek-v4-flash | gpt-5.4 | 说明 | +| --- | ---: | ---: | --- | +| 基础 Agent 回声 | 3/3 | 3/3 | 两者基础对话和 MQTT 链路均正常 | +| 文件输出严格通过 | 3/3 | 1/3 | GPT 一次 400、一次未输出 URI | +| 本体真实调用(到达样本) | 3/3 业务成功;2/3 严格成功 | 1/1 | DeepSeek 第三轮仅输出格式不符;GPT 后两轮未到达 | +| 包安装并由容器验证 | 2/2 | 0/1 | DeepSeek 第三轮未到达;GPT 首轮被 400 中断 | +| 重启后 Skill 持久化 | 2/2 | 未到达 | 静态 Skill 安装检查在所有轮次均通过 | +| 重启后 Skill 模型描述 | 1/2 | 未到达 | DeepSeek 一轮受前序任务污染 | +| 包记忆召回 | 0/1 | 未到达 | DeepSeek 停在计划文本 | + +“到达样本”只计算真正执行到该检查点的轮次,不把前序失败当作该能力本身失败。 + +## 性能 + +| 指标(3 轮平均) | deepseek-v4-flash | gpt-5.4 | +| --- | ---: | ---: | +| 首次容器启动 | 14,887ms | 14,791ms | +| 第二次容器启动 | 11,945ms | 11,186ms | +| Agent 创建 | 7,703ms | 7,366ms | +| Agent 回声 | 4,537ms | 5,743ms | + +启动和 Agent 创建主要反映平台开销,两边接近。Agent 回声更能反映实际交互,GPT-5.4 平均比 DeepSeek 慢约 1,206ms(约 27%);反过来,DeepSeek 用时约少 21%。 + +保留到日志的 HTTP 200 模型调用统计如下: + +| 模型 | HTTP 200 样本 | 平均 | P50 | P95 | 最大 | +| --- | ---: | ---: | ---: | ---: | ---: | +| deepseek-v4-flash | 45(2 轮日志) | 2,298ms | 2,250ms | 2,961ms | 4,147ms | +| gpt-5.4 | 22(3 轮日志) | 3,557ms | 3,201ms | 5,396ms | 6,483ms | + +DeepSeek 第一轮 Docker 日志未保留,因此 HTTP 延迟表只使用其余两轮,不与三轮汇总混算。GPT-5.4 另有两次 HTTP 400,未计入成功响应延迟。 + +## 失败归因 + +### deepseek-v4-flash + +主要风险是 Agent 循环的最终状态控制:模型会正确表达下一步计划,但 OpenClaw 收到的最终事件已是 `block-idle`,任务没有继续执行。另有一次严格输出格式失败。其工具覆盖较完整,文件输出、本体调用、包安装和重启持久化都获得了实际成功证据。 + +这类问题适合通过更强的任务终止约束、会话隔离、阶段状态机和自动结果校验改善,但在改进前仍会产生“看似在做、实际已结束”的假完成风险。 + +### gpt-5.4 + +GPT-5.4 同时存在两类风险: + +1. HTTP 200 时仍可能不执行文件输出工作流,不返回 URI。 +2. 3 轮中有 2 轮被指定服务以 HTTP 400 拒绝。OpenClaw 日志明确记录:`provider rejected the request schema or tool payload`。 + +第二类问题位于 OpenClaw、OpenAI-compatible 转换层和上游 GPT-5.4 接口的交界处。仅修改提示词不能可靠解决,必须抓取并最小化失败请求,确认是 tools schema、tool choice、消息历史还是流式协议兼容问题。 + +## 生产建议 + +### deepseek-v4-flash + +可作为下一阶段灰度候选,但需满足以下门槛: + +1. 将文件输出、本体调用、包安装、Skill 描述和记忆召回拆成独立会话或显式状态阶段。 +2. 对计划文本作为最终 `block-idle` 的情况自动判失败并重试,禁止标记业务完成。 +3. 对“只返回指定格式”的输出增加结果提取或结构化校验,避免业务正确但接口失败。 +4. 完整流程至少连续通过 5 次,再进入小流量灰度。 + +### gpt-5.4 + +暂不进入灰度。先完成: + +1. 捕获上游 400 对应的脱敏请求和响应,构造最小复现。 +2. 分别验证无工具、单工具、文件输出工具和多工具 schema,找出被拒字段。 +3. 工具请求连续 20 次无 400 后,再执行完整流程。 +4. 文件输出定向测试至少达到 19/20,再评估后续包安装和记忆能力。 + +## 最终选择 + +如果当前必须在两者中选择,选择 `deepseek-v4-flash`,并仅限受控灰度。理由不是它已通过验收,而是它在相同条件下表现出更完整的工具覆盖、更低的响应延迟,且没有观察到 GPT-5.4 当前存在的上游 schema/tool-payload 400 兼容故障。 diff --git a/docker/docs/openclaw-2026.7.1-regression-comparison.md b/docker/docs/openclaw-2026.7.1-regression-comparison.md new file mode 100644 index 0000000000000000000000000000000000000000..93779c3c83190599bbe53c9122574edd257869b5 --- /dev/null +++ b/docker/docs/openclaw-2026.7.1-regression-comparison.md @@ -0,0 +1,95 @@ +# OpenClaw 升级前后 DeepSeek 回归对比 + +测试日期:2026-07-17 +模型:`deepseek-v4-flash` +旧镜像:`daedalus-agent-arm64:20260701.02`(`sha256:1762ca310805c923cd008b36ee6d2fa6b3f6221d45d87cb4d2bb67d1a6572e7b`,OpenClaw 2026.6.10) +新镜像:`daedalus-agent-arm64:openclaw-2026.7.1-upgrade`(`sha256:cf6756494ae81de8c75535375bfa8d2cbfd4a7044183d2f83ee76d62a1a9026e`,OpenClaw 2026.7.1) + +## 结论 + +当前观察到的 DeepSeek 核心问题不是 OpenClaw 2026.7.1 升级引入的回归。 + +- 升级前后完整流程均为 0/3 严格通过。 +- “计划/进度文本被作为最终 `block-idle` 返回”在旧版两轮、新版至少一轮明确出现。 +- “业务调用正确,但没有遵守只返回指定格式”在旧版和新版各出现一轮。 +- 文件输出在旧版和新版均为 3/3 通过。 +- 包安装和重启持久化在到达该阶段的旧版、新版样本中均成功。 +- 新版出现过一轮 Skill 描述被前序任务状态污染;旧版到达该阶段的两轮均通过。这是需要继续观察的回归信号,但 1/2 对 2/2 的样本不足以证明由升级导致。 + +因此,不建议因这些模型表现问题回滚 OpenClaw。更合理的处理是继续使用 2026.7.1,并在 Agent 状态控制、会话隔离和结果解析层修复。 + +## 测试设计 + +- 两个版本均使用同一模型、Base URL、凭据、主机、提示、context/max token 和超时。 +- 每轮使用全新容器和全新 Docker volume,不复用升级后的持久数据。 +- 两个版本各取 3 次正式完整集成测试。 +- 旧镜像的管理 API 和调用日志 schema 比新版旧。测试夹具增加了两个兼容处理:创建业务系统时补充 `host`;旧调用日志没有 request/response artifact 时,以同 session、command、`success=1` 的日志作为调用证据。 +- 兼容处理不修改模型提示、Agent 会话、工具定义或最终答案断言。兼容调试阶段的运行不计入正式样本。 + +## 逐轮结果 + +| 版本 | 轮次 | 通过步骤 | 失败点 | 失败类型 | +| --- | ---: | ---: | --- | --- | +| 2026.6.10 | 1 | 31 | 包记忆召回 | 回复“先确认记录是否持久化”后直接 `block-idle` | +| 2026.6.10 | 2 | 21 | 本体版本输出 | 调用成功、版本正确,但附带解释文字 | +| 2026.6.10 | 3 | 31 | 包记忆召回 | 回复“让我检查 memory 文件”后直接 `block-idle` | +| 2026.7.1 | 1 | 31 | 包记忆召回 | 回复“检查 memory 文件”后直接 `block-idle` | +| 2026.7.1 | 2 | 30 | 重启后 Skill 描述 | 被前序安装任务的中止状态污染 | +| 2026.7.1 | 3 | 21 | 本体版本输出 | 调用成功、版本正确,但附带解释文字 | + +## 检查点对比 + +| 检查点 | 2026.6.10 | 2026.7.1 | 回归判断 | +| --- | ---: | ---: | --- | +| 完整流程严格通过 | 0/3 | 0/3 | 无证据表明新版更差;两者都未达标 | +| 基础 Agent 回声 | 3/3 | 3/3 | 无回归 | +| 文件输出严格通过 | 3/3 | 3/3 | 无回归 | +| 本体调用业务成功 | 3/3 | 3/3 | 无回归 | +| 本体输出严格通过 | 2/3 | 2/3 | 完全一致 | +| 包安装容器验证(到达样本) | 2/2 | 2/2 | 无回归 | +| 重启后 Skill 持久化(到达样本) | 2/2 | 2/2 | 无回归 | +| Skill 模型描述(到达样本) | 2/2 | 1/2 | 弱回归信号,样本不足 | +| 包记忆召回(到达样本) | 0/2 | 0/1 | 问题升级前已稳定存在 | + +## 性能对比 + +| 指标(3 轮平均) | 2026.6.10 | 2026.7.1 | 变化 | +| --- | ---: | ---: | ---: | +| 首次容器启动 | 7,102ms | 14,887ms | 新版增加 7,785ms | +| 第二次容器启动 | 10,402ms | 11,945ms | 新版增加 1,543ms | +| Agent 创建 | 6,324ms | 7,703ms | 新版增加 1,379ms | +| Agent 回声 | 4,997ms | 4,537ms | 新版减少 460ms | + +首次启动变慢是明确的升级成本,需要作为运维容量和发布窗口指标。第二次启动差距较小;基础 Agent 响应没有退化,当前样本中反而略快。 + +旧版 OpenClaw 没有输出与新版相同格式的 provider fetch 延迟日志,因此不能做严格的逐模型 HTTP P50/P95 版本对比。 + +## 问题归因 + +### 已确认不是本次升级引入 + +1. 计划文本作为最终 `block-idle`,导致任务假结束。 +2. 记忆写入/召回任务不能可靠收敛。 +3. 工具已成功但最终输出包含额外解释,违反严格格式。 + +这些现象在 2026.6.10 上已复现,且失败文本、阶段和事件类型与 2026.7.1 高度一致。 + +### 需要继续观察 + +新版一轮 Skill 描述受前序任务污染。旧版正式样本没有出现,但两个版本的到达样本都只有两轮,无法区分随机模型波动和 OpenClaw 会话处理变化。建议对此场景做独立 20 轮 A/B,而不是继续重复整套长流程。 + +### 明确的升级成本 + +1. 首次启动平均增加约 7.8 秒。 +2. 旧版管理 API、调用日志和新版测试/运维接口存在 schema 差异。 +3. 回滚仍必须配合迁移前持久卷快照,不能只替换镜像。 + +## 决策建议 + +继续采用 OpenClaw 2026.7.1,不因 DeepSeek 的上述问题回滚。上线前优先实施: + +1. 检测计划型 `block-idle`,自动续跑或明确失败。 +2. 包安装、Skill 查询和记忆召回使用独立 session,避免跨任务污染。 +3. 从工具结果生成结构化业务响应,不依赖模型严格控制最终文本。 +4. 对 Skill 跨任务污染场景做旧版/新版各 20 次定向 A/B;若新版显著更差,再作为 OpenClaw 回归单独处理。 +5. 将首次启动告警阈值和发布等待窗口按新版基线调整。 diff --git a/docker/docs/openclaw-2026.7.1-validation-report.md b/docker/docs/openclaw-2026.7.1-validation-report.md new file mode 100644 index 0000000000000000000000000000000000000000..c75b72a8e8a5c90b77cc96c493ef4c5de6eea394 --- /dev/null +++ b/docker/docs/openclaw-2026.7.1-validation-report.md @@ -0,0 +1,64 @@ +# OpenClaw 2026.7.1 升级验证汇总 + +日期:2026-07-17 + +## 结论 + +OpenClaw 2026.7.1 的镜像构建、状态迁移、重复启动和基础业务链路已经验证,但当前不满足无条件生产发布标准。建议以灰度方式发布,并将 Agent 工具调用和多轮任务完成率作为阻断指标。 + +升级镜像:`daedalus-agent-arm64:openclaw-2026.7.1-upgrade`(`sha256:cf6756494ae81de8c75535375bfa8d2cbfd4a7044183d2f83ee76d62a1a9026e`)。 + +## 升级改动 + +- OpenClaw 固定为 2026.7.1,Node.js 固定为 24.18.0。 +- Gateway 启动前执行按版本控制的状态迁移;版本未变化时跳过,避免每次启动重复改写。 +- 修正 MQTT seed 插件目录所有权,并增加插件注册表刷新机制。 +- 增加迁移失败后的 crash-loop 保护,避免在持久卷上无限重复破坏性操作。 +- 增加升级契约测试、构建说明和长期运维/回滚手册。 + +## 集成测试对比 + +所有模型测试使用相同的 OpenAI-compatible Base URL 和同一凭据。凭据不写入本报告或版本库。 + +| 项目 | deepseek-v4-flash(3 轮) | gpt-5.4(1 轮) | +| --- | --- | --- | +| API/传输 | 模型调用均为 HTTP 200 | 3 次模型调用均为 HTTP 200 | +| 最远进度 | 31 个步骤通过 | 20 个步骤通过 | +| 模型响应 | 第 3 轮平均 2306ms,1703-5583ms | 平均 3129ms,2692-3756ms | +| 首次启动 | 第 3 轮 15528ms | 18762ms | +| 第二次启动 | 第 3 轮 22415ms | 11050ms | +| Agent 创建 | 第 3 轮 16867ms | 8816ms | +| Agent 回声 | 第 3 轮 5592ms | 5726ms | +| 文件输出 | 通过 | 失败,未返回 `file_output://` URI | +| 包安装/重启持久化 | 通过 | 未执行到该阶段 | +| Skill/本体 | 通过 | 安装与本体静态检查通过;后续模型场景未执行到 | +| 最终失败 | 三轮均在后段 Agent 循环/记忆任务中提前结束 | 首个强工具约束的文件输出场景提前结束 | + +DeepSeek 三轮失败表现分别为:读取持久化记忆前停止;全局 Skill 回答被上一任务残留上下文污染;再次在查找持久化记忆文件前停止。共同特征是把计划或进度文本作为最终 `block-idle` 返回,没有完成最终答案。 + +GPT-5.4 已完成供应商/模型/模板/Agent 创建、权限分配、目录同步、Skill 上传、业务本体安装、启动脚本修改后的容器重启和 Agent 回声。文件输出请求触发了两次成功的模型请求,但日志中没有文件传输工具执行记录,最终返回 93 字符普通 block,导致 URI 断言失败。该证据更符合模型未遵循工具工作流,而不是 API 认证、网络或 OpenClaw Gateway 故障。 + +GPT-5.4 只有一轮样本,不能据此推断稳定失败率或完整能力上限;其失败位置较早,也使后半段性能无法与 DeepSeek直接比较。 + +## 风险评估 + +| 风险 | 等级 | 证据与影响 | 控制措施 | +| --- | --- | --- | --- | +| 模型工具调用/Agent 循环不稳定 | 高 | 两个模型均未通过完整验收;可能造成任务假完成 | 灰度流量;监控工具调用和最终答案;失败自动重试/转人工 | +| 旧版本回滚与升级后持久卷不完全兼容 | 高 | 2026.6.10 Gateway 可启动,但 MQTT seed 插件会被新版安全规则阻止 | 回滚必须恢复迁移前卷快照;不能只回滚镜像 | +| Agent 私密目录权限不兼容 | 中 | OpenClaw 报告目录权限 770 不安全,模型目录加载告警 | 将私密目录收紧为 700,并补权限回归测试 | +| 明文 Gateway token | 中 | 迁移审计提示配置包含明文 secret 字段 | 迁移到 OpenClaw SecretRef,发布前执行 secrets audit | +| 性能波动 | 中 | 启动与模型响应样本波动明显,且不同轮次不可完全横比 | 生产记录 P50/P95;以同机、同提示多轮基准设阈值 | + +## 发布门槛 + +1. 对 GPT-5.4 定向重复文件输出场景至少 5 次,确认工具 schema、提示兼容性及成功率。 +2. 对候选生产模型完整集成套件至少连续通过 3 次;不能只验证 HTTP 200 或 Gateway ready。 +3. 修正 Agent 私密目录权限并确认模型目录加载告警消失。 +4. 完成 SecretRef 迁移和 `openclaw secrets audit --check`。 +5. 创建持久卷快照并演练“旧镜像 + 迁移前快照”的完整业务回滚,验证 MQTT channel 与 Agent 回声。 +6. 灰度期监控启动耗时、Gateway ready、MQTT channel ready、模型 4xx/5xx、工具调用完成率和 `block-idle` 异常结束率。 + +## 建议 + +在当前证据下,DeepSeek 展现的功能覆盖更广,但后段多轮任务稳定性不足;GPT-5.4 在本轮更早暴露文件输出工具遵循问题。两者均不应直接作为本次升级的“完整验收通过”依据。OpenClaw 升级本身可进入受控灰度,模型工作流问题需作为独立发布门槛持续验证。 diff --git a/docker/docs/openclaw-skill-context-ab-40.md b/docker/docs/openclaw-skill-context-ab-40.md new file mode 100644 index 0000000000000000000000000000000000000000..5e7e2afc592beac0f34170a9b41f3de8173346ae --- /dev/null +++ b/docker/docs/openclaw-skill-context-ab-40.md @@ -0,0 +1,108 @@ +# OpenClaw Skill 上下文污染 40 轮定向 A/B + +测试日期:2026-07-17 +模型:`deepseek-v4-flash` +旧版本:OpenClaw 2026.6.10,镜像 `sha256:1762ca310805c923cd008b36ee6d2fa6b3f6221d45d87cb4d2bb67d1a6572e7b` +新版本:OpenClaw 2026.7.1,镜像 `sha256:cf6756494ae81de8c75535375bfa8d2cbfd4a7044183d2f83ee76d62a1a9026e` + +## 结论 + +20 对 20 的定向 A/B 没有发现 OpenClaw 2026.7.1 导致 Skill 上下文污染或成功率下降。 + +- 旧版严格通过 16/20(80%)。 +- 新版严格通过 17/20(85%)。 +- 成功率差为新版 +5 个百分点;Fisher 精确检验双侧 `p=1.0`,没有统计显著差异。 +- 旧版 4 次失败全部是计划型 `block-idle`。 +- 新版 3 次失败中,2 次是计划型 `block-idle`,1 次语义完全正确但没有输出规定前缀。 +- 两个版本均未出现“继续检查前序包安装任务”或其他前序任务内容污染。 +- 两个版本的 40 轮日志均没有模型 HTTP 4xx/5xx。 + +因此,此前完整流程中新版出现的一次前序任务污染属于低频随机现象的可能性更高,当前没有证据将其归因于 OpenClaw 升级。 + +## 场景设计 + +每轮执行相同的最小长链路: + +1. 新建容器和 Docker volume。 +2. 创建模型、模板和 Agent。 +3. 上传并验证全局 Skill。 +4. 执行三类包安装任务,并由容器验证 npm、uv 和 pip 包真实可用。 +5. 执行容器重启,验证包和 Skill 持久化。 +6. 在同一 Agent 会话链路中询问 `container-skill-smoke` 的描述。 +7. 要求严格返回 `SKILL_DESCRIPTION: Container integration uploaded global skill.`。 + +文件输出、本体调用、记忆召回等无关阶段被跳过,以便把失败归因集中在“前序安装任务 → 重启 → Skill 描述”链路。 + +两个版本使用相同模型、Base URL、凭据、提示、超时和主机。旧、新版本并行执行,使用独立端口、容器和 volume。 + +## 结果 + +| 指标 | 2026.6.10 | 2026.7.1 | +| --- | ---: | ---: | +| 样本数 | 20 | 20 | +| 严格通过 | 16 | 17 | +| 严格失败 | 4 | 3 | +| 严格成功率 | 80% | 85% | +| 计划型 `block-idle` | 4 | 2 | +| 语义正确但格式失败 | 0 | 1 | +| 前序任务内容污染 | 0 | 0 | +| 模型 HTTP 4xx/5xx | 0 | 0 | + +Wilson 95% 置信区间: + +- 旧版成功率:58.4%~91.9%。 +- 新版成功率:64.0%~94.8%。 + +两区间高度重叠。按当前样本量,新旧成功率差异的近似 95% 区间约为 -18.5~+28.5 个百分点,不能宣称新版更好,也不能宣称新版更差。 + +## 失败详情 + +### 2026.6.10 + +4 次失败都是模型宣布下一步动作后直接结束: + +- `Let me check the skill.` +- `Let me read the skill's SKILL.md to confirm.` +- `Let me read the SKILL.md for that skill.` +- `Let me read the SKILL.md for the container-skill-smoke skill.` + +事件均以 `block-idle` 结束,没有继续读取 Skill 或返回最终结果。 + +### 2026.7.1 + +2 次计划型提前结束: + +- `Let me check the skill's metadata and SKILL.md.` +- `I already have the skill metadata visible in my available skills list. Reading its SKILL.md for confirmation:` + +另 1 次已经正确回答 Skill 描述,但没有遵守固定输出协议,附带了额外说明,因此严格断言失败。按业务语义口径,新版为 18/20(90%);旧版仍为 16/20(80%)。该口径同样不足以形成显著版本差异。 + +## 性能 + +采用中位数,降低外部 API 和并发抖动的影响: + +| 指标中位数 | 2026.6.10 | 2026.7.1 | +| --- | ---: | ---: | +| 首次启动 | 9,384ms | 15,932ms | +| 第二次启动 | 12,794ms | 13,402ms | +| Agent 创建 | 10,217ms | 7,984ms | +| Agent 回声 | 5,570ms | 5,000ms | +| 包安装任务 | 7,606ms | 14,468ms | +| 重启 | 13,048ms | 11,168ms | +| 成功的 Skill 描述 | 7,746ms | 7,130ms | + +首次启动在新版仍明显更慢,与完整流程对比结论一致。新版包安装任务中位数更长,但模型的包安装回复常先于后台工具完成,单独看该字段不能等同于实际安装总耗时。Skill 描述本身没有性能退化。 + +## 判断 + +1. Skill 场景的计划型 `block-idle` 在升级前已经存在,且本次旧版本样本中出现次数更多。 +2. 40 轮没有复现任何前序包安装内容污染,不能把之前单次污染归因于 2026.7.1。 +3. 新版的严格成功率没有下降,但 20/组仍不足以证明 5 个百分点差异是真实改善。 +4. 不需要因为该问题回滚 OpenClaw;应该修复通用的 Agent 终止状态和输出协议。 + +## 建议 + +- 将“准备读取/检查 Skill”且没有工具结果的 `block-idle` 判为未完成,自动续跑一次。 +- 对 Skill 描述从已加载元数据中直接生成结构化响应,避免模型自行控制固定前缀。 +- 保留该定向场景作为版本升级回归测试;建议发布候选版本运行 50~100 轮,并设置失败率控制线,而不是要求零随机失败。 +- 当前可采用的基线是:严格成功率约 80%~85%,这仍不适合作为无需重试的生产链路。 diff --git a/docker/docs/openclaw-upgrade-runbook.md b/docker/docs/openclaw-upgrade-runbook.md new file mode 100644 index 0000000000000000000000000000000000000000..3fa77da67e3c5fd33074d87712aceea2f4c56d16 --- /dev/null +++ b/docker/docs/openclaw-upgrade-runbook.md @@ -0,0 +1,66 @@ +# OpenClaw 升级手册 + +本手册适用于保留 `/var/daedalus-agent` 数据卷的 OpenClaw 内核升级。镜像升级和数据迁移必须分开管理;任何生产升级都应先使用数据卷副本验证。 + +## 升级机制 + +- 镜像固定 OpenClaw 和 Node.js 版本,避免基础镜像漂移导致同一源码产生不同运行时。 +- 每次 OpenClaw 版本变化时,kernel 在 Gateway 启动前运行一次 `openclaw doctor --non-interactive`。 +- 迁移成功后写入 `/var/daedalus-agent/.openclaw/state/daedalus-agent-openclaw-migrated.version`;同版本重启不会重复运行完整迁移。 +- 迁移输出出现插件被阻止或未知 channel 时启动失败,不自动删除插件和 channel 配置。 +- OpenClaw 以 `EX_CONFIG`(默认 78)退出或连续快速失败时,supervisor 停止重启,避免覆盖故障现场。 +- Dockerfile 显式列出的内置 skills 在构建时确认 ClawHub 风险提示;该确认不影响运行时由用户发起的 skill 安装。 + +## 升级前 + +1. 停止写入源数据卷的容器。 +2. 记录旧镜像 ID、OpenClaw 版本和数据卷名称。 +3. 创建数据卷快照或完整副本;只在副本上进行首次升级。 +4. 运行 `npm --prefix test run test:upgrade-contract`。 +5. 构建新镜像,并确认 `/opt/daedalus-agent-toolchain/bin/openclaw --version` 和 `node --version`。 + +命名卷副本示例: + +```bash +docker volume create daedalus-agent-upgrade-test +docker run --rm \ + -v daedalus-agent-data:/source:ro \ + -v daedalus-agent-upgrade-test:/target \ + alpine:3.22 \ + sh -c 'cd /source && tar -cf - . | tar -xf - -C /target' +``` + +## 灰度验证 + +使用副本卷启动新镜像,至少验证: + +1. 首次启动完成,迁移版本戳等于目标 OpenClaw 版本。 +2. OpenClaw 日志不存在 `blocked plugin candidate`、`unknown channel id` 和连续重启。 +3. `openclaw gateway status --json` 成功。 +4. `openclaw plugins registry --refresh` 成功,`daedalus-agent-mqtt-channel` 已加载。 +5. MQTT 入站消息能路由到指定 agent,出站响应 topic 正确。 +6. 管理控制台可以列出、创建、启停和修改 agent/model。 +7. 容器重启后迁移步骤显示 `version unchanged`,Gateway 再次就绪。 + +## 生产切换 + +1. 停止旧容器,禁止旧版本继续写数据卷。 +2. 对生产卷创建时间点快照。 +3. 使用新镜像挂载生产卷,先保持单实例运行。 +4. 完成与灰度相同的健康检查后再恢复外部流量。 +5. 保留旧镜像和迁移前快照,直到观察期结束。 + +## 回滚 + +优先使用“旧镜像 + 迁移前数据卷快照”回滚。不要默认认为旧镜像可以读取新版本迁移后的状态。 + +从 `2026.7.1` 回退到 `2026.6.10` 的验证表明,旧 Gateway 可以启动并通过 RPC 检查,但 MQTT seed 插件会因旧镜像的目录所有权不满足升级后安全策略而被阻止。因此 Gateway ready 不能单独作为回滚成功标准,必须同时验证业务 channel,并恢复迁移前快照。 + +如果升级后尚未产生业务写入,可以停止新容器并恢复迁移前快照。如果已经产生新写入,应先导出需要保留的数据,再由维护人员决定合并或前向修复;不要直接让旧版本覆盖新状态。 + +## 故障处理 + +- 退出码 78:检查当日日志中的配置错误,修复配置后人工重启容器。 +- `rapid restart limit reached`:保留日志和数据卷副本,修复根因后人工重启。 +- 插件所有权被阻止:镜像内置插件必须由 root 所有且不可被非 root 用户写入;不要放宽 OpenClaw 的插件安全检查。 +- 迁移中断:不要删除迁移备份或 `.migrated` 文件;从迁移前卷副本重新验证。 diff --git a/docker/docs/spec.md b/docker/docs/spec.md index dd566db9fc997c8873f60b265e8271a23fea3c6d..7841ca54aee94d5a9100c5a070d5fde7a7925f92 100644 --- a/docker/docs/spec.md +++ b/docker/docs/spec.md @@ -1,6 +1,6 @@ -# AIOS Docker 规格 +# DAEDALUS_AGENT Docker 规格 -`docker/` 构建单容器 AIOS Docker 镜像。仓库不再提供拆分的 kernel/apps Dockerfile,运行时持久化布局也不再区分 kernel/apps。 +`docker/` 构建单容器 DAEDALUS_AGENT Docker 镜像。仓库不再提供拆分的 kernel/apps Dockerfile,运行时持久化布局也不再区分 kernel/apps。 ## 运行组成 @@ -10,24 +10,24 @@ - 内置 MinIO S3 API,监听 `:9000`。 - OpenClaw gateway supervisor。 - management web。 -- `aios-apps-invoke-cli serve`。 +- `daedalus-agent-apps-invoke-cli serve`。 镜像声明开放端口:`3030-3050`、`1883`、`9000`。宿主机映射必须保留 `1883`、`9000`、`3031-3050`;`3030` 默认用于 management web。 ## 双用户机制 -- `aios-agent`:运行 OpenClaw gateway 和 agent 相关命令。局域网访问受 iptables 限制,只能访问本机、互联网和 `AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST` 白名单中的局域网地址。 -- `aios-svc`:运行 supervisor、MQTT、MinIO、management web、invoke service、启动 hook。可访问全部网络接口。 -- 共享组统一为 `aios`,用于只读共享目录和日志/socket 访问控制。 +- `daedalus-agent`:运行 OpenClaw gateway 和 agent 相关命令。局域网访问受 iptables 限制,只能访问本机、互联网和 `DA_INTERNAL_NETWORK_ALLOWLIST` 白名单中的局域网地址。 +- `daedalus-svc`:运行 supervisor、MQTT、MinIO、management web、invoke service、启动 hook。可访问全部网络接口。 +- 共享组统一为 `daedalus-agent`,用于只读共享目录和日志/socket 访问控制。 -应用调用链路中,OpenClaw/agent 只执行 `aios-apps-invoke-cli servercommand` 或 `binding`。CLI client 固定连接 `/var/aios/run/app-invoke.sock`;`aios-apps-invoke-cli serve` 由 `aios-svc` 运行,负责访问 management web、provider SDK 和局域网业务系统。 +应用调用链路中,OpenClaw/agent 只执行 `daedalus-agent-apps-invoke-cli servercommand` 或 `binding`。CLI client 固定连接 `/var/daedalus-agent/run/app-invoke.sock`;`daedalus-agent-apps-invoke-cli serve` 由 `daedalus-svc` 运行,负责访问 management web、provider SDK 和局域网业务系统。 ## 持久化布局 挂载根固定为: ```text -/var/aios +/var/daedalus-agent ``` 部署时推荐使用命名 Docker volume 提供该挂载根,避免 Windows 宿主机目录 bind mount 带来的权限和 I/O 差异。 @@ -35,43 +35,43 @@ 用户提供: ```text -/var/aios/env.json -/var/aios/config.json +/var/daedalus-agent/env.json +/var/daedalus-agent/config.json ``` 启动脚本确保或生成: ```text -/var/aios/credentials.json -/var/aios/run_after_startup.sh -/var/aios/generated/runtime-env.json -/var/aios/generated/runtime-config.json -/var/aios/.openclaw/ -/var/aios/logs/ -/var/aios/management/data/ -/var/aios/ontology/ -/var/aios/workspace-templates/ -/var/aios/minio/ -/var/aios/mqtt/aedes/ -/var/aios/startup-state/ -/var/aios/scripts/ -/var/aios/run/ +/var/daedalus-agent/credentials.json +/var/daedalus-agent/run_after_startup.sh +/var/daedalus-agent/generated/runtime-env.json +/var/daedalus-agent/generated/runtime-config.json +/var/daedalus-agent/.openclaw/ +/var/daedalus-agent/logs/ +/var/daedalus-agent/management/data/ +/var/daedalus-agent/ontology/ +/var/daedalus-agent/workspace-templates/ +/var/daedalus-agent/minio/ +/var/daedalus-agent/mqtt/aedes/ +/var/daedalus-agent/startup-state/ +/var/daedalus-agent/scripts/ +/var/daedalus-agent/run/ ``` -`/var/aios/.openclaw` 保存 OpenClaw workspace、skills、plugins、状态、npm/pip/uv 包和临时目录。`aios-agent` 仅可写 `/var/aios/.openclaw/**` 与 `/var/aios/logs/**`。 +`/var/daedalus-agent/.openclaw` 保存 OpenClaw workspace、skills、plugins、状态、npm/pip/uv 包和临时目录。`daedalus-agent` 仅可写 `/var/daedalus-agent/.openclaw/**` 与 `/var/daedalus-agent/logs/**`。 -`/var/aios/ontology` 不从镜像播种文件。启动时只确保目录存在和权限正确;已存在目录永不覆盖。management console 对该目录读写,OpenClaw 只读。 +`/var/daedalus-agent/ontology` 不从镜像播种文件。启动时只确保目录存在和权限正确;已存在目录永不覆盖。management console 对该目录读写,OpenClaw 只读。 ## Seed 指纹机制 -启动 seed 使用内置内容指纹 `/opt/aios-seed/data/built-in-content.fingerprint` 与运行时 `/var/aios/startup-state/data/.aios-builtin-content.fingerprint` 对比。 +启动 seed 使用内置内容指纹 `/opt/daedalus-agent-seed/data/built-in-content.fingerprint` 与运行时 `/var/daedalus-agent/startup-state/data/.daedalus-agent-builtin-content.fingerprint` 对比。 - 指纹一致且关键内置子项健康时,跳过内置内容同步。 - 指纹不一致时,仅同步需要维护的内置 OpenClaw home、skills、workspace templates、scripts、startup-state 数据和包目录。 -- 内置子项有独立 `.aios-builtin.fingerprint`,用于判断是否需要替换或修复。 -- 被替换的内置内容会先移动到 `/var/aios/startup-state/data/.aios-replaced/`。 +- 内置子项有独立 `.daedalus-agent-builtin.fingerprint`,用于判断是否需要替换或修复。 +- 被替换的内置内容会先移动到 `/var/daedalus-agent/startup-state/data/.daedalus-agent-replaced/`。 - ontology 不参与 seed 内容同步;内置内容清单中的 `ontology` 保持为空数组,只确保目录存在。 ## 日志 -日志目录统一为 `/var/aios/logs`。`AIOS_STARTUP_PROFILE` 默认开启,输出启动步骤耗时日志。 +日志目录统一为 `/var/daedalus-agent/logs`。`DA_STARTUP_PROFILE` 默认开启,输出启动步骤耗时日志。 diff --git a/docker/docs/startup-steps.md b/docker/docs/startup-steps.md index 2649350635ff0895b5470fc2435af4629d5887ed..e84c10f2a32ca69bc04e0fa82cc5cba5c368e608 100644 --- a/docker/docs/startup-steps.md +++ b/docker/docs/startup-steps.md @@ -1,28 +1,28 @@ # 启动步骤清单 -启动日志默认按步骤输出开始、结束和错误信息,时间使用 `Asia/Shanghai` / UTC+8。日志目录统一为 `/var/aios/logs`。`AIOS_STARTUP_PROFILE` 默认开启并必须保留。 +启动日志默认按步骤输出开始、结束和错误信息,时间使用 `Asia/Shanghai` / UTC+8。日志目录统一为 `/var/daedalus-agent/logs`。`DA_STARTUP_PROFILE` 默认开启并必须保留。 ## 预期步骤 | 序号 | stepName | 说明 | | --- | --- | --- | -| 1/14 | `require_input_files` | 检查 `/var/aios/env.json` 和 `config.json`;缺失时播种 sample 文件并退出,存在时校验为 JSON object,并拒绝用户覆盖托管变量。 | +| 1/14 | `require_input_files` | 检查 `/var/daedalus-agent/env.json` 和 `config.json`;缺失时播种 sample 文件并退出,存在时校验为 JSON object,并拒绝用户覆盖托管变量。 | | 2/14 | `ensure_directories` | 创建统一运行目录:`.openclaw`、`logs`、`generated`、`management/data`、`ontology`、`workspace-templates`、`minio`、`mqtt/aedes`、`startup-state`、`scripts`、`run`,并规范用户/组/权限。 | | 3/14 | `ensure_credentials` | 生成或复用 MQTT/MinIO 随机密码,写入 `credentials.json`。 | | 4/14 | `generate_runtime_files` | 合并用户环境、凭据和配置,生成 `generated/runtime-env.json` 与 `generated/runtime-config.json`。 | | 5/14 | `sync_optional_user_files` | 同步可选 `agent_workspace` 到 `workspace-templates/default`。 | -| 6/14 | `ensure_default_startup_hook` | 确保 `/var/aios/run_after_startup.sh` 存在;缺失时写入默认脚本。 | +| 6/14 | `ensure_default_startup_hook` | 确保 `/var/daedalus-agent/run_after_startup.sh` 存在;缺失时写入默认脚本。 | | 7/14 | `start_mqtt` | 启动内置 MQTT broker 并等待 1883 可用。 | | 8/14 | `start_minio` | 启动内置 MinIO 并等待健康检查通过。 | | 9/14 | `init_minio_buckets` | 创建管理端和 agent 的 inbox/outbox bucket。 | | 10/14 | `start_kernel` | 注入统一运行环境并启动 OpenClaw supervisor。 | -| 11/14 | `start_apps` | 以 `aios-svc` 启动 management web 和 `aios-apps-invoke-cli serve`;invoke service 监听 `/var/aios/run/app-invoke.sock`。 | +| 11/14 | `start_apps` | 以 `daedalus-svc` 启动 management web 和 `daedalus-agent-apps-invoke-cli serve`;invoke service 监听 `/var/daedalus-agent/run/app-invoke.sock`。 | | 12/14 | `wait_for_kernel` | 等待 OpenClaw gateway ready 日志出现。 | -| 13/14 | `wait_for_apps` | 等待 management web HTTP 可访问,并确认 invoke service pid 存活、`/var/aios/run/app-invoke.sock` 权限可供 agent 连接。 | -| 14/14 | `run_after_startup` | 在所有组件就绪后执行 `/var/aios/run_after_startup.sh`。 | +| 13/14 | `wait_for_apps` | 等待 management web HTTP 可访问,并确认 invoke service pid 存活、`/var/daedalus-agent/run/app-invoke.sock` 权限可供 agent 连接。 | +| 14/14 | `run_after_startup` | 在所有组件就绪后执行 `/var/daedalus-agent/run_after_startup.sh`。 | -步骤完成后,顶层脚本进入服务守护循环。后续 MQTT、MinIO、OpenClaw supervisor 或 apps supervisor 异常退出时,会按 `AIOS_SERVICE_RESTART_DELAY_SECONDS` 延迟后重启。 +步骤完成后,顶层脚本进入服务守护循环。后续 MQTT、MinIO、OpenClaw supervisor 或 apps supervisor 异常退出时,会按 `DA_SERVICE_RESTART_DELAY_SECONDS` 延迟后重启。 ## Seed 策略 -OpenClaw 内置内容通过指纹判断是否需要修复或更新。ontology 不参与 seed:镜像中不会包含 ontology 文件,启动过程只确保 `/var/aios/ontology` 目录存在和权限正确,已存在目录永不覆盖。 +OpenClaw 内置内容通过指纹判断是否需要修复或更新。ontology 不参与 seed:镜像中不会包含 ontology 文件,启动过程只确保 `/var/daedalus-agent/ontology` 目录存在和权限正确,已存在目录永不覆盖。 diff --git a/docker/internal/kernel/build-scripts/install-versioned-npm-global.sh b/docker/internal/kernel/build-scripts/install-versioned-npm-global.sh index 2b71573283e4b1b951adacb76bc4a50d37694cdb..935e6c82a39e351d474fd024cb1b50c8b882aaae 100644 --- a/docker/internal/kernel/build-scripts/install-versioned-npm-global.sh +++ b/docker/internal/kernel/build-scripts/install-versioned-npm-global.sh @@ -3,11 +3,11 @@ set -euo pipefail package_name="${1:?missing npm package name}" package_version="${2:?missing npm package version}" -prefix="${AIOS_TOOLCHAIN_DIR:?missing AIOS_TOOLCHAIN_DIR}" -registry="${AIOS_BUILD_NPM_REGISTRY:?missing AIOS_BUILD_NPM_REGISTRY}" -npm_cache="${AIOS_BUILD_NPM_CACHE_DIR:-/root/.npm}" -cache_root="${AIOS_BUILD_NPM_TOOL_CACHE_DIR:-/opt/aios-build-cache/npm-tools}" -vendor_root="${AIOS_BUILD_NPM_VENDOR_DIR:-/tmp/aios-vendor-src/npm}" +prefix="${DA_TOOLCHAIN_DIR:?missing DA_TOOLCHAIN_DIR}" +registry="${DA_BUILD_NPM_REGISTRY:?missing DA_BUILD_NPM_REGISTRY}" +npm_cache="${DA_BUILD_NPM_CACHE_DIR:-/root/.npm}" +cache_root="${DA_BUILD_NPM_TOOL_CACHE_DIR:-/opt/daedalus-agent-build-cache/npm-tools}" +vendor_root="${DA_BUILD_NPM_VENDOR_DIR:-/tmp/daedalus-agent-vendor-src/npm}" targetarch="${TARGETARCH:-unknown}" node_version="$(node --version)" npm_version="$(npm --version)" diff --git a/docker/internal/kernel/build-scripts/npm-ci-with-retry.sh b/docker/internal/kernel/build-scripts/npm-ci-with-retry.sh new file mode 100644 index 0000000000000000000000000000000000000000..ce5f4e1a4d38d95b8eb1fb3c934535101f88ffdd --- /dev/null +++ b/docker/internal/kernel/build-scripts/npm-ci-with-retry.sh @@ -0,0 +1,25 @@ +#!/bin/sh +set -eu + +max_attempts="${NPM_CI_MAX_ATTEMPTS:-3}" +retry_delay="${NPM_CI_RETRY_DELAY_SECONDS:-2}" +attempt=1 + +while :; do + if npm ci "$@"; then + exit 0 + else + exit_code=$? + fi + + if [ "$attempt" -ge "$max_attempts" ]; then + printf 'npm ci failed after %s attempt(s); exit code %s\n' "$attempt" "$exit_code" >&2 + exit "$exit_code" + fi + + printf 'npm ci failed with exit code %s; retrying in %ss (%s/%s)\n' \ + "$exit_code" "$retry_delay" "$attempt" "$max_attempts" >&2 + sleep "$retry_delay" + rm -rf node_modules + attempt=$((attempt + 1)) +done diff --git a/docker/internal/kernel/build-scripts/patch-clawhub-timeouts.cjs b/docker/internal/kernel/build-scripts/patch-clawhub-timeouts.cjs index 2566e6d146bc22b0fd4542c37a5e81276096002b..d0bb4094afe1274278d4440c2c33f3049797572e 100644 --- a/docker/internal/kernel/build-scripts/patch-clawhub-timeouts.cjs +++ b/docker/internal/kernel/build-scripts/patch-clawhub-timeouts.cjs @@ -5,7 +5,7 @@ const fs = require("fs"); const path = require("path"); const DEFAULT_TIMEOUT_MS = 180000; -const toolchainDir = process.env.AIOS_TOOLCHAIN_DIR || "/opt/aios-toolchain"; +const toolchainDir = process.env.DA_TOOLCHAIN_DIR || "/opt/daedalus-agent-toolchain"; const nodeModulesDir = path.join(toolchainDir, "lib", "node_modules"); function parsePositiveInteger(value) { @@ -14,7 +14,7 @@ function parsePositiveInteger(value) { } const configuredTimeoutMs = - parsePositiveInteger(process.env.AIOS_CLAWHUB_FETCH_TIMEOUT_MS) || + parsePositiveInteger(process.env.DA_CLAWHUB_FETCH_TIMEOUT_MS) || parsePositiveInteger(process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS) || parsePositiveInteger(process.env.CLAWHUB_REQUEST_TIMEOUT_MS) || DEFAULT_TIMEOUT_MS; @@ -51,7 +51,7 @@ function patchOpenClaw() { } const replacement = `const DEFAULT_FETCH_TIMEOUT_MS = (() => { -\tconst value = Number.parseInt(process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS ?? process.env.AIOS_CLAWHUB_FETCH_TIMEOUT_MS ?? "", 10); +\tconst value = Number.parseInt(process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS ?? process.env.DA_CLAWHUB_FETCH_TIMEOUT_MS ?? "", 10); \treturn Number.isFinite(value) && value > 0 ? value : ${configuredTimeoutMs}; })();`; @@ -87,7 +87,7 @@ function patchOpenClawSkillInstallTimeouts() { } const timeoutConstant = `const OPENCLAW_CLAWHUB_INSTALL_TIMEOUT_MS = (() => { -\tconst value = Number.parseInt(process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS ?? process.env.AIOS_CLAWHUB_FETCH_TIMEOUT_MS ?? "", 10); +\tconst value = Number.parseInt(process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS ?? process.env.DA_CLAWHUB_FETCH_TIMEOUT_MS ?? "", 10); \treturn Number.isFinite(value) && value > 0 ? value : ${configuredTimeoutMs}; })();`; @@ -121,7 +121,7 @@ function patchStandaloneClawHub() { } const replacement = `const REQUEST_TIMEOUT_MS = (() => { -\tconst value = Number.parseInt(process.env.CLAWHUB_REQUEST_TIMEOUT_MS ?? process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS ?? process.env.AIOS_CLAWHUB_FETCH_TIMEOUT_MS ?? "", 10); +\tconst value = Number.parseInt(process.env.CLAWHUB_REQUEST_TIMEOUT_MS ?? process.env.OPENCLAW_CLAWHUB_FETCH_TIMEOUT_MS ?? process.env.DA_CLAWHUB_FETCH_TIMEOUT_MS ?? "", 10); \treturn Number.isFinite(value) && value > 0 ? value : ${configuredTimeoutMs}; })();`; diff --git a/docker/internal/kernel/vendor/npm/attention.md b/docker/internal/kernel/vendor/npm/attention.md index 75d12e0991cdb16ea1e3cd56a9ee171db1c9c5b6..9319a5044a00f9185a81b7a7dcd135ae81015cbe 100644 --- a/docker/internal/kernel/vendor/npm/attention.md +++ b/docker/internal/kernel/vendor/npm/attention.md @@ -2,14 +2,14 @@ 本目录用于放置构建阶段可选的本地 npm vendor 包。文件尺寸通常不适合提交到 Git。 -`tool-builder` 会优先在本目录查找与包名和版本匹配的 `.tgz`,命中后使用本地文件安装;未命中时才从 `AIOS_BUILD_NPM_REGISTRY` 下载。 +`tool-builder` 会优先在本目录查找与包名和版本匹配的 `.tgz`,命中后使用本地文件安装;未命中时才从 `DA_BUILD_NPM_REGISTRY` 下载。 支持的常用命名: -- `openclaw-2026.6.10.tgz` +- `openclaw-2026.7.1.tgz` - `clawhub-0.23.0.tgz` - `tobilu-qmd-2.5.3.tgz` -- `aios-apps-invoke-cli-1.0.0.tgz` +- `daedalus-agent-apps-invoke-cli-1.0.0.tgz` - `mcporter-0.12.0.tgz` - `agent-browser-0.31.0.tgz` @@ -22,5 +22,5 @@ npm/@tobilu/qmd/2.5.3.tgz 生成方式示例: ```bash -npm pack openclaw@2026.6.10 --pack-destination docker/internal/kernel/vendor/npm +npm pack openclaw@2026.7.1 --pack-destination docker/internal/kernel/vendor/npm ``` diff --git a/docker/sample/env.json b/docker/sample/env.json index 68a3e19fa818a1a21885e4e954d5bc80c832cd3a..2472b6a99eb5c9378d25d6f489908b987b6e3338 100644 --- a/docker/sample/env.json +++ b/docker/sample/env.json @@ -1,6 +1,6 @@ { - "AIOS_MANAGEMENT_CONSOLE_PORT": 3030, - "AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT": 100, - "AIOS_HUOZIGE_SERVER_IP": "", - "AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST": "127.0.0.1,::1" + "DA_MANAGEMENT_CONSOLE_PORT": 3030, + "DA_OPENCLAW_GATEWAY_MAX_CONCURRENT": 100, + "DA_HUOZIGE_SERVER_IP": "", + "DA_INTERNAL_NETWORK_ALLOWLIST": "127.0.0.1,::1" } diff --git a/extensions/clawhub-skills/aios-call-app-service/agents/openai.yaml b/extensions/clawhub-skills/aios-call-app-service/agents/openai.yaml deleted file mode 100644 index d33cba86a7916ded78cd483d3c817c4c218054fa..0000000000000000000000000000000000000000 --- a/extensions/clawhub-skills/aios-call-app-service/agents/openai.yaml +++ /dev/null @@ -1,7 +0,0 @@ -interface: - display_name: "AIOS App Service" - short_description: "Read ontology first, then invoke AIOS app services" - default_prompt: "Use $aios-call-app-service to read /var/aios/data/ontology, invoke AIOS application interfaces, continue from live results, and keep any workspace files inside the current senderId folder." - -policy: - allow_implicit_invocation: true diff --git a/extensions/clawhub-skills/aios-call-app-service/.gitignore b/extensions/clawhub-skills/daedalus-agent-call-app-service/.gitignore similarity index 100% rename from extensions/clawhub-skills/aios-call-app-service/.gitignore rename to extensions/clawhub-skills/daedalus-agent-call-app-service/.gitignore diff --git a/extensions/clawhub-skills/aios-call-app-service/SKILL.md b/extensions/clawhub-skills/daedalus-agent-call-app-service/SKILL.md similarity index 78% rename from extensions/clawhub-skills/aios-call-app-service/SKILL.md rename to extensions/clawhub-skills/daedalus-agent-call-app-service/SKILL.md index 8c49d6be4cd21fc5692cb8f2fdfcfa4709b51579..8f25833530b4e636a19fe3562ab291522bae65fa 100644 --- a/extensions/clawhub-skills/aios-call-app-service/SKILL.md +++ b/extensions/clawhub-skills/daedalus-agent-call-app-service/SKILL.md @@ -1,6 +1,6 @@ --- -name: aios-call-app-service -description: 当请求依赖 AIOS、OpenClaw、Forguncy 等业务系统的实时数据、接口调用或业务操作时,优先使用本技能。先读取 AIOS_ONTOLOGY_DIR 指向的本体目录,再确认应用、命令、参数结构和枚举映射,通过 aios-apps-invoke-cli 发起调用,并以实时返回结果作为后续分析和执行依据。遇到 aios-mqtt-channel 会话时,把当前会话的 SessionId 视为唯一合法会话标识;它来自当前会话上下文中的 `topic_id`。如果调用过程需要在 workspace 保存请求体、下载结果或生成文件,文件隔离标识必须使用当前通道的 `senderId`。 +name: daedalus-agent-call-app-service +description: 当请求依赖 DAEDALUS_AGENT、OpenClaw、Forguncy 等业务系统的实时数据、接口调用或业务操作时,优先使用本技能。先读取 DA_ONTOLOGY_DIR 指向的本体目录,再确认应用、命令、参数结构和枚举映射,通过 daedalus-agent-apps-invoke-cli 发起调用,并以实时返回结果作为后续分析和执行依据。遇到 daedalus-agent-mqtt-channel 会话时,把当前会话的 SessionId 视为唯一合法会话标识;它来自当前会话上下文中的 `topic_id`。如果调用过程需要在 workspace 保存请求体、下载结果或生成文件,文件隔离标识必须使用当前通道的 `senderId`。 --- # 系统调用技能 @@ -16,7 +16,7 @@ description: 当请求依赖 AIOS、OpenClaw、Forguncy 等业务系统的实时 ## 必须遵循的流程 -1. 在发起调用前,先读取环境变量 `AIOS_ONTOLOGY_DIR` 指向的本体目录。 +1. 在发起调用前,先读取环境变量 `DA_ONTOLOGY_DIR` 指向的本体目录。 - 禁止缓存、记忆或复用之前读取的本体内容。 - 每次调用都要重新读取,确保使用最新的本体信息。 2. 以本体为以下信息的唯一事实来源: @@ -26,7 +26,7 @@ description: 当请求依赖 AIOS、OpenClaw、Forguncy 等业务系统的实时 - 请求体结构 - 枚举值映射 - 返回字段含义 -3. 只允许通过 `aios-apps-invoke-cli` 调用业务系统接口;CLI 会通过本地 app invoke socket service 完成真实调用。 +3. 只允许通过 `daedalus-agent-apps-invoke-cli` 调用业务系统接口;CLI 会通过本地 app invoke socket service 完成真实调用。 4. 实时调用结果的优先级高于记忆、缓存、历史对话和猜测。 5. 只有在拿到 CLI 返回结果后,才能继续做后续分析、汇总和结论输出。 @@ -48,14 +48,14 @@ description: 当请求依赖 AIOS、OpenClaw、Forguncy 等业务系统的实时 ## 会话标识读取规则 -- `aios-apps-invoke-cli` 的 `-s` 参数,只接受当前会话上下文中的 `topic_id`。 +- `daedalus-agent-apps-invoke-cli` 的 `-s` 参数,只接受当前会话上下文中的 `topic_id`。 - `topic_id` 以 `s-` 开头,后面跟30个数字,不要忽略开头的 `s-`。 - 如果当前上下文没有 `topic_id`,就视为运行时缺参,必须停止调用并明确说明缺口。 - `senderId` 不得传给 `-s` 参数;它只用于 workspace 文件隔离。 ## 约束要求 -- `AIOS_ONTOLOGY_DIR` (默认为 `/var/aios/kernel/ontology`)视为当前事实源。 +- `DA_ONTOLOGY_DIR` (默认为 `/var/daedalus-agent/kernel/ontology`)视为当前事实源。 - 业务系统调用链路固定使用 HZG;CLI 不接受 `provider`、`-p` 或 `--provider` 参数。 - 调用 CLI 时,`-s` 传入当前会话的 `topic_id` 。 - 不能臆造,不能复用其他会话的 `topic_id` 。 @@ -66,7 +66,7 @@ description: 当请求依赖 AIOS、OpenClaw、Forguncy 等业务系统的实时 - 如果缺少 `senderId` 且本次调用需要保存请求体、下载结果或生成文件,必须停止并说明缺口。 - 不要臆造接口名、请求字段或枚举 ID。 - 不要绕过 CLI 自行编写 API 调用脚本。 -- 不要手动启动 `aios-apps-invoke-cli serve` ;运行环境应已提供常驻 app invoke service。 +- 不要手动启动 `daedalus-agent-apps-invoke-cli serve` ;运行环境应已提供常驻 app invoke service。 - 只有拿到 CLI 结果后,才允许用 Python 做二次分析和计算。 - 如果本体不完整或运行时上下文缺失,应明确说明阻塞点,不要猜测。 - 禁止将调用结果存储到记忆、缓存或数据库中;禁止在后续对话中复用之前的调用结果。 diff --git a/extensions/clawhub-skills/daedalus-agent-call-app-service/agents/openai.yaml b/extensions/clawhub-skills/daedalus-agent-call-app-service/agents/openai.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fdb1f06a99f4bb7128ed00c0ea030bcb8050157e --- /dev/null +++ b/extensions/clawhub-skills/daedalus-agent-call-app-service/agents/openai.yaml @@ -0,0 +1,7 @@ +interface: + display_name: "DAEDALUS_AGENT App Service" + short_description: "Read ontology first, then invoke DAEDALUS_AGENT app services" + default_prompt: "Use $daedalus-agent-call-app-service to read /var/daedalus-agent/data/ontology, invoke DAEDALUS_AGENT application interfaces, continue from live results, and keep any workspace files inside the current senderId folder." + +policy: + allow_implicit_invocation: true diff --git a/extensions/clawhub-skills/aios-call-app-service/readme.md b/extensions/clawhub-skills/daedalus-agent-call-app-service/readme.md similarity index 66% rename from extensions/clawhub-skills/aios-call-app-service/readme.md rename to extensions/clawhub-skills/daedalus-agent-call-app-service/readme.md index 6a8a71c78b497ea51f3802eba2fc8ab2bfad267b..67b1ae77764397d7c366aafcd5b59c77784aafa6 100644 --- a/extensions/clawhub-skills/aios-call-app-service/readme.md +++ b/extensions/clawhub-skills/daedalus-agent-call-app-service/readme.md @@ -1,6 +1,6 @@ -# aios-call-app-service +# daedalus-agent-call-app-service -这是一个面向 AIOS / OpenClaw / Forguncy 场景的业务调用技能,用于处理依赖实时业务数据、系统接口、绑定配置或业务动作的请求。 +这是一个面向 DAEDALUS_AGENT / OpenClaw / Forguncy 场景的业务调用技能,用于处理依赖实时业务数据、系统接口、绑定配置或业务动作的请求。 ## 适用场景 @@ -12,16 +12,16 @@ ## 调用原则 -- 先读取 `AIOS_ONTOLOGY_DIR` +- 先读取 `DA_ONTOLOGY_DIR` - 再确认应用、命令、参数结构和枚举映射 -- 统一通过 `aios-apps-invoke-cli` 发起调用;CLI 会把请求交给本地 app invoke socket service +- 统一通过 `daedalus-agent-apps-invoke-cli` 发起调用;CLI 会把请求交给本地 app invoke socket service - 业务系统调用链路固定使用 HZG;CLI 不接受 provider 参数 - 当前会话标识使用 `SessionId` -- 调用 `aios-apps-invoke-cli` 时: +- 调用 `daedalus-agent-apps-invoke-cli` 时: - `-s` 对应 `SessionId` - `POST` 和 `binding` 优先使用 `--body-file` - `GET servercommand` 优先使用 `--query-file` -- 不要绕过 CLI 直接访问业务系统 HTTP 接口;局域网业务系统访问由 `aios-apps-invoke-cli serve` 进程完成 +- 不要绕过 CLI 直接访问业务系统 HTTP 接口;局域网业务系统访问由 `daedalus-agent-apps-invoke-cli serve` 进程完成 - `binding` 参数优先从 `binding-*.md` 的 `CandidatesBindings`、`TableBindings`、`DataSourceBindings` 文档生成兼容 schema - `servercommand` 参数严格按 ontology 的 `Input Arguments` 生成 diff --git a/extensions/clawhub-skills/aios-call-app-service/references/data-processing.md b/extensions/clawhub-skills/daedalus-agent-call-app-service/references/data-processing.md similarity index 88% rename from extensions/clawhub-skills/aios-call-app-service/references/data-processing.md rename to extensions/clawhub-skills/daedalus-agent-call-app-service/references/data-processing.md index 5a257f3b757d68dcdde5c2006549dd460b0a67ca..54663421c77c6fdada9eb3e3cefc8a18a9c59907 100644 --- a/extensions/clawhub-skills/aios-call-app-service/references/data-processing.md +++ b/extensions/clawhub-skills/daedalus-agent-call-app-service/references/data-processing.md @@ -1,6 +1,6 @@ -# AIOS 数据处理规则 +# DAEDALUS_AGENT 数据处理规则 -只用于 `aios-apps-invoke-cli` 的真实返回结果。 +只用于 `daedalus-agent-apps-invoke-cli` 的真实返回结果。 ## 何时用 Python diff --git a/extensions/clawhub-skills/aios-call-app-service/references/invoke-rules.md b/extensions/clawhub-skills/daedalus-agent-call-app-service/references/invoke-rules.md similarity index 95% rename from extensions/clawhub-skills/aios-call-app-service/references/invoke-rules.md rename to extensions/clawhub-skills/daedalus-agent-call-app-service/references/invoke-rules.md index d1aadde8de0e74b53b0b1a1000bd6346a6d82bde..25e1032c3264f62d8f71e93d0f0728b67b459cbd 100644 --- a/extensions/clawhub-skills/aios-call-app-service/references/invoke-rules.md +++ b/extensions/clawhub-skills/daedalus-agent-call-app-service/references/invoke-rules.md @@ -1,16 +1,16 @@ -# AIOS 应用调用细则 +# DAEDALUS_AGENT 应用调用细则 ## 命令 ```bash -aios-apps-invoke-cli servercommand POST --body-file -s -aios-apps-invoke-cli servercommand GET --query-file -s -aios-apps-invoke-cli binding --body-file -s -aios-apps-invoke-cli service-status -aios-apps-invoke-cli status +daedalus-agent-apps-invoke-cli servercommand POST --body-file -s +daedalus-agent-apps-invoke-cli servercommand GET --query-file -s +daedalus-agent-apps-invoke-cli binding --body-file -s +daedalus-agent-apps-invoke-cli service-status +daedalus-agent-apps-invoke-cli status ``` -全局命令不可用时,可使用 `npx aios-apps-invoke-cli ...`。 +全局命令不可用时,可使用 `npx daedalus-agent-apps-invoke-cli ...`。 ## 必守规则 diff --git a/extensions/clawhub-skills/aios-make-chart-image/.gitignore b/extensions/clawhub-skills/daedalus-agent-make-chart-image/.gitignore similarity index 100% rename from extensions/clawhub-skills/aios-make-chart-image/.gitignore rename to extensions/clawhub-skills/daedalus-agent-make-chart-image/.gitignore diff --git a/extensions/clawhub-skills/aios-make-chart-image/SKILL.md b/extensions/clawhub-skills/daedalus-agent-make-chart-image/SKILL.md similarity index 88% rename from extensions/clawhub-skills/aios-make-chart-image/SKILL.md rename to extensions/clawhub-skills/daedalus-agent-make-chart-image/SKILL.md index 8a95a258eca3ab7bc3d0068cf0fe2117574c1ef9..9fabdcc365bc1ad5f8d7c73b96ded3a5b8827c74 100644 --- a/extensions/clawhub-skills/aios-make-chart-image/SKILL.md +++ b/extensions/clawhub-skills/daedalus-agent-make-chart-image/SKILL.md @@ -1,9 +1,9 @@ --- -name: aios-make-chart-image -description: 当 OpenClaw 或 AIOS agent 需要把 JSON、Markdown 表格或 ECharts option 渲染成图表图片时,必须使用本技能。使用内置 JavaScript 脚本解析数据、生成 ECharts 配置,并导出 PNG、SVG、JPEG 或 WebP 图片;不要临时手写浏览器截图流程。 +name: daedalus-agent-make-chart-image +description: 当 OpenClaw 或 DAEDALUS_AGENT agent 需要把 JSON、Markdown 表格或 ECharts option 渲染成图表图片时,必须使用本技能。使用内置 JavaScript 脚本解析数据、生成 ECharts 配置,并导出 PNG、SVG、JPEG 或 WebP 图片;不要临时手写浏览器截图流程。 --- -# AIOS 图表图片生成 +# DAEDALUS_AGENT 图表图片生成 本技能用于把结构化数据生成 ECharts 图表,并导出为图片文件。优先使用内置脚本 `scripts/make_chart_image.mjs`,不要在对话中临时拼一个替代渲染脚本。 @@ -14,7 +14,7 @@ description: 当 OpenClaw 或 AIOS agent 需要把 JSON、Markdown 表格或 ECh - 用户提供 JSON 数据并要求生成柱状图、折线图、饼图、散点图等图片。 - 用户提供 Markdown 表格并要求生成图表图片。 - 用户提供完整 ECharts option,需要稳定导出为图片。 -- 需要把图表文件继续通过 `aios-transfer-file` 返回给用户。 +- 需要把图表文件继续通过 `daedalus-agent-transfer-file` 返回给用户。 ## 不可违反的规则 @@ -23,7 +23,7 @@ description: 当 OpenClaw 或 AIOS agent 需要把 JSON、Markdown 表格或 ECh - 每次运行脚本都必须显式传入当前通道的 `--sender-id `;如果无法确认 `senderId`,停止生成,不得用 `topic_id`、用户名或推测值替代。 - 输出到当前工作区内的 `/generated` 目录。 - 输入文件必须来自当前 `` 目录内的 `upload`、`download` 或 `generated`,或通过 stdin / `--data` 提供;禁止读取其他 `senderId` 目录。 -- 如果需要把生成的图片发给用户,先生成本地文件,再使用 `aios-transfer-file` 上传返回。 +- 如果需要把生成的图片发给用户,先生成本地文件,再使用 `daedalus-agent-transfer-file` 上传返回。 - 如果输入是完整 ECharts option,保留用户提供的 option,只补必要的画布尺寸和背景色。 - 如果输入是表格数据,先选择合适的 `chartType`、分类字段和数值字段;字段不明确时说明假设。 @@ -37,7 +37,7 @@ description: 当 OpenClaw 或 AIOS agent 需要把 JSON、Markdown 表格或 ECh 首次使用前检查依赖: ```bash -cd /path/to/aios-make-chart-image +cd /path/to/daedalus-agent-make-chart-image npm ls echarts sharp --depth=0 ``` diff --git a/extensions/clawhub-skills/aios-make-chart-image/agents/openai.yaml b/extensions/clawhub-skills/daedalus-agent-make-chart-image/agents/openai.yaml similarity index 35% rename from extensions/clawhub-skills/aios-make-chart-image/agents/openai.yaml rename to extensions/clawhub-skills/daedalus-agent-make-chart-image/agents/openai.yaml index 11a53c83abeecfaeded089b02c6ff2d93888bee0..33584352bde9126c047e1acccacc93e1e0f8b53b 100644 --- a/extensions/clawhub-skills/aios-make-chart-image/agents/openai.yaml +++ b/extensions/clawhub-skills/daedalus-agent-make-chart-image/agents/openai.yaml @@ -1,7 +1,7 @@ interface: - display_name: "AIOS Chart Image" + display_name: "DAEDALUS_AGENT Chart Image" short_description: "Render JSON or Markdown data into ECharts images" - default_prompt: "Use $aios-make-chart-image to turn current senderId JSON, Markdown tables, or ECharts options into PNG, SVG, JPEG, or WebP chart images under generated." + default_prompt: "Use $daedalus-agent-make-chart-image to turn current senderId JSON, Markdown tables, or ECharts options into PNG, SVG, JPEG, or WebP chart images under generated." policy: allow_implicit_invocation: true diff --git a/extensions/clawhub-skills/aios-make-chart-image/package-lock.json b/extensions/clawhub-skills/daedalus-agent-make-chart-image/package-lock.json similarity index 99% rename from extensions/clawhub-skills/aios-make-chart-image/package-lock.json rename to extensions/clawhub-skills/daedalus-agent-make-chart-image/package-lock.json index 3d5a5824325b6a04a485a7756b7f47b72df63884..8ff86d76671db446cfcd534f0f3d0b8af37af6da 100644 --- a/extensions/clawhub-skills/aios-make-chart-image/package-lock.json +++ b/extensions/clawhub-skills/daedalus-agent-make-chart-image/package-lock.json @@ -1,10 +1,10 @@ { - "name": "aios-make-chart-image", + "name": "daedalus-agent-make-chart-image", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aios-make-chart-image", + "name": "daedalus-agent-make-chart-image", "dependencies": { "dayjs": "^1.11.21", "echarts": "^6.0.0", diff --git a/extensions/clawhub-skills/aios-make-chart-image/package.json b/extensions/clawhub-skills/daedalus-agent-make-chart-image/package.json similarity index 78% rename from extensions/clawhub-skills/aios-make-chart-image/package.json rename to extensions/clawhub-skills/daedalus-agent-make-chart-image/package.json index 24ad478a2f671d49830a283bb4b1205485fdc0f8..047a29cf6f201c4edf30a16ffb3dbe8cb4464a64 100644 --- a/extensions/clawhub-skills/aios-make-chart-image/package.json +++ b/extensions/clawhub-skills/daedalus-agent-make-chart-image/package.json @@ -1,5 +1,5 @@ { - "name": "aios-make-chart-image", + "name": "daedalus-agent-make-chart-image", "private": true, "type": "module", "dependencies": { diff --git a/extensions/clawhub-skills/aios-make-chart-image/scripts/make_chart_image.mjs b/extensions/clawhub-skills/daedalus-agent-make-chart-image/scripts/make_chart_image.mjs similarity index 98% rename from extensions/clawhub-skills/aios-make-chart-image/scripts/make_chart_image.mjs rename to extensions/clawhub-skills/daedalus-agent-make-chart-image/scripts/make_chart_image.mjs index 9318d54e1892596e3985782da8b91a3a9add73bf..02335acac7b07fa13886b131e9b229f11d3a13e6 100644 --- a/extensions/clawhub-skills/aios-make-chart-image/scripts/make_chart_image.mjs +++ b/extensions/clawhub-skills/daedalus-agent-make-chart-image/scripts/make_chart_image.mjs @@ -12,7 +12,7 @@ import timezone from "dayjs/plugin/timezone.js"; const DEFAULT_WIDTH = 1200; const DEFAULT_HEIGHT = 800; -const SKILL_NAME = "aios-make-chart-image"; +const SKILL_NAME = "daedalus-agent-make-chart-image"; const SUPPORTED_FORMATS = new Set(["png", "svg", "jpg", "jpeg", "webp"]); const OPTION_KEYS = new Set([ "series", @@ -51,17 +51,17 @@ function beijingTime() { } function resolveLogDir() { - const configured = process.env.AIOS_LOG_DIR?.trim(); + const configured = process.env.DA_LOG_DIR?.trim(); if (configured) { return configured; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -107,13 +107,13 @@ function createDestination() { const logger = pino({ name: SKILL_NAME, - level: process.env.AIOS_LOG_LEVEL || "info", + level: process.env.DA_LOG_LEVEL || "info", timestamp: () => `,"ts":"${beijingTime()}"`, base: null }, createDestination()); function fail(message, code = 1) { - logger.error({ error: { message } }, "aios-make-chart-image failed"); + logger.error({ error: { message } }, "daedalus-agent-make-chart-image failed"); process.exit(code); } @@ -979,6 +979,6 @@ main().catch((error) => { error: error instanceof Error ? { message: reason, stack: error.stack } : { message: reason } - }, "aios-make-chart-image failed"); + }, "daedalus-agent-make-chart-image failed"); process.exit(1); }); diff --git a/extensions/clawhub-skills/aios-self-improving-agent/SKILL.md b/extensions/clawhub-skills/daedalus-agent-self-improving-agent/SKILL.md similarity index 82% rename from extensions/clawhub-skills/aios-self-improving-agent/SKILL.md rename to extensions/clawhub-skills/daedalus-agent-self-improving-agent/SKILL.md index bb4bb8a21b3fcf75618124f7d458c58f59511269..6b78a8c0e00e5c4e5007a0d741abce91b21ac67b 100644 --- a/extensions/clawhub-skills/aios-self-improving-agent/SKILL.md +++ b/extensions/clawhub-skills/daedalus-agent-self-improving-agent/SKILL.md @@ -1,23 +1,23 @@ --- -name: aios-self-improving-agent -description: 在 AIOS/OpenClaw 运行环境中记录当前 agent 的错误、纠正、经验、知识缺口和可复用改进。适用于命令失败、用户纠正回答、发现过时知识、外部工具/API 异常、同类问题反复出现、完成复杂任务后需要沉淀经验、或开始重要任务前需要回顾当前 agent workspace 内历史 learnings 的场景。若环境中有 QMD,优先使用 per-workspace QMD 索引检索和去重。该技能必须保持 per-agent 逻辑隔离,只在当前 agent workspace 内读写 `.learnings/`,不得默认写全局 workspace、其他 agent workspace、共享 skill 目录或管理面配置。 +name: daedalus-agent-self-improving-agent +description: 在 DAEDALUS_AGENT/OpenClaw 运行环境中记录当前 agent 的错误、纠正、经验、知识缺口和可复用改进。适用于命令失败、用户纠正回答、发现过时知识、外部工具/API 异常、同类问题反复出现、完成复杂任务后需要沉淀经验、或开始重要任务前需要回顾当前 agent workspace 内历史 learnings 的场景。若环境中有 QMD,优先使用 per-workspace QMD 索引检索和去重。该技能必须保持 per-agent 逻辑隔离,只在当前 agent workspace 内读写 `.learnings/`,不得默认写全局 workspace、其他 agent workspace、共享 skill 目录或管理面配置。 --- -# AIOS 自改进 Agent +# DAEDALUS_AGENT 自改进 Agent -本技能用于把当前 agent 在任务中遇到的错误、纠正和可复用经验沉淀到当前 workspace 的 `.learnings/`。它面向 AIOS 的 per-agent 逻辑隔离模型:共享 skill 可以全局预装,但学习记录必须默认留在当前 agent 的 workspace 内。 +本技能用于把当前 agent 在任务中遇到的错误、纠正和可复用经验沉淀到当前 workspace 的 `.learnings/`。它面向 DAEDALUS_AGENT 的 per-agent 逻辑隔离模型:共享 skill 可以全局预装,但学习记录必须默认留在当前 agent 的 workspace 内。 workspace 内的会话文件还必须按当前通道的 `senderId` 做二级隔离。`senderId` 是生成、下载、上传文件的唯一目录隔离标识;`.learnings/` 可以记录脱敏经验,但不得读取、查询、引用或汇总其他 `senderId` 目录中的文件证据。 ## 边界规则 - 只在当前工作目录或当前 agent workspace 内读写 `.learnings/`。 -- 不要使用 `~/.openclaw/workspace` 作为默认路径;AIOS 中 workspace 位于 `/var/aios/.openclaw/workspaces/` 或等价运行路径。 +- 不要使用 `~/.openclaw/workspace` 作为默认路径;DAEDALUS_AGENT 中 workspace 位于 `/var/daedalus-agent/.openclaw/workspaces/` 或等价运行路径。 - 不要读取、写入或汇总其他 agent 的 workspace,除非用户明确指定且当前运行环境允许。 - 不要读取、写入、查询、索引或汇总其他 `senderId` 的 `upload`、`download`、`generated` 目录。 - 记录与文件相关的错误或经验时,只引用当前 `senderId` 目录内的相对路径,并脱敏文件名中可能包含的私人信息。 - 不要把学习记录自动写入全局 `AGENTS.md`、`SOUL.md`、`TOOLS.md`、workspace template、`.openclaw/skills`、`openclaw.json` 或任何管理面配置。 -- 不要调用 `openclaw agents add/delete`、`openclaw skills install/uninstall` 等拓扑或全局 skill 管理命令;这些变更必须走 `aios-management-web` 或人工管理流程。 +- 不要调用 `openclaw agents add/delete`、`openclaw skills install/uninstall` 等拓扑或全局 skill 管理命令;这些变更必须走 `daedalus-agent-management-web` 或人工管理流程。 - 不要记录密钥、token、私钥、完整环境变量、完整配置文件、完整源码文件或未经脱敏的命令输出。 - 只记录足够复现和预防问题的摘要、路径、错误片段和建议动作。 - 可以使用 QMD 提升 `.learnings/` 的搜索质量,但 QMD 只作为当前 workspace 的搜索缓存;不要把其他 agent workspace、全局 skill、workspace template 或管理面目录加入该技能的 QMD 索引。 @@ -33,17 +33,17 @@ mkdir -p .learnings [ -f .learnings/FEATURE_REQUESTS.md ] || printf "# Feature Requests\n\n用户提出但当前能力或系统尚未稳定支持的能力请求。\n\n---\n" > .learnings/FEATURE_REQUESTS.md ``` -如果当前目录不确定,先确认自己位于业务 agent 的 workspace 根目录。AIOS 中不要把仓库源码目录、全局 skill 目录或 `/var/aios/.openclaw` 根目录当成学习记录根目录。 +如果当前目录不确定,先确认自己位于业务 agent 的 workspace 根目录。DAEDALUS_AGENT 中不要把仓库源码目录、全局 skill 目录或 `/var/daedalus-agent/.openclaw` 根目录当成学习记录根目录。 ## QMD 搜索优先 -AIOS 环境通常内置 QMD。需要回顾、去重或查找相似经验时,优先为当前 `.learnings/` 使用独立的 per-workspace QMD index;不要使用可能混入其他 workspace 的默认 index。 +DAEDALUS_AGENT 环境通常内置 QMD。需要回顾、去重或查找相似经验时,优先为当前 `.learnings/` 使用独立的 per-workspace QMD index;不要使用可能混入其他 workspace 的默认 index。 初始化或刷新当前 `.learnings/` 搜索缓存: ```bash workspace_root="$(pwd -P)" -qmd_index="aios-learnings-$(printf "%s" "$workspace_root" | sha256sum | awk '{print substr($1,1,12)}')" +qmd_index="daedalus-agent-learnings-$(printf "%s" "$workspace_root" | sha256sum | awk '{print substr($1,1,12)}')" if command -v qmd >/dev/null 2>&1 && [ -d .learnings ]; then qmd --index "$qmd_index" collection add "$workspace_root/.learnings" --name learnings --mask "**/*.md" >/dev/null 2>&1 || true qmd --index "$qmd_index" context add qmd://learnings "当前 agent workspace 的自改进学习记录、错误和能力请求" >/dev/null 2>&1 || true @@ -73,7 +73,7 @@ fi ```bash workspace_root="$(pwd -P)" -qmd_index="aios-learnings-$(printf "%s" "$workspace_root" | sha256sum | awk '{print substr($1,1,12)}')" +qmd_index="daedalus-agent-learnings-$(printf "%s" "$workspace_root" | sha256sum | awk '{print substr($1,1,12)}')" if command -v qmd >/dev/null 2>&1 && [ -d .learnings ]; then qmd --index "$qmd_index" update >/dev/null 2>&1 || true qmd --index "$qmd_index" search --json -n 10 "Area Tags Pattern-Key recent errors corrections" @@ -200,7 +200,7 @@ ID 格式为 `TYPE-YYYYMMDD-XXX`: ```bash query="关键词" workspace_root="$(pwd -P)" -qmd_index="aios-learnings-$(printf "%s" "$workspace_root" | sha256sum | awk '{print substr($1,1,12)}')" +qmd_index="daedalus-agent-learnings-$(printf "%s" "$workspace_root" | sha256sum | awk '{print substr($1,1,12)}')" if command -v qmd >/dev/null 2>&1 && [ -d .learnings ]; then qmd --index "$qmd_index" update >/dev/null 2>&1 || true qmd --index "$qmd_index" query --json -n 10 --min-score 0.25 "$query" @@ -227,9 +227,9 @@ fi 禁止自动更新: -- `/var/aios/workspace-templates` -- `/var/aios/.openclaw/skills` -- `/var/aios/.openclaw/openclaw.json` +- `/var/daedalus-agent/workspace-templates` +- `/var/daedalus-agent/.openclaw/skills` +- `/var/daedalus-agent/.openclaw/openclaw.json` - 其他 agent workspace - 管理服务数据文件 diff --git a/extensions/clawhub-skills/aios-self-improving-agent/agents/openai.yaml b/extensions/clawhub-skills/daedalus-agent-self-improving-agent/agents/openai.yaml similarity index 33% rename from extensions/clawhub-skills/aios-self-improving-agent/agents/openai.yaml rename to extensions/clawhub-skills/daedalus-agent-self-improving-agent/agents/openai.yaml index a100a5b4d6c9d8f78e6b9355d510ead631326a1f..f6f16cbfbe77ed5c61f35aef377f345b3fa22d10 100644 --- a/extensions/clawhub-skills/aios-self-improving-agent/agents/openai.yaml +++ b/extensions/clawhub-skills/daedalus-agent-self-improving-agent/agents/openai.yaml @@ -1,7 +1,7 @@ interface: - display_name: "AIOS 自改进 Agent" + display_name: "DAEDALUS_AGENT 自改进 Agent" short_description: "在当前 agent workspace 内记录经验和错误" - default_prompt: "Use $aios-self-improving-agent 在当前 AIOS agent workspace 内记录纠正、命令失败和可复用经验;涉及会话文件时仅引用当前 senderId。" + default_prompt: "Use $daedalus-agent-self-improving-agent 在当前 DAEDALUS_AGENT agent workspace 内记录纠正、命令失败和可复用经验;涉及会话文件时仅引用当前 senderId。" policy: allow_implicit_invocation: true diff --git a/extensions/clawhub-skills/aios-transfer-file/.gitignore b/extensions/clawhub-skills/daedalus-agent-transfer-file/.gitignore similarity index 100% rename from extensions/clawhub-skills/aios-transfer-file/.gitignore rename to extensions/clawhub-skills/daedalus-agent-transfer-file/.gitignore diff --git a/extensions/clawhub-skills/aios-transfer-file/README.md b/extensions/clawhub-skills/daedalus-agent-transfer-file/README.md similarity index 54% rename from extensions/clawhub-skills/aios-transfer-file/README.md rename to extensions/clawhub-skills/daedalus-agent-transfer-file/README.md index 5ce62414e4069451c47e930738659f565a9d5159..8b771ff2bf9ed2b66f3fe9ce43f79f38284d1a60 100644 --- a/extensions/clawhub-skills/aios-transfer-file/README.md +++ b/extensions/clawhub-skills/daedalus-agent-transfer-file/README.md @@ -1,8 +1,8 @@ -# aios-transfer-file +# daedalus-agent-transfer-file -> 本技能只适用于受控 AIOS 部署。它可能访问真实业务系统,必须按最小权限配置。只读操作可以自动执行;任何会改变状态的操作,包括创建、更新、提交、审批、驳回、删除或触发,都必须先预览目标应用、命令和请求体,并获得明确人工确认。CLI 必须固定到经过评审的版本,Ontology 来源必须可信且可审计。 +> 本技能只适用于受控 DAEDALUS_AGENT 部署。它可能访问真实业务系统,必须按最小权限配置。只读操作可以自动执行;任何会改变状态的操作,包括创建、更新、提交、审批、驳回、删除或触发,都必须先预览目标应用、命令和请求体,并获得明确人工确认。CLI 必须固定到经过评审的版本,Ontology 来源必须可信且可审计。 -OpenClaw/AIOS 文件传输 skill。使用 `scripts/transfer_s3.mjs` 动态加载当前目录本地安装的 `@aws-sdk/client-s3`,按当前通道的 `senderId` 把 `file_input://...` 对象下载到工作区 `/upload`,或把当前 `` 目录内的本地文件上传到发件箱 bucket。 +OpenClaw/DAEDALUS_AGENT 文件传输 skill。使用 `scripts/transfer_s3.mjs` 动态加载当前目录本地安装的 `@aws-sdk/client-s3`,按当前通道的 `senderId` 把 `file_input://...` 对象下载到工作区 `/upload`,或把当前 `` 目录内的本地文件上传到发件箱 bucket。 workspace 中的会话文件必须按 `senderId` 隔离: @@ -14,13 +14,13 @@ workspace 中的会话文件必须按 `senderId` 隔离: - Node.js - `@aws-sdk/client-s3` -- `AIOS_S3_ENDPOINT` -- `AIOS_S3_REGION` -- `AIOS_S3_ACCESS_KEY_ID` -- `AIOS_S3_SECRET_ACCESS_KEY` -- `AIOS_S3_FORCE_PATH_STYLE` -- `AIOS_S3_AGENT_INBOX_BUCKET` -- `AIOS_S3_AGENT_OUTBOX_BUCKET` +- `DA_S3_ENDPOINT` +- `DA_S3_REGION` +- `DA_S3_ACCESS_KEY_ID` +- `DA_S3_SECRET_ACCESS_KEY` +- `DA_S3_FORCE_PATH_STYLE` +- `DA_S3_AGENT_INBOX_BUCKET` +- `DA_S3_AGENT_OUTBOX_BUCKET` ## 用法 @@ -38,10 +38,10 @@ Dockerfile 示例模式: ```dockerfile # 把 skill 复制进镜像 -COPY skills/aios-transfer-file /opt/aios/skills/aios-transfer-file +COPY skills/daedalus-agent-transfer-file /opt/daedalus-agent/skills/daedalus-agent-transfer-file # 在镜像构建阶段安装这个 skill 的本地依赖 -WORKDIR /opt/aios/skills/aios-transfer-file +WORKDIR /opt/daedalus-agent/skills/daedalus-agent-transfer-file RUN npm ci ``` diff --git a/extensions/clawhub-skills/aios-transfer-file/SKILL.md b/extensions/clawhub-skills/daedalus-agent-transfer-file/SKILL.md similarity index 78% rename from extensions/clawhub-skills/aios-transfer-file/SKILL.md rename to extensions/clawhub-skills/daedalus-agent-transfer-file/SKILL.md index 98b93e2a88bea493ea88c4266c967d95f42dd816..03c0259f8c03604ae2816776072fa5f6574c39ed 100644 --- a/extensions/clawhub-skills/aios-transfer-file/SKILL.md +++ b/extensions/clawhub-skills/daedalus-agent-transfer-file/SKILL.md @@ -1,11 +1,11 @@ --- -name: aios-transfer-file -description: 通过兼容 AWS S3 的 SDK 为 OpenClaw 和 AIOS agent 处理文件传输。当 agent 收到 `file_input://...` URI、需要按当前 `senderId` 把输入文件下载到工作区,或需要把当前 `senderId` 目录内的本地文件上传后以 `file_output://...` URI 返回给用户时,必须使用这个 skill。不要使用 `aws` CLI 或任何外部 S3 客户端程序完成这些传输。 +name: daedalus-agent-transfer-file +description: 通过兼容 AWS S3 的 SDK 为 OpenClaw 和 DAEDALUS_AGENT agent 处理文件传输。当 agent 收到 `file_input://...` URI、需要按当前 `senderId` 把输入文件下载到工作区,或需要把当前 `senderId` 目录内的本地文件上传后以 `file_output://...` URI 返回给用户时,必须使用这个 skill。不要使用 `aws` CLI 或任何外部 S3 客户端程序完成这些传输。 --- -# AIOS 文件传输 +# DAEDALUS_AGENT 文件传输 -> 本技能只适用于受控 AIOS 部署。它可能访问真实业务系统,必须按最小权限配置。只读操作可以自动执行;任何会改变状态的操作,包括创建、更新、提交、审批、驳回、删除或触发,都必须先预览目标应用、命令和请求体,并获得明确人工确认。CLI 必须固定到经过评审的版本,Ontology 来源必须可信且可审计。 +> 本技能只适用于受控 DAEDALUS_AGENT 部署。它可能访问真实业务系统,必须按最小权限配置。只读操作可以自动执行;任何会改变状态的操作,包括创建、更新、提交、审批、驳回、删除或触发,都必须先预览目标应用、命令和请求体,并获得明确人工确认。CLI 必须固定到经过评审的版本,Ontology 来源必须可信且可审计。 在 OpenClaw 中,所有文件和图片传输,包括接受用户发来的文件,和给用户发送文件,都必须使用兼容 AWS S3 的 SDK。这适用于附件、`file_input://` 消息,以及任何需要把文件返回给用户的场景。 @@ -32,29 +32,29 @@ description: 通过兼容 AWS S3 的 SDK 为 OpenClaw 和 AIOS agent 处理文 ## 运行时配置 -使用 AIOS 环境变量构建 S3 客户端: +使用 DAEDALUS_AGENT 环境变量构建 S3 客户端: -- `AIOS_S3_ENDPOINT` -- `AIOS_S3_REGION` -- `AIOS_S3_ACCESS_KEY_ID` -- `AIOS_S3_SECRET_ACCESS_KEY` -- `AIOS_S3_FORCE_PATH_STYLE` +- `DA_S3_ENDPOINT` +- `DA_S3_REGION` +- `DA_S3_ACCESS_KEY_ID` +- `DA_S3_SECRET_ACCESS_KEY` +- `DA_S3_FORCE_PATH_STYLE` 使用以下 bucket 变量: -- 收件箱 bucket:`AIOS_S3_AGENT_INBOX_BUCKET` -- 发件箱 bucket:`AIOS_S3_AGENT_OUTBOX_BUCKET` +- 收件箱 bucket:`DA_S3_AGENT_INBOX_BUCKET` +- 发件箱 bucket:`DA_S3_AGENT_OUTBOX_BUCKET` -发件箱变量统一使用 `AIOS_S3_AGENT_OUTBOX_BUCKET`,不要引入其他别名。 +发件箱变量统一使用 `DA_S3_AGENT_OUTBOX_BUCKET`,不要引入其他别名。 构造 SDK 客户端时: -- 从 `AIOS_S3_ENDPOINT` 设置自定义 endpoint。 -- 从 `AIOS_S3_REGION` 设置 region。 -- 显式传入 `AIOS_S3_ACCESS_KEY_ID` 和 `AIOS_S3_SECRET_ACCESS_KEY` 作为访问凭证。 -- 当 `AIOS_S3_FORCE_PATH_STYLE` 为真值时启用 path-style,例如 `1`、`true` 或 `TRUE`。 +- 从 `DA_S3_ENDPOINT` 设置自定义 endpoint。 +- 从 `DA_S3_REGION` 设置 region。 +- 显式传入 `DA_S3_ACCESS_KEY_ID` 和 `DA_S3_SECRET_ACCESS_KEY` 作为访问凭证。 +- 当 `DA_S3_FORCE_PATH_STYLE` 为真值时启用 path-style,例如 `1`、`true` 或 `TRUE`。 -与 `aios-agent-management-console` 保持一致,使用 TypeScript 或 JavaScript,并采用 AWS SDK for JavaScript v3,具体为 `@aws-sdk/client-s3`。 +与 `daedalus-agent-management-console` 保持一致,使用 TypeScript 或 JavaScript,并采用 AWS SDK for JavaScript v3,具体为 `@aws-sdk/client-s3`。 ## 内置脚本 @@ -67,8 +67,8 @@ node scripts/transfer_s3.mjs upload-file --source "/abs/path/to/file.bin" --work 内置脚本的行为: -- 使用 `@aws-sdk/client-s3` 和上面的 AIOS S3 环境变量。 -- 与 `aios-agent-management-console` 保持同样风格:ESM、动态导入本地安装的包、显式构造 `S3Client`、显式传入凭证,并且 `AIOS_S3_FORCE_PATH_STYLE` 默认取 `true`。 +- 使用 `@aws-sdk/client-s3` 和上面的 DAEDALUS_AGENT S3 环境变量。 +- 与 `daedalus-agent-management-console` 保持同样风格:ESM、动态导入本地安装的包、显式构造 `S3Client`、显式传入凭证,并且 `DA_S3_FORCE_PATH_STYLE` 默认取 `true`。 - 自动创建当前 `senderId` 下需要的 `upload` 或 `generated` 目录。 - 把 `file_input://...` URI 下载到 `/upload`。 - 把待发送文件复制到 `/generated`,重命名为要求的时间戳前缀格式,并上传到发件箱 bucket 根目录。 @@ -110,7 +110,7 @@ node scripts/transfer_s3.mjs upload-file --source "/abs/path/to/file.bin" --work 实现要求: - 下载请求必须以解析得到的 URI bucket 和 key 为准。 -- 你可以把 URI bucket 与 `AIOS_S3_AGENT_INBOX_BUCKET` 做诊断比较,但下载时不要改写 URI bucket。 +- 你可以把 URI bucket 与 `DA_S3_AGENT_INBOX_BUCKET` 做诊断比较,但下载时不要改写 URI bucket。 - 使用 SDK 流式下载对象,不要通过 shell 调用客户端可执行程序。 - 下载本地目标必须位于当前 `/upload`,不得写入其他 `senderId` 或工作区根目录。 - 优先调用 `scripts/transfer_s3.mjs download-uri ...`,不要写一次性的 SDK 代码。 @@ -120,7 +120,7 @@ node scripts/transfer_s3.mjs upload-file --source "/abs/path/to/file.bin" --work 当你需要把本地文件发回给用户时: 1. 先用普通 assistant 消息说明文件内容以及用户该如何使用。 -2. 从 `AIOS_S3_AGENT_OUTBOX_BUCKET` 解析发件箱 bucket。 +2. 从 `DA_S3_AGENT_OUTBOX_BUCKET` 解析发件箱 bucket。 3. 确认源文件位于当前 `` 目录内;不得上传其他 `senderId` 或工作区根目录下的文件。 4. 把文件重命名为带时间戳前缀的格式,例如 `123456_fname.bin`(如果原始 basename 已经有时间戳前缀,则替换原前缀,不要叠加),然后将最终文件名中的所有空格替换为 `_`,最后将该文件复制到工作区当前 `/generated` 目录。 5. 远端目标必须使用发件箱 bucket 根目录,不要额外添加子目录。 diff --git a/extensions/clawhub-skills/aios-transfer-file/agents/openai.yaml b/extensions/clawhub-skills/daedalus-agent-transfer-file/agents/openai.yaml similarity index 31% rename from extensions/clawhub-skills/aios-transfer-file/agents/openai.yaml rename to extensions/clawhub-skills/daedalus-agent-transfer-file/agents/openai.yaml index 4a63d3d0a152064b9dd57fde9d8f6439244229b7..54f923cb7f7674a12d3e36529faa3f6d27e2d58f 100644 --- a/extensions/clawhub-skills/aios-transfer-file/agents/openai.yaml +++ b/extensions/clawhub-skills/daedalus-agent-transfer-file/agents/openai.yaml @@ -1,7 +1,7 @@ interface: - display_name: "AIOS File Transfer" + display_name: "DAEDALUS_AGENT File Transfer" short_description: "Transfer OpenClaw files through an S3 SDK" - default_prompt: "Use $aios-transfer-file to receive `file_input://...` URIs into the current senderId workspace folder or upload a current senderId file back to the user through an S3-compatible SDK." + default_prompt: "Use $daedalus-agent-transfer-file to receive `file_input://...` URIs into the current senderId workspace folder or upload a current senderId file back to the user through an S3-compatible SDK." policy: allow_implicit_invocation: true diff --git a/extensions/clawhub-skills/aios-transfer-file/package-lock.json b/extensions/clawhub-skills/daedalus-agent-transfer-file/package-lock.json similarity index 99% rename from extensions/clawhub-skills/aios-transfer-file/package-lock.json rename to extensions/clawhub-skills/daedalus-agent-transfer-file/package-lock.json index 524b35cb5d9238c8cb44dbff097fc968541d517b..ae1fbe461acfdf1dcde1f9c49700b64674c74e74 100644 --- a/extensions/clawhub-skills/aios-transfer-file/package-lock.json +++ b/extensions/clawhub-skills/daedalus-agent-transfer-file/package-lock.json @@ -1,10 +1,10 @@ { - "name": "aios-transfer-file", + "name": "daedalus-agent-transfer-file", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aios-transfer-file", + "name": "daedalus-agent-transfer-file", "dependencies": { "@aws-sdk/client-s3": "^3.1045.0", "dayjs": "^1.11.21", diff --git a/extensions/clawhub-skills/aios-transfer-file/package.json b/extensions/clawhub-skills/daedalus-agent-transfer-file/package.json similarity index 78% rename from extensions/clawhub-skills/aios-transfer-file/package.json rename to extensions/clawhub-skills/daedalus-agent-transfer-file/package.json index 5da39aa657b6098430a637cba7864e4b33c607b1..3e2d823ee025efb2357771fcfe83c7c1192a772b 100644 --- a/extensions/clawhub-skills/aios-transfer-file/package.json +++ b/extensions/clawhub-skills/daedalus-agent-transfer-file/package.json @@ -1,5 +1,5 @@ { - "name": "aios-transfer-file", + "name": "daedalus-agent-transfer-file", "private": true, "type": "module", "dependencies": { diff --git a/extensions/clawhub-skills/aios-transfer-file/scripts/transfer_s3.mjs b/extensions/clawhub-skills/daedalus-agent-transfer-file/scripts/transfer_s3.mjs similarity index 92% rename from extensions/clawhub-skills/aios-transfer-file/scripts/transfer_s3.mjs rename to extensions/clawhub-skills/daedalus-agent-transfer-file/scripts/transfer_s3.mjs index 2804cea48af6d46b7ee23e81c2f43df4f9d940e9..03bda079765c6c4677da1119896a072b15a6ae2d 100644 --- a/extensions/clawhub-skills/aios-transfer-file/scripts/transfer_s3.mjs +++ b/extensions/clawhub-skills/daedalus-agent-transfer-file/scripts/transfer_s3.mjs @@ -11,7 +11,7 @@ import utc from "dayjs/plugin/utc.js"; import timezone from "dayjs/plugin/timezone.js"; const TIMESTAMP_PREFIX_RE = /^\d+_/; -const SKILL_NAME = "aios-transfer-file"; +const SKILL_NAME = "daedalus-agent-transfer-file"; dayjs.extend(utc); dayjs.extend(timezone); @@ -23,17 +23,17 @@ function beijingTime() { } function resolveLogDir() { - const configured = process.env.AIOS_LOG_DIR?.trim(); + const configured = process.env.DA_LOG_DIR?.trim(); if (configured) { return configured; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -79,13 +79,13 @@ function createDestination() { const logger = pino({ name: SKILL_NAME, - level: process.env.AIOS_LOG_LEVEL || "info", + level: process.env.DA_LOG_LEVEL || "info", timestamp: () => `,"ts":"${beijingTime()}"`, base: null }, createDestination()); function fail(message, code = 1) { - logger.error({ error: { message } }, "aios-transfer-file failed"); + logger.error({ error: { message } }, "daedalus-agent-transfer-file failed"); process.exit(code); } @@ -161,10 +161,10 @@ function makeTimestampedName(name, { replaceSpaces }) { } function resolveOutboxEnvName() { - if (readOptionalEnv("AIOS_S3_AGENT_OUTBOX_BUCKET")) { - return "AIOS_S3_AGENT_OUTBOX_BUCKET"; + if (readOptionalEnv("DA_S3_AGENT_OUTBOX_BUCKET")) { + return "DA_S3_AGENT_OUTBOX_BUCKET"; } - throw new Error("Missing required environment variable: AIOS_S3_AGENT_OUTBOX_BUCKET"); + throw new Error("Missing required environment variable: DA_S3_AGENT_OUTBOX_BUCKET"); } async function loadAwsSdk() { @@ -177,11 +177,11 @@ async function loadAwsSdk() { async function createS3Client() { const sdk = await loadAwsSdk(); - const endpoint = ensureOptionalUrl("AIOS_S3_ENDPOINT", readOptionalEnv("AIOS_S3_ENDPOINT")); - const region = readOptionalEnv("AIOS_S3_REGION", "us-east-1") ?? "us-east-1"; - const accessKeyId = readRequiredEnv("AIOS_S3_ACCESS_KEY_ID"); - const secretAccessKey = readRequiredEnv("AIOS_S3_SECRET_ACCESS_KEY"); - const forcePathStyle = readBooleanEnv("AIOS_S3_FORCE_PATH_STYLE", true); + const endpoint = ensureOptionalUrl("DA_S3_ENDPOINT", readOptionalEnv("DA_S3_ENDPOINT")); + const region = readOptionalEnv("DA_S3_REGION", "us-east-1") ?? "us-east-1"; + const accessKeyId = readRequiredEnv("DA_S3_ACCESS_KEY_ID"); + const secretAccessKey = readRequiredEnv("DA_S3_SECRET_ACCESS_KEY"); + const forcePathStyle = readBooleanEnv("DA_S3_FORCE_PATH_STYLE", true); return { sdk, @@ -287,7 +287,7 @@ async function ensureBucket(clientBundle, bucket) { return; } catch {} - const region = readOptionalEnv("AIOS_S3_REGION", "us-east-1") ?? "us-east-1"; + const region = readOptionalEnv("DA_S3_REGION", "us-east-1") ?? "us-east-1"; try { await client.send(new sdk.CreateBucketCommand( region === "us-east-1" @@ -470,6 +470,6 @@ main().catch((error) => { error: error instanceof Error ? { message, stack: error.stack } : { message } - }, "aios-transfer-file failed"); + }, "daedalus-agent-transfer-file failed"); process.exit(1); }); diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/.env.example b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.env.example similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/.env.example rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.env.example diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/.gitignore b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.gitignore similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/.gitignore rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.gitignore diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/.npmignore b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.npmignore similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/.npmignore rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/.npmignore diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/CHANGELOG.md b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/CHANGELOG.md similarity index 98% rename from extensions/openclaw-plugins/aios-mqtt-channel/CHANGELOG.md rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/CHANGELOG.md index 9ad97da4f4b8aedbf98bc4ba06ee1cb12736efb1..1c35762d0c148a0744da3f81bd4f47b0f6894684 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/CHANGELOG.md +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/CHANGELOG.md @@ -16,7 +16,7 @@ - 移除本地 `openclaw/plugin-sdk` shim,改用官方 SDK 类型 - 在 setup adapter 和交互式 onboarding 之间共享 MQTT 账号配置组装逻辑 - 在匹配新版宿主预期的同时,保留向后兼容的出站结果字段 -- 增加 manifest `channelConfigs` 元数据,使 OpenClaw 能在运行时加载前校验 `channels.aios-mqtt-channel` +- 增加 manifest `channelConfigs` 元数据,使 OpenClaw 能在运行时加载前校验 `channels.daedalus-agent-mqtt-channel` ## [2.0.6] - 2026-03-27 diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/DEV.md b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/DEV.md similarity index 95% rename from extensions/openclaw-plugins/aios-mqtt-channel/DEV.md rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/DEV.md index 622413fbaed58c6e55706adce95e09c9758d7ffe..90f99191edc3e9b4adea73f3030a1405bffaec63 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/DEV.md +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/DEV.md @@ -2,7 +2,7 @@ ## 项目定位 -`aios-mqtt-channel` 是 OpenClaw 的 MQTT Channel 插件,负责把 OpenClaw Agent 的收发消息映射到 MQTT Broker。 +`daedalus-agent-mqtt-channel` 是 OpenClaw 的 MQTT Channel 插件,负责把 OpenClaw Agent 的收发消息映射到 MQTT Broker。 ## 代码架构 diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/README.md b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/README.md similarity index 85% rename from extensions/openclaw-plugins/aios-mqtt-channel/README.md rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/README.md index 20e61dd32e915c3bc3173f440156db07836f3cce..e259f0188cb892eab3c835e62212bd3cd9096751 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/README.md +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/README.md @@ -1,12 +1,12 @@ -# aios-mqtt-channel +# daedalus-agent-mqtt-channel [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -`aios-mqtt-channel` 是面向 [OpenClaw](https://github.com/openclaw/openclaw) 的 MQTT 双向通道插件。它把 MQTT Broker 接入 OpenClaw,用于 IoT、家庭自动化、服务告警和其他需要经由 MQTT 收发消息的场景。 +`daedalus-agent-mqtt-channel` 是面向 [OpenClaw](https://github.com/openclaw/openclaw) 的 MQTT 双向通道插件。它把 MQTT Broker 接入 OpenClaw,用于 IoT、家庭自动化、服务告警和其他需要经由 MQTT 收发消息的场景。 说明: -- npm 包名、插件 id、channel id 统一为 `aios-mqtt-channel` +- npm 包名、插件 id、channel id 统一为 `daedalus-agent-mqtt-channel` - 当前版本面向 OpenClaw `2026.5.x` 通道 SDK - 支持新的 `channel/setup` 接口和 `configured-state` 元数据 @@ -23,28 +23,28 @@ ## 安装 ```bash -openclaw plugins install aios-mqtt-channel +openclaw plugins install daedalus-agent-mqtt-channel ``` 查看 OpenClaw 当前实际加载的是哪一份插件: ```bash -openclaw plugins info aios-mqtt-channel +openclaw plugins info daedalus-agent-mqtt-channel ``` -如果当前加载的是托管在 `~/.openclaw/extensions/aios-mqtt-channel` 下的版本,可以更新: +如果当前加载的是托管在 `~/.openclaw/extensions/daedalus-agent-mqtt-channel` 下的版本,可以更新: ```bash -openclaw plugins update aios-mqtt-channel +openclaw plugins update daedalus-agent-mqtt-channel ``` 如果 `plugins info` 显示的是旧的手工备份目录,而不是正式安装记录: -1. 把 `~/.openclaw/extensions/` 下旧的 `aios-mqtt-channel` 目录移走 -2. 重新执行 `openclaw plugins install aios-mqtt-channel` +1. 把 `~/.openclaw/extensions/` 下旧的 `daedalus-agent-mqtt-channel` 目录移走 +2. 重新执行 `openclaw plugins install daedalus-agent-mqtt-channel` 3. 重启 OpenClaw 网关 -不要把 `aios-mqtt-channel.bak-*` 这类备份目录留在 `~/.openclaw/extensions/` 下,否则 OpenClaw 可能会识别到重复插件。 +不要把 `daedalus-agent-mqtt-channel.bak-*` 这类备份目录留在 `~/.openclaw/extensions/` 下,否则 OpenClaw 可能会识别到重复插件。 ## 配置 @@ -53,7 +53,7 @@ openclaw plugins update aios-mqtt-channel ```json5 { "channels": { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { "enabled": true, "accounts": { "default": { @@ -86,10 +86,10 @@ openclaw plugins update aios-mqtt-channel }, "plugins": { "allow": [ - "aios-mqtt-channel" + "daedalus-agent-mqtt-channel" ], "entries": { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { "enabled": true } } @@ -99,7 +99,7 @@ openclaw plugins update aios-mqtt-channel 字段说明: -- `channels["aios-mqtt-channel"]` 是通道配置根节点 +- `channels["daedalus-agent-mqtt-channel"]` 是通道配置根节点 - `accounts` 下每个键都是一个 OpenClaw 账号 id;插件会为每个账号启动一个 MQTT 客户端 - `topics.inbound` 是发给 OpenClaw 的 topic - `topics.outbound` 是 OpenClaw 回写回复的 topic @@ -207,7 +207,7 @@ mosquitto_sub -t "openclaw/outbound-lowcode" -v 先确认 OpenClaw 实际加载的是哪份插件: ```bash -openclaw plugins info aios-mqtt-channel +openclaw plugins info daedalus-agent-mqtt-channel ``` 如果是 systemd 部署,常用日志筛选: @@ -246,7 +246,7 @@ MQTT route resolved topic=openclaw/inbound-lowcode inboundAccount=lowcode routeA ```bash # 在 monorepo 根目录下 -cd plugins/aios-mqtt-channel +cd plugins/daedalus-agent-mqtt-channel npm install npm test diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/SECURITY.md b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/SECURITY.md similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/SECURITY.md rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/SECURITY.md diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/config.example.json b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/config.example.json similarity index 93% rename from extensions/openclaw-plugins/aios-mqtt-channel/config.example.json rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/config.example.json index 756e707f08fe3f82c4cdf3c91a9c96a02e0fb216..9e7947f1b73fe43d962e3a3d0ca9aa5fb8db8863 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/config.example.json +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/config.example.json @@ -1,6 +1,6 @@ { "channels": { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { "accounts": { "default": { "brokerUrl": "mqtt://localhost:1883", diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/configured-state.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/configured-state.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/configured-state.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/configured-state.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/index.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/index.ts similarity index 86% rename from extensions/openclaw-plugins/aios-mqtt-channel/index.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/index.ts index 7faf4b78d98343e4044579df8c829827bba6d120..6c3b6c59c1bf67a3403ab4ce83157c137e563074 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/index.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/index.ts @@ -5,8 +5,8 @@ import { setMqttRuntime } from "./src/runtime.js"; import { mqttChannelConfigJsonSchema } from "./src/config-schema.js"; const plugin = defineChannelPluginEntry({ - id: "aios-mqtt-channel", - name: "aios-mqtt-channel", + id: "daedalus-agent-mqtt-channel", + name: "daedalus-agent-mqtt-channel", description: "MQTT channel plugin for IoT and home automation integration.", plugin: mqttPlugin, configSchema: mqttChannelConfigJsonSchema, diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/openclaw.plugin.json b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/openclaw.plugin.json similarity index 92% rename from extensions/openclaw-plugins/aios-mqtt-channel/openclaw.plugin.json rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/openclaw.plugin.json index 1c8553a01a56ad93393baa2f41aba0411e2192e3..3c35324f127420ec9b054a50fc362f03dd7a2dcb 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/openclaw.plugin.json +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/openclaw.plugin.json @@ -1,12 +1,12 @@ { - "id": "aios-mqtt-channel", + "id": "daedalus-agent-mqtt-channel", "kind": "channel", - "name": "aios-mqtt-channel", + "name": "daedalus-agent-mqtt-channel", "description": "Bidirectional MQTT channel plugin for OpenClaw.", - "channels": ["aios-mqtt-channel"], + "channels": ["daedalus-agent-mqtt-channel"], "channelConfigs": { - "aios-mqtt-channel": { - "label": "aios-mqtt-channel", + "daedalus-agent-mqtt-channel": { + "label": "daedalus-agent-mqtt-channel", "description": "Bidirectional MQTT broker configuration for OpenClaw.", "schema": { "type": "object", diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/package-lock.json b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package-lock.json similarity index 92% rename from extensions/openclaw-plugins/aios-mqtt-channel/package-lock.json rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package-lock.json index f595621a648b64d63216c14b4ce8d357883ddf77..3c84ad9bc8e5bb1d41c17eadb0bcb87a923f7472 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/package-lock.json +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package-lock.json @@ -1,12 +1,12 @@ { - "name": "aios-mqtt-channel", - "version": "0.1.3", + "name": "daedalus-agent-mqtt-channel", + "version": "1.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aios-mqtt-channel", - "version": "0.1.3", + "name": "daedalus-agent-mqtt-channel", + "version": "1.0.5", "license": "MIT", "dependencies": { "dayjs": "^1.11.21", @@ -18,7 +18,7 @@ "@types/jasmine": "^5.1.13", "@types/node": "25.8.0", "jasmine": "^5.12.0", - "openclaw": "2026.5.28", + "openclaw": "2026.7.1", "tsx": "^4.22.0", "typescript": "6.0.3" }, @@ -1230,69 +1230,67 @@ } }, "node_modules/openclaw": { - "version": "2026.5.28", - "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.5.28.tgz", - "integrity": "sha512-p7jGN9wzCrqEvHNI6Y7+eh6DWoYDzJ1iQGKTm8xqQ2uQ9/2mY1CCf87WoZeb0+m3eHKSGchlI3tN33fE1lMtEA==", + "version": "2026.7.1", + "resolved": "https://registry.npmjs.org/openclaw/-/openclaw-2026.7.1.tgz", + "integrity": "sha512-ge/Xss99CHAjPL/ikmH/UFoiOrjcxDB4sW3y9mhyCD+dYW3wzV7TKbAVdkrXFgAG2d2BjpJofP97zUZ+umxo8g==", "dev": true, "hasInstallScript": true, "hasShrinkwrap": true, "license": "MIT", "dependencies": { - "@agentclientprotocol/sdk": "0.22.1", - "@anthropic-ai/sdk": "0.98.0", - "@clack/core": "1.3.1", - "@clack/prompts": "1.4.0", - "@earendil-works/pi-tui": "0.76.0", - "@google/genai": "2.6.0", + "@agentclientprotocol/sdk": "1.1.0", + "@anthropic-ai/sdk": "0.109.1", + "@clack/core": "1.4.2", + "@clack/prompts": "1.6.0", + "@earendil-works/pi-tui": "0.80.3", + "@google/genai": "2.10.0", "@grammyjs/runner": "2.0.3", "@grammyjs/transformer-throttler": "1.2.1", "@homebridge/ciao": "1.3.9", "@lydell/node-pty": "1.2.0-beta.12", - "@mistralai/mistralai": "2.2.5", + "@mistralai/mistralai": "2.4.0", "@modelcontextprotocol/sdk": "1.29.0", "@mozilla/readability": "0.6.0", - "@openclaw/fs-safe": "0.3.0", + "@openclaw/ai": "2026.7.1", + "@openclaw/fs-safe": "0.4.1", "@openclaw/proxyline": "0.3.3", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "5.6.2", "chokidar": "5.0.0", - "clawpdf": "0.2.0", - "commander": "14.0.3", + "clawpdf": "0.3.0", + "commander": "15.0.0", "croner": "10.0.1", - "cross-spawn": "7.0.6", "diff": "9.0.0", "dotenv": "17.4.2", "express": "5.2.1", "file-type": "22.0.1", "glob": "13.0.6", - "grammy": "1.43.0", + "grammy": "1.44.0", "highlight.js": "11.11.1", - "hosted-git-info": "9.0.3", + "hosted-git-info": "10.1.1", "ignore": "7.0.5", - "ipaddr.js": "2.4.0", "jiti": "2.7.0", "json5": "2.2.3", "jszip": "3.10.1", "kysely": "0.29.2", "linkedom": "0.18.12", - "markdown-it": "14.2.0", "minimatch": "10.2.5", "node-edge-tts": "1.2.10", - "openai": "6.39.0", + "openai": "6.45.0", "partial-json": "0.1.7", - "playwright-core": "1.60.0", + "playwright-core": "1.61.1", "proper-lockfile": "4.1.2", "qrcode": "1.5.4", - "quickjs-wasi": "3.0.0", - "rastermill": "0.3.0", - "tar": "7.5.15", + "quickjs-wasi": "3.0.2", + "rastermill": "0.3.1", + "tar": "7.5.19", "tree-sitter-bash": "0.25.1", "tslog": "4.10.2", - "typebox": "1.1.38", + "typebox": "1.3.3", "typescript": "6.0.3", - "undici": "8.3.0", + "undici": "8.5.0", "web-push": "3.6.7", - "web-tree-sitter": "0.26.9", + "web-tree-sitter": "0.26.10", "ws": "8.21.0", "yaml": "2.9.0", "zod": "4.4.3" @@ -1301,16 +1299,16 @@ "openclaw": "openclaw.mjs" }, "engines": { - "node": ">=22.19.0" + "node": ">=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0" }, "optionalDependencies": { "sqlite-vec": "0.1.9" } }, "node_modules/openclaw/node_modules/@agentclientprotocol/sdk": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.22.1.tgz", - "integrity": "sha512-DfqXtl/8gO9NImq094MTaCXEU2vkhh6v7q/kT+9UjZxUqj8hYaya2OjLVIqn16MzNHcXEpShTR2RIauLSYeDQQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.1.0.tgz", + "integrity": "sha512-NT2KqphUJ3w6EksUL51ZhJgIYgq/ZLGcBPkyMKgRSO5PMVwe9DnKKX+Htnvk6KHh6dUuh34UHK4gKp+4te1Mdg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1318,9 +1316,9 @@ } }, "node_modules/openclaw/node_modules/@anthropic-ai/sdk": { - "version": "0.98.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.98.0.tgz", - "integrity": "sha512-N7aXtCvC5g6T1Y4V29lJjceu/zTkVkIZF0jdBvagr0TRFHuKeImffalGWEfqZKrvjH+IQbzJWw6TmSmUzrlMgg==", + "version": "0.109.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.109.1.tgz", + "integrity": "sha512-q9OnEKLr5H9nxSuXdgDgJhxfYMiE+AaUEBze2Gk91UcaaLnsN+Lx5fbCYywiqurU/APLdwv23x03Wm6WN3EBsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1340,9 +1338,9 @@ } }, "node_modules/openclaw/node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -1361,9 +1359,9 @@ } }, "node_modules/openclaw/node_modules/@clack/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.3.1.tgz", - "integrity": "sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.2.tgz", + "integrity": "sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1375,13 +1373,13 @@ } }, "node_modules/openclaw/node_modules/@clack/prompts": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.4.0.tgz", - "integrity": "sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.6.0.tgz", + "integrity": "sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==", "dev": true, "license": "MIT", "dependencies": { - "@clack/core": "1.3.1", + "@clack/core": "1.4.2", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" @@ -1391,23 +1389,23 @@ } }, "node_modules/openclaw/node_modules/@earendil-works/pi-tui": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.76.0.tgz", - "integrity": "sha512-TWQEWqc38gVRYr/VTrlfePQPpJk938gNNLL1xuv0M+9cTkVr880/Q3baZQrxKoLrmN/MmVx7TyR8knYZGxTqqg==", + "version": "0.80.3", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.80.3.tgz", + "integrity": "sha512-2BJI6qwRQfnM0Q7seL1+SbacU/jRRjBnN7Hu3n9BjAn7/s5FaBNnvdD1qBQYRsFTHfjqMaDsjYqanPyqwXj99w==", "dev": true, "license": "MIT", "dependencies": { "get-east-asian-width": "1.6.0", - "marked": "15.0.12" + "marked": "18.0.5" }, "engines": { "node": ">=22.19.0" } }, "node_modules/openclaw/node_modules/@google/genai": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-2.6.0.tgz", - "integrity": "sha512-HjoW3mPuEn7pnuKABJl9VbDoWDSF4nbwYKYvYYor7YjPeDxrrBxHzu2d1Prcd+BAuC4w+85UP6y7ZdcrQAoO7g==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-2.10.0.tgz", + "integrity": "sha512-e4cFxj3tiuMtsgOT4G9c1hXyGJhg7/Buj7VVeBacRY3fRtkRZZ59Q3nuVp2xbq8BGQXLXCDB253qMhklMOeUDg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -1462,9 +1460,9 @@ } }, "node_modules/openclaw/node_modules/@grammyjs/types": { - "version": "3.27.3", - "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.27.3.tgz", - "integrity": "sha512-yUKMLliGsGbnxu96YUJ7km7B0zy4PzeH/Jvti5705R/LeKDMqkDV4DckMSt+OrliWQpTwQljHE0QLol5zgxBkg==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.28.0.tgz", + "integrity": "sha512-4JvXCdxRZHCje0M4gHzLwtB4bLno3WD28xd8CNfk4POWIu73BFnSvGeW6OQ5gPem4eYTEwkD9yDaXssixl6tMQ==", "dev": true, "license": "MIT" }, @@ -1610,15 +1608,24 @@ ] }, "node_modules/openclaw/node_modules/@mistralai/mistralai": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.5.tgz", - "integrity": "sha512-ATbWzKkNzNAZ+gtw9MI/c/ULTMG80tKUiRNIbQFfg4OP0uEZZpTfXZeBCNfs5Dq0uqMQ/tQWc4o6RRJQtMrpDA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.4.0.tgz", + "integrity": "sha512-t6hCx242MTGolB76CI+17jDtPIe/bzLsMdUTMMoMn9Qo1h02N2G5jQYHmKDGU3X//OgR2wvngTD7tO6tPp5poQ==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/semantic-conventions": "^1.40.0", "ws": "^8.18.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.25.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } } }, "node_modules/openclaw/node_modules/@modelcontextprotocol/sdk": { @@ -1672,18 +1679,36 @@ "node": ">=14.0.0" } }, + "node_modules/openclaw/node_modules/@openclaw/ai": { + "version": "2026.7.1", + "resolved": "https://registry.npmjs.org/@openclaw/ai/-/ai-2026.7.1.tgz", + "integrity": "sha512-FsKy5DXSHf4qyN8Huoz/10HZRgoEwLF4uk8UWaCafaIler+q5Fsl51HcrIqIrEe0S38OT7LOaxnR++MOshAlmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "0.109.1", + "@google/genai": "2.10.0", + "@mistralai/mistralai": "2.4.0", + "openai": "6.45.0", + "partial-json": "0.1.7", + "typebox": "1.3.3" + }, + "engines": { + "node": ">=22.19.0" + } + }, "node_modules/openclaw/node_modules/@openclaw/fs-safe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.3.0.tgz", - "integrity": "sha512-uIBE441CIt1kIURoP9qRGKZ8LkGyfD9ZzeESjwAd29ZPWtghws/5GR3Pjb67jKdcJHP1I6roNXcvnhzAU7lHlA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.1.tgz", + "integrity": "sha512-hQi+BxO10KdRFlYUot1syC+hTaUnGeQNdqX5kwkKJig8CFq1tKsYJLPm+zkiiGsSKOprPAquQl/txejEhpKPgg==", "dev": true, "license": "MIT", "engines": { - "node": ">=20.11" + "node": ">=22" }, "optionalDependencies": { "jszip": "^3.10.1", - "tar": "7.5.13" + "tar": "7.5.19" } }, "node_modules/openclaw/node_modules/@openclaw/proxyline": { @@ -1699,6 +1724,89 @@ "undici": ">=8.3.0 <9" } }, + "node_modules/openclaw/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", + "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/openclaw/node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/openclaw/node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/openclaw/node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/openclaw/node_modules/@silvia-odwyer/photon-node": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@silvia-odwyer/photon-node/-/photon-node-0.3.4.tgz", @@ -1738,10 +1846,20 @@ "dev": true, "license": "MIT" }, + "node_modules/openclaw/node_modules/@types/node": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.0.tgz", + "integrity": "sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, "node_modules/openclaw/node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", + "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==", "dev": true, "license": "MIT" }, @@ -1843,13 +1961,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/openclaw/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/openclaw/node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -1905,29 +2016,43 @@ } }, "node_modules/openclaw/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", + "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", "dev": true, "license": "MIT" }, "node_modules/openclaw/node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^1.0.5", + "content-type": "^2.0.0", "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/openclaw/node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -1951,9 +2076,9 @@ "license": "MIT" }, "node_modules/openclaw/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", "dependencies": { @@ -2068,11 +2193,14 @@ } }, "node_modules/openclaw/node_modules/clawpdf": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clawpdf/-/clawpdf-0.2.0.tgz", - "integrity": "sha512-Za4HD3CMRHNqOXOOyVJiQLnEuezRZR/oXiBzraTwL5XEQZuBwFxnyC1UzN4AjQWV2JrLN3ItbzfPRGE0gGOVwg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/clawpdf/-/clawpdf-0.3.0.tgz", + "integrity": "sha512-41+3AnKk9yek2sm+/9XvUlDTN8Wi+ag7fmxZuqw+ySn4lqaf/fCgLeamqPLiXY4gVbizKEHGoTG/JrIIFNE2rw==", "dev": true, "license": "MIT", + "bin": { + "clawpdf": "dist/cli.js" + }, "engines": { "node": ">=20" } @@ -2113,13 +2241,13 @@ "license": "MIT" }, "node_modules/openclaw/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=22.12.0" } }, "node_modules/openclaw/node_modules/content-disposition": { @@ -2483,9 +2611,9 @@ } }, "node_modules/openclaw/node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -2546,9 +2674,9 @@ } }, "node_modules/openclaw/node_modules/eventsource-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", - "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", "dev": true, "license": "MIT", "engines": { @@ -2806,9 +2934,9 @@ } }, "node_modules/openclaw/node_modules/gaxios": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", - "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.5.tgz", + "integrity": "sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2916,9 +3044,9 @@ } }, "node_modules/openclaw/node_modules/google-auth-library": { - "version": "10.6.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", - "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.0.tgz", + "integrity": "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2964,13 +3092,13 @@ "license": "ISC" }, "node_modules/openclaw/node_modules/grammy": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/grammy/-/grammy-1.43.0.tgz", - "integrity": "sha512-7dYm06A945mXuIk/5HUlSjeyIYChW8vCEiU2dkOKKqJJzwAWxTkCc91Eqbz7TgODh2rtFFKWI/fekowWHOkmjQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/grammy/-/grammy-1.44.0.tgz", + "integrity": "sha512-gGVykS5+c5f1tPV97LuU6IDRMawE2NzpwM9pNz58HQ35IZXDnYL3VOLvNzYognPSeBIOSzQXRu5w96V0aY8y8A==", "dev": true, "license": "MIT", "dependencies": { - "@grammyjs/types": "3.27.3", + "@grammyjs/types": "3.28.0", "abort-controller": "^3.0.0", "debug": "^4.4.3", "node-fetch": "^2.7.0" @@ -3014,9 +3142,9 @@ } }, "node_modules/openclaw/node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -3037,9 +3165,9 @@ } }, "node_modules/openclaw/node_modules/hono": { - "version": "4.12.18", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", - "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", + "version": "4.12.25", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.25.tgz", + "integrity": "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ==", "dev": true, "license": "MIT", "engines": { @@ -3047,16 +3175,16 @@ } }, "node_modules/openclaw/node_modules/hosted-git-info": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", - "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-10.1.1.tgz", + "integrity": "sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==", "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, "node_modules/openclaw/node_modules/html-escaper": { @@ -3217,13 +3345,13 @@ } }, "node_modules/openclaw/node_modules/ipaddr.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", - "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 0.10" } }, "node_modules/openclaw/node_modules/is-fullwidth-code-point": { @@ -3409,26 +3537,6 @@ } } }, - "node_modules/openclaw/node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, "node_modules/openclaw/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3450,54 +3558,26 @@ "license": "Apache-2.0" }, "node_modules/openclaw/node_modules/lru-cache": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz", - "integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, - "node_modules/openclaw/node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, "node_modules/openclaw/node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz", + "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==", "dev": true, "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/openclaw/node_modules/math-intrinsics": { @@ -3510,13 +3590,6 @@ "node": ">= 0.4" } }, - "node_modules/openclaw/node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, "node_modules/openclaw/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -3641,9 +3714,9 @@ } }, "node_modules/openclaw/node_modules/node-addon-api": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", - "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", "dev": true, "license": "MIT", "engines": { @@ -3767,19 +3840,28 @@ } }, "node_modules/openclaw/node_modules/openai": { - "version": "6.39.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.39.0.tgz", - "integrity": "sha512-O61LIsimY3acVabwvomwFhwrnN36yvHY2quIfy9keEcFytGgWeV35yLHQ6NVMLSBxRpHmcg2yuhCnlu2HT4pLQ==", + "version": "6.45.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.45.0.tgz", + "integrity": "sha512-5DQVNErssk0afNpTTHUm/qZPU4iKR9OYdNid8Ib4puq4gHNNvGWZht2zY4h9a8JMF949Ik6m8gQutllVPbjdnw==", "dev": true, "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, "peerDependencies": { + "@aws-sdk/credential-provider-node": ">=3.972.0 <4", + "@smithy/hash-node": ">=4.3.0 <5", + "@smithy/signature-v4": ">=5.4.0 <6", "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "peerDependenciesMeta": { + "@aws-sdk/credential-provider-node": { + "optional": true + }, + "@smithy/hash-node": { + "optional": true + }, + "@smithy/signature-v4": { + "optional": true + }, "ws": { "optional": true }, @@ -3924,9 +4006,9 @@ } }, "node_modules/openclaw/node_modules/playwright-core": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", - "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3976,13 +4058,24 @@ } }, "node_modules/openclaw/node_modules/protobufjs": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.4.0.tgz", - "integrity": "sha512-iriNhQ57SYA5Jbdi+41AyPdx6jPPkFO7DODzkOBmqFhgYn/JzX2HxgxYPY18eQAs3CP/AWqtPvkWn8rclRAxdQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.3.tgz", + "integrity": "sha512-+k0vdJKNdW+Vu+dYe8tZA/VvQb6XKNWexC6URwBFXxNnjLJz9nQJCemGyNgRAWD+B7+nGNc9qMPGwcD7s4nzUw==", "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", "long": "^5.3.2" }, "engines": { @@ -4003,26 +4096,6 @@ "node": ">= 0.10" } }, - "node_modules/openclaw/node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/openclaw/node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/openclaw/node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -4129,33 +4202,37 @@ } }, "node_modules/openclaw/node_modules/quickjs-wasi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-3.0.0.tgz", - "integrity": "sha512-X7ouKC4ZVf9bXQ8rsE7+L6TeBbesejAJH61x16xRaGAQGfBHHRcniWgzJZZVtHc8rS9yVsY+Tvk8/usAosg4bg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-3.0.2.tgz", + "integrity": "sha512-SyfPzlrfz67/kv0SogmQgW4c2I1klkLcbvj9Y2gc1h7+VylmvuGevFljLXibGKajKJKiJV29d4S6FQLA6Sc80A==", "dev": true, "license": "MIT" }, "node_modules/openclaw/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/openclaw/node_modules/rastermill": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/rastermill/-/rastermill-0.3.0.tgz", - "integrity": "sha512-4g2i0I7M5sba//lFBh19Wi0hDGw8o+isnt/BtEyqQXIZaYclhcNBwL/Fw/6gDCp7aaLwQHADuUvyHCB0Oat5Vw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/rastermill/-/rastermill-0.3.1.tgz", + "integrity": "sha512-CX4nij6+ZLHYIaojJNfLTr7W+AiH/IPJi6E9Aw1br2///1KZL2KBOHd68rkcLedc47MPvb4hhH+fzYeGFa4A/Q==", "dev": true, "license": "MIT", "dependencies": { "@silvia-odwyer/photon-node": "0.3.4" }, "engines": { - "node": ">=20" + "node": ">=22" } }, "node_modules/openclaw/node_modules/raw-body": { @@ -4385,15 +4462,15 @@ } }, "node_modules/openclaw/node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -4664,9 +4741,9 @@ } }, "node_modules/openclaw/node_modules/tar": { - "version": "7.5.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", - "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "version": "7.5.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", + "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4797,9 +4874,9 @@ } }, "node_modules/openclaw/node_modules/typebox": { - "version": "1.1.38", - "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.38.tgz", - "integrity": "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.3.3.tgz", + "integrity": "sha512-URXGUE31PJDQC+PtRMJeLdF4kmmOdFoVPikPCtV2oOIhUpNpppEdIz7W8bH8cFYPYHdDpaRvqwdegMTmHliudg==", "dev": true, "license": "MIT" }, @@ -4817,13 +4894,6 @@ "node": ">=14.17" } }, - "node_modules/openclaw/node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, "node_modules/openclaw/node_modules/uhyphen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", @@ -4845,15 +4915,22 @@ } }, "node_modules/openclaw/node_modules/undici": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.3.0.tgz", - "integrity": "sha512-TkUDgb6tl7KOGZ+7e8E3d2FYgUQgF6z5YypqjWmixVQSQERFcVrVg0ySADm2LVLRh5ljAaHTCR5Fmz3Q34rB7Q==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.5.0.tgz", + "integrity": "sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==", "dev": true, "license": "MIT", "engines": { "node": ">=22.19.0" } }, + "node_modules/openclaw/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, "node_modules/openclaw/node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4912,9 +4989,9 @@ } }, "node_modules/openclaw/node_modules/web-tree-sitter": { - "version": "0.26.9", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.9.tgz", - "integrity": "sha512-YJwSHANl6XFgeEjB8nitgj0qZYt5gkIesJ4w2srS2wcLB4GUa4xcOkM0YaMsU6WNR53YVIkDSY7Ej4pf3IXtCA==", + "version": "0.26.10", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.26.10.tgz", + "integrity": "sha512-vengBGYS7FpAerkR3o04oBL4L8MkVmjawK50AFBu7v0HZBkmF9ZavPGKoXLSSmRhp7T/YgsJ7joAS3yAxHPEqQ==", "dev": true, "license": "MIT" }, @@ -5043,9 +5120,9 @@ } }, "node_modules/openclaw/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/package.json b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package.json similarity index 72% rename from extensions/openclaw-plugins/aios-mqtt-channel/package.json rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package.json index 116637a6408808461f7eecc558a86ca566ffb169..bd9a12cbbe9af911345c7f75c5536bb7840d6b85 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/package.json +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/package.json @@ -1,7 +1,7 @@ { - "name": "aios-mqtt-channel", + "name": "daedalus-agent-mqtt-channel", "version": "1.0.5", - "description": "MQTT channel plugin for OpenClaw - bidirectional messaging via MQTT brokers, part of the AIOS suite.", + "description": "MQTT channel plugin for OpenClaw - bidirectional messaging via MQTT brokers, part of the DAEDALUS_AGENT suite.", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -29,7 +29,7 @@ }, "repository": { "type": "git", - "url": "https://gitee.com/low-code-dev-lab/aios-oc" + "url": "https://gitee.com/low-code-dev-lab/daedalus-agent-oc" }, "openclaw": { "extensions": [ @@ -37,18 +37,18 @@ ], "setupEntry": "./dist/setup-entry.js", "channel": { - "id": "aios-mqtt-channel", - "label": "aios-mqtt-channel", - "selectionLabel": "aios-mqtt-channel (IoT/Home Automation)", - "docsPath": "/channels/aios-mqtt-channel", - "docsLabel": "aios-mqtt-channel", + "id": "daedalus-agent-mqtt-channel", + "label": "daedalus-agent-mqtt-channel", + "selectionLabel": "daedalus-agent-mqtt-channel (IoT/Home Automation)", + "docsPath": "/channels/daedalus-agent-mqtt-channel", + "docsLabel": "daedalus-agent-mqtt-channel", "blurb": "Bidirectional messaging via MQTT brokers (Mosquitto, EMQX, etc.)", "order": 80, "configuredState": "./dist/configured-state.js" }, "install": { - "npmSpec": "aios-mqtt-channel", - "localPath": "extensions/openclaw-plugins/aios-mqtt-channel", + "npmSpec": "daedalus-agent-mqtt-channel", + "localPath": "extensions/openclaw-plugins/daedalus-agent-mqtt-channel", "defaultChoice": "npm" } }, @@ -62,7 +62,7 @@ "@types/jasmine": "^5.1.13", "@types/node": "25.8.0", "jasmine": "^5.12.0", - "openclaw": "2026.5.28", + "openclaw": "2026.7.1", "tsx": "^4.22.0", "typescript": "6.0.3" }, diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/setup-entry.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/setup-entry.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/setup-entry.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/setup-entry.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/__mocks__/mqtt.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/__mocks__/mqtt.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/__mocks__/mqtt.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/__mocks__/mqtt.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel-base.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-base.ts similarity index 86% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/channel-base.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-base.ts index ac35be2943b4c3cc7b67dc4c2cd41f6b34521b98..326daf540395ab764fe3d62bc75a8b97e742af87 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel-base.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-base.ts @@ -11,13 +11,13 @@ import { import { applyMqttSetupAccountConfig, normalizeMqttAccountId } from "./setup-config.js"; export const mqttChannelBase: Partial> = { - id: "aios-mqtt-channel", + id: "daedalus-agent-mqtt-channel", meta: { - id: "aios-mqtt-channel", - label: "aios-mqtt-channel", - selectionLabel: "aios-mqtt-channel (IoT/Home Automation)", - docsPath: "/channels/aios-mqtt-channel", + id: "daedalus-agent-mqtt-channel", + label: "daedalus-agent-mqtt-channel", + selectionLabel: "daedalus-agent-mqtt-channel (IoT/Home Automation)", + docsPath: "/channels/daedalus-agent-mqtt-channel", blurb: "Bidirectional messaging via MQTT brokers", aliases: ["mosquitto"], }, diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel-config.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-config.ts similarity index 98% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/channel-config.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-config.ts index c74a398929e1938f54212bfd67fc7e35b47e04b0..66a25e123030eab4d054b37dbdd52bd0f4eec17a 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel-config.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-config.ts @@ -26,7 +26,7 @@ export interface ResolvedMqttAccount { } export function getRawMqttChannelConfig(cfg: any): RawMqttChannelConfig | undefined { - return cfg?.channels?.["aios-mqtt-channel"]; + return cfg?.channels?.["daedalus-agent-mqtt-channel"]; } export function listMqttAccountIds(cfg: any): string[] { diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel-runtime.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-runtime.ts similarity index 98% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/channel-runtime.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-runtime.ts index 7fc3c48c6c5b420256703bb78723eb5dfd147807..fc6bb56ba9b1cc65d05964df816ea1cd4b7ab830 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel-runtime.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel-runtime.ts @@ -213,7 +213,7 @@ export const mqttChannelRuntime: Partial> = { }); return { ok: true, - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", messageId: `mqtt-${Date.now()}-${Math.random().toString(36).slice(2)}`, timestamp: Date.now(), meta: { @@ -398,7 +398,7 @@ async function handleInboundMessage(opts: { const route = runtime.channel.routing.resolveAgentRoute({ cfg, - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId, peer: { kind: "dm", @@ -497,11 +497,11 @@ async function processRoutedInboundMessage(opts: { SenderName: senderId, SenderId: senderId, MessageThreadId: sessionId, - Provider: "aios-mqtt-channel", - Surface: "aios-mqtt-channel", + Provider: "daedalus-agent-mqtt-channel", + Surface: "daedalus-agent-mqtt-channel", MessageSid: `mqtt-${Date.now()}-${Math.random().toString(36).slice(2)}`, Timestamp: Date.now(), - OriginatingChannel: "aios-mqtt-channel", + OriginatingChannel: "daedalus-agent-mqtt-channel", OriginatingTo: `mqtt:${route.accountId}`, }); @@ -517,7 +517,7 @@ async function processRoutedInboundMessage(opts: { updateLastRoute: route.mainSessionKey ? { sessionKey: route.mainSessionKey, - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", to: ctxPayload.To ?? `mqtt:${route.accountId}`, accountId: route.accountId, threadId: sessionId, diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel.test.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel.test.ts similarity index 94% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/channel.test.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel.test.ts index d33cd5cfc9a7513c47c8fbbce83bc3a8cb0272bf..9c98f1993caef8b659877a4e226112427887fcd0 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel.test.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel.test.ts @@ -18,17 +18,17 @@ let chatLogDir = ""; let openclawHomeDir = ""; function prepareChatLogDir(): void { - chatLogDir = mkdtempSync(path.join(os.tmpdir(), "aios-mqtt-channel-")); - openclawHomeDir = mkdtempSync(path.join(os.tmpdir(), "aios-openclaw-home-")); - process.env.AIOS_MQTT_CHANNEL_LOG_DIR = chatLogDir; - process.env.AIOS_OPENCLAW_HOME = openclawHomeDir; + chatLogDir = mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-mqtt-channel-")); + openclawHomeDir = mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-openclaw-home-")); + process.env.DA_MQTT_CHANNEL_LOG_DIR = chatLogDir; + process.env.DA_OPENCLAW_HOME = openclawHomeDir; } async function cleanupChatLogDir(): Promise { await flushMqttChatLogForTest(); resetMqttChatLogForTest(); - delete process.env.AIOS_MQTT_CHANNEL_LOG_DIR; - delete process.env.AIOS_OPENCLAW_HOME; + delete process.env.DA_MQTT_CHANNEL_LOG_DIR; + delete process.env.DA_OPENCLAW_HOME; if (chatLogDir) { rmSync(chatLogDir, { recursive: true, force: true }); @@ -44,7 +44,7 @@ async function readChatLogLines(logDir = chatLogDir): Promise { await flushMqttChatLogForTest(); const files = readdirSync(logDir).filter((fileName) => - /^aios-mqtt-channel-chat-\d{8}\.log$/.test(fileName) + /^daedalus-agent-mqtt-channel-chat-\d{8}\.log$/.test(fileName) ); expect(files.length).toBeGreaterThan(0); @@ -63,7 +63,7 @@ async function readFunctionalLogLines(): Promise { await flushMqttChatLogForTest(); const files = readdirSync(chatLogDir).filter((fileName) => - /^aios-mqtt-channel-\d{8}\.log$/.test(fileName) + /^daedalus-agent-mqtt-channel-\d{8}\.log$/.test(fileName) ); expect(files.length).toBeGreaterThan(0); @@ -126,7 +126,7 @@ describe("mqttPlugin", () => { const defaultCfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { default: { brokerUrl: "mqtt://localhost:1883", @@ -180,8 +180,8 @@ describe("mqttPlugin", () => { describe("meta", () => { it("should have correct id and label", () => { - expect(mqttPlugin.id).toBe("aios-mqtt-channel"); - expect(mqttPlugin.meta.label).toBe("aios-mqtt-channel"); + expect(mqttPlugin.id).toBe("daedalus-agent-mqtt-channel"); + expect(mqttPlugin.meta.label).toBe("daedalus-agent-mqtt-channel"); expect(mqttPlugin.meta.aliases).toContain("mosquitto"); }); }); @@ -219,7 +219,7 @@ describe("mqttPlugin", () => { it("should list multiple configured accounts", () => { const ids = mqttPlugin.config.listAccountIds({ channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { admin: { brokerUrl: "mqtt://admin:1883" }, lowcode: { brokerUrl: "mqtt://lowcode:1883" }, @@ -234,7 +234,7 @@ describe("mqttPlugin", () => { it("should resolve default account ID for multi-account config", () => { const accountId = mqttPlugin.config.defaultAccountId?.({ channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { admin: { brokerUrl: "mqtt://admin:1883" }, lowcode: { brokerUrl: "mqtt://lowcode:1883" }, @@ -249,7 +249,7 @@ describe("mqttPlugin", () => { it("should prefer default account ID when present", () => { const accountId = mqttPlugin.config.defaultAccountId?.({ channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { lowcode: { brokerUrl: "mqtt://lowcode:1883" }, default: { brokerUrl: "mqtt://default:1883" }, @@ -270,7 +270,7 @@ describe("mqttPlugin", () => { const account = mqttPlugin.config.resolveAccount( { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { brokerUrl: "mqtt://legacy:1883", }, }, @@ -331,7 +331,7 @@ describe("mqttPlugin", () => { sessionKey: "agent:default:mqtt:openclaw-inbound", updateLastRoute: { sessionKey: "agent:default:main", - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", to: "mqtt:default", accountId: "default", threadId: undefined, @@ -487,14 +487,14 @@ describe("mqttPlugin", () => { const entries = await readChatLogEntries(); expect(entries).toContain(jasmine.objectContaining({ - service: { name: "aios-mqtt-channel" }, - event: { dataset: "aios-mqtt-channel-chat" }, + service: { name: "daedalus-agent-mqtt-channel" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "WillNing", session: "s-xxxxxxx", direction: "IN" }, message: "hi", })); expect(entries).toContain(jasmine.objectContaining({ - service: { name: "aios-mqtt-channel" }, - event: { dataset: "aios-mqtt-channel-chat" }, + service: { name: "daedalus-agent-mqtt-channel" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "default", session: "s-xxxxxxx", direction: "OUT" }, message: "test reply", })); @@ -526,17 +526,17 @@ describe("mqttPlugin", () => { const functionalLog = functionalEntries.map((entry) => JSON.stringify(entry)).join("\n"); expect(chatEntries).toContain(jasmine.objectContaining({ - event: { dataset: "aios-mqtt-channel-chat" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "split-log-test", session: "s-split", direction: "IN" }, message: "body should stay in chat log", })); expect(chatEntries).toContain(jasmine.objectContaining({ - event: { dataset: "aios-mqtt-channel-chat" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "default", session: "s-split", direction: "OUT" }, message: "reply should stay in chat log", })); expect(functionalEntries).toContain(jasmine.objectContaining({ - event: { dataset: "aios-mqtt-channel" }, + event: { dataset: "daedalus-agent-mqtt-channel" }, message: jasmine.stringContaining("MQTT inbound message topic=openclaw/inbound"), })); expect(functionalLog).not.toContain("body should stay in chat log"); @@ -549,7 +549,7 @@ describe("mqttPlugin", () => { it("should write MQTT logs under OpenClaw home when the primary log directory cannot be written", async () => { const blockedLogDir = path.join(chatLogDir, "blocked-log-dir"); writeFileSync(blockedLogDir, "not a directory"); - process.env.AIOS_MQTT_CHANNEL_LOG_DIR = blockedLogDir; + process.env.DA_MQTT_CHANNEL_LOG_DIR = blockedLogDir; const stderrWrite = spyOn(process.stderr, "write").and.callFake(() => true); const { controller, startPromise } = await startAccount(); @@ -583,15 +583,15 @@ describe("mqttPlugin", () => { const fallbackLogDir = path.join(openclawHomeDir, "logs"); const entries = await readChatLogEntries(fallbackLogDir); const files = readdirSync(fallbackLogDir).filter((fileName) => - /^aios-mqtt-channel-chat-\d{8}\.log$/.test(fileName) + /^daedalus-agent-mqtt-channel-chat-\d{8}\.log$/.test(fileName) ); expect(entries).toContain(jasmine.objectContaining({ - event: { dataset: "aios-mqtt-channel-chat" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "log-write-failure-test", session: "s-log-failure", direction: "IN" }, message: "message should still be processed", })); expect(entries).toContain(jasmine.objectContaining({ - event: { dataset: "aios-mqtt-channel-chat" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "default", session: "s-log-failure", direction: "OUT" }, message: "test reply", })); @@ -609,8 +609,8 @@ describe("mqttPlugin", () => { const blockedOpenclawHome = path.join(chatLogDir, "blocked-openclaw-home"); writeFileSync(blockedLogDir, "not a directory"); writeFileSync(blockedOpenclawHome, "not a directory"); - process.env.AIOS_MQTT_CHANNEL_LOG_DIR = blockedLogDir; - process.env.AIOS_OPENCLAW_HOME = blockedOpenclawHome; + process.env.DA_MQTT_CHANNEL_LOG_DIR = blockedLogDir; + process.env.DA_OPENCLAW_HOME = blockedOpenclawHome; const stderrWrite = spyOn(process.stderr, "write").and.callFake(() => true); const { controller, startPromise } = await startAccount(); @@ -705,7 +705,7 @@ describe("mqttPlugin", () => { it("should fall back to account disableBlockStreaming when message override is absent", async () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { default: { brokerUrl: "mqtt://localhost:1883", @@ -743,7 +743,7 @@ describe("mqttPlugin", () => { it("should allow message disableBlockStreaming=false to override account default", async () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { default: { brokerUrl: "mqtt://localhost:1883", @@ -829,7 +829,7 @@ describe("mqttPlugin", () => { it("should reuse one MQTT client for separate accounts", async () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { admin: { brokerUrl: "mqtt://localhost:1883", @@ -871,7 +871,7 @@ describe("mqttPlugin", () => { expect(mockResolveAgentRoute).toHaveBeenCalledWith({ cfg, - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId: "lowcode", peer: { kind: "dm", @@ -887,7 +887,7 @@ describe("mqttPlugin", () => { it("should keep the shared MQTT client running until the last account stops", async () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { admin: { brokerUrl: "mqtt://localhost:1883", @@ -932,7 +932,7 @@ describe("mqttPlugin", () => { expect(mockResolveAgentRoute).toHaveBeenCalledWith({ cfg, - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId: "lowcode", peer: { kind: "dm", @@ -958,7 +958,7 @@ describe("mqttPlugin", () => { it("should resolve inbound route from the selected MQTT account", async () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { admin: { brokerUrl: "mqtt://localhost:1883", @@ -995,7 +995,7 @@ describe("mqttPlugin", () => { expect(mockResolveAgentRoute).toHaveBeenCalledWith({ cfg, - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId: "lowcode", peer: { kind: "dm", @@ -1015,7 +1015,7 @@ describe("mqttPlugin", () => { sessionKey: "agent:lowcode:mqtt:pg-cli", updateLastRoute: { sessionKey: "agent:lowcode:main", - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", to: "mqtt:lowcode", accountId: "lowcode", threadId: undefined, @@ -1135,8 +1135,8 @@ describe("mqttPlugin", () => { const entries = await readChatLogEntries(); expect(entries).toContain(jasmine.objectContaining({ - service: { name: "aios-mqtt-channel" }, - event: { dataset: "aios-mqtt-channel-chat" }, + service: { name: "daedalus-agent-mqtt-channel" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender: "agent-a", session: "s-direct", direction: "OUT" }, message: "Hello from OpenClaw", })); @@ -1148,7 +1148,7 @@ describe("mqttPlugin", () => { it("should publish using the selected account outbound topic", async () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { admin: { brokerUrl: "mqtt://localhost:1883", @@ -1261,7 +1261,7 @@ describe("inbound message parsing", () => { const cfg = { channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { default: { brokerUrl: "mqtt://localhost:1883", diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel.ts similarity index 91% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/channel.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel.ts index eb43b025c63de4dc42c3d58e73c39012da37cc49..9295c532b6f2435c72cdf12a55e0fd5bf68add02 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/channel.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/channel.ts @@ -5,7 +5,7 @@ import { mqttChannelBase } from "./channel-base.js"; import { mqttChannelRuntime } from "./channel-runtime.js"; /** - * aios-mqtt-channel plugin for OpenClaw + * daedalus-agent-mqtt-channel plugin for OpenClaw * * Provides bidirectional messaging via MQTT brokers (Mosquitto, EMQX, etc.) * Useful for IoT integration, home automation alerts, and service monitoring. diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/chat-log.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/chat-log.ts similarity index 79% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/chat-log.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/chat-log.ts index ab650e43b561f056a164e065a81bbcad2c6266ff..e9d69d9652f06823723ba008eb54dc8f3771077c 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/chat-log.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/chat-log.ts @@ -16,22 +16,22 @@ function beijingNow(): dayjs.Dayjs { } function resolvePrimaryLogDir(): string { - const configured = process.env.AIOS_MQTT_CHANNEL_LOG_DIR?.trim(); + const configured = process.env.DA_MQTT_CHANNEL_LOG_DIR?.trim(); if (configured) { return configured; } - const logDir = process.env.AIOS_LOG_DIR?.trim(); + const logDir = process.env.DA_LOG_DIR?.trim(); if (logDir) { return logDir; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -40,7 +40,7 @@ function resolvePrimaryLogDir(): string { } function resolveFallbackLogDir(): string | undefined { - const openclawHome = process.env.AIOS_OPENCLAW_HOME?.trim() || process.env.OPENCLAW_HOME?.trim(); + const openclawHome = process.env.DA_OPENCLAW_HOME?.trim() || process.env.OPENCLAW_HOME?.trim(); if (!openclawHome) { return undefined; } @@ -56,7 +56,7 @@ function logTimestamp(): string { return beijingNow().format("YYYY-MM-DDTHH:mm:ss.SSSZ"); } -function appendDailyLogLine(filePrefix: "aios-mqtt-channel-chat" | "aios-mqtt-channel", line: string): void { +function appendDailyLogLine(filePrefix: "daedalus-agent-mqtt-channel-chat" | "daedalus-agent-mqtt-channel", line: string): void { const logDate = beijingNow().format("YYYYMMDD"); const primaryLogDir = resolvePrimaryLogDir(); @@ -72,7 +72,7 @@ function appendDailyLogLine(filePrefix: "aios-mqtt-channel-chat" | "aios-mqtt-ch function tryAppendDailyLogLine( logDir: string, - filePrefix: "aios-mqtt-channel-chat" | "aios-mqtt-channel", + filePrefix: "daedalus-agent-mqtt-channel-chat" | "daedalus-agent-mqtt-channel", logDate: string, line: string ): boolean { @@ -123,8 +123,8 @@ export function writeMqttChatLog(params: { "@timestamp": logTimestamp(), ecs: { version: "8.11.0" }, log: { level: "info" }, - service: { name: "aios-mqtt-channel" }, - event: { dataset: "aios-mqtt-channel-chat" }, + service: { name: "daedalus-agent-mqtt-channel" }, + event: { dataset: "daedalus-agent-mqtt-channel-chat" }, mqtt: { sender, session, @@ -134,7 +134,7 @@ export function writeMqttChatLog(params: { message: text, }); - appendDailyLogLine("aios-mqtt-channel-chat", line); + appendDailyLogLine("daedalus-agent-mqtt-channel-chat", line); } export function writeMqttFunctionalLog(level: "debug" | "info" | "warn" | "error", message: string): void { @@ -142,12 +142,12 @@ export function writeMqttFunctionalLog(level: "debug" | "info" | "warn" | "error "@timestamp": logTimestamp(), ecs: { version: "8.11.0" }, log: { level }, - service: { name: "aios-mqtt-channel" }, - event: { dataset: "aios-mqtt-channel" }, + service: { name: "daedalus-agent-mqtt-channel" }, + event: { dataset: "daedalus-agent-mqtt-channel" }, message: normalizeOneLine(message), }); - appendDailyLogLine("aios-mqtt-channel", line); + appendDailyLogLine("daedalus-agent-mqtt-channel", line); } export function resetMqttChatLogForTest(): void { diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/client.test.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/client.test.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/client.test.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/client.test.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/client.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/client.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/client.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/client.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/config-schema.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/config-schema.ts similarity index 97% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/config-schema.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/config-schema.ts index d145fbf5cf1b6567bbda17849dd867a7acb678fd..55b55b906f34f07a0bcace798d660dc62fc0ad09 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/config-schema.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/config-schema.ts @@ -9,7 +9,7 @@ export const DEFAULT_DISABLE_BLOCK_STREAMING = false; * MQTT Configuration Schema * * Values can come from: - * 1. ~/.openclaw/openclaw.json (channels["aios-mqtt-channel"].*) + * 1. ~/.openclaw/openclaw.json (channels["daedalus-agent-mqtt-channel"].*) * 2. Environment variables (MQTT_*) * * Environment variables take precedence for secrets. diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/env.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/env.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/env.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/env.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/onboarding.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/onboarding.ts similarity index 96% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/onboarding.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/onboarding.ts index c2d386bd05ade77f55f1e6f20253b08405b55546..efa9045de0aba7229915bf873ade29c667c1bbeb 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/onboarding.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/onboarding.ts @@ -13,7 +13,7 @@ import { import { DEFAULT_INBOUND_TOPIC, DEFAULT_OUTBOUND_TOPIC } from "./config-schema.js"; import { applyMqttSetupAccountConfig } from "./setup-config.js"; -const channel = "aios-mqtt-channel"; +const channel = "daedalus-agent-mqtt-channel"; type MqttConfig = OpenClawConfig; @@ -58,7 +58,7 @@ export const mqttOnboardingAdapter = { channel, getStatus: async ({ cfg }: { cfg: MqttConfig }): Promise => { - const mqtt = cfg.channels?.["aios-mqtt-channel"]; + const mqtt = cfg.channels?.["daedalus-agent-mqtt-channel"]; const accountIds = listMqttAccountIds(cfg); const configured = getMqttConfiguredState(cfg) === "configured" && mqtt?.enabled !== false; @@ -220,7 +220,7 @@ export const mqttOnboardingAdapter = { ...cfg, channels: { ...cfg.channels, - "aios-mqtt-channel": { ...cfg.channels?.["aios-mqtt-channel"], enabled: false }, + "daedalus-agent-mqtt-channel": { ...cfg.channels?.["daedalus-agent-mqtt-channel"], enabled: false }, }, }), }; diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/runtime.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/runtime.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/runtime.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/runtime.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/setup-config.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/setup-config.ts similarity index 93% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/setup-config.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/setup-config.ts index b12cb1f194404d8fed6ee60abea2b046db821af6..ad0101889adb6ce10c3863d6ca1dbbfec76394b4 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/setup-config.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/setup-config.ts @@ -78,11 +78,11 @@ export function applyMqttSetupAccountConfig(params: { ...cfg, channels: { ...cfg?.channels, - "aios-mqtt-channel": { - ...cfg?.channels?.["aios-mqtt-channel"], + "daedalus-agent-mqtt-channel": { + ...cfg?.channels?.["daedalus-agent-mqtt-channel"], enabled: true, accounts: { - ...cfg?.channels?.["aios-mqtt-channel"]?.accounts, + ...cfg?.channels?.["daedalus-agent-mqtt-channel"]?.accounts, [resolvedAccountId]: buildMqttAccountConfig(input), }, }, diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/src/types.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/types.ts similarity index 91% rename from extensions/openclaw-plugins/aios-mqtt-channel/src/types.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/types.ts index f7e372e1b1dfcd9363f54755ccc7b789be525d63..3356dceac741985555be3befbdd962dfdc488505 100644 --- a/extensions/openclaw-plugins/aios-mqtt-channel/src/types.ts +++ b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/src/types.ts @@ -3,7 +3,7 @@ import type { MqttChannelConfig as MqttChannelSettings } from "./config-schema.j export interface MqttGatewayConfig { channels?: { - "aios-mqtt-channel"?: MqttChannelSettings; + "daedalus-agent-mqtt-channel"?: MqttChannelSettings; }; } diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/test/globals.d.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/test/globals.d.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/test/globals.d.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/test/globals.d.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/test/run-jasmine.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/test/run-jasmine.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/test/run-jasmine.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/test/run-jasmine.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/test/setup.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/test/setup.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/test/setup.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/test/setup.ts diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/tsconfig.json b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/tsconfig.json similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/tsconfig.json rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/tsconfig.json diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/tsconfig.spec.json b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/tsconfig.spec.json similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/tsconfig.spec.json rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/tsconfig.spec.json diff --git a/extensions/openclaw-plugins/aios-mqtt-channel/vitest.config.ts b/extensions/openclaw-plugins/daedalus-agent-mqtt-channel/vitest.config.ts similarity index 100% rename from extensions/openclaw-plugins/aios-mqtt-channel/vitest.config.ts rename to extensions/openclaw-plugins/daedalus-agent-mqtt-channel/vitest.config.ts diff --git a/packages/aios-management-web/.env.json b/packages/aios-management-web/.env.json deleted file mode 100644 index 8d7a946bef57411bf37b15d86c303ab13d9f9c8b..0000000000000000000000000000000000000000 --- a/packages/aios-management-web/.env.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "AIOS_MQTT_CHANNEL_BROKER": "mqtt://172.16.12.2:1883", - "AIOS_MQTT_CHANNEL_USERNAME": "huozige", - "AIOS_MQTT_CHANNEL_PASSWORD": "xA123456", - "AIOS_APP_INVOKE_INBOUND_TOPIC": "aios-dev1/app-invoke/inbound", - "AIOS_APP_INVOKE_OUTBOUND_TOPIC": "aios-dev1/app-invoke/outbound", - "AIOS_ADMIN_INBOUND_TOPIC": "aios-dev1/admin/inbound", - "AIOS_ADMIN_OUTBOUND_TOPIC": "aios-dev1/admin/outbound", - "AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE": "aios-dev1/agent/{agentId}/inbound", - "AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE": "aios-dev1/agent/{agentId}/outbound", - "AIOS_S3_ENDPOINT": "http://172.16.12.2:9000", - "AIOS_S3_REGION": "local", - "AIOS_S3_ACCESS_KEY_ID": "minioadmin", - "AIOS_S3_SECRET_ACCESS_KEY": "minioadmin", - "AIOS_S3_FORCE_PATH_STYLE": "true", - "AIOS_S3_ADMIN_INBOX_BUCKET": "admin-in", - "AIOS_S3_ADMIN_OUTBOX_BUCKET": "admin-out", - "AIOS_S3_AGENT_INBOX_BUCKET": "agents-in", - "AIOS_S3_AGENT_OUTBOX_BUCKET": "agents-out", - "AIOS_MANAGEMENT_WEBSITE_TIMEOUT": "120" -} diff --git a/packages/aios-management-web/public/ai-favicon.svg b/packages/aios-management-web/public/ai-favicon.svg deleted file mode 100644 index bd25790510a8a2f1e05cbfe0ec20a2fbb758744e..0000000000000000000000000000000000000000 --- a/packages/aios-management-web/public/ai-favicon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/aios-management-web/test/setup.js b/packages/aios-management-web/test/setup.js deleted file mode 100644 index e11bb2e18dd1f21aae66622e16ef3b55596cb174..0000000000000000000000000000000000000000 --- a/packages/aios-management-web/test/setup.js +++ /dev/null @@ -1 +0,0 @@ -jasmine.DEFAULT_TIMEOUT_INTERVAL = Number(process.env.AIOS_TEST_TIMEOUT_MS || "300000"); diff --git a/packages/aios-apps-invoke-cli/.gitignore b/packages/daedalus-agent-apps-invoke-cli/.gitignore similarity index 100% rename from packages/aios-apps-invoke-cli/.gitignore rename to packages/daedalus-agent-apps-invoke-cli/.gitignore diff --git a/packages/aios-apps-invoke-cli/DEV.md b/packages/daedalus-agent-apps-invoke-cli/DEV.md similarity index 89% rename from packages/aios-apps-invoke-cli/DEV.md rename to packages/daedalus-agent-apps-invoke-cli/DEV.md index 77cf8c0a25a4c2feb471394160d29eeffc80aa2d..63bd5d43141cc54b0eeda63be87341b7ed71528b 100644 --- a/packages/aios-apps-invoke-cli/DEV.md +++ b/packages/daedalus-agent-apps-invoke-cli/DEV.md @@ -2,12 +2,12 @@ ## 项目定位 -`aios-apps-invoke-cli` 是 AIOS 应用调用入口包。当前主链路采用“CLI client + 常驻 invoke service”的结构: +`daedalus-agent-apps-invoke-cli` 是 DAEDALUS_AGENT 应用调用入口包。当前主链路采用“CLI client + 常驻 invoke service”的结构: - CLI client 负责解析命令行参数、组装请求,并通过本地 socket 发送给 service。 - `serve` 启动常驻 socket service,负责读取业务系统配置、解析会话 cookie、调用 provider SDK、记录调用日志。 -在 AIOS Docker 容器中,OpenClaw/agent 仍以默认 agent 身份调用 CLI;apps supervisor 以 `aios-svc` 身份运行 `aios-apps-invoke-cli serve`。实际访问局域网业务系统的是 service 进程。 +在 DAEDALUS_AGENT Docker 容器中,OpenClaw/agent 仍以默认 agent 身份调用 CLI;apps supervisor 以 `daedalus-svc` 身份运行 `daedalus-agent-apps-invoke-cli serve`。实际访问局域网业务系统的是 service 进程。 ## 代码架构 diff --git a/packages/aios-apps-invoke-cli/README.md b/packages/daedalus-agent-apps-invoke-cli/README.md similarity index 43% rename from packages/aios-apps-invoke-cli/README.md rename to packages/daedalus-agent-apps-invoke-cli/README.md index 0a138db992a0f46e97cdbd72ecdd3581d241ce0a..bcebf9e118d9e2c15e035daab15f686fce8fa853 100644 --- a/packages/aios-apps-invoke-cli/README.md +++ b/packages/daedalus-agent-apps-invoke-cli/README.md @@ -1,6 +1,6 @@ -# aios-apps-invoke-cli +# daedalus-agent-apps-invoke-cli -`aios-apps-invoke-cli` 是 AIOS 应用调用入口包。它同时包含: +`daedalus-agent-apps-invoke-cli` 是 DAEDALUS_AGENT 应用调用入口包。它同时包含: - CLI client:`servercommand` / `binding` 等一次性命令。 - 常驻 invoke service:`serve` 命令启动的本地 socket 服务。 @@ -8,57 +8,57 @@ 正常调用链路是: ```text -OpenClaw/agent -> aios-apps-invoke-cli client -> app-invoke socket -> aios-apps-invoke-cli serve -> management web / HZG SDK -> 业务系统 +OpenClaw/agent -> daedalus-agent-apps-invoke-cli client -> app-invoke socket -> daedalus-agent-apps-invoke-cli serve -> management web / HZG SDK -> 业务系统 ``` -CLI client 自身不直接访问业务系统,也不通过 MQTT 发起 app invoke 请求。AIOS Docker 容器中,OpenClaw 仍以默认 agent 身份调用 CLI;`serve` 由 apps supervisor 以 `aios-svc` 身份常驻运行,因此实际访问局域网业务系统的是 service 进程。 +CLI client 自身不直接访问业务系统,也不通过 MQTT 发起 app invoke 请求。DAEDALUS_AGENT Docker 容器中,OpenClaw 仍以默认 agent 身份调用 CLI;`serve` 由 apps supervisor 以 `daedalus-svc` 身份常驻运行,因此实际访问局域网业务系统的是 service 进程。 ## 安装 ```bash -npm install -g aios-apps-invoke-cli +npm install -g daedalus-agent-apps-invoke-cli ``` 也可以直接用 `npx`: ```bash -npx aios-apps-invoke-cli --help +npx daedalus-agent-apps-invoke-cli --help ``` ## 运行模型 同一个 npm 包里包含 client 和 service,不需要安装两个包。 -- `aios-apps-invoke-cli servercommand ...`:作为 client 发送业务命令请求。 -- `aios-apps-invoke-cli binding ...`:作为 client 发送系统绑定请求。 -- `aios-apps-invoke-cli serve`:启动当前主路径使用的 app invoke socket service。 -- `aios-apps-invoke-cli service-status`:输出 socket service 的状态结构。 -- `aios-apps-invoke-cli status`:输出 client 配置视图。 +- `daedalus-agent-apps-invoke-cli servercommand ...`:作为 client 发送业务命令请求。 +- `daedalus-agent-apps-invoke-cli binding ...`:作为 client 发送系统绑定请求。 +- `daedalus-agent-apps-invoke-cli serve`:启动当前主路径使用的 app invoke socket service。 +- `daedalus-agent-apps-invoke-cli service-status`:输出 socket service 的状态结构。 +- `daedalus-agent-apps-invoke-cli status`:输出 client 配置视图。 ## 环境变量 Client 命令不读取通讯配置环境变量。它固定连接内部 socket: ```text -/var/aios/run/app-invoke.sock +/var/daedalus-agent/run/app-invoke.sock ``` Socket service 使用: -- `AIOS_WEB_BASE_URL`:可选,默认 `http://127.0.0.1:3030`,用于读取业务系统配置、解析外部 cookie、记录调用日志。 -- `AIOS_APP_INVOKE_MAX_PAYLOAD_BYTES`:可选,默认 `33554432`,限制单次 socket 请求 JSON 的最大字节数。 +- `DA_WEB_BASE_URL`:可选,默认 `http://127.0.0.1:3030`,用于读取业务系统配置、解析外部 cookie、记录调用日志。 +- `DA_APP_INVOKE_MAX_PAYLOAD_BYTES`:可选,默认 `33554432`,限制单次 socket 请求 JSON 的最大字节数。 ## 用法 ```bash -aios-apps-invoke-cli servercommand <应用名> <命令名> POST [jsonBody] -s -aios-apps-invoke-cli servercommand <应用名> <命令名> POST --body-file -s -aios-apps-invoke-cli servercommand <应用名> <命令名> GET --query-file -s -aios-apps-invoke-cli binding <应用名> <命令名> <请求方法> [jsonBody] -s -aios-apps-invoke-cli binding <应用名> <命令名> <请求方法> --body-file -s -aios-apps-invoke-cli serve -aios-apps-invoke-cli service-status -aios-apps-invoke-cli status +daedalus-agent-apps-invoke-cli servercommand <应用名> <命令名> POST [jsonBody] -s +daedalus-agent-apps-invoke-cli servercommand <应用名> <命令名> POST --body-file -s +daedalus-agent-apps-invoke-cli servercommand <应用名> <命令名> GET --query-file -s +daedalus-agent-apps-invoke-cli binding <应用名> <命令名> <请求方法> [jsonBody] -s +daedalus-agent-apps-invoke-cli binding <应用名> <命令名> <请求方法> --body-file -s +daedalus-agent-apps-invoke-cli serve +daedalus-agent-apps-invoke-cli service-status +daedalus-agent-apps-invoke-cli status ``` 参数说明: @@ -74,11 +74,11 @@ aios-apps-invoke-cli status ## 示例 ```powershell -aios-apps-invoke-cli servercommand demo getUser POST --body-file .\payload.json -s thread-1 +daedalus-agent-apps-invoke-cli servercommand demo getUser POST --body-file .\payload.json -s thread-1 ``` ```powershell -aios-apps-invoke-cli binding OASystem GetTableDataWithOffset POST --body-file .\binding-body.json -s thread-2 +daedalus-agent-apps-invoke-cli binding OASystem GetTableDataWithOffset POST --body-file .\binding-body.json -s thread-2 ``` ## Binding 支持范围 @@ -93,7 +93,7 @@ CLI 会把 `TableBinding`、`CandidatesBinding`、`DataSourceBinding` 等别名 ## Socket 协议 -Client 会向内部固定 socket `/var/aios/run/app-invoke.sock` 写入一行 JSON 请求,service 返回一行 JSON 响应。 +Client 会向内部固定 socket `/var/daedalus-agent/run/app-invoke.sock` 写入一行 JSON 请求,service 返回一行 JSON 响应。 请求体包含: @@ -116,12 +116,12 @@ Client 会向内部固定 socket `/var/aios/run/app-invoke.sock` 写入一行 JS 当 `code !== 0` 时,CLI 以非零退出码结束,并把错误信息输出到 stderr。 -## AIOS Docker 容器 +## DAEDALUS_AGENT Docker 容器 -AIOS Docker 容器中 apps supervisor 会以 `aios-svc` 启动: +DAEDALUS_AGENT Docker 容器中 apps supervisor 会以 `daedalus-svc` 启动: ```bash -aios-apps-invoke-cli serve +daedalus-agent-apps-invoke-cli serve ``` -OpenClaw/agent 调用 CLI 时仍使用默认 agent 身份。Docker iptables 的内网限制按 agent UID 生效;invoke service 以 `aios-svc` 访问业务系统,不需要把 agent 的局域网限制放开。 +OpenClaw/agent 调用 CLI 时仍使用默认 agent 身份。Docker iptables 的内网限制按 agent UID 生效;invoke service 以 `daedalus-svc` 访问业务系统,不需要把 agent 的局域网限制放开。 diff --git a/packages/aios-apps-invoke-cli/docs/design.md b/packages/daedalus-agent-apps-invoke-cli/docs/design.md similarity index 72% rename from packages/aios-apps-invoke-cli/docs/design.md rename to packages/daedalus-agent-apps-invoke-cli/docs/design.md index 2f47ea6ca571fc54db44881f54484e5f3882a49f..cc211406e19ad00aba4eadde008181c0c9f95f89 100644 --- a/packages/aios-apps-invoke-cli/docs/design.md +++ b/packages/daedalus-agent-apps-invoke-cli/docs/design.md @@ -1,22 +1,22 @@ -# aios-apps-invoke-cli 设计说明 +# daedalus-agent-apps-invoke-cli 设计说明 ## 目标 -`aios-apps-invoke-cli` 提供 AIOS 应用调用能力。当前设计把调用入口拆成同一 npm 包内的两个运行角色: +`daedalus-agent-apps-invoke-cli` 提供 DAEDALUS_AGENT 应用调用能力。当前设计把调用入口拆成同一 npm 包内的两个运行角色: - CLI client:短进程,保持调用方默认身份,只负责参数解析和本地 IPC。 - Invoke service:常驻进程,负责真正访问 management web、HZG SDK 和业务系统。 -这样 OpenClaw/agent 可以继续用默认身份调用 CLI,同时把局域网业务系统访问集中到 `aios-svc` 身份的 service 进程。 +这样 OpenClaw/agent 可以继续用默认身份调用 CLI,同时把局域网业务系统访问集中到 `daedalus-svc` 身份的 service 进程。 ## 部署模型 -AIOS Docker 容器中: +DAEDALUS_AGENT Docker 容器中: ```text -aios-agent(OpenClaw) --exec--> aios-apps-invoke-cli binding/servercommand - -> /var/aios/run/app-invoke.sock - -> aios-apps-invoke-cli serve(aios-svc) +daedalus-agent(OpenClaw) --exec--> daedalus-agent-apps-invoke-cli binding/servercommand + -> /var/daedalus-agent/run/app-invoke.sock + -> daedalus-agent-apps-invoke-cli serve(daedalus-svc) -> management web -> HZG SDK -> 业务系统 @@ -26,17 +26,17 @@ aios-agent(OpenClaw) --exec--> aios-apps-invoke-cli binding/servercommand - `servercommand` / `binding` 是一次性 client 命令,不直接访问业务系统。 - `serve` 是当前主链路的常驻 socket service。 -- Docker iptables 的内网限制按 agent UID 生效;service 以 `aios-svc` 运行,不需要放开 agent 的局域网访问限制。 +- Docker iptables 的内网限制按 agent UID 生效;service 以 `daedalus-svc` 运行,不需要放开 agent 的局域网访问限制。 - 请求超时固定为 `500` 秒,暂不提供命令行配置项。 ## 环境变量 -Client 主链路不读取通讯配置环境变量,固定连接内部 socket `/var/aios/run/app-invoke.sock`。 +Client 主链路不读取通讯配置环境变量,固定连接内部 socket `/var/daedalus-agent/run/app-invoke.sock`。 Socket service 主链路读取: -- `AIOS_WEB_BASE_URL`:可选,默认 `http://127.0.0.1:3030`。 -- `AIOS_APP_INVOKE_MAX_PAYLOAD_BYTES`:可选,默认 `33554432`,限制单次 socket 请求 JSON 的最大字节数。 +- `DA_WEB_BASE_URL`:可选,默认 `http://127.0.0.1:3030`。 +- `DA_APP_INVOKE_MAX_PAYLOAD_BYTES`:可选,默认 `33554432`,限制单次 socket 请求 JSON 的最大字节数。 ## 命令设计 @@ -51,14 +51,14 @@ CLI 暴露以下命令: 调用格式: ```bash -aios-apps-invoke-cli servercommand <应用名> <命令名> POST [jsonBody] -s -aios-apps-invoke-cli servercommand <应用名> <命令名> POST --body-file -s -aios-apps-invoke-cli servercommand <应用名> <命令名> GET --query-file -s -aios-apps-invoke-cli binding <应用名> <命令名> <请求方法> [jsonBody] -s -aios-apps-invoke-cli binding <应用名> <命令名> <请求方法> --body-file -s -aios-apps-invoke-cli serve -aios-apps-invoke-cli service-status -aios-apps-invoke-cli status +daedalus-agent-apps-invoke-cli servercommand <应用名> <命令名> POST [jsonBody] -s +daedalus-agent-apps-invoke-cli servercommand <应用名> <命令名> POST --body-file -s +daedalus-agent-apps-invoke-cli servercommand <应用名> <命令名> GET --query-file -s +daedalus-agent-apps-invoke-cli binding <应用名> <命令名> <请求方法> [jsonBody] -s +daedalus-agent-apps-invoke-cli binding <应用名> <命令名> <请求方法> --body-file -s +daedalus-agent-apps-invoke-cli serve +daedalus-agent-apps-invoke-cli service-status +daedalus-agent-apps-invoke-cli status ``` 约束: @@ -174,8 +174,8 @@ Socket 使用一行一个 JSON 消息的协议。Service 收到第一行后处 ## 安全边界 -- CLI client 继承调用方身份,不提升为 `aios-svc`。 -- Socket 文件默认位于 `/var/aios/run/app-invoke.sock`。 -- AIOS Docker 容器会把 socket 目录设为 service 用户拥有、OpenClaw 组可访问。 -- 局域网访问发生在 `aios-apps-invoke-cli serve` 进程内。 +- CLI client 继承调用方身份,不提升为 `daedalus-svc`。 +- Socket 文件默认位于 `/var/daedalus-agent/run/app-invoke.sock`。 +- DAEDALUS_AGENT Docker 容器会把 socket 目录设为 service 用户拥有、OpenClaw 组可访问。 +- 局域网访问发生在 `daedalus-agent-apps-invoke-cli serve` 进程内。 - agent 的 Docker iptables 内网限制仍然按 agent UID 生效。 diff --git a/packages/aios-apps-invoke-cli/package-lock.json b/packages/daedalus-agent-apps-invoke-cli/package-lock.json similarity index 99% rename from packages/aios-apps-invoke-cli/package-lock.json rename to packages/daedalus-agent-apps-invoke-cli/package-lock.json index 8b4a2ddf966b8f0ac29e46fb516a77027e61c0f9..59355ad7b30cb087ec31b66474a7e1bed47795e5 100644 --- a/packages/aios-apps-invoke-cli/package-lock.json +++ b/packages/daedalus-agent-apps-invoke-cli/package-lock.json @@ -1,11 +1,11 @@ { - "name": "aios-apps-invoke-cli", + "name": "daedalus-agent-apps-invoke-cli", "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aios-apps-invoke-cli", + "name": "daedalus-agent-apps-invoke-cli", "version": "0.1.2", "license": "MIT", "dependencies": { @@ -14,7 +14,7 @@ "pino": "^10.3.1" }, "bin": { - "aios-apps-invoke-cli": "dist/src/cli.js" + "daedalus-agent-apps-invoke-cli": "dist/src/cli.js" }, "devDependencies": { "@types/jasmine": "^5.1.13", diff --git a/packages/aios-apps-invoke-cli/package.json b/packages/daedalus-agent-apps-invoke-cli/package.json similarity index 67% rename from packages/aios-apps-invoke-cli/package.json rename to packages/daedalus-agent-apps-invoke-cli/package.json index 3cf8201c6bf9e11a09bfdd0131c93539190540fd..38c61947e22375f8a34f98b34f1166bd082802ef 100644 --- a/packages/aios-apps-invoke-cli/package.json +++ b/packages/daedalus-agent-apps-invoke-cli/package.json @@ -1,11 +1,11 @@ { - "name": "aios-apps-invoke-cli", + "name": "daedalus-agent-apps-invoke-cli", "version": "1.0.3", - "description": "AIOS app invoke CLI client and socket service.", + "description": "DAEDALUS_AGENT app invoke CLI client and socket service.", "license": "MIT", "type": "commonjs", "bin": { - "aios-apps-invoke-cli": "dist/src/cli.js" + "daedalus-agent-apps-invoke-cli": "dist/src/cli.js" }, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -21,7 +21,7 @@ "README.md" ], "keywords": [ - "aios", + "daedalus-agent", "app-invoke", "socket", "service", @@ -30,13 +30,13 @@ ], "repository": { "type": "git", - "url": "git+https://gitee.com/low-code-dev-lab/aios-oc.git", - "directory": "packages/aios-apps-invoke-cli" + "url": "git+https://gitee.com/low-code-dev-lab/daedalus-agent-oc.git", + "directory": "packages/daedalus-agent-apps-invoke-cli" }, "bugs": { - "url": "https://gitee.com/low-code-dev-lab/aios-oc/issues" + "url": "https://gitee.com/low-code-dev-lab/daedalus-agent-oc/issues" }, - "homepage": "https://gitee.com/low-code-dev-lab/aios-oc/tree/main/packages/aios-apps-invoke-cli#readme", + "homepage": "https://gitee.com/low-code-dev-lab/daedalus-agent-oc/tree/main/packages/daedalus-agent-apps-invoke-cli#readme", "scripts": { "clean": "rimraf dist", "build": "npm run clean && tsc -p tsconfig.build.json", diff --git a/packages/aios-apps-invoke-cli/src/cli.ts b/packages/daedalus-agent-apps-invoke-cli/src/cli.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/cli.ts rename to packages/daedalus-agent-apps-invoke-cli/src/cli.ts diff --git a/packages/aios-apps-invoke-cli/src/client/socket-client.ts b/packages/daedalus-agent-apps-invoke-cli/src/client/socket-client.ts similarity index 97% rename from packages/aios-apps-invoke-cli/src/client/socket-client.ts rename to packages/daedalus-agent-apps-invoke-cli/src/client/socket-client.ts index 67e022b40b5d10a9d65fe4914dbcdfa0491c2655..476cb33918f54c2613c40ecc01c458bf656f3f40 100644 --- a/packages/aios-apps-invoke-cli/src/client/socket-client.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/client/socket-client.ts @@ -111,7 +111,7 @@ export class AppInvokeSocketClient { } function readMaxSocketPayloadBytes(): number { - const parsed = Number(process.env.AIOS_APP_INVOKE_MAX_PAYLOAD_BYTES || ""); + const parsed = Number(process.env.DA_APP_INVOKE_MAX_PAYLOAD_BYTES || ""); if (Number.isFinite(parsed) && parsed > 0) { return Math.floor(parsed); } diff --git a/packages/aios-apps-invoke-cli/src/commands/root.ts b/packages/daedalus-agent-apps-invoke-cli/src/commands/root.ts similarity index 92% rename from packages/aios-apps-invoke-cli/src/commands/root.ts rename to packages/daedalus-agent-apps-invoke-cli/src/commands/root.ts index d9926141d4551770838bd544a3cf68a28c14d774..86bee3d1bf8bf8ee52acfebdb4b52db9474f86e3 100644 --- a/packages/aios-apps-invoke-cli/src/commands/root.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/commands/root.ts @@ -107,11 +107,11 @@ export async function runCli(argv: string[], io: CliIO = defaultIO): Promise { if (args.length < 3) { - throw new Error("usage: aios-apps-invoke-cli servercommand [jsonBody]"); + throw new Error("usage: daedalus-agent-apps-invoke-cli servercommand [jsonBody]"); } const applicationName = args[0]; @@ -384,11 +384,11 @@ async function executeServiceStatusFromCli(io: CliIO): Promise { async function executeServeFromCli(): Promise { const service = createAppInvokeSocketService(); await service.start(); - createLogger("aios-apps-invoke-cli", 1).info({ + createLogger("daedalus-agent-apps-invoke-cli", 1).info({ command: "serve", service: service.info.name, version: service.info.version - }, "aios-apps-invoke-cli serve started"); + }, "daedalus-agent-apps-invoke-cli serve started"); return await waitForServiceShutdown(service, "serve"); } @@ -407,16 +407,16 @@ async function waitForServiceShutdown( shuttingDown = true; process.off("SIGINT", shutdown); process.off("SIGTERM", shutdown); - createLogger("aios-apps-invoke-cli").info({ signal, command }, "aios-apps-invoke-cli serve stopping"); + createLogger("daedalus-agent-apps-invoke-cli").info({ signal, command }, "daedalus-agent-apps-invoke-cli serve stopping"); try { await service.stop(); - createLogger("aios-apps-invoke-cli").info({ signal, command }, "aios-apps-invoke-cli serve stopped"); + createLogger("daedalus-agent-apps-invoke-cli").info({ signal, command }, "daedalus-agent-apps-invoke-cli serve stopped"); resolve(0); } catch (error) { - createLogger("aios-apps-invoke-cli").error({ + createLogger("daedalus-agent-apps-invoke-cli").error({ error: errorDetails(error), command - }, "aios-apps-invoke-cli serve failed while stopping"); + }, "daedalus-agent-apps-invoke-cli serve failed while stopping"); resolve(1); } }; @@ -561,10 +561,10 @@ function requireFlagValue(flagName: string, value: string | undefined): string { function renderRootHelp(): string { return [ - "AIOS apps invoke CLI", + "DAEDALUS_AGENT apps invoke CLI", "", "Usage:", - " aios-apps-invoke-cli [command]", + " daedalus-agent-apps-invoke-cli [command]", "", "Commands:", " servercommand Execute a business server command endpoint", @@ -585,8 +585,8 @@ function renderServerCommandHelp(): string { "Execute a business server command endpoint.", "", "Usage:", - " aios-apps-invoke-cli servercommand [applicationName] [commandName] [method] --body-file [file] -s [SessionId]", - " aios-apps-invoke-cli servercommand [applicationName] [commandName] GET --query-file [file] -s [SessionId]", + " daedalus-agent-apps-invoke-cli servercommand [applicationName] [commandName] [method] --body-file [file] -s [SessionId]", + " daedalus-agent-apps-invoke-cli servercommand [applicationName] [commandName] GET --query-file [file] -s [SessionId]", "", "Options:", " -s, --sessionId string Current OpenClaw session id", @@ -603,7 +603,7 @@ function renderBindingCommandHelp(): string { "Execute a system binding endpoint.", "", "Usage:", - " aios-apps-invoke-cli binding [applicationName] [commandName] [method] --body-file [file] -s [SessionId]", + " daedalus-agent-apps-invoke-cli binding [applicationName] [commandName] [method] --body-file [file] -s [SessionId]", "", "Options:", " -s, --sessionId string Current OpenClaw session id", @@ -618,7 +618,7 @@ function renderStatusHelp(): string { "Print invoke client configuration.", "", "Usage:", - " aios-apps-invoke-cli status", + " daedalus-agent-apps-invoke-cli status", "" ].join("\n"); } @@ -628,7 +628,7 @@ function renderServeHelp(): string { "Run the app invoke socket service.", "", "Usage:", - " aios-apps-invoke-cli serve", + " daedalus-agent-apps-invoke-cli serve", "" ].join("\n"); } @@ -638,7 +638,7 @@ function renderServiceStatusHelp(): string { "Print app invoke service status.", "", "Usage:", - " aios-apps-invoke-cli service-status", + " daedalus-agent-apps-invoke-cli service-status", "" ].join("\n"); } diff --git a/packages/aios-apps-invoke-cli/src/config/config.ts b/packages/daedalus-agent-apps-invoke-cli/src/config/config.ts similarity index 81% rename from packages/aios-apps-invoke-cli/src/config/config.ts rename to packages/daedalus-agent-apps-invoke-cli/src/config/config.ts index 5ca6752596a488342b002912eb79ec4a52014fd0..9590b7ce89239776151c573a1a99d48b9956d5ad 100644 --- a/packages/aios-apps-invoke-cli/src/config/config.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/config/config.ts @@ -7,7 +7,7 @@ export interface ClientConfig { } export const REQUEST_TIMEOUT_SECONDS = 500; -export const DEFAULT_INVOKE_SOCKET_PATH = "/var/aios/run/app-invoke.sock"; +export const DEFAULT_INVOKE_SOCKET_PATH = "/var/daedalus-agent/run/app-invoke.sock"; export function loadConfig(): Config { return { diff --git a/packages/aios-apps-invoke-cli/src/index.ts b/packages/daedalus-agent-apps-invoke-cli/src/index.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/index.ts rename to packages/daedalus-agent-apps-invoke-cli/src/index.ts diff --git a/packages/aios-apps-invoke-cli/src/logger.ts b/packages/daedalus-agent-apps-invoke-cli/src/logger.ts similarity index 85% rename from packages/aios-apps-invoke-cli/src/logger.ts rename to packages/daedalus-agent-apps-invoke-cli/src/logger.ts index 79ea2f3b0440fff74e4f9b4184f6fafad1a6287d..3a4b1b3719e1fb39f76b7656f171778e01c60c88 100644 --- a/packages/aios-apps-invoke-cli/src/logger.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/logger.ts @@ -9,7 +9,7 @@ import timezone from "dayjs/plugin/timezone"; dayjs.extend(utc); dayjs.extend(timezone); -const PACKAGE_NAME = "aios-apps-invoke-cli"; +const PACKAGE_NAME = "daedalus-agent-apps-invoke-cli"; const warnedLogDirs = new Set(); function beijingTime(): string { @@ -17,17 +17,17 @@ function beijingTime(): string { } function resolveLogDir(): string | undefined { - const configured = process.env.AIOS_LOG_DIR?.trim(); + const configured = process.env.DA_LOG_DIR?.trim(); if (configured) { return configured; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -70,8 +70,8 @@ export function writeErrorLog(write: (message: string) => void, error: unknown, } }; const logger = pino({ - name: "aios-apps-invoke-cli", - level: process.env.AIOS_LOG_LEVEL || "info", + name: "daedalus-agent-apps-invoke-cli", + level: process.env.DA_LOG_LEVEL || "info", timestamp: () => `,"ts":"${beijingTime()}"`, base: null }, stream); diff --git a/packages/aios-apps-invoke-cli/src/protocol/messages.ts b/packages/daedalus-agent-apps-invoke-cli/src/protocol/messages.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/protocol/messages.ts rename to packages/daedalus-agent-apps-invoke-cli/src/protocol/messages.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/china-time.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/china-time.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/china-time.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/china-time.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/env.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/env.ts similarity index 88% rename from packages/aios-apps-invoke-cli/src/proxy/env.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/env.ts index 8eb706643e606894b5c9da106be938dcc9c368d6..3aac8662c2ef871b9a5f6c13d68609d192bf9eed 100644 --- a/packages/aios-apps-invoke-cli/src/proxy/env.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/proxy/env.ts @@ -19,7 +19,7 @@ export function loadEnvironmentConfig(): EnvironmentConfig { export function loadSocketEnvironmentConfig(): EnvironmentConfig { return { - webBaseUrl: readEnvValue("AIOS_WEB_BASE_URL", DEFAULT_WEB_BASE_URL) as string, + webBaseUrl: readEnvValue("DA_WEB_BASE_URL", DEFAULT_WEB_BASE_URL) as string, invokeSocketPath: DEFAULT_INVOKE_SOCKET_PATH }; } diff --git a/packages/aios-apps-invoke-cli/src/proxy/errors.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/errors.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/errors.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/errors.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/handler.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/handler.ts similarity index 99% rename from packages/aios-apps-invoke-cli/src/proxy/handler.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/handler.ts index 25dfbb309d7597582b25adf7cc805a92a4b64a41..78f31bb1763b7e4a89ff2d0a330ea9039a52d221 100644 --- a/packages/aios-apps-invoke-cli/src/proxy/handler.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/proxy/handler.ts @@ -13,7 +13,7 @@ import type { } from "./types.js"; import { WebApiClient } from "./web-api-client.js"; -const logger = createLogger("aios-apps-invoke-cli"); +const logger = createLogger("daedalus-agent-apps-invoke-cli"); export interface AppInvokeHandlerDependencies { hzgProviderClient?: Pick; diff --git a/packages/aios-apps-invoke-cli/src/proxy/huozige-app-integration.d.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/huozige-app-integration.d.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/huozige-app-integration.d.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/huozige-app-integration.d.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/hzg-provider-client.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/hzg-provider-client.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/hzg-provider-client.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/hzg-provider-client.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/index.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/index.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/index.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/index.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/ipc-path.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/ipc-path.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/ipc-path.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/ipc-path.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/logger.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/logger.ts similarity index 92% rename from packages/aios-apps-invoke-cli/src/proxy/logger.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/logger.ts index 4d52a880f9a3e3f25e8081f0394eaea8f0190885..8c148afeb84ae1725b2fc55a52c1ad8040fb26df 100644 --- a/packages/aios-apps-invoke-cli/src/proxy/logger.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/proxy/logger.ts @@ -9,7 +9,7 @@ import timezone from "dayjs/plugin/timezone.js"; dayjs.extend(utc); dayjs.extend(timezone); -const PACKAGE_NAME = "aios-apps-invoke-cli"; +const PACKAGE_NAME = "daedalus-agent-apps-invoke-cli"; const warnedLogDirs = new Set(); function beijingTime(): string { @@ -17,17 +17,17 @@ function beijingTime(): string { } function resolveLogDir(): string | undefined { - const configured = process.env.AIOS_LOG_DIR?.trim(); + const configured = process.env.DA_LOG_DIR?.trim(); if (configured) { return configured; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -76,7 +76,7 @@ function createDestination(fd: 1 | 2): DestinationStream { export function createLogger(name: string, fd: 1 | 2 = 2): Logger { return pino({ name, - level: process.env.AIOS_LOG_LEVEL || "info", + level: process.env.DA_LOG_LEVEL || "info", timestamp: () => `,"ts":"${beijingTime()}"`, base: null }, createDestination(fd)); diff --git a/packages/aios-apps-invoke-cli/src/proxy/protocol.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/protocol.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/protocol.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/protocol.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/socket-service.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/socket-service.ts similarity index 98% rename from packages/aios-apps-invoke-cli/src/proxy/socket-service.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/socket-service.ts index 12769e835a85c5255ab3c1eebee540624a47f0c6..b03d2c21e89820827d9469e22f2b26c0892763b0 100644 --- a/packages/aios-apps-invoke-cli/src/proxy/socket-service.ts +++ b/packages/daedalus-agent-apps-invoke-cli/src/proxy/socket-service.ts @@ -12,7 +12,7 @@ import type { AppInvokeResponse, EnvironmentConfig, ServiceInfo, ServiceStatus } import packageJson from "../../package.json"; const SERVICE_VERSION = packageJson.version ?? "unknown"; -const SERVICE_NAME = "aios-apps-invoke-cli"; +const SERVICE_NAME = "daedalus-agent-apps-invoke-cli"; export interface SocketServiceDependencies { hzgProviderClient?: AppInvokeHandlerDependencies["hzgProviderClient"]; diff --git a/packages/aios-apps-invoke-cli/src/proxy/types.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/types.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/types.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/types.ts diff --git a/packages/aios-apps-invoke-cli/src/proxy/web-api-client.ts b/packages/daedalus-agent-apps-invoke-cli/src/proxy/web-api-client.ts similarity index 100% rename from packages/aios-apps-invoke-cli/src/proxy/web-api-client.ts rename to packages/daedalus-agent-apps-invoke-cli/src/proxy/web-api-client.ts diff --git a/packages/aios-apps-invoke-cli/test/config.test.ts b/packages/daedalus-agent-apps-invoke-cli/test/config.test.ts similarity index 84% rename from packages/aios-apps-invoke-cli/test/config.test.ts rename to packages/daedalus-agent-apps-invoke-cli/test/config.test.ts index 4ab0448579c874dc044dcc97001d8f8de0fb8c0a..2d14388473d674862ca7ed9a337aaf4f9303c1af 100644 --- a/packages/aios-apps-invoke-cli/test/config.test.ts +++ b/packages/daedalus-agent-apps-invoke-cli/test/config.test.ts @@ -12,7 +12,7 @@ describe("loadConfig", () => { }); it("uses the fixed invoke socket path for status", () => { - process.env.AIOS_APP_INVOKE_SOCKET_PATH = "/tmp/ignored.sock"; + process.env.DA_APP_INVOKE_SOCKET_PATH = "/tmp/ignored.sock"; const config = loadConfig(); @@ -20,7 +20,7 @@ describe("loadConfig", () => { }); it("uses the fixed invoke socket path for client commands", () => { - process.env.AIOS_APP_INVOKE_SOCKET_PATH = "/tmp/ignored.sock"; + process.env.DA_APP_INVOKE_SOCKET_PATH = "/tmp/ignored.sock"; expect(loadClientConfig().socketPath).toBe(DEFAULT_INVOKE_SOCKET_PATH); }); diff --git a/packages/aios-apps-invoke-cli/test/proxy/env.test.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/env.test.ts similarity index 66% rename from packages/aios-apps-invoke-cli/test/proxy/env.test.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/env.test.ts index fa1fead2a87be02498dd6100b380b0284468b2aa..17afb39272490ff7b0319b331f3674c6a97133af 100644 --- a/packages/aios-apps-invoke-cli/test/proxy/env.test.ts +++ b/packages/daedalus-agent-apps-invoke-cli/test/proxy/env.test.ts @@ -13,7 +13,7 @@ test.afterEach(() => { }); test("loadEnvironmentConfig allows overriding web baseUrl", () => { - process.env.AIOS_WEB_BASE_URL = "http://127.0.0.1:33332"; + process.env.DA_WEB_BASE_URL = "http://127.0.0.1:33332"; const config = loadEnvironmentConfig(); @@ -21,13 +21,13 @@ test("loadEnvironmentConfig allows overriding web baseUrl", () => { }); test("loadSocketEnvironmentConfig ignores MQTT environment variables", () => { - delete process.env.AIOS_MQTT_CHANNEL_BROKER; - delete process.env.AIOS_MQTT_CHANNEL_USERNAME; - delete process.env.AIOS_MQTT_CHANNEL_PASSWORD; - process.env.AIOS_APP_INVOKE_SOCKET_PATH = "/tmp/ignored.sock"; + delete process.env.DA_MQTT_CHANNEL_BROKER; + delete process.env.DA_MQTT_CHANNEL_USERNAME; + delete process.env.DA_MQTT_CHANNEL_PASSWORD; + process.env.DA_APP_INVOKE_SOCKET_PATH = "/tmp/ignored.sock"; const config = loadSocketEnvironmentConfig(); assert.equal(config.webBaseUrl, "http://127.0.0.1:3030"); - assert.equal(config.invokeSocketPath, "/var/aios/run/app-invoke.sock"); + assert.equal(config.invokeSocketPath, "/var/daedalus-agent/run/app-invoke.sock"); }); diff --git a/packages/aios-apps-invoke-cli/test/proxy/globals.d.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/globals.d.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/proxy/globals.d.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/globals.d.ts diff --git a/packages/aios-apps-invoke-cli/test/proxy/logger.test.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/logger.test.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/proxy/logger.test.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/logger.test.ts diff --git a/packages/aios-apps-invoke-cli/test/proxy/run-jasmine.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/run-jasmine.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/proxy/run-jasmine.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/run-jasmine.ts diff --git a/packages/aios-apps-invoke-cli/test/proxy/setup.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/setup.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/proxy/setup.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/setup.ts diff --git a/packages/aios-apps-invoke-cli/test/proxy/socket-service.test.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/socket-service.test.ts similarity index 97% rename from packages/aios-apps-invoke-cli/test/proxy/socket-service.test.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/socket-service.test.ts index d0bc96530e06247d8e034ec1c74ce9357aad5bb7..f26e4d7db8c6096da92b262e478569047c1ef70c 100644 --- a/packages/aios-apps-invoke-cli/test/proxy/socket-service.test.ts +++ b/packages/daedalus-agent-apps-invoke-cli/test/proxy/socket-service.test.ts @@ -7,7 +7,7 @@ import { AppInvokeSocketClient } from "../../src/client/socket-client.js"; import { createAppInvokeSocketService } from "../../src/proxy/socket-service.js"; async function createTempSocketPath(): Promise<{ dir: string; socketPath: string }> { - const dir = await mkdtemp(join(tmpdir(), "aios-invoke-")); + const dir = await mkdtemp(join(tmpdir(), "daedalus-agent-invoke-")); return { dir, socketPath: join(dir, "app-invoke.sock") diff --git a/packages/aios-apps-invoke-cli/test/proxy/web-api-client.test.ts b/packages/daedalus-agent-apps-invoke-cli/test/proxy/web-api-client.test.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/proxy/web-api-client.test.ts rename to packages/daedalus-agent-apps-invoke-cli/test/proxy/web-api-client.test.ts diff --git a/packages/aios-apps-invoke-cli/test/root.test.ts b/packages/daedalus-agent-apps-invoke-cli/test/root.test.ts similarity index 97% rename from packages/aios-apps-invoke-cli/test/root.test.ts rename to packages/daedalus-agent-apps-invoke-cli/test/root.test.ts index 2912af9e6f0e3768d9d03a292cf5f12ad24c9983..5e527d2130b2fbcf585f1c2423e8578a26d3ad58 100644 --- a/packages/aios-apps-invoke-cli/test/root.test.ts +++ b/packages/daedalus-agent-apps-invoke-cli/test/root.test.ts @@ -139,9 +139,9 @@ describe("status command", () => { const stdout: string[] = []; const stderr: string[] = []; - delete process.env.AIOS_MQTT_CHANNEL_BROKER; - delete process.env.AIOS_MQTT_CHANNEL_USERNAME; - delete process.env.AIOS_MQTT_CHANNEL_PASSWORD; + delete process.env.DA_MQTT_CHANNEL_BROKER; + delete process.env.DA_MQTT_CHANNEL_USERNAME; + delete process.env.DA_MQTT_CHANNEL_PASSWORD; const exitCode = await runCli(["service-status"], { stdout: (message) => stdout.push(message), @@ -151,7 +151,7 @@ describe("status command", () => { const status = JSON.parse(stdout.join("")); expect(exitCode).toBe(0); expect(stderr.join("")).toBe(""); - expect(status.ipc.socketPath).toBe("/var/aios/run/app-invoke.sock"); + expect(status.ipc.socketPath).toBe("/var/daedalus-agent/run/app-invoke.sock"); expect(status.ipc.listening).toBe(false); }); diff --git a/packages/aios-apps-invoke-cli/test/run-jasmine.ts b/packages/daedalus-agent-apps-invoke-cli/test/run-jasmine.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/run-jasmine.ts rename to packages/daedalus-agent-apps-invoke-cli/test/run-jasmine.ts diff --git a/packages/aios-apps-invoke-cli/test/setup.ts b/packages/daedalus-agent-apps-invoke-cli/test/setup.ts similarity index 100% rename from packages/aios-apps-invoke-cli/test/setup.ts rename to packages/daedalus-agent-apps-invoke-cli/test/setup.ts diff --git a/packages/aios-apps-invoke-cli/tsconfig.build.json b/packages/daedalus-agent-apps-invoke-cli/tsconfig.build.json similarity index 100% rename from packages/aios-apps-invoke-cli/tsconfig.build.json rename to packages/daedalus-agent-apps-invoke-cli/tsconfig.build.json diff --git a/packages/aios-apps-invoke-cli/tsconfig.json b/packages/daedalus-agent-apps-invoke-cli/tsconfig.json similarity index 100% rename from packages/aios-apps-invoke-cli/tsconfig.json rename to packages/daedalus-agent-apps-invoke-cli/tsconfig.json diff --git a/packages/aios-apps-invoke-cli/tsconfig.spec.json b/packages/daedalus-agent-apps-invoke-cli/tsconfig.spec.json similarity index 100% rename from packages/aios-apps-invoke-cli/tsconfig.spec.json rename to packages/daedalus-agent-apps-invoke-cli/tsconfig.spec.json diff --git a/packages/aios-management-web/README.md b/packages/daedalus-agent-management-web/README.md similarity index 83% rename from packages/aios-management-web/README.md rename to packages/daedalus-agent-management-web/README.md index a9550bf02314d3e6df445cb94127bd4046d03030..2aeca8cc58aca92d2de04e1a5f11d1397ec8e18f 100644 --- a/packages/aios-management-web/README.md +++ b/packages/daedalus-agent-management-web/README.md @@ -10,7 +10,7 @@ - LLM Provider / Model 管理 - 数字员工创建、编辑、启停、删除、授权、Token 限额和工作区下载 - 业务系统管理、连通性测试、调用日志和统计 -- 面向 CUI 与 `aios-apps-invoke-cli serve` 的内部/外部 API;invoke CLI client 不直接访问这些 API +- 面向 CUI 与 `daedalus-agent-apps-invoke-cli serve` 的内部/外部 API;invoke CLI client 不直接访问这些 API - 本地 SQLite 缓存目录、状态、日志、统计和 Token 用量 - 启动同步、定时同步和手动同步共用同一套同步计划 @@ -66,18 +66,18 @@ npm run test:fast npm run test:full ``` -`test:fast` 和 `test:full` 默认假定真实服务运行在 `http://127.0.0.1:3030`,并能访问 AIOS 容器派生的内置 MQTT / MinIO 环境。 +`test:fast` 和 `test:full` 默认假定真实服务运行在 `http://127.0.0.1:3030`,并能访问 DAEDALUS_AGENT 容器派生的内置 MQTT / MinIO 环境。 ## 默认账号 -- 用户名:`aios` -- 初始密码:`123456` +- 用户名:`admin` +- 初始密码:`admin` 首次使用默认密码登录后,系统会要求管理员修改密码。 ## 工作区下载 -浏览器请求 `GET /api/agents/:slug/workspace.zip` 后,服务端通过进程内 management action runtime 执行 `agent.workspace.export`,把 zip 写入 `AIOS_S3_ADMIN_OUTBOX_BUCKET`,再从 S3 读取该对象并以附件形式返回浏览器。 +浏览器请求 `GET /api/agents/:slug/workspace.zip` 后,服务端通过进程内 management action runtime 执行 `agent.workspace.export`,把 zip 写入 `DA_S3_ADMIN_OUTBOX_BUCKET`,再从 S3 读取该对象并以附件形式返回浏览器。 ## 同步计划 @@ -114,4 +114,4 @@ npm run test:full localhost 请求会跳过鉴权;非本地请求需要配置好的 Bearer Token 或管理端登录 Token。 -AIOS Docker 容器中 `aios-apps-invoke-cli serve` 以 `aios-svc` 身份常驻运行,通过这些 API 解析业务系统配置、外部 cookie 和调用日志。OpenClaw/agent 侧只执行 CLI client,并通过本地 socket 把请求交给 service。 +DAEDALUS_AGENT Docker 容器中 `daedalus-agent-apps-invoke-cli serve` 以 `daedalus-svc` 身份常驻运行,通过这些 API 解析业务系统配置、外部 cookie 和调用日志。OpenClaw/agent 侧只执行 CLI client,并通过本地 socket 把请求交给 service。 diff --git a/packages/aios-management-web/docs/spec.md b/packages/daedalus-agent-management-web/docs/spec.md similarity index 100% rename from packages/aios-management-web/docs/spec.md rename to packages/daedalus-agent-management-web/docs/spec.md diff --git a/packages/aios-management-web/index.html b/packages/daedalus-agent-management-web/index.html similarity index 71% rename from packages/aios-management-web/index.html rename to packages/daedalus-agent-management-web/index.html index 03ac3ac2c3bc910f217d16148ee8aba1a6bd4439..bb0b59d31b5b88512b5b4b91ef53de6f2d5348cd 100644 --- a/packages/aios-management-web/index.html +++ b/packages/daedalus-agent-management-web/index.html @@ -2,9 +2,9 @@ - + - 数字员工控制台 + 管理控制台
diff --git a/packages/aios-management-web/package-lock.json b/packages/daedalus-agent-management-web/package-lock.json similarity index 99% rename from packages/aios-management-web/package-lock.json rename to packages/daedalus-agent-management-web/package-lock.json index 44d51160e2c4a0e7763f91021249b0751712815c..27cd5b65a02260a7cf98a1e91b60ec456b763bc0 100644 --- a/packages/aios-management-web/package-lock.json +++ b/packages/daedalus-agent-management-web/package-lock.json @@ -1,11 +1,11 @@ { - "name": "aios-management-web", + "name": "daedalus-agent-management-web", "version": "1.0.13", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aios-management-web", + "name": "daedalus-agent-management-web", "version": "1.0.13", "dependencies": { "@ant-design/icons": "^6.0.0", diff --git a/packages/aios-management-web/package.json b/packages/daedalus-agent-management-web/package.json similarity index 97% rename from packages/aios-management-web/package.json rename to packages/daedalus-agent-management-web/package.json index e24ae41f28e1b830631d973767c3390ac148b0a7..a09205d504b1102af1724b720e49d3515a6a0a2e 100644 --- a/packages/aios-management-web/package.json +++ b/packages/daedalus-agent-management-web/package.json @@ -1,5 +1,5 @@ { - "name": "aios-management-web", + "name": "daedalus-agent-management-web", "version": "1.0.17", "type": "module", "files": [ diff --git a/packages/daedalus-agent-management-web/public/daedalus-favicon.svg b/packages/daedalus-agent-management-web/public/daedalus-favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..23aa99aec001576f066c07718a34fae5492c5dac --- /dev/null +++ b/packages/daedalus-agent-management-web/public/daedalus-favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/aios-management-web/public/digital-employee-icon.png b/packages/daedalus-agent-management-web/public/digital-employee-icon.png similarity index 100% rename from packages/aios-management-web/public/digital-employee-icon.png rename to packages/daedalus-agent-management-web/public/digital-employee-icon.png diff --git a/packages/aios-management-web/scripts/reset-password.js b/packages/daedalus-agent-management-web/scripts/reset-password.js similarity index 93% rename from packages/aios-management-web/scripts/reset-password.js rename to packages/daedalus-agent-management-web/scripts/reset-password.js index e69579337284e047eed0a850adfb7c56150369bc..c66da943509e13dbfe0a71165c71940c17783305 100644 --- a/packages/aios-management-web/scripts/reset-password.js +++ b/packages/daedalus-agent-management-web/scripts/reset-password.js @@ -12,7 +12,7 @@ if (!username || !password) { const result = db.prepare(` UPDATE users SET password_hash = ?, must_change_password = 1, updated_at = ? - WHERE username = ? AND role = 'admin' + WHERE username = ? AND role = 'daedalus-admin' `).run(hashPassword(password), toChinaISOString(), username); if (!result.changes) { diff --git a/packages/aios-management-web/server/fakes.js b/packages/daedalus-agent-management-web/server/fakes.js similarity index 100% rename from packages/aios-management-web/server/fakes.js rename to packages/daedalus-agent-management-web/server/fakes.js diff --git a/packages/aios-management-web/server/index.js b/packages/daedalus-agent-management-web/server/index.js similarity index 100% rename from packages/aios-management-web/server/index.js rename to packages/daedalus-agent-management-web/server/index.js diff --git a/packages/aios-management-web/server/management-src/adm-zip.d.ts b/packages/daedalus-agent-management-web/server/management-src/adm-zip.d.ts similarity index 100% rename from packages/aios-management-web/server/management-src/adm-zip.d.ts rename to packages/daedalus-agent-management-web/server/management-src/adm-zip.d.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent-template/create.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent-template/create.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent-template/create.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent-template/create.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent-template/delete.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent-template/delete.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent-template/delete.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent-template/delete.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent-template/service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent-template/service.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent-template/service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent-template/service.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/create.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/create.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/create.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/create.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/delete.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/delete.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/delete.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/delete.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/disable.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/disable.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/disable.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/disable.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/docs-update.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/docs-update.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/docs-update.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/docs-update.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/enable.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/enable.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/enable.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/enable.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/get.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/get.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/get.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/get.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/lifecycle-service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/lifecycle-service.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/lifecycle-service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/lifecycle-service.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/model-set.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/model-set.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/model-set.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/model-set.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/name-set.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/name-set.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/name-set.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/name-set.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/operations-service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/operations-service.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/operations-service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/operations-service.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/service.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/service.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/skills-service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/skills-service.ts similarity index 98% rename from packages/aios-management-web/server/management-src/capabilities/agent/skills-service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/skills-service.ts index 45bbdaa957f23895c416718b0711ae4364d7ea92..d31bb3a687b018aa942cfc63dea0015f425db83b 100644 --- a/packages/aios-management-web/server/management-src/capabilities/agent/skills-service.ts +++ b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/skills-service.ts @@ -17,7 +17,7 @@ import { readBuiltInComponentNames } from "../built-in-components.js"; const VALID_SKILL_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i; const FRONTMATTER_PATTERN = /^\uFEFF?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/; -const DEFAULT_SEED_SKILLS_ROOT = "/opt/aios-seed/home/.openclaw/skills"; +const DEFAULT_SEED_SKILLS_ROOT = "/opt/daedalus-agent-seed/home/.openclaw/skills"; interface SkillManifestMetadata { hasFrontmatter: boolean; @@ -398,7 +398,7 @@ export class AgentSkillsService { await mkdir(path.join(stagingDir, ".openclaw"), { recursive: true }); await writeFile(path.join(stagingDir, ".openclaw", "source-origin.json"), `${JSON.stringify({ version: 1, - source: "aios-management-upload", + source: "daedalus-agent-management-upload", spec: `s3://${params.bucket.trim()}/${params.objectKey.trim()}`, slug: params.slug }, null, 2)}\n`, "utf8"); @@ -551,8 +551,8 @@ export class AgentSkillsService { } const seedSkillsRoot = path.resolve( - process.env.AIOS_SEED_SKILLS_ROOT - || process.env.AIOS_SEED_OPENCLAW_SKILLS_ROOT + process.env.DA_SEED_SKILLS_ROOT + || process.env.DA_SEED_OPENCLAW_SKILLS_ROOT || DEFAULT_SEED_SKILLS_ROOT ); const targetPath = path.resolve(entryInfo.targetPath); @@ -590,8 +590,8 @@ export class AgentSkillsService { private async resolveSharedOwnership(options: SharedOwnershipOptions = {}): Promise { const [uid, gid] = await Promise.all([ - options.includeUid ? this.resolveUserId(process.env.AIOS_OPENCLAW_USER) : Promise.resolve(undefined), - this.resolveGroupId(process.env.AIOS_OPENCLAW_GROUP) + options.includeUid ? this.resolveUserId(process.env.DA_OPENCLAW_USER) : Promise.resolve(undefined), + this.resolveGroupId(process.env.DA_OPENCLAW_GROUP) ]); return { uid, gid }; diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/state-store.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/state-store.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/state-store.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/state-store.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/support.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/support.ts similarity index 98% rename from packages/aios-management-web/server/management-src/capabilities/agent/support.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/support.ts index 0286f5e94043bc8e8167212138b34489dfca16d2..87572b751bf78437bff2f20bc399e673b18eaecb 100644 --- a/packages/aios-management-web/server/management-src/capabilities/agent/support.ts +++ b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/support.ts @@ -10,7 +10,7 @@ export const DEFAULT_TEMPLATE_NAME = "default"; export const SHARED_DIRECTORY_MODE = 0o2770; export const SHARED_AGENT_DOCS_FILE_MODE = 0o640; export const SHARED_FILE_MODE = 0o660; -export const MQTT_CHANNEL_ID = "aios-mqtt-channel"; +export const MQTT_CHANNEL_ID = "daedalus-agent-mqtt-channel"; export const DEFAULT_DM_SCOPE = "per-channel-peer"; export interface ResolvedAgentCreateOptions { diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/usage-list.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/usage-list.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/usage-list.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/usage-list.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/workspace-export.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/workspace-export.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/agent/workspace-export.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/workspace-export.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/agent/workspace-service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/workspace-service.ts similarity index 99% rename from packages/aios-management-web/server/management-src/capabilities/agent/workspace-service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/agent/workspace-service.ts index 226fbffd924b07b01cae6d2a1db763d2903b6105..5ded28e25325a443f4ac4a478963f42a0c0012eb 100644 --- a/packages/aios-management-web/server/management-src/capabilities/agent/workspace-service.ts +++ b/packages/daedalus-agent-management-web/server/management-src/capabilities/agent/workspace-service.ts @@ -14,7 +14,7 @@ import { import { ensureSharedMode, ensureSharedPathPermissions } from "../shared-permissions.js"; const WORKSPACE_TEMPLATE_METADATA_FILES = new Set([ - ".aios-builtin.fingerprint" + ".daedalus-agent-builtin.fingerprint" ]); const DIRECTORY_ZIP_ATTR = 0o40755 << 16; diff --git a/packages/aios-management-web/server/management-src/capabilities/apps/create.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/apps/create.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/apps/create.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/apps/create.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/apps/delete.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/apps/delete.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/apps/delete.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/apps/delete.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/apps/disable.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/apps/disable.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/apps/disable.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/apps/disable.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/apps/enable.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/apps/enable.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/apps/enable.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/apps/enable.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/apps/log-record.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/apps/log-record.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/apps/log-record.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/apps/log-record.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/apps/service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/apps/service.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/apps/service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/apps/service.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/built-in-components.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/built-in-components.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/built-in-components.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/built-in-components.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/catalog/snapshot.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/catalog/snapshot.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/catalog/snapshot.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/catalog/snapshot.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/context.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/context.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/context.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/context.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/model-create.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-create.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/model-create.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-create.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/model-delete.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-delete.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/model-delete.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-delete.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/model-test.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-test.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/model-test.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-test.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/model-update.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-update.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/model-update.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/model-update.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/provider-create.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-create.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/provider-create.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-create.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/provider-delete.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-delete.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/provider-delete.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-delete.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/provider-test.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-test.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/provider-test.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-test.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/provider-update.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-update.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/llm/provider-update.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/provider-update.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/llm/service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/service.ts similarity index 99% rename from packages/aios-management-web/server/management-src/capabilities/llm/service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/llm/service.ts index 4d39af2d4683e3e69316e251853e778ebaf90095..2e37ca001345a2d664bd5c021ae971476f65a62f 100644 --- a/packages/aios-management-web/server/management-src/capabilities/llm/service.ts +++ b/packages/daedalus-agent-management-web/server/management-src/capabilities/llm/service.ts @@ -355,11 +355,11 @@ export class LlmModelConfigService { const messages = [ { role: "system", - content: "You are testing an AIOS/OpenClaw model configuration. Return only the requested token." + content: "You are testing an DAEDALUS_AGENT/OpenClaw model configuration. Return only the requested token." }, { role: "user", - content: "Reply with exactly: AIOS_MODEL_TEST_OK" + content: "Reply with exactly: DA_MODEL_TEST_OK" } ]; const requestPayload = { diff --git a/packages/aios-management-web/server/management-src/capabilities/ontology/service.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/ontology/service.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/ontology/service.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/ontology/service.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/operations/diagnostics-run.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/operations/diagnostics-run.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/operations/diagnostics-run.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/operations/diagnostics-run.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/operations/gateway-restart.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/operations/gateway-restart.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/operations/gateway-restart.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/operations/gateway-restart.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/operations/gateway-status.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/operations/gateway-status.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/operations/gateway-status.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/operations/gateway-status.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/registry.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/registry.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/registry.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/registry.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/service/ping.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/service/ping.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/service/ping.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/service/ping.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/shared-permissions.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/shared-permissions.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/shared-permissions.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/shared-permissions.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/skills-global/delete.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/skills-global/delete.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/skills-global/delete.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/skills-global/delete.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/skills-global/install-local.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/skills-global/install-local.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/skills-global/install-local.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/skills-global/install-local.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/skills-global/list.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/skills-global/list.ts similarity index 100% rename from packages/aios-management-web/server/management-src/capabilities/skills-global/list.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/skills-global/list.ts diff --git a/packages/aios-management-web/server/management-src/capabilities/version/list.ts b/packages/daedalus-agent-management-web/server/management-src/capabilities/version/list.ts similarity index 91% rename from packages/aios-management-web/server/management-src/capabilities/version/list.ts rename to packages/daedalus-agent-management-web/server/management-src/capabilities/version/list.ts index 644525504fe359e89564f8a81e76e41bc8dc35a9..96d86eabb467e6b5946ff21e6def9f2f28664046 100644 --- a/packages/aios-management-web/server/management-src/capabilities/version/list.ts +++ b/packages/daedalus-agent-management-web/server/management-src/capabilities/version/list.ts @@ -11,11 +11,11 @@ const PACKAGE_ROOT = findPackageRoot(path.dirname(fileURLToPath(import.meta.url) const REPO_ROOT = path.resolve(PACKAGE_ROOT, "..", ".."); const PACKAGES_ROOT = path.join(REPO_ROOT, "packages"); const EXTENSIONS_ROOT = path.join(REPO_ROOT, "extensions"); -const DEFAULT_TOOLCHAIN_DIR = "/opt/aios-toolchain"; -const DEFAULT_SEED_HOME = "/opt/aios-seed/home"; -const DEFAULT_INVOKE_SOCKET_PATH = "/var/aios/run/app-invoke.sock"; +const DEFAULT_TOOLCHAIN_DIR = "/opt/daedalus-agent-toolchain"; +const DEFAULT_SEED_HOME = "/opt/daedalus-agent-seed/home"; +const DEFAULT_INVOKE_SOCKET_PATH = "/var/daedalus-agent/run/app-invoke.sock"; const RUNTIME_STATUS_TIMEOUT_MS = 3000; -const MQTT_CHANNEL_PACKAGE = "aios-mqtt-channel"; +const MQTT_CHANNEL_PACKAGE = "daedalus-agent-mqtt-channel"; type RuntimeStatusValue = "normal" | "error" | "unknown"; @@ -37,7 +37,7 @@ function findPackageRoot(startDir: string): string { const candidate = path.join(currentDir, "package.json"); try { const metadata = JSON.parse(readFileSync(candidate, "utf8")) as { name?: unknown }; - if (metadata.name === "aios-management-web") { + if (metadata.name === "daedalus-agent-management-web") { return currentDir; } } catch { @@ -68,7 +68,7 @@ function sanitizeKernelDisplayText(value: unknown): string { } function getOpenClawConfigPath(): string { - const home = firstText(process.env.AIOS_OPENCLAW_HOME); + const home = firstText(process.env.DA_OPENCLAW_HOME); return firstText( process.env.OPENCLAW_CONFIG_PATH, home ? path.join(home, "openclaw.json") : "" @@ -77,7 +77,7 @@ function getOpenClawConfigPath(): string { function globalPackagePath(packageName: string): string { return path.join( - firstText(process.env.AIOS_TOOLCHAIN_DIR, DEFAULT_TOOLCHAIN_DIR), + firstText(process.env.DA_TOOLCHAIN_DIR, DEFAULT_TOOLCHAIN_DIR), "lib", "node_modules", packageName, @@ -87,13 +87,13 @@ function globalPackagePath(packageName: string): string { function seedMqttChannelPackagePath(): string { return path.join( - firstText(process.env.AIOS_SEED_HOME, DEFAULT_SEED_HOME), + firstText(process.env.DA_SEED_HOME, DEFAULT_SEED_HOME), ".openclaw", "npm", "projects", - "aios-mqtt-channel", + "daedalus-agent-mqtt-channel", "node_modules", - "aios-mqtt-channel", + "daedalus-agent-mqtt-channel", "package.json" ); } @@ -393,19 +393,19 @@ function versionComponents(): VersionComponent[] { return [ { group: "runtime", - packageName: "aios-apps-invoke-cli", + packageName: "daedalus-agent-apps-invoke-cli", packagePaths: [ - globalPackagePath("aios-apps-invoke-cli"), - path.join(PACKAGES_ROOT, "aios-apps-invoke-cli", "package.json") + globalPackagePath("daedalus-agent-apps-invoke-cli"), + path.join(PACKAGES_ROOT, "daedalus-agent-apps-invoke-cli", "package.json") ] }, { group: "runtime", - packageName: "aios-mqtt-channel", + packageName: "daedalus-agent-mqtt-channel", packagePaths: [ - firstText(process.env.AIOS_MQTT_CHANNEL_PACKAGE_JSON), + firstText(process.env.DA_MQTT_CHANNEL_PACKAGE_JSON), seedMqttChannelPackagePath(), - path.join(EXTENSIONS_ROOT, "openclaw-plugins", "aios-mqtt-channel", "package.json") + path.join(EXTENSIONS_ROOT, "openclaw-plugins", "daedalus-agent-mqtt-channel", "package.json") ].filter(Boolean) }, { @@ -414,7 +414,7 @@ function versionComponents(): VersionComponent[] { displayName: "core", packagePaths: [ globalPackagePath("openclaw"), - path.join(EXTENSIONS_ROOT, "openclaw-plugins", "aios-mqtt-channel", "node_modules", "openclaw", "package.json") + path.join(EXTENSIONS_ROOT, "openclaw-plugins", "daedalus-agent-mqtt-channel", "node_modules", "openclaw", "package.json") ] } ]; @@ -442,7 +442,7 @@ function readPackageMetadata(packagePaths: string[], fallbackName: string): { na } function getDefaultRuntimeStatus(component: VersionComponent): RuntimeStatus { - if (component.packageName === "aios-management-web") { + if (component.packageName === "daedalus-agent-management-web") { return { status: "normal", statusMessage: "管理控制台正常" @@ -473,7 +473,7 @@ export const versionList: CapabilityHandler = async (_request, context) => { if (component.packageName === MQTT_CHANNEL_PACKAGE) { return getPluginRuntimeStatus(openclawStatus.gatewayStatus, MQTT_CHANNEL_PACKAGE); } - if (component.packageName === "aios-apps-invoke-cli") { + if (component.packageName === "daedalus-agent-apps-invoke-cli") { return appInvokeStatus; } return getDefaultRuntimeStatus(component); diff --git a/packages/aios-management-web/server/management-src/china-time.ts b/packages/daedalus-agent-management-web/server/management-src/china-time.ts similarity index 100% rename from packages/aios-management-web/server/management-src/china-time.ts rename to packages/daedalus-agent-management-web/server/management-src/china-time.ts diff --git a/packages/aios-management-web/server/management-src/env.ts b/packages/daedalus-agent-management-web/server/management-src/env.ts similarity index 67% rename from packages/aios-management-web/server/management-src/env.ts rename to packages/daedalus-agent-management-web/server/management-src/env.ts index b0bde70a74895b09b54aa7c308a8a5d7061ecbe4..6d849bd685a4c94a826f1774d853e01ee2a86574 100644 --- a/packages/aios-management-web/server/management-src/env.ts +++ b/packages/daedalus-agent-management-web/server/management-src/env.ts @@ -5,9 +5,9 @@ import type { EnvironmentConfig } from "./types.js"; const DEFAULT_OPENCLAW_BIN = "openclaw"; const DEFAULT_DOCTOR_BIN = "doctor"; -const DEFAULT_OPENCLAW_COMMAND = "/opt/aios-toolchain/bin/openclaw"; -const DEFAULT_DOCTOR_COMMAND = "/opt/aios-toolchain/bin/doctor"; -const DEFAULT_OPENCLAW_CLI_TMP_DIR = "/tmp/aios-openclaw-cli"; +const DEFAULT_OPENCLAW_COMMAND = "/opt/daedalus-agent-toolchain/bin/openclaw"; +const DEFAULT_DOCTOR_COMMAND = "/opt/daedalus-agent-toolchain/bin/doctor"; +const DEFAULT_OPENCLAW_CLI_TMP_DIR = "/tmp/daedalus-agent-openclaw-cli"; function readRequiredEnv(name: string, fallback?: string): string { const value = process.env[name] ?? fallback; @@ -122,21 +122,21 @@ function readOptionalPathEnv(name: string, fallback?: string): string | undefine } export function loadEnvironmentConfig(): EnvironmentConfig { - const dataRoot = readRequiredPathEnv("AIOS_DATA_DIR"); - const openclawHome = readRequiredPathEnv("AIOS_OPENCLAW_HOME"); + const dataRoot = readRequiredPathEnv("DA_DATA_DIR"); + const openclawHome = readRequiredPathEnv("DA_OPENCLAW_HOME"); const openclawStateDir = openclawHome; const openclawConfigPath = joinResolvedPath(openclawHome, "openclaw.json"); - const tmpDir = readRequiredPathEnv("AIOS_TMP_DIR"); + const tmpDir = readRequiredPathEnv("DA_TMP_DIR"); const openclawCliTmpDir = - readOptionalPathEnv("AIOS_OPENCLAW_CLI_TMP_DIR", DEFAULT_OPENCLAW_CLI_TMP_DIR) + readOptionalPathEnv("DA_OPENCLAW_CLI_TMP_DIR", DEFAULT_OPENCLAW_CLI_TMP_DIR) ?? DEFAULT_OPENCLAW_CLI_TMP_DIR; - const gatewayAuthToken = readRequiredEnv("AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN", "aios-local-gateway-token"); + const gatewayAuthToken = readRequiredEnv("DA_OPENCLAW_GATEWAY_AUTH_TOKEN", "daedalus-agent-local-gateway-token"); - const managedBroker = readRequiredEnv("AIOS_MQTT_CHANNEL_BROKER"); - const managedUsername = readRequiredEnv("AIOS_MQTT_CHANNEL_USERNAME"); - const managedPassword = readRequiredEnv("AIOS_MQTT_CHANNEL_PASSWORD"); - const inboundTopicTemplate = readRequiredEnv("AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE"); - const outboundTopicTemplate = readRequiredEnv("AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE"); + const managedBroker = readRequiredEnv("DA_MQTT_CHANNEL_BROKER"); + const managedUsername = readRequiredEnv("DA_MQTT_CHANNEL_USERNAME"); + const managedPassword = readRequiredEnv("DA_MQTT_CHANNEL_PASSWORD"); + const inboundTopicTemplate = readRequiredEnv("DA_CHANNEL_INBOUND_TOPIC_TEMPLATE"); + const outboundTopicTemplate = readRequiredEnv("DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE"); return { gatewayRestartMode: "container", @@ -150,24 +150,24 @@ export function loadEnvironmentConfig(): EnvironmentConfig { openclawBin: readOptionalEnv("OPENCLAW_COMMAND", DEFAULT_OPENCLAW_COMMAND) ?? DEFAULT_OPENCLAW_BIN, doctorBin: readOptionalEnv("DOCTOR_COMMAND", DEFAULT_DOCTOR_COMMAND) ?? DEFAULT_DOCTOR_BIN, workspacesRoot: joinResolvedPath(openclawHome, "workspaces"), - workspaceTemplatesRoot: readRequiredPathEnv("AIOS_WORKSPACE_TEMPLATES_DIR"), - ontologyRoot: readRequiredPathEnv("AIOS_ONTOLOGY_DIR"), - ontologyS3Endpoint: ensureOptionalUrl("AIOS_S3_ENDPOINT", readOptionalEnv("AIOS_S3_ENDPOINT")), - ontologyS3Region: readOptionalEnv("AIOS_S3_REGION", "local") ?? "local", - ontologyS3AccessKeyId: readOptionalEnv("AIOS_S3_ACCESS_KEY_ID"), - ontologyS3SecretAccessKey: readOptionalEnv("AIOS_S3_SECRET_ACCESS_KEY"), - ontologyS3ForcePathStyle: readBooleanEnv("AIOS_S3_FORCE_PATH_STYLE", true), - adminInboxBucket: readOptionalEnv("AIOS_S3_ADMIN_INBOX_BUCKET"), - adminOutboxBucket: readOptionalEnv("AIOS_S3_ADMIN_OUTBOX_BUCKET"), + workspaceTemplatesRoot: readRequiredPathEnv("DA_WORKSPACE_TEMPLATES_DIR"), + ontologyRoot: readRequiredPathEnv("DA_ONTOLOGY_DIR"), + ontologyS3Endpoint: ensureOptionalUrl("DA_S3_ENDPOINT", readOptionalEnv("DA_S3_ENDPOINT")), + ontologyS3Region: readOptionalEnv("DA_S3_REGION", "local") ?? "local", + ontologyS3AccessKeyId: readOptionalEnv("DA_S3_ACCESS_KEY_ID"), + ontologyS3SecretAccessKey: readOptionalEnv("DA_S3_SECRET_ACCESS_KEY"), + ontologyS3ForcePathStyle: readBooleanEnv("DA_S3_FORCE_PATH_STYLE", true), + adminInboxBucket: readOptionalEnv("DA_S3_ADMIN_INBOX_BUCKET"), + adminOutboxBucket: readOptionalEnv("DA_S3_ADMIN_OUTBOX_BUCKET"), globalSkillsRoot: joinResolvedPath(openclawHome, "skills"), stateFile: joinResolvedPath(dataRoot, "openclaw-management", "managed-agents.json"), - mqttBrokerUrl: ensureBrokerUrl("AIOS_MQTT_CHANNEL_BROKER", managedBroker), + mqttBrokerUrl: ensureBrokerUrl("DA_MQTT_CHANNEL_BROKER", managedBroker), mqttUsername: managedUsername, mqttPassword: managedPassword, - managedMqttBrokerUrl: ensureBrokerUrl("AIOS_MQTT_CHANNEL_BROKER", managedBroker), + managedMqttBrokerUrl: ensureBrokerUrl("DA_MQTT_CHANNEL_BROKER", managedBroker), managedMqttUsername: managedUsername, managedMqttPassword: managedPassword, - inboundTopicTemplate: ensureTopicTemplate("AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE", inboundTopicTemplate), - outboundTopicTemplate: ensureTopicTemplate("AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE", outboundTopicTemplate) + inboundTopicTemplate: ensureTopicTemplate("DA_CHANNEL_INBOUND_TOPIC_TEMPLATE", inboundTopicTemplate), + outboundTopicTemplate: ensureTopicTemplate("DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE", outboundTopicTemplate) }; } diff --git a/packages/aios-management-web/server/management-src/index.ts b/packages/daedalus-agent-management-web/server/management-src/index.ts similarity index 100% rename from packages/aios-management-web/server/management-src/index.ts rename to packages/daedalus-agent-management-web/server/management-src/index.ts diff --git a/packages/aios-management-web/server/management-src/logger.ts b/packages/daedalus-agent-management-web/server/management-src/logger.ts similarity index 88% rename from packages/aios-management-web/server/management-src/logger.ts rename to packages/daedalus-agent-management-web/server/management-src/logger.ts index 83d7c823ecc7d85b5f5b72318306b0c3e6834d9a..f98bf90b078d0242d8f5e7b7f64874c26845b0bd 100644 --- a/packages/aios-management-web/server/management-src/logger.ts +++ b/packages/daedalus-agent-management-web/server/management-src/logger.ts @@ -9,7 +9,7 @@ import timezone from "dayjs/plugin/timezone.js"; dayjs.extend(utc); dayjs.extend(timezone); -const PACKAGE_NAME = "aios-management-web"; +const PACKAGE_NAME = "daedalus-agent-management-web"; const warnedLogDirs = new Set(); function beijingTime(): string { @@ -17,17 +17,17 @@ function beijingTime(): string { } function resolveLogDir(): string | undefined { - const configured = process.env.AIOS_LOG_DIR?.trim(); + const configured = process.env.DA_LOG_DIR?.trim(); if (configured) { return configured; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -76,7 +76,7 @@ function createDestination(fd: 1 | 2): DestinationStream { export function createLogger(name: string, fd: 1 | 2 = 2): Logger { return pino({ name, - level: process.env.AIOS_LOG_LEVEL || "info", + level: process.env.DA_LOG_LEVEL || "info", timestamp: () => `,"ts":"${beijingTime()}"`, base: null }, createDestination(fd)); diff --git a/packages/aios-management-web/server/management-src/service.ts b/packages/daedalus-agent-management-web/server/management-src/service.ts similarity index 99% rename from packages/aios-management-web/server/management-src/service.ts rename to packages/daedalus-agent-management-web/server/management-src/service.ts index ef55cc11d774d54216bedb6007d144ff25e6ff72..6221e1fd82931cdcab8523a20fd517a577c3e5b4 100644 --- a/packages/aios-management-web/server/management-src/service.ts +++ b/packages/daedalus-agent-management-web/server/management-src/service.ts @@ -19,7 +19,7 @@ import { buildOpenClawCommandEnv } from "./tools/openclaw-command-env.js"; import type { ManagementRequest, ManagementResponse, ServiceInfo } from "./types.js"; const require = createRequire(import.meta.url); -const SERVICE_NAME = "aios-management-web"; +const SERVICE_NAME = "daedalus-agent-management-web"; const logger = createLogger("management-actions"); interface RuntimeState { diff --git a/packages/aios-management-web/server/management-src/tools/cli-runner.ts b/packages/daedalus-agent-management-web/server/management-src/tools/cli-runner.ts similarity index 100% rename from packages/aios-management-web/server/management-src/tools/cli-runner.ts rename to packages/daedalus-agent-management-web/server/management-src/tools/cli-runner.ts diff --git a/packages/aios-management-web/server/management-src/tools/openclaw-command-env.ts b/packages/daedalus-agent-management-web/server/management-src/tools/openclaw-command-env.ts similarity index 82% rename from packages/aios-management-web/server/management-src/tools/openclaw-command-env.ts rename to packages/daedalus-agent-management-web/server/management-src/tools/openclaw-command-env.ts index d703faf49f67db2c88be8f92df9738031c94b33d..7f44fd1a8e3f62227a1a37b76cc18e74a28f23f8 100644 --- a/packages/aios-management-web/server/management-src/tools/openclaw-command-env.ts +++ b/packages/daedalus-agent-management-web/server/management-src/tools/openclaw-command-env.ts @@ -13,9 +13,9 @@ export function buildOpenClawCommandEnv( ): NodeJS.ProcessEnv { return { ...baseEnv, - AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN: env.gatewayAuthToken, - AIOS_OPENCLAW_CLI_TMP_DIR: env.openclawCliTmpDir, - AIOS_TMP_DIR: env.openclawCliTmpDir, + DA_OPENCLAW_GATEWAY_AUTH_TOKEN: env.gatewayAuthToken, + DA_OPENCLAW_CLI_TMP_DIR: env.openclawCliTmpDir, + DA_TMP_DIR: env.openclawCliTmpDir, NODE_DISABLE_COMPILE_CACHE: "1", OPENCLAW_HOME: inferOpenClawEffectiveHome(env.openclawHome), OPENCLAW_STATE_DIR: env.openclawStateDir, diff --git a/packages/aios-management-web/server/management-src/tools/s3-archive.ts b/packages/daedalus-agent-management-web/server/management-src/tools/s3-archive.ts similarity index 95% rename from packages/aios-management-web/server/management-src/tools/s3-archive.ts rename to packages/daedalus-agent-management-web/server/management-src/tools/s3-archive.ts index 653634ada8bab00124f7c03536054d20b1397acb..1bfd5c58005537f2ebe116757b4e79989e953f0c 100644 --- a/packages/aios-management-web/server/management-src/tools/s3-archive.ts +++ b/packages/daedalus-agent-management-web/server/management-src/tools/s3-archive.ts @@ -19,10 +19,10 @@ function requireS3Config(env: EnvironmentConfig): { forcePathStyle: boolean; } { if (!env.ontologyS3AccessKeyId) { - throw new Error("Missing required environment variable: AIOS_S3_ACCESS_KEY_ID"); + throw new Error("Missing required environment variable: DA_S3_ACCESS_KEY_ID"); } if (!env.ontologyS3SecretAccessKey) { - throw new Error("Missing required environment variable: AIOS_S3_SECRET_ACCESS_KEY"); + throw new Error("Missing required environment variable: DA_S3_SECRET_ACCESS_KEY"); } return { diff --git a/packages/aios-management-web/server/management-src/tsconfig.json b/packages/daedalus-agent-management-web/server/management-src/tsconfig.json similarity index 100% rename from packages/aios-management-web/server/management-src/tsconfig.json rename to packages/daedalus-agent-management-web/server/management-src/tsconfig.json diff --git a/packages/aios-management-web/server/management-src/types.ts b/packages/daedalus-agent-management-web/server/management-src/types.ts similarity index 100% rename from packages/aios-management-web/server/management-src/types.ts rename to packages/daedalus-agent-management-web/server/management-src/types.ts diff --git a/packages/aios-management-web/server/management-test/business-system-manager.test.ts b/packages/daedalus-agent-management-web/server/management-test/business-system-manager.test.ts similarity index 98% rename from packages/aios-management-web/server/management-test/business-system-manager.test.ts rename to packages/daedalus-agent-management-web/server/management-test/business-system-manager.test.ts index 36513d2a8dcb187eb0b0d36d00804280d1daccbe..279ee7bfd567b61189733c5f4102fd714bdc8793 100644 --- a/packages/aios-management-web/server/management-test/business-system-manager.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/business-system-manager.test.ts @@ -36,8 +36,8 @@ function createEnv(overrides: Partial = {}): EnvironmentConfi managedMqttBrokerUrl: "mqtts://channel-broker:8883", managedMqttUsername: "channel-user", managedMqttPassword: "channel-pass", - inboundTopicTemplate: "aios/agent/{agentId}/inbound", - outboundTopicTemplate: "aios/agent/{agentId}/outbound", + inboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + outboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound", ...overrides }; } diff --git a/packages/aios-management-web/server/management-test/capabilities-registry.test.ts b/packages/daedalus-agent-management-web/server/management-test/capabilities-registry.test.ts similarity index 93% rename from packages/aios-management-web/server/management-test/capabilities-registry.test.ts rename to packages/daedalus-agent-management-web/server/management-test/capabilities-registry.test.ts index ed08acd5a38d5500f1a605f1b6c2c530dd4105e3..792a3c392470d1a41b9ca0b9f4efff4e6dfcd72e 100644 --- a/packages/aios-management-web/server/management-test/capabilities-registry.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/capabilities-registry.test.ts @@ -386,8 +386,8 @@ test("capability handlers delegate to the expected service methods", async () => assert.equal(typeof (result as { generatedAt?: unknown }).generatedAt, "string", item.action); const versionItems = (result as { items?: Array<{ name?: string; packageName?: string; version?: string; status?: string }> }).items; assert.deepEqual(versionItems?.map((versionItem) => versionItem.name), [ - "aios-apps-invoke-cli", - "aios-mqtt-channel", + "daedalus-agent-apps-invoke-cli", + "daedalus-agent-mqtt-channel", "core" ], item.action); assert.equal(versionItems?.find((versionItem) => versionItem.name === "core")?.packageName, "openclaw", item.action); @@ -489,8 +489,8 @@ test("catalog.snapshot emits compact catalog payloads", async () => { fallbacks: ["backup-openai/qwen-fallback"] }, workspace: "/workspaces/alpha", - inboundTopic: "aios/agent/alpha/inbound", - outboundTopic: "aios/agent/alpha/outbound", + inboundTopic: "daedalus-agent/agent/alpha/inbound", + outboundTopic: "daedalus-agent/agent/alpha/outbound", usage: { daily: 1024 } }] }) as never; @@ -557,8 +557,8 @@ test("catalog.snapshot emits compact catalog payloads", async () => { modelRef: "corp-openai/gpt-4.1-mini", fallbackModelRef: "backup-openai/qwen-fallback", topics: { - inbound: "aios/agent/alpha/inbound", - outbound: "aios/agent/alpha/outbound" + inbound: "daedalus-agent/agent/alpha/inbound", + outbound: "daedalus-agent/agent/alpha/outbound" } }); assert.deepEqual(result.catalogs?.skills?.items?.[0], { @@ -582,24 +582,24 @@ test("catalog.snapshot emits compact catalog payloads", async () => { }); test("version.list reads deployed toolchain and seed package versions", async () => { - const tempRoot = mkdtempSync(path.join(tmpdir(), "aios-version-list-")); - const previousToolchainDir = process.env.AIOS_TOOLCHAIN_DIR; - const previousSeedHome = process.env.AIOS_SEED_HOME; + const tempRoot = mkdtempSync(path.join(tmpdir(), "daedalus-agent-version-list-")); + const previousToolchainDir = process.env.DA_TOOLCHAIN_DIR; + const previousSeedHome = process.env.DA_SEED_HOME; try { const toolchainDir = path.join(tempRoot, "toolchain"); const seedHome = path.join(tempRoot, "seed-home"); const packageJsons = [ - [path.join(toolchainDir, "lib", "node_modules", "aios-apps-invoke-cli", "package.json"), { - name: "aios-apps-invoke-cli", + [path.join(toolchainDir, "lib", "node_modules", "daedalus-agent-apps-invoke-cli", "package.json"), { + name: "daedalus-agent-apps-invoke-cli", version: "9.9.1" }], [path.join(toolchainDir, "lib", "node_modules", "openclaw", "package.json"), { name: "openclaw", version: "test-core-version" }], - [path.join(seedHome, ".openclaw", "npm", "projects", "aios-mqtt-channel", "node_modules", "aios-mqtt-channel", "package.json"), { - name: "aios-mqtt-channel", + [path.join(seedHome, ".openclaw", "npm", "projects", "daedalus-agent-mqtt-channel", "node_modules", "daedalus-agent-mqtt-channel", "package.json"), { + name: "daedalus-agent-mqtt-channel", version: "0.9.7" }] ] as const; @@ -609,14 +609,14 @@ test("version.list reads deployed toolchain and seed package versions", async () writeFileSync(packageJsonPath, JSON.stringify(metadata), "utf8"); } - process.env.AIOS_TOOLCHAIN_DIR = toolchainDir; - process.env.AIOS_SEED_HOME = seedHome; + process.env.DA_TOOLCHAIN_DIR = toolchainDir; + process.env.DA_SEED_HOME = seedHome; const result = await capabilityHandlers["version.list"]!({ action: "version.list" }, createContext([])); const items = (result as { items?: Array<{ name: string; packageName: string; version: string; status: string }> }).items ?? []; - assert.equal(items.find((item) => item.name === "aios-apps-invoke-cli")?.version, "9.9.1"); - assert.equal(items.find((item) => item.name === "aios-mqtt-channel")?.version, "0.9.7"); + assert.equal(items.find((item) => item.name === "daedalus-agent-apps-invoke-cli")?.version, "9.9.1"); + assert.equal(items.find((item) => item.name === "daedalus-agent-mqtt-channel")?.version, "0.9.7"); assert.equal(items.find((item) => item.name === "core")?.status, "normal"); assert.deepEqual( items @@ -634,14 +634,14 @@ test("version.list reads deployed toolchain and seed package versions", async () ); } finally { if (previousToolchainDir === undefined) { - delete process.env.AIOS_TOOLCHAIN_DIR; + delete process.env.DA_TOOLCHAIN_DIR; } else { - process.env.AIOS_TOOLCHAIN_DIR = previousToolchainDir; + process.env.DA_TOOLCHAIN_DIR = previousToolchainDir; } if (previousSeedHome === undefined) { - delete process.env.AIOS_SEED_HOME; + delete process.env.DA_SEED_HOME; } else { - process.env.AIOS_SEED_HOME = previousSeedHome; + process.env.DA_SEED_HOME = previousSeedHome; } rmSync(tempRoot, { recursive: true, force: true }); } diff --git a/packages/aios-management-web/server/management-test/globals.d.ts b/packages/daedalus-agent-management-web/server/management-test/globals.d.ts similarity index 100% rename from packages/aios-management-web/server/management-test/globals.d.ts rename to packages/daedalus-agent-management-web/server/management-test/globals.d.ts diff --git a/packages/aios-management-web/server/management-test/llm-model-config-service.test.ts b/packages/daedalus-agent-management-web/server/management-test/llm-model-config-service.test.ts similarity index 95% rename from packages/aios-management-web/server/management-test/llm-model-config-service.test.ts rename to packages/daedalus-agent-management-web/server/management-test/llm-model-config-service.test.ts index dadafa2f0467929e6fd26c5aa333e8d0bd2acb4c..d7847c007537dde3eba4fcc7df1cedb999b3acb5 100644 --- a/packages/aios-management-web/server/management-test/llm-model-config-service.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/llm-model-config-service.test.ts @@ -35,8 +35,8 @@ function createEnv(root: string): EnvironmentConfig { managedMqttBrokerUrl: "mqtts://channel-broker:8883", managedMqttUsername: "channel-user", managedMqttPassword: "channel-pass", - inboundTopicTemplate: "aios/agent/{agentId}/inbound", - outboundTopicTemplate: "aios/agent/{agentId}/outbound" + inboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + outboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" }; } @@ -180,7 +180,7 @@ test("testModel calls OpenAI compatible chat completions with OpenClaw context a choices: [{ message: { role: "assistant", - content: "AIOS_PROVIDER_TEST_OK" + content: "DA_PROVIDER_TEST_OK" } }] }), { @@ -217,11 +217,11 @@ test("testModel calls OpenAI compatible chat completions with OpenClaw context a assert.deepEqual(requestBody.messages, [ { role: "system", - content: "You are testing an AIOS/OpenClaw model configuration. Return only the requested token." + content: "You are testing an DAEDALUS_AGENT/OpenClaw model configuration. Return only the requested token." }, { role: "user", - content: "Reply with exactly: AIOS_MODEL_TEST_OK" + content: "Reply with exactly: DA_MODEL_TEST_OK" } ]); } finally { diff --git a/packages/aios-management-web/server/management-test/ontology-manager.test.ts b/packages/daedalus-agent-management-web/server/management-test/ontology-manager.test.ts similarity index 96% rename from packages/aios-management-web/server/management-test/ontology-manager.test.ts rename to packages/daedalus-agent-management-web/server/management-test/ontology-manager.test.ts index eff2fcf2a7999d52877d5ca75322f8749ad32c76..388f152978ae01825f08df23f723ab1fd1b68878 100644 --- a/packages/aios-management-web/server/management-test/ontology-manager.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/ontology-manager.test.ts @@ -36,8 +36,8 @@ function createEnv(overrides: Partial = {}): EnvironmentConfi managedMqttBrokerUrl: "mqtts://channel-broker:8883", managedMqttUsername: "channel-user", managedMqttPassword: "channel-pass", - inboundTopicTemplate: "aios/agent/{agentId}/inbound", - outboundTopicTemplate: "aios/agent/{agentId}/outbound", + inboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + outboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound", ...overrides }; } diff --git a/packages/aios-management-web/server/management-test/openclaw-manager.test.ts b/packages/daedalus-agent-management-web/server/management-test/openclaw-manager.test.ts similarity index 83% rename from packages/aios-management-web/server/management-test/openclaw-manager.test.ts rename to packages/daedalus-agent-management-web/server/management-test/openclaw-manager.test.ts index cba669805f6b6636b8ed6db471ea7c99d30c9b91..25480e3c57a827b5b5fa79b9ce23fe009d911232 100644 --- a/packages/aios-management-web/server/management-test/openclaw-manager.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/openclaw-manager.test.ts @@ -100,8 +100,8 @@ function createEnv(overrides: Partial = {}): EnvironmentConfi managedMqttBrokerUrl: "mqtts://channel-broker:8883", managedMqttUsername: "channel-user", managedMqttPassword: "channel-pass", - inboundTopicTemplate: "aios/agent/{agentId}/inbound", - outboundTopicTemplate: "aios/agent/{agentId}/outbound", + inboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + outboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound", ...overrides }; } @@ -117,46 +117,46 @@ async function readOpenClawConfig(configPath: string): Promise { const previousEnv = { ...process.env }; - process.env.AIOS_DATA_DIR = "/var/aios/data"; - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - process.env.AIOS_OPENCLAW_HOME = "/var/aios/.openclaw"; - process.env.AIOS_TMP_DIR = "/var/aios/tmp"; - process.env.AIOS_OPENCLAW_CLI_TMP_DIR = "/tmp/aios-openclaw-cli"; - process.env.AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN = "env-gateway-token"; - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = "/var/aios/workspace-templates"; - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; + process.env.DA_DATA_DIR = "/var/daedalus-agent/data"; + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + process.env.DA_OPENCLAW_HOME = "/var/daedalus-agent/.openclaw"; + process.env.DA_TMP_DIR = "/var/daedalus-agent/tmp"; + process.env.DA_OPENCLAW_CLI_TMP_DIR = "/tmp/daedalus-agent-openclaw-cli"; + process.env.DA_OPENCLAW_GATEWAY_AUTH_TOKEN = "env-gateway-token"; + process.env.DA_WORKSPACE_TEMPLATES_DIR = "/var/daedalus-agent/workspace-templates"; + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; try { const env = loadEnvironmentConfig(); assert.equal(env.gatewayRestartMode, "container"); - assert.equal(env.dataRoot, "/var/aios/data"); - assert.equal(env.openclawHome, "/var/aios/.openclaw"); - assert.equal(env.openclawStateDir, "/var/aios/.openclaw"); - assert.equal(env.openclawConfigPath, "/var/aios/.openclaw/openclaw.json"); - assert.equal(env.tmpDir, "/var/aios/tmp"); - assert.equal(env.openclawCliTmpDir, "/tmp/aios-openclaw-cli"); + assert.equal(env.dataRoot, "/var/daedalus-agent/data"); + assert.equal(env.openclawHome, "/var/daedalus-agent/.openclaw"); + assert.equal(env.openclawStateDir, "/var/daedalus-agent/.openclaw"); + assert.equal(env.openclawConfigPath, "/var/daedalus-agent/.openclaw/openclaw.json"); + assert.equal(env.tmpDir, "/var/daedalus-agent/tmp"); + assert.equal(env.openclawCliTmpDir, "/tmp/daedalus-agent-openclaw-cli"); assert.equal(env.gatewayAuthToken, "env-gateway-token"); - assert.equal(env.workspacesRoot, "/var/aios/.openclaw/workspaces"); - assert.equal(env.workspaceTemplatesRoot, "/var/aios/workspace-templates"); - assert.equal(env.ontologyRoot, "/var/aios/ontology"); - assert.equal(env.globalSkillsRoot, "/var/aios/.openclaw/skills"); - assert.equal(env.stateFile, "/var/aios/data/openclaw-management/managed-agents.json"); + assert.equal(env.workspacesRoot, "/var/daedalus-agent/.openclaw/workspaces"); + assert.equal(env.workspaceTemplatesRoot, "/var/daedalus-agent/workspace-templates"); + assert.equal(env.ontologyRoot, "/var/daedalus-agent/ontology"); + assert.equal(env.globalSkillsRoot, "/var/daedalus-agent/.openclaw/skills"); + assert.equal(env.stateFile, "/var/daedalus-agent/data/openclaw-management/managed-agents.json"); assert.equal(env.mqttBrokerUrl, "mqtts://channel-broker:8883"); assert.equal(env.mqttUsername, "channel-user"); assert.equal(env.mqttPassword, "channel-pass"); - assert.equal(env.inboundTopicTemplate, "aios/agent/{agentId}/inbound"); - assert.equal(env.outboundTopicTemplate, "aios/agent/{agentId}/outbound"); + assert.equal(env.inboundTopicTemplate, "daedalus-agent/agent/{agentId}/inbound"); + assert.equal(env.outboundTopicTemplate, "daedalus-agent/agent/{agentId}/outbound"); } finally { process.env = previousEnv; } }); -test("buildOpenClawCliEnv pins gateway token and home to the managed AIOS runtime", () => { +test("buildOpenClawCliEnv pins gateway token and home to the managed DAEDALUS_AGENT runtime", () => { const env = createEnv({ gatewayAuthToken: "managed-token" }); @@ -167,13 +167,13 @@ test("buildOpenClawCliEnv pins gateway token and home to the managed AIOS runtim }); assert.equal(cliEnv.OPENCLAW_GATEWAY_TOKEN, "managed-token"); - assert.equal(cliEnv.AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN, "managed-token"); + assert.equal(cliEnv.DA_OPENCLAW_GATEWAY_AUTH_TOKEN, "managed-token"); assert.equal(cliEnv.OPENCLAW_HOME, path.dirname(env.openclawHome)); assert.equal(cliEnv.OPENCLAW_STATE_DIR, env.openclawStateDir); assert.equal(cliEnv.OPENCLAW_CONFIG_PATH, env.openclawConfigPath); assert.equal(cliEnv.NODE_DISABLE_COMPILE_CACHE, "1"); - assert.equal(cliEnv.AIOS_TMP_DIR, env.openclawCliTmpDir); - assert.equal(cliEnv.AIOS_OPENCLAW_CLI_TMP_DIR, env.openclawCliTmpDir); + assert.equal(cliEnv.DA_TMP_DIR, env.openclawCliTmpDir); + assert.equal(cliEnv.DA_OPENCLAW_CLI_TMP_DIR, env.openclawCliTmpDir); assert.equal(cliEnv.TMPDIR, env.openclawCliTmpDir); }); @@ -198,10 +198,10 @@ test("gatewayStatus pins OpenClaw state to the managed runtime directory", async const previousEnv = { ...process.env }; const env = createEnv({ gatewayAuthToken: "managed-token", - openclawHome: "/var/aios/.openclaw", - openclawStateDir: "/var/aios/.openclaw", - openclawConfigPath: "/var/aios/.openclaw/openclaw.json", - openclawCliTmpDir: "/var/aios/.openclaw/tmp/cli" + openclawHome: "/var/daedalus-agent/.openclaw", + openclawStateDir: "/var/daedalus-agent/.openclaw", + openclawConfigPath: "/var/daedalus-agent/.openclaw/openclaw.json", + openclawCliTmpDir: "/var/daedalus-agent/.openclaw/tmp/cli" }); const cli = new MockCliRunner([{ rpc: { ok: true } }]); const doctor = new MockCliRunner(); @@ -217,12 +217,12 @@ test("gatewayStatus pins OpenClaw state to the managed runtime directory", async assert.deepEqual(status, { rpc: { ok: true } }); assert.deepEqual(cli.runJsonCalls, [["gateway", "status", "--json"]]); - assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_HOME, "/var/aios"); - assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_STATE_DIR, "/var/aios/.openclaw"); - assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_CONFIG_PATH, "/var/aios/.openclaw/openclaw.json"); + assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_HOME, "/var/daedalus-agent"); + assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_STATE_DIR, "/var/daedalus-agent/.openclaw"); + assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_CONFIG_PATH, "/var/daedalus-agent/.openclaw/openclaw.json"); assert.equal(cli.runJsonEnvs[0]?.OPENCLAW_GATEWAY_TOKEN, "managed-token"); - assert.equal(cli.runJsonEnvs[0]?.AIOS_OPENCLAW_GATEWAY_AUTH_TOKEN, "managed-token"); - assert.equal(cli.runJsonEnvs[0]?.AIOS_OPENCLAW_CLI_TMP_DIR, "/var/aios/.openclaw/tmp/cli"); + assert.equal(cli.runJsonEnvs[0]?.DA_OPENCLAW_GATEWAY_AUTH_TOKEN, "managed-token"); + assert.equal(cli.runJsonEnvs[0]?.DA_OPENCLAW_CLI_TMP_DIR, "/var/daedalus-agent/.openclaw/tmp/cli"); } finally { process.env = previousEnv; } @@ -230,22 +230,22 @@ test("gatewayStatus pins OpenClaw state to the managed runtime directory", async test("loadEnvironmentConfig requires agent topic templates", () => { const previousEnv = { ...process.env }; - process.env.AIOS_DATA_DIR = "/var/aios/data"; - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - process.env.AIOS_OPENCLAW_HOME = "/var/aios/.openclaw"; - process.env.AIOS_TMP_DIR = "/var/aios/tmp"; - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = "/var/aios/workspace-templates"; - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - delete process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE; - delete process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE; + process.env.DA_DATA_DIR = "/var/daedalus-agent/data"; + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + process.env.DA_OPENCLAW_HOME = "/var/daedalus-agent/.openclaw"; + process.env.DA_TMP_DIR = "/var/daedalus-agent/tmp"; + process.env.DA_WORKSPACE_TEMPLATES_DIR = "/var/daedalus-agent/workspace-templates"; + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + delete process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE; + delete process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE; try { assert.throws( () => loadEnvironmentConfig(), - /Missing required environment variable: AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE/ + /Missing required environment variable: DA_CHANNEL_INBOUND_TOPIC_TEMPLATE/ ); } finally { process.env = previousEnv; @@ -253,27 +253,27 @@ test("loadEnvironmentConfig requires agent topic templates", () => { }); test("renderTopic supports {agentId}", () => { - assert.equal(renderTopic("aios/agent/{agentId}/inbound", "lowcode"), "aios/agent/lowcode/inbound"); + assert.equal(renderTopic("daedalus-agent/agent/{agentId}/inbound", "lowcode"), "daedalus-agent/agent/lowcode/inbound"); }); test("loadEnvironmentConfig reads OpenClaw paths from explicit topology envs", async () => { const previousEnv = { ...process.env }; const runtimeRoot = await mkdtemp(path.join(tmpdir(), "agent-platform-management-console-oc-env-")); - process.env.AIOS_DATA_DIR = runtimeRoot; - process.env.AIOS_ONTOLOGY_DIR = path.join(runtimeRoot, "ontology-root"); - process.env.AIOS_OPENCLAW_HOME = path.join(runtimeRoot, ".openclaw"); - process.env.AIOS_TMP_DIR = path.join(runtimeRoot, "tmp"); - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = path.join(runtimeRoot, "workspace-templates"); - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_S3_ENDPOINT = "http://minio.internal:9000"; - process.env.AIOS_S3_REGION = "local"; - process.env.AIOS_S3_ACCESS_KEY_ID = "minio-access"; - process.env.AIOS_S3_SECRET_ACCESS_KEY = "minio-secret"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; + process.env.DA_DATA_DIR = runtimeRoot; + process.env.DA_ONTOLOGY_DIR = path.join(runtimeRoot, "ontology-root"); + process.env.DA_OPENCLAW_HOME = path.join(runtimeRoot, ".openclaw"); + process.env.DA_TMP_DIR = path.join(runtimeRoot, "tmp"); + process.env.DA_WORKSPACE_TEMPLATES_DIR = path.join(runtimeRoot, "workspace-templates"); + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_S3_ENDPOINT = "http://minio.internal:9000"; + process.env.DA_S3_REGION = "local"; + process.env.DA_S3_ACCESS_KEY_ID = "minio-access"; + process.env.DA_S3_SECRET_ACCESS_KEY = "minio-secret"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; try { const env = loadEnvironmentConfig(); @@ -281,7 +281,7 @@ test("loadEnvironmentConfig reads OpenClaw paths from explicit topology envs", a assert.equal(env.openclawStateDir, path.join(runtimeRoot, ".openclaw")); assert.equal(env.openclawConfigPath, path.join(runtimeRoot, ".openclaw", "openclaw.json")); assert.equal(env.tmpDir, path.join(runtimeRoot, "tmp")); - assert.equal(env.openclawCliTmpDir, "/tmp/aios-openclaw-cli"); + assert.equal(env.openclawCliTmpDir, "/tmp/daedalus-agent-openclaw-cli"); assert.equal(env.workspacesRoot, path.join(runtimeRoot, ".openclaw", "workspaces")); assert.equal(env.workspaceTemplatesRoot, path.join(runtimeRoot, "workspace-templates")); assert.equal(env.globalSkillsRoot, path.join(runtimeRoot, ".openclaw", "skills")); @@ -293,83 +293,83 @@ test("loadEnvironmentConfig reads OpenClaw paths from explicit topology envs", a test("loadEnvironmentConfig requires workspace and ontology paths", () => { const previousEnv = { ...process.env }; - delete process.env.AIOS_DATA_DIR; - delete process.env.AIOS_ONTOLOGY_DIR; - delete process.env.AIOS_OPENCLAW_HOME; - delete process.env.AIOS_TMP_DIR; - delete process.env.AIOS_WORKSPACE_TEMPLATES_DIR; - delete process.env.AIOS_RUN_MODE; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; + delete process.env.DA_DATA_DIR; + delete process.env.DA_ONTOLOGY_DIR; + delete process.env.DA_OPENCLAW_HOME; + delete process.env.DA_TMP_DIR; + delete process.env.DA_WORKSPACE_TEMPLATES_DIR; + delete process.env.DA_RUN_MODE; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; try { - assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: AIOS_DATA_DIR/); + assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: DA_DATA_DIR/); } finally { process.env = previousEnv; } }); -test("loadEnvironmentConfig requires AIOS_WORKSPACE_TEMPLATES_DIR", () => { +test("loadEnvironmentConfig requires DA_WORKSPACE_TEMPLATES_DIR", () => { const previousEnv = { ...process.env }; - process.env.AIOS_DATA_DIR = "/var/aios/data"; - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - process.env.AIOS_OPENCLAW_HOME = "/var/aios/.openclaw"; - process.env.AIOS_TMP_DIR = "/var/aios/tmp"; - delete process.env.AIOS_WORKSPACE_TEMPLATES_DIR; - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; + process.env.DA_DATA_DIR = "/var/daedalus-agent/data"; + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + process.env.DA_OPENCLAW_HOME = "/var/daedalus-agent/.openclaw"; + process.env.DA_TMP_DIR = "/var/daedalus-agent/tmp"; + delete process.env.DA_WORKSPACE_TEMPLATES_DIR; + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; try { - assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: AIOS_WORKSPACE_TEMPLATES_DIR/); + assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: DA_WORKSPACE_TEMPLATES_DIR/); } finally { process.env = previousEnv; } }); -test("loadEnvironmentConfig requires AIOS_OPENCLAW_HOME", () => { +test("loadEnvironmentConfig requires DA_OPENCLAW_HOME", () => { const previousEnv = { ...process.env }; - process.env.AIOS_DATA_DIR = "/var/aios/data"; - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - delete process.env.AIOS_OPENCLAW_HOME; - process.env.AIOS_TMP_DIR = "/var/aios/tmp"; - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = "/var/aios/workspace-templates"; - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; + process.env.DA_DATA_DIR = "/var/daedalus-agent/data"; + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + delete process.env.DA_OPENCLAW_HOME; + process.env.DA_TMP_DIR = "/var/daedalus-agent/tmp"; + process.env.DA_WORKSPACE_TEMPLATES_DIR = "/var/daedalus-agent/workspace-templates"; + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; try { - assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: AIOS_OPENCLAW_HOME/); + assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: DA_OPENCLAW_HOME/); } finally { process.env = previousEnv; } }); -test("loadEnvironmentConfig requires AIOS_TMP_DIR", () => { +test("loadEnvironmentConfig requires DA_TMP_DIR", () => { const previousEnv = { ...process.env }; - process.env.AIOS_DATA_DIR = path.join(tmpdir(), "oc-mgmt-runtime"); - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - process.env.AIOS_OPENCLAW_HOME = "/var/aios/.openclaw"; - delete process.env.AIOS_TMP_DIR; - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = "/var/aios/workspace-templates"; - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; + process.env.DA_DATA_DIR = path.join(tmpdir(), "oc-mgmt-runtime"); + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + process.env.DA_OPENCLAW_HOME = "/var/daedalus-agent/.openclaw"; + delete process.env.DA_TMP_DIR; + process.env.DA_WORKSPACE_TEMPLATES_DIR = "/var/daedalus-agent/workspace-templates"; + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; try { - assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: AIOS_TMP_DIR/); + assert.throws(() => loadEnvironmentConfig(), /Missing required environment variable: DA_TMP_DIR/); } finally { process.env = previousEnv; } @@ -377,47 +377,47 @@ test("loadEnvironmentConfig requires AIOS_TMP_DIR", () => { test("loadEnvironmentConfig rejects invalid MQTT broker URLs", () => { const previousEnv = { ...process.env }; - process.env.AIOS_DATA_DIR = path.join(tmpdir(), "oc-mgmt-runtime"); - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - process.env.AIOS_OPENCLAW_HOME = "/var/aios/.openclaw"; - process.env.AIOS_TMP_DIR = "/var/aios/tmp"; - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = "/var/aios/workspace-templates"; - process.env.AIOS_RUN_MODE = "container"; - process.env.AIOS_MQTT_CHANNEL_BROKER = "not-a-url"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; - process.env.AIOS_S3_ENDPOINT = "http://minio.internal:9000"; - process.env.AIOS_S3_REGION = "local"; - process.env.AIOS_S3_ACCESS_KEY_ID = "minio-access"; - process.env.AIOS_S3_SECRET_ACCESS_KEY = "minio-secret"; + process.env.DA_DATA_DIR = path.join(tmpdir(), "oc-mgmt-runtime"); + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + process.env.DA_OPENCLAW_HOME = "/var/daedalus-agent/.openclaw"; + process.env.DA_TMP_DIR = "/var/daedalus-agent/tmp"; + process.env.DA_WORKSPACE_TEMPLATES_DIR = "/var/daedalus-agent/workspace-templates"; + process.env.DA_RUN_MODE = "container"; + process.env.DA_MQTT_CHANNEL_BROKER = "not-a-url"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; + process.env.DA_S3_ENDPOINT = "http://minio.internal:9000"; + process.env.DA_S3_REGION = "local"; + process.env.DA_S3_ACCESS_KEY_ID = "minio-access"; + process.env.DA_S3_SECRET_ACCESS_KEY = "minio-secret"; try { - assert.throws(() => loadEnvironmentConfig(), /AIOS_MQTT_CHANNEL_BROKER must be a valid MQTT broker URL/); + assert.throws(() => loadEnvironmentConfig(), /DA_MQTT_CHANNEL_BROKER must be a valid MQTT broker URL/); } finally { process.env = previousEnv; } }); -test("loadEnvironmentConfig uses container mode without AIOS_RUN_MODE", async () => { +test("loadEnvironmentConfig uses container mode without DA_RUN_MODE", async () => { const previousEnv = { ...process.env }; const tempRoot = await mkdtemp(path.join(tmpdir(), "oc-mgmt-run-mode-container-")); - process.env.AIOS_DATA_DIR = tempRoot; - process.env.AIOS_ONTOLOGY_DIR = "/var/aios/ontology"; - process.env.AIOS_OPENCLAW_HOME = path.join(tempRoot, ".openclaw"); - process.env.AIOS_TMP_DIR = path.join(tempRoot, "tmp"); - process.env.AIOS_WORKSPACE_TEMPLATES_DIR = "/var/aios/workspace-templates"; - delete process.env.AIOS_RUN_MODE; - process.env.AIOS_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; - process.env.AIOS_MQTT_CHANNEL_USERNAME = "channel-user"; - process.env.AIOS_MQTT_CHANNEL_PASSWORD = "channel-pass"; - process.env.AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/inbound"; - process.env.AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "aios/agent/{agentId}/outbound"; - process.env.AIOS_S3_ENDPOINT = "http://minio.internal:9000"; - process.env.AIOS_S3_REGION = "local"; - process.env.AIOS_S3_ACCESS_KEY_ID = "minio-access"; - process.env.AIOS_S3_SECRET_ACCESS_KEY = "minio-secret"; + process.env.DA_DATA_DIR = tempRoot; + process.env.DA_ONTOLOGY_DIR = "/var/daedalus-agent/ontology"; + process.env.DA_OPENCLAW_HOME = path.join(tempRoot, ".openclaw"); + process.env.DA_TMP_DIR = path.join(tempRoot, "tmp"); + process.env.DA_WORKSPACE_TEMPLATES_DIR = "/var/daedalus-agent/workspace-templates"; + delete process.env.DA_RUN_MODE; + process.env.DA_MQTT_CHANNEL_BROKER = "mqtts://channel-broker:8883"; + process.env.DA_MQTT_CHANNEL_USERNAME = "channel-user"; + process.env.DA_MQTT_CHANNEL_PASSWORD = "channel-pass"; + process.env.DA_CHANNEL_INBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/inbound"; + process.env.DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE = "daedalus-agent/agent/{agentId}/outbound"; + process.env.DA_S3_ENDPOINT = "http://minio.internal:9000"; + process.env.DA_S3_REGION = "local"; + process.env.DA_S3_ACCESS_KEY_ID = "minio-access"; + process.env.DA_S3_SECRET_ACCESS_KEY = "minio-secret"; try { assert.equal(loadEnvironmentConfig().gatewayRestartMode, "container"); @@ -428,7 +428,7 @@ test("loadEnvironmentConfig uses container mode without AIOS_RUN_MODE", async () test("health report fails when action runtime is stopped or topic templates collide", () => { const env = createEnv({ - outboundTopicTemplate: "aios/agent/{agentId}/inbound" + outboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound" }); const configIssues = collectConfigIssues(env); @@ -577,8 +577,8 @@ test("listAgents returns requested display fields without security level", async id: "lowcode", accountId: "lowcode", workspace: "/var/platform_data/openclaw/workspaces/lowcode", - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: true, templateName: "sales-template", updatedAt: "2026-05-13T00:00:00.000Z" @@ -622,8 +622,8 @@ test("listAgents returns requested display fields without security level", async }, lastInteractionAt: null, lastInteractionUser: null, - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound" + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound" }]); assert.equal("securityLevel" in result.items[0]!, false); assert.equal("security-level" in result.items[0]!, false); @@ -640,8 +640,8 @@ test("listAgents includes managed agents missing from openclaw config", async () id: "managed-only", accountId: "managed-only", workspace: "/var/platform_data/openclaw/workspaces/managed-only", - inboundTopic: "aios/agent/managed-only/inbound", - outboundTopic: "aios/agent/managed-only/outbound", + inboundTopic: "daedalus-agent/agent/managed-only/inbound", + outboundTopic: "daedalus-agent/agent/managed-only/outbound", enabled: true, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -678,8 +678,8 @@ test("listAgents includes managed agents missing from openclaw config", async () }, lastInteractionAt: null, lastInteractionUser: null, - inboundTopic: "aios/agent/managed-only/inbound", - outboundTopic: "aios/agent/managed-only/outbound" + inboundTopic: "daedalus-agent/agent/managed-only/inbound", + outboundTopic: "daedalus-agent/agent/managed-only/outbound" }); }); @@ -704,11 +704,11 @@ test("createAgent issues the expected openclaw commands", async () => { await writeFile(path.join(salesTemplateDir, "AGENTS.md"), "# Sales template\n", "utf8"); await writeFile(path.join(salesTemplateDir, "USER.md"), "# Sales USER template\n", "utf8"); await writeFile(path.join(salesTemplateDir, "SOUL.md"), "# Sales SOUL template\n", "utf8"); - await writeFile(path.join(salesTemplateDir, ".aios-builtin.fingerprint"), "template-stamp\n", "utf8"); + await writeFile(path.join(salesTemplateDir, ".daedalus-agent-builtin.fingerprint"), "template-stamp\n", "utf8"); await mkdir(path.join(salesTemplateDir, "nested"), { recursive: true }); await writeFile(path.join(salesTemplateDir, "nested", "guide.md"), "nested\n", "utf8"); if (process.platform !== "win32") { - await chmod(path.join(salesTemplateDir, ".aios-builtin.fingerprint"), 0o000); + await chmod(path.join(salesTemplateDir, ".daedalus-agent-builtin.fingerprint"), 0o000); } const manager = new OpenClawManager( @@ -741,7 +741,7 @@ test("createAgent issues the expected openclaw commands", async () => { ]); const config = await readOpenClawConfig(configPath); - assert.equal(config.plugins?.entries?.["aios-mqtt-channel"]?.enabled, true); + assert.equal(config.plugins?.entries?.["daedalus-agent-mqtt-channel"]?.enabled, true); assert.equal(config.session?.dmScope, "per-channel-peer"); assert.deepEqual(config.agents?.list, [{ id: "lowcode", @@ -753,14 +753,14 @@ test("createAgent issues the expected openclaw commands", async () => { fallbacks: ["openai/gpt-5.4-mini"] } }]); - assert.deepEqual(config.channels?.["aios-mqtt-channel"]?.accounts?.lowcode, { + assert.deepEqual(config.channels?.["daedalus-agent-mqtt-channel"]?.accounts?.lowcode, { enabled: true, brokerUrl: "mqtts://channel-broker:8883", username: "channel-user", password: "channel-pass", topics: { - inbound: "aios/agent/lowcode/inbound", - outbound: "aios/agent/lowcode/outbound" + inbound: "daedalus-agent/agent/lowcode/inbound", + outbound: "daedalus-agent/agent/lowcode/outbound" }, qos: 1, disableBlockStreaming: false @@ -769,7 +769,7 @@ test("createAgent issues the expected openclaw commands", async () => { type: "route", agentId: "lowcode", match: { - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId: "lowcode" } }]); @@ -788,7 +788,7 @@ test("createAgent issues the expected openclaw commands", async () => { await assert.rejects(access(memoryRootPath), /ENOENT/); await assert.rejects(access(memoryDirPath), /ENOENT/); await assert.rejects( - access(path.join(root, "workspaces", "lowcode", ".aios-builtin.fingerprint")), + access(path.join(root, "workspaces", "lowcode", ".daedalus-agent-builtin.fingerprint")), /ENOENT/ ); if (process.platform !== "win32") { @@ -945,7 +945,7 @@ test("container-mode agent mutations edit openclaw.json without shelling out", a }] }, channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { lowcode: { enabled: false, @@ -953,8 +953,8 @@ test("container-mode agent mutations edit openclaw.json without shelling out", a username: "channel-user", password: "channel-pass", topics: { - inbound: "aios/agent/lowcode/inbound", - outbound: "aios/agent/lowcode/outbound" + inbound: "daedalus-agent/agent/lowcode/inbound", + outbound: "daedalus-agent/agent/lowcode/outbound" }, qos: 1, disableBlockStreaming: false @@ -968,8 +968,8 @@ test("container-mode agent mutations edit openclaw.json without shelling out", a id: "lowcode", accountId: "lowcode", workspace: path.join(root, "workspaces", "lowcode"), - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: false, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -1014,11 +1014,11 @@ test("container-mode agent mutations edit openclaw.json without shelling out", a const config = JSON.parse(await readFile(configPath, "utf8")) as { agents?: { list?: Array<{ id?: string }> }; - channels?: { "aios-mqtt-channel"?: { accounts?: Record } }; + channels?: { "daedalus-agent-mqtt-channel"?: { accounts?: Record } }; bindings?: Array<{ agentId?: string }>; }; assert.deepEqual(config.agents?.list, []); - assert.equal(config.channels?.["aios-mqtt-channel"]?.accounts?.lowcode, undefined); + assert.equal(config.channels?.["daedalus-agent-mqtt-channel"]?.accounts?.lowcode, undefined); assert.deepEqual(config.bindings, []); }); @@ -1031,8 +1031,8 @@ test("getAgent, setAgentName, setAgentModel, and updateAgentDocs follow the capa id: "lowcode", accountId: "lowcode", workspace, - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: true, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -1125,8 +1125,8 @@ test("setAgentModel restarts gateway by default", async () => { id: "lowcode", accountId: "lowcode", workspace, - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: true, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -1248,8 +1248,8 @@ test("enableAgent and disableAgent restart the gateway by default in host mode", id: "lowcode", accountId: "lowcode", workspace: path.join(root, "workspaces", "lowcode"), - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: false, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -1262,7 +1262,7 @@ test("enableAgent and disableAgent restart the gateway by default in host mode", }] }, channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { lowcode: { enabled: false @@ -1304,12 +1304,12 @@ test("enableAgent and disableAgent restart the gateway by default in host mode", assert.equal(cli.runCalls[0]?.options?.allowFailure, true); assert.equal(cli.runCalls[1]?.options?.allowFailure, true); const config = await readOpenClawConfig(configPath); - assert.equal(config.channels?.["aios-mqtt-channel"]?.accounts?.lowcode?.enabled, false); + assert.equal(config.channels?.["daedalus-agent-mqtt-channel"]?.accounts?.lowcode?.enabled, false); assert.deepEqual(config.bindings, [{ type: "route", agentId: "lowcode", match: { - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId: "lowcode" } }]); @@ -1326,8 +1326,8 @@ test("deleteAgent issues the expected openclaw commands", async () => { id: "lowcode", accountId: "lowcode", workspace, - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: true, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -1340,7 +1340,7 @@ test("deleteAgent issues the expected openclaw commands", async () => { }] }, channels: { - "aios-mqtt-channel": { + "daedalus-agent-mqtt-channel": { accounts: { lowcode: { enabled: true @@ -1352,7 +1352,7 @@ test("deleteAgent issues the expected openclaw commands", async () => { type: "route", agentId: "lowcode", match: { - channel: "aios-mqtt-channel", + channel: "daedalus-agent-mqtt-channel", accountId: "lowcode" } }] @@ -1373,7 +1373,7 @@ test("deleteAgent issues the expected openclaw commands", async () => { assert.deepEqual(cli.runCalls, []); const config = await readOpenClawConfig(configPath); assert.deepEqual(config.agents?.list, []); - assert.equal(config.channels?.["aios-mqtt-channel"]?.accounts?.lowcode, undefined); + assert.equal(config.channels?.["daedalus-agent-mqtt-channel"]?.accounts?.lowcode, undefined); assert.deepEqual(config.bindings, []); await assert.rejects(stat(workspace), /ENOENT/); const recycleRoot = path.join(root, "recyclebin", "workspace"); @@ -1390,7 +1390,7 @@ test("deleteAgent issues the expected openclaw commands", async () => { test("exportAgentWorkspace uploads the complete workspace to S3", async () => { const root = await mkdtemp(path.join(tmpdir(), "oc-mgmt-agent-export-")); const workspace = path.join(root, "workspaces", "lowcode"); - const senderRoot = path.join(workspace, "aios-management-web"); + const senderRoot = path.join(workspace, "daedalus-agent-management-web"); await mkdir(path.join(workspace, "skills", "planner"), { recursive: true }); await mkdir(path.join(workspace, ".learnings"), { recursive: true }); await mkdir(path.join(workspace, "memory"), { recursive: true }); @@ -1415,8 +1415,8 @@ test("exportAgentWorkspace uploads the complete workspace to S3", async () => { id: "lowcode", accountId: "lowcode", workspace, - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: true, templateName: "default", updatedAt: "2026-05-13T00:00:00.000Z" @@ -1465,8 +1465,8 @@ test("exportAgentWorkspace uploads the complete workspace to S3", async () => { "MEMORY.md", "SOUL.md", "TOOLS.md", - "aios-management-web/generated/report.md", - "aios-management-web/memory/2026-05-13.md", + "daedalus-agent-management-web/generated/report.md", + "daedalus-agent-management-web/memory/2026-05-13.md", "ignored.md", "knowledge/guide.md", "memory/2026-05-13.md", @@ -1477,7 +1477,7 @@ test("exportAgentWorkspace uploads the complete workspace to S3", async () => { assert.equal(zip.readAsText("memory/2026-05-13.md"), "# Daily memory\n"); assert.equal(zip.readAsText("knowledge/guide.md"), "# Guide\n"); assert.equal(zip.readAsText("ignored.md"), "# Ignore me\n"); - assert.equal(zip.readAsText("aios-management-web/memory/2026-05-13.md"), "# Sender daily memory\n"); + assert.equal(zip.readAsText("daedalus-agent-management-web/memory/2026-05-13.md"), "# Sender daily memory\n"); }); test("createTemplate preserves learning files from exported workspace zip", async () => { @@ -1697,7 +1697,7 @@ test("global skill install from local zip writes uploaded zip with private slug" } assert.deepEqual(JSON.parse(await readFile(path.join(installedDir, ".openclaw", "source-origin.json"), "utf8")), { version: 1, - source: "aios-management-upload", + source: "daedalus-agent-management-upload", spec: "s3://admin-in/skills/demo.zip", slug: "private-demo-skill" }); @@ -1859,10 +1859,10 @@ test("global skill install from local zip rejects seed symlink built-in slug col const stateStore = new ManagedStateStore(path.join(root, "managed-state.json")); const cli = new MockCliRunner(); const doctor = new MockCliRunner(); - const previousSeedSkillsRoot = process.env.AIOS_SEED_SKILLS_ROOT; + const previousSeedSkillsRoot = process.env.DA_SEED_SKILLS_ROOT; try { - process.env.AIOS_SEED_SKILLS_ROOT = seedSkillsRoot; + process.env.DA_SEED_SKILLS_ROOT = seedSkillsRoot; await mkdir(seedSkillDir, { recursive: true }); await mkdir(skillsRoot, { recursive: true }); await symlink(seedSkillDir, path.join(skillsRoot, "mcporter"), DIRECTORY_LINK_TYPE); @@ -1896,9 +1896,9 @@ test("global skill install from local zip rejects seed symlink built-in slug col assert.equal(cli.runCalls.length, 0); } finally { if (previousSeedSkillsRoot === undefined) { - delete process.env.AIOS_SEED_SKILLS_ROOT; + delete process.env.DA_SEED_SKILLS_ROOT; } else { - process.env.AIOS_SEED_SKILLS_ROOT = previousSeedSkillsRoot; + process.env.DA_SEED_SKILLS_ROOT = previousSeedSkillsRoot; } } }); @@ -1983,7 +1983,7 @@ test("listGlobalSkills reads origin and pin metadata from the global skills work }]); }); -test("listGlobalSkills marks built-in skills declared in AIOS_DATA_DIR", async () => { +test("listGlobalSkills marks built-in skills declared in DA_DATA_DIR", async () => { const root = await mkdtemp(path.join(tmpdir(), "oc-mgmt-skills-built-in-")); const skillsRoot = path.join(root, ".openclaw", "skills"); const stateStore = new ManagedStateStore(path.join(root, "managed-state.json")); @@ -2073,10 +2073,10 @@ test("listGlobalSkills includes symlinked seed built-in skills with OpenClaw loa const seedSkillsRoot = path.join(root, "seed", "skills"); const seedSkillDir = path.join(seedSkillsRoot, "mcporter"); const stateStore = new ManagedStateStore(path.join(root, "managed-state.json")); - const previousSeedSkillsRoot = process.env.AIOS_SEED_SKILLS_ROOT; + const previousSeedSkillsRoot = process.env.DA_SEED_SKILLS_ROOT; try { - process.env.AIOS_SEED_SKILLS_ROOT = seedSkillsRoot; + process.env.DA_SEED_SKILLS_ROOT = seedSkillsRoot; await mkdir(seedSkillDir, { recursive: true }); await mkdir(skillsRoot, { recursive: true }); await writeFile(path.join(seedSkillDir, "SKILL.md"), [ @@ -2129,14 +2129,14 @@ test("listGlobalSkills includes symlinked seed built-in skills with OpenClaw loa }); } finally { if (previousSeedSkillsRoot === undefined) { - delete process.env.AIOS_SEED_SKILLS_ROOT; + delete process.env.DA_SEED_SKILLS_ROOT; } else { - process.env.AIOS_SEED_SKILLS_ROOT = previousSeedSkillsRoot; + process.env.DA_SEED_SKILLS_ROOT = previousSeedSkillsRoot; } } }); -test("listGlobalSkills includes built-in skills declared in AIOS_DATA_DIR even when directories are missing", async () => { +test("listGlobalSkills includes built-in skills declared in DA_DATA_DIR even when directories are missing", async () => { const root = await mkdtemp(path.join(tmpdir(), "oc-mgmt-skills-built-in-missing-")); const skillsRoot = path.join(root, ".openclaw", "skills"); const stateStore = new ManagedStateStore(path.join(root, "managed-state.json")); @@ -2146,7 +2146,7 @@ test("listGlobalSkills includes built-in skills declared in AIOS_DATA_DIR even w "openclaw-version": "2026.05.22", "agent-template": ["default"], ontology: [], - skill: ["aios-call-app-service", "aios-transfer-file"], + skill: ["daedalus-agent-call-app-service", "daedalus-agent-transfer-file"], npm: [], pip: [] }, null, 2)}\n`, "utf8"); @@ -2175,8 +2175,8 @@ test("listGlobalSkills includes built-in skills declared in AIOS_DATA_DIR even w invalidReason: item.invalidReason, isBuiltIn: item["is-built-in"] })), [{ - slug: "aios-call-app-service", - path: path.join(skillsRoot, "aios-call-app-service"), + slug: "daedalus-agent-call-app-service", + path: path.join(skillsRoot, "daedalus-agent-call-app-service"), source: "missing-built-in", installed: false, pathExists: false, @@ -2185,8 +2185,8 @@ test("listGlobalSkills includes built-in skills declared in AIOS_DATA_DIR even w invalidReason: "built-in skill directory is not linked", isBuiltIn: true }, { - slug: "aios-transfer-file", - path: path.join(skillsRoot, "aios-transfer-file"), + slug: "daedalus-agent-transfer-file", + path: path.join(skillsRoot, "daedalus-agent-transfer-file"), source: "missing-built-in", installed: false, pathExists: false, diff --git a/packages/aios-management-web/server/management-test/run-jasmine.ts b/packages/daedalus-agent-management-web/server/management-test/run-jasmine.ts similarity index 100% rename from packages/aios-management-web/server/management-test/run-jasmine.ts rename to packages/daedalus-agent-management-web/server/management-test/run-jasmine.ts diff --git a/packages/aios-management-web/server/management-test/service-queue.test.ts b/packages/daedalus-agent-management-web/server/management-test/service-queue.test.ts similarity index 100% rename from packages/aios-management-web/server/management-test/service-queue.test.ts rename to packages/daedalus-agent-management-web/server/management-test/service-queue.test.ts diff --git a/packages/aios-management-web/server/management-test/setup.ts b/packages/daedalus-agent-management-web/server/management-test/setup.ts similarity index 100% rename from packages/aios-management-web/server/management-test/setup.ts rename to packages/daedalus-agent-management-web/server/management-test/setup.ts diff --git a/packages/aios-management-web/server/management-test/state-store.test.ts b/packages/daedalus-agent-management-web/server/management-test/state-store.test.ts similarity index 88% rename from packages/aios-management-web/server/management-test/state-store.test.ts rename to packages/daedalus-agent-management-web/server/management-test/state-store.test.ts index c37fbdbcca6120b72e3e4d9f32478daff62a428a..941f79df0d52198e8573c530f20a904603f52990 100644 --- a/packages/aios-management-web/server/management-test/state-store.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/state-store.test.ts @@ -13,8 +13,8 @@ test("ManagedStateStore upserts and removes agents", async () => { id: "lowcode", accountId: "lowcode", workspace: "/tmp/lowcode", - inboundTopic: "aios/agent/lowcode/inbound", - outboundTopic: "aios/agent/lowcode/outbound", + inboundTopic: "daedalus-agent/agent/lowcode/inbound", + outboundTopic: "daedalus-agent/agent/lowcode/outbound", enabled: true, updatedAt: "2026-05-13T00:00:00.000Z" }); diff --git a/packages/aios-management-web/server/management-test/template-manager.test.ts b/packages/daedalus-agent-management-web/server/management-test/template-manager.test.ts similarity index 95% rename from packages/aios-management-web/server/management-test/template-manager.test.ts rename to packages/daedalus-agent-management-web/server/management-test/template-manager.test.ts index fcdcc1df07031176b2d6b816486f174b8b8c4b45..73ad61abc74c3995aa3c3a8fcfc0ae8bd759c9e0 100644 --- a/packages/aios-management-web/server/management-test/template-manager.test.ts +++ b/packages/daedalus-agent-management-web/server/management-test/template-manager.test.ts @@ -37,8 +37,8 @@ function createEnv(overrides: Partial = {}): EnvironmentConfi managedMqttBrokerUrl: "mqtts://channel-broker:8883", managedMqttUsername: "channel-user", managedMqttPassword: "channel-pass", - inboundTopicTemplate: "aios/agent/{agentId}/inbound", - outboundTopicTemplate: "aios/agent/{agentId}/outbound", + inboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + outboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound", ...overrides }; } @@ -50,8 +50,8 @@ test("TemplateManager creates, lists, and deletes templates with agent usage", a id: "agent-a", accountId: "agent-a", workspace: path.join(root, "workspaces", "agent-a"), - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound", + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound", enabled: true, templateName: "sales", updatedAt: "2026-05-18T00:00:00.000Z" diff --git a/packages/aios-management-web/server/management-test/tsconfig.spec.json b/packages/daedalus-agent-management-web/server/management-test/tsconfig.spec.json similarity index 100% rename from packages/aios-management-web/server/management-test/tsconfig.spec.json rename to packages/daedalus-agent-management-web/server/management-test/tsconfig.spec.json diff --git a/packages/aios-management-web/server/src/api/middleware/auth.js b/packages/daedalus-agent-management-web/server/src/api/middleware/auth.js similarity index 100% rename from packages/aios-management-web/server/src/api/middleware/auth.js rename to packages/daedalus-agent-management-web/server/src/api/middleware/auth.js diff --git a/packages/aios-management-web/server/src/api/middleware/internal.js b/packages/daedalus-agent-management-web/server/src/api/middleware/internal.js similarity index 100% rename from packages/aios-management-web/server/src/api/middleware/internal.js rename to packages/daedalus-agent-management-web/server/src/api/middleware/internal.js diff --git a/packages/aios-management-web/server/src/api/routes/index.js b/packages/daedalus-agent-management-web/server/src/api/routes/index.js similarity index 97% rename from packages/aios-management-web/server/src/api/routes/index.js rename to packages/daedalus-agent-management-web/server/src/api/routes/index.js index fab60540c225276dd691656308db5734fcf11a7f..cbda22dba04ffda91e353e14880e5ba489355cc1 100644 --- a/packages/aios-management-web/server/src/api/routes/index.js +++ b/packages/daedalus-agent-management-web/server/src/api/routes/index.js @@ -26,10 +26,10 @@ const SYSTEM_LOG_TYPES = Object.freeze([ { value: "kernel", label: "内核启动日志" }, { value: "apps", label: "应用启动日志" }, { value: "openclaw", label: "网关日志" }, - { value: "aios-management-web", label: "管理控制台日志" }, - { value: "aios-apps-invoke-cli", label: "应用调用服务日志" }, - { value: "aios-mqtt-channel", label: "MQTT通讯日志" }, - { value: "aios-mqtt-channel-chat", label: "交互日志" } + { value: "daedalus-agent-management-web", label: "管理控制台日志" }, + { value: "daedalus-agent-apps-invoke-cli", label: "应用调用服务日志" }, + { value: "daedalus-agent-mqtt-channel", label: "MQTT通讯日志" }, + { value: "daedalus-agent-mqtt-channel-chat", label: "交互日志" } ]); const SYSTEM_LOG_TYPE_VALUES = new Set(SYSTEM_LOG_TYPES.map((item) => item.value)); @@ -699,37 +699,37 @@ export function createRoutes(services) { res.json(result); })); - router.get("/aios-users", asyncRoute(async (req, res) => { + router.get("/agent-users", asyncRoute(async (req, res) => { services.authService.assertAdmin(req.currentUser); const limit = Math.max(1, Math.min(200, Number(req.query.limit) || 50)); const page = Math.max(1, Number(req.query.page) || 1); const offset = (page - 1) * limit; const query = req.query.q || ""; res.json({ - items: services.agentService.listAiosUsersWithUsage(query, limit, offset), - total: services.agentService.countAiosUsers(query), + items: services.agentService.listAgentUsersWithUsage(query, limit, offset), + total: services.agentService.countAgentUsers(query), page, pageSize: limit }); })); - router.post("/aios-users", asyncRoute(async (req, res) => { + router.post("/agent-users", asyncRoute(async (req, res) => { services.authService.assertAdmin(req.currentUser); - const result = services.agentService.createAiosUser(req.body.username); + const result = services.agentService.createAgentUser(req.body.username); writeAuditLog(services, req, "新增数字员工平台用户", `新增数字员工平台用户:${result.username}`); res.status(201).json(result); })); - router.post("/aios-users/import", asyncRoute(async (req, res) => { + router.post("/agent-users/import", asyncRoute(async (req, res) => { services.authService.assertAdmin(req.currentUser); - const result = services.agentService.importAiosUsers(req.body.content); + const result = services.agentService.importAgentUsers(req.body.content); writeAuditLog(services, req, "批量导入数字员工平台用户", `批量导入数字员工平台用户:${result.total} 条`); res.json(result); })); - router.delete("/aios-users/:id", asyncRoute(async (req, res) => { + router.delete("/agent-users/:id", asyncRoute(async (req, res) => { services.authService.assertAdmin(req.currentUser); - const result = services.agentService.deleteAiosUser(Number(req.params.id)); + const result = services.agentService.deleteAgentUser(Number(req.params.id)); writeAuditLog(services, req, "删除数字员工平台用户", `删除数字员工平台用户:${result.username}`); res.json(result); })); @@ -928,7 +928,7 @@ export function createRoutes(services) { services, req, "保存 IP 白名单", - "更新 env.json 中的 AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST / AIOS_HUOZIGE_SERVER_IP" + "更新 env.json 中的 DA_INTERNAL_NETWORK_ALLOWLIST / DA_HUOZIGE_SERVER_IP" ); res.json(result); })); diff --git a/packages/aios-management-web/server/src/app.js b/packages/daedalus-agent-management-web/server/src/app.js similarity index 100% rename from packages/aios-management-web/server/src/app.js rename to packages/daedalus-agent-management-web/server/src/app.js diff --git a/packages/aios-management-web/server/src/background/index.js b/packages/daedalus-agent-management-web/server/src/background/index.js similarity index 100% rename from packages/aios-management-web/server/src/background/index.js rename to packages/daedalus-agent-management-web/server/src/background/index.js diff --git a/packages/aios-management-web/server/src/background/protocol.js b/packages/daedalus-agent-management-web/server/src/background/protocol.js similarity index 100% rename from packages/aios-management-web/server/src/background/protocol.js rename to packages/daedalus-agent-management-web/server/src/background/protocol.js diff --git a/packages/aios-management-web/server/src/config/env.js b/packages/daedalus-agent-management-web/server/src/config/env.js similarity index 35% rename from packages/aios-management-web/server/src/config/env.js rename to packages/daedalus-agent-management-web/server/src/config/env.js index d08e580e862b2c0c4690d699fe8cefae6d3816bd..23dcafe9f086c040e285354f10cd20b8dc35519e 100644 --- a/packages/aios-management-web/server/src/config/env.js +++ b/packages/daedalus-agent-management-web/server/src/config/env.js @@ -49,75 +49,75 @@ function readEnvNumber(name, fallback) { } export function loadEnv() { - const aiosRoot = readEnvValue("AIOS_ROOT", ""); - const defaultDataDir = aiosRoot - ? path.join(aiosRoot, "management", "data") + const productRoot = readEnvValue("DA_ROOT", ""); + const defaultDataDir = productRoot + ? path.join(productRoot, "management", "data") : path.join("data"); - const dataDir = path.resolve(readEnvValue("AIOS_WEB_DATA_DIR", defaultDataDir)); - const defaultAiosDataDir = aiosRoot - ? path.join(aiosRoot, "data") + const dataDir = path.resolve(readEnvValue("DA_WEB_DATA_DIR", defaultDataDir)); + const defaultDaedalusAgentDataDir = productRoot + ? path.join(productRoot, "data") : path.join("data"); - const aiosDataDir = path.resolve(readEnvValue("AIOS_DATA_DIR", defaultAiosDataDir)); - const defaultRunDir = aiosRoot - ? path.join(aiosRoot, "run") + const productDataDir = path.resolve(readEnvValue("DA_DATA_DIR", defaultDaedalusAgentDataDir)); + const defaultRunDir = productRoot + ? path.join(productRoot, "run") : path.join("run"); - const runDir = path.resolve(readEnvValue("AIOS_RUN_DIR", defaultRunDir)); - const defaultLogDir = aiosRoot - ? path.join(aiosRoot, "logs") + const runDir = path.resolve(readEnvValue("DA_RUN_DIR", defaultRunDir)); + const defaultLogDir = productRoot + ? path.join(productRoot, "logs") : path.join("logs"); - const logDir = path.resolve(readEnvValue("AIOS_LOG_DIR", defaultLogDir)); - const defaultUserEnvJsonPath = aiosRoot - ? path.join(aiosRoot, "env.json") + const logDir = path.resolve(readEnvValue("DA_LOG_DIR", defaultLogDir)); + const defaultUserEnvJsonPath = productRoot + ? path.join(productRoot, "env.json") : path.join("env.json"); - const defaultCredentialsJsonPath = aiosRoot - ? path.join(aiosRoot, "credentials.json") + const defaultCredentialsJsonPath = productRoot + ? path.join(productRoot, "credentials.json") : path.join("credentials.json"); - const defaultPort = readEnvNumber("AIOS_MANAGEMENT_CONSOLE_PORT", readEnvNumber("PORT", 3030)); + const defaultPort = readEnvNumber("DA_MANAGEMENT_CONSOLE_PORT", readEnvNumber("PORT", 3030)); return { - port: readEnvNumber("AIOS_WEB_PORT", defaultPort), + port: readEnvNumber("DA_WEB_PORT", defaultPort), dataDir, - aiosDataDir, + productDataDir, runDir, logDir, - userEnvJsonPath: path.resolve(readEnvValue("AIOS_USER_ENV_JSON", defaultUserEnvJsonPath)), - credentialsJsonPath: path.resolve(readEnvValue("AIOS_CREDENTIALS_JSON", defaultCredentialsJsonPath)), + userEnvJsonPath: path.resolve(readEnvValue("DA_USER_ENV_JSON", defaultUserEnvJsonPath)), + credentialsJsonPath: path.resolve(readEnvValue("DA_CREDENTIALS_JSON", defaultCredentialsJsonPath)), containerRestartRequestPath: path.resolve( - readEnvValue("AIOS_CONTAINER_RESTART_REQUEST_FILE", path.join(runDir, "container-restart.request")) + readEnvValue("DA_CONTAINER_RESTART_REQUEST_FILE", path.join(runDir, "container-restart.request")) ), - sessionTtlHours: Number(readEnvValue("AIOS_WEB_SESSION_TTL_HOURS", "12")), - managementTimeoutMs: readEnvNumber("AIOS_MANAGEMENT_WEBSITE_TIMEOUT", 120) * 1000, - startupSyncReadyTimeoutMs: readEnvNumber("AIOS_STARTUP_SYNC_READY_TIMEOUT_MS", 240000), - startupSyncPingTimeoutMs: readEnvNumber("AIOS_STARTUP_SYNC_PING_TIMEOUT_MS", 1000), - startupSyncPollIntervalMs: readEnvNumber("AIOS_STARTUP_SYNC_POLL_INTERVAL_MS", 10000), - systemStatusInitialDelayMs: readEnvNumber("AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS", 60000), - systemStatusRefreshIntervalMs: readEnvNumber("AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS", 60000), - systemStatusTimeoutMs: readEnvNumber("AIOS_SYSTEM_STATUS_TIMEOUT_MS", 5000), + sessionTtlHours: Number(readEnvValue("DA_WEB_SESSION_TTL_HOURS", "12")), + managementTimeoutMs: readEnvNumber("DA_MANAGEMENT_WEBSITE_TIMEOUT", 120) * 1000, + startupSyncReadyTimeoutMs: readEnvNumber("DA_STARTUP_SYNC_READY_TIMEOUT_MS", 240000), + startupSyncPingTimeoutMs: readEnvNumber("DA_STARTUP_SYNC_PING_TIMEOUT_MS", 1000), + startupSyncPollIntervalMs: readEnvNumber("DA_STARTUP_SYNC_POLL_INTERVAL_MS", 10000), + systemStatusInitialDelayMs: readEnvNumber("DA_SYSTEM_STATUS_INITIAL_DELAY_MS", 60000), + systemStatusRefreshIntervalMs: readEnvNumber("DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS", 60000), + systemStatusTimeoutMs: readEnvNumber("DA_SYSTEM_STATUS_TIMEOUT_MS", 5000), mqtt: { - brokerUrl: readEnvValue("AIOS_MQTT_CHANNEL_BROKER"), - username: readEnvValue("AIOS_MQTT_CHANNEL_USERNAME"), - password: readEnvValue("AIOS_MQTT_CHANNEL_PASSWORD"), - adminInboundTopic: readEnvValue("AIOS_ADMIN_INBOUND_TOPIC", "aios/admin/inbound"), - adminOutboundTopic: readEnvValue("AIOS_ADMIN_OUTBOUND_TOPIC", "aios/admin/outbound"), + brokerUrl: readEnvValue("DA_MQTT_CHANNEL_BROKER"), + username: readEnvValue("DA_MQTT_CHANNEL_USERNAME"), + password: readEnvValue("DA_MQTT_CHANNEL_PASSWORD"), + adminInboundTopic: readEnvValue("DA_ADMIN_INBOUND_TOPIC", "daedalus-agent/admin/inbound"), + adminOutboundTopic: readEnvValue("DA_ADMIN_OUTBOUND_TOPIC", "daedalus-agent/admin/outbound"), agentInboundTopicTemplate: readEnvValue( - "AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE", - "aios/agent/{agentId}/inbound" + "DA_CHANNEL_INBOUND_TOPIC_TEMPLATE", + "daedalus-agent/agent/{agentId}/inbound" ), agentOutboundTopicTemplate: readEnvValue( - "AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE", - "aios/agent/{agentId}/outbound" + "DA_CHANNEL_OUTBOUND_TOPIC_TEMPLATE", + "daedalus-agent/agent/{agentId}/outbound" ) }, s3: { - endpoint: readEnvValue("AIOS_S3_ENDPOINT"), - region: readEnvValue("AIOS_S3_REGION", "local"), - accessKeyId: readEnvValue("AIOS_S3_ACCESS_KEY_ID"), - secretAccessKey: readEnvValue("AIOS_S3_SECRET_ACCESS_KEY"), - forcePathStyle: readEnvBoolean("AIOS_S3_FORCE_PATH_STYLE", true), - adminInboxBucket: readEnvValue("AIOS_S3_ADMIN_INBOX_BUCKET"), - adminOutboxBucket: readEnvValue("AIOS_S3_ADMIN_OUTBOX_BUCKET"), - agentInboxBucket: readEnvValue("AIOS_S3_AGENT_INBOX_BUCKET"), - agentOutboxBucket: readEnvValue("AIOS_S3_AGENT_OUTBOX_BUCKET") + endpoint: readEnvValue("DA_S3_ENDPOINT"), + region: readEnvValue("DA_S3_REGION", "local"), + accessKeyId: readEnvValue("DA_S3_ACCESS_KEY_ID"), + secretAccessKey: readEnvValue("DA_S3_SECRET_ACCESS_KEY"), + forcePathStyle: readEnvBoolean("DA_S3_FORCE_PATH_STYLE", true), + adminInboxBucket: readEnvValue("DA_S3_ADMIN_INBOX_BUCKET"), + adminOutboxBucket: readEnvValue("DA_S3_ADMIN_OUTBOX_BUCKET"), + agentInboxBucket: readEnvValue("DA_S3_AGENT_INBOX_BUCKET"), + agentOutboxBucket: readEnvValue("DA_S3_AGENT_OUTBOX_BUCKET") } }; } diff --git a/packages/aios-management-web/server/src/db/index.js b/packages/daedalus-agent-management-web/server/src/db/index.js similarity index 83% rename from packages/aios-management-web/server/src/db/index.js rename to packages/daedalus-agent-management-web/server/src/db/index.js index 1a0d61aa62d9b12dcb58a26a5e1687a325ccbe1d..25fd6106cb8d82d79d002023bf89cac5675047e1 100644 --- a/packages/aios-management-web/server/src/db/index.js +++ b/packages/daedalus-agent-management-web/server/src/db/index.js @@ -8,14 +8,14 @@ import { loadEnv } from "../config/env.js"; import { hashPassword } from "../utils/security.js"; const env = loadEnv(); -const SCHEMA_VERSION = 9; +const SCHEMA_VERSION = 11; const DEFAULT_ACCESS_TOKEN = "sk-1234567890qwertyuiop"; -const DEFAULT_PORTAL_NAME = "数字员工控制台"; -const DEFAULT_BRAND_SUBTITLE = "Your Company Name"; -const DEFAULT_THEME_COLOR = "#07c160"; -const DEFAULT_ADMIN_USERNAME = "aios"; -const DEFAULT_ADMIN_DISPLAY_NAME = "数字员工平台管理员"; -const DEFAULT_ADMIN_PASSWORD = "123456"; +const DEFAULT_PORTAL_NAME = "智能体管理与运营平台"; +const DEFAULT_BRAND_SUBTITLE = "Your company's name here"; +const DEFAULT_THEME_COLOR = "#a5522d"; +const DEFAULT_ADMIN_USERNAME = "admin"; +const DEFAULT_ADMIN_DISPLAY_NAME = "管理员"; +const DEFAULT_ADMIN_PASSWORD = "admin"; if (!fs.existsSync(env.dataDir)) { fs.mkdirSync(env.dataDir, { recursive: true }); @@ -54,7 +54,7 @@ export function withTransaction(fn) { } } -const TRANSACTION_QUEUE = Symbol.for("aios.management.transactionQueue"); +const TRANSACTION_QUEUE = Symbol.for("daedalus-agent.management.transactionQueue"); export async function withSerializedTransaction(database, fn) { const previous = database[TRANSACTION_QUEUE] || Promise.resolve(); @@ -388,6 +388,112 @@ function migrateV8ToV9() { `); } +function migrateV9ToV10() { + db.exec(` + PRAGMA defer_foreign_keys = ON; + + CREATE TABLE users_v10 ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + role TEXT NOT NULL CHECK (role IN ('daedalus-admin')), + username TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL, + status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), + password_hash TEXT NOT NULL DEFAULT '', + must_change_password INTEGER NOT NULL DEFAULT 0, + is_builtin INTEGER NOT NULL DEFAULT 0, + tags_json TEXT NOT NULL DEFAULT '[]', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + INSERT INTO users_v10 ( + id, role, username, display_name, status, password_hash, + must_change_password, is_builtin, tags_json, created_at, updated_at + ) + SELECT + id, + 'daedalus-admin', + username, + display_name, + status, + password_hash, + must_change_password, + is_builtin, + tags_json, + created_at, + updated_at + FROM users; + + DROP TABLE users; + ALTER TABLE users_v10 RENAME TO users; + `); +} + +function migrateV10ToV11() { + const usersTable = db.prepare(` + SELECT sql + FROM sqlite_master + WHERE type = 'table' AND name = 'users' + `).get(); + + if (!String(usersTable?.sql || "").includes("'daedalus-admin'")) { + db.exec(` + PRAGMA defer_foreign_keys = ON; + + CREATE TABLE users_v11 ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + role TEXT NOT NULL CHECK (role IN ('daedalus-admin')), + username TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL, + status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), + password_hash TEXT NOT NULL DEFAULT '', + must_change_password INTEGER NOT NULL DEFAULT 0, + is_builtin INTEGER NOT NULL DEFAULT 0, + tags_json TEXT NOT NULL DEFAULT '[]', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + INSERT INTO users_v11 ( + id, role, username, display_name, status, password_hash, + must_change_password, is_builtin, tags_json, created_at, updated_at + ) + SELECT + id, + 'daedalus-admin', + username, + display_name, + status, + password_hash, + must_change_password, + is_builtin, + tags_json, + created_at, + updated_at + FROM users; + + DROP TABLE users; + ALTER TABLE users_v11 RENAME TO users; + `); + } + + db.prepare(` + UPDATE settings + SET portal_name = ?, + brand_subtitle = ?, + theme_color = ?, + logo_mime_type = '', + logo_data = NULL, + updated_at = ? + WHERE id = 1 + `).run( + DEFAULT_PORTAL_NAME, + DEFAULT_BRAND_SUBTITLE, + DEFAULT_THEME_COLOR, + toChinaISOString() + ); +} + function addAgentCreatorColumn() { if (!hasTable("agents")) { return; @@ -444,7 +550,7 @@ function createSchema() { CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, - role TEXT NOT NULL CHECK (role IN ('aios-admin')), + role TEXT NOT NULL CHECK (role IN ('daedalus-admin')), username TEXT NOT NULL UNIQUE, display_name TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), @@ -464,7 +570,7 @@ function createSchema() { FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); - CREATE TABLE aios_users ( + CREATE TABLE agent_users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL, @@ -497,12 +603,12 @@ function createSchema() { CREATE TABLE external_sessions ( session_id TEXT PRIMARY KEY, - aios_user_id INTEGER NOT NULL, + agent_user_id INTEGER NOT NULL, agent_id INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, - UNIQUE (aios_user_id, agent_id), - FOREIGN KEY (aios_user_id) REFERENCES aios_users(id) ON DELETE CASCADE, + UNIQUE (agent_user_id, agent_id), + FOREIGN KEY (agent_user_id) REFERENCES agent_users(id) ON DELETE CASCADE, FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE CASCADE ); @@ -569,10 +675,10 @@ function createSchema() { CREATE TABLE agent_permissions ( agent_id INTEGER NOT NULL, - aios_user_id INTEGER NOT NULL, - PRIMARY KEY (agent_id, aios_user_id), + agent_user_id INTEGER NOT NULL, + PRIMARY KEY (agent_id, agent_user_id), FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE CASCADE, - FOREIGN KEY (aios_user_id) REFERENCES aios_users(id) ON DELETE CASCADE + FOREIGN KEY (agent_user_id) REFERENCES agent_users(id) ON DELETE CASCADE ); CREATE TABLE business_systems ( @@ -666,7 +772,7 @@ function seed() { must_change_password, is_builtin, tags_json, created_at, updated_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `).run( - "aios-admin", + "daedalus-admin", DEFAULT_ADMIN_USERNAME, DEFAULT_ADMIN_DISPLAY_NAME, "active", @@ -729,13 +835,13 @@ function ensureCoreRows() { must_change_password, is_builtin, tags_json, created_at, updated_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(username) DO UPDATE SET - role = 'aios-admin', + role = 'daedalus-admin', display_name = COALESCE(NULLIF(users.display_name, ''), excluded.display_name), status = 'active', is_builtin = 1, updated_at = excluded.updated_at `).run( - "aios-admin", + "daedalus-admin", DEFAULT_ADMIN_USERNAME, DEFAULT_ADMIN_DISPLAY_NAME, "active", @@ -748,25 +854,6 @@ function ensureCoreRows() { ); } -function updateLegacyDefaultBranding() { - const now = toChinaISOString(); - - db.prepare(` - UPDATE settings - SET portal_name = ?, updated_at = ? - WHERE id = 1 - AND portal_name IN ('AIOS 管理控制台', 'AIOS Console') - `).run(DEFAULT_PORTAL_NAME, now); - - db.prepare(` - UPDATE users - SET display_name = ?, updated_at = ? - WHERE username = ? - AND is_builtin = 1 - AND display_name IN ('AIOS 管理员', 'AIOS Admin') - `).run(DEFAULT_ADMIN_DISPLAY_NAME, now, DEFAULT_ADMIN_USERNAME); -} - function migrate() { const version = currentSchemaVersion(); @@ -795,6 +882,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -823,6 +916,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -848,6 +947,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -870,6 +975,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -889,6 +1000,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -905,6 +1022,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -918,6 +1041,12 @@ function migrate() { if (SCHEMA_VERSION >= 9) { migrateV8ToV9(); } + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -928,6 +1057,35 @@ function migrate() { db.exec("BEGIN"); try { migrateV8ToV9(); + if (SCHEMA_VERSION >= 10) { + migrateV9ToV10(); + } + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } + setSchemaVersion(SCHEMA_VERSION); + db.exec("COMMIT"); + } catch (error) { + db.exec("ROLLBACK"); + throw error; + } + } else if (version === 9 && SCHEMA_VERSION >= 10) { + db.exec("BEGIN"); + try { + migrateV9ToV10(); + if (SCHEMA_VERSION >= 11) { + migrateV10ToV11(); + } + setSchemaVersion(SCHEMA_VERSION); + db.exec("COMMIT"); + } catch (error) { + db.exec("ROLLBACK"); + throw error; + } + } else if (version === 10 && SCHEMA_VERSION >= 11) { + db.exec("BEGIN"); + try { + migrateV10ToV11(); setSchemaVersion(SCHEMA_VERSION); db.exec("COMMIT"); } catch (error) { @@ -958,7 +1116,6 @@ function migrate() { migrateV8ToV9(); } ensureCoreRows(); - updateLegacyDefaultBranding(); } migrate(); diff --git a/packages/aios-management-web/server/src/infra/providers/hzg-provider-client.js b/packages/daedalus-agent-management-web/server/src/infra/providers/hzg-provider-client.js similarity index 100% rename from packages/aios-management-web/server/src/infra/providers/hzg-provider-client.js rename to packages/daedalus-agent-management-web/server/src/infra/providers/hzg-provider-client.js diff --git a/packages/aios-management-web/server/src/infra/s3/object-storage.js b/packages/daedalus-agent-management-web/server/src/infra/s3/object-storage.js similarity index 100% rename from packages/aios-management-web/server/src/infra/s3/object-storage.js rename to packages/daedalus-agent-management-web/server/src/infra/s3/object-storage.js diff --git a/packages/aios-management-web/server/src/management/management-action-client.js b/packages/daedalus-agent-management-web/server/src/management/management-action-client.js similarity index 100% rename from packages/aios-management-web/server/src/management/management-action-client.js rename to packages/daedalus-agent-management-web/server/src/management/management-action-client.js diff --git a/packages/aios-management-web/server/src/realtime/update-notifier.js b/packages/daedalus-agent-management-web/server/src/realtime/update-notifier.js similarity index 100% rename from packages/aios-management-web/server/src/realtime/update-notifier.js rename to packages/daedalus-agent-management-web/server/src/realtime/update-notifier.js diff --git a/packages/aios-management-web/server/src/services/agent-quota.js b/packages/daedalus-agent-management-web/server/src/services/agent-quota.js similarity index 100% rename from packages/aios-management-web/server/src/services/agent-quota.js rename to packages/daedalus-agent-management-web/server/src/services/agent-quota.js diff --git a/packages/aios-management-web/server/src/services/agent-service.js b/packages/daedalus-agent-management-web/server/src/services/agent-service.js similarity index 94% rename from packages/aios-management-web/server/src/services/agent-service.js rename to packages/daedalus-agent-management-web/server/src/services/agent-service.js index ceb58d3f9a81191780a41e1cb87fa7a3564ab68e..b8b4718596505e9a500e23167df6ee6a5edfebde 100644 --- a/packages/aios-management-web/server/src/services/agent-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/agent-service.js @@ -374,7 +374,7 @@ export class AgentService { return this.db.prepare(` SELECT d.id, d.username FROM agent_permissions ap - JOIN aios_users d ON d.id = ap.aios_user_id + JOIN agent_users d ON d.id = ap.agent_user_id WHERE ap.agent_id = ? ORDER BY d.username `).all(agentId); @@ -467,7 +467,7 @@ export class AgentService { SELECT ag.* FROM agents ag JOIN agent_permissions ap ON ap.agent_id = ag.id - JOIN aios_users d ON d.id = ap.aios_user_id + JOIN agent_users d ON d.id = ap.agent_user_id WHERE d.username = ? ORDER BY ag.slug `).all(normalizedUsername); @@ -487,26 +487,26 @@ export class AgentService { replacePermissions(agentId, usernames) { this.db.prepare("DELETE FROM agent_permissions WHERE agent_id = ?").run(agentId); - this.ensureAiosUsers(usernames); + this.ensureAgentUsers(usernames); const insert = this.db.prepare(` - INSERT INTO agent_permissions (agent_id, aios_user_id) + INSERT INTO agent_permissions (agent_id, agent_user_id) VALUES (?, ?) `); for (const username of usernames) { - const aiosUser = this.db.prepare(` + const agentUser = this.db.prepare(` SELECT id - FROM aios_users + FROM agent_users WHERE username = ? `).get(username); - if (aiosUser) { - insert.run(agentId, aiosUser.id); + if (agentUser) { + insert.run(agentId, agentUser.id); } } } - ensureAiosUsers(usernames) { + ensureAgentUsers(usernames) { const insert = this.db.prepare(` - INSERT INTO aios_users (username, created_at, updated_at) + INSERT INTO agent_users (username, created_at, updated_at) VALUES (?, ?, ?) ON CONFLICT(username) DO UPDATE SET updated_at = excluded.updated_at @@ -517,13 +517,13 @@ export class AgentService { } } - listAiosUsers(query = "", limit = 20) { + listAgentUsers(query = "", limit = 20) { const normalizedQuery = String(query || "").trim(); const safeLimit = Math.max(1, Math.min(50, Number(limit) || 20)); if (!normalizedQuery) { return this.db.prepare(` SELECT id, username - FROM aios_users + FROM agent_users ORDER BY updated_at DESC, username ASC LIMIT ? `).all(safeLimit); @@ -531,7 +531,7 @@ export class AgentService { return this.db.prepare(` SELECT id, username - FROM aios_users + FROM agent_users WHERE username LIKE ? ORDER BY CASE WHEN username = ? THEN 0 ELSE 1 END, @@ -542,59 +542,59 @@ export class AgentService { `).all(`%${normalizedQuery}%`, normalizedQuery, `${normalizedQuery}%`, safeLimit); } - getAiosUserUsageCount(aiosUserId) { + getAgentUserUsageCount(agentUserId) { const row = this.db.prepare(` SELECT COUNT(*) AS count FROM agent_permissions - WHERE aios_user_id = ? - `).get(aiosUserId); + WHERE agent_user_id = ? + `).get(agentUserId); return Number(row?.count || 0); } - getAiosUserAssignedAgents(aiosUserId) { + getAgentUserAssignedAgents(agentUserId) { return this.db.prepare(` SELECT ag.id, ag.slug, ag.agent_name FROM agent_permissions ap JOIN agents ag ON ag.id = ap.agent_id - WHERE ap.aios_user_id = ? + WHERE ap.agent_user_id = ? ORDER BY ag.slug - `).all(aiosUserId).map((item) => ({ + `).all(agentUserId).map((item) => ({ id: item.id, slug: item.slug, agent_name: item.agent_name })); } - countAiosUsers(query = "") { + countAgentUsers(query = "") { const normalizedQuery = String(query || "").trim(); if (!normalizedQuery) { return Number(this.db.prepare(` SELECT COUNT(*) AS count - FROM aios_users + FROM agent_users `).get()?.count || 0); } return Number(this.db.prepare(` SELECT COUNT(*) AS count - FROM aios_users + FROM agent_users WHERE username LIKE ? `).get(`%${normalizedQuery}%`)?.count || 0); } - listAiosUsersWithUsage(query = "", limit = 50, offset = 0) { + listAgentUsersWithUsage(query = "", limit = 50, offset = 0) { const normalizedQuery = String(query || "").trim(); const safeLimit = Math.max(1, Math.min(200, Number(limit) || 50)); const safeOffset = Math.max(0, Number(offset) || 0); const rows = !normalizedQuery ? this.db.prepare(` SELECT id, username - FROM aios_users + FROM agent_users ORDER BY updated_at DESC, username ASC LIMIT ? OFFSET ? `).all(safeLimit, safeOffset) : this.db.prepare(` SELECT id, username - FROM aios_users + FROM agent_users WHERE username LIKE ? ORDER BY CASE WHEN username = ? THEN 0 ELSE 1 END, @@ -606,32 +606,32 @@ export class AgentService { return rows.map((item) => ({ ...item, - assigned_agents: this.getAiosUserUsageCount(item.id), - assigned_agent_items: this.getAiosUserAssignedAgents(item.id) + assigned_agents: this.getAgentUserUsageCount(item.id), + assigned_agent_items: this.getAgentUserAssignedAgents(item.id) })); } - createAiosUser(username) { + createAgentUser(username) { const normalizedUsername = String(username || "").trim(); if (!normalizedUsername) { throw badRequest("用户名不能为空"); } - this.ensureAiosUsers([normalizedUsername]); + this.ensureAgentUsers([normalizedUsername]); const row = this.db.prepare(` SELECT id, username - FROM aios_users + FROM agent_users WHERE username = ? `).get(normalizedUsername); return { ...row, - assigned_agents: row ? this.getAiosUserUsageCount(row.id) : 0, - assigned_agent_items: row ? this.getAiosUserAssignedAgents(row.id) : [] + assigned_agents: row ? this.getAgentUserUsageCount(row.id) : 0, + assigned_agent_items: row ? this.getAgentUserAssignedAgents(row.id) : [] }; } - importAiosUsers(content) { + importAgentUsers(content) { const usernames = [...new Set( String(content || "") .split(/\r?\n/) @@ -643,8 +643,8 @@ export class AgentService { throw badRequest("请至少输入一个用户名"); } - const existing = new Set(this.listAiosUsers("", 100000).map((item) => item.username)); - this.ensureAiosUsers(usernames); + const existing = new Set(this.listAgentUsers("", 100000).map((item) => item.username)); + this.ensureAgentUsers(usernames); return { total: usernames.length, @@ -656,22 +656,22 @@ export class AgentService { }; } - deleteAiosUser(aiosUserId) { + deleteAgentUser(agentUserId) { const current = this.db.prepare(` SELECT id, username - FROM aios_users + FROM agent_users WHERE id = ? - `).get(aiosUserId); + `).get(agentUserId); if (!current) { throw notFound("数字员工平台用户不存在"); } - const usageCount = this.getAiosUserUsageCount(aiosUserId); + const usageCount = this.getAgentUserUsageCount(agentUserId); if (usageCount > 0) { throw conflict("该用户名仍已分配给数字员工,无法删除"); } - this.db.prepare("DELETE FROM aios_users WHERE id = ?").run(aiosUserId); + this.db.prepare("DELETE FROM agent_users WHERE id = ?").run(agentUserId); return { ok: true, username: current.username }; } diff --git a/packages/aios-management-web/server/src/services/audit-log-service.js b/packages/daedalus-agent-management-web/server/src/services/audit-log-service.js similarity index 100% rename from packages/aios-management-web/server/src/services/audit-log-service.js rename to packages/daedalus-agent-management-web/server/src/services/audit-log-service.js diff --git a/packages/aios-management-web/server/src/services/auth-service.js b/packages/daedalus-agent-management-web/server/src/services/auth-service.js similarity index 97% rename from packages/aios-management-web/server/src/services/auth-service.js rename to packages/daedalus-agent-management-web/server/src/services/auth-service.js index 28ec43ad8b3051708bf4fa53f2ab9496fdc43577..b9e93e5f526a61fd713d3041089626721cc969d7 100644 --- a/packages/aios-management-web/server/src/services/auth-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/auth-service.js @@ -3,7 +3,7 @@ import { badRequest, conflict, forbidden, notFound, unauthorized } from "../util import { hashPassword, newToken, verifyPassword } from "../utils/security.js"; import { toChinaISOString } from "../utils/china-time.js"; -const ADMIN_ROLE = "aios-admin"; +const ADMIN_ROLE = "daedalus-admin"; export class AuthService { constructor({ db, env }) { @@ -32,7 +32,7 @@ export class AuthService { const row = this.db.prepare(` SELECT * FROM users - WHERE username = 'aios' + WHERE username = 'admin' ORDER BY id LIMIT 1 `).get(); @@ -139,7 +139,7 @@ export class AuthService { if (!row) { throw notFound("用户不存在"); } - if (row.is_builtin || row.username === "aios") { + if (row.is_builtin || row.username === "admin") { throw conflict("默认数字员工平台管理员不支持重置密码"); } diff --git a/packages/aios-management-web/server/src/services/catalog-sync-service.js b/packages/daedalus-agent-management-web/server/src/services/catalog-sync-service.js similarity index 100% rename from packages/aios-management-web/server/src/services/catalog-sync-service.js rename to packages/daedalus-agent-management-web/server/src/services/catalog-sync-service.js diff --git a/packages/aios-management-web/server/src/services/container-service.js b/packages/daedalus-agent-management-web/server/src/services/container-service.js similarity index 100% rename from packages/aios-management-web/server/src/services/container-service.js rename to packages/daedalus-agent-management-web/server/src/services/container-service.js diff --git a/packages/aios-management-web/server/src/services/external-service.js b/packages/daedalus-agent-management-web/server/src/services/external-service.js similarity index 95% rename from packages/aios-management-web/server/src/services/external-service.js rename to packages/daedalus-agent-management-web/server/src/services/external-service.js index c04d95cae03d04c88b3a837665ada8a9344e4ad0..f5aa38b51c3051126e58a026e98abd0631d8f6eb 100644 --- a/packages/aios-management-web/server/src/services/external-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/external-service.js @@ -148,19 +148,19 @@ export class ExternalService { const hasPermission = this.db.prepare(` SELECT 1 FROM agent_permissions ap - JOIN aios_users d ON d.id = ap.aios_user_id + JOIN agent_users d ON d.id = ap.agent_user_id WHERE ap.agent_id = ? AND d.username = ? `).get(agent.id, normalizedUserName); if (!hasPermission) { throw notFound(`用户 ${normalizedUserName} 无权访问数字员工 ${normalizedAgentId}`); } - const aiosUser = this.db.prepare(` + const agentUser = this.db.prepare(` SELECT id - FROM aios_users + FROM agent_users WHERE username = ? `).get(normalizedUserName); - if (!aiosUser) { + if (!agentUser) { throw notFound(`用户 ${normalizedUserName} 无权访问数字员工 ${normalizedAgentId}`); } @@ -168,8 +168,8 @@ export class ExternalService { const existing = this.db.prepare(` SELECT session_id FROM external_sessions - WHERE aios_user_id = ? AND agent_id = ? - `).get(aiosUser.id, agent.id); + WHERE agent_user_id = ? AND agent_id = ? + `).get(agentUser.id, agent.id); if (existing?.session_id) { if (normalizedCookie) { this.upsertSessionCookie(existing.session_id, normalizedCookie); @@ -185,9 +185,9 @@ export class ExternalService { const now = toChinaISOString(); this.db.prepare(` INSERT INTO external_sessions ( - session_id, aios_user_id, agent_id, created_at, updated_at + session_id, agent_user_id, agent_id, created_at, updated_at ) VALUES (?, ?, ?, ?, ?) - `).run(sessionId, aiosUser.id, agent.id, now, now); + `).run(sessionId, agentUser.id, agent.id, now, now); if (normalizedCookie) { this.upsertSessionCookie(sessionId, normalizedCookie); @@ -267,7 +267,7 @@ export class ExternalService { ag.agent_name, ag.remote_state_json FROM external_sessions es - JOIN aios_users d ON d.id = es.aios_user_id + JOIN agent_users d ON d.id = es.agent_user_id JOIN agents ag ON ag.id = es.agent_id WHERE es.session_id = ? `).get(normalizedSessionId); @@ -299,7 +299,7 @@ export class ExternalService { d.username AS user_name, ag.slug AS agent_slug FROM external_sessions es - JOIN aios_users d ON d.id = es.aios_user_id + JOIN agent_users d ON d.id = es.agent_user_id JOIN agents ag ON ag.id = es.agent_id WHERE es.session_id = ? `).get(sessionId); diff --git a/packages/aios-management-web/server/src/services/large-language-model-service.js b/packages/daedalus-agent-management-web/server/src/services/large-language-model-service.js similarity index 100% rename from packages/aios-management-web/server/src/services/large-language-model-service.js rename to packages/daedalus-agent-management-web/server/src/services/large-language-model-service.js diff --git a/packages/aios-management-web/server/src/services/portal-service.js b/packages/daedalus-agent-management-web/server/src/services/portal-service.js similarity index 94% rename from packages/aios-management-web/server/src/services/portal-service.js rename to packages/daedalus-agent-management-web/server/src/services/portal-service.js index 097777a09e4fff3644da0fbb8d1acac7291085bb..865ec8325cb47d5bb79d671cb3040bfec97c1298 100644 --- a/packages/aios-management-web/server/src/services/portal-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/portal-service.js @@ -22,7 +22,7 @@ const LOGO_MIME_TYPES = new Map([ const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", ".."); const APPS_ROOT = path.resolve(PACKAGE_ROOT, ".."); const REPO_ROOT = path.resolve(PACKAGE_ROOT, "..", ".."); -const DEFAULT_APPS_HOME = "/opt/aios-apps"; +const DEFAULT_APPS_HOME = "/opt/daedalus-agent-apps"; function packageJsonInDir(dirPath) { return dirPath ? path.join(dirPath, "package.json") : ""; @@ -44,29 +44,29 @@ function localVersionComponents() { return [ { group: "runtime", - fallbackName: "aios-management-web", + fallbackName: "daedalus-agent-management-web", packagePaths: [ - firstText(process.env.AIOS_WEB_PACKAGE_JSON), - packageJsonInDir(firstText(process.env.AIOS_WEB_HOME)), + firstText(process.env.DA_WEB_PACKAGE_JSON), + packageJsonInDir(firstText(process.env.DA_WEB_HOME)), packageJsonInDir(PACKAGE_ROOT), - path.join(REPO_ROOT, "packages", "aios-management-web", "package.json"), - packageJsonInNodeModules(APPS_ROOT, "aios-management-web") + path.join(REPO_ROOT, "packages", "daedalus-agent-management-web", "package.json"), + packageJsonInNodeModules(APPS_ROOT, "daedalus-agent-management-web") ] }, { group: "runtime", - fallbackName: "aios-apps-invoke-cli", + fallbackName: "daedalus-agent-apps-invoke-cli", packagePaths: [ - firstText(process.env.AIOS_APPS_INVOKE_CLI_PACKAGE_JSON, process.env.AIOS_INVOKE_CLI_PACKAGE_JSON), - packageJsonInDir(firstText(process.env.AIOS_INVOKE_CLI_HOME)), - packageJsonInChildDir(firstText(process.env.AIOS_APPS_HOME), "aios-apps-invoke-cli"), - packageJsonInDir(path.join(APPS_ROOT, "aios-apps-invoke-cli")), - packageJsonInDir(path.join(DEFAULT_APPS_HOME, "aios-apps-invoke-cli")), - globalPackageJson(firstText(process.env.AIOS_TOOLCHAIN_DIR), "aios-apps-invoke-cli"), - globalPackageJson("/opt/aios-toolchain", "aios-apps-invoke-cli"), - path.join(REPO_ROOT, "packages", "aios-apps-invoke-cli", "package.json"), - packageJsonInNodeModules(PACKAGE_ROOT, "aios-apps-invoke-cli"), - packageJsonInNodeModules(APPS_ROOT, "aios-apps-invoke-cli") + firstText(process.env.DA_APPS_INVOKE_CLI_PACKAGE_JSON, process.env.DA_INVOKE_CLI_PACKAGE_JSON), + packageJsonInDir(firstText(process.env.DA_INVOKE_CLI_HOME)), + packageJsonInChildDir(firstText(process.env.DA_APPS_HOME), "daedalus-agent-apps-invoke-cli"), + packageJsonInDir(path.join(APPS_ROOT, "daedalus-agent-apps-invoke-cli")), + packageJsonInDir(path.join(DEFAULT_APPS_HOME, "daedalus-agent-apps-invoke-cli")), + globalPackageJson(firstText(process.env.DA_TOOLCHAIN_DIR), "daedalus-agent-apps-invoke-cli"), + globalPackageJson("/opt/daedalus-agent-toolchain", "daedalus-agent-apps-invoke-cli"), + path.join(REPO_ROOT, "packages", "daedalus-agent-apps-invoke-cli", "package.json"), + packageJsonInNodeModules(PACKAGE_ROOT, "daedalus-agent-apps-invoke-cli"), + packageJsonInNodeModules(APPS_ROOT, "daedalus-agent-apps-invoke-cli") ] } ]; @@ -419,8 +419,8 @@ export class PortalService { name: component.displayName || metadata.name, package_name: metadata.name, version: metadata.version, - status: metadata.name === "aios-management-web" ? "normal" : "unknown", - status_message: metadata.name === "aios-management-web" ? "管理控制台正常" : "状态未采集" + status: metadata.name === "daedalus-agent-management-web" ? "normal" : "unknown", + status_message: metadata.name === "daedalus-agent-management-web" ? "管理控制台正常" : "状态未采集" }, component.group); }); } @@ -644,7 +644,7 @@ export class PortalService { } assertUserEditable(row) { - if (row.is_builtin || row.username === "aios") { + if (row.is_builtin || row.username === "admin") { throw conflict("默认管理员不支持编辑"); } } @@ -654,7 +654,7 @@ export class PortalService { throw badRequest("缺少必要字段:用户名、显示名或角色"); } - const passwordHash = payload.role === "aios-admin" ? hashPassword(payload.password || "123456") : ""; + const passwordHash = payload.role === "daedalus-admin" ? hashPassword(payload.password || "123456") : ""; const now = toChinaISOString(); const result = this.db.prepare(` INSERT INTO users ( @@ -667,7 +667,7 @@ export class PortalService { payload.display_name, normalizeUserStatus(payload.status), passwordHash, - payload.role === "aios-admin" ? 1 : 0, + payload.role === "daedalus-admin" ? 1 : 0, 0, jsonStringify(payload.tags), now, @@ -716,7 +716,7 @@ export class PortalService { throw conflict("不允许删除当前登录用户"); } - if (current.is_builtin || current.username === "aios") { + if (current.is_builtin || current.username === "admin") { throw conflict("默认管理员不支持删除"); } @@ -932,7 +932,10 @@ export class PortalService { LEFT JOIN artifacts a ON a.id = s.artifact_id LEFT JOIN users u ON u.id = a.created_by ORDER BY - CASE WHEN lower(s.slug) LIKE 'aios-%' THEN 0 ELSE 1 END, + CASE + WHEN lower(s.slug) LIKE 'daedalus-agent-%' OR lower(s.slug) LIKE 'daedalus-agent-%' THEN 0 + ELSE 1 + END, lower(s.slug) ASC `).all().map((row) => ({ ...row, diff --git a/packages/aios-management-web/server/src/services/runtime-component-health-service.js b/packages/daedalus-agent-management-web/server/src/services/runtime-component-health-service.js similarity index 98% rename from packages/aios-management-web/server/src/services/runtime-component-health-service.js rename to packages/daedalus-agent-management-web/server/src/services/runtime-component-health-service.js index c16bc01099b210c1483fdff8d8aeb45a6d98177a..c5d8167c04d14fb1ff86ca20f0cd2b115507bf15 100644 --- a/packages/aios-management-web/server/src/services/runtime-component-health-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/runtime-component-health-service.js @@ -131,7 +131,7 @@ export class RuntimeComponentHealthService { try { const connect = this.mqttFactory.connect || this.mqttFactory; client = connect(brokerUrl, { - clientId: `aios-web-health-${Math.random().toString(36).slice(2, 10)}`, + clientId: `daedalus-agent-web-health-${Math.random().toString(36).slice(2, 10)}`, username: firstText(this.env?.mqtt?.username) || undefined, password: firstText(this.env?.mqtt?.password) || undefined, clean: true, diff --git a/packages/aios-management-web/server/src/services/runtime-env-config-service.js b/packages/daedalus-agent-management-web/server/src/services/runtime-env-config-service.js similarity index 97% rename from packages/aios-management-web/server/src/services/runtime-env-config-service.js rename to packages/daedalus-agent-management-web/server/src/services/runtime-env-config-service.js index 66fb46dc3424a92faf27e741380254e9c0e31928..c3a029213dff5733e51bc8511f831ac8f310ae40 100644 --- a/packages/aios-management-web/server/src/services/runtime-env-config-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/runtime-env-config-service.js @@ -3,8 +3,8 @@ import path from "node:path"; import { badRequest } from "../utils/errors.js"; -export const AGENT_INTERNAL_NETWORK_ALLOWLIST_KEY = "AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST"; -export const HUOZIGE_SERVER_IP_KEY = "AIOS_HUOZIGE_SERVER_IP"; +export const AGENT_INTERNAL_NETWORK_ALLOWLIST_KEY = "DA_INTERNAL_NETWORK_ALLOWLIST"; +export const HUOZIGE_SERVER_IP_KEY = "DA_HUOZIGE_SERVER_IP"; function firstText(...values) { for (const value of values) { diff --git a/packages/aios-management-web/server/src/services/system-service.js b/packages/daedalus-agent-management-web/server/src/services/system-service.js similarity index 98% rename from packages/aios-management-web/server/src/services/system-service.js rename to packages/daedalus-agent-management-web/server/src/services/system-service.js index fa91ba9c0399a2ec3342324426ea5e783dabca09..da78f59eea21dd5a22702ae258f7b7b5351548c6 100644 --- a/packages/aios-management-web/server/src/services/system-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/system-service.js @@ -14,7 +14,7 @@ const PAYLOAD_PREVIEW_MAX_STRING_LENGTH = 512; const PAYLOAD_PREVIEW_MAX_ARRAY_ITEMS = 20; const PAYLOAD_PREVIEW_MAX_OBJECT_KEYS = 50; const PAYLOAD_PREVIEW_MAX_DEPTH = 6; -const INVOCATION_ARTIFACT_BUCKET = "aios-data"; +const INVOCATION_ARTIFACT_BUCKET = "daedalus-agent-data"; function normalizeText(value) { return String(value || "").trim(); @@ -199,7 +199,7 @@ export class SystemService { this.objectStorage = objectStorage; this.managementClient = managementClient; this.runtimeEnvConfigService = runtimeEnvConfigService; - this.aiosDataDir = path.resolve(env.aiosDataDir || process.env.AIOS_DATA_DIR || "data"); + this.productDataDir = path.resolve(env.productDataDir || process.env.DA_DATA_DIR || "data"); } getConfiguredHuozigeServerIp() { @@ -609,7 +609,7 @@ export class SystemService { const timestamp = compactChinaTimestamp(createdAt); const systemName = normalizeFileSegment(applicationName, "unknown-system"); const relativeDir = path.posix.join("logs", "invoke", dateKey); - const absoluteDir = path.join(this.aiosDataDir, "logs", "invoke", dateKey); + const absoluteDir = path.join(this.productDataDir, "logs", "invoke", dateKey); await fs.mkdir(absoluteDir, { recursive: true }); for (let index = 0; index < 5; index += 1) { @@ -633,7 +633,7 @@ export class SystemService { } resolveInvocationArtifactFilePath(objectKey) { - const rootPath = path.resolve(this.aiosDataDir); + const rootPath = path.resolve(this.productDataDir); const segments = normalizeText(objectKey).split(/[\\/]+/).filter(Boolean); const filePath = path.resolve(rootPath, ...segments); if (!isPathInside(rootPath, filePath)) { diff --git a/packages/aios-management-web/server/src/services/topic-ping-service.js b/packages/daedalus-agent-management-web/server/src/services/topic-ping-service.js similarity index 98% rename from packages/aios-management-web/server/src/services/topic-ping-service.js rename to packages/daedalus-agent-management-web/server/src/services/topic-ping-service.js index d68d0f38aa31253382134009bb97fc81480f86e4..55f0478eeaf8c24cd27391c68437191d5095a82d 100644 --- a/packages/aios-management-web/server/src/services/topic-ping-service.js +++ b/packages/daedalus-agent-management-web/server/src/services/topic-ping-service.js @@ -20,7 +20,7 @@ function firstText(...values) { function normalizeInboundPayload(messageId, sessionId) { return { - senderId: "aios-management-web", + senderId: "daedalus-agent-management-web", sessionId, disableBlockStreaming: true, text: `请直接回复 PONG ${messageId}。不要附带任何其他内容,也不要调用任何工具。` @@ -156,7 +156,7 @@ export class TopicPingService { const safeTimeoutMs = normalizeTimeoutMs(timeoutMs); const connect = this.mqttFactory.connect || this.mqttFactory; const client = connect(this.env.mqtt.brokerUrl, { - clientId: `aios-web-agent-test-${randomUUID().slice(0, 8)}`, + clientId: `daedalus-agent-web-agent-test-${randomUUID().slice(0, 8)}`, username: this.env.mqtt.username || undefined, password: this.env.mqtt.password || undefined, clean: true, @@ -165,7 +165,7 @@ export class TopicPingService { const sessionId = `management-test-${randomUUID()}`; const payload = { - senderId: "aios-management-web", + senderId: "daedalus-agent-management-web", senderName: "Management Console", sessionId, disableBlockStreaming: false, @@ -443,7 +443,7 @@ export class TopicPingService { const connect = this.mqttFactory.connect || this.mqttFactory; const client = connect(this.env.mqtt.brokerUrl, { - clientId: `aios-web-ping-${randomUUID().slice(0, 8)}`, + clientId: `daedalus-agent-web-ping-${randomUUID().slice(0, 8)}`, username: this.env.mqtt.username || undefined, password: this.env.mqtt.password || undefined, clean: true, diff --git a/packages/aios-management-web/server/src/utils/china-time.js b/packages/daedalus-agent-management-web/server/src/utils/china-time.js similarity index 100% rename from packages/aios-management-web/server/src/utils/china-time.js rename to packages/daedalus-agent-management-web/server/src/utils/china-time.js diff --git a/packages/aios-management-web/server/src/utils/errors.js b/packages/daedalus-agent-management-web/server/src/utils/errors.js similarity index 100% rename from packages/aios-management-web/server/src/utils/errors.js rename to packages/daedalus-agent-management-web/server/src/utils/errors.js diff --git a/packages/aios-management-web/server/src/utils/logger.js b/packages/daedalus-agent-management-web/server/src/utils/logger.js similarity index 87% rename from packages/aios-management-web/server/src/utils/logger.js rename to packages/daedalus-agent-management-web/server/src/utils/logger.js index 6de901024438617bd46cc09994b225e7585acef2..450aa27294aca88a5b39d0939f1b2962553a31b1 100644 --- a/packages/aios-management-web/server/src/utils/logger.js +++ b/packages/daedalus-agent-management-web/server/src/utils/logger.js @@ -9,7 +9,7 @@ import timezone from "dayjs/plugin/timezone.js"; dayjs.extend(utc); dayjs.extend(timezone); -const PACKAGE_NAME = "aios-management-web"; +const PACKAGE_NAME = "daedalus-agent-management-web"; const warnedLogDirs = new Set(); function beijingTime() { @@ -17,17 +17,17 @@ function beijingTime() { } function resolveLogDir() { - const configured = process.env.AIOS_LOG_DIR?.trim(); + const configured = process.env.DA_LOG_DIR?.trim(); if (configured) { return configured; } - const root = process.env.AIOS_ROOT?.trim(); + const root = process.env.DA_ROOT?.trim(); if (root) { return path.join(root, "logs"); } - const dataDir = process.env.AIOS_DATA_DIR?.trim() || process.env.AIOS_KERNEL_DATA_DIR?.trim(); + const dataDir = process.env.DA_DATA_DIR?.trim() || process.env.DA_KERNEL_DATA_DIR?.trim(); if (dataDir) { return path.join(path.dirname(dataDir), "logs"); } @@ -74,7 +74,7 @@ function createDestination() { export function createLogger(name) { return pino({ name, - level: process.env.AIOS_LOG_LEVEL || "info", + level: process.env.DA_LOG_LEVEL || "info", timestamp: () => `,"ts":"${beijingTime()}"`, base: null }, createDestination()); diff --git a/packages/aios-management-web/server/src/utils/security.js b/packages/daedalus-agent-management-web/server/src/utils/security.js similarity index 100% rename from packages/aios-management-web/server/src/utils/security.js rename to packages/daedalus-agent-management-web/server/src/utils/security.js diff --git a/packages/aios-management-web/server/test/agent-service-alignment.test.js b/packages/daedalus-agent-management-web/server/test/agent-service-alignment.test.js similarity index 98% rename from packages/aios-management-web/server/test/agent-service-alignment.test.js rename to packages/daedalus-agent-management-web/server/test/agent-service-alignment.test.js index 74bdc55fbcf52a22e5c94c776a7f43ff6d3dbbe9..7cdb0356313a76b074419157ded6fd11795167e7 100644 --- a/packages/aios-management-web/server/test/agent-service-alignment.test.js +++ b/packages/daedalus-agent-management-web/server/test/agent-service-alignment.test.js @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-agent-test-")); -process.env.AIOS_WEB_DATA_DIR = dataDir; +const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-agent-test-")); +process.env.DA_WEB_DATA_DIR = dataDir; const { AgentService } = await import("../src/services/agent-service.js"); function createDb(agentRow) { diff --git a/packages/aios-management-web/server/test/agent-service-create.test.js b/packages/daedalus-agent-management-web/server/test/agent-service-create.test.js similarity index 96% rename from packages/aios-management-web/server/test/agent-service-create.test.js rename to packages/daedalus-agent-management-web/server/test/agent-service-create.test.js index 7bd20697456b711a16b5c23688698164f83da565..880b270c167eb21d5861ad5f4493b32bb6162954 100644 --- a/packages/aios-management-web/server/test/agent-service-create.test.js +++ b/packages/daedalus-agent-management-web/server/test/agent-service-create.test.js @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-agent-create-test-")); -process.env.AIOS_WEB_DATA_DIR = dataDir; +const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-agent-create-test-")); +process.env.DA_WEB_DATA_DIR = dataDir; const { AgentService } = await import("../src/services/agent-service.js"); const DEFAULT_LLM_SELECTION = { @@ -65,7 +65,7 @@ function createDb({ failAgentInsert = false, templates = ["default"] } = {}) { } ]; })); - const aiosUsers = new Map([ + const agentUsers = new Map([ ["zhangsan", { id: 11, username: "zhangsan" }], ["lisi", { id: 12, username: "lisi" }] ]); @@ -131,29 +131,29 @@ function createDb({ failAgentInsert = false, templates = ["default"] } = {}) { return { all: (agentId) => permissions .filter((item) => item.agent_id === agentId) - .map((item) => [...aiosUsers.values()].find((user) => user.id === item.aios_user_id)) + .map((item) => [...agentUsers.values()].find((user) => user.id === item.agent_user_id)) .filter(Boolean) }; } - if (sql.includes("INSERT INTO aios_users")) { + if (sql.includes("INSERT INTO agent_users")) { return { run: (username) => { - if (!aiosUsers.has(username)) { - aiosUsers.set(username, { id: aiosUsers.size + 11, username }); + if (!agentUsers.has(username)) { + agentUsers.set(username, { id: agentUsers.size + 11, username }); } return { changes: 1 }; } }; } - if (sql.includes("SELECT id") && sql.includes("FROM aios_users")) { + if (sql.includes("SELECT id") && sql.includes("FROM agent_users")) { return { get: (username) => { - const user = aiosUsers.get(username); + const user = agentUsers.get(username); return user ? { id: user.id } : null; }, - all: () => [...aiosUsers.values()] + all: () => [...agentUsers.values()] }; } @@ -170,14 +170,14 @@ function createDb({ failAgentInsert = false, templates = ["default"] } = {}) { }; } - if (sql.includes("INSERT INTO agent_permissions (agent_id, aios_user_id)")) { + if (sql.includes("INSERT INTO agent_permissions (agent_id, agent_user_id)")) { return { - run: (agentId, aiosUserId) => { - const user = [...aiosUsers.values()].find((item) => item.id === aiosUserId); + run: (agentId, agentUserId) => { + const user = [...agentUsers.values()].find((item) => item.id === agentUserId); if (user) { permissions.push({ agent_id: agentId, - aios_user_id: aiosUserId + agent_user_id: agentUserId }); } return { changes: 1 }; @@ -1062,7 +1062,7 @@ it("updates agent-user bindings from users field", async () => { const db = createDb(); db.permissions.push({ agent_id: 1, - aios_user_id: 11 + agent_user_id: 11 }); const service = new AgentService({ @@ -1088,7 +1088,7 @@ it("keeps agent-user bindings when update payload omits assignment fields", asyn const db = createDb(); db.permissions.push({ agent_id: 1, - aios_user_id: 11 + agent_user_id: 11 }); const actionCalls = []; @@ -1160,7 +1160,7 @@ it("deletes local record when remote agent is already missing", async () => { expect(db.insertedRows).toEqual([]); }); -it("imports AIOS users from newline separated content", () => { +it("imports DAEDALUS_AGENT users from newline separated content", () => { const db = createDb(); const service = new AgentService({ db, @@ -1168,7 +1168,7 @@ it("imports AIOS users from newline separated content", () => { objectStorage: {} }); - const result = service.importAiosUsers("zhangsan\nwangwu\nzhaoliu\n"); + const result = service.importAgentUsers("zhangsan\nwangwu\nzhaoliu\n"); expect(result.total).toBe(3); expect(result.created).toBe(2); diff --git a/packages/aios-management-web/server/test/agent-update-audit.test.js b/packages/daedalus-agent-management-web/server/test/agent-update-audit.test.js similarity index 100% rename from packages/aios-management-web/server/test/agent-update-audit.test.js rename to packages/daedalus-agent-management-web/server/test/agent-update-audit.test.js diff --git a/packages/aios-management-web/server/test/auth-middleware.test.js b/packages/daedalus-agent-management-web/server/test/auth-middleware.test.js similarity index 92% rename from packages/aios-management-web/server/test/auth-middleware.test.js rename to packages/daedalus-agent-management-web/server/test/auth-middleware.test.js index 332c9d6213f8c676cdad90a85ed54e2758b8cfe6..16d4ee05c9fd8eed73a06bb6801fce68c5d027aa 100644 --- a/packages/aios-management-web/server/test/auth-middleware.test.js +++ b/packages/daedalus-agent-management-web/server/test/auth-middleware.test.js @@ -21,8 +21,8 @@ it("injects local api user for localhost requests", async () => { getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, getSessionUser() { @@ -38,8 +38,8 @@ it("injects local api user for localhost requests", async () => { expect(result.req.authToken).toBe("localhost"); expect(result.req.currentUser).toEqual({ id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }); }); diff --git a/packages/aios-management-web/server/test/background-services.test.js b/packages/daedalus-agent-management-web/server/test/background-services.test.js similarity index 100% rename from packages/aios-management-web/server/test/background-services.test.js rename to packages/daedalus-agent-management-web/server/test/background-services.test.js diff --git a/packages/aios-management-web/server/test/catalog-sync-route.test.js b/packages/daedalus-agent-management-web/server/test/catalog-sync-route.test.js similarity index 97% rename from packages/aios-management-web/server/test/catalog-sync-route.test.js rename to packages/daedalus-agent-management-web/server/test/catalog-sync-route.test.js index f41880487fa28ab4e7e023fb500130cba1fae73c..ea29d16ebce4a28ad5d0b4dbb9510b14c6bbde18 100644 --- a/packages/aios-management-web/server/test/catalog-sync-route.test.js +++ b/packages/daedalus-agent-management-web/server/test/catalog-sync-route.test.js @@ -69,8 +69,8 @@ it("runs the manual sync plan and returns all catalog sync states", async () => getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} @@ -124,7 +124,7 @@ it("runs the manual sync plan and returns all catalog sync states", async () => expect(response.body.usage_refresh).toEqual(states.usage_refresh); expect(auditWrites).toEqual([{ userId: 1, - username: "aios", + username: "daedalus-agent", action: "同步数据", detail: "手动触发 catalog.snapshot 与 agent.usage.list 数据同步" }]); diff --git a/packages/aios-management-web/server/test/catalog-sync-service.test.js b/packages/daedalus-agent-management-web/server/test/catalog-sync-service.test.js similarity index 96% rename from packages/aios-management-web/server/test/catalog-sync-service.test.js rename to packages/daedalus-agent-management-web/server/test/catalog-sync-service.test.js index d9a2f64380bccc4fb0e4654290a791dccabbf1a8..83ef56eb26a7e7f7f0c5dd6b77a9e1f838d14b94 100644 --- a/packages/aios-management-web/server/test/catalog-sync-service.test.js +++ b/packages/daedalus-agent-management-web/server/test/catalog-sync-service.test.js @@ -230,16 +230,16 @@ function createDb() { CREATE TABLE external_sessions ( session_id TEXT PRIMARY KEY, - aios_user_id INTEGER NOT NULL, + agent_user_id INTEGER NOT NULL, agent_id INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, - UNIQUE (aios_user_id, agent_id), + UNIQUE (agent_user_id, agent_id), FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE CASCADE, - FOREIGN KEY (aios_user_id) REFERENCES aios_users(id) ON DELETE CASCADE + FOREIGN KEY (agent_user_id) REFERENCES agent_users(id) ON DELETE CASCADE ); - CREATE TABLE aios_users ( + CREATE TABLE agent_users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL, @@ -248,10 +248,10 @@ function createDb() { CREATE TABLE agent_permissions ( agent_id INTEGER NOT NULL, - aios_user_id INTEGER NOT NULL, - PRIMARY KEY (agent_id, aios_user_id), + agent_user_id INTEGER NOT NULL, + PRIMARY KEY (agent_id, agent_user_id), FOREIGN KEY (agent_id) REFERENCES agents(id) ON DELETE CASCADE, - FOREIGN KEY (aios_user_id) REFERENCES aios_users(id) ON DELETE CASCADE + FOREIGN KEY (agent_user_id) REFERENCES agent_users(id) ON DELETE CASCADE ); CREATE TABLE agent_templates ( @@ -470,8 +470,8 @@ it("syncs startup catalog snapshot with one management action runtime call", asy modelRef: "corp-openai/gpt-4.1-mini", fallbackModelRef: "backup-openai/qwen-fallback", topics: { - inbound: "aios/agent/alpha/inbound", - outbound: "aios/agent/alpha/outbound" + inbound: "daedalus-agent/agent/alpha/inbound", + outbound: "daedalus-agent/agent/alpha/outbound" } }], skills: [{ @@ -530,8 +530,8 @@ it("syncs startup catalog snapshot with one management action runtime call", asy ]); const syncedAgent = db.prepare("SELECT remote_state_json FROM agents WHERE slug = ?").get("alpha"); expect(JSON.parse(syncedAgent.remote_state_json)).toEqual({ - inboundTopic: "aios/agent/alpha/inbound", - outboundTopic: "aios/agent/alpha/outbound" + inboundTopic: "daedalus-agent/agent/alpha/inbound", + outboundTopic: "daedalus-agent/agent/alpha/outbound" }); expect(db.prepare("SELECT template_name, is_builtin FROM agent_templates ORDER BY template_name").all()).toEqual([ jasmine.objectContaining({ template_name: "default", is_builtin: 1 }) @@ -767,8 +767,8 @@ it("keeps renamed agent name from kernel catalog sync for management and externa agentName: "Old Management Name", status: "normal", remoteStateJson: JSON.stringify({ - inboundTopic: "aios/agent/renamed-agent/inbound", - outboundTopic: "aios/agent/renamed-agent/outbound" + inboundTopic: "daedalus-agent/agent/renamed-agent/inbound", + outboundTopic: "daedalus-agent/agent/renamed-agent/outbound" }) }); @@ -786,8 +786,8 @@ it("keeps renamed agent name from kernel catalog sync for management and externa name: "Kernel Synced Name", status: "active", topics: { - inbound: "aios/agent/renamed-agent/inbound", - outbound: "aios/agent/renamed-agent/outbound" + inbound: "daedalus-agent/agent/renamed-agent/inbound", + outbound: "daedalus-agent/agent/renamed-agent/outbound" } }] }); @@ -802,8 +802,8 @@ it("keeps renamed agent name from kernel catalog sync for management and externa const agent = db.prepare("SELECT agent_name, remote_state_json FROM agents WHERE slug = ?").get("renamed-agent"); expect(agent.agent_name).toBe("Kernel Synced Name"); expect(JSON.parse(agent.remote_state_json)).toEqual({ - inboundTopic: "aios/agent/renamed-agent/inbound", - outboundTopic: "aios/agent/renamed-agent/outbound" + inboundTopic: "daedalus-agent/agent/renamed-agent/inbound", + outboundTopic: "daedalus-agent/agent/renamed-agent/outbound" }); }); @@ -1120,7 +1120,7 @@ it("fails usage refresh when agent.usage.list returns a non-usage payload", asyn return { items: [{ agentId: "alpha", - configPath: "/var/aios/.openclaw/openclaw.json", + configPath: "/var/daedalus-agent/.openclaw/openclaw.json", defaultModel: "corp-openai/gpt-5.4" }] }; diff --git a/packages/aios-management-web/server/test/db-reset-migration.test.js b/packages/daedalus-agent-management-web/server/test/db-reset-migration.test.js similarity index 86% rename from packages/aios-management-web/server/test/db-reset-migration.test.js rename to packages/daedalus-agent-management-web/server/test/db-reset-migration.test.js index 55163a2855354906aaa2bcfacabb9bfcb700356b..664ad7b3d4d3d543458331c9ef18edd842042570 100644 --- a/packages/aios-management-web/server/test/db-reset-migration.test.js +++ b/packages/daedalus-agent-management-web/server/test/db-reset-migration.test.js @@ -3,6 +3,7 @@ import os from "node:os"; import path from "node:path"; import { DatabaseSync } from "node:sqlite"; + function createStateTableSql(tableName) { return ` CREATE TABLE ${tableName} ( @@ -31,93 +32,15 @@ function seedStateRow(db, tableName) { function restoreDataDir(previousDataDir) { if (previousDataDir === undefined) { - delete process.env.AIOS_WEB_DATA_DIR; + delete process.env.DA_WEB_DATA_DIR; } else { - process.env.AIOS_WEB_DATA_DIR = previousDataDir; + process.env.DA_WEB_DATA_DIR = previousDataDir; } } -function setupV7BrandingDatabase(dbFile, { portalName, adminDisplayName }) { - const now = "2026-05-26T00:00:00.000Z"; - const setupDb = new DatabaseSync(dbFile); - - setupDb.exec(` - CREATE TABLE schema_meta ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL - ); - INSERT INTO schema_meta (key, value) VALUES ('schema_version', '7'); - - CREATE TABLE settings ( - id INTEGER PRIMARY KEY CHECK (id = 1), - portal_name TEXT NOT NULL, - brand_subtitle TEXT NOT NULL, - theme_color TEXT NOT NULL, - logo_mime_type TEXT NOT NULL DEFAULT '', - logo_data BLOB, - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL - ); - - CREATE TABLE access_tokens ( - token TEXT PRIMARY KEY, - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL - ); - - ${createStateTableSql("usage_refresh_state")} - ${createStateTableSql("agent_sync_state")} - ${createStateTableSql("llm_sync_state")} - ${createStateTableSql("skill_sync_state")} - ${createStateTableSql("template_sync_state")} - ${createStateTableSql("system_sync_state")} - - CREATE TABLE users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - role TEXT NOT NULL CHECK (role IN ('aios-admin')), - username TEXT NOT NULL UNIQUE, - display_name TEXT NOT NULL, - status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), - password_hash TEXT NOT NULL DEFAULT '', - must_change_password INTEGER NOT NULL DEFAULT 0, - is_builtin INTEGER NOT NULL DEFAULT 0, - tags_json TEXT NOT NULL DEFAULT '[]', - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL - ); - `); - - setupDb.prepare(` - INSERT INTO settings ( - id, portal_name, brand_subtitle, theme_color, logo_mime_type, logo_data, created_at, updated_at - ) VALUES (1, ?, 'Your Company Name', '#07c160', '', NULL, ?, ?) - `).run(portalName, now, now); - setupDb.prepare(` - INSERT INTO access_tokens (token, created_at, updated_at) - VALUES ('sk-test', ?, ?) - `).run(now, now); - for (const tableName of [ - "usage_refresh_state", - "agent_sync_state", - "llm_sync_state", - "skill_sync_state", - "template_sync_state", - "system_sync_state" - ]) { - seedStateRow(setupDb, tableName); - } - setupDb.prepare(` - INSERT INTO users ( - role, username, display_name, status, password_hash, - must_change_password, is_builtin, tags_json, created_at, updated_at - ) VALUES ('aios-admin', 'aios', ?, 'active', '', 0, 1, '[]', ?, ?) - `).run(adminDisplayName, now, now); - setupDb.close(); -} - it("resets drifted legacy schemas to the latest database structure", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-db-reset-test-")); + const previousDataDir = process.env.DA_WEB_DATA_DIR; + const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-db-reset-test-")); const dbFile = path.join(dataDir, "management-console.db"); const setupDb = new DatabaseSync(dbFile); @@ -172,7 +95,7 @@ it("resets drifted legacy schemas to the latest database structure", async () => `); setupDb.close(); - process.env.AIOS_WEB_DATA_DIR = dataDir; + process.env.DA_WEB_DATA_DIR = dataDir; const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}`, import.meta.url); const { db } = await import(moduleUrl.href); @@ -210,10 +133,10 @@ it("resets drifted legacy schemas to the latest database structure", async () => `).get(); const sessionCookieColumns = db.prepare("PRAGMA table_info(external_session_cookies)").all(); const externalSessionColumns = db.prepare("PRAGMA table_info(external_sessions)").all(); - const aiosUsersTable = db.prepare(` + const agentUsersTable = db.prepare(` SELECT name FROM sqlite_master - WHERE type = 'table' AND name = 'aios_users' + WHERE type = 'table' AND name = 'agent_users' `).get(); const agentSkillBindingsTable = db.prepare(` SELECT name @@ -239,10 +162,10 @@ it("resets drifted legacy schemas to the latest database structure", async () => const settingsColumns = db.prepare("PRAGMA table_info(settings)").all().map((row) => row.name); - expect(schemaVersion?.value).toBe("9"); + expect(schemaVersion?.value).toBe("11"); expect(settingsColumns).toContain("logo_mime_type"); expect(settingsColumns).toContain("logo_data"); - expect(aiosUsersTable?.name).toBe("aios_users"); + expect(agentUsersTable?.name).toBe("agent_users"); expect(componentVersionsTable?.name).toBe("component_versions"); expect(agentColumns).toContain("template_name"); expect(agentColumns).toContain("llm_provider_id"); @@ -259,7 +182,7 @@ it("resets drifted legacy schemas to the latest database structure", async () => expect(llmProviderTable?.name).toBe("llm_providers"); expect(llmModelTable?.name).toBe("llm_models"); expect(llmSyncTable?.name).toBe("llm_sync_state"); - expect(permissionColumns).toContain("aios_user_id"); + expect(permissionColumns).toContain("agent_user_id"); expect(permissionColumns).not.toContain("directory_user_id"); expect(permissionColumns).not.toContain("user_id"); expect(skillColumns).not.toContain("remote_slug"); @@ -301,53 +224,9 @@ it("resets drifted legacy schemas to the latest database structure", async () => restoreDataDir(previousDataDir); }); -it("updates legacy default branding without requiring a schema version bump", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-branding-test-")); - const dbFile = path.join(dataDir, "management-console.db"); - setupV7BrandingDatabase(dbFile, { - portalName: "AIOS 管理控制台", - adminDisplayName: "AIOS 管理员" - }); - - process.env.AIOS_WEB_DATA_DIR = dataDir; - const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-branding`, import.meta.url); - const { db } = await import(moduleUrl.href); - - const settings = db.prepare("SELECT portal_name FROM settings WHERE id = 1").get(); - const admin = db.prepare("SELECT display_name FROM users WHERE username = 'aios'").get(); - - expect(settings.portal_name).toBe("数字员工控制台"); - expect(admin.display_name).toBe("数字员工平台管理员"); - - restoreDataDir(previousDataDir); -}); - -it("keeps customized branding while applying core row checks", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-custom-branding-test-")); - const dbFile = path.join(dataDir, "management-console.db"); - setupV7BrandingDatabase(dbFile, { - portalName: "客户自定义控制台", - adminDisplayName: "运维管理员" - }); - - process.env.AIOS_WEB_DATA_DIR = dataDir; - const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-custom-branding`, import.meta.url); - const { db } = await import(moduleUrl.href); - - const settings = db.prepare("SELECT portal_name FROM settings WHERE id = 1").get(); - const admin = db.prepare("SELECT display_name FROM users WHERE username = 'aios'").get(); - - expect(settings.portal_name).toBe("客户自定义控制台"); - expect(admin.display_name).toBe("运维管理员"); - - restoreDataDir(previousDataDir); -}); - it("migrates v1 agents to template relationships without dropping data", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-db-v1-v2-test-")); + const previousDataDir = process.env.DA_WEB_DATA_DIR; + const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-db-v1-v2-test-")); const dbFile = path.join(dataDir, "management-console.db"); const setupDb = new DatabaseSync(dbFile); @@ -381,7 +260,7 @@ it("migrates v1 agents to template relationships without dropping data", async ( CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, - role TEXT NOT NULL CHECK (role IN ('aios-admin')), + role TEXT NOT NULL CHECK (role IN ('daedalus-admin')), username TEXT NOT NULL UNIQUE, display_name TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), @@ -412,7 +291,7 @@ it("migrates v1 agents to template relationships without dropping data", async ( setupDb.prepare(` INSERT INTO settings ( id, portal_name, brand_subtitle, theme_color, created_at, updated_at - ) VALUES (1, 'AIOS', 'Test', '#07c160', ?, ?) + ) VALUES (1, 'DAEDALUS_AGENT', 'Test', '#a5522d', ?, ?) `).run("2026-05-26T00:00:00.000Z", "2026-05-26T00:00:00.000Z"); setupDb.prepare(` INSERT INTO access_tokens ( @@ -443,7 +322,7 @@ it("migrates v1 agents to template relationships without dropping data", async ( ); setupDb.close(); - process.env.AIOS_WEB_DATA_DIR = dataDir; + process.env.DA_WEB_DATA_DIR = dataDir; const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-v1-v2`, import.meta.url); const { db } = await import(moduleUrl.href); @@ -455,7 +334,7 @@ it("migrates v1 agents to template relationships without dropping data", async ( ORDER BY slug `).all(); - expect(schemaVersion?.value).toBe("9"); + expect(schemaVersion?.value).toBe("11"); expect(agentColumns).toContain("template_name"); expect(agentColumns).toContain("llm_model_ref"); expect(agentColumns).toContain("fallback_llm_model_ref"); @@ -469,8 +348,8 @@ it("migrates v1 agents to template relationships without dropping data", async ( }); it("migrates v3 templates to default llm columns and removes template description", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-db-v3-v4-test-")); + const previousDataDir = process.env.DA_WEB_DATA_DIR; + const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-db-v3-v4-test-")); const dbFile = path.join(dataDir, "management-console.db"); const setupDb = new DatabaseSync(dbFile); @@ -543,7 +422,7 @@ it("migrates v3 templates to default llm columns and removes template descriptio `); const now = "2026-05-26T00:00:00.000Z"; - setupDb.prepare("INSERT INTO settings (id, portal_name, brand_subtitle, theme_color, created_at, updated_at) VALUES (1, 'AIOS', 'Test', '#07c160', ?, ?)").run(now, now); + setupDb.prepare("INSERT INTO settings (id, portal_name, brand_subtitle, theme_color, created_at, updated_at) VALUES (1, 'DAEDALUS_AGENT', 'Test', '#a5522d', ?, ?)").run(now, now); setupDb.prepare("INSERT INTO access_tokens (token, created_at, updated_at) VALUES ('sk-test', ?, ?)").run(now, now); for (const tableName of [ "usage_refresh_state", @@ -569,7 +448,7 @@ it("migrates v3 templates to default llm columns and removes template descriptio `).run(now, now); setupDb.close(); - process.env.AIOS_WEB_DATA_DIR = dataDir; + process.env.DA_WEB_DATA_DIR = dataDir; const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-v3-v4`, import.meta.url); const { db } = await import(moduleUrl.href); @@ -577,7 +456,7 @@ it("migrates v3 templates to default llm columns and removes template descriptio const templateColumns = db.prepare("PRAGMA table_info(agent_templates)").all().map((row) => row.name); const template = db.prepare("SELECT template_name, default_llm_model_ref FROM agent_templates WHERE template_name = ?").get("default"); - expect(schemaVersion?.value).toBe("9"); + expect(schemaVersion?.value).toBe("11"); expect(templateColumns).toContain("default_llm_provider_id"); expect(templateColumns).toContain("default_llm_model_id"); expect(templateColumns).toContain("default_llm_model_ref"); @@ -591,8 +470,8 @@ it("migrates v3 templates to default llm columns and removes template descriptio }); it("migrates v4 settings through uploaded logo columns without dropping data", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-db-v4-v5-test-")); + const previousDataDir = process.env.DA_WEB_DATA_DIR; + const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-db-v4-v5-test-")); const dbFile = path.join(dataDir, "management-console.db"); const setupDb = new DatabaseSync(dbFile); const now = "2026-05-26T00:00:00.000Z"; @@ -628,7 +507,7 @@ it("migrates v4 settings through uploaded logo columns without dropping data", a CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, - role TEXT NOT NULL CHECK (role IN ('aios-admin')), + role TEXT NOT NULL CHECK (role IN ('daedalus-admin')), username TEXT NOT NULL UNIQUE, display_name TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), @@ -640,7 +519,7 @@ it("migrates v4 settings through uploaded logo columns without dropping data", a updated_at TEXT NOT NULL ); `); - setupDb.prepare("INSERT INTO settings (id, portal_name, brand_subtitle, theme_color, created_at, updated_at) VALUES (1, 'AIOS', 'Test', '#07c160', ?, ?)").run(now, now); + setupDb.prepare("INSERT INTO settings (id, portal_name, brand_subtitle, theme_color, created_at, updated_at) VALUES (1, 'DAEDALUS_AGENT', 'Test', '#a5522d', ?, ?)").run(now, now); setupDb.prepare("INSERT INTO access_tokens (token, created_at, updated_at) VALUES ('sk-test', ?, ?)").run(now, now); for (const tableName of [ "usage_refresh_state", @@ -654,18 +533,18 @@ it("migrates v4 settings through uploaded logo columns without dropping data", a } setupDb.close(); - process.env.AIOS_WEB_DATA_DIR = dataDir; + process.env.DA_WEB_DATA_DIR = dataDir; const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-v4-v5`, import.meta.url); const { db } = await import(moduleUrl.href); const schemaVersion = db.prepare("SELECT value FROM schema_meta WHERE key = 'schema_version'").get(); const settings = db.prepare("SELECT portal_name, brand_subtitle, theme_color, logo_mime_type, logo_data FROM settings WHERE id = 1").get(); - expect(schemaVersion?.value).toBe("9"); + expect(schemaVersion?.value).toBe("11"); expect(settings).toEqual({ - portal_name: "AIOS", - brand_subtitle: "Test", - theme_color: "#07c160", + portal_name: "daedalus-agent", + brand_subtitle: "智能体管理与运营平台", + theme_color: "#a5522d", logo_mime_type: "", logo_data: null }); @@ -674,8 +553,8 @@ it("migrates v4 settings through uploaded logo columns without dropping data", a }); it("migrates v5 templates by dropping template description without dropping data", async () => { - const previousDataDir = process.env.AIOS_WEB_DATA_DIR; - const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-db-v5-v6-test-")); + const previousDataDir = process.env.DA_WEB_DATA_DIR; + const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-db-v5-v6-test-")); const dbFile = path.join(dataDir, "management-console.db"); const setupDb = new DatabaseSync(dbFile); const now = "2026-05-26T00:00:00.000Z"; @@ -713,7 +592,7 @@ it("migrates v5 templates by dropping template description without dropping data CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, - role TEXT NOT NULL CHECK (role IN ('aios-admin')), + role TEXT NOT NULL CHECK (role IN ('daedalus-admin')), username TEXT NOT NULL UNIQUE, display_name TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), @@ -755,7 +634,7 @@ it("migrates v5 templates by dropping template description without dropping data setupDb.prepare(` INSERT INTO settings ( id, portal_name, brand_subtitle, theme_color, logo_mime_type, logo_data, created_at, updated_at - ) VALUES (1, 'AIOS', 'Test', '#07c160', 'image/png', x'89504E47', ?, ?) + ) VALUES (1, 'DAEDALUS_AGENT', 'Test', '#a5522d', 'image/png', x'89504E47', ?, ?) `).run(now, now); setupDb.prepare("INSERT INTO access_tokens (token, created_at, updated_at) VALUES ('sk-test', ?, ?)").run(now, now); for (const tableName of [ @@ -787,7 +666,7 @@ it("migrates v5 templates by dropping template description without dropping data `).run(now, now); setupDb.close(); - process.env.AIOS_WEB_DATA_DIR = dataDir; + process.env.DA_WEB_DATA_DIR = dataDir; const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-v5-v6`, import.meta.url); const { db } = await import(moduleUrl.href); @@ -802,7 +681,7 @@ it("migrates v5 templates by dropping template description without dropping data WHERE template_name = ? `).get("default"); - expect(schemaVersion?.value).toBe("9"); + expect(schemaVersion?.value).toBe("11"); expect(templateColumns).not.toContain("description"); expect(template).toEqual({ id: 1, @@ -820,3 +699,111 @@ it("migrates v5 templates by dropping template description without dropping data restoreDataDir(previousDataDir); }); + +it("migrates v10 users and portal settings to the daedalus-agent identity", async () => { + const previousDataDir = process.env.DA_WEB_DATA_DIR; + const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-db-v10-v11-test-")); + const dbFile = path.join(dataDir, "management-console.db"); + const setupDb = new DatabaseSync(dbFile); + const now = "2026-07-20T00:00:00.000Z"; + const legacyRole = ["ikk", "yu-admin"].join(""); + + setupDb.exec(` + CREATE TABLE schema_meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + INSERT INTO schema_meta (key, value) VALUES ('schema_version', '10'); + + CREATE TABLE settings ( + id INTEGER PRIMARY KEY CHECK (id = 1), + portal_name TEXT NOT NULL, + brand_subtitle TEXT NOT NULL, + theme_color TEXT NOT NULL, + logo_mime_type TEXT NOT NULL DEFAULT '', + logo_data BLOB, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE TABLE access_tokens ( + token TEXT PRIMARY KEY, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + ${createStateTableSql("usage_refresh_state")} + ${createStateTableSql("agent_sync_state")} + ${createStateTableSql("llm_sync_state")} + ${createStateTableSql("skill_sync_state")} + ${createStateTableSql("template_sync_state")} + ${createStateTableSql("system_sync_state")} + + CREATE TABLE users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + role TEXT NOT NULL CHECK (role IN ('${legacyRole}')), + username TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL, + status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), + password_hash TEXT NOT NULL DEFAULT '', + must_change_password INTEGER NOT NULL DEFAULT 0, + is_builtin INTEGER NOT NULL DEFAULT 0, + tags_json TEXT NOT NULL DEFAULT '[]', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + `); + setupDb.prepare(` + INSERT INTO settings ( + id, portal_name, brand_subtitle, theme_color, logo_mime_type, logo_data, created_at, updated_at + ) VALUES (1, ?, ?, ?, ?, ?, ?, ?) + `).run("Management Console", "Legacy brand", "#123456", "image/png", Buffer.from("legacy-logo"), now, now); + setupDb.prepare(` + INSERT INTO users ( + id, role, username, display_name, status, password_hash, + must_change_password, is_builtin, tags_json, created_at, updated_at + ) VALUES (1, ?, 'admin', 'Legacy Admin', 'active', 'hash', 0, 1, '["builtin"]', ?, ?) + `).run(legacyRole, now, now); + setupDb.prepare("INSERT INTO access_tokens (token, created_at, updated_at) VALUES ('sk-test', ?, ?)").run(now, now); + for (const tableName of [ + "usage_refresh_state", + "agent_sync_state", + "llm_sync_state", + "skill_sync_state", + "template_sync_state", + "system_sync_state" + ]) { + seedStateRow(setupDb, tableName); + } + setupDb.close(); + + process.env.DA_WEB_DATA_DIR = dataDir; + const moduleUrl = new URL(`../src/db/index.js?case=${Date.now()}-v10-v11`, import.meta.url); + const { db } = await import(moduleUrl.href); + + const schemaVersion = db.prepare("SELECT value FROM schema_meta WHERE key = 'schema_version'").get(); + const settings = db.prepare(` + SELECT portal_name, brand_subtitle, theme_color, logo_mime_type, logo_data + FROM settings + WHERE id = 1 + `).get(); + const user = db.prepare("SELECT id, role, username, display_name, password_hash FROM users WHERE id = 1").get(); + + expect(schemaVersion?.value).toBe("11"); + expect(settings).toEqual({ + portal_name: "daedalus-agent", + brand_subtitle: "智能体管理与运营平台", + theme_color: "#a5522d", + logo_mime_type: "", + logo_data: null + }); + expect(user).toEqual({ + id: 1, + role: "daedalus-admin", + username: "admin", + display_name: "Legacy Admin", + password_hash: "hash" + }); + + restoreDataDir(previousDataDir); +}); diff --git a/packages/aios-management-web/server/test/env-config.test.js b/packages/daedalus-agent-management-web/server/test/env-config.test.js similarity index 37% rename from packages/aios-management-web/server/test/env-config.test.js rename to packages/daedalus-agent-management-web/server/test/env-config.test.js index af7d3e1ceba155011f299038b067527b430f4f2e..e8e26de17868fad3028bdf2ec87f754c1c264c46 100644 --- a/packages/aios-management-web/server/test/env-config.test.js +++ b/packages/daedalus-agent-management-web/server/test/env-config.test.js @@ -1,159 +1,171 @@ +import fs from "node:fs"; +import os from "node:os"; import path from "node:path"; import { loadEnv } from "../src/config/env.js"; -it("falls back to .env.json for runtime integrations", () => { - const originalBroker = process.env.AIOS_MQTT_CHANNEL_BROKER; - const originalS3 = process.env.AIOS_S3_ENDPOINT; - delete process.env.AIOS_MQTT_CHANNEL_BROKER; - delete process.env.AIOS_S3_ENDPOINT; +it("falls back to .env.json for runtime integrations", async () => { + const originalBroker = process.env.DA_MQTT_CHANNEL_BROKER; + const originalS3 = process.env.DA_S3_ENDPOINT; + const originalDirectory = process.cwd(); + const fixtureDirectory = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-env-")); + fs.writeFileSync(path.join(fixtureDirectory, ".env.json"), JSON.stringify({ + DA_MQTT_CHANNEL_BROKER: "mqtt://172.16.12.2:1883", + DA_S3_ENDPOINT: "http://172.16.12.2:9000" + }), "utf8"); + delete process.env.DA_MQTT_CHANNEL_BROKER; + delete process.env.DA_S3_ENDPOINT; try { - const env = loadEnv(); + process.chdir(fixtureDirectory); + const fixtureEnvModule = await import(`../src/config/env.js?fixture=${Date.now()}`); + const env = fixtureEnvModule.loadEnv(); expect(env.mqtt.brokerUrl).toBe("mqtt://172.16.12.2:1883"); expect(env.s3.endpoint).toBe("http://172.16.12.2:9000"); } finally { + process.chdir(originalDirectory); + fs.rmSync(fixtureDirectory, { recursive: true, force: true }); if (originalBroker === undefined) { - delete process.env.AIOS_MQTT_CHANNEL_BROKER; + delete process.env.DA_MQTT_CHANNEL_BROKER; } else { - process.env.AIOS_MQTT_CHANNEL_BROKER = originalBroker; + process.env.DA_MQTT_CHANNEL_BROKER = originalBroker; } if (originalS3 === undefined) { - delete process.env.AIOS_S3_ENDPOINT; + delete process.env.DA_S3_ENDPOINT; } else { - process.env.AIOS_S3_ENDPOINT = originalS3; + process.env.DA_S3_ENDPOINT = originalS3; } } }); -it("defaults web data dir under AIOS_ROOT management directory", () => { - const originalRoot = process.env.AIOS_ROOT; - const originalDataDir = process.env.AIOS_WEB_DATA_DIR; - process.env.AIOS_ROOT = "/var/aios"; - delete process.env.AIOS_WEB_DATA_DIR; +it("defaults web data dir under DA_ROOT management directory", () => { + const originalRoot = process.env.DA_ROOT; + const originalDataDir = process.env.DA_WEB_DATA_DIR; + process.env.DA_ROOT = "/var/daedalus-agent"; + delete process.env.DA_WEB_DATA_DIR; try { const env = loadEnv(); - expect(env.dataDir).toBe(path.resolve("/var/aios/management/data")); + expect(env.dataDir).toBe(path.resolve("/var/daedalus-agent/management/data")); } finally { if (originalRoot === undefined) { - delete process.env.AIOS_ROOT; + delete process.env.DA_ROOT; } else { - process.env.AIOS_ROOT = originalRoot; + process.env.DA_ROOT = originalRoot; } if (originalDataDir === undefined) { - delete process.env.AIOS_WEB_DATA_DIR; + delete process.env.DA_WEB_DATA_DIR; } else { - process.env.AIOS_WEB_DATA_DIR = originalDataDir; + process.env.DA_WEB_DATA_DIR = originalDataDir; } } }); -it("reads AIOS data dir for runtime payload files", () => { - const originalDataDir = process.env.AIOS_DATA_DIR; - process.env.AIOS_DATA_DIR = "/var/aios/data"; +it("reads DAEDALUS_AGENT data dir for runtime payload files", () => { + const originalDataDir = process.env.DA_DATA_DIR; + process.env.DA_DATA_DIR = "/var/daedalus-agent/data"; try { const env = loadEnv(); - expect(env.aiosDataDir).toBe(path.resolve("/var/aios/data")); + expect(env.productDataDir).toBe(path.resolve("/var/daedalus-agent/data")); } finally { if (originalDataDir === undefined) { - delete process.env.AIOS_DATA_DIR; + delete process.env.DA_DATA_DIR; } else { - process.env.AIOS_DATA_DIR = originalDataDir; + process.env.DA_DATA_DIR = originalDataDir; } } }); -it("defaults credentials json path under AIOS_ROOT", () => { - const originalRoot = process.env.AIOS_ROOT; - const originalCredentialsJson = process.env.AIOS_CREDENTIALS_JSON; - process.env.AIOS_ROOT = "/var/aios"; - delete process.env.AIOS_CREDENTIALS_JSON; +it("defaults credentials json path under DA_ROOT", () => { + const originalRoot = process.env.DA_ROOT; + const originalCredentialsJson = process.env.DA_CREDENTIALS_JSON; + process.env.DA_ROOT = "/var/daedalus-agent"; + delete process.env.DA_CREDENTIALS_JSON; try { const env = loadEnv(); - expect(env.credentialsJsonPath).toBe(path.resolve("/var/aios/credentials.json")); + expect(env.credentialsJsonPath).toBe(path.resolve("/var/daedalus-agent/credentials.json")); } finally { if (originalRoot === undefined) { - delete process.env.AIOS_ROOT; + delete process.env.DA_ROOT; } else { - process.env.AIOS_ROOT = originalRoot; + process.env.DA_ROOT = originalRoot; } if (originalCredentialsJson === undefined) { - delete process.env.AIOS_CREDENTIALS_JSON; + delete process.env.DA_CREDENTIALS_JSON; } else { - process.env.AIOS_CREDENTIALS_JSON = originalCredentialsJson; + process.env.DA_CREDENTIALS_JSON = originalCredentialsJson; } } }); -it("defaults web data dir to local data when AIOS_ROOT is absent", () => { - const originalRoot = process.env.AIOS_ROOT; - const originalDataDir = process.env.AIOS_WEB_DATA_DIR; - delete process.env.AIOS_ROOT; - delete process.env.AIOS_WEB_DATA_DIR; +it("defaults web data dir to local data when DA_ROOT is absent", () => { + const originalRoot = process.env.DA_ROOT; + const originalDataDir = process.env.DA_WEB_DATA_DIR; + delete process.env.DA_ROOT; + delete process.env.DA_WEB_DATA_DIR; try { const env = loadEnv(); expect(env.dataDir).toBe(path.resolve("data")); } finally { if (originalRoot === undefined) { - delete process.env.AIOS_ROOT; + delete process.env.DA_ROOT; } else { - process.env.AIOS_ROOT = originalRoot; + process.env.DA_ROOT = originalRoot; } if (originalDataDir === undefined) { - delete process.env.AIOS_WEB_DATA_DIR; + delete process.env.DA_WEB_DATA_DIR; } else { - process.env.AIOS_WEB_DATA_DIR = originalDataDir; + process.env.DA_WEB_DATA_DIR = originalDataDir; } } }); it("reads management website timeout from environment in seconds", () => { - const originalTimeout = process.env.AIOS_MANAGEMENT_WEBSITE_TIMEOUT; - process.env.AIOS_MANAGEMENT_WEBSITE_TIMEOUT = "180"; + const originalTimeout = process.env.DA_MANAGEMENT_WEBSITE_TIMEOUT; + process.env.DA_MANAGEMENT_WEBSITE_TIMEOUT = "180"; try { const env = loadEnv(); expect(env.managementTimeoutMs).toBe(180000); } finally { if (originalTimeout === undefined) { - delete process.env.AIOS_MANAGEMENT_WEBSITE_TIMEOUT; + delete process.env.DA_MANAGEMENT_WEBSITE_TIMEOUT; } else { - process.env.AIOS_MANAGEMENT_WEBSITE_TIMEOUT = originalTimeout; + process.env.DA_MANAGEMENT_WEBSITE_TIMEOUT = originalTimeout; } } }); it("defaults service ping retry interval to ten seconds", () => { - const originalPollInterval = process.env.AIOS_STARTUP_SYNC_POLL_INTERVAL_MS; - delete process.env.AIOS_STARTUP_SYNC_POLL_INTERVAL_MS; + const originalPollInterval = process.env.DA_STARTUP_SYNC_POLL_INTERVAL_MS; + delete process.env.DA_STARTUP_SYNC_POLL_INTERVAL_MS; try { const env = loadEnv(); expect(env.startupSyncPollIntervalMs).toBe(10000); } finally { if (originalPollInterval === undefined) { - delete process.env.AIOS_STARTUP_SYNC_POLL_INTERVAL_MS; + delete process.env.DA_STARTUP_SYNC_POLL_INTERVAL_MS; } else { - process.env.AIOS_STARTUP_SYNC_POLL_INTERVAL_MS = originalPollInterval; + process.env.DA_STARTUP_SYNC_POLL_INTERVAL_MS = originalPollInterval; } } }); it("defaults system status refresh timing", () => { - const originalInitialDelay = process.env.AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS; - const originalRefreshInterval = process.env.AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS; - const originalTimeout = process.env.AIOS_SYSTEM_STATUS_TIMEOUT_MS; - delete process.env.AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS; - delete process.env.AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS; - delete process.env.AIOS_SYSTEM_STATUS_TIMEOUT_MS; + const originalInitialDelay = process.env.DA_SYSTEM_STATUS_INITIAL_DELAY_MS; + const originalRefreshInterval = process.env.DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS; + const originalTimeout = process.env.DA_SYSTEM_STATUS_TIMEOUT_MS; + delete process.env.DA_SYSTEM_STATUS_INITIAL_DELAY_MS; + delete process.env.DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS; + delete process.env.DA_SYSTEM_STATUS_TIMEOUT_MS; try { const env = loadEnv(); @@ -162,31 +174,31 @@ it("defaults system status refresh timing", () => { expect(env.systemStatusTimeoutMs).toBe(5000); } finally { if (originalInitialDelay === undefined) { - delete process.env.AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS; + delete process.env.DA_SYSTEM_STATUS_INITIAL_DELAY_MS; } else { - process.env.AIOS_SYSTEM_STATUS_INITIAL_DELAY_MS = originalInitialDelay; + process.env.DA_SYSTEM_STATUS_INITIAL_DELAY_MS = originalInitialDelay; } if (originalRefreshInterval === undefined) { - delete process.env.AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS; + delete process.env.DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS; } else { - process.env.AIOS_SYSTEM_STATUS_REFRESH_INTERVAL_MS = originalRefreshInterval; + process.env.DA_SYSTEM_STATUS_REFRESH_INTERVAL_MS = originalRefreshInterval; } if (originalTimeout === undefined) { - delete process.env.AIOS_SYSTEM_STATUS_TIMEOUT_MS; + delete process.env.DA_SYSTEM_STATUS_TIMEOUT_MS; } else { - process.env.AIOS_SYSTEM_STATUS_TIMEOUT_MS = originalTimeout; + process.env.DA_SYSTEM_STATUS_TIMEOUT_MS = originalTimeout; } } }); it("reads management website port from environment", () => { - const originalPort = process.env.AIOS_WEB_PORT; - const originalManagementPort = process.env.AIOS_MANAGEMENT_CONSOLE_PORT; + const originalPort = process.env.DA_WEB_PORT; + const originalManagementPort = process.env.DA_MANAGEMENT_CONSOLE_PORT; const originalNodePort = process.env.PORT; - process.env.AIOS_WEB_PORT = "3040"; - process.env.AIOS_MANAGEMENT_CONSOLE_PORT = "3035"; + process.env.DA_WEB_PORT = "3040"; + process.env.DA_MANAGEMENT_CONSOLE_PORT = "3035"; process.env.PORT = "3036"; try { @@ -194,15 +206,15 @@ it("reads management website port from environment", () => { expect(env.port).toBe(3040); } finally { if (originalPort === undefined) { - delete process.env.AIOS_WEB_PORT; + delete process.env.DA_WEB_PORT; } else { - process.env.AIOS_WEB_PORT = originalPort; + process.env.DA_WEB_PORT = originalPort; } if (originalManagementPort === undefined) { - delete process.env.AIOS_MANAGEMENT_CONSOLE_PORT; + delete process.env.DA_MANAGEMENT_CONSOLE_PORT; } else { - process.env.AIOS_MANAGEMENT_CONSOLE_PORT = originalManagementPort; + process.env.DA_MANAGEMENT_CONSOLE_PORT = originalManagementPort; } if (originalNodePort === undefined) { @@ -214,11 +226,11 @@ it("reads management website port from environment", () => { }); it("falls back to management console port for the web server", () => { - const originalWebPort = process.env.AIOS_WEB_PORT; - const originalManagementPort = process.env.AIOS_MANAGEMENT_CONSOLE_PORT; + const originalWebPort = process.env.DA_WEB_PORT; + const originalManagementPort = process.env.DA_MANAGEMENT_CONSOLE_PORT; const originalNodePort = process.env.PORT; - delete process.env.AIOS_WEB_PORT; - process.env.AIOS_MANAGEMENT_CONSOLE_PORT = "3038"; + delete process.env.DA_WEB_PORT; + process.env.DA_MANAGEMENT_CONSOLE_PORT = "3038"; process.env.PORT = "3039"; try { @@ -226,15 +238,15 @@ it("falls back to management console port for the web server", () => { expect(env.port).toBe(3038); } finally { if (originalWebPort === undefined) { - delete process.env.AIOS_WEB_PORT; + delete process.env.DA_WEB_PORT; } else { - process.env.AIOS_WEB_PORT = originalWebPort; + process.env.DA_WEB_PORT = originalWebPort; } if (originalManagementPort === undefined) { - delete process.env.AIOS_MANAGEMENT_CONSOLE_PORT; + delete process.env.DA_MANAGEMENT_CONSOLE_PORT; } else { - process.env.AIOS_MANAGEMENT_CONSOLE_PORT = originalManagementPort; + process.env.DA_MANAGEMENT_CONSOLE_PORT = originalManagementPort; } if (originalNodePort === undefined) { diff --git a/packages/aios-management-web/server/test/external-service.test.js b/packages/daedalus-agent-management-web/server/test/external-service.test.js similarity index 89% rename from packages/aios-management-web/server/test/external-service.test.js rename to packages/daedalus-agent-management-web/server/test/external-service.test.js index dc1a8fa04a16592184a1c3513ad146a609dc8d8e..8d097b3e2e898e2f1b34c567c9f59720ebf28e0c 100644 --- a/packages/aios-management-web/server/test/external-service.test.js +++ b/packages/daedalus-agent-management-web/server/test/external-service.test.js @@ -15,24 +15,24 @@ function createDb() { remote_state_json TEXT NOT NULL DEFAULT '{}' ); - CREATE TABLE aios_users ( + CREATE TABLE agent_users ( id INTEGER PRIMARY KEY, username TEXT NOT NULL UNIQUE ); CREATE TABLE agent_permissions ( agent_id INTEGER NOT NULL, - aios_user_id INTEGER NOT NULL, - PRIMARY KEY (agent_id, aios_user_id) + agent_user_id INTEGER NOT NULL, + PRIMARY KEY (agent_id, agent_user_id) ); CREATE TABLE external_sessions ( session_id TEXT PRIMARY KEY, - aios_user_id INTEGER NOT NULL, + agent_user_id INTEGER NOT NULL, agent_id INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, - UNIQUE (aios_user_id, agent_id) + UNIQUE (agent_user_id, agent_id) ); CREATE TABLE external_session_cookies ( @@ -60,16 +60,16 @@ function createDb() { updated_at TEXT NOT NULL DEFAULT '2026-05-26T00:00:00.000Z' ); - INSERT INTO aios_users (id, username) VALUES (1, 'zhangsan'); + INSERT INTO agent_users (id, username) VALUES (1, 'zhangsan'); INSERT INTO agents (id, slug, agent_name, status, remote_state_json) VALUES ( 1, 'agent-a', 'Agent Alpha', 'normal', - '{"inboundTopic":"aios/agent-a/inbound","outboundTopic":"aios/agent-a/outbound"}' + '{"inboundTopic":"daedalus-agent/agent-a/inbound","outboundTopic":"daedalus-agent/agent-a/outbound"}' ); - INSERT INTO agent_permissions (agent_id, aios_user_id) VALUES (1, 1); + INSERT INTO agent_permissions (agent_id, agent_user_id) VALUES (1, 1); INSERT INTO business_systems ( id, provider, application_name, scheme, host, port, status ) VALUES (1, 'hzg', 'crm-app', 'https', 'example.com', 443, 'active'); @@ -133,8 +133,8 @@ it("creates and reuses external session ids per user-agent pair and returns topi expect(first).toEqual(jasmine.objectContaining({ sessionId: jasmine.stringMatching(/^s-[1-9]{30}$/), - inboundTopic: "aios/agent-a/inbound", - outboundTopic: "aios/agent-a/outbound" + inboundTopic: "daedalus-agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent-a/outbound" })); expect(second).toEqual(first); expect(auditWrites.length).toBe(1); @@ -149,8 +149,8 @@ it("returns topics from catalog snapshot shaped remote state", () => { WHERE slug = ? `).run(JSON.stringify({ topics: { - inbound: "aios/catalog-agent/inbound", - outbound: "aios/catalog-agent/outbound" + inbound: "daedalus-agent/catalog-agent/inbound", + outbound: "daedalus-agent/catalog-agent/outbound" } }), "agent-a"); const service = createService(db); @@ -162,12 +162,12 @@ it("returns topics from catalog snapshot shaped remote state", () => { const context = service.getContext(session.sessionId); expect(session).toEqual(jasmine.objectContaining({ - inboundTopic: "aios/catalog-agent/inbound", - outboundTopic: "aios/catalog-agent/outbound" + inboundTopic: "daedalus-agent/catalog-agent/inbound", + outboundTopic: "daedalus-agent/catalog-agent/outbound" })); expect(context).toEqual(jasmine.objectContaining({ - inboundTopic: "aios/catalog-agent/inbound", - outboundTopic: "aios/catalog-agent/outbound" + inboundTopic: "daedalus-agent/catalog-agent/inbound", + outboundTopic: "daedalus-agent/catalog-agent/outbound" })); }); @@ -291,8 +291,8 @@ it("updates stored caller cookie when the session already exists", async () => { }); expect(second.sessionId).toBe(first.sessionId); - expect(second.inboundTopic).toBe("aios/agent-a/inbound"); - expect(second.outboundTopic).toBe("aios/agent-a/outbound"); + expect(second.inboundTopic).toBe("daedalus-agent/agent-a/inbound"); + expect(second.outboundTopic).toBe("daedalus-agent/agent-a/outbound"); const stored = db.prepare(` SELECT cookie @@ -305,7 +305,7 @@ it("updates stored caller cookie when the session already exists", async () => { it("loads cached cookie and lazily creates missing hzg cookie", async () => { const db = createDb(); db.prepare(` - INSERT INTO external_sessions (session_id, aios_user_id, agent_id, created_at, updated_at) + INSERT INTO external_sessions (session_id, agent_user_id, agent_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?) `).run("s-1", 1, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T00:00:00.000Z"); @@ -334,7 +334,7 @@ it("loads cached cookie and lazily creates missing hzg cookie", async () => { it("loads external context from session and agent records", async () => { const db = createDb(); db.prepare(` - INSERT INTO external_sessions (session_id, aios_user_id, agent_id, created_at, updated_at) + INSERT INTO external_sessions (session_id, agent_user_id, agent_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?) `).run("s-context", 1, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T00:00:00.000Z"); @@ -342,8 +342,8 @@ it("loads external context from session and agent records", async () => { const context = service.getContext("s-context"); expect(context).toEqual({ - inboundTopic: "aios/agent-a/inbound", - outboundTopic: "aios/agent-a/outbound", + inboundTopic: "daedalus-agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent-a/outbound", agentName: "Agent Alpha", agentId: "agent-a", userName: "zhangsan" @@ -360,7 +360,7 @@ it("throws not found when external context session does not exist", () => { it("records external invocation using session-bound agent and resolved business system", async () => { const db = createDb(); db.prepare(` - INSERT INTO external_sessions (session_id, aios_user_id, agent_id, created_at, updated_at) + INSERT INTO external_sessions (session_id, agent_user_id, agent_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?) `).run("s-2", 1, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T00:00:00.000Z"); diff --git a/packages/aios-management-web/server/test/hzg-provider-client.test.js b/packages/daedalus-agent-management-web/server/test/hzg-provider-client.test.js similarity index 100% rename from packages/aios-management-web/server/test/hzg-provider-client.test.js rename to packages/daedalus-agent-management-web/server/test/hzg-provider-client.test.js diff --git a/packages/aios-management-web/server/test/internal-auth-middleware.test.js b/packages/daedalus-agent-management-web/server/test/internal-auth-middleware.test.js similarity index 100% rename from packages/aios-management-web/server/test/internal-auth-middleware.test.js rename to packages/daedalus-agent-management-web/server/test/internal-auth-middleware.test.js diff --git a/packages/aios-management-web/server/test/large-language-model-route.test.js b/packages/daedalus-agent-management-web/server/test/large-language-model-route.test.js similarity index 96% rename from packages/aios-management-web/server/test/large-language-model-route.test.js rename to packages/daedalus-agent-management-web/server/test/large-language-model-route.test.js index 1b391729393b1ff2f91b405d8f2a2cd601c6bec5..c9109abdb7a5f51dc52919c3fac6918788a27596 100644 --- a/packages/aios-management-web/server/test/large-language-model-route.test.js +++ b/packages/daedalus-agent-management-web/server/test/large-language-model-route.test.js @@ -60,8 +60,8 @@ it("passes encoded model id through a single decode step", async () => { getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} @@ -119,8 +119,8 @@ it("routes model test requests with encoded model id", async () => { getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} diff --git a/packages/aios-management-web/server/test/large-language-model-service.test.js b/packages/daedalus-agent-management-web/server/test/large-language-model-service.test.js similarity index 100% rename from packages/aios-management-web/server/test/large-language-model-service.test.js rename to packages/daedalus-agent-management-web/server/test/large-language-model-service.test.js diff --git a/packages/aios-management-web/server/test/management-action-client.test.js b/packages/daedalus-agent-management-web/server/test/management-action-client.test.js similarity index 100% rename from packages/aios-management-web/server/test/management-action-client.test.js rename to packages/daedalus-agent-management-web/server/test/management-action-client.test.js diff --git a/packages/aios-management-web/server/test/portal-service-access-tokens.test.js b/packages/daedalus-agent-management-web/server/test/portal-service-access-tokens.test.js similarity index 100% rename from packages/aios-management-web/server/test/portal-service-access-tokens.test.js rename to packages/daedalus-agent-management-web/server/test/portal-service-access-tokens.test.js diff --git a/packages/aios-management-web/server/test/portal-service-alignment.test.js b/packages/daedalus-agent-management-web/server/test/portal-service-alignment.test.js similarity index 90% rename from packages/aios-management-web/server/test/portal-service-alignment.test.js rename to packages/daedalus-agent-management-web/server/test/portal-service-alignment.test.js index f384ac470f1a751d2506c032cd8039924b8c0f96..4d845303cd42b58364474c5a3a4ad69a81cf3279 100644 --- a/packages/aios-management-web/server/test/portal-service-alignment.test.js +++ b/packages/daedalus-agent-management-web/server/test/portal-service-alignment.test.js @@ -4,8 +4,8 @@ import path from "node:path"; import { DatabaseSync } from "node:sqlite"; import AdmZip from "adm-zip"; -const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-portal-test-")); -process.env.AIOS_WEB_DATA_DIR = dataDir; +const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-portal-test-")); +process.env.DA_WEB_DATA_DIR = dataDir; const { PortalService } = await import("../src/services/portal-service.js"); function createDb() { @@ -44,23 +44,23 @@ function createVersionDb() { } function withPackageVersionEnv({ webPackagePath, invokePackagePath }, fn) { - const previousWebPackagePath = process.env.AIOS_WEB_PACKAGE_JSON; - const previousInvokePackagePath = process.env.AIOS_APPS_INVOKE_CLI_PACKAGE_JSON; - process.env.AIOS_WEB_PACKAGE_JSON = webPackagePath; - process.env.AIOS_APPS_INVOKE_CLI_PACKAGE_JSON = invokePackagePath; + const previousWebPackagePath = process.env.DA_WEB_PACKAGE_JSON; + const previousInvokePackagePath = process.env.DA_APPS_INVOKE_CLI_PACKAGE_JSON; + process.env.DA_WEB_PACKAGE_JSON = webPackagePath; + process.env.DA_APPS_INVOKE_CLI_PACKAGE_JSON = invokePackagePath; try { return fn(); } finally { if (previousWebPackagePath === undefined) { - delete process.env.AIOS_WEB_PACKAGE_JSON; + delete process.env.DA_WEB_PACKAGE_JSON; } else { - process.env.AIOS_WEB_PACKAGE_JSON = previousWebPackagePath; + process.env.DA_WEB_PACKAGE_JSON = previousWebPackagePath; } if (previousInvokePackagePath === undefined) { - delete process.env.AIOS_APPS_INVOKE_CLI_PACKAGE_JSON; + delete process.env.DA_APPS_INVOKE_CLI_PACKAGE_JSON; } else { - process.env.AIOS_APPS_INVOKE_CLI_PACKAGE_JSON = previousInvokePackagePath; + process.env.DA_APPS_INVOKE_CLI_PACKAGE_JSON = previousInvokePackagePath; } } } @@ -181,7 +181,7 @@ it("returns component version info from the in-memory cache", () => { authService: {} }); service.writeVersionInfoCache([ - { group: "runtime", name: "aios-mqtt-channel", package_name: "aios-mqtt-channel", version: "0.1.0" } + { group: "runtime", name: "daedalus-agent-mqtt-channel", package_name: "daedalus-agent-mqtt-channel", version: "0.1.0" } ], "management-actions"); const versionInfo = service.getVersionInfo(); @@ -189,8 +189,8 @@ it("returns component version info from the in-memory cache", () => { expect(service.getVersionInfo().items).toEqual([{ group: "runtime", - name: "aios-mqtt-channel", - package_name: "aios-mqtt-channel", + name: "daedalus-agent-mqtt-channel", + package_name: "daedalus-agent-mqtt-channel", version: "0.1.0", status: "unknown", status_message: "", @@ -199,8 +199,8 @@ it("returns component version info from the in-memory cache", () => { }]); expect(versionInfo.items).toEqual([{ group: "runtime", - name: "aios-mqtt-channel", - package_name: "aios-mqtt-channel", + name: "daedalus-agent-mqtt-channel", + package_name: "daedalus-agent-mqtt-channel", version: "mutated", status: "unknown", status_message: "", @@ -210,15 +210,15 @@ it("returns component version info from the in-memory cache", () => { }); it("reads local app versions from configured package metadata paths", () => { - const packageRoot = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-version-packages-")); + const packageRoot = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-version-packages-")); const webPackagePath = path.join(packageRoot, "web-package.json"); const invokePackagePath = path.join(packageRoot, "invoke-package.json"); fs.writeFileSync(webPackagePath, JSON.stringify({ - name: "aios-management-web", + name: "daedalus-agent-management-web", version: "9.8.7" }), "utf8"); fs.writeFileSync(invokePackagePath, JSON.stringify({ - name: "aios-apps-invoke-cli", + name: "daedalus-agent-apps-invoke-cli", version: "6.5.4" }), "utf8"); @@ -233,16 +233,16 @@ it("reads local app versions from configured package metadata paths", () => { expect(service.localVersionItems()).toEqual([ { group: "runtime", - name: "aios-management-web", - package_name: "aios-management-web", + name: "daedalus-agent-management-web", + package_name: "daedalus-agent-management-web", version: "9.8.7", status: "normal", status_message: "管理控制台正常" }, { group: "runtime", - name: "aios-apps-invoke-cli", - package_name: "aios-apps-invoke-cli", + name: "daedalus-agent-apps-invoke-cli", + package_name: "daedalus-agent-apps-invoke-cli", version: "6.5.4", status: "unknown", status_message: "状态未采集" @@ -252,15 +252,15 @@ it("reads local app versions from configured package metadata paths", () => { }); it("loads local package versions once and then serves them from memory", () => { - const packageRoot = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-version-cache-")); + const packageRoot = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-version-cache-")); const webPackagePath = path.join(packageRoot, "web-package.json"); const invokePackagePath = path.join(packageRoot, "invoke-package.json"); fs.writeFileSync(webPackagePath, JSON.stringify({ - name: "aios-management-web", + name: "daedalus-agent-management-web", version: "1.0.0" }), "utf8"); fs.writeFileSync(invokePackagePath, JSON.stringify({ - name: "aios-apps-invoke-cli", + name: "daedalus-agent-apps-invoke-cli", version: "2.0.0" }), "utf8"); @@ -274,11 +274,11 @@ it("loads local package versions once and then serves them from memory", () => { const initial = service.cacheLocalVersionInfo(); fs.writeFileSync(webPackagePath, JSON.stringify({ - name: "aios-management-web", + name: "daedalus-agent-management-web", version: "9.9.9" }), "utf8"); fs.writeFileSync(invokePackagePath, JSON.stringify({ - name: "aios-apps-invoke-cli", + name: "daedalus-agent-apps-invoke-cli", version: "8.8.8" }), "utf8"); @@ -306,8 +306,8 @@ it("refreshes component version cache from local runtime packages and management return { version: 1, items: [ - { group: "runtime", name: "aios-apps-invoke-cli", packageName: "aios-apps-invoke-cli", version: "0.0.1", status: "normal", statusMessage: "调用服务正常运行" }, - { group: "runtime", name: "aios-mqtt-channel", packageName: "aios-mqtt-channel", version: "0.1.0", status: "normal", statusMessage: "插件已被内核加载" }, + { group: "runtime", name: "daedalus-agent-apps-invoke-cli", packageName: "daedalus-agent-apps-invoke-cli", version: "0.0.1", status: "normal", statusMessage: "调用服务正常运行" }, + { group: "runtime", name: "daedalus-agent-mqtt-channel", packageName: "daedalus-agent-mqtt-channel", version: "0.1.0", status: "normal", statusMessage: "插件已被内核加载" }, { group: "runtime", name: "core", packageName: "openclaw", version: "test-core-version", status: "normal", statusMessage: "内核状态正常" } ] }; @@ -325,28 +325,28 @@ it("refreshes component version cache from local runtime packages and management timeoutMs: 1234 }]); expect(versionInfo.items.map((item) => item.name)).toEqual([ - "aios-management-web", - "aios-apps-invoke-cli", - "aios-mqtt-channel", + "daedalus-agent-management-web", + "daedalus-agent-apps-invoke-cli", + "daedalus-agent-mqtt-channel", "core" ]); expect(versionInfo.items.filter((item) => item.source === "local").map((item) => ({ group: item.group, package_name: item.package_name }))).toEqual([ - { group: "runtime", package_name: "aios-management-web" } + { group: "runtime", package_name: "daedalus-agent-management-web" } ]); expect(versionInfo.items.filter((item) => item.source === "management-actions").map((item) => ({ group: item.group, package_name: item.package_name }))).toEqual([ - { group: "runtime", package_name: "aios-apps-invoke-cli" }, - { group: "runtime", package_name: "aios-mqtt-channel" }, + { group: "runtime", package_name: "daedalus-agent-apps-invoke-cli" }, + { group: "runtime", package_name: "daedalus-agent-mqtt-channel" }, { group: "runtime", package_name: "openclaw" } ]); expect(versionInfo.items.find((item) => item.name === "core")?.package_name).toBe("openclaw"); - expect(versionInfo.items.find((item) => item.package_name === "aios-management-web")?.status).toBe("normal"); - expect(versionInfo.items.find((item) => item.package_name === "aios-apps-invoke-cli")?.status).toBe("normal"); + expect(versionInfo.items.find((item) => item.package_name === "daedalus-agent-management-web")?.status).toBe("normal"); + expect(versionInfo.items.find((item) => item.package_name === "daedalus-agent-apps-invoke-cli")?.status).toBe("normal"); }); it("loads runtime versions once after management action runtime is ready", async () => { @@ -399,9 +399,9 @@ it("updates portal settings without touching uploaded logo data", () => { const calls = []; let settings = { id: 1, - portal_name: "数字员工控制台", - brand_subtitle: "Your Company Name", - theme_color: "#07c160", + portal_name: "daedalus-agent", + brand_subtitle: "智能体管理与运营平台", + theme_color: "#a5522d", logo_mime_type: "image/png", has_logo: true, created_at: "2026-05-26T00:00:00.000Z", @@ -447,9 +447,9 @@ it("updates and clears uploaded portal logo", () => { const calls = []; let settings = { id: 1, - portal_name: "数字员工控制台", - brand_subtitle: "Your Company Name", - theme_color: "#07c160", + portal_name: "daedalus-agent", + brand_subtitle: "智能体管理与运营平台", + theme_color: "#a5522d", logo_mime_type: "", has_logo: false, created_at: "2026-05-26T00:00:00.000Z", @@ -502,7 +502,7 @@ it("updates and clears uploaded portal logo", () => { expect(calls.length).toBe(2); }); -it("lists aios skills first and sorts each group alphabetically", () => { +it("lists built-in product skills first and sorts each group alphabetically", () => { const db = new DatabaseSync(":memory:"); db.exec(` CREATE TABLE users ( @@ -545,9 +545,9 @@ it("lists aios skills first and sorts each group alphabetically", () => { ) VALUES (?, ?, '', ?, 'installed', ?, ?, ?) `); insert.run(1, "pdf", null, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T04:00:00.000Z"); - insert.run(2, "aios-transfer-file", null, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T03:00:00.000Z"); + insert.run(2, "daedalus-agent-transfer-file", null, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T03:00:00.000Z"); insert.run(3, "browser", 1, 0, "2026-05-26T00:00:00.000Z", "2026-05-26T02:00:00.000Z"); - insert.run(4, "aios-call-app-service", 1, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T01:00:00.000Z"); + insert.run(4, "daedalus-agent-call-app-service", 1, 1, "2026-05-26T00:00:00.000Z", "2026-05-26T01:00:00.000Z"); const service = new PortalService({ db, objectStorage: {}, @@ -556,8 +556,8 @@ it("lists aios skills first and sorts each group alphabetically", () => { }); expect(service.listSkills().map((item) => item.slug)).toEqual([ - "aios-call-app-service", - "aios-transfer-file", + "daedalus-agent-call-app-service", + "daedalus-agent-transfer-file", "browser", "pdf" ]); @@ -566,7 +566,7 @@ it("lists aios skills first and sorts each group alphabetically", () => { expect(browserSkill.uploader_username).toBe("admin"); expect(browserSkill.uploader_display_name).toBe("管理员"); expect(browserSkill.uploaded_at).toBe("2026-05-26T01:30:00.000Z"); - const builtInSkill = service.listSkills().find((item) => item.slug === "aios-call-app-service"); + const builtInSkill = service.listSkills().find((item) => item.slug === "daedalus-agent-call-app-service"); expect(builtInSkill.uploader_username).toBeNull(); expect(builtInSkill.uploader_display_name).toBeNull(); expect(builtInSkill.uploaded_at).toBeNull(); diff --git a/packages/aios-management-web/server/test/portal-service-management-logs.test.js b/packages/daedalus-agent-management-web/server/test/portal-service-management-logs.test.js similarity index 95% rename from packages/aios-management-web/server/test/portal-service-management-logs.test.js rename to packages/daedalus-agent-management-web/server/test/portal-service-management-logs.test.js index b494aecced9630fd16a8823cb239397ba096f956..323e72be5544d3eb7dbddc2eeda0fd4db9468e7b 100644 --- a/packages/aios-management-web/server/test/portal-service-management-logs.test.js +++ b/packages/daedalus-agent-management-web/server/test/portal-service-management-logs.test.js @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-portal-test-")); -process.env.AIOS_WEB_DATA_DIR = dataDir; +const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-portal-test-")); +process.env.DA_WEB_DATA_DIR = dataDir; const { PortalService } = await import("../src/services/portal-service.js"); function createDb(rows) { diff --git a/packages/aios-management-web/server/test/runtime-component-health-service.test.js b/packages/daedalus-agent-management-web/server/test/runtime-component-health-service.test.js similarity index 100% rename from packages/aios-management-web/server/test/runtime-component-health-service.test.js rename to packages/daedalus-agent-management-web/server/test/runtime-component-health-service.test.js diff --git a/packages/aios-management-web/server/test/runtime-env-config-service.test.js b/packages/daedalus-agent-management-web/server/test/runtime-env-config-service.test.js similarity index 79% rename from packages/aios-management-web/server/test/runtime-env-config-service.test.js rename to packages/daedalus-agent-management-web/server/test/runtime-env-config-service.test.js index 853408de44481564095a7ee73693a66f9ee71509..fffe0973bdfbe5ae9ea7b8517a1377b17491e61a 100644 --- a/packages/aios-management-web/server/test/runtime-env-config-service.test.js +++ b/packages/daedalus-agent-management-web/server/test/runtime-env-config-service.test.js @@ -6,15 +6,15 @@ import { ContainerService } from "../src/services/container-service.js"; import { RuntimeEnvConfigService } from "../src/services/runtime-env-config-service.js"; function createTempDir() { - return fs.mkdtempSync(path.join(os.tmpdir(), "aios-env-config-")); + return fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-env-config-")); } it("reads the agent internal network allowlist from env.json", () => { const tempDir = createTempDir(); const envPath = path.join(tempDir, "env.json"); fs.writeFileSync(envPath, JSON.stringify({ - AIOS_MANAGEMENT_CONSOLE_PORT: 3030, - AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST: "192.168.1.10,10.20.0.0/16" + DA_MANAGEMENT_CONSOLE_PORT: 3030, + DA_INTERNAL_NETWORK_ALLOWLIST: "192.168.1.10,10.20.0.0/16" }, null, 2)); try { @@ -33,9 +33,9 @@ it("updates the agent internal network allowlist without dropping other env.json const tempDir = createTempDir(); const envPath = path.join(tempDir, "env.json"); fs.writeFileSync(envPath, JSON.stringify({ - AIOS_MANAGEMENT_CONSOLE_PORT: 3030, - AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT: 16, - AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST: "" + DA_MANAGEMENT_CONSOLE_PORT: 3030, + DA_OPENCLAW_GATEWAY_MAX_CONCURRENT: 16, + DA_INTERNAL_NETWORK_ALLOWLIST: "" }, null, 2)); try { @@ -50,9 +50,9 @@ it("updates the agent internal network allowlist without dropping other env.json huozige_server_ip: "" }); expect(saved).toEqual({ - AIOS_MANAGEMENT_CONSOLE_PORT: 3030, - AIOS_OPENCLAW_GATEWAY_MAX_CONCURRENT: 16, - AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST: "192.168.1.10 ; 10.20.0.0/16" + DA_MANAGEMENT_CONSOLE_PORT: 3030, + DA_OPENCLAW_GATEWAY_MAX_CONCURRENT: 16, + DA_INTERNAL_NETWORK_ALLOWLIST: "192.168.1.10 ; 10.20.0.0/16" }); } finally { fs.rmSync(tempDir, { recursive: true, force: true }); @@ -63,9 +63,9 @@ it("updates the huozige server ip and replaces it in the allowlist", () => { const tempDir = createTempDir(); const envPath = path.join(tempDir, "env.json"); fs.writeFileSync(envPath, JSON.stringify({ - AIOS_MANAGEMENT_CONSOLE_PORT: 3030, - AIOS_HUOZIGE_SERVER_IP: "192.168.1.10", - AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST: "10.0.0.2,192.168.1.10;10.20.0.0/16" + DA_MANAGEMENT_CONSOLE_PORT: 3030, + DA_HUOZIGE_SERVER_IP: "192.168.1.10", + DA_INTERNAL_NETWORK_ALLOWLIST: "10.0.0.2,192.168.1.10;10.20.0.0/16" }, null, 2)); try { @@ -80,9 +80,9 @@ it("updates the huozige server ip and replaces it in the allowlist", () => { huozige_server_ip: "192.168.1.11" }); expect(saved).toEqual({ - AIOS_MANAGEMENT_CONSOLE_PORT: 3030, - AIOS_HUOZIGE_SERVER_IP: "192.168.1.11", - AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST: "10.0.0.2,10.20.0.0/16,192.168.1.11" + DA_MANAGEMENT_CONSOLE_PORT: 3030, + DA_HUOZIGE_SERVER_IP: "192.168.1.11", + DA_INTERNAL_NETWORK_ALLOWLIST: "10.0.0.2,10.20.0.0/16,192.168.1.11" }); } finally { fs.rmSync(tempDir, { recursive: true, force: true }); @@ -127,11 +127,11 @@ it("writes a container restart request file", () => { containerRestartRequestPath: restartRequestPath } }); - const result = service.requestRestart({ requestedBy: "aios" }); + const result = service.requestRestart({ requestedBy: "daedalus-agent" }); const saved = JSON.parse(fs.readFileSync(restartRequestPath, "utf8")); expect(result.requested).toBeTrue(); - expect(saved.requested_by).toBe("aios"); + expect(saved.requested_by).toBe("daedalus-agent"); expect(saved.requested_at).toBe(result.requested_at); } finally { fs.rmSync(tempDir, { recursive: true, force: true }); diff --git a/packages/aios-management-web/server/test/runtime-settings-route.test.js b/packages/daedalus-agent-management-web/server/test/runtime-settings-route.test.js similarity index 97% rename from packages/aios-management-web/server/test/runtime-settings-route.test.js rename to packages/daedalus-agent-management-web/server/test/runtime-settings-route.test.js index a9599929ec4fb0c1cdb62bd1b9c25ab2b534310f..df53c018df6162fc9368bc161ed4970088811635 100644 --- a/packages/aios-management-web/server/test/runtime-settings-route.test.js +++ b/packages/daedalus-agent-management-web/server/test/runtime-settings-route.test.js @@ -57,8 +57,8 @@ function createBaseServices(overrides = {}) { getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} @@ -174,9 +174,9 @@ it("updates the env allowlist config and writes an audit log", async () => { expect(updates).toEqual([{ agent_internal_network_allowlist: "10.20.0.0/16" }]); expect(auditWrites).toEqual([{ userId: 1, - username: "aios", + username: "daedalus-agent", action: "保存 IP 白名单", - detail: "更新 env.json 中的 AIOS_AGENT_INTERNAL_NETWORK_ALLOWLIST / AIOS_HUOZIGE_SERVER_IP" + detail: "更新 env.json 中的 DA_INTERNAL_NETWORK_ALLOWLIST / DA_HUOZIGE_SERVER_IP" }]); } finally { await close(server); @@ -323,7 +323,7 @@ it("requests a container restart without calling the gateway restart action", as expect(actionCalls).toEqual([]); expect(auditWrites).toEqual([{ userId: 1, - username: "aios", + username: "daedalus-agent", action: "重启容器", detail: "手动触发容器重启" }]); diff --git a/packages/aios-management-web/server/test/server-restart-polling.test.js b/packages/daedalus-agent-management-web/server/test/server-restart-polling.test.js similarity index 100% rename from packages/aios-management-web/server/test/server-restart-polling.test.js rename to packages/daedalus-agent-management-web/server/test/server-restart-polling.test.js diff --git a/packages/aios-management-web/server/test/server-restart-route.test.js b/packages/daedalus-agent-management-web/server/test/server-restart-route.test.js similarity index 95% rename from packages/aios-management-web/server/test/server-restart-route.test.js rename to packages/daedalus-agent-management-web/server/test/server-restart-route.test.js index fc07d54aa6f4c998c79ad6325a710f9a4c8702df..32ebc30dcf21ea04abbeed38a5f54d50945d513e 100644 --- a/packages/aios-management-web/server/test/server-restart-route.test.js +++ b/packages/daedalus-agent-management-web/server/test/server-restart-route.test.js @@ -61,8 +61,8 @@ it("sends server restart as a notify request without waiting for restart complet getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} @@ -113,7 +113,7 @@ it("sends server restart as a notify request without waiting for restart complet ]); expect(auditWrites).toEqual([{ userId: 1, - username: "aios", + username: "daedalus-agent", action: "重启服务", detail: "手动触发 gateway.restart" }]); @@ -132,8 +132,8 @@ it("checks server status with short timeout without writing audit logs during po getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} @@ -190,8 +190,8 @@ it("executes management command with requested timeout", async () => { getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} diff --git a/packages/aios-management-web/server/test/service-api-auth-middleware.test.js b/packages/daedalus-agent-management-web/server/test/service-api-auth-middleware.test.js similarity index 100% rename from packages/aios-management-web/server/test/service-api-auth-middleware.test.js rename to packages/daedalus-agent-management-web/server/test/service-api-auth-middleware.test.js diff --git a/packages/aios-management-web/server/test/startup-sync-gate.test.js b/packages/daedalus-agent-management-web/server/test/startup-sync-gate.test.js similarity index 100% rename from packages/aios-management-web/server/test/startup-sync-gate.test.js rename to packages/daedalus-agent-management-web/server/test/startup-sync-gate.test.js diff --git a/packages/aios-management-web/server/test/system-log-file-download-route.test.js b/packages/daedalus-agent-management-web/server/test/system-log-file-download-route.test.js similarity index 87% rename from packages/aios-management-web/server/test/system-log-file-download-route.test.js rename to packages/daedalus-agent-management-web/server/test/system-log-file-download-route.test.js index 4dfff4ca9cc4707c1e4e7fab028fa153b373c34f..fc1019a0f590bc0e17c542881dc8740871dba8e2 100644 --- a/packages/aios-management-web/server/test/system-log-file-download-route.test.js +++ b/packages/daedalus-agent-management-web/server/test/system-log-file-download-route.test.js @@ -60,8 +60,8 @@ function createBaseServices(logDir) { getLocalApiUser() { return { id: 1, - username: "aios", - role: "aios-admin" + username: "daedalus-agent", + role: "daedalus-admin" }; }, assertAdmin() {} @@ -87,7 +87,7 @@ function useJsonErrorHandler(app) { } it("downloads an existing whitelisted system log file", async () => { - const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-system-log-download-")); + const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-system-log-download-")); const filePath = path.join(logDir, "kernel-20260701.log"); fs.writeFileSync(filePath, "kernel log line\n", "utf8"); @@ -113,8 +113,8 @@ it("downloads an existing whitelisted system log file", async () => { }); it("downloads the mqtt chat interaction log file", async () => { - const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-system-chat-log-download-")); - const filePath = path.join(logDir, "aios-mqtt-channel-chat-20260701.log"); + const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-system-chat-log-download-")); + const filePath = path.join(logDir, "daedalus-agent-mqtt-channel-chat-20260701.log"); fs.writeFileSync(filePath, "chat interaction line\n", "utf8"); const app = express(); @@ -126,12 +126,12 @@ it("downloads the mqtt chat interaction log file", async () => { try { const address = server.address(); const response = await requestRaw( - `http://127.0.0.1:${address.port}/api/system-logs/download?type=aios-mqtt-channel-chat&date=2026-07-01` + `http://127.0.0.1:${address.port}/api/system-logs/download?type=daedalus-agent-mqtt-channel-chat&date=2026-07-01` ); expect(response.status).toBe(200); expect(response.body.toString("utf8")).toBe("chat interaction line\n"); - expect(String(response.headers["content-disposition"])).toContain("aios-mqtt-channel-chat-20260701.log"); + expect(String(response.headers["content-disposition"])).toContain("daedalus-agent-mqtt-channel-chat-20260701.log"); } finally { await close(server); fs.rmSync(logDir, { recursive: true, force: true }); @@ -139,7 +139,7 @@ it("downloads the mqtt chat interaction log file", async () => { }); it("returns not found when the selected system log file does not exist", async () => { - const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-system-log-missing-")); + const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-system-log-missing-")); const app = express(); app.use(express.json()); app.use("/api", createRoutes(createBaseServices(logDir))); @@ -161,7 +161,7 @@ it("returns not found when the selected system log file does not exist", async ( }); it("rejects unsupported system log types", async () => { - const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-system-log-invalid-")); + const logDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-system-log-invalid-")); const app = express(); app.use(express.json()); app.use("/api", createRoutes(createBaseServices(logDir))); diff --git a/packages/aios-management-web/server/test/system-service-alignment.test.js b/packages/daedalus-agent-management-web/server/test/system-service-alignment.test.js similarity index 95% rename from packages/aios-management-web/server/test/system-service-alignment.test.js rename to packages/daedalus-agent-management-web/server/test/system-service-alignment.test.js index 01406e2f47b5868d65a1677e1eccc607f9cd4e4c..afba27ca556de13c40a5e2da2db03b1b8f546ac1 100644 --- a/packages/aios-management-web/server/test/system-service-alignment.test.js +++ b/packages/daedalus-agent-management-web/server/test/system-service-alignment.test.js @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-web-system-test-")); -process.env.AIOS_WEB_DATA_DIR = dataDir; +const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-web-system-test-")); +process.env.DA_WEB_DATA_DIR = dataDir; const { SystemService } = await import("../src/services/system-service.js"); function createDb({ currentSystem = null, createdSystem = null } = {}) { @@ -262,8 +262,8 @@ it("rejects deleting built-in ontology systems", async () => { expect(actionCalls).toEqual([]); }); -it("stores invocation payload files under AIOS data logs invoke date folders", async () => { - const invokeDataDir = fs.mkdtempSync(path.join(os.tmpdir(), "aios-data-invoke-test-")); +it("stores invocation payload files under DAEDALUS_AGENT data logs invoke date folders", async () => { + const invokeDataDir = fs.mkdtempSync(path.join(os.tmpdir(), "daedalus-agent-data-invoke-test-")); try { const artifactRows = []; const db = { @@ -303,7 +303,7 @@ it("stores invocation payload files under AIOS data logs invoke date folders", a db, objectStorage: {}, managementClient: { async call() {} }, - env: { aiosDataDir: invokeDataDir } + env: { productDataDir: invokeDataDir } }); const buffer = Buffer.from('{"ok":true}', "utf8"); @@ -320,7 +320,7 @@ it("stores invocation payload files under AIOS data logs invoke date folders", a createdAt: "2026-07-06T05:04:03.002+08:00" }); - expect(artifact.storage_bucket).toBe("aios-data"); + expect(artifact.storage_bucket).toBe("daedalus-agent-data"); expect(artifact.storage_object_key).toMatch(/^logs\/invoke\/20260706\/crm-app-20260706050403002-\d{6}\.log$/); const filePath = path.join(invokeDataDir, ...artifact.storage_object_key.split("/")); expect(fs.existsSync(filePath)).toBeTrue(); diff --git a/packages/aios-management-web/server/test/topic-ping-service.test.js b/packages/daedalus-agent-management-web/server/test/topic-ping-service.test.js similarity index 77% rename from packages/aios-management-web/server/test/topic-ping-service.test.js rename to packages/daedalus-agent-management-web/server/test/topic-ping-service.test.js index 98b06f25bb3bc0f5c1a8502ab4fd73e2845ff2c5..0137d03ac580a04fc08ce75d54edc6055c79e493 100644 --- a/packages/aios-management-web/server/test/topic-ping-service.test.js +++ b/packages/daedalus-agent-management-web/server/test/topic-ping-service.test.js @@ -50,10 +50,10 @@ it("pings admin topics and returns response time", async () => { brokerUrl: "mqtt://broker", username: "", password: "", - adminInboundTopic: "aios/admin/inbound", - adminOutboundTopic: "aios/admin/outbound", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + adminInboundTopic: "daedalus-agent/admin/inbound", + adminOutboundTopic: "daedalus-agent/admin/outbound", + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } }, mqttFactory: { @@ -67,11 +67,11 @@ it("pings admin topics and returns response time", async () => { const result = await service.pingAdmin(1000); expect(result.ok).toBe(true); - expect(result.inboundTopic).toBe("aios/admin/inbound"); - expect(result.outboundTopic).toBe("aios/admin/outbound"); + expect(result.inboundTopic).toBe("daedalus-agent/admin/inbound"); + expect(result.outboundTopic).toBe("daedalus-agent/admin/outbound"); expect(typeof result.responseTimeMs).toBe("number"); - expect(client.subscriptions).toEqual(["aios/admin/outbound"]); - expect(client.publications[0].topic).toBe("aios/admin/inbound"); + expect(client.subscriptions).toEqual(["daedalus-agent/admin/outbound"]); + expect(client.publications[0].topic).toBe("daedalus-agent/admin/inbound"); }); it("waits until agent ping succeeds", async () => { @@ -83,8 +83,8 @@ it("waits until agent ping succeeds", async () => { return { slug: "agent-a", remote_state_json: JSON.stringify({ - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound" + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound" }) }; } @@ -94,8 +94,8 @@ it("waits until agent ping succeeds", async () => { env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } } }); @@ -131,8 +131,8 @@ it("resolves agent topics from catalog snapshot shaped remote state", () => { slug: "agent-a", remote_state_json: JSON.stringify({ topics: { - inbound: "aios/catalog-agent/inbound", - outbound: "aios/catalog-agent/outbound" + inbound: "daedalus-agent/catalog-agent/inbound", + outbound: "daedalus-agent/catalog-agent/outbound" } }) }; @@ -143,15 +143,15 @@ it("resolves agent topics from catalog snapshot shaped remote state", () => { env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } } }); expect(service.resolveAgentTopics("agent-a")).toEqual(jasmine.objectContaining({ - inboundTopic: "aios/catalog-agent/inbound", - outboundTopic: "aios/catalog-agent/outbound" + inboundTopic: "daedalus-agent/catalog-agent/inbound", + outboundTopic: "daedalus-agent/catalog-agent/outbound" })); }); @@ -165,8 +165,8 @@ it("waits until agent runtime becomes active without pinging the model", async ( return { slug: "agent-a", remote_state_json: JSON.stringify({ - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound" + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound" }) }; } @@ -176,8 +176,8 @@ it("waits until agent runtime becomes active without pinging the model", async ( env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } }, managementClient: { @@ -210,8 +210,8 @@ it("waits until agent runtime becomes active without pinging the model", async ( }); expect(result.ok).toBe(true); - expect(result.inboundTopic).toBe("aios/agent/agent-a/inbound"); - expect(result.outboundTopic).toBe("aios/agent/agent-a/outbound"); + expect(result.inboundTopic).toBe("daedalus-agent/agent/agent-a/inbound"); + expect(result.outboundTopic).toBe("daedalus-agent/agent/agent-a/outbound"); expect(result.waitedMs).toEqual(jasmine.any(Number)); }); @@ -225,8 +225,8 @@ it("sends a single agent test message and returns MQTT payloads with timings", a return { slug: "agent-a", remote_state_json: JSON.stringify({ - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound" + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound" }) }; } @@ -236,8 +236,8 @@ it("sends a single agent test message and returns MQTT payloads with timings", a env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } }, mqttFactory: { @@ -266,10 +266,10 @@ it("sends a single agent test message and returns MQTT payloads with timings", a }); expect(result.ok).toBe(true); - expect(result.sentMessage.topic).toBe("aios/agent/agent-a/inbound"); + expect(result.sentMessage.topic).toBe("daedalus-agent/agent/agent-a/inbound"); expect(result.sentMessage.payload.text).toBe("hello"); expect(result.sentMessage.payload.disableBlockStreaming).toBe(false); - expect(result.replyMessage.topic).toBe("aios/agent/agent-a/outbound"); + expect(result.replyMessage.topic).toBe("daedalus-agent/agent/agent-a/outbound"); expect(result.replyMessage.payload.text).toBe("hello back"); expect(result.timings.connect_ms).toEqual(jasmine.any(Number)); expect(result.timings.subscribe_ms).toEqual(jasmine.any(Number)); @@ -288,8 +288,8 @@ it("returns an empty reply list when agent test fails before waiting for replies return { slug: "agent-a", remote_state_json: JSON.stringify({ - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound" + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound" }) }; } @@ -299,8 +299,8 @@ it("returns an empty reply list when agent test fails before waiting for replies env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } }, mqttFactory: { @@ -334,8 +334,8 @@ it("aggregates block replies when agent test allows block streaming", async () = return { slug: "agent-a", remote_state_json: JSON.stringify({ - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound" + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound" }) }; } @@ -345,8 +345,8 @@ it("aggregates block replies when agent test allows block streaming", async () = env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } }, mqttFactory: { @@ -404,8 +404,8 @@ it("returns accumulated block replies when final reply is not observed", async ( return { slug: "agent-a", remote_state_json: JSON.stringify({ - inboundTopic: "aios/agent/agent-a/inbound", - outboundTopic: "aios/agent/agent-a/outbound" + inboundTopic: "daedalus-agent/agent/agent-a/inbound", + outboundTopic: "daedalus-agent/agent/agent-a/outbound" }) }; } @@ -415,8 +415,8 @@ it("returns accumulated block replies when final reply is not observed", async ( env: { mqtt: { brokerUrl: "mqtt://broker", - agentInboundTopicTemplate: "aios/agent/{agentId}/inbound", - agentOutboundTopicTemplate: "aios/agent/{agentId}/outbound" + agentInboundTopicTemplate: "daedalus-agent/agent/{agentId}/inbound", + agentOutboundTopicTemplate: "daedalus-agent/agent/{agentId}/outbound" } }, mqttFactory: { diff --git a/packages/aios-management-web/server/test/update-notifier.test.js b/packages/daedalus-agent-management-web/server/test/update-notifier.test.js similarity index 93% rename from packages/aios-management-web/server/test/update-notifier.test.js rename to packages/daedalus-agent-management-web/server/test/update-notifier.test.js index a722d0f893c73a65a319433648b530765eb6e009..3f8c74e67605e18792f72204e7814e331465a06a 100644 --- a/packages/aios-management-web/server/test/update-notifier.test.js +++ b/packages/daedalus-agent-management-web/server/test/update-notifier.test.js @@ -57,15 +57,15 @@ it("authorizes websocket clients with a session token subprotocol", () => { authService: { getSessionUser(token) { calls.push(token); - return { id: 1, role: "aios-admin" }; + return { id: 1, role: "daedalus-admin" }; }, assertAdmin(user) { - expect(user.role).toBe("aios-admin"); + expect(user.role).toBe("daedalus-admin"); } } }); - const request = createUpgradeRequest({ protocol: "aios-updates, token.abc123" }); + const request = createUpgradeRequest({ protocol: "daedalus-agent-updates, token.abc123" }); const url = new URL("http://example.test/ws/updates"); expect(notifier.isAuthorized(request, url)).toBe(true); diff --git a/packages/aios-management-web/src/App.jsx b/packages/daedalus-agent-management-web/src/App.jsx similarity index 100% rename from packages/aios-management-web/src/App.jsx rename to packages/daedalus-agent-management-web/src/App.jsx diff --git a/packages/aios-management-web/src/api.js b/packages/daedalus-agent-management-web/src/api.js similarity index 100% rename from packages/aios-management-web/src/api.js rename to packages/daedalus-agent-management-web/src/api.js diff --git a/packages/aios-management-web/src/app/App.jsx b/packages/daedalus-agent-management-web/src/app/App.jsx similarity index 96% rename from packages/aios-management-web/src/app/App.jsx rename to packages/daedalus-agent-management-web/src/app/App.jsx index 225e33b9d7eef7a83ce675ffd278955aefa245a6..7e85fa66bec6992b05c17201d5f66314cab60220 100644 --- a/packages/aios-management-web/src/app/App.jsx +++ b/packages/daedalus-agent-management-web/src/app/App.jsx @@ -15,6 +15,7 @@ import { ConfigProvider, Form, Input, Modal, Spin, message } from "antd"; import zhCN from "antd/locale/zh_CN"; import { api, authTokenStore } from "./api-client.js"; +import { BRAND_NAME, BRAND_THEME_COLOR, DEFAULT_PORTAL_SETTINGS } from "../brand.js"; import { AppShell } from "../components/AppShell.jsx"; import { DigitalEmployeeIcon } from "../components/DigitalEmployeeIcon.jsx"; import { AgentsPage } from "../pages/AgentsPage.jsx"; @@ -33,13 +34,7 @@ import { } from "../utils/startupSyncGate.js"; import { waitForGatewayRestart } from "../utils/serverRestartPolling.js"; -const DEFAULT_THEME_COLOR = "#07c160"; -const DEFAULT_PORTAL_SETTINGS = { - portal_name: "数字员工控制台", - brand_subtitle: "Your Company Name", - theme_color: DEFAULT_THEME_COLOR, - has_logo: false -}; +const DEFAULT_THEME_COLOR = BRAND_THEME_COLOR; function buildLogoSrc(settings) { return settings?.has_logo ? `/api/portal/logo?t=${encodeURIComponent(settings.updated_at || Date.now())}` : ""; @@ -322,7 +317,7 @@ export default function App() { return; } - socket = new WebSocket(buildRealtimeUrl(), ["aios-updates", `token.${token}`]); + socket = new WebSocket(buildRealtimeUrl(), ["daedalus-agent-updates", `token.${token}`]); socket.addEventListener("open", () => { retryDelayMs = 1000; }); @@ -440,7 +435,7 @@ export default function App() { onServerRestart={async (updateStatus) => { try { await api.post("/api/settings/server-restart", {}); - updateStatus?.("重启指令已发送,正在等待数字员工平台恢复可用..."); + updateStatus?.(`重启指令已发送,正在等待 ${BRAND_NAME} 恢复可用...`); await waitForGatewayRestart({ getStatus: (timeoutMs) => api.post( `/api/settings/server-status?audit=false&timeout_ms=${timeoutMs}`, @@ -449,7 +444,7 @@ export default function App() { ), onStatus: updateStatus }); - messageApi.success("数字员工平台已恢复可用"); + messageApi.success(`${BRAND_NAME} 已恢复可用`); } catch (error) { const normalized = api.normalizeError(error, "重启服务失败"); messageApi.error(normalized.message || "重启服务失败"); @@ -476,9 +471,13 @@ export default function App() { theme={{ token: { colorPrimary: activeThemeColor, - borderRadius: 6, - colorBgLayout: "#f5f7fb", - colorTextBase: "#111827", + colorInfo: "#3d6670", + colorSuccess: "#46705b", + colorWarning: "#b27a2e", + colorError: "#b33f36", + borderRadius: 4, + colorBgLayout: "#f2f3f1", + colorTextBase: "#1d2024", fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" }, components: { @@ -493,8 +492,8 @@ export default function App() { bodyBg: "#f5f7fb" }, Table: { - headerBg: "#f8fafc", - headerColor: "#475569" + headerBg: "#f4f3ef", + headerColor: "#555b62" }, Tabs: { itemSelectedColor: activeThemeColor diff --git a/packages/aios-management-web/src/app/api-client.js b/packages/daedalus-agent-management-web/src/app/api-client.js similarity index 98% rename from packages/aios-management-web/src/app/api-client.js rename to packages/daedalus-agent-management-web/src/app/api-client.js index 034b723ccfb46f333e762dff69acaa9d6f374e6b..4999f3cb5fa699618d990186ccc61e90dfb09ef5 100644 --- a/packages/aios-management-web/src/app/api-client.js +++ b/packages/daedalus-agent-management-web/src/app/api-client.js @@ -1,4 +1,4 @@ -const TOKEN_KEY = "aios-web-auth-token"; +const TOKEN_KEY = "daedalus-agent-web-auth-token"; export const authTokenStore = { get() { diff --git a/packages/daedalus-agent-management-web/src/brand.js b/packages/daedalus-agent-management-web/src/brand.js new file mode 100644 index 0000000000000000000000000000000000000000..2a4e711bea87c253cceb3133db1179208dee1735 --- /dev/null +++ b/packages/daedalus-agent-management-web/src/brand.js @@ -0,0 +1,11 @@ +export const BRAND_NAME = "智能体管理与运营平台"; +export const BRAND_SUBTITLE = "Your company's name here"; +export const BRAND_SLOGAN = "说出你的困境,我来解决它"; +export const BRAND_THEME_COLOR = "#a5522d"; + +export const DEFAULT_PORTAL_SETTINGS = { + portal_name: BRAND_NAME, + brand_subtitle: BRAND_SUBTITLE, + theme_color: BRAND_THEME_COLOR, + has_logo: false +}; diff --git a/packages/aios-management-web/src/components/AppShell.jsx b/packages/daedalus-agent-management-web/src/components/AppShell.jsx similarity index 92% rename from packages/aios-management-web/src/components/AppShell.jsx rename to packages/daedalus-agent-management-web/src/components/AppShell.jsx index 6dab5b5c598de91e7d8f5f1dfc2f0904da830fac..923fc5a6afd798d69c2145a5592a457b721b48f3 100644 --- a/packages/aios-management-web/src/components/AppShell.jsx +++ b/packages/daedalus-agent-management-web/src/components/AppShell.jsx @@ -7,13 +7,14 @@ import { } from "@ant-design/icons"; import { Button, Layout, Menu, Space, Typography } from "antd"; +import { BRAND_THEME_COLOR } from "../brand.js"; import { LogoMark } from "./LogoMark.jsx"; const { Header, Sider, Content } = Layout; const { Text } = Typography; -const DEFAULT_THEME_COLOR = "#07c160"; +const DEFAULT_THEME_COLOR = BRAND_THEME_COLOR; -function normalizeHexColor(color, fallback = "#07c160") { +function normalizeHexColor(color, fallback = BRAND_THEME_COLOR) { if (typeof color !== "string") { return fallback; } @@ -68,10 +69,10 @@ export function AppShell({ }) { const [collapsed, setCollapsed] = useState(false); const themeColor = normalizeHexColor(DEFAULT_THEME_COLOR); - const siderColor = mixColors(themeColor, "#050a07", 0.88); - const siderPanel = mixColors(themeColor, "#0c1711", 0.74); - const siderActive = mixColors(themeColor, "#ffffff", 0.22); - const themeSoft = mixColors(themeColor, "#ffffff", 0.9); + const siderColor = "#191b1f"; + const siderPanel = "#24272c"; + const siderActive = mixColors(themeColor, "#ffffff", 0.12); + const themeSoft = mixColors(themeColor, "#ffffff", 0.91); const normalizedMenuItems = menuItems.map((item) => ( item.type === "group" ? { diff --git a/packages/aios-management-web/src/components/CardTitleWithReload.jsx b/packages/daedalus-agent-management-web/src/components/CardTitleWithReload.jsx similarity index 100% rename from packages/aios-management-web/src/components/CardTitleWithReload.jsx rename to packages/daedalus-agent-management-web/src/components/CardTitleWithReload.jsx diff --git a/packages/aios-management-web/src/components/DeleteActionButton.jsx b/packages/daedalus-agent-management-web/src/components/DeleteActionButton.jsx similarity index 100% rename from packages/aios-management-web/src/components/DeleteActionButton.jsx rename to packages/daedalus-agent-management-web/src/components/DeleteActionButton.jsx diff --git a/packages/aios-management-web/src/components/DigitalEmployeeIcon.jsx b/packages/daedalus-agent-management-web/src/components/DigitalEmployeeIcon.jsx similarity index 100% rename from packages/aios-management-web/src/components/DigitalEmployeeIcon.jsx rename to packages/daedalus-agent-management-web/src/components/DigitalEmployeeIcon.jsx diff --git a/packages/aios-management-web/src/components/LogoMark.jsx b/packages/daedalus-agent-management-web/src/components/LogoMark.jsx similarity index 34% rename from packages/aios-management-web/src/components/LogoMark.jsx rename to packages/daedalus-agent-management-web/src/components/LogoMark.jsx index bb2b783aeacd9c3ee3a53f18728182b6c34ba326..23785639dde5023afd4b02368bf85a18b1a27f44 100644 --- a/packages/aios-management-web/src/components/LogoMark.jsx +++ b/packages/daedalus-agent-management-web/src/components/LogoMark.jsx @@ -1,6 +1,26 @@ import React, { useEffect, useState } from "react"; -import { DigitalEmployeeIcon } from "./DigitalEmployeeIcon.jsx"; +function DaedalusMark() { + return ( + + + + + + + ); +} export function LogoMark({ src, className }) { const normalizedSrc = typeof src === "string" ? src.trim() : ""; @@ -13,9 +33,9 @@ export function LogoMark({ src, className }) { return (
{normalizedSrc && !failed ? ( - Logo setFailed(true)} /> + daedalus-agent setFailed(true)} /> ) : ( - + )}
); diff --git a/packages/aios-management-web/src/components/SystemLogDownloadPanel.jsx b/packages/daedalus-agent-management-web/src/components/SystemLogDownloadPanel.jsx similarity index 91% rename from packages/aios-management-web/src/components/SystemLogDownloadPanel.jsx rename to packages/daedalus-agent-management-web/src/components/SystemLogDownloadPanel.jsx index 7f7ee820bb84dc93b2100190f4114e4bd90520df..6f2b4c7cce04b9aa9a46c52b3778d12b9e499a96 100644 --- a/packages/aios-management-web/src/components/SystemLogDownloadPanel.jsx +++ b/packages/daedalus-agent-management-web/src/components/SystemLogDownloadPanel.jsx @@ -11,10 +11,10 @@ const SYSTEM_LOG_TYPE_OPTIONS = [ { value: "kernel", label: "内核启动日志" }, { value: "apps", label: "应用启动日志" }, { value: "openclaw", label: "网关日志" }, - { value: "aios-management-web", label: "管理控制台日志" }, - { value: "aios-apps-invoke-cli", label: "应用调用服务日志" }, - { value: "aios-mqtt-channel", label: "MQTT通讯日志" }, - { value: "aios-mqtt-channel-chat", label: "交互日志" } + { value: "daedalus-agent-management-web", label: "管理控制台日志" }, + { value: "daedalus-agent-apps-invoke-cli", label: "应用调用服务日志" }, + { value: "daedalus-agent-mqtt-channel", label: "MQTT通讯日志" }, + { value: "daedalus-agent-mqtt-channel-chat", label: "交互日志" } ]; function downloadBlob(blob, fileName) { diff --git a/packages/aios-management-web/src/main.jsx b/packages/daedalus-agent-management-web/src/main.jsx similarity index 100% rename from packages/aios-management-web/src/main.jsx rename to packages/daedalus-agent-management-web/src/main.jsx diff --git a/packages/aios-management-web/src/pages/AgentTestPanel.jsx b/packages/daedalus-agent-management-web/src/pages/AgentTestPanel.jsx similarity index 99% rename from packages/aios-management-web/src/pages/AgentTestPanel.jsx rename to packages/daedalus-agent-management-web/src/pages/AgentTestPanel.jsx index 6e2aa358f6760287ec0afd1782237bf9af491dcb..2583a958cb7840df20ac05ee498bc2844fc9554f 100644 --- a/packages/aios-management-web/src/pages/AgentTestPanel.jsx +++ b/packages/daedalus-agent-management-web/src/pages/AgentTestPanel.jsx @@ -79,7 +79,7 @@ export function AgentTestPanel({ agent }) { placement: "start", avatar: { icon: , - style: { background: "var(--portal-theme-color, #07c160)" } + style: { background: "var(--portal-theme-color, #a5522d)" } } } }), []); diff --git a/packages/aios-management-web/src/pages/AiosUsersPage.jsx b/packages/daedalus-agent-management-web/src/pages/AgentUsersPage.jsx similarity index 80% rename from packages/aios-management-web/src/pages/AiosUsersPage.jsx rename to packages/daedalus-agent-management-web/src/pages/AgentUsersPage.jsx index 8f20d0a09f47a79fbc1a1c3e7beb7bbbf82f8d39..49c78a7eed47af7984e89b3f9ca44dac2e8805fe 100644 --- a/packages/aios-management-web/src/pages/AiosUsersPage.jsx +++ b/packages/daedalus-agent-management-web/src/pages/AgentUsersPage.jsx @@ -6,7 +6,7 @@ import { api } from "../app/api-client.js"; import { CardTitleWithReload } from "../components/CardTitleWithReload.jsx"; import { DeleteActionButton } from "../components/DeleteActionButton.jsx"; -export function AiosUsersPage() { +export function AgentUsersPage() { const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [page, setPage] = useState(1); @@ -22,7 +22,7 @@ export function AiosUsersPage() { const load = async (nextPage = page) => { setLoading(true); try { - const result = await api.get(`/api/aios-users?page=${nextPage}&limit=${pageSize}`); + const result = await api.get(`/api/agent-users?page=${nextPage}&limit=${pageSize}`); setItems(result.items || []); setTotal(result.total || 0); setPage(result.page || nextPage); @@ -54,10 +54,10 @@ export function AiosUsersPage() { load()} />} + title={ load()} />} extra={(