将 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>
45 lines
2.0 KiB
Go
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`}
|
|
}
|