Skip to content

[Pull Request] WorkflowV6: 契约层 v6 支持 + 前后端分离契约 - #7

Open
StardustSeemsInk wants to merge 104 commits into
dev=mainfrom
dev=v6-grammar
Open

[Pull Request] WorkflowV6: 契约层 v6 支持 + 前后端分离契约#7
StardustSeemsInk wants to merge 104 commits into
dev=mainfrom
dev=v6-grammar

Conversation

@StardustSeemsInk

@StardustSeemsInk StardustSeemsInk commented Aug 3, 2026

Copy link
Copy Markdown
Member

What does this PR do?

将 dev=v6-grammar 分支(KitX.Core.Contract 契约库 + 前后端分离契约层)合并向 dev=main。含 dev=toolkit 工作线契约更新(2026-08-22 fast-forward 并入)。

前后端分离契约层(dev=UI-separate-SI)

  • 新建 KitX.Core.Contract:配置/设备/插件/安全/事件/任务等全部业务接口迁入,Dashboard 与 Core 仅经契约交互
  • 契约层收敛重构:事件参数与 EventNames 全量迁入 Contract、IAppConfig/IAppConf 两代统一(JSON 反序列化兼容)、僵尸接口与死代码清理
  • 安全修复:kxp 解包路径穿越(先全量校验后写出)、DeviceLocator 哈希契约修复(Equals/GetHashCode 按值一致)

KcsFileFormat v2 信封(v6 Workflow 支持)

  • IrVersion 字段区分 v5/v6 IR 格式;IR 作为存储体,移除 BS/BP/CfgData 冗余
  • BlueprintLayout 信封字段(BP 画布布局持久化:键=规范节点 ID,可选字段,向后兼容旧 .kcs)
  • GroupComments(语句级注释载体)、StatementPrimaryNodeIds / StatementNodeToPrimary(语句 Leader 节点暴露)
  • PinType.Dict + VariadicPinSpec 引脚组扩展(v6 Dict 类型铺路);ConstNode/VariableNode IsDefinition 显式化、VarInitialValue(var 声明初始化器 BP round-trip)
  • TriggerConfig 新增 EntryNodeX/EntryNodeY 坐标字段;IBlueprintDebugController 新增 NotifyValueChanged

Kscript 僵尸系清理

  • Kscript.Compiler/Editor 归档,语言引擎移除,插件运行时拆为 Kscript.Runtime;PluginFunctionsGenerator 标记弃用(插件函数信息改由 PluginInfo.Functions 提供)

ToolKit 工作线契约更新(dev=toolkit 并入,8928c14..403b665,9 笔)

  • IAppConf 新增 IPerformanceConf 性能配置 section:ScriptCompilerCacheCapacity / CompletedInstanceCap / PanelLogLimit
  • IActivityService 补 ReadActivities / CountActivities 分页读取契约(活动日志 G2)
  • 消息解析结果随事件下传(G1:PluginsServer 单次解析共享,插件事件载荷零重复解析)
  • 设备加密认证连接契约:IDeviceConnectionClient / IDeviceKeyExchangeUi / IEncryptionService(单临时密码密钥交换机制复刻)
  • IEventService 强类型话题 API:Subscribe<TEvent> / Publish<TEvent>(类型不匹配不再静默丢弃)
  • Kscript.Runtime:PluginNotify fire-and-forget 插件调用 + IPluginManager 扩展
  • v5 死契约退役:ITriggerManager / IWorkflowManagementService / IWorkflowStorageService / TriggerConfig 与 EventNames 旧常量删除(legacy standalone-workflow storage contracts retire)

Related issues

#289 #291

…rd interfaces for the separation of front-end and back-end in the Dashboard.
- BpRenderer 渲染每条语句时记录 primary 节点 Id;前端据此提供组注释吸附/创建
  的合法锚点(只有语句 Leader 能承载 Leading 注释,否则 Reverse 丢弃注释)
…mary 映射

- nodeId → 所属语句 primary(leader)Id;数据子图 = 从 primary 沿数据边可达的连通
  分量(KS 一行 ⇔ 一个数据子图,互不重叠)
- 前端据此将任意数据节点的组注释吸附锚定到其所在子图的 primary,与 KS→BP 一致
- DefaultValue = KS 声明初始值(const { int x = 5 } → "5"),BP 侧只读显示
- ConstValue/VarInitialValue 语义改为"用户值"(编辑器层 override,对应
  Variable Constants 栏 UserValue)
插件的函数返回值位于响应 Command 的 Body 中(与原生调用路径
PluginsManager.CallPluginFunctionAsync 的解码行为对齐)。工作流路径
(RealPluginManager.HandlePluginResponse)此前把整个 Command 包装 JSON
当作返回值,导致 PluginCall 拿到的是包装数据体而非函数结果(v6 Trigger
测试暴露)。修复:SendPluginRequest 收到响应后先 TryDecodeResponseBody
(解析 Command + 解码 Body),成功则用之;非 Command 格式回退原逻辑
… 等移除

v5.1 体系(KitX.WorkflowIR)已归档至 Package/Archive/,Contract 中仅 v5.1
消费的类型随之清理(归档副本见 Package/Archive/Contract-v5.1/):

- 删除节点类型:BlockNode / CallNode / CallHelperNode / EntryPointNode /
  ExitPointNode(NodeDescriptor/PinDescriptor 为节点模型自描述 API,保留)
- 删除 DTO/服务接口:CfgDto(+6 DTO) / BranchArm / ControlFlowArms /
  BlueprintRenderData / INodeRegistry / IRealPluginManagerBridge /
  IBlockScriptService / IWorkflowPluginService / BlockScriptValidationResult
- BlueprintModels:移除 BlueprintBlockScope / BlockVarEntry / BlockScopes
- BlueprintNode:JsonDerivedType 移除已删类型条目

保留:BlueprintNodeType(v6 Dashboard 与 v6 测试在用)、
BlockScriptExecutionResult(v5/v6 执行后端共用)。
定义型/使用型判定此前靠前端推断(无 Exec pin / 无连线,三处实现分叉,
语义脆弱)。定义型一经创建永久维持,由数据承载:

- ConstNode/VariableNode 新增 IsDefinition(Blueprint 内存态,无序列化负担)
- BpRenderer 在 /def/ 分支设置;前端三处判定改读字段
- 值同步过滤(DefinitionValueSynchronizer)同源
…orkflows 删除

Dashboard 启动时静默注册所有持久化 TriggerConfig 的 Trigger 订阅,导致
工作流卡片状态灯显示未挂载(红)时插件 Trigger 仍能唤起工作流逻辑,
且绕过插件连接检查(插件离线也会被唤起并执行失败)。接口层面删除
该入口:Trigger 订阅纯运行时状态,仅由 Run(注册)/Stop(注销)驱动。
未来「KitX 启动时自动启动工作流」的可配置机制记录于 Toolkit功能需求文档.md §四。
- BlueprintLayout: Dictionary<string, BlueprintLayoutEntry>(键=规范节点 ID,FNV(path))

- BlueprintLayoutEntry { X, Y };可选字段向后兼容(旧 .kcs 反序列化为 null)
…ar:' 前缀

usage 节点标题不再携带存储层前缀(const/var 区分由前端 Kind 行与 pin 形态表达;标题=引用名本身,新建节点空名与加载一致)
- 解包前对每个文件名校验 Path.GetFullPath 前缀必须位于释放目录内(Ordinal 比较),拦截 ../ 穿越与绝对路径
- 非法路径整体抛 InvalidDataException,不做半解包
- 校验通过后再统一写出文件
- 删除 8 个僵尸项目:Kscript.Compiler/Parser/VM/CSharp.Compiler/CSharp.Parser.Examples/Editor(4 平台)/CSharp(语言职能已被 WorkflowV6 KsTextLens 取代,全部零消费者)
- 新建 Kscript.Runtime:仅保留插件运行时(IPluginManager/IPluginServiceProvider/RealPluginManager/MockPluginManager/PluginCallInfo),命名空间不变(Kscript.CSharp.Parser.Core/Models)
- 删除语言引擎(Parser.cs/CodeGen/Exceptions/ParserException)
S-2: ① 事件参数 6 类型与 EventNames 31 常量迁入 KitX.Core.Contract.Event(常量值零漂移),WorkflowEventNames 合并删除;② 配置段接口统一为 *Conf(旧名保留 Obsolete 继承别名),LogLevel 改契约自定义枚举并移除 Serilog 依赖,IPagesConf.Device/Market 补真实段接口;③ 删除 IDeviceService 僵尸门面/Events 复数目录/NodeDescriptor/PinDescriptor(含描述器机制);④ IrVersion 与 CreateWorkflowAsync 默认值统一为 v6。
… 改确定性值哈希

S-1: 引用哈希导致设备签名查询恒 false、token 字典无界增长、设备去重/离线判定失效(netstandard2.0 无 System.HashCode,内联移植等价算法)。
S-3: Kscript.Runtime 内整类 Console 调试输出的 mock 类无任何消费者;RootNamespace 遗留(Kscript.CSharp.Parser)因跨仓库联动暂保留。
D-REG: 单源可能随时间发出不同 MAC 格式(50:5A:65:4F:BF:DD vs 505A654FBFDD),字符串相等比较导致设备去重失败、同一设备重复出现在设备页。
@StardustSeemsInk StardustSeemsInk changed the title [Pull Request] Dev=v6-grammar [Pull Request] WorkflowV6: 契约层 v6 支持 + 前后端分离契约 Aug 9, 2026
IEventService 新增三个强类型方法,以 .NET 类型作话题 key(编译期类型安全,
消除字符串话题 + 载荷类型靠人工对账的静默丢事件风险):
- Subscribe<TEvent>(Action<TEvent>):订阅时捕获 SynchronizationContext 自动编组
- Unsubscribe<TEvent>(Action<TEvent>)
- Publish<TEvent>(TEvent)

老字符串 API 保留(阶段6 迁移完成后统一标 [Obsolete])。

Date: 2026-08-17
Author: StarInk
复刻 dev=security 分支的单临时密码密钥交换机制接口(避免未来合并冲突):

- IDeviceConnectionClient:出站密钥交换/连接客户端接口 + ExchangeKeyResult
- IDeviceKeyExchangeUi:密钥交换 UI 抽象(发起端显示密码/接收端提示输入)
- IDeviceServer 加 AcceptExchangeKey/RejectExchangeKey(单临时密码协议)
- IEncryptionService 加 RsaSignString/RsaVerifySignature(签名握手)
- DeviceLocator.IsSameDevice 改大小写不敏感(WSL 主机名大小写差异回归)

Date: 2026-08-17
Author: StarInk
KitX 未发布,死事件属反模式。经全仓 grep 逐项验证零引用后删除:

- EventNames:删除 13 个零引用常量(PluginsConfigChanged/
  MicaOpacityChanged/OnActivitiesUpdated/OnReceivingDeviceInfo/
  OnConfigHotReloaded/PluginMessageReceived/WorkflowCreated/
  WorkflowDeleted/WorkflowRenamed/TriggerFired/WorkflowTriggered/
  OnReceiveCancelExchangingDeviceKey/PluginConnected)
- IPluginServer:删除 PluginConnected 事件成员——全仓零 raise
  零订阅的死契约(连三个测试假实现都只是被迫实现它)
- PluginEventArgs:删除随之无引用的 PluginConnectedEventArgs

UseStatisticsChanged(他人模块未完成)与 WorkflowDataSaved
(正在接通消费端)按负责人指令保留。

Date: 2026-08-17
Author: StarInk
…acts

Remove IWorkflowStorageService, IWorkflowService (IWorkflowCase) and the
per-file TriggerConfig envelope from KitX.Core.Contract. Trigger relationships
now live in the ToolKit config (Data/Toolkits/{id}/toolkit.json Triggers[]),
not in the .kcs. Old .kcs files carrying a leftover triggerConfig JSON field
are read tolerantly (System.Text.Json ignores unknown properties).
…(G2)

- PluginMessageReceivedEventArgs 加 Request?/Command?/IsResponse? nullable 字段(默认 null 回退,源兼容)
- IPluginConnection.MessageReceived 签名 EventHandler<string> → EventHandler<PluginMessageReceivedEventArgs>(宿主侧接口,生产实现唯一)
- IPerformanceConf 加 PanelLogLimit(面板 Log 环形上限,全局默认 1000)
…es 契约成员

活动库读取随 ActivityManager 实例化收敛(架构整改 #3 配套):
- 接口新增 ReadActivities(limit, skip) 与 CountActivities(),返回富模型 Common.Activity.Activity
- 契约工程新增 Common.Activity 引用(ProjectReference 带本地 Reference 兜底 PackageReference,随仓库既有写法)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant