Commit Graph
850 Commits
Author SHA1 Message Date
Qiu Yuzhou d2d20d27a6 feat(ui): 服务器表单输入限制与端口十进制草稿
issue #81 第一部分:手动表单产品上限(名称 128、地址 255、密码 1024
用户可见字符;插件参数 65,536 UTF-8 字节;端口最多五位十进制数字)。
校验收进 ServerFormFields 唯一入口 validateForSubmit(),字段错误
typed 呈现、修正即清除、首错按栅格顺序定位;validateName/hasNameError
退役。端口改十进制字符串草稿,draft 在草稿不可解析时为 nil、仅在
校验通过后消费,数值等价改写不算变更——无效输入不再悄悄提交旧绑定
值。与装载基线逐字相同的超长字段放行(历史数据兼容);导入与订阅
路径不受限。新错误文案入 Localizable.xcstrings(中英)。
2026-10-04 04:36:32 +08:00
Qiu Yuzhou 95c47195f1 fix(ui): 取消服务器密码字段自动填充语义
隐藏和明文密码输入共用空 textContentType,并关闭自动纠正。Debug 构建、格式和 lint 检查通过;系统密码弹窗行为待人工验证。
2026-10-04 03:38:02 +08:00
Qiu Yuzhou 163e9443f3 feat(ui): 按必填名称重排服务器表单
新建与编辑共用名称优先布局,地址与端口按 4:1 分配宽度,移除重复标签与插件构建信息。

名称为空时显示行内错误并聚焦;编辑支持重置、变更检测与提交防重复,保存后标题同步已保存名称。

验证:823 项 hostless 测试、21 项 Python 检查、Debug 构建及双轴源码审查通过;原生视觉与焦点行为待人工验收。
2026-10-04 03:31:35 +08:00
Qiu Yuzhou d687c33fc5 feat(catalog): 要求服务器名称并按端点延续订阅身份
新建与编辑共用名称校验,导入缺名时保存地址端口名称。

无供应商 ID 的订阅指纹仅包含地址和端口;密码、加密方式、插件及名称更新保留身份。未发版且无存量用户,直接启用新指纹,不迁移旧身份。

订阅刷新只清理新目录不再引用的旧凭据,保留复用的密码和插件参数。

验证:823 项 hostless arm64 测试、21 项 Python 检查及 Debug 构建通过;人工验收完成。
2026-10-04 03:07:59 +08:00
Qiu Yuzhou 0aa0dc78c4 refactor(rules): 统一来源类型映射并移除测试专用加载参数 2026-10-04 02:41:25 +08:00
Qiu Yuzhou 759fbfbb8c refactor(rules): 删除不可用走 commitFeedback,删分叉枚举与本地 alert
outcome 加 .superseded(事务门拒绝词汇,与 runtime「被取代」一致);
deleteCustomRules 改 Void,忙碌/超期发布反馈;CustomRuleDeletionResult
与 RulesDeletionButton 本地 alert 删除——同一确认手势的失败呈现归一。
2026-10-04 02:35:11 +08:00
Qiu Yuzhou 54c6e277ff refactor(rules): 意图操作收成 RulesIntentTicket,每 await 一查
入口捕获事实快照(集合+版本+准入门槛),preview 双查折叠为一查;
testGeneration 吸收为整份 addressTest 状态捕获比对;CONTEXT.md 加
「Rules intent ticket」词条。
2026-10-04 02:32:48 +08:00
Qiu Yuzhou a9a5c40d75 refactor(runtime): 事实发布收成 didChange 通道,每主队列轮合并一次
控制器 7 个与观察机 3 个无消费者的 @Published 退役为普通属性,didSet
汇集到 CoalescedFactSignal:同一主队列轮内多次写只在轮末发一次,冲洗
晚于同步轮——整快照重观察不再读到半程状态,原子性由构造保证而非
objectWillChange+主队列跳的时序与注释看守。adapter 合并两条通道后
直接交 workflow(无额外 hop);单次多写变更的快照重建次数随之下降
(如 activate 写三事实从 3 次重建降为 1 次)。三类退净 ObservableObject
(无任何订阅者),MainApp 的假消费者 @StateObject 降为 let,App body
不再随运行时事实变化重算。两个 $-投影测试改订通道(瞬态断言语义不变),
新增 CoalescedFactSignal 契约测试 3 例。
2026-10-04 02:14:06 +08:00
Qiu Yuzhou 1f8ec2e2f2 refactor(catalog): syncStatus 收敛单一事实源,workflow 只留透传读面
协调器退掉 @Published 与 ObservableObject:syncStatus 存储与发布单点在
协调器(写后经 syncStatusChanges 通知,didChange 语义);CatalogWorkflow
的 runtimeSync 从第二份 @Published 拷贝改为 computed 透传 + 变化通道
透传。App 侧本就无视图消费 runtimeSync,目录观察者不再被每次提交徒劳
失效;测试的轮询读面不变。
2026-10-04 02:09:30 +08:00
Qiu Yuzhou f80018a260 test: 并发执行冒烟测试并隔离本地网络夹具 2026-10-04 01:46:21 +08:00
Qiu Yuzhou f4bca82a14 test: 分离快照数量边界并缩短删除测试等待 2026-10-04 01:28:05 +08:00
Qiu Yuzhou df4bbfc8ec test: 缩小规则夹具并用阶段信号替代固定等待 2026-10-04 01:19:41 +08:00
Qiu Yuzhou feb25de460 test: 注入规则应用与健康重试等待 2026-10-04 01:05:10 +08:00
Qiu Yuzhou 4f859886e2 test: 修复 wrapper 生命周期等待与清理并拆类 2026-10-04 00:56:51 +08:00
Qiu Yuzhou 72ee44411e docs: 明确测试夹具与执行成本原则 2026-10-04 00:46:59 +08:00
Qiu Yuzhou 8b52c3b43c test: 为运行时行为测试批量注入小规则夹具 2026-10-04 00:40:02 +08:00
Qiu Yuzhou b7a2a6a524 test: 为 Agent 系统代理测试复用小规则夹具 2026-10-04 00:30:43 +08:00
Qiu Yuzhou 7fb736f53e test: 为代理控制集成测试注入小规则夹具 2026-10-04 00:22:45 +08:00
Qiu Yuzhou 0235e64ad1 test: 拆分运行时测试类并缩短健康等待窗口 2026-10-04 00:06:47 +08:00
Qiu Yuzhou 210c677c1b docs(ng2): 测试框架政策入 AGENTS.md,新测试默认 Swift Testing 2026-10-03 23:26:09 +08:00
Qiu Yuzhou 45b20d329b test: 单测开启多 runner 并行执行 2026-10-03 23:26:08 +08:00
Qiu Yuzhou 56ad46bec0 refactor(ui): 分区自挂页级动作与编辑/导出流程,壳收成薄转发 2026-10-03 23:03:30 +08:00
Qiu Yuzhou 9322184310 refactor(ui): 状态卡呈现政策收进 StatusCardModel,壳只挂薄视图 2026-10-03 22:57:04 +08:00
Qiu Yuzhou a504171c18 refactor(ui): 激活反馈收成共享状态模块,三入口单飞 2026-10-03 22:39:41 +08:00
Qiu Yuzhou 868cfe66ad refactor(catalog): 激活拒绝结果自含 typed 原因 2026-10-03 22:08:37 +08:00
Qiu Yuzhou b48e4158b6 refactor(sysproxy): 健康观察任务柄归属观察机,循环体经闭包注入 2026-10-03 20:35:36 +08:00
Qiu Yuzhou 31e9f6e95f refactor(sysproxy): 观察机写面收成意图命令,字段退回实现 2026-10-03 20:29:15 +08:00
Qiu Yuzhou f39e32ecd7 refactor(ui): 系统代理失败文案映射三份收成一份 2026-10-03 19:53:22 +08:00
Qiu Yuzhou 94a2873c1c refactor(ui): 首页包装壳收进 MainWindowView,删 WorkspaceDestinations 2026-10-03 19:53:10 +08:00
Qiu Yuzhou 5c24b65227 refactor(rules): 删 RuleSet 死类型与 updateCustomRules 前文档时代缝 2026-10-03 19:11:30 +08:00
Qiu Yuzhou edb2c08933 refactor(rules): outcome→文案映射移出视图文件,落回 outcome 类型旁 2026-10-03 19:04:40 +08:00
Qiu Yuzhou 16a2384498 fix(runtime): 收敛票据恒查全部失效事实,agent 关闭不再被旧收敛复活
mode/catalog 路径的票据子集缺 .flow/.agentEnabled:agent 关闭落在
mode 切换健康门 await 窗口内会被误分类为失败并触发 restore,把用户
显式的 off 意图静默撤销。删除逐 call site 挑子集的 Checks 政策,
convergenceIsCurrent 恒查 flow/mode/preparation/agentEnabled 四事实;
deployPrepared 的手工 preparation 守卫随之删除。

restore 门禁先行:agent 意图与票据时效先于回滚载荷持久化——竞态下
不再把旧 mode 写回持久层(内存/持久层分叉、用户切换被无声撤销)。

轮询写入守卫对齐同一票据词汇:防火墙轮询 await 恢复后补查代际
(cancel 后不得把 .firewallBlocked 盖回 .off);系统代理健康 Task
post-await 守卫补 agentEnabled。

新增 5 个交错/门禁测试(BlockingProbe/BlockingFirewallChecker 暂停
缝;修复前实测全红:agent 重注册、running 复活、.direct 意图被改回
.global、载荷写回、.failed 误分类);CONTEXT.md 增补 Convergence
ticket 词条。全量 792 测试通过。
2026-10-03 18:44:58 +08:00
Qiu Yuzhou 2f670a4c6b refactor(rules): decouple saved intent from runtime application 2026-10-03 17:40:05 +08:00
Qiu Yuzhou 57ce356573 refactor(catalog): 目录树投影收进 CatalogTreeSnapshot
visibleRows(collapsed:)、serverLeafCount 与共享行类型 CatalogTreeRow
移入树快照,服务器管理侧栏、首页目标树与工作区角标三处各自重走的
遍历归一;HomeServerListState.visibleRows 保留为委托门面,视图与
测试零改动。嵌套菜单构造(TargetCascade)与政策查询
(moveDestinations)非投影重复,有意不动。
2026-10-03 14:29:12 +08:00
Qiu Yuzhou cde430c5fc refactor(ui): 服务器表单草稿收成共享 ServerFormFields module
新建/编辑两个表单面此前各持 8 个 @State 字段、逐字复制的密码 reveal、
column helper 与字段 ↔ ServerEditDraft 映射;收进 App/ServerFormFields.swift
(草稿 ObservableObject + 表单栅格视图),caller 只剩 load(from:)/draft。
订阅只读禁用、集外加密追加与插件区 facts 参数化;methodChoices 统一后
新建面行为等价(初值恒在集内)。CONTEXT.md 补 Server form draft 术语。
2026-10-03 13:52:33 +08:00
Qiu Yuzhou aaabb4f7ea refactor(ui): 订阅与诊断分区自持错误弹窗,塌缩两个 destination 包装壳
SubscriptionsView/DiagnosticsView 改为自持 ErrorAlertPresenter 并经
presentingErrors 挂载(与 ServersView 同法),只为转发 presenter 而存在的
WorkspaceSubscriptionsView/WorkspaceDiagnosticsView 整体删除,窗口壳
destinationView 直挂分区视图;WorkspaceHomeView 因承载旧版导入主动弹窗
保留。穿透链 13 个类型减至 11 个,presenter owner 减至 3 个。
2026-10-03 13:29:15 +08:00
Qiu Yuzhou 64ff12dc4c refactor(ui): 错误弹窗挂载收成 presentingErrors modifier
五处逐字复制的 10 行 .alert 样板(窗口壳、三个 destination 包装、服务器
分区)各变一行;ErrorAlertPresenter 的挂载边缘收进 UIErrorAlert.swift,
照 WindowActivationPolicy 的 ViewModifier 先例。AppPresentation 文案
映射边缘不动,presenter 所有权与穿透面不变,零行为变化。
2026-10-03 13:25:19 +08:00
Qiu Yuzhou b24029acab refactor(sysproxy): 操作互斥改等待队列,cleanup 静默窗可注入
waitForSystemProxyOperation 的 10ms 忙轮询换成 continuation 等待队列:操作
收尾时唤醒全部等待者,等待者再经既有二次门禁竞争下一轮,取消者照旧得到
false 中止——语义与轮询版一致,去掉固定 10ms 延迟与空转。cleanup 每轮
扫描后的 SystemConfiguration 排空静默窗提为注入参数(默认仍 100ms)。

观察机现在可从自身 interface 驱动(策略机抽取的直接收益),新增两个不经
控制器夹具的用例:cleanup-until-quiet 重扫循环(清理期内网络变化触发整轮
重扫,安静后收敛)与并发收敛互斥(进行中操作等收尾而非被跳过)。快车道
779 全绿。
2026-10-03 12:52:04 +08:00
Qiu Yuzhou eac30c4abd refactor(sysproxy): 系统代理策略机抽为 SystemProxyObserver 模块
ADR-0022 的观察/修复/挂起策略此前溶解在控制器 15 个可变字段里、由
Gate/Inspection/Commands/Health/Mode 五个文件交叉读写。现在策略机独立为
SystemProxyObserver:意图开关、出口可用性、期望配置与健康循环调度以
@MainActor 闭包注入,模块不反向依赖控制器;底层继续只依赖
SystemProxyControlling / helper 注册缝 / 网络变化监视三条既有缝。

- 3 个 @Published 呈现事实随迁,控制器留同名只读门面(测试与诊断面零改动);
  adapter 再发布链 merge 观察机 objectWillChange,主队列 hop 语义不变
- 健康循环留在控制器(循环体含运行时健康呈现),任务柄归观察机;
  cleanup-until-quiet、网络变化 inspection 调度与操作互斥全部内聚
- 方法体逐字搬运(settings.systemProxyEnabled→isIntentEnabled() 等机械替换),
  语义零改动;既有 777 测试全绿
2026-10-03 12:44:20 +08:00
Qiu Yuzhou 21259dde2a refactor(ui): 主窗口壳停止观察 ProxyRuntimeController,守卫固化
服务器分区活动目标标记改从 control.snapshot.activeTarget 取值(out-of-tree
目标仍带 id,值恒等;与首页/状态菜单同一 snapshot 口径)。MainWindowView/
MainApp 删除对 controller 的直接传递,视图层 controller 依赖清零;MainApp
的 @StateObject 保留为组合根寿命锚点。

顺带把「新 UI 禁依赖 controller」固化为 SkeletonTests 禁令 token
(控制器家族按前缀豁免,ProxyRuntimeFacts 为适配器侧 facts 映射豁免);
删除 ErrorPresentation 的 AgentRunState 呈现 overload(生产零调用),
四处测试断言迁到 RuntimeFailureFacts 路径。
2026-10-03 12:00:04 +08:00
Qiu Yuzhou dbb14dcb88 refactor(ui): 服务器分区活动目标标记收为平值入参
ServersView 不再观察 ProxyRuntimeController,与 SidebarRow/
ServerDetailView 的传参先例同法收 activeTargetID: NodeID?;外壳暂仍从
controller 取值,事实源切换随后一提交完成。
2026-10-03 11:44:28 +08:00
Qiu Yuzhou 14fdd493a3 fix(rules-smoke): adapt smoke fixtures to sourceless ProxyRule
fcd5645「slim built-in snapshots」移除了 ProxyRule 的 source 字段后 Smoke
target 未同步,构造器多传 source: 导致冒烟编译失败(先于收敛脊柱重构就
存在的破损)。移除冒烟夹具中的 source 实参与不再使用的 RuleSourceIdentity
局部值;来源身份属于浏览集合层,运行时文档与 ACL 只消费 action+match,
夹具语义不变。
2026-10-03 11:21:37 +08:00
Qiu Yuzhou 63845e487b style: swift-format leftover in convergence spine 2026-10-03 11:14:32 +08:00
Qiu Yuzhou cb39a13b76 docs: define Runtime convergence in the domain vocabulary
「运行时收敛」此前只以不变量描述(有效值未变的提交不做收敛工作)散见于
各条目,现在作为独立词条定义:GUI 侧把派生运行时定义落到部署的操作——
持久化 intent、重展开已提交目录、派生运行时文档、计划执行部署动作、验证
启动健康、失败整体回滚;派生字节未变且运行态健康时不做任何收敛工作。

顺带收录 pre-commit swift-format 对收敛脊柱文件的一处花括号重排。
2026-10-03 11:14:22 +08:00
Qiu Yuzhou 1fed58c903 refactor(rules): drop the dead rule-mode validation seam
ruleModeCandidateRules / ruleModeValidation 零生产调用者——生产校验经由
RulesWorkflow 预检与 RuleRuntimeCompiler.compile;控制器内这份薄复制删除。
相关测试断言改为直接调用领域层 RuleRuntimeCompiler.validation(与被删缝
同参同义),遮蔽关系与重排不变性断言原样保留。
2026-10-03 11:13:10 +08:00
Qiu Yuzhou d7169d9f01 refactor(runtime): route catalog sync through the convergence spine
- catalogDidCommit 的 deployed 分支体(派生 + 幂等跳过 + deployPrepared)
  与 deploy() 逐语义等价,改走 deploy();runtimeAlreadyConverged 独立机制
  删除,plan 空判定由 apply 层的 convergencePlanIsEmpty 统一承担。
- deploy/deployPrepared 返回 ConvergenceResult:被取代的派生按 .superseded
  呈现为 .revalidated,其余路径仍由状态面映射。
- reexpand 三-case 开关收敛为 convergeToReexpanded:convergeAgent /
  updateSettings / resyncOnLaunch 各变一行;catalogDidCommit 保留按 case
  的结构化 outcome 映射。
- 统一设置持久化 epilogue 为 persistSettings:setAgentEnabled /
  setSystemProxyEnabled / transitionMode 三处相同 save-fail 语义折叠
  (updateSettings 的 throw 变体与级联关闭的 return-nil 变体语义不同,
  保持原样)。
- SkeletonTests 运行时适配器豁免名单登记 +Convergence.swift。
2026-10-03 11:08:24 +08:00
Qiu Yuzhou 8587b2e80c refactor(runtime): unify apply/restore into the convergence spine
三份「执行 → 健康门 → 失败回滚」编排骨架(mode 切换 / rules 提交 /
deployPrepared)统一为收敛脊柱的 apply 层:

- apply:幂等跳过(派生契约与运行中运行时逐字节相同 → .unchanged,
  不闪 starting、不重走健康门)→ 计划执行 → 健康门(requiresReceipt /
  convergeProxyOnSuccess / preserveProxyOnFailure 逐路径参数照旧)→
  成功后按 proxyTail 收敛系统代理。
- restore:单一回滚例程 + RollbackPlan 两种载荷 policy(mode 的
  settings/mode 回退 + 意图变化强制重收敛;rules 的规则文档恢复)。
  restoreRuntimeDocument/relaunchPreviousInstance 删除——计划层对
  写契约/信号/注销重注的裁决与旧例程逐场景等价。
- 票据 inout 传参:execute 后的 flow 推进对调用方可见,rules 提交在
  apply 之后的时效检查使用推进过的票据。
- ModeTransitionSnapshotForRules 删除,rules 回滚计划在部署入口构建。

行为保持:.run 计划动作全部同步执行,starting 前置不可观测;mode/rules
路径到 apply 时计划必非空,幂等跳过只对 deploy 路径生效(与「有效值未
变的提交不做运行时收敛」不变量一致)。
2026-10-03 10:56:23 +08:00
Qiu Yuzhou dc35e70798 refactor(runtime): capture convergence tickets instead of hand-checked generations
execute 现在返回 RuntimeExecutionOutcome(成功与否 + 本次占用的并发流
代际),mode 与 rules 路径的 24 处手写代际 guard 收拢为 ConvergenceTicket
的 convergenceIsCurrent 检查;两处 flowGeneration + 1 手算随之消失。
行为逐字节保持:mode 路径的 mode 代际仍在派生前捕获、preparation 分量
在派生后推进;rules 路径四个代际事实全查不变。
2026-10-03 10:30:47 +08:00
Qiu Yuzhou 3aae39799a fix(rules): convert root URL paths to exact domains 2026-10-03 09:56:00 +08:00
Qiu Yuzhou 6e69d92449 feat(rules): convert pathless URL prefixes to exact domains 2026-10-03 09:52:42 +08:00