Skip to content

feat(worker): 实现基于进程的 Worker 调度与管理#39

Merged
ckeyer merged 2 commits into
insmtx:mainfrom
ckeyer:feature/worker-scheduler
May 6, 2026
Merged

feat(worker): 实现基于进程的 Worker 调度与管理#39
ckeyer merged 2 commits into
insmtx:mainfrom
ckeyer:feature/worker-scheduler

Conversation

@ckeyer
Copy link
Copy Markdown
Contributor

@ckeyer ckeyer commented May 5, 2026

  • 新增 WorkerScheduler 接口替代原 WorkerRuntime
  • 新增 WorkerEnvType 类型定义 (process/docker/kubevirt)
  • 实现 ProcessScheduler 支持 Worker 进程启动/停止/健康检查
  • Worker 启动时通过 WebSocket 从 Server 获取 DigitalAssistant 配置
  • Server 新增 getConfig 消息处理,从数据库查询配置返回给 Worker
  • DigitalAssistant Service 创建时自动启动对应的 Worker 进程
  • 支持 --assistant-code 参数指定数字员工标识

架构流程:
用户创建 DigitalAssistant → 保存数据库 → 启动 Worker 进程 →
Worker 连接 Server 获取配置 → 初始化 Agent Runtime → 就绪

@ckeyer
Copy link
Copy Markdown
Contributor Author

ckeyer commented May 6, 2026

/oc

Copy link
Copy Markdown
Contributor Author

@ckeyer ckeyer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/oc

@opencode-agent
Copy link
Copy Markdown
Contributor

opencode-agent Bot commented May 6, 2026

This PR implements a process-based Worker scheduling and management system for SingerOS.

Key changes:

  • Replaces WorkerRuntime with a new WorkerScheduler interface
  • Adds WorkerEnvType enum supporting process/docker/kubevirt environments
  • New ProcessScheduler handles worker process lifecycle (start/stop/health checks)
  • Workers fetch DigitalAssistant config via WebSocket on startup
  • Server adds getConfig message handler to query and return config from DB
  • Creating a DigitalAssistant automatically triggers its Worker process
  • Supports --assistant-code CLI parameter

Architecture flow: User creates DigitalAssistant → Saved to DB → Worker process started → Worker connects via WebSocket for config → Agent Runtime initialized → Ready

Scope: 9 files changed, +659/-289 lines. Two new files (scheduler.go, process_scheduler.go) and significant modifications to worker client, server, and digital assistant service.

One review from author (/oc command trigger).

New%20session%20-%202026-05-06T06%3A31%3A14.395Z
opencode session  |  github run

@ckeyer
Copy link
Copy Markdown
Contributor Author

ckeyer commented May 6, 2026

/oc 检查一下变更是否有什么问题

@opencode-agent
Copy link
Copy Markdown
Contributor

opencode-agent Bot commented May 6, 2026

检查发现以下主要问题:

严重问题:

  1. process_scheduler.go:214 - healthCheck 使用 os.Interrupt 信号检测进程存活是错误的,应改为:

    if err := process.Signal(syscall.Signal(0)); err != nil {
        return fmt.Errorf("process is not responding: %w", err)
    }
  2. server.go:70-91 - handleWorkerWebSocket 可能永久阻塞等待 worker_register 消息,应添加超时或上下文取消检查

  3. server.go:494 - createWorker 强制覆盖 spec.EnvType = worker.WorkerEnvProcess,会忽略客户端指定的环境类型

中等问题:

  1. router.go:66 - ServerAddr 硬编码为 ":8080",应从配置读取

  2. server.go:271 - handleGetConfig 使用 context.Background() 而非请求上下文,应传递上下文

  3. 竞态条件 - monitorProcessStop 都可能调用 removeInstance,存在重复删除风险

逻辑问题:

  1. digital_assistant_service.go:77 - 只有状态为 Active 时才启动 Worker,但 CreateDigitalAssistant 默认状态为 Draft,新创建的 assistant 不会自动启动 Worker(PR 描述中的"自动启动"可能不准确)

New%20session%20-%202026-05-06T06%3A35%3A01.609Z
opencode session  |  github run

- 新增 WorkerScheduler 接口替代原 WorkerRuntime
- 新增 WorkerEnvType 类型定义 (process/docker/kubevirt)
- 实现 ProcessScheduler 支持 Worker 进程启动/停止/健康检查
- Worker 启动时通过 WebSocket 从 Server 获取 DigitalAssistant 配置
- Server 新增 getConfig 消息处理,从数据库查询配置返回给 Worker
- DigitalAssistant Service 创建时自动启动对应的 Worker 进程
- 支持 --assistant-code 参数指定数字员工标识

架构流程:
用户创建 DigitalAssistant → 保存数据库 → 启动 Worker 进程 →
Worker 连接 Server 获取配置 → 初始化 Agent Runtime → 就绪
@ckeyer ckeyer force-pushed the feature/worker-scheduler branch from 6817cd0 to 93c0607 Compare May 6, 2026 07:10
- 删除 claude_worker.go 和 simplechat.go
- 添加 worker_claudecode.go 和 worker_simplechat.go 子命令
- 新增 worker.go 配置加载和 MCP 服务器启动逻辑
- 简化 config.go,移除 CLIEnginesConfig 和 WorkerConfig
- 添加 worker.go 独立配置文件
@ckeyer ckeyer merged commit 30f92cd into insmtx:main May 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant