Files
dingtalk-workspace-cli/internal/shortcut/aitable/composite_contract.go

80 lines
5.8 KiB
Go

// Copyright 2026 Alibaba Group
// SPDX-License-Identifier: Apache-2.0
package aitable
import (
"encoding/json"
"strings"
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/corecmd"
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/corecmd/contract"
)
func aitableCompositeContractWithResult(command, description, useWhen, avoidWhen, example string, result *contract.ResultSpec) corecmd.ContractDecl {
declaration := aitableCompositeContract(command, description, useWhen, avoidWhen, example)
declaration.Result = result
return declaration
}
func aitableTableBootstrapResultSpec() *contract.ResultSpec {
return &contract.ResultSpec{
Outcomes: []contract.ResultOutcome{
contract.ResultOutcomeSuccess,
contract.ResultOutcomeFailure,
},
DataSchema: json.RawMessage(`{
"type":"object",
"description":"AI Table 数据表初始化的执行计划、进度、验证证据和恢复信息",
"properties":{
"contractVersion":{"type":"string","description":"复合操作业务回执版本","const":"aitable.composite.v1"},
"operation":{"type":"string","description":"复合操作标识","const":"table_bootstrap"},
"status":{"type":"string","description":"业务执行状态;失败时同结构位于 error.details.result","enum":["success","planned","partial_success","unknown"]},
"executed":{"type":"boolean","description":"是否已开始执行远端操作"},
"retryable":{"type":"boolean","description":"当前回执是否允许直接重试"},
"requestedCount":{"type":"integer","description":"请求创建的字段数量","minimum":0},
"completedCount":{"type":"integer","description":"已完成并验证的字段数量","minimum":0},
"failedCount":{"type":"integer","description":"已确认失败的字段数量","minimum":0},
"resolved":{"type":"object","description":"已解析的 Base、数据表名称和稳定 ID","additionalProperties":true},
"plan":{"type":"array","description":"dry-run 或执行前生成的有序操作计划","items":{"type":"object","description":"一个计划步骤","properties":{"index":{"type":"integer","description":"步骤序号"},"name":{"type":"string","description":"步骤名称"},"tool":{"type":"string","description":"步骤使用的 MCP 工具"},"status":{"type":"string","description":"步骤状态"},"offset":{"type":"integer","description":"分片起始偏移"},"count":{"type":"integer","description":"步骤处理数量"},"arguments":{"type":"object","description":"步骤参数摘要","additionalProperties":true},"result":{"type":"object","description":"步骤结果摘要","additionalProperties":true},"error":{"type":"string","description":"步骤错误摘要"}},"required":["index","name","status"],"additionalProperties":false}},
"completedSteps":{"type":"array","description":"已完成步骤及其验证摘要","items":{"type":"object","description":"一个已完成步骤","properties":{"index":{"type":"integer","description":"步骤序号"},"name":{"type":"string","description":"步骤名称"},"tool":{"type":"string","description":"步骤使用的 MCP 工具"},"status":{"type":"string","description":"步骤状态"},"offset":{"type":"integer","description":"分片起始偏移"},"count":{"type":"integer","description":"步骤处理数量"},"arguments":{"type":"object","description":"步骤参数摘要","additionalProperties":true},"result":{"type":"object","description":"步骤结果摘要","additionalProperties":true},"error":{"type":"string","description":"步骤错误摘要"}},"required":["index","name","status"],"additionalProperties":false}},
"verification":{"type":"object","description":"创建后读回验证证据","additionalProperties":true},
"checkpoint":{"type":"object","description":"失败或部分成功后的恢复检查点","additionalProperties":true},
"nextCommand":{"type":"string","description":"用于核验或恢复的下一条可执行命令"},
"knownSideEffects":{"type":"array","description":"已确认发生的远端副作用","items":{"type":"object","description":"一个已确认副作用","additionalProperties":true}},
"warnings":{"type":"array","description":"不阻断最终验证的警告信息","items":{"type":"string"}},
"result":{"type":"object","description":"成功时创建并验证的数据表结构","properties":{"baseId":{"type":"string","description":"目标 Base ID"},"tableId":{"type":"string","description":"新数据表稳定 ID"},"tableName":{"type":"string","description":"新数据表名称"},"fields":{"type":"array","description":"读回验证后的字段结构","items":{"type":"object","description":"一个已验证字段","additionalProperties":true}}},"required":["baseId","tableId","tableName","fields"],"additionalProperties":true}
},
"required":["contractVersion","operation","status","executed","retryable"],
"additionalProperties":false
}`),
}
}
func aitableCompositeContract(command, description, useWhen, avoidWhen, example string) corecmd.ContractDecl {
name := strings.TrimPrefix(command, "+")
name = strings.ReplaceAll(name, "-", "_")
cliPath := "aitable " + command
return corecmd.ContractDecl{
Identity: contract.ToolIdentitySpec{
ProductID: "aitable",
Name: "shortcut_" + name,
CanonicalPath: "aitable.shortcut_" + name,
CLIPath: cliPath,
PrimaryCLIPath: cliPath,
},
Description: description,
Interface: &contract.InterfaceSpec{
Mode: "composite",
Availability: "available",
Reason: "DWS reviewed composite orchestration with explicit read-back success predicates, partial-effect reporting, and resumable checkpoints; no single MCP operation represents the full command contract.",
},
Selection: contract.SelectionSpec{
AgentSummary: description,
UseWhen: []string{useWhen},
AvoidWhen: []string{avoidWhen},
Examples: []string{example},
},
}
}