## 架构改造 将 recorder/tunnel/managed_mcp 三个有状态单例模块拆成 mindcli/pipelines/ 下的无状态管线 + health.py 调用方持有状态。 参照 hermes-overlay/infra/pipelines/anyfile2md.py 的分层模式。 ### pipelines/ 层(无状态) - audio_capture.py: capture() 工厂函数返回独立 CaptureHandle, 无单例无互斥,双工模式(system+mic 并行)在代码层面可用 - tunnel_session.py: connect() 工厂函数 + on_status 回调, 消除 health ⇄ tunnel 循环耦合(单向数据流) - tool_proxy.py: ToolProxy 替代 ManagedMCP,非单例 ### health.py 改造 - _active_captures dict 按 chatId 索引,可多实例并存 - _tunnel_handle 由调用方持有,on_status 回调更新状态 - /record/stop 支持 ?chatId= 停单路或全停 - /record/status 返回所有活跃录音列表 ### cli.py 改造 - chat/ask 走 run_agent headless + Cloud Gateway JWT(铁律 A) - 保留 --offline 走 vendor TUI(铁律 C:断开即自治) - mind update 修复 pipx 场景: - 检测 pipx venv → pipx reinstall - 非 pipx → sys.executable -m pip(修复 venv 里 pip 找不到) - 防降级保护(远端版本低于本地时不升级) - 远端 upgradeCmd 字段下发 ### 顺手修复 - health.py / capability.py 的 HERMES_COMMIT → VENDOR_COMMIT - 版本号 0.1.0 → 0.2.0(__init__.py + pyproject.toml) - 新增 versions.json 仓库模板(installCmd 改为 pipx,新增 upgradeCmd) ### 删除 - recorder.py → 逻辑迁入 pipelines/audio_capture.py - tunnel.py → 逻辑迁入 pipelines/tunnel_session.py - managed_mcp.py → 逻辑迁入 pipelines/tool_proxy.py SPEC: docs/SPEC_mindcli_atomization.md
53 lines
1.1 KiB
TOML
53 lines
1.1 KiB
TOML
[build-system]
|
||
requires = ["setuptools>=68.0", "wheel"]
|
||
build-backend = "setuptools.build_meta"
|
||
|
||
[project]
|
||
name = "mindos-cli"
|
||
version = "0.2.0"
|
||
description = "MindOS NEXT 本地执行体 — Cloud Hermes 的受管理执行节点"
|
||
readme = "README.md"
|
||
requires-python = ">=3.10"
|
||
license = {text = "MIT"}
|
||
authors = [
|
||
{name = "MindOS Team"},
|
||
]
|
||
|
||
dependencies = [
|
||
# Hermes 核心依赖
|
||
"litellm>=1.30",
|
||
"openai>=1.0",
|
||
"rich>=13.0",
|
||
"prompt-toolkit>=3.0",
|
||
"tiktoken>=0.5",
|
||
"fire>=0.5",
|
||
"pyyaml>=6.0",
|
||
"aiohttp>=3.9",
|
||
# MCP 协议
|
||
"mcp>=1.0",
|
||
# Mind CLI 专属
|
||
"websockets>=12.0",
|
||
"click>=8.0",
|
||
# Hermes _vendor 隐性依赖
|
||
"python-dotenv>=1.0",
|
||
]
|
||
|
||
[project.optional-dependencies]
|
||
# macOS 系统拾音(Phase 4)
|
||
audio = [
|
||
"pyobjc-core>=10.0",
|
||
"pyobjc-framework-Quartz>=10.0",
|
||
"pyobjc-framework-ScreenCaptureKit>=10.0",
|
||
"pyobjc-framework-CoreMedia>=10.0",
|
||
"pyobjc-framework-AVFoundation>=10.0",
|
||
"pyobjc-framework-libdispatch>=10.0",
|
||
"sounddevice>=0.4",
|
||
"numpy>=1.24",
|
||
]
|
||
|
||
[project.scripts]
|
||
mind = "mindcli.cli:main"
|
||
|
||
[tool.setuptools.packages.find]
|
||
include = ["mindcli*"]
|