Files
dingtalk-workspace-cli/internal/cli/runtime_schema.go
T

1608 lines
50 KiB
Go

// Copyright 2026 Alibaba Group
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cli
import (
_ "embed"
"encoding/json"
"sort"
"strconv"
"strings"
apperrors "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/errors"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
//go:embed schema_mcp_metadata.json
var embeddedMCPMetadataJSON []byte
const (
runtimeSchemaProductAnnotation = "dws.schema.product"
runtimeSchemaToolAnnotation = "dws.schema.tool"
runtimeSchemaSourceAnnotation = "dws.schema.source"
runtimeSchemaTitleAnnotation = "dws.schema.title"
runtimeSchemaDescAnnotation = "dws.schema.description"
runtimeSchemaMetaAnnotation = "dws.schema.metadata_source"
runtimeSchemaExcludeAnnotation = "dws.schema.exclude"
runtimeSchemaRulesAnnotation = "dws.schema.constraints"
runtimeSchemaArgsAnnotation = "dws.schema.positionals"
runtimeSchemaFlagPropertyAnnotation = "dws.schema.property"
runtimeSchemaFlagTypeAnnotation = "dws.schema.type"
runtimeSchemaFlagDescriptionAnnotation = "dws.schema.description"
runtimeSchemaFlagRequiredAnnotation = "dws.schema.required"
runtimeSchemaFlagRequiredWhenAnnotation = "dws.schema.required_when"
runtimeSchemaFlagExampleAnnotation = "dws.schema.example"
)
// RuntimeSchemaConstraints describes cross-parameter rules that cannot be
// represented by an individual parameter's required bit.
type RuntimeSchemaConstraints struct {
MutuallyExclusive [][]string `json:"mutually_exclusive,omitempty"`
RequireOneOf [][]string `json:"require_one_of,omitempty"`
RequireTogether [][]string `json:"require_together,omitempty"`
}
// RuntimeSchemaPositional describes one ordered CLI argument. Name is also
// used by RuntimeSchemaConstraints when a one-of group mixes flags and args.
type RuntimeSchemaPositional struct {
Name string `json:"name"`
Type string `json:"type,omitempty"`
Description string `json:"description,omitempty"`
Required bool `json:"required"`
Variadic bool `json:"variadic,omitempty"`
Index int `json:"index"`
}
type embeddedMCPMetadata struct {
Version int `json:"version"`
Source string `json:"source"`
SourceRevision string `json:"source_revision,omitempty"`
SourceHash string `json:"source_hash"`
Coverage embeddedMCPMetadataCoverage `json:"coverage,omitempty"`
Tools map[string]embeddedMCPToolMetadata `json:"tools"`
}
type embeddedMCPMetadataCoverage struct {
SurfaceScope string `json:"surface_scope,omitempty"`
SourceServices int `json:"source_services,omitempty"`
SnapshotServices int `json:"snapshot_services,omitempty"`
MissingServices []string `json:"missing_services,omitempty"`
SourceTools int `json:"source_tools,omitempty"`
SurfaceTools int `json:"surface_tools,omitempty"`
MatchedTools int `json:"matched_tools,omitempty"`
AliasedTools int `json:"aliased_tools,omitempty"`
UnmatchedTools int `json:"unmatched_tools,omitempty"`
}
type embeddedMCPInterfaceRef struct {
ProductID string `json:"product_id"`
RPCName string `json:"rpc_name"`
}
type embeddedMCPToolMetadata struct {
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Parameters map[string]embeddedMCPParamMeta `json:"parameters,omitempty"`
InterfaceRef *embeddedMCPInterfaceRef `json:"interface_ref,omitempty"`
}
type embeddedMCPParamMeta struct {
Type string `json:"type,omitempty"`
Description string `json:"description,omitempty"`
Default string `json:"default,omitempty"`
Format string `json:"format,omitempty"`
Enum []string `json:"enum,omitempty"`
Required *bool `json:"required,omitempty"`
RequiredWhen string `json:"required_when,omitempty"`
}
var runtimeEmbeddedMCPMetadata = loadEmbeddedMCPMetadata()
var runtimeSchemaConstraintsByCanonical = map[string]RuntimeSchemaConstraints{}
// RegisterRuntimeSchemaConstraints records reviewed cross-parameter CLI rules
// independently from the generated Catalog, preventing stale Catalog data
// from becoming the source of its own next generation.
func RegisterRuntimeSchemaConstraints(canonicalPath string, constraints RuntimeSchemaConstraints) {
canonicalPath = strings.TrimSpace(canonicalPath)
constraints = normalizeRuntimeSchemaConstraints(constraints)
if canonicalPath == "" || runtimeSchemaConstraintsEmpty(constraints) {
return
}
runtimeSchemaConstraintsByCanonical[canonicalPath] = constraints
}
func loadEmbeddedMCPMetadata() embeddedMCPMetadata {
var metadata embeddedMCPMetadata
if err := json.Unmarshal(embeddedMCPMetadataJSON, &metadata); err != nil {
return embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{}}
}
if metadata.Tools == nil {
metadata.Tools = map[string]embeddedMCPToolMetadata{}
}
return metadata
}
func interfaceMetadataSummary() map[string]any {
metadata := runtimeEmbeddedMCPMetadata
summary := map[string]any{
"source": strings.TrimSpace(metadata.Source),
"version": metadata.Version,
"source_hash": strings.TrimSpace(metadata.SourceHash),
"tool_count": len(metadata.Tools),
}
if revision := strings.TrimSpace(metadata.SourceRevision); revision != "" {
summary["source_revision"] = revision
}
if metadata.Coverage.SurfaceTools > 0 {
summary["coverage"] = metadata.Coverage
}
return summary
}
// AttachRuntimeSchema marks a runnable command as part of the runtime schema
// surface. `dws schema` scans only commands with these annotations, so the
// schema source is the actual command surface generated from overlays/helpers,
// not the MCP tools/list catalog.
func AttachRuntimeSchema(cmd *cobra.Command, productID, toolName, source string) {
if cmd == nil {
return
}
productID = strings.TrimSpace(productID)
toolName = strings.TrimSpace(toolName)
if productID == "" || toolName == "" {
return
}
if cmd.Annotations == nil {
cmd.Annotations = map[string]string{}
}
cmd.Annotations[runtimeSchemaProductAnnotation] = productID
cmd.Annotations[runtimeSchemaToolAnnotation] = toolName
if source = strings.TrimSpace(source); source != "" {
cmd.Annotations[runtimeSchemaSourceAnnotation] = source
}
}
// AnnotateRuntimeToolMetadata preserves MCP-provided tool metadata on a Cobra
// leaf so `dws schema` can render richer descriptions without refetching.
func AnnotateRuntimeToolMetadata(cmd *cobra.Command, title, description, source string) {
if cmd == nil {
return
}
if cmd.Annotations == nil {
cmd.Annotations = map[string]string{}
}
if title = strings.TrimSpace(title); title != "" {
cmd.Annotations[runtimeSchemaTitleAnnotation] = title
}
if description = strings.TrimSpace(description); description != "" {
cmd.Annotations[runtimeSchemaDescAnnotation] = description
}
if source = strings.TrimSpace(source); source != "" {
cmd.Annotations[runtimeSchemaMetaAnnotation] = source
}
}
// AnnotateRuntimeFlag adds parameter metadata to an already-registered flag.
// The metadata mirrors the runtime binding that produced the flag, allowing
// schema rendering to preserve MCP parameter names while displaying CLI flags.
func AnnotateRuntimeFlag(cmd *cobra.Command, flagName, propertyName, paramType string, required bool, _ string) {
if cmd == nil {
return
}
flagName = strings.TrimSpace(flagName)
if flagName == "" {
return
}
flag := runtimeCommandFlag(cmd, flagName)
if flag == nil {
return
}
setFlagAnnotation(flag, runtimeSchemaFlagPropertyAnnotation, strings.TrimSpace(propertyName))
setFlagAnnotation(flag, runtimeSchemaFlagTypeAnnotation, strings.TrimSpace(paramType))
setFlagAnnotation(flag, runtimeSchemaFlagRequiredAnnotation, strconv.FormatBool(required))
}
// AnnotateRuntimeFlagProperty records only the stable CLI flag to interface
// property binding. It intentionally does not copy required or constraints
// from an older Catalog into the current executable contract.
func AnnotateRuntimeFlagProperty(cmd *cobra.Command, flagName, propertyName string) {
if cmd == nil {
return
}
if flag := runtimeCommandFlag(cmd, flagName); flag != nil {
setFlagAnnotation(flag, runtimeSchemaFlagPropertyAnnotation, strings.TrimSpace(propertyName))
}
}
// AnnotateRuntimeRequiredFlags records schema-only required semantics. Unlike
// cobra.MarkFlagRequired, it does not require the primary flag itself to be
// changed, so helper commands can keep accepting hidden --url/--id aliases.
func AnnotateRuntimeRequiredFlags(cmd *cobra.Command, flagNames ...string) {
if cmd == nil {
return
}
for _, name := range flagNames {
flag := runtimeCommandFlag(cmd, name)
if flag != nil {
setFlagAnnotation(flag, runtimeSchemaFlagRequiredAnnotation, "true")
}
}
}
// AnnotateRuntimeFlagRequiredWhen records a conditional CLI requirement. The
// expression is descriptive metadata and does not alter Cobra validation.
func AnnotateRuntimeFlagRequiredWhen(cmd *cobra.Command, flagName, expression string) {
if cmd == nil {
return
}
if flag := runtimeCommandFlag(cmd, flagName); flag != nil {
setFlagAnnotation(flag, runtimeSchemaFlagRequiredWhenAnnotation, strings.TrimSpace(expression))
}
}
// AnnotateRuntimeFlagFormat records a machine-readable value format without
// changing the Cobra flag type.
func AnnotateRuntimeFlagFormat(cmd *cobra.Command, flagName, format string) {
if cmd == nil {
return
}
if flag := runtimeCommandFlag(cmd, flagName); flag != nil {
setFlagAnnotation(flag, "x-cli-format", strings.TrimSpace(format))
}
}
// AnnotateRuntimeFlagEnum records the accepted values for a flag.
func AnnotateRuntimeFlagEnum(cmd *cobra.Command, flagName string, values ...string) {
if cmd == nil {
return
}
flag := runtimeCommandFlag(cmd, flagName)
if flag == nil {
return
}
clean := make([]string, 0, len(values))
for _, value := range values {
if value = strings.TrimSpace(value); value != "" {
clean = append(clean, value)
}
}
if len(clean) == 0 {
return
}
if flag.Annotations == nil {
flag.Annotations = map[string][]string{}
}
flag.Annotations["x-cli-enum"] = clean
}
// AnnotateRuntimeFlagExample records a valid representative CLI value.
func AnnotateRuntimeFlagExample(cmd *cobra.Command, flagName, example string) {
if cmd == nil {
return
}
if flag := runtimeCommandFlag(cmd, flagName); flag != nil {
setFlagAnnotation(flag, runtimeSchemaFlagExampleAnnotation, strings.TrimSpace(example))
}
}
// AnnotateRuntimeConstraints records command-level parameter relationships.
func AnnotateRuntimeConstraints(cmd *cobra.Command, constraints RuntimeSchemaConstraints) {
if cmd == nil {
return
}
constraints = normalizeRuntimeSchemaConstraints(constraints)
if runtimeSchemaConstraintsEmpty(constraints) {
return
}
if existing := runtimeCommandConstraints(cmd); !runtimeSchemaConstraintsEmpty(existing) {
constraints.MutuallyExclusive = append(existing.MutuallyExclusive, constraints.MutuallyExclusive...)
constraints.RequireOneOf = append(existing.RequireOneOf, constraints.RequireOneOf...)
constraints.RequireTogether = append(existing.RequireTogether, constraints.RequireTogether...)
constraints = normalizeRuntimeSchemaConstraints(constraints)
}
encoded, _ := json.Marshal(constraints)
setRuntimeCommandAnnotation(cmd, runtimeSchemaRulesAnnotation, string(encoded))
}
// AnnotateRuntimePositionals records ordered positional arguments for agents.
func AnnotateRuntimePositionals(cmd *cobra.Command, positionals ...RuntimeSchemaPositional) {
if cmd == nil {
return
}
clean := make([]RuntimeSchemaPositional, 0, len(positionals))
for _, positional := range positionals {
positional.Name = strings.TrimSpace(positional.Name)
positional.Type = strings.TrimSpace(positional.Type)
positional.Description = strings.TrimSpace(positional.Description)
if positional.Name == "" || positional.Index < 0 {
continue
}
if positional.Type == "" {
positional.Type = "string"
}
clean = append(clean, positional)
}
if len(clean) == 0 {
return
}
sort.SliceStable(clean, func(i, j int) bool { return clean[i].Index < clean[j].Index })
encoded, _ := json.Marshal(clean)
setRuntimeCommandAnnotation(cmd, runtimeSchemaArgsAnnotation, string(encoded))
}
// ExcludeFromRuntimeSchema keeps a human-facing hint or redirect in --help
// while preventing it from being advertised as an executable agent tool.
func ExcludeFromRuntimeSchema(cmd *cobra.Command) {
setRuntimeCommandAnnotation(cmd, runtimeSchemaExcludeAnnotation, "true")
}
func setRuntimeCommandAnnotation(cmd *cobra.Command, key, value string) {
if cmd == nil || strings.TrimSpace(value) == "" {
return
}
if cmd.Annotations == nil {
cmd.Annotations = map[string]string{}
}
cmd.Annotations[key] = value
}
func setFlagAnnotation(flag *pflag.Flag, key, value string) {
if flag == nil || strings.TrimSpace(value) == "" {
return
}
if flag.Annotations == nil {
flag.Annotations = map[string][]string{}
}
flag.Annotations[key] = []string{value}
}
func runtimeSchemaPayload(root *cobra.Command, args []string) (map[string]any, error) {
entries := collectRuntimeSchemaEntries(root)
if len(args) == 0 {
return runtimeSchemaListPayload(entries), nil
}
entry, ok := resolveRuntimeSchemaEntry(entries, args[0])
if ok {
return runtimeToolPayload(entry), nil
}
if payload, ok := runtimeSchemaBrowsePayload(entries, args[0]); ok {
return payload, nil
}
return nil, apperrors.NewValidation("unknown runtime schema path " + strconvQuote(args[0]))
}
type runtimeSchemaEntry struct {
ProductID string
SourceProductID string
ProductName string
ToolName string
CLIName string
Group string
CLIPath string
Title string
Description string
Source string
MetadataSource string
Command *cobra.Command
PrimaryCLIPath string
Aliases []string
IsAlias bool
}
func collectRuntimeSchemaEntries(root *cobra.Command) []runtimeSchemaEntry {
if root == nil {
return nil
}
entries := []runtimeSchemaEntry{}
seen := map[string]bool{}
seenCLIPaths := map[string]bool{}
walkLeafCommands(root, func(leaf *cobra.Command) {
if runtimeSchemaExcluded(leaf) {
return
}
productID, toolName, source := runtimeSchemaAnnotations(leaf)
if productID == "" || toolName == "" {
return
}
canonicalPath := productID + "." + toolName
applyRuntimeSchemaParameterBindings(leaf, canonicalPath)
applyRuntimeSchemaParameterMetadata(leaf, canonicalPath)
AnnotateRuntimeConstraints(leaf, runtimeSchemaConstraintsByCanonical[canonicalPath])
parts := commandPathParts(leaf)
if len(parts) == 0 {
return
}
group := ""
if len(parts) > 2 {
group = strings.Join(parts[1:len(parts)-1], ".")
}
displayProductID := productID
productName := ""
if top := topLevelCommand(leaf); top != nil {
displayProductID = strings.TrimSpace(top.Name())
productName = strings.TrimSpace(top.Short)
}
if defaultSchemaHintRegistry.ProductVisibility(displayProductID) != SchemaVisibilityPublic {
return
}
entry := runtimeSchemaEntry{
ProductID: displayProductID,
SourceProductID: productID,
ProductName: productName,
ToolName: toolName,
CLIName: leaf.Name(),
Group: group,
CLIPath: strings.Join(parts, " "),
Title: runtimeCommandTitle(leaf),
Description: runtimeCommandDescription(leaf),
Source: source,
MetadataSource: runtimeCommandMetadataSource(leaf),
Command: leaf,
}
entries = append(entries, entry)
seen[entryKey(entry)] = true
seenCLIPaths[entry.ProductID+"\x00"+entry.CLIPath] = true
})
for productID, hint := range defaultSchemaHintRegistry.RuntimeRoots() {
if defaultSchemaHintRegistry.ProductVisibility(productID) != SchemaVisibilityPublic {
continue
}
productRoot, _, err := root.Find([]string{productID})
if err != nil || productRoot == nil || !productRoot.HasParent() {
continue
}
productName := strings.TrimSpace(productRoot.Short)
walkLeafCommands(productRoot, func(leaf *cobra.Command) {
if runtimeSchemaExcluded(leaf) {
return
}
parts := commandPathParts(leaf)
if len(parts) == 0 {
return
}
cliPath := strings.Join(parts, " ")
if len(hint.IncludeCLIPaths) > 0 && !hint.IncludeCLIPaths[cliPath] {
return
}
if seenCLIPaths[productID+"\x00"+cliPath] {
return
}
toolName := strings.TrimSpace(hint.ToolNames[cliPath])
if toolName == "" {
toolName = derivedRuntimeToolName(parts)
}
canonicalPath := productID + "." + toolName
applyRuntimeSchemaParameterBindings(leaf, canonicalPath)
applyRuntimeSchemaParameterMetadata(leaf, canonicalPath)
AnnotateRuntimeConstraints(leaf, runtimeSchemaConstraintsByCanonical[canonicalPath])
group := ""
if len(parts) > 2 {
group = strings.Join(parts[1:len(parts)-1], ".")
}
source := strings.TrimSpace(hint.Source)
if source == "" {
source = "hardcoded:" + productID
}
entry := runtimeSchemaEntry{
ProductID: productID,
SourceProductID: productID,
ProductName: productName,
ToolName: toolName,
CLIName: leaf.Name(),
Group: group,
CLIPath: cliPath,
Title: runtimeCommandTitle(leaf),
Description: runtimeCommandDescription(leaf),
Source: source,
MetadataSource: runtimeCommandMetadataSource(leaf),
Command: leaf,
}
if seen[entryKey(entry)] {
return
}
entries = append(entries, entry)
seen[entryKey(entry)] = true
seenCLIPaths[entry.ProductID+"\x00"+entry.CLIPath] = true
})
}
sort.Slice(entries, func(i, j int) bool {
if entries[i].ProductID != entries[j].ProductID {
return entries[i].ProductID < entries[j].ProductID
}
if entries[i].ToolName != entries[j].ToolName {
return entries[i].ToolName < entries[j].ToolName
}
return entries[i].CLIPath < entries[j].CLIPath
})
annotateRuntimeSchemaAliases(entries)
return entries
}
func entryKey(entry runtimeSchemaEntry) string {
return entry.ProductID + "\x00" + entry.ToolName + "\x00" + entry.CLIPath
}
func canonicalEntryKey(entry runtimeSchemaEntry) string {
return entry.ProductID + "\x00" + entry.ToolName
}
func annotateRuntimeSchemaAliases(entries []runtimeSchemaEntry) {
groups := map[string][]int{}
for idx, entry := range entries {
groups[canonicalEntryKey(entry)] = append(groups[canonicalEntryKey(entry)], idx)
}
for _, indexes := range groups {
if len(indexes) == 0 {
continue
}
primary := choosePrimaryRuntimeEntry(entries, indexes)
aliases := make([]string, 0, len(indexes)-1)
for _, idx := range indexes {
if idx == primary {
continue
}
aliases = append(aliases, entries[idx].CLIPath)
}
sort.Strings(aliases)
primaryPath := entries[primary].CLIPath
for _, idx := range indexes {
entries[idx].PrimaryCLIPath = primaryPath
entries[idx].Aliases = append([]string(nil), aliases...)
entries[idx].IsAlias = idx != primary
}
}
}
func choosePrimaryRuntimeEntry(entries []runtimeSchemaEntry, indexes []int) int {
primaryHint := schemaPrimaryCLIPath(entries[indexes[0]].ProductID, entries[indexes[0]].ToolName)
if primaryHint != "" {
for _, idx := range indexes {
if entries[idx].CLIPath == primaryHint {
return idx
}
}
}
productID := entries[indexes[0]].ProductID
for _, idx := range indexes {
if strings.HasPrefix(entries[idx].CLIPath, productID+" ") {
return idx
}
}
return indexes[0]
}
func schemaPrimaryCLIPath(productID, toolName string) string {
canonicalPath := productID + "." + toolName
if hint := schemaHintForCanonicalPath(canonicalPath); strings.TrimSpace(hint.PrimaryCLIPath) != "" {
return strings.Join(splitSchemaPathTokens(hint.PrimaryCLIPath), " ")
}
rootHint, ok := defaultSchemaHintRegistry.RuntimeRoots()[productID]
if !ok {
return ""
}
if cliPath := strings.TrimSpace(rootHint.PrimaryCLIPaths[toolName]); cliPath != "" {
return strings.Join(splitSchemaPathTokens(cliPath), " ")
}
if cliPath := strings.TrimSpace(rootHint.PrimaryCLIPaths[canonicalPath]); cliPath != "" {
return strings.Join(splitSchemaPathTokens(cliPath), " ")
}
return ""
}
func runtimeSchemaHintForEntry(entry runtimeSchemaEntry) ToolSchemaHint {
if hint := schemaHintForCanonicalPath(entry.ProductID + "." + entry.ToolName); !isZeroToolSchemaHint(hint) {
return hint
}
if entry.SourceProductID != "" && entry.SourceProductID != entry.ProductID {
return schemaHintForCanonicalPath(entry.SourceProductID + "." + entry.ToolName)
}
return ToolSchemaHint{}
}
func embeddedMCPMetadataForEntry(entry runtimeSchemaEntry) (embeddedMCPToolMetadata, bool) {
paths := []string{
entry.PrimaryCLIPath,
entry.CLIPath,
entry.ProductID + "." + entry.ToolName,
}
paths = append(paths, entry.Aliases...)
if agentMetadata, ok := lookupAgentToolMetadata(paths...); ok && agentMetadata.InterfaceRef != nil {
productID := strings.TrimSpace(agentMetadata.InterfaceRef.ProductID)
rpcName := strings.TrimSpace(agentMetadata.InterfaceRef.RPCName)
key := strings.Trim(productID+"."+rpcName, ".")
if metadata, exists := runtimeEmbeddedMCPMetadata.Tools[key]; exists {
metadata.InterfaceRef = &embeddedMCPInterfaceRef{ProductID: productID, RPCName: rpcName}
return metadata, true
}
}
for _, key := range []string{
entry.SourceProductID + "." + entry.ToolName,
entry.ProductID + "." + entry.ToolName,
} {
key = strings.Trim(key, ".")
if key == "" {
continue
}
if meta, ok := runtimeEmbeddedMCPMetadata.Tools[key]; ok {
return meta, true
}
}
return embeddedMCPToolMetadata{}, false
}
func isZeroToolSchemaHint(hint ToolSchemaHint) bool {
return strings.TrimSpace(hint.Title) == "" &&
strings.TrimSpace(hint.Description) == "" &&
strings.TrimSpace(hint.PrimaryCLIPath) == "" &&
len(hint.Parameters) == 0
}
func derivedRuntimeToolName(parts []string) string {
if len(parts) <= 1 {
return "command"
}
return strings.ReplaceAll(strings.Join(parts[1:], "_"), "-", "_")
}
func runtimeSchemaAnnotations(cmd *cobra.Command) (productID, toolName, source string) {
if cmd == nil || cmd.Annotations == nil {
return "", "", ""
}
productID = strings.TrimSpace(cmd.Annotations[runtimeSchemaProductAnnotation])
toolName = strings.TrimSpace(cmd.Annotations[runtimeSchemaToolAnnotation])
source = strings.TrimSpace(cmd.Annotations[runtimeSchemaSourceAnnotation])
if source == "" && productID != "" {
source = "runtime:" + productID
}
return productID, toolName, source
}
func runtimeSchemaExcluded(cmd *cobra.Command) bool {
return cmd != nil && cmd.Annotations != nil &&
strings.EqualFold(strings.TrimSpace(cmd.Annotations[runtimeSchemaExcludeAnnotation]), "true")
}
func runtimeCommandTitle(cmd *cobra.Command) string {
if cmd == nil {
return ""
}
if cmd.Annotations != nil {
if title := strings.TrimSpace(cmd.Annotations[runtimeSchemaTitleAnnotation]); title != "" {
return title
}
}
return strings.TrimSpace(cmd.Short)
}
func runtimeCommandDescription(cmd *cobra.Command) string {
if cmd == nil {
return ""
}
if cmd.Annotations != nil {
if desc := strings.TrimSpace(cmd.Annotations[runtimeSchemaDescAnnotation]); desc != "" {
return desc
}
}
if desc := strings.TrimSpace(cmd.Long); desc != "" {
return desc
}
return strings.TrimSpace(cmd.Short)
}
func runtimeCommandMetadataSource(cmd *cobra.Command) string {
if cmd == nil || cmd.Annotations == nil {
return ""
}
return strings.TrimSpace(cmd.Annotations[runtimeSchemaMetaAnnotation])
}
func commandPathParts(cmd *cobra.Command) []string {
parts := []string{}
for c := cmd; c != nil && c.HasParent(); c = c.Parent() {
parts = append([]string{c.Name()}, parts...)
}
return parts
}
func topLevelCommand(cmd *cobra.Command) *cobra.Command {
var top *cobra.Command
for c := cmd; c != nil && c.HasParent(); c = c.Parent() {
top = c
}
return top
}
func runtimeSchemaListPayload(entries []runtimeSchemaEntry) map[string]any {
byProduct := map[string][]runtimeSchemaEntry{}
for _, entry := range entries {
if entry.IsAlias {
continue
}
byProduct[entry.ProductID] = append(byProduct[entry.ProductID], entry)
}
ids := make([]string, 0, len(byProduct))
for id := range byProduct {
ids = append(ids, id)
}
sort.Strings(ids)
products := make([]map[string]any, 0, len(ids))
totalTools := 0
for _, id := range ids {
productEntries := byProduct[id]
tools := make([]map[string]any, 0, len(productEntries))
for _, entry := range productEntries {
tools = append(tools, runtimeToolSummary(entry))
}
totalTools += len(tools)
products = append(products, map[string]any{
"id": id,
"name": productEntries[0].ProductName,
"description": productEntries[0].ProductName,
"tool_count": len(tools),
"tools": tools,
"runtime": true,
})
applyAgentProductMetadata(products[len(products)-1], id, productEntries[0].SourceProductID)
}
return map[string]any{
"kind": "schema",
"level": "catalog",
"count": len(products),
"tool_count": totalTools,
"products": products,
"source": "runtime-command",
"interface_metadata": interfaceMetadataSummary(),
"agent_metadata": agentMetadataSummary(),
}
}
// compactSchemaOverviewPayload projects the complete catalog into a small
// first-hop response. Agents can then query one product or group instead of
// loading every tool description into context up front.
func compactSchemaOverviewPayload(payload map[string]any) map[string]any {
products := schemaMapSlice(payload["products"])
compact := make([]map[string]any, 0, len(products))
totalTools := 0
for _, product := range products {
id, _ := product["id"].(string)
toolCount := schemaProductToolCount(product)
totalTools += toolCount
entry := map[string]any{
"id": id,
"tool_count": toolCount,
"schema_path": id,
}
if helper, _ := product["helper"].(bool); helper {
entry["helper"] = true
}
applyCompactAgentProductMetadata(entry, id)
if _, hasSummary := entry["agent_summary"]; !hasSummary {
if _, hasUseWhen := entry["use_when"]; !hasUseWhen {
entry["description"] = product["description"]
}
}
compact = append(compact, entry)
}
return map[string]any{
"kind": "schema",
"level": "products",
"count": len(compact),
"tool_count": totalTools,
"products": compact,
"source": payload["source"],
"interface_metadata": payload["interface_metadata"],
"agent_metadata": payload["agent_metadata"],
}
}
func schemaProductToolCount(product map[string]any) int {
switch value := product["tool_count"].(type) {
case int:
return value
case int64:
return int(value)
case float64:
return int(value)
}
if tools, ok := product["tools"].([]map[string]any); ok {
return len(tools)
}
if tools, ok := product["tools"].([]any); ok {
return len(tools)
}
return 0
}
func runtimeToolSummary(entry runtimeSchemaEntry) map[string]any {
title, description, metadataSource := runtimeToolTextMetadata(entry)
embeddedMeta, _ := embeddedMCPMetadataForEntry(entry)
tool := map[string]any{
"name": entry.ToolName,
"cli_name": entry.CLIName,
"canonical_path": entry.ProductID + "." + entry.ToolName,
"cli_path": entry.CLIPath,
"primary_cli_path": entry.PrimaryCLIPath,
"description": description,
}
if title != "" && title != description {
tool["title"] = title
}
if entry.SourceProductID != "" && entry.SourceProductID != entry.ProductID {
tool["source_product_id"] = entry.SourceProductID
}
if metadataSource != "" {
tool["metadata_source"] = metadataSource
}
if len(entry.Aliases) > 0 {
tool["aliases"] = entry.Aliases
}
applyRuntimeInterfaceRef(tool, entry, embeddedMeta, false)
applyAgentToolMetadata(tool, false,
entry.PrimaryCLIPath,
entry.CLIPath,
entry.ProductID+"."+entry.ToolName,
)
return tool
}
func runtimeToolTextMetadata(entry runtimeSchemaEntry) (title, description, metadataSource string) {
title = entry.Title
description = entry.Description
metadataSource = entry.MetadataSource
embeddedMeta, hasEmbeddedMeta := embeddedMCPMetadataForEntry(entry)
if metadataSource == "" && hasEmbeddedMeta {
if value := strings.TrimSpace(embeddedMeta.Title); value != "" {
title = value
}
if value := strings.TrimSpace(embeddedMeta.Description); value != "" {
description = value
}
metadataSource = "embedded-mcp-metadata"
}
hint := runtimeSchemaHintForEntry(entry)
if value := strings.TrimSpace(hint.Title); value != "" {
title = value
}
if value := strings.TrimSpace(hint.Description); value != "" {
description = value
}
return strings.TrimSpace(title), strings.TrimSpace(description), strings.TrimSpace(metadataSource)
}
func runtimeSchemaBrowsePayload(entries []runtimeSchemaEntry, raw string) (map[string]any, bool) {
tokens := splitSchemaPathTokens(raw)
if len(tokens) == 0 {
return nil, false
}
path := strings.Join(tokens, " ")
if len(tokens) == 1 {
productEntries := runtimeSchemaEntriesForProduct(entries, tokens[0])
if len(productEntries) == 0 {
return nil, false
}
product := runtimeSchemaProductObject(productEntries)
return map[string]any{
"kind": "schema",
"level": "product",
"count": len(productEntries),
"product": product,
"source": "runtime-command",
"interface_metadata": interfaceMetadataSummary(),
"agent_metadata": agentMetadataSummary(),
}, true
}
groupEntries := make([]runtimeSchemaEntry, 0)
prefix := path + " "
for _, entry := range entries {
if entry.IsAlias || !strings.HasPrefix(entry.CLIPath, prefix) {
continue
}
groupEntries = append(groupEntries, entry)
}
if len(groupEntries) == 0 {
return nil, false
}
tools := make([]map[string]any, 0, len(groupEntries))
for _, entry := range groupEntries {
tools = append(tools, runtimeToolSummary(entry))
}
return map[string]any{
"kind": "schema",
"level": "group",
"path": path,
"count": len(tools),
"tools": tools,
"source": "runtime-command",
"interface_metadata": interfaceMetadataSummary(),
"agent_metadata": agentMetadataSummary(),
}, true
}
func runtimeSchemaEntriesForProduct(entries []runtimeSchemaEntry, productID string) []runtimeSchemaEntry {
productID = strings.TrimSpace(productID)
out := make([]runtimeSchemaEntry, 0)
for _, entry := range entries {
if !entry.IsAlias && entry.ProductID == productID {
out = append(out, entry)
}
}
return out
}
func runtimeSchemaProductObject(entries []runtimeSchemaEntry) map[string]any {
if len(entries) == 0 {
return map[string]any{}
}
tools := make([]map[string]any, 0, len(entries))
for _, entry := range entries {
tools = append(tools, runtimeToolSummary(entry))
}
product := map[string]any{
"id": entries[0].ProductID,
"name": entries[0].ProductName,
"description": entries[0].ProductName,
"tool_count": len(tools),
"tools": tools,
"runtime": true,
}
applyAgentProductMetadata(product, entries[0].ProductID, entries[0].SourceProductID)
return product
}
func resolveRuntimeSchemaEntry(entries []runtimeSchemaEntry, raw string) (runtimeSchemaEntry, bool) {
raw = strings.TrimSpace(raw)
if raw == "" {
return runtimeSchemaEntry{}, false
}
tokens := splitSchemaPathTokens(raw)
normalized := strings.Join(tokens, " ")
for _, entry := range entries {
if raw == entry.CLIPath || normalized == entry.CLIPath {
return entry, true
}
}
for _, entry := range entries {
if raw == entry.ProductID+"."+entry.ToolName && !entry.IsAlias {
return entry, true
}
if entry.SourceProductID != "" && entry.SourceProductID != entry.ProductID &&
raw == entry.SourceProductID+"."+entry.ToolName && !entry.IsAlias {
return entry, true
}
}
return runtimeSchemaEntry{}, false
}
func runtimeToolPayload(entry runtimeSchemaEntry) map[string]any {
canonicalPath := entry.ProductID + "." + entry.ToolName
hint := runtimeSchemaHintForEntry(entry)
embeddedMeta, hasEmbeddedMeta := embeddedMCPMetadataForEntry(entry)
title, description, metadataSource := runtimeToolTextMetadata(entry)
constraints := runtimeCommandConstraints(entry.Command)
parameters := runtimeCommandParameters(entry.Command, canonicalPath, hint.Parameters, embeddedMeta.Parameters, constraints)
if parameters == nil {
parameters = map[string]any{}
}
payload := map[string]any{
"name": entry.ToolName,
"cli_name": entry.CLIName,
"canonical_path": canonicalPath,
"path": canonicalPath,
"cli_path": entry.CLIPath,
"primary_cli_path": entry.PrimaryCLIPath,
"is_alias": entry.IsAlias,
"source": entry.Source,
"product_id": entry.ProductID,
"display": entry.ProductName,
"title": title,
"description": description,
"parameters": parameters,
"has_parameters": len(parameters) > 0,
"parameter_count": len(parameters),
}
if entry.Group != "" {
payload["group"] = entry.Group
}
if entry.SourceProductID != "" && entry.SourceProductID != entry.ProductID {
payload["source_product_id"] = entry.SourceProductID
}
if metadataSource != "" {
payload["metadata_source"] = metadataSource
} else if hasEmbeddedMeta {
payload["metadata_source"] = "embedded-mcp-metadata"
}
if len(entry.Aliases) > 0 {
payload["aliases"] = entry.Aliases
}
applyRuntimeInterfaceRef(payload, entry, embeddedMeta, true)
if rendered := runtimeConstraintsPayload(constraints); len(rendered) > 0 {
payload["constraints"] = rendered
}
if positionals := runtimeCommandPositionals(entry.Command); len(positionals) > 0 {
payload["positionals"] = positionals
}
paths := []string{entry.PrimaryCLIPath, entry.CLIPath, canonicalPath}
paths = append(paths, entry.Aliases...)
applyAgentToolMetadata(payload, true, paths...)
return payload
}
func applyRuntimeInterfaceRef(target map[string]any, entry runtimeSchemaEntry, metadata embeddedMCPToolMetadata, always bool) {
if target == nil || metadata.InterfaceRef == nil {
return
}
productID := strings.TrimSpace(metadata.InterfaceRef.ProductID)
rpcName := strings.TrimSpace(metadata.InterfaceRef.RPCName)
if productID == "" || rpcName == "" {
return
}
if !always && productID == entry.ProductID && rpcName == entry.ToolName {
return
}
target["interface_ref"] = map[string]any{
"product_id": productID,
"rpc_name": rpcName,
}
}
func runtimeCommandParameters(cmd *cobra.Command, canonicalPath string, hints map[string]ParameterSchemaHint, embeddedParams map[string]embeddedMCPParamMeta, constraints RuntimeSchemaConstraints) map[string]any {
if cmd == nil {
return nil
}
params := map[string]any{}
inherited := runtimeSchemaParameterMetadataByCanonical[canonicalPath].Inherited
visitRuntimeCommandFlags(cmd, inherited, func(flag *pflag.Flag) {
if flag == nil || flag.Hidden || flag.Name == "help" || isGenericPayloadFlag(flag) {
return
}
property := firstFlagAnnotation(flag, runtimeSchemaFlagPropertyAnnotation)
if property == "" {
property = lowerCamelFlagName(flag.Name)
}
hint, _, hasHint := lookupParameterSchemaHint(hints, property, flag.Name)
embeddedParam, hasEmbeddedParam := lookupEmbeddedMCPParam(embeddedParams, property, flag.Name)
flagName := flag.Name
if hasHint && strings.TrimSpace(hint.FlagName) != "" {
flagName = strings.TrimSpace(hint.FlagName)
}
paramType := runtimeFlagCLIType(flag)
interfaceType := firstFlagAnnotation(flag, runtimeSchemaFlagTypeAnnotation)
if hasEmbeddedParam && strings.TrimSpace(embeddedParam.Type) != "" {
interfaceType = strings.TrimSpace(embeddedParam.Type)
}
if hasHint && strings.TrimSpace(hint.Type) != "" {
interfaceType = strings.TrimSpace(hint.Type)
}
description := firstFlagAnnotation(flag, runtimeSchemaFlagDescriptionAnnotation)
if description == "" {
description = strings.TrimSpace(flag.Usage)
}
interfaceDescription := ""
if hasEmbeddedParam {
interfaceDescription = strings.TrimSpace(embeddedParam.Description)
}
if hasHint && strings.TrimSpace(hint.Description) != "" {
description = strings.TrimSpace(hint.Description)
}
// Required is a CLI execution contract. MCP required fields describe the
// upstream RPC payload and may be synthesized by a helper, conditional,
// or optional at the CLI layer, so they must not promote a Cobra flag.
required, _ := runtimeFlagRequiredState(flag)
if hasHint && hint.Required != nil {
required = *hint.Required
}
entry := map[string]any{
"type": paramType,
"description": description,
"required": required,
}
if property != "" {
entry["property"] = property
}
if interfaceDescription != "" && interfaceDescription != description {
entry["interface_description"] = interfaceDescription
}
if interfaceType != "" && interfaceType != paramType {
entry["interface_type"] = interfaceType
}
requiredWhen := firstFlagAnnotation(flag, runtimeSchemaFlagRequiredWhenAnnotation)
if requiredWhen == "" && hasEmbeddedParam {
requiredWhen = strings.TrimSpace(embeddedParam.RequiredWhen)
}
if hasHint && strings.TrimSpace(hint.RequiredWhen) != "" {
requiredWhen = strings.TrimSpace(hint.RequiredWhen)
}
if requiredWhen != "" {
entry["required_when"] = requiredWhen
}
if def := runtimeFlagDefault(flag); def != "" {
entry["default"] = def
}
if hasEmbeddedParam {
interfaceDefault := strings.TrimSpace(embeddedParam.Default)
if interfaceDefault != "" && interfaceDefault != schemaString(entry["default"]) {
entry["interface_default"] = interfaceDefault
}
}
if format := firstFlagAnnotation(flag, "x-cli-format"); format != "" {
entry["format"] = format
} else if format := inferredRuntimeFlagFormat(flag); format != "" {
entry["format"] = format
} else if hasEmbeddedParam && strings.TrimSpace(embeddedParam.Format) != "" {
entry["format"] = strings.TrimSpace(embeddedParam.Format)
}
if enum := runtimeFlagEnum(flag); len(enum) > 0 {
entry["enum"] = enum
} else if hasEmbeddedParam && len(embeddedParam.Enum) > 0 {
entry["enum"] = append([]string(nil), embeddedParam.Enum...)
}
if example := firstFlagAnnotation(flag, runtimeSchemaFlagExampleAnnotation); example != "" {
entry["example"] = example
}
params[flagName] = entry
})
// A member of a require-one-of group is conditionally required, not
// individually required. This also corrects usage text such as "群聊必填"
// that would otherwise make every alternative look globally mandatory.
for _, group := range constraints.RequireOneOf {
for _, name := range group {
if entry, ok := params[name].(map[string]any); ok {
entry["required"] = false
}
}
}
if len(params) == 0 {
return nil
}
return params
}
// runtimeCommandFlag resolves local flags plus product/group persistent flags.
// Root persistent flags are intentionally available only when explicitly
// requested; they are global execution controls, not tool parameters.
func runtimeCommandFlag(cmd *cobra.Command, name string) *pflag.Flag {
if cmd == nil {
return nil
}
name = strings.TrimSpace(name)
if name == "" {
return nil
}
if flag := cmd.Flags().Lookup(name); flag != nil {
return flag
}
for current := cmd; current != nil; current = current.Parent() {
if flag := current.PersistentFlags().Lookup(name); flag != nil {
return flag
}
}
return nil
}
func visitRuntimeCommandFlags(cmd *cobra.Command, inheritedNames []string, visit func(*pflag.Flag)) {
if cmd == nil || visit == nil {
return
}
root := cmd.Root()
rootPersistent := map[*pflag.Flag]bool{}
ancestorPersistent := map[*pflag.Flag]bool{}
if root != nil {
root.PersistentFlags().VisitAll(func(flag *pflag.Flag) {
rootPersistent[flag] = true
})
}
for parent := cmd.Parent(); parent != nil && parent != root; parent = parent.Parent() {
parent.PersistentFlags().VisitAll(func(flag *pflag.Flag) {
ancestorPersistent[flag] = true
})
}
allowedInherited := map[string]bool{}
for _, name := range inheritedNames {
if name = strings.TrimSpace(name); name != "" {
allowedInherited[name] = true
}
}
seen := map[string]bool{}
visitSet := func(flags *pflag.FlagSet) {
if flags == nil {
return
}
flags.VisitAll(func(flag *pflag.Flag) {
if flag == nil || rootPersistent[flag] || seen[flag.Name] ||
(ancestorPersistent[flag] && !allowedInherited[flag.Name]) {
return
}
seen[flag.Name] = true
visit(flag)
})
}
visitSet(cmd.Flags())
visitSet(cmd.PersistentFlags())
for parent := cmd.Parent(); parent != nil && parent != root; parent = parent.Parent() {
parent.PersistentFlags().VisitAll(func(flag *pflag.Flag) {
if flag != nil && allowedInherited[flag.Name] && !seen[flag.Name] {
seen[flag.Name] = true
visit(flag)
}
})
}
}
func runtimeCommandConstraints(cmd *cobra.Command) RuntimeSchemaConstraints {
if cmd == nil || cmd.Annotations == nil {
return RuntimeSchemaConstraints{}
}
raw := strings.TrimSpace(cmd.Annotations[runtimeSchemaRulesAnnotation])
if raw == "" {
return RuntimeSchemaConstraints{}
}
var constraints RuntimeSchemaConstraints
if json.Unmarshal([]byte(raw), &constraints) != nil {
return RuntimeSchemaConstraints{}
}
return normalizeRuntimeSchemaConstraints(constraints)
}
func runtimeCommandPositionals(cmd *cobra.Command) []RuntimeSchemaPositional {
if cmd == nil || cmd.Annotations == nil {
return nil
}
raw := strings.TrimSpace(cmd.Annotations[runtimeSchemaArgsAnnotation])
if raw == "" {
return nil
}
var positionals []RuntimeSchemaPositional
if json.Unmarshal([]byte(raw), &positionals) != nil {
return nil
}
sort.SliceStable(positionals, func(i, j int) bool { return positionals[i].Index < positionals[j].Index })
return positionals
}
func normalizeRuntimeSchemaConstraints(constraints RuntimeSchemaConstraints) RuntimeSchemaConstraints {
constraints.MutuallyExclusive = normalizeRuntimeSchemaGroups(constraints.MutuallyExclusive, 2)
constraints.RequireOneOf = normalizeRuntimeSchemaGroups(constraints.RequireOneOf, 1)
constraints.RequireTogether = normalizeRuntimeSchemaGroups(constraints.RequireTogether, 2)
return constraints
}
func normalizeRuntimeSchemaGroups(groups [][]string, minimum int) [][]string {
out := make([][]string, 0, len(groups))
seenGroups := map[string]bool{}
for _, group := range groups {
clean := make([]string, 0, len(group))
seenNames := map[string]bool{}
for _, name := range group {
name = strings.TrimSpace(name)
if name == "" || seenNames[name] {
continue
}
seenNames[name] = true
clean = append(clean, name)
}
if len(clean) < minimum {
continue
}
key := strings.Join(clean, "\x00")
if seenGroups[key] {
continue
}
seenGroups[key] = true
out = append(out, clean)
}
return out
}
func runtimeSchemaConstraintsEmpty(constraints RuntimeSchemaConstraints) bool {
return len(constraints.MutuallyExclusive) == 0 &&
len(constraints.RequireOneOf) == 0 &&
len(constraints.RequireTogether) == 0
}
func runtimeConstraintsPayload(constraints RuntimeSchemaConstraints) map[string]any {
payload := map[string]any{}
if len(constraints.MutuallyExclusive) > 0 {
payload["mutually_exclusive"] = constraints.MutuallyExclusive
}
if len(constraints.RequireOneOf) > 0 {
payload["require_one_of"] = constraints.RequireOneOf
}
if len(constraints.RequireTogether) > 0 {
payload["require_together"] = constraints.RequireTogether
}
return payload
}
func lookupEmbeddedMCPParam(params map[string]embeddedMCPParamMeta, property, flagName string) (embeddedMCPParamMeta, bool) {
if len(params) == 0 {
return embeddedMCPParamMeta{}, false
}
if meta, ok := params[property]; ok {
return meta, true
}
if meta, ok := params[flagName]; ok {
return meta, true
}
return embeddedMCPParamMeta{}, false
}
func isGenericPayloadFlag(flag *pflag.Flag) bool {
if flag == nil {
return false
}
switch flag.Name {
case "json":
return strings.TrimSpace(flag.Usage) == "Base JSON object payload for this tool invocation"
case "params":
return strings.TrimSpace(flag.Usage) == "Additional JSON object payload merged after --json"
default:
return false
}
}
func runtimeFlagType(flag *pflag.Flag) string {
return runtimeFlagCLIType(flag)
}
func runtimeFlagCLIType(flag *pflag.Flag) string {
switch flag.Value.Type() {
case "int", "int8", "int16", "int32", "int64":
return "integer"
case "float32", "float64":
return "number"
case "bool":
return "boolean"
case "stringSlice", "stringArray":
return "array"
default:
return "string"
}
}
func runtimeFlagRequired(flag *pflag.Flag) bool {
required, _ := runtimeFlagRequiredState(flag)
return required
}
func runtimeFlagRequiredState(flag *pflag.Flag) (bool, bool) {
if raw := firstFlagAnnotation(flag, runtimeSchemaFlagRequiredAnnotation); raw != "" {
required, err := strconv.ParseBool(raw)
if err == nil {
return required, true
}
}
if values := flag.Annotations[cobra.BashCompOneRequiredFlag]; len(values) > 0 {
return true, true
}
usage := strings.ToLower(strings.TrimSpace(flag.Usage))
if usageImpliesRequired(usage) {
return true, true
}
return false, false
}
func usageImpliesRequired(usage string) bool {
usage = strings.ToLower(strings.TrimSpace(usage))
if usage == "" {
return false
}
for _, conditional := range []string{
"可选", "时必填", "下必填", "二选一", "至少传一个", "至少填一个", "至少提供一项",
"at least one", "required when", "required if", "conditionally required",
} {
if strings.Contains(usage, conditional) {
return false
}
}
return strings.Contains(usage, "required") || strings.Contains(usage, "必填")
}
func lowerCamelFlagName(flagName string) string {
flagName = strings.TrimSpace(flagName)
parts := strings.FieldsFunc(flagName, func(r rune) bool { return r == '-' || r == '_' })
if len(parts) == 0 {
return flagName
}
if len(parts) == 1 {
return parts[0]
}
for i := range parts {
parts[i] = strings.TrimSpace(parts[i])
}
out := strings.ToLower(parts[0])
for _, part := range parts[1:] {
if part == "" {
continue
}
lower := strings.ToLower(part)
out += strings.ToUpper(lower[:1]) + lower[1:]
}
return out
}
func runtimeFlagDefault(flag *pflag.Flag) string {
def := strings.TrimSpace(flag.DefValue)
switch flag.Value.Type() {
case "bool":
if def == "false" {
return ""
}
case "int", "int8", "int16", "int32", "int64", "float32", "float64":
if def == "0" {
return ""
}
case "stringSlice", "stringArray":
if def == "[]" {
return ""
}
}
return def
}
func firstFlagAnnotation(flag *pflag.Flag, key string) string {
if flag == nil || flag.Annotations == nil {
return ""
}
values := flag.Annotations[key]
if len(values) == 0 {
return ""
}
return strings.TrimSpace(values[0])
}
func runtimeFlagEnum(flag *pflag.Flag) []string {
if flag == nil || flag.Annotations == nil {
return nil
}
values := flag.Annotations["x-cli-enum"]
if len(values) == 0 {
return nil
}
out := make([]string, 0, len(values))
for _, value := range values {
if value = strings.TrimSpace(value); value != "" {
out = append(out, value)
}
}
return out
}
func inferredRuntimeFlagFormat(flag *pflag.Flag) string {
if flag == nil {
return ""
}
usage := strings.ToLower(strings.TrimSpace(flag.Usage))
if strings.Contains(usage, "iso-8601") || strings.Contains(usage, "rfc3339") {
return "date-time"
}
if strings.Contains(usage, "a1") {
return "a1-range"
}
return ""
}
func strconvQuote(value string) string {
return "\"" + strings.ReplaceAll(value, "\"", "\\\"") + "\""
}
// ─── --compact mode ──────────────────────────────────────────────────────────
// schemaCompactStripKeys are top-level tool/product keys removed in --compact mode.
var schemaCompactStripKeys = map[string]bool{
// provenance / debug
"agent_metadata_source": true,
"agent_source_refs": true,
"agent_summary_source": true,
"effect_source": true,
"metadata_source": true,
"source": true,
"agent_metadata": true,
"interface_metadata": true,
"reviewed": true,
// redundant with canonical_path / cli_path
"name": true,
"path": true,
"cli_name": true,
"primary_cli_path": true,
"is_alias": true,
"has_parameters": true,
"parameter_count": true,
"product_id": true,
"display": true,
"title": true,
"group": true,
"source_product_id": true,
"aliases": true,
"catalog_hash": true,
"surface_hash": true,
"workflow_refs": true,
"prerequisites": true,
"tips": true,
"interface_ref": true,
}
// schemaCompactParamStripKeys are per-parameter keys removed in --compact mode.
var schemaCompactParamStripKeys = map[string]bool{
"interface_description": true,
"interface_type": true,
"property": true,
}
// stripSchemaPayloadCompact walks a schema payload map and removes provenance,
// debug and redundant keys so that only agent-essential fields remain.
// It operates recursively on nested maps, slices, and parameter objects.
func stripSchemaPayloadCompact(payload map[string]any) map[string]any {
if payload == nil {
return nil
}
result := make(map[string]any, len(payload))
for k, v := range payload {
if schemaCompactStripKeys[k] {
continue
}
result[k] = stripSchemaValueCompact(v)
}
return result
}
func stripSchemaValueCompact(v any) any {
switch val := v.(type) {
case map[string]any:
// Check if this looks like a parameter object (has "type" or "required" or "description")
_, isParam := val["required"]
if !isParam {
_, isParam = val["type"]
}
if isParam {
return stripSchemaParamCompact(val)
}
return stripSchemaPayloadCompact(val)
case []map[string]any:
result := make([]map[string]any, len(val))
for i, item := range val {
result[i] = stripSchemaPayloadCompact(item)
}
return result
case []any:
result := make([]any, len(val))
for i, item := range val {
result[i] = stripSchemaValueCompact(item)
}
return result
default:
return v
}
}
func stripSchemaParamCompact(param map[string]any) map[string]any {
result := make(map[string]any, len(param))
for k, v := range param {
if schemaCompactParamStripKeys[k] {
continue
}
result[k] = v
}
return result
}