Files
OpenMesh/coworker/cli.py
zhaolei 6f402ffcee
Some checks failed
CI / pytest (push) Has been cancelled
CI / gui-unit (push) Has been cancelled
CI / gui-e2e (push) Has been cancelled
feat: OpenMesh 基础平台与 MD/PDF 转换技能
- 后端: coworker 智能体框架, WS API, 文件上传, 附件处理
- 前端: Open WebUI, 文件全量走 upload API (含 MD/TXT/JSON 等文本类)
- 技能: md-to-office (pandoc + wkhtmltopdf)
- 修复: 上传文件路径丢失, Agent 搜索浪费, 输出文件跑到 uploads/
- 打包: PyInstaller one-dir, 预打包 pandoc/wkhtmltopdf/chromium
2026-09-13 23:41:04 +08:00

76 lines
2.5 KiB
Python

"""CLI entry point. `coworker` launches the TUI; `coworker code` boots the code skill."""
from __future__ import annotations
import argparse
import os
import uuid
from pathlib import Path
from typing import Optional
from .config import load_config
from .conversations import ConversationStore
from .memory import MemorySettingsStore, SQLiteMemoryStore
from .permissions import Mode
from .secrets import state_dir
def main(argv: Optional[list[str]] = None) -> None:
cfg = load_config()
parser = argparse.ArgumentParser(
prog="openworker", description="Agent coworker (TUI)."
)
parser.add_argument(
"skill", nargs="?", default="code", help="skill to launch (default: code)"
)
parser.add_argument("--cwd", default=".", help="workspace directory")
parser.add_argument(
"--model", default=cfg.model, help="model id, e.g. openai gpt-5.5"
)
parser.add_argument(
"--mode",
default=cfg.mode,
choices=["plan", "interactive", "auto", "bypass-approvals", "auto-approve"],
help="permission mode",
)
parser.add_argument("--resume", default=None, help="resume a session id")
args = parser.parse_args(argv)
workspace = Path(args.cwd).expanduser().resolve()
# Unified global store shared with the GUI/server (one place for all conversations).
data_dir = state_dir()
# Same on/off switch and user rules the GUI manages (MEMORY-SPEC §4.3/§6). The
# store is always wired: off means "stop learning", so saved facts stay usable.
memory_settings = MemorySettingsStore(data_dir / "memory-settings.json")
memory_store = SQLiteMemoryStore(data_dir / "coworker.db")
session_store = ConversationStore(data_dir)
session_store.touch_workspace(os.path.realpath(str(workspace)))
resume_messages = None
session_id = args.resume or uuid.uuid4().hex[:12]
model, mode = args.model, args.mode
if args.resume:
record = session_store.load(args.resume)
if record is not None:
resume_messages = record.messages
model, mode = record.model, record.mode
from .tui.app import CoworkerApp
app = CoworkerApp(
workspace=workspace,
model=model,
mode=Mode(mode),
memory_store=memory_store,
memory_off=not memory_settings.enabled,
user_rules=memory_settings.user_rules,
session_store=session_store,
session_id=session_id,
resume_messages=resume_messages,
)
app.run()
if __name__ == "__main__":
main()