Skip to content

[Pull Request] Dev=v6-grammar - #7

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

[Pull Request] Dev=v6-grammar#7
StardustSeemsInk wants to merge 95 commits into
dev=mainfrom
dev=v6-grammar

Conversation

@StardustSeemsInk

Copy link
Copy Markdown
Member

What does this PR do?

将 dev=v6-grammar 分支(KitX.Core.Contract 契约库)合并向 dev=main。

包含契约层对 v6 Workflow 的支持:

  • KcsFileFormat 新增 BlueprintLayout 信封字段(BP 画布布局持久化:键=规范节点 ID,可选字段,向后兼容旧 .kcs)
  • 新增 BlueprintLayoutEntry 坐标条目类型

Related issues

#289 #291

…rd interfaces for the separation of front-end and back-end in the Dashboard.
…lueprintConverter

- 新增 BpEditAction 抽象 record + 12 个具体编辑动作(AddNodeInBlock/DeleteNode/MoveNodeToBlock/SetNodeArgument/ConnectData/Disconnect/SetControlFlowArm/AddBlock/RenameBlock/DeleteBlock/MoveNodePosition)
- 纯数据 record,无 CFG/Workflow 依赖,供 Dashboard 描述用户编辑、IBpEditApplier 翻译为 IR 变更
- 移除 IBlueprintConverter.cs(v5.1 已废弃,BS↔BP 转换改走 CFG 真相源 + ICfgBsRenderer/ICfgBpRenderer)
v6.0 架构下 IR 是唯一真相源,BS/BP 都是投影。v1 的三份冗余存储
(MainProgram/BlockScriptSource + BlueprintData + CfgData)终结为单一 IrData。

移除字段(投影,不再持久化):
- MainProgram / BlockScriptSource → BsTextLens.Project(ir) 按需生成
- BlueprintData → BpGraphLens.Project(ir) 按需生成
- CfgData → 被 IrDto v6.0 完全替代
- UseBlockMode → IR-as-truth 无模式概念
- HelperFunctions → 已在 IrWorkflow.HelperFunctions(信封不再重复)

保留字段(信封元数据,非 IR 语义):
- Id/Name/Description/Author/timestamps — 工作流身份/元数据
- TriggerConfig — 部署/触发配置
- VariableConstants — 用户对 IrConstant 的运行时覆盖

新增字段:IrData (string) — IrSerializer.Serialize(ir) 的 JSON
合成 EntryNode 不对应任何 IrBlock,其画布坐标随触发配置持久化。
为蓝图嵌套节点展开模式设置项提供合约支持。
取值 'Embedded'(画中画内嵌编辑器)或 'SubEditor'(模态覆盖层)。
未知值回退到 'Embedded'。

关联:Package/ForLoop-Retirement-And-Each-Design.md
依赖:KitX.Core.Config_App 实现该字段

Date: 2026-07-20
Author: opencode
新增 BlueprintGroupComment 类(Comment + AnchorNodeId + NodeIds)与 Blueprint.GroupComments 列表。Backing KS LeadingComment 的 BP 往返:一个 KS 语句映射到一个数据连接子图,GroupComment 锚定到语句的主节点(exec 链入口节点)供反向翻译器重附着。NodeIds 供前端框选渲染(可选)。附加字段,旧消费者忽略,向后兼容。

配合 WorkflowV6 注释保留 Phase B-2。
…ebug 数据电容通道入口

为 v6 工作流的"连线数据 tooltip"(§十二-M MVP) 与"变量实时通知"提供统一的
运行时值变化入口。生成的 C# 代码在 Debug 模式下调用此方法发布两类事件:

  - PubVar 写入:   name = 变量名(如 "counter")
  - 连线值流动:    name = "w:{nodeId}" 或 "w:{nodeId}:{pinName}"
                   (段输出 / 控制流 Condition|List|Selector 入口)

复用既有 VariableChanged 事件路由, 避免新增事件类型; 前端通过 "w:" 前缀
区分连线值与 PubVar 值。RealBlueprintDebugger (Dashboard) 同步实现。

协议层改动: 接口新增单方法, 二进制不兼容, 需 Dashboard 同步重编译。

Date: 2026-07-27
Author: KitX WorkflowV6 Team
- PinType 新增 Dict 枚举值(灰色),对应运行时 Dictionary<string,object?>

- VariadicPinSpec 扩展可选 PinNamePrefixes/PinTypes 字段,支持 DictNew 的 Key(String)/Value(Any) 配对变长

- 向后兼容现有 StringConcat 单类型变长(可选字段默认 null)
…trip 载体

- 新增 VarInitialValue (string?) 字段,与 ConstNode.ConstValue 对称

- 对 dict var 承载 KsDictLiteral 的 JSON 序列化,使 BP round-trip 能重建 DictInitializer

- 同时修复长期遗留:var 声明初始化器此前在 BP round-trip 中完全丢失
- 默认 v5 保持向后兼容 (现有 .kcs 无此字段, 反序列化取默认值)
- V6 工具写入 v6, Dashboard 据此选择编辑器
…rsion 参数 — P5-A4

- CreateWorkflowAsync(name, description = null, irVersion = "v5"):按 irVersion 选择存储的
  IR 格式(v5 WorkflowIR / v6 WorkflowV6),与 KcsFileFormat.IrVersion 对齐,使新建的
  v6 工作流打开时由 OpenWorkflowEditorAsync 分派到 V6 编辑器
- 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),字符串相等比较导致设备去重失败、同一设备重复出现在设备页。
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