权限
没有任何权限的卡片可以在自己的方框里绘制、使用存储、读取自己的设置、设置自己的标题栏, 但不能和任何人交换任何东西。其余一切都是你在清单文件中声明、由用户授予的权限。
授权的工作方式:
- 按卡片包授予,每次请求都检查。 用户把权限授予你的卡片包(它在所有画布上的每一份副本)。 应用会在每一次调用时检查授权——检查发生在应用里,而不是在 SDK 或你的卡片里。
- 必需权限在安装时要么全给、要么不装。 安装对话框把它们按高风险在前的顺序列出。拒绝就意味着不安装。
- 可选权限在运行时申请(
"optional": true)。在卡片显示在屏幕上时调用card.permissions.request();应用会用它自己覆盖整个窗口的对话框询问,用户可以拒绝。 - 有些权限包含其他权限。
fs.write包含fs.read;agents.output、agents.prompt和terminals.write包含agents.read。 - 用户可以随时撤销任何权限(在 Settings → Custom cards 中)。卡片的页面会以缩小后的授权重新加载,
并收到
permissions.changed事件;代码要做好防御。 - 新增权限或网络主机的更新需要用户同意后才会生效。你去掉的权限会被撤销。
- 箭头就是对数据的同意。 涉及另一张卡片、智能体或终端的权限,只对通过箭头与你的卡片相连的卡片生效—— 方向不限,除非另有说明。
缺少权限时调用会以 PERMISSION_DENIED 失败(error.permission 会给出缺的是哪一项)。
一览
| 权限 | 风险 | 解锁 |
|---|---|---|
agents.read | 低 | agents.list/get、状态/轮次/变更事件、智能体的 status 端口 |
agents.output | 高 | 读取相连智能体和终端的屏幕与回复 |
agents.prompt | 高 | 向相连的 AI 智能体发送提示词 |
terminals.write | 高 | 在相连的终端中运行命令 |
cards.connected | 中 | 读取和修改相连的笔记、待办清单、任务看板、便签 |
network + 主机 | 中 | 对列出的主机使用 net.fetch |
network.local | 高 | 对本机上的服务器使用 net.fetch |
fs.read | 高 | 读取工作区文件夹中的文件 |
fs.write | 高 | 写入工作区文件夹中的文件(包含 fs.read) |
clipboard.write | 低 | 把文本复制到剪贴板 |
canvas.spawn | 低 | 在自己旁边添加最多 4 张卡片 |
background | 低 | 没人看时也保持运行 |
usage.read | 低 | 工作区的令牌用量和费用 |
逐项说明
agents.read — low
用户看到: See the agents on this canvas.(查看此画布上的智能体)它们的名称、运行的工具,以及正在工作、等待你还是已完成。
解锁: card.agents.list() / get()、事件 agents.status、agents.turn、agents.changed,
以及内置智能体的 status 输出端口。
范围: 卡片所在工作区的 AI 智能体和终端。其他卡片不是智能体,不会被列出。
agents.output — high
用户看到: Read what agents and terminals connected to it print.(读取与其相连的智能体和终端的输出) 用箭头与它相连的智能体和终端卡片屏幕上的所有内容,包括其中显示的任何机密信息。
解锁: card.agents.readScreen()、card.agents.lastReply()、用 card.agents.onOutput() 获取实时输出,
以及智能体的 reply 和终端的 exit 输出端口。
范围: 仅限用箭头相连的智能体和终端。包含 agents.read。
agents.prompt — high
用户看到: Give instructions to agents connected to it.(向与其相连的智能体下达指令) 向用箭头与它相连的 AI 智能体输入并发送提示词。智能体可以编辑文件和运行命令,所以此卡片可以让它做智能体能做的任何事。
解锁: card.agents.prompt() 和智能体的 prompt 输入端口。
范围: 用箭头相连的 AI 智能体(不含终端)。提示词会经过提示词队列和工作区预算,
每张卡片每分钟最多 6 条(该方法和智能体的 prompt 端口合并计数);每条都会显示在箭头上并记入箭头日志。
发给危险模式下智能体的每条提示词,都要等用户在卡片上确认。包含 agents.read。
terminals.write — high
用户看到: Run commands in terminals connected to it.(在与其相连的终端中运行命令) 在用箭头与它相连的终端卡片中输入并运行命令——任何你自己能运行的命令。
解锁: card.terminals.run() 和 write(),以及终端的 command 输入端口。
范围: 用箭头相连的终端卡片(bash、PowerShell、cmd)。每张卡片每分钟最多 30 条命令,run 和终端的 command 端口合并计数;
write 每分钟最多 60 次。每条命令都会显示在箭头上。包含 agents.read。
cards.connected — medium
用户看到: Read and change cards connected to it.(读取和修改与其相连的卡片)用箭头与它相连的笔记、清单、任务看板和便签。
解锁: 笔记、待办清单、任务看板和便签的内置卡片端口——向笔记追加内容、添加任务、读取清单。
范围: 用箭头相连的这四类卡片。
network — medium, needs hosts
用户看到: Connect to api.github.com, *.example.com.(连接到这些主机)只与这些互联网地址收发数据。
卡片能看到的任何内容都可能被发送到那里。
解锁: 通过 https 对这些主机使用 card.net.fetch()。
范围: 严格限于声明的主机模式,且只允许公网地址——解析到私有、回环或云元数据地址的主机会被拒绝,每次重定向也同样检查。 第 1 版中,卡片无法申请“任意主机”。
network.local — high
用户看到: Connect to servers on this computer.(连接到本机上的服务器)访问在 localhost 上监听的程序,例如开发服务器和本地数据库。
解锁: 通过 http 或 https 对 localhost、127.0.0.1 和 ::1 使用 card.net.fetch()。
范围: 除 NeuroSquad 自己的服务器以外的任何端口:它的 MCP 服务器、远程访问服务器、开发者链接服务器、 每张浏览器卡片中 Chrome 的调试端口,以及应用自身的开发服务器。发往本机的请求永远不会填入密钥占位符。
fs.read — high
用户看到: Read files in the workspace folder.(读取工作区文件夹中的文件)此工作区项目文件夹中的任何文件,包括 .env 等文件中保存的机密。
解锁: card.fs.stat/list/read*/watch(),以及 card.workspace 中工作区的绝对路径 path。
范围: 工作区文件夹。路径相对于它;.. 和绝对路径会被拒绝,指向文件夹外部的链接也会被拒绝。
如果工作区文件夹是用户的主文件夹、某个磁盘的根目录,或包含 NeuroSquad 自己的数据文件夹,所有文件调用都会被拒绝。
fs.write — high
用户看到: Change files in the workspace folder.(修改工作区文件夹中的文件)在此工作区的项目文件夹中创建、覆盖文件或将其移入回收站。 此工作区的智能体会读取并运行这些文件,因此此卡片可以让它们执行命令。受保护:.git、智能体设置(.claude、.mcp.json、CLAUDE.md、AGENTS.md 等)以及 NeuroSquad 自身的数据。
解锁: card.fs.writeText/writeBytes/mkdir/trash()。
范围: 同 fs.read,但不包括受保护的路径:任何 .git、智能体和编辑器的设置、CI 工作流。
没有彻底删除——trash 会移入系统回收站。包含 fs.read。
clipboard.write — low
用户看到: Copy to your clipboard.(复制到剪贴板)用卡片中的文本替换剪贴板内容。
解锁: card.copyText(),每秒一次。无法读取剪贴板。
canvas.spawn — low
用户看到: Add cards next to itself.(在旁边添加卡片)在画布上它的旁边放置最多 4 张新卡片。
解锁: card.spawn()——你的卡片的另一份副本,或一篇笔记、待办清单、任务看板、便签,并用箭头与它相连。
范围: 每张卡片 4 张、每分钟 4 张,并受工作区卡片数量上限约束。
background — low
用户看到: Keep running when you are not looking.(在你不看时继续运行)在其工作区隐藏时保持活动。会消耗更多内存和电量。
解锁: 卡片在隐藏时不会被暂停。
范围: 整个应用中最多 8 张这样的卡片在后台运行;超出后,最久未被看到的仍会被暂停。
usage.read — low
用户看到: See token usage and costs.(查看令牌用量和费用)此工作区的智能体用了多少令牌以及花费多少。
解锁: card.usage()。
范围: 卡片自己所在的工作区。
安装对话框中除权限外还列出什么
以下内容由清单推导得出,并不是权限:卡片向相连智能体提供的工具名称,以及它有多少个输入和输出端口。 可选权限出现在 It may ask later for 之下。
只申请你需要的最少权限。每一行高风险都会让谨慎的用户犹豫,而缺少 reason 会让他们只能去猜。
如果某个功能只是偶尔需要一项强权限,就把它设为可选,等用户真正要用这个功能时再申请。