RFC: Remote Daemon Observability — HTTP API + CLI Remote + Web Dashboard #133
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Nerve daemon 目前只通过 Unix socket 暴露 IPC,只能本机查询。需要一种机制让主人在任意设备上查看各 agent 的 daemon 状态。
Motivation
Current State
trigger-workflow,trigger-sense,list-senses,kill-workflowpackages/cli/src/daemon-client.ts, 通过node:netconnect 本地 socketProposal
Phase 1: HTTP API +
nerve workflow list给 daemon 加可选的 HTTP server,把现有 IPC 能力包一层 REST:
配置(yaml 优先,CLI override):
API endpoints:
WorkflowStatus (新增):
同时新增
nerve workflow listCLI 命令,Phase 1 走 IPC,Phase 2 接 HTTP transport。实现要点:
daemon-ipc.ts的 handler 逻辑,HTTP 层只做 JSON ↔ request 转换/api/health包含hostname(os.hostname()),多设备场景区分api.port则不启动 HTTP(向后兼容)@uncaged/nerve-core(和现有 IPC types 同层)Phase 2: CLI Remote —
nerve --host <addr>CLI 侧加
--host全局 flag + bearer token auth:实现要点:
daemon-client.ts基于 Phase 1 定义的 transport interface 实现HttpTransport--host存在时用HttpTransport(带Authorization: Bearer <token>),否则用现有UnixTransportapi.token必须匹配,否则 401Phase 3: Web Dashboard(可选)
在 Phase 1 的 HTTP server 上挂一个内嵌静态页面:
Implementation Plan
workflow listcore(types) +daemon(server) +cli(command)--host+ auth +statuscommandcli+daemon(auth middleware)daemonDecisions
9800,yamlapi.port优先,CLI--portoverrideapi.token+ CLI--api-token)/api/health包含hostname字段nerve workflow list提前到 Phase 1Ref
packages/core/src/daemon-ipc-protocol.tspackages/daemon/src/daemon-ipc.tspackages/cli/src/daemon-client.tsactiveCount(),queueLength(),totalActiveCount()方法小墨 review 反馈已全部采纳(#133 comment)
小墨 Review 反馈
整体方向 ✅ 三阶段划分合理,Phase 1→2 紧密衔接,Phase 3 可选不阻塞。
Open Questions 回复
9800👍。建议 yaml 配置优先于 CLI flag(api.port: 9800),CLI--port作为 override--api-token,--host意味着跨设备,哪怕内网也该有基本 authapi.port+api.token两个字段就够补充建议
/api/health加个hostname字段,多设备场景下方便区分nerve workflow list既然本地也能用,Phase 1 就可以顺手加上(走 IPC),Phase 2 只需接 HTTP transport小墨姐的建议全部采纳 ✅
api.port+api.token,CLI--port/--api-token作为 override/api/health加hostname—os.hostname()一行搞定,加上nerve workflow list提到 Phase 1 — 先走 IPC,Phase 2 只接 HTTP transportRFC 已更新 👇