Files
dingtalk-workspace-cli/internal/helpers/docjsonml/doc_jsonml_root_wrap.go
539d10f80f feat: 合并 pre-mcp-discovery 分支能力到 main(服务发现保持生产) (#391)
将 test/pre-mcp-discovery 分支上多位同学的能力改动整体合入 main,
服务发现端点保持生产 https://mcp.dingtalk.com,未携带分支上的预发改动。

主要内容:
- 修雨域(chat / report / todo / contact / mail)对齐 wukong 基线 (#355)
- DWS 内容生产能力增强 (#387)、文档导出与 OA 对齐 (#362 #388 #390)
- envelope 注册 cli.Aliases 为 cobra aliases、命令结构与 JSON 解析优化
- skills 多包同步 wukong 对齐内容(attendance/calendar/minutes/oa/sheet 等)
- product/oa 进一步对齐 wukong

排除项:未携带 566b4e1(test: point service discovery to pre-mcp.dingtalk.com);
以下 4 个常量保持生产:skill_command.go / auth/endpoints.go / cli/loader.go / market/registry.go。

Co-authored-by: john <32427341+wqyenjoy@users.noreply.github.com>
Co-authored-by: wxianfeng <wang.fl1429@gmail.com>
2026-06-02 21:04:12 +08:00

45 lines
2.0 KiB
Go

package docjsonml
// ──────────────────────────────────────────────────────────
// JSONML body root wrapping (protocol-level coercion)
//
// 服务端 writeAsJsonML 路径要求 body 形态为
//
// ["root", {attrs?}, ...blockNodes]
//
// 即「单棵以 root 为顶点的树」。早先 dws-wukong 文档/校验器注释里曾声称「裸
// block 数组也是服务端可接受的形态」,但 cross-stack 验证(we-word-open-api
// jsonmlNodes.ts 的 getChildStart 启发式 + packSerializer.deserialize 反向
// 期望)确认:bare-array 形态会触发节点静默丢失或反序列化失败。
//
// 本函数仅做最薄的协议层修整,与 NormalizeJsonMLBody 关注点分离:
//
// NormalizeJsonMLBody — 单 block 内部修复(uuid 注入、文本包裹、…)
// EnsureRootWrappedBody — body 整体形态修整(缺 root 时补包裹)
//
// 这样既保留 normalize 测试矩阵(仍以 [block, ...] 形态作为基线),又能保证
// 落地协议层符合服务端约束。
// ──────────────────────────────────────────────────────────
// EnsureRootWrappedBody returns body wrapped as ["root", {}, ...body] when
// the input is not already root-rooted. Returns the input unchanged when:
//
// - body is empty
// - body[0] is the literal string "root"
//
// notes is non-empty only when wrapping was applied.
//
// The function does not mutate its input.
func EnsureRootWrappedBody(body []any) (wrapped []any, notes []string) {
if len(body) == 0 {
return body, nil
}
if tag, ok := body[0].(string); ok && tag == "root" {
return body, nil
}
out := make([]any, 0, len(body)+2)
out = append(out, "root", map[string]any{})
out = append(out, body...)
return out, []string{`$: wrap bare body with ["root", {}, ...] to satisfy server writeAsJsonML contract`}
}