架构
Scopwis 是一个以 Rust 为信任边界、以 Flutter 为跨平台客户端的自主分析执行系统。
主要组件
| 层 | 技术 | 职责 |
|---|---|---|
| Server | Rust、Tokio、Axum | API、认证、session、task、ownership |
| 数据访问 | OpenDAL + provider adapter | 授权对象和表 |
| 查询 | DataFusion + Arrow | 类型化分析计划和列式结果 |
| 分析 | 已注册 Rust 方法 | Mining、诊断、forecast、prediction |
| Agent | ModelProvider + ReAct runtime | 规划和 tool 选择 |
| 报表 | ReportSpec | 声明式、可校验交付物 |
| UI | Flutter + Forui + Scopwis token | Web/Desktop/Mobile 工作区 |
| CLI/TUI | Rust、clap、ratatui | Terminal client |
执行流
用户问题
↓
授权数据发现
↓
metadata + semantics
↓
通过校验的 AgentPlan
↓
typed query / registered method
↓
Query / Mining artifact
↓
evidence-backed Analysis Artifact
↓
答案
└─ 只有用户要求时才生成 ReportSpec
模型负责提出路径,但不拥有授权、query 编译、artifact provenance 或 report validation。
产品工作面
一级工作入口是 分析、数据挖掘、报表。设置是独立 application-level configuration surface。数据浏览和任务历史属于上下文工具,不再继续膨胀一级导航。
存储与 Artifact
Server 拥有的持久化状态位于配置的数据根目录。不可变 artifact metadata / lineage 与大 payload 分开,因此即使有界 payload 过期,证据历史仍然可以保留。
会话保留遵守账户所有权。进程达到 50 条会话上限时,新会话只能替换当前账户最旧的历史。如果该账户没有可替换的历史,则返回容量错误;删除自有会话可以释放名额。已有自有会话仍可继续追问。 重启恢复遵守相同所有权规则;无所有权文件的旧版目录需要先显式授权旧版 ownership migration,才能清理溢出的历史。
已完成的 Agent 任务历史保留在磁盘中。启动时逐条校验持久化记录,仅保留终态摘要;请求具体任务时再读取完整答案和事件。活跃记录保留重启后报告任务中断所需的状态。
私有会话和任务记录在物化前执行结构预算预检,包括会被忽略的兼容 metadata。任务预览在启动和冷读取时都落实公开的 kind、ID、revision、producer 和最多 64 个 input 的边界。结构放大或畸形记录会使恢复失败,不删除历史或临时证据。
任务的已知 metadata、错误、进度事件和 response 轻量字段在写入、恢复及旧版迁移前,必须满足声明的 Unicode 字符上限和枚举。可选任务字段应省略,不能提供 null;缺省 artifact 和 retryability 保留契约默认值。有界私有扩展及历史 metric 缺省计数继续兼容。非法实时终态候选会被整体丢弃,从上一份有效快照形成安全的 INTERNAL 失败;有效候选仅因写盘失败时则使用 AGENT_TASK_PERSIST_FAILED,保留已验证事件。自动裁剪计划和合并重复综合步骤使用普通 completed 进度事件,归一化语义保留在摘要中,不创造新 wire 状态。这些字段检查不对历史计划重新施加当前运行权限。
持久化任务变更在等待有界 IO 容量前拥有堆上的工作单元,捕获完整快照不会放大嵌套 async 等待状态。未 poll 的事务可以直接丢弃而不执行;工作线程已开始后,取消 HTTP 等待者不会在持久化提交和注册/worker handoff 完成前释放串行锁。
跨平台边界
Flutter 负责展示与交互;Rust 负责身份、授权、数据访问、计算、Agent orchestration 和报表校验。Native bridge 使用有界 batch 传输数据,而不是逐行 FFI;Web 通常使用类型化 HTTP/SSE/Arrow API。
报表响应在读取 HTTP 流时、JSON 解码前执行大小限制:成功的报表 payload 上限为 64 MiB,错误 envelope 上限为 64 KiB。替换或关闭报表请求会取消响应体订阅,过期结果无法覆盖当前视图。
原生模型传输在向 Agent 提交任何调用前校验完整工具调用 envelope。必需工具字段畸形时拒绝整条响应,不会静默丢弃某个调用后执行剩余调用。
Responses、Anthropic 和 Gemini 原生 JSON 在构建树前还要通过共享的 64 MiB 结构计费门禁,独立于 16 MiB 编码体积限制。未知 metadata 和 Responses 内嵌参数同样受限;这是确定性资源准入策略,不是 RSS 保证。
实现级契约见仓库 docs/specs/。