You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Context Usage:当前 provider request 的短期上下文预算,source of truth 为 MA agent.getContextUsage() 与模型 capability;字段至少包括 used、compactThreshold、total/window、source。
Parent Scope Status
not attempted— 本 Issue 是 MA × Agora 记忆产品体验重构的父级执行 Issue。只有下方功能 Case、跨仓契约、真实 TUI/E2E 验收全部完成后才能关闭;局部 UI、单元测试、Mock MCP 或仅 Agora 后端完成都不能视为父级完成。Problem
MA 当前已经能把 Agora 作为 MCP stdio provider 进行对话,也暴露了 MemoryPatch 的 mount / disable / internalize / rollback 能力,但用户面对的仍是一套“能跑、不可操作”的工程接口:
目标不是给现有底栏再加几个字段,而是交付一个完整答案:
Evidence
审计快照:
zimoos/my-agent@98e019d29605e8ab6740e68f9ee6156e33eb3669zimoos/agora@10c0b8fc48fe296d8ef343402d61fecb5217be69MA 当前证据:
src/cli/App.tsx只有 ModelPicker / SessionPicker,没有 MemoryPicker 或/memory控制台。src/cli/components/StatusBar.tsx::formatAgoraStatus()把 model、memory status、patch 数量、session 拼成单行摘要。src/cli/utils/modelProfiles.ts::fetchCredentialModels()对 Agora 只读取modelsCache,没有调用 Agoramodels_list/models_status/models_download。src/provider/agora.ts::AgoraMemoryController只有status/mount/disable/internalize/rollback,缺少 Profile/Patch 目录、重命名、选择集、intake 状态和后台任务接口。src/provider/agora.ts::internalize()前台轮询memory_intake_get,最多 120 次 × 500ms;成功后执行upsertProfile(profileId, [patchId], true),覆盖整个 active patch 集合。memoryReady()要求一组 memory tools 全部存在,缺一个工具就整体关闭,无法做能力降级。Agora 当前证据:
models_download、models_status、MemoryProfile、binding、intake、版本、回滚和 chat metadata 挂载证据已经存在,应直接复用。RuntimeService.memory_intake_status()已根据memory_checkpoint_message_count计算 pending increment,说明增量内化基础已经存在。memory_patches_list和memory_intake_status,MA 无法构建完整目录和低成本自动触发判断。_memory_intake_lineage()在多个 active patch 中取第一个model_delta作为 lineage;该行为没有用户可见语义,不能作为自动内化规则。active_memory_patch_ids已经是数组,Profile/Runtime 已有多 Patch 基础,不需要重新设计第二套记忆容器。现有可复用工作:
McpClientprogress、provider progress event、ModelPicker、SessionPicker、UI store、sessionproviderState、PTY/visual test harness。Architecture Direction
1. 所有权边界
chat_completemetadataagent.getContextUsage()/ provider capability硬边界:
agora mcp serve,不回退到本地 HTTP。2. MemoryProfile 产品模型
MemoryProfile 是用户操作的“命名记忆组合”,MemoryPatch 是底层可版本化资产。
建议扩展 Agora Profile 契约:
规则:
writable_patch_family。/memory internalize --into <module>明确指定一个目标模块。3. Binding 与选择优先级
复用现有 binding,确定性解析顺序:
4. 自动内化状态机
每轮结束只做轻量资格检查,编译在后台进行:
默认触发策略:
Agora 必须以
session_id + source_message_start + source_message_end或等价稳定键保证幂等;重复触发返回同一 job,不生成重复 Patch。激活规则:
noop是正常完成,表示没有耐久记忆,不作为错误。mountable=true且质量/eval gate 通过时才能自动推进 writable family。activation_mode=review或低置信结果进入待审核,不自动改变挂载集。5. 能力协商与降级
用 granular capability matrix 替代
memoryReady(): boolean:6. Context Usage 与 MemoryPatch 的边界
上下文和记忆是两个不同的产品概念,TUI 必须同时保留,任何 Agora UX 重构都不能丢掉现有 context usage:
agent.getContextUsage()与模型 capability;字段至少包括used、compactThreshold、total/window、source。ctx used/trigger,详细页显示used / trigger / window / source。7. Agora 二进制分发与知识产权保护
当前不引入登录、账号、机器码、设备许可证、离线租约或 ZimoOS 依赖。用户安装后直接使用;MTeam 接入后的账号授权、设备管理和商业分发另开 Issue。
本 Issue 的强制交付边界是“用户只能拿到原生二进制,不能直接看到 Python/JavaScript 源码或仅压缩、混淆后的语言产物”:
边界与规则:
.py、.pyc、.js、.map、源代码压缩包、测试夹具、源码路径或 debug symbols。@zimoos/agora的 launcher 自身也必须是原生 Mach-O,不允许使用可读 JS shim。agora-core;算法和质量阈值不重新设计。0.2.0;MA 禁止latest、^或~。MA_AGORA_COMMAND仅作为显式开发 override,必须显示 unverified。TUI Product Design
主界面
主界面保留两层产品摘要;Context Usage 是第一层强制字段,不得因 Agora memory 加入而删除:
source和完整 window 可在空间足够时显示,窄终端至少保留ctx used/trigger。/memory status或 debug 详情。unknown/stale必须和verified视觉区分。/memory控制台复用 ModelPicker/SessionPicker 的 Ink 模态交互,新增:
命令与快捷键必须等价:
/memory/memory list/memory new <name>/memory rename <profile> <name>/memory use <profile>/memory status/memory internalize [--into <module>]/memory auto on|off/memory history/memory rollback <version>/memory disable这些命令直接调用同一 MemoryController,不依赖模型理解自然语言。Agent 内置 memory tools 可以保留,但必须复用同一控制器和验证路径。
后台活动
Functional Cases
A. Provider 与模型开箱体验
not downloaded和下载动作,不进入无限 thinking。B. Profile 创建、命名与项目切换
<项目名> 主记忆,不要求用户输入 UUID。C. MemoryPatch 动态拔插与版本维护
/memory能从 Agora 实时列出当前模型兼容 Patch,不依赖本地缓存猜测。chat_completemetadata 验证 active patch ids,验证前显示 pending/stale。D. 自动与手动增量内化
/memory internalize可立即提交当前 pending increment,并复用同一 job 状态机。up to date;没有耐久记忆时显示noop,两者都不是失败。E. 多 Patch 下的确定性内化
writable_patch_family,不得使用“active 列表第一个 Patch”作为隐式目标。F. TUI 可读性与交互
/memory支持键盘选择、取消、空列表、加载、错误、窄终端和长名称截断。/memory明确说明需要切换 Agora;不注册/执行伪 memory 操作。G. 证据、持久化与隐私边界
mounted/verified只来自 Agora response metadata,不能来自 config 或操作调用成功文本。H. Context Usage 不丢失
context used / compact trigger;空间足够时同时显示 window 和 source。agent.getContextUsage()的真实字段与告警阈值,不用 MemoryPatch 状态覆盖、重命名或伪造 context 数字。I. 全原生制品与完整性保护
@zimoos/agora解包后只有 npm metadata、manifest 和原生 Mach-O launcher,不包含 JS/Python 启动壳。@zimoos/agora-darwin-arm64只包含 Mach-O runtime、原生动态库、MLX runtime data 和 manifest;无.py/.pyc/.js/.map。0.2.0平台制品,并验证 package integrity、manifest SHA-256、runtime version、protocol、ABI 和 capabilities。Reuse / Mature Solution Plan
优先复用现有实现,不新增第二套模型下载器、记忆库或任务系统:
McpClient和 provider progress event,不引入自定义 IPC。ModelPicker/SessionPicker的 Ink 模态、UiStore、useInput、session store 和 providerState。AgoraMemoryController作为 domain seam,扩展为 typed actions;命令、UI、agent tools 共享它。不需要外部框架研究:当前仓库已有 MCP、Ink、registry、progress、job 和真实 E2E 基础,内部复用足以形成一致架构。
Implementation Checklist
P0 — Agora MCP/数据契约补齐(跨仓前置)
memory_patches_list(base_model_id, include_disabled),复用现有 CatalogService/registry。memory_intake_status(session_id),返回 checkpoint、pending range/count/tokens、active/latest job。memory_intake_run增加或内部生成稳定 idempotency key,并对同一 range 做原子去重。writable_patch_family和 typedauto_intake_policy,补 registry migration。P0.5 — 全原生用户制品、npm 平台包与完整性
agora-core,提供版本化本地 stdio/C ABI contract;release 禁止回退到同名 Python 实现。@zimoos/agoralauncher 包和@zimoos/agora-darwin-arm64平台包,统一版本0.2.0。.py/.pyc/.js/.map或非 Mach-O 入口。P1 — MA typed provider/control plane
AgoraCapabilities粒度能力替代全有或全无的memoryReady()。AgoraMemoryController:listProfiles、create/rename/select/disable、listPatches、applyPatchSelection、getIntakeStatus、startIntake、listVersions、rollback。chat_completemetadata 验证。models_list/status,接入models_download和 progress;cache 仅作离线提示。MemoryIntakeCoordinator:资格判断、single-flight、poll/resume、conflict/review/noop/failed。agent.getContextUsage()为 context UI 唯一数据入口;不得改由 Agora providerState 或 MemoryProfile 推导。P2 — TUI 与命令
MemoryConsole/MemoryPicker、Profile list、Patch multi-select、History/Rollback、Auto Policy、Activity 状态。/memory命令族,接入同一 controller。P3 — 文档、迁移与清理
/memory、自动内化、多个 Patch 语义。docs/agora-vip-provider-requirements.md,替换“底栏堆叠 Agora 信息”的旧 UX 约束。Validation
MA 单元/构建
npm run build npm test npx tsx --test test/agora-provider-runtime.test.ts test/model-profiles.test.ts test/commands.test.ts test/cli-ux.test.ts必须新增并覆盖:
--into目标选择、无唯一 writable target 拒绝、overlay 不进入编译 source。Agora 契约/registry
cd /Users/zhuqingyu/dev/agora .venv/bin/python -m unittest tests.test_agora_service_memory tests.test_agora_mcp_cli -v .venv/bin/python -m unittest discover -s tests -v必须新增并覆盖:
memory_patches_list与memory_intake_statusMCP contract。TUI PTY/visual
npm run build npx tsx --test test/e2e/cli/*.test.ts npm run visual截图/PTY 至少覆盖:
/memoryProfile 列表、Patch 多选、历史/回滚、auto settings。如果 CI 无 node-pty,不得把 skip 当验收通过;必须在支持的 macOS 发版机运行并附终端录屏/截图和日志工件。
二进制安全与用户制品验证
必须在两个 npm tarball、MA portable bundle 和独立 Agora 平台制品上运行:
必须保存:
file识别为 Mach-O,不是 shell/JS/Python wrapper。.py/.pyc/.js/.map、源码压缩包、源码路径、debug symbols、测试提示或私钥。真实无端口 E2E
必须使用 packaged Agora CLI、官方 MCP stdio 和至少一个真实白名单模型,不打开 HTTP 端口:
ctx used/trigger/window/source,证明内化不会擅自清空 context;切换模型后数字按新 capability 刷新。保存:终端录屏或关键截图、MCP trace(脱敏)、Agora job/profile/patch ids、前后 metadata、测试命令和 exit code。
Acceptance Criteria
/memory提供命名 Profile、项目绑定、会话 override、Patch 多选、状态、历史、自动策略和回滚。noop、review、failed、conflict、stale 都有正确状态,不被误报为成功 mounted。Acceptance Mapping
models_list/status/downloadmemory_patches_list+ MemoryConsolechat_completemetadata → providerStatenoop/review/failureAgoraCapabilitiesagent.getContextUsage()→ App/StatusBar/memory internalize --into+ writable family resolverfile+ forbidden-extension scanagora-corenative target + thin Python orchestrationRedlines
以下静态/运行时断言必须存在,防止“新路径已添加但旧路径仍在工作”:
upsertProfile(profileId, [patchId], true)把内化结果强制缩成单 Patch。provider === 'agora'直接只返回 modelsCache。memory_patches_list不再导致 Agora chat controller 整体不可用。agora:model · mem status · sess id的单行堆叠作为主要记忆交互。agent.getContextUsage()提供 used/trigger/window/source;不得删除 context、只在 debug 显示或改从 Agora state 推导。.py/.pyc/.js/.map、debug symbol、源码路径、测试提示、私钥或非 Mach-O 启动壳。Non-goals