Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 28 additions & 7 deletions .github/workflows/octop-desktop.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
name: Octop Desktop Package
name: FreeOS Desktop Package

# Filename kept as octop-desktop.yml so auto-tag / existing dispatch keep working.
# Publishes FreeOS-desktop-* / FreeOS-portable-* (Windows NSIS .exe is the
# product installer: Octop shell + bundled openXYOS).
#
# 正式发版:Auto Tag 在打 v* 后与 Release / Docker Publish 一并 dispatch。
# 产物 upsert 到同一 GitHub Release。手工补包:workflow_dispatch + release_tag
# (不必跑在 v* ref 上)。attach_from_run 只挂已有 artifact、不重打。
Expand All @@ -11,6 +15,7 @@ on:
pull_request:
paths:
- "desktop/**"
- "modules/openxyos/**"
- ".github/workflows/octop-desktop.yml"
workflow_dispatch:
inputs:
Expand All @@ -30,7 +35,7 @@ on:
default: ""
type: string
attach_from_run:
description: "Existing workflow run ID — attach its Octop-* artifacts and skip the 6-platform rebuild"
description: "Existing workflow run ID — attach its FreeOS-* artifacts and skip the 6-platform rebuild"
required: false
default: ""
type: string
Expand Down Expand Up @@ -160,6 +165,12 @@ jobs:
enable-cache: true
python-version: "3.12"

- uses: actions/setup-node@v5
with:
node-version: "20"
cache: npm
cache-dependency-path: modules/openxyos/package-lock.json

# GitHub Cache outages must not fail the build — PBS download is cheap enough.
- name: Cache python-build-standalone downloads
continue-on-error: true
Expand All @@ -184,7 +195,7 @@ jobs:
- name: Smoke import (native host only)
run: |
set -euo pipefail
staging="desktop/portable/release/Octop-${{ matrix.plat }}"
staging="desktop/portable/release/FreeOS-${{ matrix.plat }}"
if [[ -x "${staging}/runtime/bin/python3" ]]; then
py="${staging}/runtime/bin/python3"
elif [[ -f "${staging}/runtime/python.exe" ]]; then
Expand All @@ -209,6 +220,16 @@ jobs:
PYTHONNOUSERSITE=1 \
"$py" desktop/portable/verify_imports.py \
"${verify_args[@]}"
if [[ ! -f "${staging}/org-sidecar/openxyos/backend/server.ts" ]]; then
echo "org-sidecar missing under ${staging}" >&2
exit 1
fi
if [[ -f "${staging}/org-sidecar/node/node.exe" || -x "${staging}/org-sidecar/node/bin/node" ]]; then
echo "org-sidecar Node runtime present"
else
echo "bundled Node missing under ${staging}/org-sidecar/node" >&2
exit 1
fi
# macOS: fail if any native extension linked Homebrew/MacPorts paths.
if [[ "${{ matrix.plat }}" == darwin-* ]]; then
REPO_ROOT="$PWD" # shellcheck source=desktop/portable/_common.sh
Expand Down Expand Up @@ -247,22 +268,22 @@ jobs:
wails3 task package
ARCH=${{ matrix.arch }}
VERSION=${{ env.OCTOP_VERSION }}
PORTABLE_ZIP=../portable/release/Octop-portable-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.zip
PORTABLE_ZIP=../portable/release/FreeOS-portable-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.zip

# archive: false — upload the prebuilt zip as-is. Default archive=true would
# wrap it again, so Actions UI / "Download artifact" becomes zip-in-zip.
# With archive:false, artifact name is the filename (name: is ignored).
- uses: actions/upload-artifact@v7
with:
path: desktop/portable/release/Octop-portable-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.zip
path: desktop/portable/release/FreeOS-portable-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.zip
archive: false
if-no-files-found: error
retention-days: 14

- name: Upload bundled desktop package
uses: actions/upload-artifact@v7
with:
path: desktop/src/bin/Octop-desktop-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.*
path: desktop/src/bin/FreeOS-desktop-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.*
archive: false
if-no-files-found: error
retention-days: 14
Expand Down Expand Up @@ -310,7 +331,7 @@ jobs:
# zips into directories, so files: release-assets/* would skip them.
- uses: actions/download-artifact@v8
with:
pattern: Octop-*
pattern: FreeOS-*
path: release-assets
merge-multiple: true
skip-decompress: true
Expand Down
22 changes: 19 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,25 @@ Operator detail: [docs/asset-loop.md](docs/asset-loop.md).

## Run FreeOS

### Windows 用户:下载安装包 → 安装 → 打开即用 FreeOS(Octop壳+组织能力)

给非开发者的路径:

1. 打开 [GitHub Releases](https://github.com/XYAIStudio/FreeOS/releases/latest),下载
`FreeOS-desktop-windows-amd64-<version>.exe`(普通 64 位电脑)或
`FreeOS-desktop-windows-arm64-<version>.exe`(ARM 电脑)。
2. 双击安装包。安装程序会放到「程序文件」并创建开始菜单和桌面快捷方式。
3. 打开 **FreeOS**。第一次启动会解压内置运行环境(可能要一两分钟),然后出现设置向导。
4. 设好管理员密码后即可聊天。组织控制台(openXYOS)已随安装包内置,无需再装 Node;侧栏 **Organization** 默认打开。

数据目录默认是 `%USERPROFILE%\.freeos`(可用环境变量 `FREEOS_HOME` 改)。旧版 Octop 的 `~/.octop` 仍会被识别。

安装包由 CI 工作流 **FreeOS Desktop Package**(文件名仍是 `.github/workflows/octop-desktop.yml`,给现有发版脚本用)在 Windows runner 上打出来。本仓库的云环境打不出 `.exe`;合并后由该 job 产出。

### Prerequisites

- Python 3.12+ (the project uses [uv](https://docs.astral.sh/uv/))
- Node.js 20.19+ only if you start the organization sidecar or rebuild the dashboard
- Node.js 20.19+ only if you start the organization sidecar from source, or rebuild the dashboard. The Windows installer already bundles Node + openXYOS.

### From this repository

Expand Down Expand Up @@ -133,7 +148,7 @@ Inbound import compiles the blueprint **and** registers a FreeOS agent (`org-pol

## Host platform features (from Octop)

Unchanged in this fork: multi-user JWT, multi-agent chat, expert library, connectors, ACP, knowledge bases, bundled plugins, cron, terminal/browser/desktop surfaces. Upstream-oriented installers and desktop artifacts still refer to **Octop** and `~/.octop/` — use `freeos` / `FREEOS_HOME` here.
Unchanged in this fork: multi-user JWT, multi-agent chat, expert library, connectors, ACP, knowledge bases, bundled plugins, cron, terminal/browser/desktop surfaces. The **Windows desktop installer** is branded **FreeOS** and defaults to `~/.freeos` / `FREEOS_HOME`. The Python package, `octop` CLI alias, `OCTOP_*` env vars, and `octop.db` stay for compatibility.

Longer host docs: [docs/user-guide.md](docs/user-guide.md), [docs/configuration.md](docs/configuration.md), [docs/architecture.md](docs/architecture.md), [README_CN.md](README_CN.md).

Expand All @@ -151,7 +166,8 @@ Intentional for package compatibility (not a rebrand miss):

- Python package name `octop` and `import octop`
- CLI `octop` alongside `freeos`
- `OCTOP_*` environment variables
- `OCTOP_*` environment variables (desktop also sets `FREEOS_HOME`)
- SQLite file `octop.db` inside the home directory
- CI workflow **filename** `.github/workflows/octop-desktop.yml` (display name is FreeOS Desktop Package)

See [docs/architecture-integration.md](docs/architecture-integration.md) for the control/data-plane split and the running self-growth loop.
8 changes: 4 additions & 4 deletions README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,13 +204,13 @@ curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install

完整安装选项见 [scripts/README.md](scripts/README.md)(`--version`、`--from-source`、`--mirror` 及 Windows 参数)。

**桌面客户端**(图形界面,无需终端)— 从 [GitHub Releases](https://github.com/TencentCloud/Octop/releases/latest) 下载对应平台的安装包
**Windows 用户:下载安装包 → 安装 → 打开即用 FreeOS(Octop壳+组织能力)** — 从 [GitHub Releases](https://github.com/XYAIStudio/FreeOS/releases/latest) 下载

| 平台 | 制品 |
|------|------|
| Windows | `Octop-desktop-windows-amd64-<version>.exe`(64 位)/ `Octop-desktop-windows-arm64-<version>.exe`(ARM64)— NSIS 安装程序 |
| macOS | `Octop-desktop-darwin-arm64-<version>.dmg`(Apple 芯片)/ `Octop-desktop-darwin-amd64-<version>.dmg`(Intel) |
| Linux | `Octop-desktop-linux-amd64-<version>.tar.gz` / `Octop-desktop-linux-arm64-<version>.tar.gz` |
| Windows | `FreeOS-desktop-windows-amd64-<version>.exe`(64 位)/ `FreeOS-desktop-windows-arm64-<version>.exe`(ARM64)— NSIS 安装程序,内置 openXYOS,打开即可聊天+组织 |
| macOS | `FreeOS-desktop-darwin-arm64-<version>.dmg`(Apple 芯片)/ `FreeOS-desktop-darwin-amd64-<version>.dmg`(Intel) |
| Linux | `FreeOS-desktop-linux-amd64-<version>.tar.gz` / `FreeOS-desktop-linux-arm64-<version>.tar.gz` |
| 飞牛 NAS(FnOS) | `Octop-fnos-docker-<version>.fpk`(依赖 Docker)/ `Octop-fnos-native-<version>.fpk`(无需 Docker)— 通过应用中心安装 |

桌面客户端说明见 [desktop/README.md](desktop/README.md),飞牛打包指南见 [fnos/README.md](fnos/README.md)。
Expand Down
10 changes: 5 additions & 5 deletions dashboard/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
<meta name="apple-mobile-web-app-title" content="FreeOS" />
<meta name="apple-mobile-web-app-title" content="FreeOS" />
<!-- Web App Manifest -->
<link rel="manifest" href="/manifest.json" />
<title>FreeOS</title>
Expand Down Expand Up @@ -85,14 +85,14 @@
position: absolute;
inset: 0;
border-radius: 50%;
border: 3px solid rgba(232, 93, 117, 0.18);
border-top-color: #e85d75;
border: 3px solid rgba(0, 51, 255, 0.18);
border-top-color: #0033ff;
animation: octop-boot-spin 0.85s linear infinite;
}
@media (prefers-color-scheme: dark) {
#octop-boot-ring {
border-color: rgba(240, 139, 154, 0.22);
border-top-color: #f08b9a;
border-color: rgba(107, 140, 255, 0.22);
border-top-color: #6b8cff;
}
}
#octop-boot-logo {
Expand Down
6 changes: 3 additions & 3 deletions dashboard/public/offline.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
font-size: 22px;
font-weight: 600;
margin-bottom: 10px;
color: #f08b9a;
color: #6b8cff;
}
p {
font-size: 14px;
Expand All @@ -51,15 +51,15 @@
padding: 10px 28px;
border-radius: 999px;
border: none;
background: #e85d75;
background: #0033ff;
color: #fff;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s;
}
button:hover {
background: #d14a62;
background: #002ee6;
}
</style>
</head>
Expand Down
2 changes: 1 addition & 1 deletion dashboard/src/components/ExpertColorPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ function isCurated(value: string): value is ThemePalette {
}

/**
* Curated 8-swatch picker for expert/agent accent color, plus a custom
* Curated swatch picker for expert/agent accent color, plus a custom
* color swatch backed by the Ant Design color picker (palette + hex input).
* The onChange callback receives a palette key or a hex string.
*/
Expand Down
2 changes: 1 addition & 1 deletion dashboard/src/components/PaletteSwitcher.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { PALETTE_SWATCH, VALID_PALETTES } from "../styles/themePalettes";
import styles from "./PaletteSwitcher.module.less";

/**
* Curated 8-swatch brand palette picker plus a custom color swatch.
* Curated brand palette picker plus a custom color swatch.
* The custom swatch opens the Ant Design color picker (palette + hex input);
* picking a color switches the active brand palette to "custom".
*/
Expand Down
1 change: 1 addition & 0 deletions dashboard/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -3301,6 +3301,7 @@
"themeLight": "Light",
"themeDark": "Dark",
"palette": {
"freeos": "FreeOS",
"rose": "Rose",
"tech": "Tech",
"indigo": "Indigo",
Expand Down
1 change: 1 addition & 0 deletions dashboard/src/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -3298,6 +3298,7 @@
"themeLight": "浅色",
"themeDark": "深色",
"palette": {
"freeos": "FreeOS 蓝",
"rose": "玫瑰",
"tech": "科技",
"indigo": "靛蓝",
Expand Down
4 changes: 2 additions & 2 deletions dashboard/src/pages/Agent/Memory/Overview.module.less
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@
/* ---- Dark-mode tweaks: brighter accents, chart grid, dossier header ---- */
:global(html[data-theme="dark"]) {
.tone_rose {
--tone-bg: rgba(240, 139, 154, 0.14);
--tone-bg: color-mix(in srgb, var(--fn-color-brand) 14%, transparent);
}
.tone_amber {
--tone-bg: rgba(251, 191, 36, 0.14);
Expand All @@ -477,7 +477,7 @@
.dossierHeader {
background: linear-gradient(
135deg,
rgba(240, 139, 154, 0.1),
color-mix(in srgb, var(--fn-color-brand) 10%, transparent),
transparent 46%
);
}
Expand Down
8 changes: 4 additions & 4 deletions dashboard/src/pages/Chat/chatInputPickers.partial.less
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@
}

&:hover {
color: var(--fn-color-brand, #e85d75);
color: var(--fn-color-brand, #0033ff);
}

&:focus-visible {
Expand Down Expand Up @@ -239,13 +239,13 @@
}

.reasoningMenuChoiceActive {
background: rgba(232, 93, 117, 0.08);
color: var(--fn-color-brand, #e85d75);
background: var(--fn-color-brand-bg, rgba(0, 51, 255, 0.08));
color: var(--fn-color-brand, #0033ff);
}

.reasoningStatusRow {
justify-content: flex-start;
color: var(--fn-color-brand, #e85d75);
color: var(--fn-color-brand, #0033ff);

span {
flex: 1;
Expand Down
2 changes: 1 addition & 1 deletion dashboard/src/styles/appearanceStorage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ afterEach(() => {
});

describe("appearanceStorage", () => {
it("defaults to system preference and rose palette", () => {
it("defaults to system preference and the FreeOS palette", () => {
expect(readStoredAppearance().preference).toBe("system");
expect(readStoredAppearance().palette).toBe(DEFAULT_PALETTE);
});
Expand Down
Loading
Loading