MindOS_CLI/pyproject.toml
lidf aecd81ec8b feat: 无状态原子化改造 v0.2.0 — pipelines/ 分层 + 双工录音 + pipx 自动更新修复
## 架构改造

将 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
2026-07-01 14:56:16 +08:00

53 lines
1.1 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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*"]