@ alook/ 守护进程
Alook的主机守护进程:控制-平面连接,代理调度,证书, 诊断 和生命周期的管弦乐.
运行时执行位于可独立构建的 @alook/agent-driver
软件包下 agent-driver/该套件适应了克洛德代码,代码,光标,
OpenCode 和 Pi 在一个公众背后 AgentSession 合同。 守护进程消耗
并且不讲供应商程序或SDK协议.
驱动软件包保持主机中立. 其CLI运输制造出一次发射
状态目录, 显示一个稳定 alook 命令通过 PATH编曲
由主机提供的明确环境层。 供应商适配器从不导入
守护进程或控制飞机代码.
证相. 这里的形状、协议、旗帜字符串和控制流 由研究生产代理-运行时守护进程如何驱动这些 CLI 生成 被重新表述为"干净而通俗的抽象". 这是原始代码,不是副本 任何供应商来源, 并携带没有特定平台胶水.
守护进程生命周期命令
网络机器工作表生成了完整的命令. 生产命令使用 内建的 Alook 端点; 本地开发命令包括明确的本地 URL :
npx --yes @alook/daemon@latest daemon start --machine-key '<cmt_pair_token>'
重新启动先前的配对机器而不旋转其证书:
npx --yes @alook/daemon@latest daemon start --id '<machine_id>'
仅与该精确机器生成的命令重接/旋转:
npx --yes @alook/daemon@latest daemon reconnect \
--id '<machine_id>' --machine-key '<cmt_reconnect_token>'
重接先取替换所有权, 只停止保存匹配
PID,然后激活符号. 已证实的承诺前拒绝恢复前一个
发射记录。 如果收到承诺的答复,当地发射失败,
新保持的记录仍不上网,并随即收回
daemon start --id '<machine_id>'。网络出错、超时、 5xx 或其他
模糊的激活响应从不重新启动可能被取消的旧证书;
由于新的证书没有收到,在
用户界面和运行 daemon reconnect 再来一次 从不粘贴配对或机器证书
输入日志、错误报告或聊天.
这个大主意
守护进程创建 AgentDriverSdk,探测或打开选定的后端,以及
然后只与一个 AgentSession数字 :
start(message)承认第一个命令.send(message)接受、队列或拒绝带有打入的收件的后继命令.interrupt(...)财务报告和审定财务报表stop(...)提供有限度的生命周期控制.snapshot()暴露逻辑状态而不泄露过程/SDK对象.events是常态化的同源流AgentEvent数值.closed完全解决一次 终端和主机清理的事实.
内部 @alook/agent-driver,后端适配器宣布其执行模式
使供应商产出正常化. LogicalAgentSession 拥有录取,FIFO队列,
安全地送货、订货、清理 内部 ProcessLane
财务报告和审定财务报表 SdkLane 主机使SDK运输器与在流程中的运输器相类似;
他们故意不是公共守护神原始人.
持久性交付模式(其核心)
当一个消息到达,会发生什么取决于运行时间的生命周期:
安全边界运行时间(克洛德和法典)
一个孩子的过程跨越许多个回合。 两个适配器都声明 lifetime: "session"· ;
他们的公共能力是: midTurnDelivery: "safe_boundary_queue"在工具使用过程中收到的信息,
压缩, 或审查由 LogicalAgentSession 并收到一个后
command_accepted 或者说 command_failed 活动。 守护进程没有执行
协议或队列.
对克劳德来说,输入通道是 溪流-json: 进程为
以 --input-format stream-json --output-format stream-json --include-partial-messages,每个消息是 NDJSON 线
{"type":"user","message":{"role":"user","content":[{"type":"text","text":…}]}}。 。 。 .
进程内 SDK 运行时间 (Pi)
皮宣布 in_process_sdk 运输和
midTurnDelivery: "steer"其车道代表迅速、引导、中止和处置
同时保留同样的收据、事件和终端合同.
持续方向运行时间( ursor)
光标保留一个 cursor-agent acp 进程和非加太会议
届会。 根命令开始 a session/prompt; 繁忙命令引导相同的
逻辑上通过并行的即时请求。 每个请求都有自己的
JSON-RPC id,而根收仍为稳定的终端所有人. 旧
答复不能解决当前问题。 中断发送 session/cancel
而不杀死过程.
持续服务运行时间( OpenCode)
OpenCode 开始每个逻辑会话一个经认证的,仅回放的服务.
实际的 CLI 主选择它的适配器: v1 保留 --pure 持久活动
重放; v2 使用其原生的 API, 坚持收件箱/ 信件, 以及新的闲置记录
在所有被接受的投入之后。 根提示和忙碌方向盘共享相同的服务
和供应商会议。 Live SSE处理权限和工具进度. 未知
主要或缺失的本地能力明显失败.
运行时间比较
| 运行时间 | 生命周期 | 运输/协议 | 指导 | 初步投入 | 输出格式 |
|---|---|---|---|---|---|
| 克劳德 | 持续届会 | 流- json NDJSON | safe_boundary_queue | stdin 用户信息行 | 溪流-json |
| 代码 | 持续届会 | JSON-RPC 2.0 (英语:app-server --listen stdio://(中文(简体) ) | safe_boundary_queue | initialize → thread/start编号 :resume | JSON-RPC通知 |
| 毕 | 持续届会 | @earendil-works/pi-coding-agent | steer | session.prompt() | SDK 回调 |
| 光标 | 持续届会 | ACP JSON-RPC 2.0 (英语:cursor-agent acp(中文(简体) ) | steer | session/prompt | session/update + 相关迅速反应 |
| 打开代码 | 持续届会 | 认证的 HTTP + SSE (opencode serve; v1 添加 --pure(中文(简体) ) | steer | CLI 主要会话提示 API | 本地康复+现场SSE |
(精确发射旗帜在 agent-driver/src/adapters/<backend>/. ) (中文(简体) )
版式
agent-driver/
src/
contract.ts # public SDK, session, receipt, event, and result types
sdk.ts # createAgentDriverSdk
registry.ts # built-in ids and capabilities
controller/
logical-session.ts # admission, queueing, turns, stop, cleanup
process-host.ts # internal child-process lane
sdk-host.ts # internal in-process SDK lane
adapters/<backend>/ # vendor launch + normalization
host/default-host.ts # standalone host implementation
internal/ # adapter-only transport/config/process helpers
testing/ # public conformance fixtures
src/
index.ts # daemon exports; re-exports the driver public API
drivers/index.ts # daemon runtime lookup/probe facade only
logger.ts # structured daemon logging
runtime/ # manager liveness, notification, error helpers
inbox/ # unread projection and freshness policy
manager/
agentDriverHost.ts # host resource/env/CLI preparation
managerPolicy.ts # pure scheduling reducer
managerRuntime.ts # applies effects through AgentSession
server/ # data/control-plane contracts and WebSockets
daemon/createDaemon.ts # runtime-agnostic daemon composition
cli/ # lifecycle CLI and proxy data-plane client
credentials/ # voucher broker and key-swapping proxy
scripts/
daemon.ts # local daemon entry
主机管弦乐(管理器 + 服务器)
除了驾驶一个单跑时间,后端包括 主机侧 管弦乐可以运行代理端到端:
manager/—— 说AgentProcessManager时间表进程。 A. 决 定 纯还原器managerPolicy.ts:单飞行单过程每剂,醒后/入睡, 消息队列 + 串联, 已停止检测 →spawn编号 :send编号 :stop编号 :terminate_stalled效果); 薄的执行器(managerRuntime.ts将其应用于真正的会议 回馈运行时间事件 .AgentRouter消耗控制平面(下方).server/——代理 qq服务器边界, 拆分为两个共享的平面 一份合同(contract.ts:- 数据平面 (单位:千美元)
ServerApi: 什么情况alookCLI呼叫——send编号 :inboxPull编号 :ack编号 :read编号 :listChannels,按路径样式处理ChannelRef编号. - 控制平面 (单位:千美元)
HostCommand+ 键HostControlChannel: 服务器 ~ 主机命令 (单位:千美元)agent:wake编号 :agent:stop; 附加bot:*寿命周期框架).agent:wake携带一个 无身体UnreadNotice(频道+最新后台,无消息内容) — DAEMON (单位:千美元)AgentRouter编号 :AgentProcessManager),不是服务器,而是决定是否产出一个 进程,通知已运行的,或将通知合并到下一个回合. 服务器没有程序内固定设备 :wsControlServer.ts(服务器端)和wsControlChannel.ts(主机端,可注射插座+) 指数后退重接+心跳)HostCommand边框 一个真实的 WebSocket(ws://127.0.0.1在本地 dev, 一个真实ws-doURL 进入 (b) 生产。 一个真正的服务器连接是相同的WsControlChannel指针 在真实的 URL 中, 上游没有变化 .
- 数据平面 (单位:千美元)
tests/integration/daemon/control-plane.test.ts 窃听一个真实的 WsControlChannel
反对运行 ws-do dev 服务器进入一个完整的循环:种子一个服务器/bot/
以人类拥有者的身份发布信息 并维护守护进程
控制通道收到结果 agent:wake HostCommand 那么,演戏
作为物剂(无CLI产出),在真实的证书链上回复
(转录) 凭证 代理 × 代理 × 代理 × 代理 × 代理 × 代理 ) 并称 复 答 回 可读
超过真正的HTTP。 有关如何运行, 请参看下方“ 在本地区域显示真实的守护进程 ”
测试用手进行.
全权证书(零信任隔离)
产出运行时间需求 有点 回调到服务器的证书, 但递递
它真正的 API 键意味着代理进程(以及它运行的任何工具)可以读取它,
不能被瞄准, 漏水迫使旋转. credentials/credentialProxy.ts
执行 凭单 模式取而代之——相同的形状是生产守护进程
使用 :
- 主机启动本地密钥抖取代理
127.0.0.1(只回转). - 每一次发射,a
CredentialBroker薄荷每枚发射凭单 (单位:千美元)vch_…(中文(简体) ) 输入0600文件。 给孩子<PREFIX>_PROXY_URL+ 键<PREFIX>_PROXY_TOKEN_FILE+ 其能力设置 从来没有真正的密钥。 。 。 . - 孩子们的CLI呼叫代理
Authorization: Bearer vch_…。 。 。 . - 代理验证凭证, 真实的交换
Bearer <hostApiKey>, (中文(简体) ), 邮票X-Agent-Id编号 :X-Client编号 :X-Agent-Active-Capabilities和前进 向上游提供.
这个买的 证书隔离 (代理只持有凭单),
能力范围界定 (代理拒绝券盖外的终点),
财务报告和审定财务报表 可撤销性 (保证金是每次发射的,可单独收回;旋转)
泄露的凭单从来不碰真正的钥匙). 这是 仅限 证书路径
—— 说 cliTransport 需求 ctx.credentialProxy (一个运行中的经纪人+代理 URL)和
丢出没有它; 没有任何简单文字的回落 能够给特工一个真正的
键。 一切都是中性主机:真实的密钥、上游 URL、凭单前缀和
标题都来自主机通过 CredentialBrokerConfig。 。 。 .
src/credentials/credentialProxy.test.ts 包括互换、拒付凭单
(单位:千美元)invalid local agent proxy token),能力范围界定,以及针对
向上抛出.
三个关键层次(以及每个层次的居住地点)
制作守护进程 3个 证书等级,而不是两个等级——对
理解什么 hostApiKey 应:
- 机器主密钥 ——认证守护进程到服务器,并用于
薄荷 代理证书。 仅保存在守护进程内( 未坚持到
磁盘或密钥链。 在当前的守护进程中, 它被传递为一个进程 参数v
(单位:千美元)
--api-key …),所以任何本地进程都可以通过ps aux。 。 。 . 缓解:从一个lev var,一个0600文件,或者从OS键链取而代之 (原始内容存档于2018-09-21). argv. 这个代理 从不转发主密钥。 。 。 . - 代理驾驶员证书 ——服务器薄荷每剂1枚(可视同
当守护进程用主密钥询问时.
这就是代理商在上游的 互换和前进
属于
CredentialBrokerConfig.hostApiKey从主密钥中嵌入 实值 主机侧管弦乐 并且故意超出这一范围 后端 . vch_凭单 - 由CredentialBroker每一次发射,写给0600 文件,也是代理程序所见过的唯一证书.
收件箱层( 新鲜度)
信息如何到达代理和发送动作如何 门 :
inbox/projection.ts—— 说projectAgentInboxSnapshot桶待处理 按目标(频道/DM/线程)和项目分别输入 仅以元数据显示的摘要[inbox notice: …](计算,第一, 最近,发送者,旗帜。 没有尸体——特工拉出尸体alook inbox pull。 。 。 .inbox/stateMachine.ts—— 说planAgentInboxSideEffect是"别回答" 僵硬的上下文"的后卫. 向外行动前(send编号 :task_claim编号 :task_update它比较模型已经看到seq边界对待决 信件和返回 转发 (让它过去), 举行 (保持行动, 将最近几条未见的消息显示为上下文,以便首先调和: 这是"Freshness hold ~ 保存为草稿",您可以在留言时点击 忙碌的代理人),或 绕行 (解释性)continueAnyway) (中文(简体) ). 这是纯粹的功能 生产稳定producerFactId; 条款编号SMR-002(假设)和SMR-006(持有的信封)保存完好.
构建运行( R)
这个项目使用 小时 (见《大会正式记录,第五十八届会议,补编第6号》) packageManager 页:1.
pnpm install
pnpm run typecheck # tsc --noEmit (passes clean)
pnpm test # Vitest package suite, including its packed/runtime categories
pnpm run test:integration # real infra: requires wrangler dev + ws-do dev + queue-worker dev (see below)
单位行为由 src/**/*.test.ts全面控制飞机和
信用链行为与真实的以下行为相关
tests/integration/daemon/ - 看这个
可执行的参考文献目录
网络( 实数) WsControlChannel 一个真正的WebSocket,真正的
enroll-agent/creditive-proxy HTTP呼叫,没有进程内快捷键).
将守护进程指向本地下面的真实区域
没有模拟服务器可以代表 src/web编号 :src/ws-do - 一个守护进程
总是跟真人说话 驾驶一个手在本地dev,运行
真实的服务器和行走真实的证书链(cmt_ 配对标志 +
cmk_ 守护进程证书 crk_ 每名代理导出键 :
1号航站楼 — Web app + Control-plane DO:
pnpm --filter @alook/web dev # http://localhost:3000
pnpm --filter @alook/ws-do dev # ws://localhost:8789
2号航站楼——对+激活一台机器,然后用
结果 cmk_... 证书 :
# 1. As a signed-in user, create a pairing token:
curl -s -X POST http://localhost:3000/api/community/machines/pair \
-H "Cookie: <session-cookie>" | tee /tmp/pair.json
# → { "tokenId": "cmt_…", "expiresAt": "…" }
# 2. Exchange it for a daemon credential:
curl -s -X POST http://localhost:3000/api/community/daemon/activate \
-H "Authorization: Bearer $(jq -r .tokenId /tmp/pair.json)" \
-H "content-type: application/json" \
-d '{"hostname":"my-laptop","platform":"darwin","arch":"arm64"}'
# → { "credential": "cmk_…", "machineId": "cm_…", "expiresAt": null }
# 3. Start it detached (the default):
pnpm run daemon -- start --machine-key cmk_… \
--server-url http://localhost:3000 \
--ws-url ws://localhost:8789
# Keep it attached for local debugging:
pnpm run daemon -- start --foreground --machine-key cmk_… \
--server-url http://localhost:3000 \
--ws-url ws://localhost:8789
一个捆绑在这个机器上的机器人(通过社区UI/API)现在可以被唤醒了
在一条频道上发布一条信息,它是一个成员——真正的唤醒者路径
(单位:千美元)src/web → src/queue-worker → src/ws-do交付 agent:wake 超过
守护进程是真的 WsControlChannel。 。 。 .
pnpm --filter @alook/daemon build 发射自成一体的守护进程捆绑。 这个
已公布的柏油球包括运行时驱动器的执行,而
@alook/agent-driver 也可以为主机独立构建和发布
只需要逻辑的SDK.
用法草图
import { createAgentDriverSdk } from "@alook/agent-driver";
const sdk = createAgentDriverSdk();
const opened = await sdk.open({
backend: "codex",
launch: {
workingDirectory: ".",
instructions: { format: "markdown", content: "Be concise." },
launchId: "launch-example",
},
config: {
model: { kind: "default" },
mode: "default",
},
});
if (!opened.ok) throw new Error(opened.error.message);
const { session } = opened;
const eventsDone = (async () => {
for await (const event of session.events) {
if (event.type === "assistant_message_completed") console.log(event.text);
}
})();
await session.start({ id: "command-1", kind: "user", text: "Inspect this repository." });
await session.send({ id: "command-2", kind: "user", text: "Now summarize the risks." });
await session.stop({ reason: "owner_request", forceAfterMs: 5_000 });
const result = await session.closed;
await eventsDone;
void result;
看着PII
守护进程在转发发送前, 以管道顺序过滤本地发送的 ALook 信件正文 。 每个机器人都有它自己的持续管道 <baseDir>/daemons/<machineId>/<botId>/pii/pipelines.json,只包含该机器人的插件源和配置。 它一次加载文件,并在内存中再用其配置并编译出过滤器;之后的发送不会重读JSON或者重新编译没有变化的过滤器. 成功的管理变革只取代了机器人的快照. 手动编辑文件需要重新启动守护进程 。 另一个bot的无效配置不能阻挡它. 附件和对云模型的要求在此过滤器外. 已启用的过滤器已关闭: 错误、 无效结果或执行限制 .
新鲜配置包含五个默认过滤器: 密钥, (中文(简体) ), 电子邮件地址, (中文(简体) ), 身份证号码, (中文(简体) ), 电话号码 财务报告和审定财务报表 银行卡键共运行先前的私钥,公认的API-键,JWT/Authorization和证书分配/连接-密码检查,保留其特定类别的替换标记. 已保存的管道保留已安装的过滤器、源、旗和删除;没有自动合并.
默认 身份证号码 过滤器覆盖16个国家和地区的选定身份、社会保障和个人税号。 模糊的数字格式需要文档标签。 见 支持的格式、检查和限制以前初始化的配置保留了已安装的规则源.
默认 电话号码 过滤器识别国际数字和电话标记的国家数字,使用被标注的Google编号元数据,以及现有的独立格式。 见 承认边界和来源归属。 。 。 .
在机器人会话内:
alook pii list
alook pii add --file ./company-terms.ts --description "Redacts internal project names"
TypeScript 文件默认导出一个同步纯转换返回 { text: string, triggered: boolean }数字 :
export default (text: string) => {
let triggered = false;
const output = text.replace(/Project Wren/g, () => {
triggered = true;
return "[INTERNAL_PROJECT]";
});
return { text: output, triggered };
};
布尔是明确的每个插件,包括当后期插件恢复文本时. 遗留字符串返回源仍然可以执行,每个节点输入/输出比较作为相容性估计;这不能报告不匹配。 成功发送包括 pii.triggeredFilters 仅在过滤器报告命中时,没有原始值。 见 证书格式、协议和接收限制。 。 。 .
插件没有提供文件系统、进程、环境、网络或模块导入能力。 它们运行时有内存和执行限制. 添加附件新过滤器,无法替换已有的过滤器。 CLI 没有禁用/ 删除操作 。 当守护进程在线时, 发送请求不是应用更改; 页面等待本地守护进程的结果 。 删除的默认在重启后保留被删除 。 规则可能错失敏感价值;在依赖管道之前先审查管道及其范围.
隐私游乐场通过Alook的服务器将测试文本转发给守护进程,并返回所选择的管道输出. 它使用相同的跑道并检查显示的配置修订. 测试输入和输出是短暂的:它们不存储在配置,聊天历史,重放队列或身体日志中. 没有发送聊天消息或模式请求 。 输入和输出必须每个符合1024 UTF-8字节;失败的过滤器返回安全错误而不是部分输出.
用户自动化
在用户设置中创建访问码 → 自动化 。 选择写入权限( E)创建 bots, (中文(简体) ), 创建服务器, (中文(简体) ), 邀请朋友访问服务器, (中文(简体) ), 发送信件),过期,以及每次许可的费率. 读取权限( E)列表机, (中文(简体) ), 列表朋友, (中文(简体) ), 列表服务器) 启动并可以关闭。 出现时保存完整代码:只返回一次 。 编辑名称、权限或费率保留了过期;明确保留了新的失效期再次开始。 删除一个代码拒绝了后续的请求.
use 运行独立于守护进程连接或 Look bot 会话。 它调用通过访问码认证的专用自动化API;普通客户端和bot API保留其原始认证,不消耗自动化配额. 设定 ALOOK_ACCESS_CODE 或通过 --access-code-file <path> 在资源命令之前。 保持文件的隐私。 不要将代码放入命令参数或 URL .
npx @alook/daemon use bot --create '{"name":"Helper","machineId":"mac1","backendId":"codex","model":"gpt-6"}'
npx @alook/daemon use server --create '{"name":"demo","description":"Team work"}'
npx @alook/daemon use server --invite '{"server":"demo#0042","friend":"alice#0042"}'
npx @alook/daemon use machine --list
npx @alook/daemon use friend --list
npx @alook/daemon use server --list
npx @alook/daemon use message --send --target '/demo#0042/general' --as me --file './message.txt'
npx @alook/daemon use message --send --target '/.dm/alice#0042' --as '@Helper#0042' --file './message.txt'
运行 npx @alook/daemon use expire 以立即过期提供的访问代码。 它不需要额外许可或剩余配额,只影响该代码。 后来的请求,包括一再到期的请求,均被拒绝。 过期的代码留下活动列表;他们的记录仍然被存储. 返回自动化会刷新列表 .
这些是实例。 使用由代码用户拥有的现有机器ID,可用的后端,以及被支持的模型. 可选的机器人字段是 description 财务报告和审定财务报表 reasoningEffort. Bot Creat 保持与网络形式相同的机器准备状态,模型和计划检查. 代码直接授予每个选定的动作 。 机器,朋友和服务器列出每个需要自己的读取权限;没有其他账户动作. 创建服务器不会添加 bots .
邀请命令将正常的服务器邀请链接发送给被DM接受的朋友;它不会强迫这个人加入. 它不接受任意的信息内容。 来电者必须是服务器的成员 服务器和好友参数使用由列表命令返回的全名#NNNN手柄.
message --send 需要默认关闭 message.send 写许可. 它发送UTF-8文件内容,保存行折,而不是附加文件或读取stdin. --as me 选择代码所有者; --as @name#NNNN 选择同一人类拥有的合格机器人。 其他身份被拒绝。 通过现有发送功能解决选定发送者的目标回放和权限. Bot 未读对齐, CAS 和重复检查仍然保留; 此命令不拉出其收件箱 。 独立访问码路径不执行bot认证代理本地PII过滤器.
读取响应是故意小的:机器返回id/name/status/后端(机器没有名称#NNN手柄);朋友返回名/handle/is my bot;服务器返回名/handle/通道. 自动化 API 在返回数据之前应用了这个预测.
每个命令返回一个JSON行,例如:
{"success":{"bot":{"id":"b1","handle":"Helper#0042"}}}
{"success":{"server":{"id":"s1","handle":"demo#0042","url":"https://alook.ai/c/channels/s1"}}}
一个代码的7权限 单独计算。 收费标准使用前一个小时或24小时,每个代码有64/小时的上限,甚至允许一天的收费标准. 受限方所接受的有效认证请求即使随后商业验证或创建失败,也会消耗请求. 无效的基本输入和超限请求不消耗另一个请求. 政策编辑保存了近代历史. 一个被拒绝的请求返回一个错误; HTTP 429 包含一个重试间隔 .
写 POST 发送一次 。 如果连接失败, 创建、 邀请或信件可能已经成功; 在再次尝试之前检查 A look . use 永远不会自动重复写请求.
use server --list 包括每个服务器参与的顶级 channels,与 name, (中文(简体) ), type (单位:千美元)text 或者说 forum)和犬科动物 ref它使用 server.read:公共频道跟随服务器成员;私人频道要求代码拥有者的创建者或访问成员. 线索和信件不返回 。 没有可见顶级频道的服务器保持空 channels 阵列.
仅供地方发展之用,通过 use --server-url http://localhost:<port> … 或设置 ALOOK_SERVER_URL。远程起源需要 HTTPS . use 不跟随 HTTP 重定向与访问代码.