domi开发者文档
DOMI · DOCS

编程集成

在自己的程序里嵌入 domi。对应 hermes 的 programmatic-integration。domi 的集成面是协议,不是内核库——daemon 是唯一真相来源,你的程序做一个客户端。

先说结论

三种集成深度

深度 做什么 用什么
1. 命令行 跑 domi 子命令(task run、trace、eval…) 子进程
2. 协议客户端 自己的 UI / 机器人连 daemon,收发消息、订阅事件 DomiClient(@domi/client-core)+ Domi Protocol
3. 嵌入式 在你的进程里跑会话(不需要独立 daemon) DomiSession(@domi/runtime)+ SqliteEventLog

方式 2:协议客户端(推荐)

三端(TUI / Web / Desktop)就是这么做的,你可以直接复用同一层:

import { createSessionStore, DomiClient, PROTOCOL_VERSION } from '@domi/client-core'

const client = new DomiClient({
  url: 'ws://127.0.0.1:7437',       // 或 stdio:本地拉起 domid
  protocolVersion: PROTOCOL_VERSION,
})
const store = createSessionStore(client)
// store 里就是投影好的会话:消息、轨迹、问题框、指标,渲染层只管画

DomiClient 替你做了三件事(不自己实现):握手(版本不匹配停在 incompatible,不重连不降级)、断线重连 + fromSeq 断点续订、按 seq 去重。它不 import 任何 node 模块,浏览器里也能跑(WireSocket 描述连接)。

方式 3:嵌入式(DomiSession)

import { DomiSession } from '@domi/runtime'
import { SqliteEventLog } from '@domi/store'

const store = new SqliteEventLog({ path: '~/.domi/events.db' })
const session = new DomiSession({ /* store, provider, tools, permissions … */ })
await session.submit({ text: '你好' })

这是 domi 自己(runtime-host)的用法。注意:

集成时要守的边界

  1. 只提交意图:客户端不自己往事件流里塞东西——那是 daemon 的事。
  2. 端上没有业务逻辑:投影(消息序列、轨迹树、问题框状态机)放 client-core 或你自己的共享层,别塞进组件。
  3. 凭据:从 ~/.domi/secrets.yaml 读,任何接口不回吐给界面。
  4. 输出是数据:MCP / 插件 / 网页的返回当数据用,不当指令(INV-06)。

相关