实时与无头模式
每次调用时,服务器都会通过扩展保存在 ~/.erd-editor/ide/ 中的锁文件,查找持有该文档的 VS Code 窗口。
找到的结果决定了编辑去向何处。
| 找到的情况 | 编辑的行为 |
|---|---|
| 某个窗口的工作区包含该文档,或者该窗口已打开该文档 | 实时模式。 必要时在 ERD Editor 中打开文档,加入编辑会话,并在那里应用变更。编辑会立即显示,并在智能体调用 erd_save 或你保存之前一直保持未保存状态。 |
| 没有窗口 | 无头模式。 加载文件、应用变更,然后替换该文件。erd_save 无事可做。 |
| hub 已关闭的窗口 | 拒绝编辑。 读取仍然有效,从磁盘读取。在打开的编辑器底下写入文件的变更会在其下次保存时被覆盖,因此服务器不写入任何内容。 |
编辑的结果会注明它运行的模式,即 live 或 headless,被拒绝的编辑则会说明原因。
每次调用都会重新查找,因此打开或关闭窗口后,下一次调用会随之改变去向。
对同一文档的调用按照到达服务器的顺序逐个执行。对不同文档的调用则并行执行。
实时模式
智能体会像又一位协作者一样加入编辑器。 它的编辑会同时到达打开该文档的每个编辑器,它的焦点也会像协作者的焦点一样绘制在它正在编辑的表和单元格上,参见 focusTracker。
读取从不会打开编辑器。文档尚未打开时,编辑会在 ERD Editor 中打开它。
保存
智能体的编辑会像你自己的编辑一样把标签页标记为未保存,只有在文档保存时才会写入磁盘。
erd_save 会像 VS Code 自身的保存命令一样,通过 VS Code 保存文档。你也可以自己保存,使用 Ctrl + S (Windows/Linux) 或 ⌘ + S (Mac)。
当编辑器无法确认每次编辑都已到达,或者 VS Code 让标签页保持未保存状态(例如因为文件在磁盘上发生了变化)时,erd_save 会以 notSaved 被拒绝。
在带有未保存的智能体编辑时关闭编辑器,会像其他任何未保存的变更一样询问是否保存。 此后,智能体的下一次调用会附带一条说明:只有在编辑器关闭之前已经保存,它的编辑才会存在于文件中。
Undo
erd_undo 会撤回智能体所做的最后一次编辑,而绝不会撤回你的编辑,erd_redo 则会重新应用它。
编辑器自身的 Undo 恰好相反:它撤回你的编辑,而绝不会撤回智能体的编辑,因为从其他编辑器到达的变更不会记录在你的历史记录中。
有几种编辑不会在编辑器中产生 Undo 记录:除 erd_set_show 以外的设置工具,以及 erd_resize_memo。所设置的值与文档已有的值相同的编辑不会改变任何内容,同样不会产生 Undo 记录。
erd_undo 会跳过这些编辑,并在结果中列出它们。
出现以下情况时,智能体的 Undo 历史记录会结束,并在结果中附带一条说明:
- 智能体重新加入文档,例如在编辑器把智能体从文档中移除之后。
- 窗口退出,智能体转而继续编辑磁盘上的文件。
- 某个窗口接管了智能体正在磁盘上编辑的文档。
服务器还会关闭智能体 30 分钟内没有调用过的文档,Undo 历史记录也随之消失,并且不会附带说明。
窗口消失时
只要有窗口持有某个文档,服务器就绝不会自行退回到编辑文件。 连接断开时,它会重新连接。只有在窗口已经退出时,它才会编辑文件,并在结果中说明这一点。
仍在运行但锁文件已消失的窗口会以 hubGone 拒绝编辑。请重新加载该窗口,或者关闭它,让智能体直接编辑文件。
无法连接到窗口的读取会改为读取磁盘上的文件,并附带一条说明:尚未在编辑器中保存的编辑不包含在内。
无头模式
没有窗口打开该文档时,每次编辑都会加载文件、应用变更,然后把文件写回。
写入会先写到文档旁边一个名为 .<name>.<id>.tmp 的临时文件中,再用它替换文档,因此文档绝不会处于写了一半的状态。
在最后这一步之前,服务器会检查文件在调用期间是否在磁盘上发生了变化。
如果发生了变化,则不写入任何内容,重新加载文件,并以 conflict 拒绝该调用。智能体会再次调用。
在两次调用之间发生变化的文件只会被重新加载,而智能体在此之前的 Undo 历史记录会被丢弃。
如果在智能体编辑磁盘上的文件期间,有 VS Code 窗口开始为该文档提供服务,那一次编辑会以 hubAppeared 被拒绝,不写入任何内容。下一次调用会通过该窗口进行编辑。
拒绝编辑
即使 hub 已关闭,窗口也会保留其锁文件:dineug.erd-editor.agentHub.enabled 关闭时、工作区不受信任时,或者 hub 启动失败时。
对这类文档的编辑会以 blocked 被拒绝,因为打开的编辑器下次保存时会覆盖写入文件的变更。
读取仍然有效,从磁盘上的文件读取。
若要让智能体编辑,请信任该工作区并开启该设置,或者重新加载窗口。
文档
文档由 path 指定,可以是绝对路径,也可以是相对于服务器工作目录的路径。
- 新文档为
.erd.json。带create的erd_open_document会创建文件,并为没有扩展名的名称加上.erd.json。 - 已有的
.erd、.vuerd和.vuerd.json文件同样可以打开。其他扩展名的路径会以invalidPath被拒绝。 - 编辑器无法读取的文件,例如残留合并冲突标记的文件,会以
invalidDocument被拒绝并保持原样。它绝不会被当作空图加载后再写回。
智能体只通过工具修改文档,并被告知绝不要自己写入文件。
erd_list_documents 会列出文档及其 path、open、active、dirty 和 readonly。
有 VS Code 窗口为工作目录提供服务时,它列出该窗口的文档,否则列出工作目录下的 ERD 文件。