开发者指南 / 应用与 AGENT

运行应用,再追踪它的 Agent

OctoScript 描述工作流与界面。OctoSense 托管应用,并连接到 Rust Agent 内核 octos。本指南先把应用从源码带到运行中的 UI,再追踪一条用户请求如何经过应用 Agent。

帮助编写应用的开发 Agent,与回答应用用户的运行时 Agent,是两个角色。开发仪器检查运行中的 UI;应用 Agent 使用产品宿主授予的工具和数据。

交互式架构图

沿着一条路径,理解各层职责。

源码中的逻辑关系示意,不连接运行中的应用或账户。

先选择源码类型,再沿着宿主与渲染路径走到原生组件。

100%

选择节点查看职责。开启“移动图”后拖动;滚轮仍滚动页面。聚焦画布后可用方向键平移。“全图”显示整体关系,“定位节点”恢复清晰的节点视图。

应用作者Rust 应用模块编译后的 AppModule
应用包Splash 应用源码main.splash
应用包L0 卡片 + 数据 + kitpage.card
Rust + Makepad原生模块宿主挂载、事件与状态
App Hub应用包准入Manifest → 授予的策略
OctoScript + 渲染器实例化、转换、翻译卡片树 → UiNode → 源码
Card runner + Splash隔离 UI 宿主求值并挂载
UI 宿主原生 Makepad UI绘制 → 输入 → 更新
实线:执行或请求路径双箭头:请求与应答
应用包

Splash 应用源码

隔离脚本应用提供 main.splash,由 Makepad Script 使用宿主安装的能力求值。这是 UI 入口,与独立 OctoScript 工作流 CLI 分开。

阅读对应源码导读 ↗
文字版:两条路径与各节点职责

应用 → 原生 UI

先选择源码类型,再沿着宿主与渲染路径走到原生组件。

  1. Rust 应用模块 — 原生 Rust AppModule 提供编译后的组件、状态与服务代码,也可嵌入 Splash。此路径描述宿主内的模块;独立原生程序另有进程与集成约定。
  2. Splash 应用源码 — 隔离脚本应用提供 main.splash,由 Makepad Script 使用宿主安装的能力求值。这是 UI 入口,与独立 OctoScript 工作流 CLI 分开。
  3. L0 卡片 + 数据 + kit — L0 卡片声明数据、状态与组件,实例化在不使用 VM 的情况下检查并展开这些声明。它仍需声明的数据与兼容的组件 kit;卡片不会自行启动 Agent 或获得工具访问权。
  4. 原生模块宿主 — 编译后的宿主注册 AppModule、挂载 UI,并向 Rust 处理器交付事件。宿主持有状态并管理组件生命周期。独立宿主与完整 Shell 的服务接入不同;Shell 还提供请求 broker 与 Agent 集成。
  5. 应用包准入 — 宿主在求值前检查应用包,并用 HostLimits 解析 manifest 请求。存储隔离目录、网络允许列表与资源预算限制应用。声明获准后,仍需实际可执行的服务。
  6. 实例化、转换、翻译 — OctoScript 检查并实例化语义卡片树。Lowering 把这棵树转换为 kit 源码;受检查的求值得到渲染器 UiNode,再由 Rust 生成 Makepad 组件源码。原生 kit 走保留设计几何的路径;这些是不同的树表示和宿主阶段。
  7. 隔离 UI 宿主 — Runner 在 Splash 中挂载脚本或转换后的卡片源码,并路由 UI 事件。独立 card-host 没有注册宿主服务或 Agent 运行时;OctoSense Shell 提供已注册服务与应用 Agent 桥接。
  8. 原生 Makepad UI — Makepad 绘制组件,并通过宿主事件循环交付输入。宿主更新状态并决定何时重绘。看见组件不等于已接通数据库、设备 API 或 Agent 操作。
  • Rust 应用模块 → 原生模块宿主: 编译/注册
  • Splash 应用源码 → 应用包准入: 应用包
  • L0 卡片 + 数据 + kit → 应用包准入: 应用包
  • 应用包准入 → 实例化、转换、翻译: 卡片入口
  • 应用包准入 → 隔离 UI 宿主: 脚本入口
  • 实例化、转换、翻译 → 隔离 UI 宿主: 组件源码
  • 原生模块宿主 → 原生 Makepad UI: 挂载
  • 隔离 UI 宿主 → 原生 Makepad UI: 渲染

请求 → 答案

Shell 控制访问,共享内核运行 Peer 会话;应用数据由宿主工具提供。

  1. 应用聊天中的用户 — 用户可使用桌面 Ask <app> 或受支持的应用聊天界面。可信 Shell 输入标记为 person 来源;脚本的 person 触发只是它自己的声明,不能绕过审批。答案返回发起请求的会话,并保留独立记录与请求 ID。
  2. 系统 Agent — agents.ask 负责准备并等待就绪;peer_send_input 使用实际 Peer 标识,经 Shell 委派请求。系统请求使用 Peer session,peer_gather 收集结果。这些路由不会提供通用的应用到系统委派 API。
  3. Shell 应用 broker — Broker 是 Shell 的请求适配器,负责准备获准的应用/账户 Peer、打开会话并路由输入输出。用户共享上下文 session 与系统使用的 Peer session 分别保存记录,并共享有限的近期上下文。
  4. 共享 Agent 内核 — Shell 的应用 Peer 共享内核运行时。Turn 编排任务先等待启动屏障;准入、归属记录与接受响应完成后才释放屏障并进行 Agent 处理。Peer 不等于一个 Tokio 任务或一个 UI VM。桌面/Android 使用子进程,OpenHarmony 嵌入运行时。
  5. 应用 Peer — Peer 是持久的应用/账户身份。每个 session 保存一段对话,模型处理其中的 turn 并仅请求可用工具。宿主结果返回该 turn。用户答案发给对应事件接收方;结果也可留下带来源标记的 blackboard(共享结果)记录,用户 turn 不会因此自动唤醒系统 Agent。
  6. 获准的宿主工具 — 宿主适配器在执行操作前落实范围与确认策略。跨应用工具还需所有者的共享声明与调用方授权;App Hub 默认准入拒绝 mail.send 等任意名称。商店应用的脚本工具声明仍缺少分发器。
  7. 应用记录/账户 API — 应用业务数据与对话记录、Agent 记忆分开。访问需要已实现的工具。在 Unix 上,用户同意且开放的账户工作区可用时,可提供有界 files.list/read/search;其他应用存储与宿主密钥不会自动可读。
  • 应用聊天中的用户 ↔ Shell 应用 broker: 输入/答案
  • 系统 Agent ↔ Shell 应用 broker: 委派/结果
  • Shell 应用 broker ↔ 应用 Peer: turn/事件
  • 共享 Agent 内核 → 系统 Agent: 运行
  • 共享 Agent 内核 → 应用 Peer: 承载
  • 应用 Peer ↔ 获准的宿主工具: 工具/结果
  • 获准的宿主工具 ↔ 应用记录/账户 API: 操作/数据

先确定要运行什么

产物运行时从哪里开始
工作流 .octoscriptOctoScript 有界工作流运行时,使用已注册工具和宿主签发的授权工作流示例
原生 Rust 应用编译后的 AppModule,包含 Rust 事件处理与 Makepad 组件OctoSense 构建与启动说明
受限容器中的 main.splash 应用在 Splash UI 宿主内求值的 Makepad ScriptDesign Flow 的 tools/octo run 与 App Hub 的 card-host
L0 page.card、数据与 kitOctoScript 检查并实例化卡片;OctoScript-Makepad 转换和渲染同一个卡片宿主,同时提供声明的数据与 kit 文件

tools/octo 是 Python 开发命令,负责启动 Rust 卡片宿主;它不是 octos Agent 内核。原生 Rust 应用也可以嵌入 Splash 视图,同时把服务保留在编译后的 Rust 代码里。

本地运行一个容器应用

按 Design Flow 原生工作区说明准备仓库和构建环境。运行时锁文件选择彼此兼容的源码版本。

**命令验证状态:**下列原生构建与启动命令未在本次网站检查中执行。

在 Design Flow 仓库中执行:

python3 tools/setup-native.py
python3 tools/setup-native.py --check

进入同级 App Hub 仓库:

cargo build --release -p octosense-card-host -p octosense-app-hub

回到 Design Flow,选择尚不存在的目标目录与空闲端口:

tools/octo doctor
tools/octo new /tmp/octosense-notes --id walkthrough.notes --name "Notes"
tools/octo run /tmp/octosense-notes/bundle --hidden --detach --port 8141
tools/octo shot 8141 /tmp/octosense-notes/first-frame.png
curl -s http://127.0.0.1:8141/quit

run 的应用包路径是位置参数。使用 --detach 时,新进程提供 UI 和已渲染帧后命令返回;不加这个参数,终端会等到应用退出。开发运行默认会更新 manifest 的摘要,因此请使用未签名的工作副本。

这条路径检查解析、渲染,以及宿主限制下的存储和网络策略。独立 card-host 没有注册宿主服务,也没有 Agent 运行时,无法完成 mail.*、model.complete 或 octos.* 请求。要在完整 Shell 中测试已安装应用,请按本地签名目录演练操作。桌面、Android Home 与 ROM 命令属于 OctoSense 仓库;ROM 构建还包含操作系统。

从卡片源码到原生组件

**实例化(realization)**检查卡片声明的数据与状态,并展开组件,得到完整的卡片树。**转换(lowering)**把这棵树变成组件 kit 和渲染器需要的更具体的源码。

page.card + 宿主数据 + 实例状态
  → OctoScript L0 检查与实例化
  → 组件 kit 转换
  → 受检查的求值,得到渲染器 UiNode 数据
  → Makepad 组件源码
  → 原生宿主挂载 View 并处理事件

L0 实例化树与渲染器的 UiNode 是不同的数据表示。原生 kit 加载 native/<mood>/kit.json,走保留设计几何的路径;其他 kit 组装调色板和组件源码。两条路径都由宿主提供数据、注册组件、处理动作,并决定何时重新渲染。

在框架的目录与预览宿主中,最终组件源码在应用的主 makepad-script VM 上求值,得到的 View 赋给 Splash.view。App Hub 的容器脚本宿主有自己的准入与隔离环境设置。共享 VM 实现并不意味着每个应用共享实例、绑定或权限。渲染器源码导读说明了具体调用和不同的求值预算。

追踪“总结我保存的笔记”

假设应用已把笔记存进向 Agent 开放的账户目录,用户也在 OctoSense 中允许了该 Agent。Peer 是应用 Agent 的身份;session 保存一段对话及其记录;turn 是一次请求以及为回答它而执行的模型和工具工作。

  1. 用户在桌面打开 Ask <app> 并发送请求。Shell 选择应用 Peer 及其用户会话。应用也可以通过 Shell 的 octos.* 服务提供自己的聊天界面。
  2. Shell 以用户身份发起 turn。Octos 检查是否允许执行、记录归属,再启动模型处理。模型可以请求工具;模型写出的文字不会自行授予权限。
  3. 在 Unix 上,用户同意且账户工作区可用时,Shell 可提供有界的 files.list、files.read 和 files.search 工具。它们读取开放的账户目录。位于应用存储根目录的记录,以及该目录之外的宿主服务密钥,不会自动变成可读数据。
  4. 工具结果回到模型,模型据此写出答案。事件与完成状态返回最初提出请求的用户会话。

应用 UI 的数据存储、对话记录与 Agent 记忆是不同的存储。其他位置的结构化记录,需要由已实现的工具读取和解释;仅随应用包提供工具声明,不能让操作自动变成可执行代码。

系统 Agent 可以使用应用 Peer 的实际标识委派同一请求。系统请求走 Peer 的系统会话;用户聊天可以使用另一条共享有限上下文的 session。两者各自保存对话记录。用户答案返回该会话的事件接收方。两种来源都可以在 peer blackboard 中留下标记了来源的协作结果;用户来源的结果不会自动唤醒系统 Agent。系统 Agent 汇总自己委派请求的结果。

调用其他应用或系统 Agent

跨应用调用需要工具所有者的可共享声明、调用方授权、宿主准入,以及实际可执行的路由。工具策略要求确认时,还需经过批准。App Hub 默认提供的工具列表不包含任意名称,例如 mail.send;把它加入 agent.tools 会被默认准入拒绝。

系统到应用的委派已经实现。容器应用不会继承系统 Agent 的工具,也不会自动得到任意应用到系统的委派能力。它只能使用宿主实际提供并授权的协作路由。

声明或功能当前集成边界
第一方 implemented_by: "host-service" 工具按宿主策略,通过已注册的 Rust 服务执行。
商店应用的 implemented_by: "app" 工具当前 Shell 没有这些声明的脚本分发器;打开应用 UI 也不会安装一个。
应用包 AGENT.md 与 skillsApp Hub 会验证,但当前 Shell 不把内容安装到应用 Peer。仓库里的 AGENTS.md 则用于指导开发 Agent。
模型 needs、后台触发器与调度元数据验证声明不会补齐尚未接入的运行时选择与调度行为。
L0 sys.chat / ChatEntryShell 的运行时支持,但当前 Design Flow 创作版本不支持。编写这类卡片前,先检查 AI 服务与运行时兼容性。

Tokio 在哪里

Peer 可以在没有任务运行时继续存在。处理请求时,Octos 先创建停在启动屏障后的 turn 编排任务,再检查准入、记录归属并发送接受响应,最后释放屏障;拒绝请求时则中止等待中的任务。编排任务随后创建 Agent 处理任务。宿主工具调用通过单次结果通道等待;等待期间 Tokio 可以调度其他工作。实际的数据库或网络操作在哪里执行,由宿主决定。

连接传输与事件转发还会增加其他任务。卡片/VM 求值和 UI 事件遵循 UI 宿主的调度;一个 Peer 不等于一个 Tokio 任务,也不等于一个 UI VM。Shell 的应用 Peer 共享内核运行时。桌面与 Android 通常使用子进程,OpenHarmony 使用嵌入式运行时,iOS 当前没有集成内核。octos 请求与任务导读进一步解释准入、取消与应答匹配。

继续阅读源码

  • OctoSense:原生应用、桌面/Home/ROM、对话入口与 Shell broker。
  • App Hub:准入、安装、容器存储与宿主服务请求。
  • Design Flow:CLI 行为、图像/卡片阶段与发布交接。

排查实际应用时,请阅读消费方 Cargo 和运行时锁文件选定的源码版本。本站预构建 WASM 实验室有独立的版本与构建记录,只使用本地演示状态,不连接生产 OctoSense 应用 Agent 或账户。

←全部文档