12 KiB
界面地图:点哪里、去哪里、为什么
这份是界面地图的手写部分,只写代码里看不出来的东西:每一块是干什么的、点了以后发生什么、为什么这样设计、同一个东西统一叫什么。 具体在哪个文件、哪一行、调哪个接口,不要在这里找,直接问代码(永远是最新的):
node tools/ui_map.mjs find 屏幕上的字 比如 find AI 改副本:哪个文件画的、样式在哪、调哪个接口、后端哪个函数
node tools/ui_map.mjs find /anomalous/ai_tasks 这个接口由谁处理、前端谁在调
node tools/ui_map.mjs find ui_ai_marker.js 这个文件显示哪些字、调哪些接口、被谁用
node tools/ui_map.mjs build 写出 docs/ui-map.md:按页面列出全部文件、文字和接口(不进版本库)
写这份文档的规矩(node tools/check_structure.mjs 会检查):
- 「」 里只放屏幕上的原字(中文界面),一个字都不能差;太长的句子可以只写开头,结尾加 …。界面改了字,检查就会报错,提醒你回来改这里。
- 文件名和接口用反引号,比如
ui_ai_task_canvas.js、/anomalous/ai_tasks/{task_id};不存在了检查也会报错。 - 最后的“统一叫法”表:一个东西只用一个名字。表里“不再用”的词,只要还出现在界面文字里,检查就报错。
AI 工作台
三栏:左边任务列表,中间一个任务的时间线,右边侧栏。窗口窄时左边和中间轮流显示,右边变成标签页。
左栏:任务列表(ui_ai_task_list.js)
| 看到的 | 点了以后 | 后端 |
|---|---|---|
| 「新任务」 | 写一句要 AI 做什么(可以空着),任务显示“等 AI 接手”;下一个来调用的 AI 直接接手它,不会接在旧任务后面 | POST /anomalous/ai_tasks |
| 「连接 AI」 | 弹出连接说明:地址、复制给 AI 的那句话、各个软件怎么加(ui_ai_connect.js) |
无 |
| 「关卡」 | AI 做哪些事要先问你(改画布、用显卡、下载……),还有 AI 怎么等你回答、怎么等跑图(ui_ai_gate.js) |
/anomalous/ai_gates |
| 「全部」「进行中」「等你回答」「出错」 | 只筛这一栏,不改任何东西 | 无 |
| 一个任务 | 中间显示它。看过的、鼠标停过的马上出来,再悄悄补上最新内容(ai_task_cache.js) |
GET /anomalous/ai_tasks/{task_id} |
收起:标题栏最左边的按钮(「收起 / 展开任务列表…」)。收起后列表仍在左边排好、藏起来,鼠标碰到这个按钮、或者从页面往左移到最左边缘,下一帧就滑出来;离开后 0.35 秒收回,点了任务马上收回。
为什么:列表每 5 秒刷新一次,只重画变了的行(sync_rows.js),所以滚动位置不会跳、鼠标下面的行不会闪。
中间:任务的标题栏
| 看到的 | 点了以后 | 后端 |
|---|---|---|
| 「AI 改副本」 / 「AI 改当前画布」 | 打开二选一:「改副本」(先把当前工作流复制到新标签页,AI 只改副本)或「改当前画布」。点开才换,不会点一下就悄悄切换 | POST /anomalous/ai_tasks/{task_id}(canvas) |
| 「切到副本」 | 切到这个任务的副本标签页,并显示画布(mcp_task_tab.js) |
无 |
| 「撤销画布上的改动」 | 按操作记录把 AI 在画布上的改动一步步撤销(canvas_undo.js) |
无 |
| 「改名」 / 「从列表移除」 | 移除只删这条记录,图、画布、工作流都不动 | POST /anomalous/ai_tasks/{task_id} |
| 「接着哪个任务…」 | 把这个任务接在另一个后面,两边都显示链接(ui_ai_task_links.js) |
POST /anomalous/ai_tasks/{task_id}(from) |
AMB 更新以后,AI 软件还拿着旧的工具列表来调用时,标题栏下面出现一行黄字「AI 软件拿的还是旧的工具列表,会多走弯路。请重新连接:Antigravity 重启一下,或在它的 MCP 设置里把 anomalous 关掉再打开;然后开个新对话。」,AI 那边也会收到同样的提醒(mcp_directory.stale,按每个 AI 软件上次取的列表比对)。AI 软件重新取工具列表(tools/list)后这行自动消失。
标题栏右上角的一排是侧栏的开关:「展台」「节点结构」「决策」「素材」「成果」(ui_ai_side_views.js),同一时间只开一个。
中间:等 AI 接手的任务(ui_ai_ready.js)
「新任务」之后、AI 还没来时,中间是「等 AI 接手这个任务」一页:
- 最上面是「把这句话发给你的 AI」和「复制这句话」,页面往下滚时它停在顶上,挑完图不用再翻回去找。
- 下面都是可选的,收成两行,点了才展开:「写一句要做什么」(会成为任务名,那句话也跟着带上它)、「从图库挑图给 AI」(点一张就放到最下面的留言框,再点拿掉)。已经备好的东西列在下面。
- 最下面是还没连上 AI 时的「查看连接方法」。
为什么:以前分“开始”“备料”两页,去备料以后还要切回来复制那句话;第一步还是一个输入框,看着像必须填。现在主要的一步放最前面,可选的都收起来。那句话也不再叫 AI 一接手就停下来问你,而是照任务里的交代做,没交代才问。
AI 问你的问题(ui_ai_panel.js、ui_ai_now.js、ui_ai_gate.js)
展台里的选择题、留言框上方的提问条、关卡卡片都按同一个做法:
- 选项是一按就发出去的按钮,右边有箭头,上面写着「点一个就发给 AI」;点了马上变成选中的样子,再显示“已发送 / AI 已收到”。
- 「让 AI 定」放在问题的右上角,是一个虚线小按钮,不跟选项挤在一起,免得被当成“确认”。
- 自己写的那一行默认收起:「都不是,我自己说…」,关卡卡片上是「说说想怎么改…」,点了才出输入框。
- 写了一半的回答一直留着(只留在这个页面里):AI 又问了新问题、读走了另一个回答,问题重画时字、光标位置和选区都还在,那一行也不会收起;展台和底部提问条同步同一道题的草稿,刷新只把焦点还给原来正在编辑的位置;这个问题一直排在提问条最前面。窄窗口里你正在打字时,新来的问题只点亮「展台」标签,不把你切过去。
- 只有真按键才算“在打字”(每几秒告诉一次服务器):停手一分钟以后照常算时间,光标停在框里不算。动手写过回答的问题,到时间也不会按推荐的替你选,AI 停下等你。
为什么:看到一个框,人就以为要填;选项和下面的按钮排在一起,人就以为要先选再确认。写到一半的话被清掉、被切走,或者人走开了被替你选掉,都比多等一会儿糟。
中间:时间线
- 从上往下读,编号 1、2、3……;AI 连着查资料、连着改画布的几步折成一行(
ui_ai_chain.js),点开看每一步。 - 每一步下面写它做了什么(
ui_ai_step_body.js),出的东西能直接去:图片进看图器、模型进模型页、画布改动能定位和撤销(ui_ai_results.js)。 - 图片上鼠标移上去有工具(
ui_ai_images.js):「图片与参数」、「保存为…」、勾两张对比,还有 ✎ 标注。 - 时间线和展台里的图先用缩略图(
/anomalous/output_thumbnail),显示得比缩略图大时才换原图,打开任务不用等大图。
标注:「标给 AI 看:哪里要改」(ui_ai_marker.js)
框、圈、箭头、画笔,每个标记写一句要怎么改;右边选「怎么改」:
- 「交给 AI 判断」:AI 看说明自己决定。
- 「只改标出的地方」:其余保持原样,框、圈、画笔和涂抹的地方做成遮罩放进 input 文件夹,AI 只重绘这些地方。用「涂重绘区」时自动选上。
- 「整张重新出图」:按说明整张重画,不做局部重绘。
「发给 AI」以后(POST /anomalous/ai_tasks/{task_id}/marks),AI 下一步收到的第一句就是你选的改法,写明是你的要求(ai_marks.py)。时间线里这条标注写着「改法:{mode}」,方便核对 AI 有没有照做。
中间最下面:留言框(ui_ai_message.js)
- 「给 AI 留言,比如:背景再亮一点。…」:Enter 发送(
POST /anomalous/ai_tasks/{task_id}/message)。 - 打 @ 提到素材和图(
ui_ai_mention.js),开头打 / 是快捷指令(ui_ai_commands.js):/停止、/撤销、/展台、/节点结构、/素材、/副本、/当前画布 马上生效;/重跑、/解释、/继续 帮你写好一句话。 - 「从图库选图给 AI」(
ui_ai_gallery_pick.js),拖进来或粘贴截图(ui_ai_drop.js,存进输出文件夹的 ai_inbox)。 - 留言框上面的一条(
ui_ai_now.js):正在出图的进度、要你允许的事、AI 问你的问题;AI 停下时给出可以复制给它的句子,比如「继续」(ui_ai_call.js)。
为什么:AMB 不能主动叫醒外部的 AI。发出去的留言会等着,AI 下一次调用任何工具时一起收到(ai_panels.py 的 attach_pending),或者它来读回答时收到。AI 已经停了,就要你回 AI 软件里说一句,所以那里总有一句可以复制的话。
右栏:侧栏
| 开关 | 里面是什么 | 主要文件 |
|---|---|---|
| 「展台」 | AI 画的面板,从上往下排,旧的在上、新的在下;要你回答的在这里回答(POST /anomalous/ai_tasks/{task_id}/answer)。来了新面板而你在往上看时,出现「↓ 查看最新」 |
ui_ai_side.js、ui_ai_panel.js、ui_ai_stage.js |
| 「节点结构」 | 这次运行实际用的节点、和上次比改了什么 | ui_ai_run_map.js |
| 「决策」 | 你在面板上的选择、允许和拒绝、AI 记下的关键决定 | ui_ai_decisions.js |
| 「素材」 | 「给 AI 的素材」:挑模型、节点、搭配、工作流、提示词交给 AI;「来源」列表里鼠标所在的行会亮,选中的打勾 | ui_ai_toolbox.js、ui_ai_facet_menu.js |
| 「成果」 | 这个任务出的图、工作流、搭配、提示词、音频,按步骤排 | ui_ai_outputs.js |
设计上的固定做法
- 从上往下读:时间线、展台都是旧的在上、新的在下;看最新的时候自动跟着往下,往上翻着看时不打断,只出现“去最新”的按钮。
- 重画只重做变了的部分:工作台随时在刷新,滚动位置、打了一半的字、展开的东西都不能丢。
- 会改东西的地方说清楚后果:二选一要写每一种是什么意思;删除写明删的是什么、不删什么。
- 鼠标移上去要有反馈:列表行、菜单项悬停变亮,当前选中的有底色或打勾。
- AI 改画布默认改副本:你正开着的工作流不被 AI 动。
统一叫法
| 说法 | English | 不再用 | 不再用(English) |
|---|---|---|---|
| 副本(AI 改的那份工作流) | copy | 专用标签页、自己的标签页、新开标签页 | own tab |
| 素材(交给 AI 的模型、节点……) | materials | 材料 | — |
| 留言(你写给 AI 的话) | message | 消息 | — |
| 节点结构 | node map | 结构图、运行结构 | node structure |
| 连接 AI | connect an AI | 最近接入、接入过 | — |
| 撤销 | undo | 撤回 | — |
| 展台 | stage | 画板、舞台 | — |
| 成果 | results | 产出 | — |
| 关卡 | gates | 闸门 | — |
| 工作流(存下的整套工作流,“工作流”页的卡片) | workflow | 配方(配方包、搭配方案除外) | recipe(recipe package 除外)、recipes |
| 配方包(把一个工作流打包发给别人的 .zip) | recipe package | — | — |
| 搭配(主模型 + LoRA + 提示词) | combo | — | — |
“不再用”里可以写例外,比如“配方(配方包、搭配方案除外)”:这两个词里的“配方”不算。{recipe} 这样的占位符也不算。
还没统一的
node tools/ui_map.mjs build的最后一节列出没有文件用到的文字(2026-10-25 清理过一次,当时为 0),清理前先确认不是拼出来的 key、也不是后端错误信息当 key 用的(t(error.message))。