blob: e491aeb742868b798be69ba830e4ab82140c22fc [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# maka-agent-api
[English](README.md)
包含 Agent、Session、Executor、WorkHub 的协议声明以及 Agent 配置 schema。原生服务与 SDK 生成共用这些定义。调用方只需要公开契约时,可以依赖这里,无需引入 Agent 执行引擎。
独立 Desktop 通过同一个 Root 绑定的[公共 Host client](../../../platform/host-runtime/src/application/host/client.rs)使用持久 Agent 服务,不直接打开 Agent 存储,也不嵌入执行引擎。字段及 schema 以 [Agent 契约](src/contract.rs)和[交互契约](src/contract_interactions.rs)为准。
`history` 分页保持同一个 `through` 边界,`watch` 从最后的 `nextAfter` 继续,并发布队列与待处理交互更新。`send` 接受工作并返回其身份,`stop` 指定该次 invocation。重连后通过 `pendingInteractions`、`interaction` 和 `respond` 重建并回答原请求。修改保留原操作回执;丢失响应不代表可以重新发送。参见[原生接入验收](../native/README.zh-CN.md)及[传输所有权与退出方式](../../../platform/transport/README.zh-CN.md)。
历史行引用使用 `position: { sourceSequence, itemIndex }`,先按产生该行的原始事件排序,再按该事件内的行序号排序。游标、来源读取、提示词锚点及工具图片引用共用这一位置。`through` 和 `{ kind: "event", sequence }` 仍指向原始事件;模型完成时产生的所有历史行都归属于该完成事件。
`search` 在所选 Session 的历史中按字面量查询,显式传入 `caseSensitive` 和 `wholeWord`。忽略大小写使用 Unicode 简单大小写折叠,不做规范化;全字匹配要求两侧不紧邻 Unicode 单词字符(字母、组合标记、十进制数字、连接标点或连接控制符)。以 `after: null` 开始,分页时保持查询、选项和 `through` 不变,沿 `nextAfter` 继续,即使当前页没有命中;null 表示扫描结束。每条命中标明原始字段,可通过 `source` 精确读取。搜索命中以 `position` 和原始 `field` 定位。用相同 `through` 调用 `history`,位置为 `{ kind: "row", position: hit.position, field: hit.field === "thinking" ? "thinking" : "body" }`,可打开空工具行及明确指定的内部工具;后续隐藏规则不变。已有字节游标仍用于续页。
Executor 的 `execute` 通过名为 `attachments` 的单个可选二进制资源接收不可变文件。资源 metadata 是按顺序排列的 `{ name, mimeType, bytes, digest }` 数组;资源内容按同一顺序连接各文件的原始字节,偏移由前项长度累加得到。必须通过实际请求资源读取,Host 字节预算和清理责任仍归原请求所有;metadata 本身不授予访问权限。
`fork` 根据来源版本,从完整一轮或全部当前历史创建旁支会话。所包含的工作必须已结算;后续轮次仍在运行时,也可分叉更早的完整轮次。新 Session 保留这段历史和附件,共享已验证的工作区,收窄权限且不带入运行中的工作;`branch` 标明来源。丢失响应后使用原操作引用恢复;Host 结果仍未知时,`forkReceipt` 可查找已发布的分叉。返回 null 不代表操作未发生,也不授权创建替代分叉。字段见[分叉声明](src/contract_fork.rs)。
`diagnostics` 在固定的 `through` 边界内,从新到旧分页读取执行、模型步骤及自动标题失败。`watchDiagnostics` 在订阅时及变化后发送当前诊断版本;重连后重新读取最新页。这些会话范围内的运行记录保留原 invocation/event 标识和安全的类型化原因,不包含提供方响应正文或复制来源会话的失败。诊断版本独立于对话历史,因此回答结束后才发生的标题失败仍可发现。
`context` 返回所选 Session 最近一次已准备的 Main 请求,包括运行中或已中断的请求。它按消息角色和工具定义展示原始 Host 输入构成;token 数为估算,提供方报告的实际输入用量单独返回。固定 `through` 可在重连后读取同一结果。不存在的请求或缺失的测量保持 null,复制的历史不算新 Session 自己执行的请求。字段见[上下文声明](src/contract_context.rs)。
`gitStatus` 和 `gitDiff` 通过同一个 Agent 服务读取所选 Session 的仓库,也适用于 WorkHub 协调者会话。状态区分已暂存、工作区和未跟踪的变化;同一路径可以同时出现在已暂存和工作区部分。diff 分别比较 HEAD 与索引、索引与工作文件,或空文件与未跟踪文件。尚无提交的仓库返回 null `head`;没有仓库的工作区返回 null。路径以 `bytesBase64` 保留 Git 文件名的原始字节,重命名呈现为删除加新增。
这些查询提供当前的只读观察,不是仓库快照。状态完整返回已暂存、工作区和未跟踪的条目列表。单文件 diff 读取完整输入,区分文本、二进制、未变化和不支持的情况;文本补丁完整返回。仓库元数据、control 文件、状态条目、diff 输入和补丁在内存中缓冲。取消采用协作方式;这些查询不承诺有界内存或固定执行时限。所选工作区必须是仓库根目录;外部过滤器、稀疏检出、子模块等不支持的仓库特性会明确失败,不执行配置中的命令。工作区或比较基准变化后应重新查询。协议类型见 [Git 声明](src/contract_git.rs);`snapshotPatch` 在工作区写者全部结清后捕获已完成工作的不可变补丁。捕获会读取完整源内容,并在发布前将完整补丁缓冲在内存中;`readPatch` 分页读取该原始产物,后续执行和 Host 重启不会改变它。
`listFiles` 列出所选 Session 工作区中一个目录的直接子项,`watchFiles` 通知该目录需要重新读取;也适用于 WorkHub 协调者会话。`path` 为 null 表示工作区根目录,其他路径使用 `WorkspacePath`,以 `bytesBase64` 保留相对文件名的原始字节。符号链接作为叶子展示,不进入其目标;排除 `.git`、工作区标记及 Host 私有状态/control 目录,模型配置为无限制访问时也不例外。私有状态内仅允许读取 Session 已验证的受管 worktree。每页最多 128 项,以 512 KiB 为软字节目标,完整首项始终可以推进;路径保留完整相对字节。平台无法表示的文件名明确报错,不做有损转换。
`readFile` 是普通 UI 可用的订阅,按相同 Session 权限读取一个精确 `WorkspacePath` 指向的当前普通文件。完整捕获 UTF-8 文本或受支持的原始图片字节,使用不跟随符号链接的目录/文件句柄,并在发布前校验工作区、权限边界及文件身份。它依次发送 `begin`、每块最多 32 KiB 原始字节的 Base64 `chunk`,最后发送明确的 `end` item;订阅最终值为 null。文本块止于 UTF-8 边界。消费者必须核验连续字节偏移、End 中匹配的版本/大小/摘要和完整 SHA-256 摘要,才能接受内容;缺少 End 表示传输未完成。文件缺失、已变化、二进制和不支持的文件类型均有明确结果;权限、非法路径和 IO 错误仍然返回失败。空文件是合法文本。
版本绑定原始内容、文件/父目录物理身份和路径;可选 `expectedVersion` 是重新读取的前提条件,不授予权限。一次读取的所有块均来自同一份完整原生 buffer,交付中替换路径不会混合版本。它不承诺持久 artifact,也不承诺并发写入下的原子文件系统快照。再次读取会重新授权 Session 并捕获当前内容;历史 `toolImage` 继续使用独立的不可变来源。接受预览前需继续读取至订阅成功结束、清理完成;关闭订阅以取消,然后等待原始清理完成。
先订阅并等待 `ready`,再读取第一页,并核对它与 `ready` 的 `directoryIdentity` 一致;通过 `next` 继续分页。收到 `changed` 后丢弃游标,从第一页重新读取。分页反映实时目录,并发编辑可能改变分页结果。通知可合并,不提供历史事件重放;重连后重新订阅和读取。检测到所选子目录删除或替换后,以 `unavailable` 结束订阅;Session/工作区授权失效或文件系统观察失败则以错误结束。离开目录时关闭订阅。
macOS 上,活动订阅还会比较直接子项的元数据。每次扫描后至少等待一秒;扫描耗时较长时,等待时间延长到该次扫描耗时的九倍,目标是每个订阅约用 10% 的时间扫描,并不承诺固定通知期限或限制总 CPU 用量。即使原生通知延迟,也能发现持续存在的变化;未变化时不发送通知。扫描不读取文件内容、不跟随符号链接,也不进入子目录。`ready` 会等待首次扫描;大目录或较慢的存储可能延迟就绪和后续通知。关闭订阅会等待其正在执行的文件系统工作结束。
[源码](src/lib.rs) · [Cargo 配置](Cargo.toml)