Agent → 浏览器 push 合同
“push 合同” 指的是:一个能驱动浏览器的 agent
(chrome-mcp、playwright-mcp、或任何能在页面里执行 JS 的工具)
通过共享的 window.aegis.* 命名空间把数据推进 /ops/*,
而页面拿到数据之后做什么 —— 这两端的契约。
目前有两份合同。两份合同走同一条传输路径
(evaluate_script → window.aegis.<method>(payload) →
localStorage → 自定义事件 → 页面重新渲染),
负载形状不同、落点不同。
| 资产复盘 (maker-stats) | Plugin Push | |
|---|---|---|
| Push 方法 | window.aegis.importMakerStats(snapshot) | window.aegis.publishPlugin(pkg) + activate / deactivate / rollback |
| 负载 | MakerStatsSnapshot —— 6 字段的本周汇总 | SignedPluginPackage —— manifest + 摘要 |
| localStorage key | aegis.maker-stats.snapshot | aegis.plugins.registry |
| 事件 | aegis:maker-stats:updated | aegis:plugins:updated |
| 落点 | /ops/funnel-review | /ops/plugins |
| agent 在产出什么 | 把 espctl deposit list --json 的本周资产汇总 | 把刚编译好的 WASM 插件推进 registry |
| 频率 | 每次进 /ops/* 都推一遍 | 每编出一个新插件 / 每次 lifecycle 动作 |
两个落点都是 浏览器本地 —— 数据只在这个浏览器的 localStorage 里,服务端没有账本,没有上传,没有跨用户可见性。
共用底座 —— window.aegis.*
应用启动时挂载,幂等,任何路由下都能用:
// maker-stats 合同
window.aegis.importMakerStats(snapshotJson | snapshotObject)
window.aegis.getMakerStats()
window.aegis.clearMakerStats()
// plugin 合同
await window.aegis.publishPlugin(signedPluginPackage, actor?)
window.aegis.activatePlugin(pluginId, version, options?)
window.aegis.deactivatePlugin(pluginId, version, actor?)
window.aegis.rollbackPlugin(pluginId, version, actor?)
window.aegis.getPluginSnapshot()
window.aegis.clearPluginRegistry()
两个 push 方法都对输入做严格校验,负载不合法直接拒绝并
返回 { ok: false, error: '<reason>' }。写入成功后会派发
对应的 aegis:*:updated 自定义事件,/ops 页面实时重渲染。
共用信任模型
- 同源限定。一次
window.aegis.*调用只会写入 这个 源的 localStorage。agent 驱动到别的源,就是另一个沙箱。 - agent 即发布者。没有公钥签名,没有 CA。
对插件路径做
crypto.subtle.digest('SHA-256', ...)摘要校验 证明的是完整性而非身份 —— 在 “发布者就是 maker 自己的 自动化” 的前提下,这种强度刚好够用。 - 不共享 registry。同一台机器上两个浏览器各自独立的快照、 独立的 plugin registry。
agent 维护契约 —— 每次访问都刷新
这条规则对 两份合同 都适用。把 localStorage 当成刚被清空过来对待:
缓存可能被浏览器在压力下回收、用户可能手动清过站点数据、
也可能是同一份链接在另一个浏览器里被打开。
在读 /ops/* 任何内容之前,先用对应的 window.aegis.* 方法
把新鲜状态推进去。
完整协议 (maker-stats 版本) 见
每周资产复盘 —— Agent maintenance contract。
plugin-push 版本对称 —— 同样的 evaluate_script 流程,
不同的负载 + 不同的 window.aegis.* 方法。
该用哪份合同
- 想推这周的资产汇总,让
/ops/funnel-review渲染工作周报 Markdown? → 资产复盘 (maker-stats) - 想把刚编出来的 WASM 插件推上去,让接下来的 ESPCTL MCP / Build Lab 编译会加载它? → Plugin Push
两页内容自洽,根据当下任务挑一份读,互不依赖。