Skip to content

Security: windowFlowers/CommandFoundry

Security

docs/SECURITY.md

安全边界

应用会做什么

  • 在本机读取随安装包提供的结构化命令知识。
  • 仅当用户配置模型后,通过官方 OpenAI Python SDK 的 Chat Completions 客户端,将问题与最多 4 个检索证据发送给用户选择的 OpenAI 兼容模型;Electron 的真实连接测试复用官方 OpenAI Node SDK。Ollama 可连接本机服务。上传文档证据使用聚合后的受限父块上下文,引用仍绑定实际命中的子块。
  • 在用户目录的 SQLite 中保存会话、当前会话摘要与用户主动表达的长期偏好,以及持久化的、已通过预检的后台记忆提取任务状态。
  • 将所选模型的 API Key 以 Windows DPAPI 密文保存;模型名称和 Base URL 不作为秘密写入数据库。
  • 提供仅限本机 PowerShell/CMD 的临时 PTY;最多 4 个会话,关闭应用时清理。

应用不会做什么

  • 不自动执行、验证或自动修改回答中的命令;只有用户确认的 direct 命令才会写入本机 PTY。
  • 不远程操作系统,不允许渲染进程指定任意可执行文件;模板、澄清卡片和旧版回答没有执行入口。
  • 不保存终端输出、输入历史或工作目录到 SQLite;高风险命令还要求输入“确认执行”。
  • 不上传会话到项目自有服务,不采集遥测。
  • 不把 API Key 写进源码、示例配置、SQLite、日志或 Renderer。
  • 不在运行时访问 GitHub。
  • 不创建云端画像;知识库级长期记忆不会进入其他知识库。
  • 不把密钥、密码、Token、授权头、私钥、连接串、完整本地路径或疑似个人敏感数据写入长期记忆。

模型与命令安全

模型输出先经过 Pydantic 结构校验,再由确定性正则规则复核危险命令。风险标签是提示而非沙箱;用户仍需在复制后自行确认占位参数、环境和备份。

历史消息和摘要在生成提示中标记为不可信上下文,不能替代当前知识库证据。摘要不保存回答中的命令正文,并对常见 API Key、Token 和密码格式脱敏;“清空上下文”推进记忆边界,但保留用户可见聊天记录。

长期记忆同样属于非权威上下文。只有用户消息经过持久性信号门和敏感数据过滤后才可能被提取;助手回答不会成为画像来源。预检会在进入长期记忆或后台模型队列之前拒绝代码、可执行命令、完整本地路径、连接串、私钥,以及含值的中英文密钥、令牌或密码表达。回答模型每轮最多收到 4 条脱敏命中项;需要后台提取时,模型只收到经预检、截断和规范化的用户陈述以及少量无来源元数据的相关记忆,而不是完整画像或其他会话内容。GET /profile/memory-extractions/{task_id} 故意不返回该陈述或内部失败详情,只返回状态、来源消息 ID、结果 ID、可撤销的新建 ID、操作类型和时间戳。关闭个性化会同时停止使用和提取但保留数据;“忘记全部”会物理删除记忆和未完成提取任务。当前问题的明确要求始终优先,长期记忆不能降低风险等级或绕过命令证据校验。

个性化可改变语言、详略和面向新手的解释提示,也可补充检索偏好;即使无 Key 或模型回退,确定性本地回答也只在这些表达层面使用它。命令、引用和风险结论仍必须由当前本地检索证据决定。

上传文档同样被视为不可信数据,其中的角色指令或提示词不能改变系统安全规则。原始文件、完整文档和本地存储路径不会发送给外部模型;只有当前问题命中的受限父块文本会进入生成提示。上传文档产生的命令必须精确匹配完整代码围栏、行内代码或确定性识别的独立命令证据,否则从模型结果中移除。未知 citation_id 也会被后端丢弃;如果模型正文没有任何有效的精确引用段,后端会丢弃该正文并返回本地证据派生的 ungrounded 回退,而不虚构整段文本的来源。

发布前检查

  1. 撤销开发过程中使用过的 Key,并为演示创建低额度独立 Key。
  2. 检查 git grep、构建日志和安装包解压内容中不存在真实 Key。
  3. 保持 Electron contextIsolation: true、sandbox: true、nodeIntegration: false。
  4. 仅允许 https:// 来源链接由系统浏览器打开。

There aren't any published security advisories