@abco20/btxml-checker 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/THIRD_PARTY_NOTICES.md +33 -0
- package/dist/ast-BbfR3S_b.d.ts +62 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +33 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +1 -0
- package/dist/diagnostic-B5htzyJ9.d.ts +42 -0
- package/dist/editor-node.d.ts +21 -0
- package/dist/editor-node.js +30 -0
- package/dist/editor.d.ts +16 -0
- package/dist/editor.js +28 -0
- package/dist/effective-t_u6qJ-7.d.ts +12 -0
- package/dist/index-CZlTfNCD.d.ts +47 -0
- package/dist/index.d.ts +327 -0
- package/dist/index.js +11 -0
- package/dist/model.d.ts +127 -0
- package/dist/model.js +2 -0
- package/dist/public-types-B2noBQY9.d.ts +125 -0
- package/dist/public-types-DaawwXHQ.d.ts +250 -0
- package/dist/rules.d.ts +356 -0
- package/dist/rules.js +5 -0
- package/dist/semantic.d.ts +42 -0
- package/dist/semantic.js +2 -0
- package/dist/server.cjs +46155 -0
- package/dist/server.cjs.map +1 -0
- package/dist/syntax.d.ts +84 -0
- package/dist/syntax.js +8 -0
- package/dist/types-BaOc_AYN.d.ts +104 -0
- package/dist/types-BgqDzlJ8.d.ts +425 -0
- package/dist/types-CkOvIGPf.d.ts +105 -0
- package/dist/types-SY4-jKCn.d.ts +112 -0
- package/package.json +93 -0
- package/schemas/btxml.config.schema.json +441 -0
- package/schemas/btxml.nodes.schema.json +64 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{hideBin as Hp}from"yargs/helpers";import Jp from"yargs/yargs";import{z as Wt}from"zod";var u={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},El=Object.values(u).sort();var Nl=Wt.object({subTreePorts:Wt.enum(["loose","strict"]).optional()}).strict(),Pl=Wt.object({allowStringEntryCompatibility:Wt.boolean().optional()}).strict(),z={"script/valid-syntax":{code:u.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:u.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:u.AssignmentToUnknownVariable,codes:[u.AssignmentToUnknownVariable,u.InvalidCompoundAssignment,u.ScriptVariableTypeMismatch],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:u.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:u.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:u.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:u.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:u.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:u.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:u.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:u.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:u.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:u.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:u.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:u.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:u.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:u.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:u.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:u.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:u.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:u.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:u.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:u.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:u.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:u.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:u.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:u.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:u.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:u.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:u.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:u.UnknownPort,defaultSeverity:"warn",optionsSchema:Nl,options:[{name:"subTreePorts",type:'"loose" | "strict"',default:"loose",description:"Controls whether SubTree remap attributes are checked strictly."}],description:"Reports ports that are not declared by the resolved node model."},"model/valid-port-value":{code:u.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:u.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:Pl,options:[{name:"allowStringEntryCompatibility",type:"boolean",default:"true",description:"Treat std::string blackboard entries as runtime-compatible with other port types, matching BT.CPP's existing-entry special case."}],description:"Blackboard entries must not mix incompatible resolved port types."},"model/valid-port-default-value":{code:u.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:u.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:u.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:u.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:u.InvalidChildCount,defaultSeverity:"warn",description:"Child count must match the expected count for the node kind (Action/Condition: 0, Decorator: 1, Control: >=1, special builtins: fixed range)."},"model/no-conflicting-definition":{code:u.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:u.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:u.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var Kt=["off","info","warn","error"];var Tr={linter:{rules:{"xml/require-btcpp-format":"error","xml/no-unknown-top-level-element":"error","model/no-unknown-node":"error","model/no-unknown-port":["error",{subTreePorts:"strict"}],"script/no-unknown-variable":"error","model/no-childless-control-shape-mismatch":"error","model/no-leaf-block-shape":"error","model/valid-child-count":"error","suppression/no-unused":"error","suppression/require-reason":"warn"}}},wl={files:{include:["**/*.xml"],ignore:["build/**","install/**","log/**","node_modules/**",".git/**"],useGitignore:!0,followSymlinks:!1,maxSize:5*1024*1024},resolver:{entrypoints:[],includes:{elements:[{name:"include",attribute:"path",base:"file"}],variables:{},allowOutsideRoot:!1,maxDepth:32,maxFiles:1e3},behaviorTreeIds:"workspace-unique"},models:{builtins:["btcpp-v4"],files:[],augmentations:[],definitions:[],inline:{}},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function Un(){return structuredClone(wl)}function ht(e,t){return{files:t.files?{...e.files,...t.files}:e.files,resolver:t.resolver?{...e.resolver,...t.resolver,includes:{...e.resolver.includes,...t.resolver.includes||{},variables:{...e.resolver.includes.variables,...t.resolver.includes?.variables||{}}}}:e.resolver,models:t.models?{...e.models,...t.models}:e.models,linter:t.linter?{...e.linter,...t.linter,rules:t.linter.rules?{...e.linter.rules,...t.linter.rules}:e.linter.rules,suppressions:t.linter.suppressions?{...e.linter.suppressions,...t.linter.suppressions}:e.linter.suppressions}:e.linter,formatter:t.formatter?{...e.formatter,...t.formatter}:e.formatter,overrides:t.overrides?[...e.overrides,...t.overrides]:e.overrides}}var h={Error:"error",Warning:"warning",Info:"info"};function E(e,t,n,o,r="",i,s){return{code:e,severity:t,message:n,uri:r,...o?{range:o}:{},...i?{details:i}:{},...s?{data:s}:{}}}function tt(e,t,n){return{line:e,character:t,offset:n}}function k(e,t){return{start:e,end:t}}function bt(e,t){return[...t].sort((n,o)=>o.range.start.offset-n.range.start.offset).reduce((n,o)=>n.slice(0,o.range.start.offset)+o.newText+n.slice(o.range.end.offset),e)}var Ml={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Bl(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function me(e,t){return e.attributes.find(n=>n.name===t)}function _l(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Al(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function jl(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Dr(e,t,n){for(let o of e.attributes||[]){let r=[...String(o.value).matchAll(/\{([^}]+)\}/g)];for(let i of r){let s=i.index??0,a=o.valueRange.start,l={...a,character:a.character+i[0].length,offset:a.offset+s+i[0].length};t.push({name:i[1],attributeName:o.name,element:e,uri:n,range:{start:{...a,character:a.character+s,offset:a.offset+s},end:l}})}}for(let o of e.children||[])o.kind==="element"&&Dr(o,t,n)}function Fl(e,t,n,o){let r=[];for(let i of e.children||[]){if(i.kind!=="element"||!_l(i.name))continue;let s=me(i,"ID");if(!s)continue;let a=[];for(let l of i.children||[]){if(l.kind!=="element"||l.name!=="input_port"&&l.name!=="output_port"&&l.name!=="inout_port")continue;let d=me(l,"name"),c=me(l,"type"),m=me(l,"default")||me(l,"default_value"),p=me(l,"enum"),g=(l.children||[]).filter(x=>x.kind==="text").map(x=>x.text).join("").trim()||void 0,y=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",f=(y==="input"||y==="inout")&&m===void 0;a.push({source:n,direction:y,name:d?d.value:"",type:c?.value||void 0,defaultValue:m?.value||void 0,description:g,required:f,element:l,uri:t,range:l.range,nameRange:d?.range,enum:p?.value?p.value.split(";"):void 0})}r.push({id:s.value,kind:i.name,source:n,sourceMeta:{sourceKind:n,file:t,range:i.range},editable:o,ports:a,element:i,uri:t,range:i.range,elementRange:i.range,idRange:s.range})}return r}function Ll(e,t){let n=[];for(let o of e.children||[]){if(o.kind!=="element"||o.name!=="BehaviorTree")continue;let r=me(o,"ID");r&&n.push({id:r.value,kind:"BehaviorTree",uri:t,element:o,range:o.range,elementRange:o.range,idRange:r.range})}return n}function Ol(e,t){let n=[],o=(r,i)=>{let s=r.name==="BehaviorTree"?me(r,"ID")?.value??i:i;if(r.name==="SubTree"){let a=me(r,"ID");a&&n.push({id:a.value,uri:t,element:r,range:r.range,elementRange:r.range,idRange:a.range,parentBehaviorTreeId:s,attributes:r.attributes})}for(let a of r.children||[])a.kind==="element"&&o(a,s)};for(let r of e.children||[])r.kind==="element"&&o(r);return n}function $l(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function kr(e){return{source:e.source,direction:e.direction,name:e.name,type:e.type,defaultValue:e.defaultValue,description:e.description,required:e.required,uri:e.uri,range:e.range,nameRange:e.nameRange,enum:e.enum?[...e.enum]:void 0}}function Ul(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(kr),source:e.source,sourceMeta:e.sourceMeta?{sourceKind:e.sourceMeta.sourceKind,file:e.sourceMeta.file,range:e.sourceMeta.range}:void 0,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function ql(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Vl(e){return{name:e.name,attributeName:e.attributeName,uri:e.uri,range:e.range}}function Xl(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map($l),subtreeReferences:e.subtreeReferences.map(ql),blackboardReferences:e.blackboardReferences.map(Vl),treeNodesModel:e.treeNodesModel.map(Ul),genericSubTreePorts:e.genericSubTreePorts.map(kr),rootMainTreeToExecute:Al(e.rootMainTreeToExecute)}}function zl(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Gl(e){return E(Ml.DuplicateNodeModelId,h.Error,`duplicate node model ID \`${e.id}\``,e.idRange||e.range,e.uri,{primaryLabel:"this node model ID is already defined in the same model source",help:"merge the duplicate definitions or rename one of them"})}function Wl(e,t){let n=[],o=t?.uri||e.uri,r=e.root,i=e.isBtXml,s=Bl(e),a=jl(e),l=((t?.path??e.path)||o==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",d=r&&e.kind!=="model-document"?Ll(r,o):[],c=[],m=[],p=r?r.name==="TreeNodesModel"?[r]:r.children.filter(b=>b.kind==="element"&&b.name==="TreeNodesModel"):[];for(let b of p){let v=Fl(b,o,a,l),D=new Map;for(let P of v)zl({node:P,treeNodesModel:c,genericSubTreePorts:m})||(D.has(P.id)?n.push(Gl(P)):D.set(P.id,P))}let g=r?Ol(r,o):[],y=r?(()=>{let b=[];return Dr(r,b,o),b})():[],f=r?me(r,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Xl({uri:o,path:t?.path??e.path,isBtXml:i,kind:s,behaviorTrees:d,subtreeReferences:g,blackboardReferences:y,treeNodesModel:c,genericSubTreePorts:m,rootMainTreeToExecute:f?{uri:o,range:f.range,value:f.value}:void 0}),extractedBehaviorTrees:d,extractedTreeNodesModel:c,extractedSubTreeReferences:g,extractedBlackboardReferences:y},diagnostics:n}}function Cr(e,t){let{extracted:n,diagnostics:o}=Wl(e,t);return{model:n.publicModel,diagnostics:o}}function qn(e,t){return Cr(e,t)}var Ir=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Kl=new Set([...Ir,"_autoremap","_description","__shared_blackboard"]),Hl=new Map([[".","port names must not contain `.`"],["<","port names must not contain `<`"],[">","port names must not contain `>`"],["&","port names must not contain `&`"],['"','port names must not contain `"`'],["'","port names must not contain `'`"],["/","port names must not contain `/`"],["\\","port names must not contain `\\`"],[":","port names must not contain `:`"],["*","port names must not contain `*`"],["?","port names must not contain `?`"],["|","port names must not contain `|`"]]);function Vn(e){return Ir.has(e)}function Er(e){return Kl.has(e)}function Xn(e){if(e.length===0)return"port names must not be empty";if(/^[0-9]/.test(e))return"port names must not start with a digit";if(Er(e))return`\`${e}\` is a reserved attribute name`;for(let t of e){let n=t.charCodeAt(0);if(n<=31||n===127)return"port names must not contain ASCII control characters";if(t===" "||t===" "||t===`
|
|
3
|
+
`||t==="\r")return"port names must not contain whitespace";let o=Hl.get(t);if(o)return o}}function Nr(e,t){let n=t.direction??"input";return{source:"config",name:e,direction:n,type:t.type,defaultValue:t.default,description:t.description,required:t.required??((n==="input"||n==="inout")&&t.default===void 0),enum:t.enum}}function St(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,o])=>Nr(n,o))}}var Jl=[{name:"std::string",kind:"primitive",aliases:["string"]},{name:"bool",kind:"primitive",aliases:[]},{name:"int8_t",kind:"primitive",aliases:["std::int8_t"]},{name:"int16_t",kind:"primitive",aliases:["std::int16_t"]},{name:"int32",kind:"primitive",aliases:["int","int32_t","std::int32_t"]},{name:"int64_t",kind:"primitive",aliases:["long","int64","std::int64_t"]},{name:"short",kind:"primitive",aliases:[]},{name:"uint8_t",kind:"primitive",aliases:["std::uint8_t"]},{name:"uint16_t",kind:"primitive",aliases:["std::uint16_t"]},{name:"uint32",kind:"primitive",aliases:["uint","unsigned","unsigned int","uint32_t","std::uint32_t"]},{name:"uint64_t",kind:"primitive",aliases:["uint64","std::uint64_t","size_t","std::size_t"]},{name:"float",kind:"primitive",aliases:[]},{name:"double",kind:"primitive",aliases:[]},{name:"BT::NodeStatus",kind:"primitive",aliases:["NodeStatus"]},{name:"BT::Any",kind:"any",aliases:["BT::AnyTypeAllowed","BT::AnyType","Any"]}],vt=new Map,Pr=new Map;for(let e of Jl){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Pr.set(e.name,t),vt.set(e.name,e.name);for(let n of e.aliases)vt.set(n,e.name)}function Yl(e,t,n){return{name:e,kind:n.kind,canonical:t,aliases:new Set([e,t,...n.aliases??[]]),compatibleWith:new Set(n.compatibleWith??[]),validate:n.validate,source:"augmentation"}}function zn(e){return vt.get(e)??e}function Zl(e){return{name:e.name,kind:e.kind,canonical:e.canonical,aliases:[...e.aliases].filter(t=>t!==e.canonical),compatibleWith:[...e.compatibleWith],validate:e.validate,source:e.source}}function xt(e){return vt.get(e)}function nt(e=[]){let t=new Map,n=new Map(vt);for(let o of Pr.values())t.set(o.canonical,{name:o.name,kind:o.kind,canonical:o.canonical,aliases:new Set([o.name,o.canonical,...o.aliases]),compatibleWith:new Set(o.compatibleWith),validate:o.validate,source:o.source});for(let o of e)for(let[r,i]of Object.entries(o.types??{})){let s=zn(i.canonical??r),l=t.get(s)??Yl(r,s,i);l.name=r,l.kind=i.kind,l.canonical=s,l.source="augmentation",l.validate=i.validate??l.validate,l.aliases.add(r),l.aliases.add(s);for(let d of i.aliases??[])l.aliases.add(d);for(let d of i.compatibleWith??[])l.compatibleWith.add(d);t.set(s,l),n.set(r,s),n.set(s,s);for(let d of i.aliases??[])n.set(d,s)}for(let o of t.values())o.compatibleWith=new Set([...o.compatibleWith].map(r=>n.get(r)??zn(r))),o.compatibleWith.delete(o.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([o,r])=>[o,Zl(r)])),namesToCanonical:n}}function le(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??zn(t),o=e.entriesByCanonical.get(n);return o||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Ht(e,t){return le(e,t)?.canonical}function Rt(e,t,n){let o=le(e,t),r=le(e,n);return!o||!r?!1:o.kind==="any"||r.kind==="any"||o.canonical===r.canonical?!0:o.compatibleWith.includes(r.canonical)||r.compatibleWith.includes(o.canonical)}function wr(e,t){if(e.length<3)return!1;let n=0,o=e.length-1;for(;n<=o&&e[n]===" ";)n+=1;for(;n<=o&&e[o]===" ";)o-=1;let i=o-n+1>=3&&e[n]==="{"&&e[o]==="}";return i&&t&&(t.current=e.slice(n+1,o)),i}function Mr(e){let t={};return wr(e,t)?t.current:void 0}function ke(e,t){return t==="{=}"||t==="="?e:Mr(t)}var Br=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<bool, std::allocator<bool> > >",required:!0}]},{id:"LoopDouble",kind:"Decorator",ports:[{name:"value",direction:"output",type:"double",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<double, std::allocator<double> > >",required:!0}]},{id:"LoopInt",kind:"Decorator",ports:[{name:"value",direction:"output",type:"int",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<int, std::allocator<int> > >",required:!0}]},{id:"LoopString",kind:"Decorator",ports:[{name:"value",direction:"output",type:"std::string",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >",required:!0}]},{id:"Parallel",kind:"Control",ports:[{name:"failure_count",direction:"input",type:"int",defaultValue:"1",description:"number of children that need to fail to trigger a FAILURE",required:!1},{name:"success_count",direction:"input",type:"int",defaultValue:"-1",description:"number of children that need to succeed to trigger a SUCCESS",required:!1}]},{id:"ParallelAll",kind:"Control",ports:[{name:"max_failures",direction:"input",type:"int",defaultValue:"1",description:"If the number of children returning FAILURE exceeds this value, ParallelAll returns FAILURE",required:!1}]},{id:"Precondition",kind:"Decorator",ports:[{name:"else",direction:"input",type:"BT::NodeStatus",defaultValue:"FAILURE",description:"Return status if condition is false",required:!1},{name:"if",direction:"input",type:"std::string",required:!0}]},{id:"ReactiveFallback",kind:"Control",ports:[]},{id:"ReactiveSequence",kind:"Control",ports:[]},{id:"Repeat",kind:"Decorator",ports:[{name:"num_cycles",direction:"input",type:"int",description:"Repeat a successful child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RetryUntilSuccessful",kind:"Decorator",ports:[{name:"num_attempts",direction:"input",type:"int",description:"Execute again a failing child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RunOnce",kind:"Decorator",ports:[{name:"then_skip",direction:"input",type:"bool",defaultValue:"true",description:"If true, skip after the first execution, otherwise return the same NodeStatus returned once bu the child.",required:!1}]},{id:"Script",kind:"Action",ports:[{name:"code",direction:"input",type:"std::string",description:"Piece of code that can be parsed",required:!0}]},{id:"ScriptCondition",kind:"Condition",ports:[{name:"code",direction:"input",type:"BT::AnyTypeAllowed",description:"Piece of code that can be parsed. Must return false or true",required:!0}]},{id:"Sequence",kind:"Control",ports:[]},{id:"SequenceWithMemory",kind:"Control",ports:[]},{id:"SetBlackboard",kind:"Action",ports:[{name:"output_key",direction:"inout",type:"BT::AnyTypeAllowed",description:"Name of the blackboard entry where the value should be written",required:!0},{name:"value",direction:"input",type:"BT::AnyTypeAllowed",description:"Value to be written int othe output_key",required:!0}]},{id:"SkipUnlessUpdated",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"Sleep",kind:"Action",ports:[{name:"msec",direction:"input",type:"unsigned int",required:!0}]},{id:"Switch2",kind:"Control",ports:[{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch3",kind:"Control",ports:[{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch4",kind:"Control",ports:[{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch5",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch6",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_6",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Timeout",kind:"Decorator",ports:[{name:"msec",direction:"input",type:"unsigned int",description:"After a certain amount of time, halt() the child if it is still running.",required:!0}]},{id:"UnsetBlackboard",kind:"Action",ports:[{name:"key",direction:"input",type:"std::string",description:"Key of the entry to remove",required:!0}]},{id:"WaitValueUpdate",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WasEntryUpdated",kind:"Action",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WhileDoElse",kind:"Control",ports:[]}],_r={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Ar=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<bool, std::allocator<bool> > >",required:!0}]},{id:"LoopDouble",kind:"Decorator",ports:[{name:"value",direction:"output",type:"double",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<double, std::allocator<double> > >",required:!0}]},{id:"LoopInt",kind:"Decorator",ports:[{name:"value",direction:"output",type:"int",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<int, std::allocator<int> > >",required:!0}]},{id:"LoopString",kind:"Decorator",ports:[{name:"value",direction:"output",type:"std::string",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"std::shared_ptr<std::deque<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >",required:!0}]},{id:"Parallel",kind:"Control",ports:[{name:"failure_count",direction:"input",type:"int",defaultValue:"1",description:"number of children that need to fail to trigger a FAILURE",required:!1},{name:"success_count",direction:"input",type:"int",defaultValue:"-1",description:"number of children that need to succeed to trigger a SUCCESS",required:!1}]},{id:"ParallelAll",kind:"Control",ports:[{name:"max_failures",direction:"input",type:"int",defaultValue:"1",description:"If the number of children returning FAILURE exceeds this value, ParallelAll returns FAILURE",required:!1}]},{id:"Precondition",kind:"Decorator",ports:[{name:"else",direction:"input",type:"BT::NodeStatus",defaultValue:"FAILURE",description:"Return status if condition is false",required:!1},{name:"if",direction:"input",type:"std::string",required:!0}]},{id:"ReactiveFallback",kind:"Control",ports:[]},{id:"ReactiveSequence",kind:"Control",ports:[]},{id:"Repeat",kind:"Decorator",ports:[{name:"num_cycles",direction:"input",type:"int",description:"Repeat a successful child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RetryUntilSuccessful",kind:"Decorator",ports:[{name:"num_attempts",direction:"input",type:"int",description:"Execute again a failing child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RunOnce",kind:"Decorator",ports:[{name:"then_skip",direction:"input",type:"bool",defaultValue:"true",description:"If true, skip after the first execution, otherwise return the same NodeStatus returned once by the child.",required:!1}]},{id:"Script",kind:"Action",ports:[{name:"code",direction:"input",type:"std::string",description:"Piece of code that can be parsed",required:!0}]},{id:"ScriptCondition",kind:"Condition",ports:[{name:"code",direction:"input",type:"BT::AnyTypeAllowed",description:"Piece of code that can be parsed. Must return false or true",required:!0}]},{id:"Sequence",kind:"Control",ports:[]},{id:"SequenceWithMemory",kind:"Control",ports:[]},{id:"SetBlackboard",kind:"Action",ports:[{name:"output_key",direction:"inout",type:"BT::AnyTypeAllowed",description:"Name of the blackboard entry where the value should be written",required:!0},{name:"value",direction:"input",type:"BT::AnyTypeAllowed",description:"Value to be written into the output_key",required:!0}]},{id:"SkipUnlessUpdated",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"Sleep",kind:"Action",ports:[{name:"msec",direction:"input",type:"unsigned int",required:!0}]},{id:"Switch2",kind:"Control",ports:[{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch3",kind:"Control",ports:[{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch4",kind:"Control",ports:[{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch5",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch6",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_6",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Timeout",kind:"Decorator",ports:[{name:"msec",direction:"input",type:"unsigned int",description:"After a certain amount of time, halt() the child if it is still running.",required:!0}]},{id:"UnsetBlackboard",kind:"Action",ports:[{name:"key",direction:"input",type:"std::string",description:"Key of the entry to remove",required:!0}]},{id:"WaitValueUpdate",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WasEntryUpdated",kind:"Action",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WhileDoElse",kind:"Control",ports:[]}],jr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Fr=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"LoopDouble",kind:"Decorator",ports:[{name:"value",direction:"output",type:"double",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"LoopInt",kind:"Decorator",ports:[{name:"value",direction:"output",type:"int",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"LoopString",kind:"Decorator",ports:[{name:"value",direction:"output",type:"std::string",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"BT::AnyTypeAllowed",required:!0}]},{id:"Parallel",kind:"Control",ports:[{name:"failure_count",direction:"input",type:"int",defaultValue:"1",description:"number of children that need to fail to trigger a FAILURE",required:!1},{name:"success_count",direction:"input",type:"int",defaultValue:"-1",description:"number of children that need to succeed to trigger a SUCCESS",required:!1}]},{id:"ParallelAll",kind:"Control",ports:[{name:"max_failures",direction:"input",type:"int",defaultValue:"1",description:"If the number of children returning FAILURE exceeds this value, ParallelAll returns FAILURE",required:!1}]},{id:"Precondition",kind:"Decorator",ports:[{name:"else",direction:"input",type:"BT::NodeStatus",defaultValue:"FAILURE",description:"Return status if condition is false",required:!1},{name:"if",direction:"input",type:"std::string",required:!0}]},{id:"ReactiveFallback",kind:"Control",ports:[]},{id:"ReactiveSequence",kind:"Control",ports:[]},{id:"Repeat",kind:"Decorator",ports:[{name:"num_cycles",direction:"input",type:"int",description:"Repeat a successful child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RetryUntilSuccessful",kind:"Decorator",ports:[{name:"num_attempts",direction:"input",type:"int",description:"Execute again a failing child up to N times. Use -1 to create an infinite loop.",required:!0}]},{id:"RunOnce",kind:"Decorator",ports:[{name:"then_skip",direction:"input",type:"bool",defaultValue:"true",description:"If true, skip after the first execution, otherwise return the same NodeStatus returned once by the child.",required:!1}]},{id:"Script",kind:"Action",ports:[{name:"code",direction:"input",type:"std::string",description:"Piece of code that can be parsed",required:!0}]},{id:"ScriptCondition",kind:"Condition",ports:[{name:"code",direction:"input",type:"BT::AnyTypeAllowed",description:"Piece of code that can be parsed. Must return false or true",required:!0}]},{id:"Sequence",kind:"Control",ports:[]},{id:"SequenceWithMemory",kind:"Control",ports:[]},{id:"SetBlackboard",kind:"Action",ports:[{name:"output_key",direction:"inout",type:"BT::AnyTypeAllowed",description:"Name of the blackboard entry where the value should be written",required:!0},{name:"value",direction:"input",type:"BT::AnyTypeAllowed",description:"Value to be written into the output_key",required:!0}]},{id:"SkipUnlessUpdated",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"Sleep",kind:"Action",ports:[{name:"msec",direction:"input",type:"unsigned int",required:!0}]},{id:"Switch2",kind:"Control",ports:[{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch3",kind:"Control",ports:[{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch4",kind:"Control",ports:[{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch5",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Switch6",kind:"Control",ports:[{name:"case_5",direction:"input",type:"std::string",required:!0},{name:"case_4",direction:"input",type:"std::string",required:!0},{name:"case_6",direction:"input",type:"std::string",required:!0},{name:"case_3",direction:"input",type:"std::string",required:!0},{name:"case_2",direction:"input",type:"std::string",required:!0},{name:"case_1",direction:"input",type:"std::string",required:!0},{name:"variable",direction:"input",type:"std::string",required:!0}]},{id:"Timeout",kind:"Decorator",ports:[{name:"msec",direction:"input",type:"unsigned int",description:"After a certain amount of time, halt() the child if it is still running.",required:!0}]},{id:"TryCatch",kind:"Control",ports:[{name:"catch_on_halt",direction:"input",type:"bool",defaultValue:"false",description:"If true, execute the catch child when the node is halted during the try-block",required:!1}]},{id:"UnsetBlackboard",kind:"Action",ports:[{name:"key",direction:"input",type:"std::string",description:"Key of the entry to remove",required:!0}]},{id:"WaitValueUpdate",kind:"Decorator",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WasEntryUpdated",kind:"Action",ports:[{name:"entry",direction:"input",type:"BT::Any",description:"Entry to check",required:!0}]},{id:"WhileDoElse",kind:"Control",ports:[]}],Lr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Or=["4.6.2","4.8.2","4.9.0"],Gn="4.9.0",Tt={"4.6.2":{models:Br,genericSubTreeModel:_r},"4.8.2":{models:Ar,genericSubTreeModel:jr},"4.9.0":{models:Fr,genericSubTreeModel:Lr}};var $r=Or.map(e=>`btcpp-v${e}`),Dt=["btcpp-v4",...$r],Ur=`btcpp-v${Gn}`;function qr(e){return{source:"builtin",direction:e.direction,name:e.name,type:e.type,defaultValue:e.defaultValue,description:e.description,required:e.required,enum:e.enum}}function Ql(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(qr)}))}function Vr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(qr)}}function ed(){let e={};for(let[t,n]of Object.entries(Tt))e[`btcpp-v${t}`]=Ql(n.models);return e}function td(){let e={};for(let[t,n]of Object.entries(Tt))e[`btcpp-v${t}`]=Vr(n.genericSubTreeModel);return e}var nd=ed(),od=td();function rd(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Tt,t)}function Xr(e){return e==="btcpp-v4"?Ur:e}function id(e){return e==="btcpp-v4"?Gn:e.replace(/^btcpp-v/,"")}function zr(e){if(e&&e!=="btcpp-v4"&&!rd(e))throw new Error(`unsupported builtin model set: ${e}`)}function Wn(e="btcpp-v4"){zr(e);let t=Xr(e);return nd[t].map(o=>Gr(o))}function Kn(e="btcpp-v4"){zr(e);let t=od[Xr(e)]??Vr(Tt[id(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Gr(e){return{id:e.id,kind:e.kind,source:"builtin",sourceMeta:{sourceKind:"builtin"},editable:!1,ports:(e.ports??[]).map(t=>({...t,enum:t.enum?[...t.enum]:void 0}))}}function kt(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let o=t.name.localeCompare(n.name);if(o!==0)return o;let r=t.direction.localeCompare(n.direction);if(r!==0)return r;let i=(t.type??"").localeCompare(n.type??"");if(i!==0)return i;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function ot(e,t){let n=kt(e),o=kt(t);return JSON.stringify(n)===JSON.stringify(o)}function Hn(e,t){if(ot(e,t))return"none";let n=kt(e),o=kt(t);if(n.kind!==o.kind)return"kind";if(n.ports.length!==o.ports.length)return"ports";let r=new Map(o.ports.map(a=>[a.name,a])),i=!1,s=!1;for(let a of n.ports){let l=r.get(a.name);if(!l){s=!0;continue}(a.direction!==l.direction||a.type!==l.type||a.required!==l.required)&&(s=!0);let d=a.enum?JSON.stringify(a.enum):"",c=l.enum?JSON.stringify(l.enum):"";d!==c&&(s=!0),a.description!==l.description&&(s=!0),a.defaultValue!==l.defaultValue&&(i=!0)}return s?"ports":i?"port-default":"mixed"}import{findNodeAtLocation as ud,parse as pd,parseTree as md}from"jsonc-parser";import{z as N}from"zod";var Wr=N.discriminatedUnion("kind",[N.object({kind:N.literal("pattern"),pattern:N.string()}).strict(),N.object({kind:N.literal("enum"),values:N.array(N.string())}).strict(),N.object({kind:N.literal("tuple"),separator:N.string(),items:N.array(N.string())}).strict(),N.object({kind:N.literal("json-schema"),schema:N.unknown()}).strict()]),sd=N.object({kind:N.enum(["primitive","opaque","any"]),canonical:N.string().optional(),aliases:N.array(N.string()).optional(),compatibleWith:N.array(N.string()).optional(),validate:Wr.optional()}).strict(),ad=N.object({from:N.string().optional(),to:N.string()}).strict(),ld=N.object({typeRefinement:ad.optional(),validate:Wr.optional(),required:N.boolean().optional(),enum:N.array(N.string()).optional(),description:N.string().optional()}).strict(),dd=N.object({ports:N.record(N.string(),ld).optional()}).strict(),cd=N.object({enums:N.record(N.string(),N.number().finite()).optional()}).strict(),Kr=N.object({version:N.literal(1),types:N.record(N.string(),sd).optional(),augment:N.record(N.string(),dd).optional(),script:cd.optional()}).strict();function fd(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
4
|
+
`&&t.push(n+1);return n=>{let o=0,r=t.length-1;for(;o<=r;){let s=Math.floor((o+r)/2);t[s]<=n?o=s+1:r=s-1}let i=Math.max(0,o-1);return{line:i,character:n-t[i],offset:n}}}function gd(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function Hr(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function yd(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...Hr(e.path),t]}return Hr(e.path)}function hd(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;return{message:`Unrecognized key: "${t??""}"`,path:[...e.path,t].filter(n=>n!==void 0).join(".")}}return{message:e.message,path:e.path.length>0?e.path.join("."):void 0}}function Jn(e,t){let n=t?.uri??"",o=[],r=md(e,o,{allowTrailingComma:!0,disallowComments:!1});try{let i=pd(e,o,{allowTrailingComma:!0,disallowComments:!1});if(o.length>0||!r)throw new Error(`JSON parse error at offset ${o[0]?.offset??0}`);let s=Kr.safeParse(i);if(!s.success){let a=fd(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let d=yd(l),{message:c,path:m}=hd(l);return{kind:"schema",message:c,path:m,range:gd(ud(r,d),a),notes:m?[m]:void 0}})}}return{ok:!0,data:{...s.data,uri:n,path:t?.path},issues:[],uri:n,path:t?.path}}catch(i){return{ok:!1,uri:n,path:t?.path,issues:[{kind:"json",message:"the file could not be parsed as JSON",notes:[String(i.message||i)]}]}}}import{z as q}from"zod";var Jr=q.object({direction:q.enum(["input","output","inout"]).optional(),type:q.string().optional(),required:q.boolean().optional(),default:q.string().optional(),description:q.string().optional(),enum:q.array(q.string()).optional()}).strict(),Jt=q.object({kind:q.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:q.record(q.string(),Jr).optional(),description:q.string().optional()}).strict(),Yn=q.object({nodes:q.record(q.string(),Jt)}).strict();import{z as R}from"zod";var Yr=R.enum(["off","info","warn","error"]),Zr=R.union([Yr,R.tuple([Yr,R.record(R.string(),R.unknown())])]),bd=R.object({include:R.array(R.string()).optional(),ignore:R.array(R.string()).optional(),useGitignore:R.boolean().optional(),followSymlinks:R.boolean().optional(),maxSize:R.number().int().positive().optional()}).strict(),Sd=R.string(),vd=R.object({name:R.string(),attribute:R.string(),base:R.enum(["file","project-root"]).optional()}).strict(),xd=R.object({elements:R.array(vd).optional(),variables:R.record(R.string(),R.string()).optional(),allowOutsideRoot:R.boolean().optional(),maxDepth:R.number().int().min(1).optional(),maxFiles:R.number().int().min(1).optional()}).strict(),Rd=R.object({entrypoints:R.array(Sd).optional(),includes:xd.optional(),behaviorTreeIds:R.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),Td=R.object({builtins:R.array(R.enum(Dt)).optional(),files:R.array(R.string()).optional(),augmentations:R.array(R.string()).optional(),definitions:R.array(R.string()).optional(),inline:R.record(R.string(),Jt).optional()}).strict(),Qr=R.object({inline:R.enum(["allow","deny"]).optional()}).strict(),Dd=R.object({enabled:R.boolean().optional(),rules:R.record(R.string(),Zr).optional(),baseline:R.string().optional(),suppressions:Qr.optional()}).strict(),kd=R.object({rules:R.record(R.string(),Zr).optional(),suppressions:Qr.optional()}).strict(),ei=R.object({indentWidth:R.number().int().min(1).max(8).optional(),xmlDeclaration:R.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:R.boolean().optional(),lineEnding:R.enum(["lf","crlf","auto"]).optional()}).strict(),Cd=R.object({files:R.array(R.string()),linter:kd.optional(),formatter:ei.optional()}).strict(),ti=R.object({$schema:R.string().optional(),strict:R.boolean().optional(),files:bd.optional(),resolver:Rd.optional(),models:Td.optional(),linter:Dd.optional(),formatter:ei.optional(),overrides:R.array(Cd).optional()}).strict();function ri(e){return e.flatMap(Id)}function Id(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(r=>{let i=ni([...e.path,String(r)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=ni(e.path);return ii(e)?[{code:"CFG003_INVALID_CONFIG_VALUE",severity:"error",path:n,message:n?`invalid config value at \`${n}\``:"invalid config value"}]:[{code:"CFG001_INVALID_CONFIG",severity:"error",path:n,message:n?`invalid config at \`${n}\``:"invalid config"}]}function ni(e){return e.map(String).join(".")||void 0}function ii(e){let t=String(e.code);if(t==="invalid_value"||t==="invalid_enum_value"||t==="invalid_literal")return!0;if(t!=="invalid_union")return!1;let n=e.errors;if(Array.isArray(n))return n.flat().some(oi);let o=e.unionErrors;return Array.isArray(o)?o.flatMap(r=>r.issues??[]).some(oi):!1}function oi(e){return typeof e=="object"&&e!==null&&ii(e)}function rt(e){let t=ti.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:ri(t.error.issues)}}function Ed(e){if(!e)return;let t={};return e.indentWidth!==void 0&&(t.indentWidth=e.indentWidth),e.xmlDeclaration!==void 0&&(t.xmlDeclaration=e.xmlDeclaration),e.blankLineBetweenBehaviorTrees!==void 0&&(t.blankLineBetweenBehaviorTrees=e.blankLineBetweenBehaviorTrees),e.lineEnding!==void 0&&(t.lineEnding=e.lineEnding),t}function Nd(e){if(!e)return;let t={};return e.rules!==void 0&&(t.rules=e.rules),e.suppressions!==void 0&&(t.suppressions={},e.suppressions.inline!==void 0&&(t.suppressions.inline=e.suppressions.inline)),t}function Pd(e){return e.map(t=>E(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function wd(e){let t=[],n=Un(),{$schema:o,strict:r,overrides:i,...s}=e;r&&(n=ht(n,Tr)),n=ht(n,s),n.overrides=(i??[]).map(l=>({files:l.files,linter:Nd(l.linter),formatter:Ed(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function Yt(e){let t=rt(e);return t.ok?wd(t.value):{ok:!1,config:Un(),diagnostics:Pd(t.diagnostics)}}function Zt(){return{$schema:"./node_modules/@abco20/btxml-checker/schemas/btxml.config.schema.json"}}function Md(e){let t="",n=0;for(;n<e.length;)e.slice(n,n+3)==="/**"&&(n+3===e.length||e[n+3]==="/")?n+3===e.length?(t+="(?:/.*)?",n+=3):(t+="(?:/.*)?/",n+=4):n===0&&e.slice(n,n+3)==="**/"?(t+="(?:.*/)?",n+=3):e.slice(n,n+2)==="**"?(t+=".*",n+=2):e[n]==="*"?(t+="[^/]*",n+=1):e[n]==="?"?(t+="[^/]",n+=1):(t+=e[n].replace(/[.+^${}()|[\]\\]/g,"\\$&"),n+=1);return new RegExp(`^${t}$`)}function Bd(e,t){let n=e.replace(/\\/g,"/"),o=t.startsWith("!"),r=o?t.slice(1):t,s=Md(r).test(n);return o?!s:s}function si(e,t){return e.overrides.filter(n=>n.files.some(o=>Bd(t,o)))}function _d(e){return e.replaceAll("\\","/")}function Q(e,t){let n=_d(t),o=si(e,n),r=e;for(let i of o)r=ht(r,{linter:i.linter,formatter:i.formatter});return{files:r.files,resolver:r.resolver,models:r.models,linter:r.linter,formatter:r.formatter}}function fe(e){let t=e.linter.rules["model/no-unknown-port"];return Array.isArray(t)&&t.length>=2&&t[1].subTreePorts==="strict"?{unknownSubTreePorts:"reject"}:{unknownSubTreePorts:"allow"}}function Zn(e){return e in z}function Qn(e){for(let[t,n]of Object.entries(z)){let o=n;if(o.code===e||o.codes?.includes(e))return t}}function Ce(e){if(typeof e=="string")return Kt.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&Kt.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let o={severity:t};return n!==void 0&&(o.options=n),o}}return null}function Ct(e,t){let n=e[t];if(n!==void 0){let o=Ce(n);if(o)return o.severity}return z[t].defaultSeverity}function eo(e,t){let n=[],r=z[e].optionsSchema;if(!r)return n;let i=r.safeParse(t);if(i.success)return n;for(let s of i.error.issues)n.push(...jd(e,s));return n}function jd(e,t){if(t.code==="unrecognized_keys")return t.keys.map(o=>E("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(o)}\` for rule \`${e}\``,void 0,void 0,{help:ai(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[E("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:ai(e)})]}function ai(e){let n=z[e].options?.map(o=>o.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function to(e){let t=[];li(e.linter,"linter.rules",t);for(let[n,o]of(e.overrides??[]).entries())li(o.linter,`overrides.${n}.linter.rules`,t);return t}function li(e,t,n){for(let[o,r]of Object.entries(e?.rules??{})){let i=`${t}.${o}`;if(!Zn(o)){n.push({code:"CFG010_UNKNOWN_RULE",severity:"error",path:i,message:`unknown lint rule \`${o}\``,help:"see docs/rules.md for a list of valid rule names"});continue}let s=Ce(r);if(s?.options)for(let a of eo(o,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:Fd(i,s.options,a.message),message:a.message,help:a.details?.help})}}function Fd(e,t,n){let o=Object.keys(t).find(r=>n.includes(`\`${r}\``));return o?`${e}.1.${o}`:`${e}.1`}var j=(e,t,n,o=!0)=>({code:e,title:t,description:n,suppressible:o}),Ld={[u.InvalidScriptSyntax]:{code:u.InvalidScriptSyntax,title:"Invalid script syntax",description:"Script-bearing attributes must parse as valid BT.CPP scripts.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf="A +"/>',validExample:'<AlwaysSuccess _successIf="A == 1"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.EmptyScript]:{code:u.EmptyScript,title:"Empty script",description:"Script-bearing attributes must not be empty.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf=""/>',validExample:'<AlwaysSuccess _successIf="true"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.InvalidScriptToken]:{code:u.InvalidScriptToken,title:"Invalid script token",description:"Script-bearing attributes must not contain invalid BT.CPP tokens.",suppressible:!0,invalidExample:'<Script code="0x"/>',validExample:'<Script code="value := 0x10"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.UnknownScriptVariable]:{code:u.UnknownScriptVariable,title:"Unknown script variable",description:"Script-bearing attributes should not read blackboard or local variables that were never introduced.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf="missing == 1"/>',validExample:'<Script code="count := 1; done = count"/>',configExample:'{"linter":{"rules":{"script/no-unknown-variable":"warn"}}}'},[u.AssignmentToUnknownVariable]:{code:u.AssignmentToUnknownVariable,title:"Assignment to unknown script variable",description:"Assignments with `=` or compound operators must target an existing script or blackboard variable.",suppressible:!0,invalidExample:'<Script code="count = 1"/>',validExample:'<Script code="count := 1; count = 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidCompoundAssignment]:{code:u.InvalidCompoundAssignment,title:"Invalid compound assignment",description:"Compound assignment operators must be used with supported operand types (`number` or `string` for `+=`, numbers only otherwise).",suppressible:!0,invalidExample:'<Script code="name := "x"; name -= 1"/>',validExample:'<Script code="count := 1; count += 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidScriptOperandType]:{code:u.InvalidScriptOperandType,title:"Invalid script operand type",description:"Script operators and ternary conditions must be applied to operands with compatible inferred types.",suppressible:!0,invalidExample:`<AlwaysSuccess _successIf="'x' * 2"/>`,validExample:'<AlwaysSuccess _successIf="count * 2 > 0"/>',configExample:'{"linter":{"rules":{"script/valid-expression-type":"error"}}}'},[u.ScriptResultNotBoolCompatible]:{code:u.ScriptResultNotBoolCompatible,title:"Script result is not bool-compatible",description:"Condition-style script attributes must end in an inferred bool-compatible result type.",suppressible:!0,invalidExample:`<AlwaysSuccess _successIf="'hello'"/>`,validExample:'<AlwaysSuccess _successIf="true"/>',configExample:'{"linter":{"rules":{"script/valid-result-type":"error"}}}'},[u.ScriptVariableTypeMismatch]:{code:u.ScriptVariableTypeMismatch,title:"Script variable type mismatch",description:"Script assignments must not write an incompatible inferred type into an existing variable.",suppressible:!0,invalidExample:'<Script code="count := 1; count = "x""/>',validExample:'<Script code="count := 1; count = 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidRootElement]:j(u.InvalidRootElement,"Invalid root element","Root element must be <root>.",!1),[u.MissingBTCPPFormat]:j(u.MissingBTCPPFormat,"Missing BTCPP format",'Root element must declare BTCPP_format="4".',!1),[u.MissingBehaviorTreeID]:j(u.MissingBehaviorTreeID,"Missing BehaviorTree ID","BehaviorTree elements require an ID attribute.",!1),[u.DuplicateBehaviorTreeID]:j(u.DuplicateBehaviorTreeID,"Duplicate BehaviorTree ID","BehaviorTree IDs must be unique within a file.",!1),[u.UnknownSubTree]:{code:u.UnknownSubTree,title:"Unknown SubTree reference",description:"A SubTree must resolve to a BehaviorTree or a configured model.",suppressible:!0,invalidExample:'<SubTree ID="missing_tree"/>',validExample:'<BehaviorTree ID="missing_tree"><Sequence/></BehaviorTree>',fix:"Define the BehaviorTree, add an external TreeNodesModel file, or add a nodes config entry.",configExample:'{"linter":{"rules":{"tree/no-unknown-subtree":"warn"}}}'},[u.DuplicateNodeModelId]:j(u.DuplicateNodeModelId,"Duplicate node model ID in TreeNodesModel","TreeNodesModel elements must have unique IDs within the same model block.",!1),[u.MissingPortName]:j(u.MissingPortName,"Missing port name","Port elements require a name attribute.",!1),[u.DuplicatePortName]:j(u.DuplicatePortName,"Duplicate port name","Ports with the same name are not allowed.",!1),[u.InvalidPortName]:{code:u.InvalidPortName,title:"Invalid port name",description:"Port names must be valid XML attribute names for BT nodes.",suppressible:!1,invalidExample:'<input_port name="request.name" type="string"/>',validExample:'<input_port name="request_name" type="string"/>',fix:"Rename the port so it does not use reserved names, leading digits, whitespace, control characters, or XML/path punctuation.",configExample:'{"linter":{"rules":{"model/valid-port-name":"warn"}}}'},[u.UnknownTopLevelElement]:j(u.UnknownTopLevelElement,"Unknown top-level element","Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements.",!1),[u.UnknownMainTree]:j(u.UnknownMainTree,"Unknown main tree","main_tree_to_execute must reference a known BehaviorTree.",!1),[u.AmbiguousSubTree]:j(u.AmbiguousSubTree,"Ambiguous SubTree","SubTree references must resolve to a single definition.",!1),[u.ConflictingNodeModel]:{code:u.ConflictingNodeModel,title:"Conflicting node model",description:"Node model definitions must agree on kind and port shape.",suppressible:!1,fix:"Run `btxmlc repair` to inspect conflicts. Run `btxmlc repair --write` to resolve the conflict interactively."},[u.DuplicateBehaviorTreeIdInWorkspace]:{code:u.DuplicateBehaviorTreeIdInWorkspace,title:"Duplicate BehaviorTree ID in workspace",description:"BehaviorTree IDs must be unique across the workspace.",suppressible:!1,invalidExample:`<!-- file1.xml --><BehaviorTree ID="shared"/>
|
|
5
|
+
<!-- file2.xml --><BehaviorTree ID="shared"/>`,validExample:`<!-- file1.xml --><BehaviorTree ID="shared"/>
|
|
6
|
+
<!-- file2.xml --><BehaviorTree ID="other"/>`,configExample:'{"linter":{"rules":{"tree/no-duplicate-id":"warn"}}}'},[u.MissingIncludePath]:{code:u.MissingIncludePath,title:"Missing include path",description:"include elements require a path attribute.",suppressible:!1,invalidExample:"<include/>",validExample:'<include path="common.xml"/>',configExample:'{"linter":{"rules":{"include/require-path":"warn"}}}'},[u.IncludeNotFound]:{code:u.IncludeNotFound,title:"Include not found",description:"Referenced include file does not exist.",suppressible:!1,invalidExample:'<include path="missing.xml"/>',validExample:'<include path="common.xml"/>',configExample:'{"linter":{"rules":{"include/no-missing-file":"warn"}}}'},[u.IncludeCycle]:j(u.IncludeCycle,"Include cycle","Include graph cycles are not allowed.",!1),[u.UnresolvedIncludePathVariable]:j(u.UnresolvedIncludePathVariable,"Unresolved include path variable","Include path variables must resolve before lookup.",!1),[u.IncludeOutsideWorkspace]:j(u.IncludeOutsideWorkspace,"Include outside workspace","Includes must stay within the workspace root.",!1),[u.ExternalIncludeUsed]:j(u.ExternalIncludeUsed,"External include used","An include file outside the workspace root was used.",!1),[u.IncludeDepthExceeded]:j(u.IncludeDepthExceeded,"Include depth exceeded","The maximum depth of nested includes was reached.",!1),[u.TooManyResolvedFiles]:j(u.TooManyResolvedFiles,"Too many resolved files","The maximum number of allowed files included was reached.",!1),[u.EntrypointNotFound]:j(u.EntrypointNotFound,"Entrypoint not found","Configured entrypoint files must exist.",!1),[u.RosPackageResolverMissing]:{code:u.RosPackageResolverMissing,title:"ROS package resolver is missing",description:"include elements with ros_pkg require ProjectHost.resolvePackageUri to be provided.",suppressible:!1,invalidExample:'<include ros_pkg="my_pkg" path="trees/common.xml"/>',validExample:"Provide a host implementation of resolvePackageUri that resolves my_pkg to a package root URI."},[u.RosPackageNotFound]:{code:u.RosPackageNotFound,title:"ROS package not found",description:"ros_pkg include must resolve to a known package root URI.",suppressible:!1,invalidExample:'<include ros_pkg="missing_pkg" path="trees/common.xml"/>',validExample:'<include ros_pkg="my_pkg" path="trees/common.xml"/>'},[u.UnknownNode]:j(u.UnknownNode,"Unknown node","Node usages must resolve to a known model.",!0),[u.MissingRequiredPort]:{code:u.MissingRequiredPort,title:"Missing required port",description:"Required ports must be supplied.",suppressible:!0,invalidExample:'<Action ID="SetFlag"/>',validExample:'<Action ID="SetFlag" enabled="true"/>',configExample:'{"linter":{"rules":{"model/require-port":"warn"}}}'},[u.UnknownPort]:{code:u.UnknownPort,title:"Unknown port",description:"Unknown ports are reported against the resolved node model.",suppressible:!0,invalidExample:'<Action ID="SetFlag" unknown="1"/>',validExample:'<Action ID="SetFlag" enabled="true"/>',configExample:'{"linter":{"rules":{"model/no-unknown-port":"error"}}}'},[u.InvalidPortValueType]:{code:u.InvalidPortValueType,title:"Invalid port value type",description:"Port values must match the declared type.",suppressible:!0,invalidExample:'<Action ID="SetFlag" enabled="yes"/>',validExample:'<Action ID="SetFlag" enabled="true"/>',configExample:'{"linter":{"rules":{"model/valid-port-value":"warn"}}}'},[u.BlackboardTypeMismatch]:{code:u.BlackboardTypeMismatch,title:"Blackboard type mismatch",description:"Blackboard entries must not mix incompatible resolved port types.",suppressible:!0,invalidExample:'<Sequence><ReadPose pose="{target}"/><UseString text="{target}"/></Sequence>',validExample:'<Sequence><ReadPose pose="{target}"/><UsePose pose="{target}"/></Sequence>',configExample:'{"linter":{"rules":{"model/no-blackboard-type-mismatch":["warn",{"allowStringEntryCompatibility":true}]}}}'},[u.CustomLiteralRequiresValidator]:{code:u.CustomLiteralRequiresValidator,title:"Custom literal requires validator",description:"Literal values for custom port types require a validator.",suppressible:!0,invalidExample:'<Action ID="MoveTo" target="1.0;2.0;3.14"/>',validExample:'<Action ID="MoveTo" target="{target}"/>',configExample:'{"linter":{"rules":{"model/valid-port-value":"warn"}}}'},[u.InvalidPortDefaultValue]:{code:u.InvalidPortDefaultValue,title:"Invalid port default value",description:"TreeNodesModel port defaults must match the declared type.",suppressible:!0,invalidExample:'<input_port name="count" type="int" default="abc"/>',validExample:'<input_port name="count" type="int" default="1"/>',configExample:'{"linter":{"rules":{"model/valid-port-default-value":"warn"}}}'},[u.OutputPortRequiresRemap]:{code:u.OutputPortRequiresRemap,title:"Output port requires remap",description:"Resolved output ports must write to a blackboard remap.",suppressible:!0,invalidExample:'<Action ID="Producer" result="value"/>',validExample:'<Action ID="Producer" result="{value}"/>',configExample:'{"linter":{"rules":{"model/require-output-port-remap":"error"}}}'},[u.AugmentTargetNotFound]:{code:u.AugmentTargetNotFound,title:"Augmentation target not found",description:"Model augmentations must target an existing node model.",suppressible:!1,invalidExample:'{"augment":{"MissingNode":{"ports":{}}}}',validExample:'{"augment":{"MoveTo":{"ports":{}}}}'},[u.AugmentPortNotFound]:{code:u.AugmentPortNotFound,title:"Augmentation port not found",description:"Model augmentations must target an existing port on the node model.",suppressible:!1,invalidExample:'{"augment":{"MoveTo":{"ports":{"missing":{}}}}}',validExample:'{"augment":{"MoveTo":{"ports":{"target":{}}}}}'},[u.InvalidTypeRefinement]:{code:u.InvalidTypeRefinement,title:"Invalid type refinement",description:"Model augmentation type refinements must match the port base type when `from` is provided.",suppressible:!1,invalidExample:'{"typeRefinement":{"from":"std::string","to":"Pose2D"}}',validExample:'{"typeRefinement":{"from":"int","to":"Pose2D"}}'},[u.ChildCapableNodeSelfClosing]:{code:u.ChildCapableNodeSelfClosing,title:"Child-capable node is self-closing",description:"Control and decorator nodes should normally use open/close tags.",suppressible:!0,invalidExample:"<Sequence/>",validExample:`<Sequence>
|
|
7
|
+
<AlwaysSuccess/>
|
|
8
|
+
</Sequence>`,configExample:'{"linter":{"rules":{"model/no-childless-control-shape-mismatch":"off"}}}'},[u.LeafNodeOpenClose]:{code:u.LeafNodeOpenClose,title:"Leaf node uses block shape",description:"Leaf nodes should normally be self-closing unless they contain child nodes.",suppressible:!0,invalidExample:"<AlwaysSuccess></AlwaysSuccess>",validExample:"<AlwaysSuccess/>",configExample:'{"linter":{"rules":{"model/no-leaf-block-shape":"off"}}}'},[u.InvalidChildCount]:{code:u.InvalidChildCount,title:"Invalid child count",description:"Node child count must satisfy the constraints for its kind: Action/Condition have no children, Decorator has exactly one, Control has one or more, SubTree has none, and special builtins like IfThenElse/WhileDoElse require 2 or 3.",suppressible:!0,invalidExample:"<Sequence/>",validExample:"<Sequence><AlwaysSuccess/></Sequence>",configExample:'{"linter":{"rules":{"model/valid-child-count":"warn"}}}'},[u.ExternalModelFileNotFound]:{code:u.ExternalModelFileNotFound,title:"External model file not found",description:"Configured external TreeNodesModel files must exist.",suppressible:!1,invalidExample:'{"models":{"files":["missing.xml"]}}',validExample:'{"models":{"files":["models.xml"]}}'},[u.AugmentationFileNotFound]:{code:u.AugmentationFileNotFound,title:"Augmentation file not found",description:"Configured augmentation files must exist.",suppressible:!1,invalidExample:'{"models":{"augmentations":["missing.xml"]}}',validExample:'{"models":{"augmentations":["augmentations.xml"]}}'},[u.MissingTreeNodesModel]:j(u.MissingTreeNodesModel,"Missing TreeNodesModel","External model files must contain a TreeNodesModel.",!1),[u.ExternalModelXmlParseError]:j(u.ExternalModelXmlParseError,"External model XML parse error","External model files must parse as XML.",!1),[u.NodeDefinitionFileNotFound]:{code:u.NodeDefinitionFileNotFound,title:"Node definition file not found",description:"Configured node definition files must exist.",suppressible:!1,invalidExample:'{"models":{"definitions":["missing.json"]}}',validExample:'{"models":{"definitions":["nodes.json"]}}'},[u.InvalidNodeDefinitionJson]:j(u.InvalidNodeDefinitionJson,"Invalid node definition JSON","Node definition files must parse as JSON.",!1),[u.InvalidNodeDefinitionSchema]:j(u.InvalidNodeDefinitionSchema,"Invalid node definition schema","Node definition files must match the expected schema.",!1),[u.DuplicateNodeDefinitionId]:j(u.DuplicateNodeDefinitionId,"Duplicate node definition ID","Node definition IDs must be unique.",!1),[u.InvalidAugmentationJson]:j(u.InvalidAugmentationJson,"Invalid augmentation JSON","Model augmentation files must parse as JSON.",!1),[u.InvalidAugmentationSchema]:j(u.InvalidAugmentationSchema,"Invalid augmentation schema","Model augmentation files must match the expected schema.",!1),[u.ConflictingPortDefault]:{code:u.ConflictingPortDefault,title:"Conflicting port default",description:"Merged port defaults must agree.",suppressible:!1,fix:"Run `btxmlc repair` to inspect conflicts. Run `btxmlc repair --write` to resolve the conflict interactively."},[u.UnusedSuppression]:j(u.UnusedSuppression,"Unused suppression","Suppressions should match at least one diagnostic.",!1),[u.MissingSuppressionReason]:j(u.MissingSuppressionReason,"Missing suppression reason","Suppressions should include a reason when required.",!1),XML016_TEXT_OUTSIDE_ROOT:j("XML016_TEXT_OUTSIDE_ROOT","Text outside root element","Non-whitespace text is not allowed outside the root element.",!1)},Od=Object.fromEntries(Object.values(z).flatMap(e=>{let t=e;return[t.code,...(t.codes??[]).filter(n=>n!==t.code)].map(n=>[n,t.defaultSeverity])})),$d={[u.DuplicateNodeModelId]:"error",[u.UnknownTopLevelElement]:"warning",[u.UnresolvedIncludePathVariable]:"error",[u.ExternalIncludeUsed]:"info",[u.IncludeDepthExceeded]:"error",[u.TooManyResolvedFiles]:"error",[u.EntrypointNotFound]:"error",[u.ExternalModelFileNotFound]:"error",[u.AugmentationFileNotFound]:"error",[u.MissingTreeNodesModel]:"error",[u.ExternalModelXmlParseError]:"error",[u.NodeDefinitionFileNotFound]:"error",[u.InvalidNodeDefinitionJson]:"error",[u.InvalidNodeDefinitionSchema]:"error",[u.DuplicateNodeDefinitionId]:"error",[u.InvalidAugmentationJson]:"error",[u.InvalidAugmentationSchema]:"error",[u.CustomLiteralRequiresValidator]:"error",[u.InvalidPortDefaultValue]:"error",[u.InvalidPortName]:"error",[u.AugmentTargetNotFound]:"error",[u.AugmentPortNotFound]:"error",[u.InvalidTypeRefinement]:"error",[u.ConflictingPortDefault]:"warning",[u.EmptyScript]:"error",[u.InvalidScriptToken]:"error",[u.InvalidCompoundAssignment]:"error",[u.ScriptVariableTypeMismatch]:"error",XML016_TEXT_OUTSIDE_ROOT:"error"};function Ud(e){let t=Od[e]??$d[e];if(!t)throw new Error(`Missing default severity metadata for ${e}`);return t}var Qt={};for(let[e,t]of Object.entries(Ld))Qt[e]={...t,defaultSeverity:Ud(e)};var di={};for(let[e,t]of Object.entries(z)){let n=Qt[t.code];if(n){let o=t;di[e]=o.options?{...n,options:o.options}:n}}function en(e){return Qt[e]}function no(){return[...Object.values(u)].sort()}function ci(e,t){if(t)return Ht(e,t)}function ui(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function pi(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return E(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function qd(e,t,n,o,r){let i=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:i,typeSource:n.typeSource??ui(n),validate:o.validate??n.validate,required:o.required??n.required,enum:o.enum?[...o.enum]:n.enum,description:o.description??n.description},l=o.typeRefinement;if(!l)return{...a,type:a.effectiveType};let d=ci(e,l.from),c=ci(e,i);return d&&d!==c?(r.push(pi({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${i??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:i,actualFrom:l.from,to:l.to},notes:i||l.from?[`base type: ${i??"(unspecified)"}`,`requested from: ${l.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function Vd(e,t,n,o){let r=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of Object.entries(n.ports??{})){let a=r.get(i);if(!a){o.push(pi({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${i}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:i}}));continue}r.set(i,qd(e,t,a,s,o))}return{...t,ports:t.ports.map(i=>r.get(i.name)??i)}}function Xd(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??ui(e)}}function mi(e,t,n){let o=[],r=new Map([...e.entries()].map(([i,s])=>[i,{...s,ports:s.ports.map(Xd)}]));for(let i of n)for(let[s,a]of Object.entries(i.augment??{})){let l=r.get(s);if(!l){o.push(E("BT117_AUGMENT_TARGET_NOT_FOUND",h.Error,`augmentation target node \`${s}\` not found`,void 0,i.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:i.path?[`augmentation file: ${i.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:i.path}));continue}r.set(s,Vd(t,l,a,o))}return{modelsById:r,diagnostics:o}}function yi(e){return It("builtin",0,!1,e)}function hi(e){return It("xml-tree-nodes-model",10,!0,e)}function bi(e){return It("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Si(e){return It("node-definition-file",20,!0,e)}function vi(e){return It("config-inline",30,!0,e)}function It(e,t,n,o){return{kind:e,precedence:t,editable:n,models:o.map(r=>xi(r,e,n&&r.editable!==!1))}}function zd(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function xi(e,t,n){let o=zd(t);return{...e,source:o,sourceMeta:e.sourceMeta??{sourceKind:o,file:e.uri,range:e.range},editable:n,ports:e.ports.map(r=>({...r,source:o}))}}function it(e,t){return{uri:e.uri,sourceKind:e.source||"inline-tree-nodes-model",nodeId:e.id,kind:e.kind,range:e.range,idRange:e.idRange,sourceIndex:t}}function fi(e){return{name:e.name,direction:e.direction,type:e.type,required:e.required,defaultValue:e.defaultValue,enum:e.enum?[...e.enum].sort():void 0,description:e.description}}function Gd(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let o=new Map(e.ports.map(i=>[i.name,i])),r=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of o)r.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:fi(s)});for(let[i,s]of r)o.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:fi(s)});for(let[i,s]of o){let a=r.get(i);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:i,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:i,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:i,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:i,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:i,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:i,left:s.description,right:a.description})}return n}function gi(e,t){let n=new Map;for(let o of e){let r=n.get(o.id);if(!r){n.set(o.id,o);continue}if(ot(r,o))continue;let i=Hn(r,o),s=Gd(r,o),a;if(i==="port-default"){let l=new Map(r.ports.map(p=>[p.name,p])),d=o.ports.find(p=>{let g=l.get(p.name);return g&&g.defaultValue!==p.defaultValue}),c=d?.name??"unknown",m=[it(r,0),it(o,1)];a={kind:"port-default-conflict",nodeId:o.id,portName:c,sources:[{source:it(r,0),value:l.get(c)?.defaultValue},{source:it(o,1),value:d?.defaultValue}]},t.push({id:o.id,definitions:[r,o],sources:m,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${c}\` on node \`${o.id}\``,uri:o.uri,range:o.idRange||o.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${o.id}\` definition or remove the duplicate model`},data:a,relatedInformation:r.uri&&r.range?[{uri:r.uri,range:r.range,message:"previous definition"}]:void 0})}else{let l=[it(r,0),it(o,1)];a={kind:"node-model-conflict",nodeId:o.id,sources:l,differences:s},t.push({id:o.id,definitions:[r,o],sources:l,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${o.id}\``,uri:o.uri,range:o.idRange||o.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${o.id}\` model definitions agree, or keep only one definition at the same precedence level`},data:a,relatedInformation:r.uri&&r.range?[{uri:r.uri,range:r.range,message:"previous definition"}]:void 0})}}return n}function Wd(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(o=>[o.name,o]));for(let o of t.ports)n.set(o.name,o);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function Ri(e){let t=[],n=new Map,o=new Map,r=[...e].sort((a,l)=>a.precedence-l.precedence),i=new Map,s=new Map;for(let a of r){let l=i.get(a.precedence)??[],d=a.models.map(c=>xi(c,a.kind,a.editable&&c.editable!==!1));l.push(...d),i.set(a.precedence,l);for(let c of d)s.set(c.id,a.precedence)}for(let[a,l]of[...i.entries()].sort((d,c)=>d[0]-c[0])){let d=l.filter(g=>s.get(g.id)===a),c=l.filter(g=>s.get(g.id)!==a),m=gi(c,[]);for(let[g,y]of gi(d,t))m.set(g,y);let p=new Set(l.map(g=>g.id));for(let g of p)s.get(g)===a&&n.set(g,l.filter(y=>y.id===g));for(let[g,y]of m)o.set(g,Wd(o.get(g),y))}return{nodeModelsById:n,mergedNodeModelsById:o,conflicts:t}}function Kd(e){return Dt.includes(e)}function Hd(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:nt(),augmentations:[]}}function Jd(e,t,n){let o=e.get(t)||[];o.push(n),e.set(t,o)}function Yd(e,t,n){for(let o of new Set(n))if(Kd(o)){for(let r of Wn(o))e.builtins.set(r.id,r),t.push(r);e.genericSubTreePorts.push(...Kn(o))}}function Zd(e,t,n,o,r){for(let i of r){let s=qn(i,{uri:i.uri,path:i.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(i.uri,a);for(let l of a.behaviorTrees)Jd(e.behaviorTreesById,l.id,l);i.kind==="model-document"?o.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Qd(e){return JSON.stringify({name:e.name,direction:e.direction,type:e.type,required:e.required,defaultValue:e.defaultValue,enum:e.enum?[...e.enum].sort((t,n)=>t.localeCompare(n)):void 0,description:e.description})}function ec(e){let t=new Set,n=[];for(let o of e.genericSubTreePorts){let r=Qd(o);t.has(r)||(t.add(r),n.push(o))}e.genericSubTreePorts=n}function tc(e,t,n,o,r){e.modelLayers.push(yi(t),hi(n),bi(o)),r.models?.length&&e.modelLayers.push(Si([...r.models])),e.modelLayers.push(...r.additionalModelLayers??[])}function Et(e,t){return nc(e,t)}function nc(e,t){let n=Hd(),o=[],r=[],i=[],s=[];Yd(n,r,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=nt(t.augmentations??[]),Zd(n,o,i,s,e),ec(n),tc(n,r,i,s,t);let a=t.config.models.inline;if(a){let c=[];for(let[m,p]of Object.entries(a))c.push(St(m,p));n.modelLayers.push(vi(c))}let l=Ri(n.modelLayers),d=mi(l.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=l.nodeModelsById,n.mergedNodeModelsById=d.modelsById,n.modelConflicts=l.conflicts,o.push(...d.diagnostics),{ok:o.every(c=>c.severity!==h.Error),index:n,diagnostics:o}}var Ti={unknownSubTreePorts:"allow"};function Di(e){return{...Ti,...e}}var oc=["Action","Condition","Control","Decorator"],rc=new Set(oc);var ic=new Set(["input_port","output_port","inout_port"]);function ro(e){return rc.has(e)}function tn(e,t){return e.attributes.find(n=>n.name===t)?.value}function oo(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&oo(n,t))return!0;return!1}function ki(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return oo(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&oo(n,t))return!0;return!1}function nn(e){return ic.has(e.name)}function Ci(e){return e.name==="root"?"root":e.name==="BehaviorTree"?"behavior-tree":e.name==="TreeNodesModel"?"tree-nodes-model":e.name==="include"?"include":e.name==="SubTree"?"subtree":ro(e.name)?"generic-node":nn(e)?"unknown-xml":"concrete-node"}function io(e){if(e.name==="SubTree")return tn(e,"ID")||"SubTree";if(ro(e.name))return tn(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||nn(e)))return e.name}function de(e){return e.typeRegistry}function Ie(e,t){return le(de(e),t)}function st(e,t,n){return Rt(de(e),t,n)}function Nt(e,t){return e.documents.get(t)}function ge(e,t){return e.behaviorTreesById.get(t)??[]}function so(e,t){return e.behaviorTreesById.has(t)}function at(e){return[...e.behaviorTreesById.keys()]}function Pt(e){return[...e.documents.values()]}function Pe(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function wt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(o=>o.id===t))}function ao(e){return e.modelLayers.flatMap(t=>t.models)}function lo(e){return[...e.mergedNodeModelsById.values()]}function co(e){return[...e.nodeModelsById.keys()]}function uo(e){return[...e.genericSubTreePorts]}function po(e){return[...e.augmentations]}function Mt(e){return e.modelConflicts}function Bt(e,t){let{id:n,fileLocalUri:o,config:r}=t,i=ge(e,n);if(i.length>0){if((r?.resolver?.behaviorTreeIds==="file-local-first"||r?.resolver?.behaviorTreeIds==="allow-ambiguous")&&o){let d=i.filter(c=>c.uri===o);d.length>0&&(i=d)}let a=Pe(e,n),l=a?.kind==="SubTree"?[a]:[];return i.length===1?{status:"resolved",kind:"behavior-tree",treeId:i[0].id,behaviorTree:i[0]}:{status:"ambiguous",candidates:[...i.map(d=>d.id),...l.map(d=>d.id)],behaviorTrees:i,definitions:l}}let s=Pe(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function mo(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Pe(e,t);if(n){let r=Mt(e).find(i=>i.id===t&&i.code==="BT012_CONFLICTING_NODE_MODEL");return r?{status:"ambiguous",nodeType:t,candidates:r.definitions}:{status:"resolved",model:n}}let o=wt(e,t);return o.length===1?{status:"resolved",model:o[0]}:o.length>1?{status:"ambiguous",nodeType:t,candidates:o}:{status:"unresolved",nodeType:t}}function fo(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function go(e){let t=uo(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return fo([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function yo(e){let{attribute:t}=e,n=e.ports.find(o=>o.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:Vn(t.name)?{status:"reserved-attribute",attribute:t,name:t.name,value:t.value}:e.allowsArbitraryAttributes?{status:"allowed-arbitrary",attribute:t,name:t.name,value:t.value}:e.unknownModelPortStatus==="undeclared"?{status:"undeclared",attribute:t,name:t.name,value:t.value}:e.model.status==="unresolved"||e.model.status==="ambiguous"?{status:"unknown-node-model",attribute:t,name:t.name,value:t.value}:{status:"undeclared",attribute:t,name:t.name,value:t.value}}function we(e,t){let n=Di(t.policy),o=t.element,r=Ci(o),i=ki(t.documentRoot,o);if((t.isModelDefinition||i&&(r==="generic-node"||r==="subtree"))&&(r="model-definition"),i&&nn(o)&&(r="unknown-xml"),r==="root"||r==="behavior-tree"||r==="tree-nodes-model"||r==="include"||r==="model-definition"||r==="unknown-xml")return{element:o,tagName:o.name,tagForm:r,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=io(o);if(r!=="subtree"){let g=mo(e,s),y=go({index:e,tagForm:r,model:g}),f=o.attributes.map(x=>yo({attribute:x,ports:y,allowsArbitraryAttributes:!1,model:g}));return{element:o,tagName:o.name,tagForm:r,nodeType:s,model:g,ports:y,allowsArbitraryAttributes:!1,portUsages:f}}let a=tn(o,"ID"),l=a?Bt(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},d={status:"unresolved",nodeType:a},c=!1;if(l.status==="resolved"&&l.kind==="node-model")d={status:"resolved",model:l.model};else if(l.status==="resolved"&&l.kind==="behavior-tree"){let g=mo(e,l.treeId);g.status==="resolved"&&g.model.kind==="SubTree"?d=g:c=n.unknownSubTreePorts==="allow"}else l.status==="ambiguous"&&l.definitions.length>0?d=l.definitions.length===1?{status:"resolved",model:l.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:l.definitions}:c=n.unknownSubTreePorts==="allow";let m=go({index:e,tagForm:r,model:d,subtreeModelPorts:l.status==="ambiguous"?fo(l.definitions.flatMap(g=>g.ports)):void 0}),p=o.attributes.map(g=>yo({attribute:g,ports:m,allowsArbitraryAttributes:c,model:d,unknownModelPortStatus:!c&&d.status!=="resolved"?"undeclared":void 0}));return{element:o,tagName:o.name,tagForm:r,nodeType:s,model:d,subtree:{id:a,target:l},ports:m,allowsArbitraryAttributes:c,portUsages:p}}function on(e,t){return we(e,t).portUsages.find(o=>o.name===t.attributeName)}function lc(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function dc(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Ii(e,t){let n=e.line,o=e.character,r=e.offset;for(let i of t){if(r+=i.length,i===`
|
|
9
|
+
`){n+=1,o=0;continue}o+=i.length}return{line:n,character:o,offset:r}}function cc(e,t,n){let o=Ii(e,t),r=Ii(o,n);return{start:o,end:r}}function uc(e,t){let n=t.valueContentRange||t.valueRange,o=e.originalText.slice(n.start.offset,n.end.offset),r=[];for(let i of o.matchAll(/\{([^}]+)\}/g)){let s=i[0],a=i[1],l=i.index??0;r.push({raw:s,key:a,range:cc(n.start,o.slice(0,l),s),syntax:"braced"})}return r.length===0&&(o.includes("{")||o.includes("}"))&&r.push({raw:o,key:o,range:n,syntax:"invalid"}),r}function pc(e,t){return lc(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Ni(e){let t=[];for(let n of e)t.push(n),t.push(...Ni(n.children));return t}function mc(e){return e.model.status==="resolved"?{status:"resolved",model:e.model.model,source:e.model.model.sourceMeta}:e.model.status==="ambiguous"?{status:"ambiguous",nodeType:e.model.nodeType,candidates:e.model.candidates}:{status:"unresolved",nodeType:e.nodeType??e.tagName}}function fc(e){return e.status==="resolved"?{status:"resolved",port:e.port}:e.status==="allowed-arbitrary"?{status:"allowed-arbitrary",name:e.name}:e.status==="undeclared"?{status:"undeclared",name:e.name}:{status:"unknown-node-model"}}function Ei(e,t){return e.attributes.find(n=>n.name===t)}function gc(e){let t=new Set;if(!e)return t;let n=o=>{t.add(o);for(let r of o.children)r.kind==="element"&&n(r)};if(e.name==="TreeNodesModel")return n(e),t;for(let o of e.children)o.kind!=="element"||o.name!=="TreeNodesModel"||n(o);return t}function Me(e,t){let n=t.semantic,o=gc(e.root),r=dc(e).map(l=>({id:Ei(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),i=[],s=[],a=(l,d,c,m)=>{let p=we(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:o.has(l)}),g=mc(p),y={element:l,path:m,tagName:l.name,kind:pc(l,p),model:g,usage:p,portBindings:[],children:[],parent:c,behaviorTree:d};if(y.portBindings=p.portUsages.filter(f=>f.status!=="reserved-attribute").map(f=>({name:f.name,value:f.value,attribute:f.attribute,declaredPort:fc(f),usage:f,blackboardReferences:uc(e,f.attribute)})),y.children=l.children.filter(f=>f.kind==="element").map((f,x)=>a(f,d,y,[...m,x])),l.name==="SubTree"){let f=Ei(l,"ID")?.value;i.push({node:y,id:f,target:p.subtree?.target??{status:"unresolved",id:f},portRemaps:y.portBindings})}return y};for(let l of r){let d=l.element.children.filter(c=>c.kind==="element").map((c,m)=>a(c,l,void 0,[m]));l.rootNode=d[0],l.nodes=Ni(d),s.push(...l.nodes)}return{document:e,behaviorTrees:r,subtreeCalls:i,nodes:s}}function Pi(e){let{document:t,diagnostics:n,options:o,partial:r}=e,i=n.some(a=>a.severity===h.Error),s="generic-xml";if(i)s="invalid-xml";else if(t.root){let a=t.root,l=a.children.some(p=>p.kind==="element"&&p.name==="BehaviorTree"),d=a.children.some(p=>p.kind==="element"&&p.name==="TreeNodesModel"),c=a.attributes.some(p=>p.name==="BTCPP_format"&&p.value==="4"),m=a.name==="TreeNodesModel"||a.name==="root"&&!l&&d;o.kind==="model-xml"||m?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(c||l)||o.kind==="bt-xml")&&(s="bt-document")}return t.kind=s,t.isBtXml=s==="bt-document"||s==="model-document",!i&&!r?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:r}}function hc(e){if(e.name==="input_port"||e.name==="output_port")return!1;let t=e.children||[],n=t.some(r=>r.kind==="text"&&r.text.trim()!==""),o=t.some(r=>r.kind==="element");return n&&o}function ho(e,t){if(e.kind==="element"){hc(e)&&t(e);for(let n of e.children||[])ho(n,t)}}function O(e,t){let n=0,o=0;for(let r=0;r<Math.min(t,e.length);r++)e[r]===`
|
|
10
|
+
`?(n++,o=0):o++;return tt(n,o,t)}function bo(e,t,n,o){for(let r=0;r<e.length;r++){if(e[r]!=="&")continue;let i=e.slice(r+1),s=r;if(i.startsWith("amp;")){r+=4;continue}if(i.startsWith("lt;")){r+=3;continue}if(i.startsWith("gt;")){r+=3;continue}if(i.startsWith("quot;")){r+=5;continue}if(i.startsWith("apos;")){r+=5;continue}if(i.startsWith("#")){let m=1;if(i[m]==="x"||i[m]==="X"){m++;let x="";for(;m<i.length&&/[0-9a-fA-F]/.test(i[m]);)x+=i[m],m++;if(m<i.length&&i[m]===";"){m++;let P=e.slice(s,s+1+m),A=O(n,t+s),_=O(n,t+s+P.length);if(x){let M=Number.parseInt(x,16);if(M>0&&M<=1114111&&(M<55296||M>57343)){r+=m-1;continue}o("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${P}\``,A,_,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),r+=m-1;continue}o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${P}\``,A,_,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),r+=m-1;continue}let b=e.slice(s,s+1+m),v=O(n,t+s),D=O(n,t+s+b.length);o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${b}\``,v,D,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),r+=m-1;continue}let p="";for(;m<i.length&&/[0-9]/.test(i[m]);)p+=i[m],m++;if(m<i.length&&i[m]===";"){m++;let x=e.slice(s,s+1+m),b=O(n,t+s),v=O(n,t+s+x.length);if(p){let D=Number.parseInt(p,10);if(D>0&&D<=1114111&&(D<55296||D>57343)){r+=m-1;continue}o("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${x}\``,b,v,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),r+=m-1;continue}o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${x}\``,b,v,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),r+=m-1;continue}let g=e.slice(s,s+1+m),y=O(n,t+s),f=O(n,t+s+g.length);o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${g}\``,y,f,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),r+=m-1;continue}let a=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(a){let m=`&${a[0]}`,p=O(n,t+s),g=O(n,t+s+m.length);o("XML013_UNKNOWN_ENTITY",h.Error,`unknown XML entity \`${m}\``,p,g,{primaryLabel:"this entity is not one of XML's predefined entities",help:"use one of `&`, `<`, `>`, `"`, `'`, or a valid numeric entity"}),r+=m.length-1;continue}let l=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let m=`&${l[0]}`,p=O(n,t+s),g=O(n,t+s+m.length);o("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",p,g,{primaryLabel:"escape `&` as `&`",help:"replace `&` with `&` unless this is a valid XML entity"}),r+=m.length-1;continue}let d=O(n,t+s),c=O(n,t+s+1);o("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",d,c,{primaryLabel:"escape `&` as `&`",help:"replace `&` with `&` unless this is a valid XML entity"})}}function _t(e){return e.replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&").replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let o=Number.parseInt(n,16);return o<=0||o>1114111||o>=55296&&o<=57343?t:String.fromCodePoint(o)}).replace(/&#([0-9]+);/g,(t,n)=>{let o=Number.parseInt(n,10);return o<=0||o>1114111||o>=55296&&o<=57343?t:String.fromCodePoint(o)})}function wi(e){let t="",n=[0];for(let o=0;o<e.length;){let r=bc(e,o);if(!r){t+=e[o]??"",o+=1,n.push(o);continue}t+=r.value,o=r.end,n.push(o)}return{value:t,offsets:n}}function bc(e,t){let n=e.slice(t);if(n.startsWith(""")||n.startsWith("'")||n.startsWith("<")||n.startsWith(">")||n.startsWith("&")){let s=n.startsWith(""")?""":n.startsWith("'")?"'":n.startsWith("<")?"<":n.startsWith(">")?">":"&";return{value:_t(s),end:t+s.length}}let r=/^&#x([0-9a-fA-F]+);/.exec(n);if(r){let s=r[0];return{value:_t(s),end:t+s.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let s=i[0];return{value:_t(s),end:t+s.length}}}function Mi(e){return tt(e.line,e.character,e.offset)}function Sc(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function vc(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function xc(e){return e===" "||e===" "||e===`
|
|
11
|
+
`||e==="\r"}function Rc(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
|
|
12
|
+
`&&e!=="\r"}function Be(e,t={}){let n=[],o=t.mode==="tolerant",r={uri:t.uri||"",path:t.path,kind:"generic-xml",isBtXml:!1,xmlDeclaration:void 0,root:void 0,nodes:[],diagnostics:n,originalText:e},i=0,s=0,a=0,l=[],d=!1;function c(){return tt(s,a,i)}function m(){return i>=e.length}function p(S=0){return e[i+S]}function g(S=1){for(let w=0;w<S;w+=1)e[i++]===`
|
|
13
|
+
`?(s+=1,a=0):a+=1}function y(){for(;!m()&&xc(p());)g()}let f=(S,w,I,B,T,W)=>{n.push(E(S,w,I,k(B,T),r.uri,W))};function x(S,w,I,B,T,W){n.push(E(S,w,I,B&&T?k(B,T):void 0,r.uri,W))}function b(){if(!Sc(p()))return"";let S=i;for(g();!m()&&vc(p());)g();return e.slice(S,i)}function v(){let S=p();if(S!=='"'&&S!=="'")return{value:"",ok:!1};let w=c();g();let I=c(),B=i;for(;!m()&&p()!==S&&p()!=="<";)g();let T=c();if(m()||p()!==S)return{value:e.slice(B,i),ok:!1,valueRange:k(w,T),valueContentRange:k(I,T)};let W=e.slice(B,i);g(),bo(W,I.offset,e,f);let De=wi(W);return{value:De.value,valueOffsets:De.offsets,ok:!0,valueRange:k(w,c()),valueContentRange:k(I,T)}}function D(){let S=[],w=new Set;for(;;){y();let I=p();if(!I||I===">"||I==="/"&&p(1)===">")break;let B=c(),T=b(),W=c();if(!T)break;y();let De=c();if(p()!=="="){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",B,W,{primaryLabel:`expected \`=\` after attribute \`${T}\``,help:`write the attribute as \`${T}="..."\``}),d=!0,o)continue;break}g();let Il=c();y();let $n=c(),qe=v(),et=c();if(!qe.ok&&(f("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",$n,et,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${T}="value"\``}),d=!0,!o)||(w.has(T)?f("XML004_DUPLICATE_ATTRIBUTE",h.Error,`duplicate attribute \`${T}\``,B,et,{primaryLabel:`attribute \`${T}\` is already defined on this element`,help:`remove one of the duplicate \`${T}\` attributes`}):w.add(T),S.push({name:T,value:qe.value,...qe.valueOffsets?{valueOffsets:qe.valueOffsets}:{},range:k(B,et),fullRange:k(B,et),nameRange:k(B,W),equalsRange:k(De,Il),valueRange:qe.valueRange||k($n,et),valueContentRange:qe.valueContentRange||k($n,et)}),!qe.ok&&o))break}return S}function P(S){l.length>0?l[l.length-1].children.push(S):(r.nodes.push(S),!r.root&&S.kind==="element"&&(r.root=S))}function A(){let S=c(),w=i;for(;!m()&&p()!=="<";)g();let I=e.slice(w,i);if(I.length===0)return;for(let T of I)if(Rc(T)){f("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",S,c(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}bo(I,w,e,f);let B={kind:"text",text:_t(I),range:k(S,c()),fullRange:k(S,c())};P(B)}function _(){let S=c();g(4);let w=c(),I=i;for(;!m()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)g();let B=e.slice(I,i);if(m()){if(f("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",S,c(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),d=!0,!o)return;let De={kind:"comment",text:B,range:k(S,c()),fullRange:k(S,c()),contentRange:k(w,c())};P(De);return}(B.includes("--")||B.endsWith("-"))&&f("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",w,c(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let T=c();g(3);let W={kind:"comment",text:B,range:k(S,c()),fullRange:k(S,c()),contentRange:k(w,T)};P(W)}function M(){let S=c();g(5),y();let w=D();y(),p()==="?"&&p(1)===">"?g(2):f("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",S,c(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let I={range:k(S,c()),attributes:w};for(let B of w)B.name==="version"&&(I.version=B.value),B.name==="encoding"&&(I.encoding=B.value),B.name==="standalone"&&(I.standalone=B.value);r.xmlDeclaration=I}function Te(){let S=c();g(2),y();let w=c(),I=b(),B=c();if(y(),p()!==">")for(f("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",S,c(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),d=!0;!m()&&p()!==">";)g();p()===">"&&g();let T=l.pop();if(!T||T.name!==I){let W=T?T.name:I||"",De=I||"";f("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${De}>\``,S,c(),{primaryLabel:`opened as \`<${W}>\` but closed as \`</${De}>\``,help:`change the closing tag to \`</${W}>\` or fix the nesting`});return}T.closeTagRange=k(S,c()),T.endTagRange=k(S,c()),T.nameRange||(T.nameRange=k(w,B)),T.range=k(T.range.start,c()),T.fullRange=k(T.range.start,c())}for(;!m();)if(p()==="<")if(p(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")M();else{let S=c();for(;!m()&&!(p()==="?"&&p(1)===">");)g();m()||g(2),f("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",S,c(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")_();else if(p(1)==="!"&&p(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let S=c();for(g(8);!m()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)g();m()||g(3),f("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",S,c(),{primaryLabel:"CDATA sections are not supported by btxml",help:"replace the CDATA section with normal escaped XML text",notes:["escape `<` as `<`, `>` as `>`, and `&` as `&`"]})}else if(p(1)==="!"&&e.slice(i+2,i+9)==="DOCTYPE"){let S=c();for(g(8);!m()&&p()!==">";)g();m()||g(1),f("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",S,c(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")Te();else{let S=c();g();let w=c(),I=b(),B=c();if(!I){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",S,c(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),d=!0,o){g();continue}break}let T={kind:"element",name:I,attributes:[],children:[],range:k(S,S),fullRange:k(S,S),openTagRange:k(S,S),startTagRange:k(S,S),nameRange:k(w,B),selfClosing:!1};if(T.attributes=D(),y(),p()==="/"&&p(1)===">"){g(2),T.selfClosing=!0,T.openTagRange=k(S,c()),T.startTagRange=T.openTagRange,T.range=k(S,c()),T.fullRange=k(S,c()),P(T);continue}if(p()!==">"){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",S,c(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),d=!0,o){T.openTagRange=k(S,c()),T.startTagRange=T.openTagRange,T.range=k(S,c()),T.fullRange=k(S,c()),P(T);continue}break}g(),T.openTagRange=k(S,c()),T.startTagRange=T.openTagRange,T.range=k(S,c()),T.fullRange=k(S,c()),P(T),l.push(T)}else A();if(l.length>0){let S=l[l.length-1];if(f("XML006_MISSING_CLOSING_TAG",h.Error,`missing closing tag for \`<${S.name}>\``,S.openTagRange.start,S.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${S.name}>\` before the end of the file`}),d=!0,o)for(;l.length>0;){let w=l.pop();if(!w)break;w.range=k(w.range.start,c()),w.fullRange=k(w.range.start,c())}}let Z=r.nodes.filter(S=>S.kind==="element");Z.length===0?x("XML002_MISSING_ROOT",h.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):Z.length>1&&x("XML003_MULTIPLE_ROOTS",h.Error,"multiple root elements",void 0,void 0,{primaryLabel:"this document has more than one top-level element",help:'wrap the document content in one `<root BTCPP_format="4">...</root>` element'});let L=r.root;if(L)for(let S of r.nodes)S!==L&&S.kind==="text"&&S.text.trim().length>0&&f("XML016_TEXT_OUTSIDE_ROOT",h.Error,"text outside root element",S.range.start,S.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!r.xmlDeclaration)x("XML008_MISSING_DECLARATION",h.Warning,"missing XML declaration",void 0,void 0,{help:'add `<?xml version="1.0" encoding="UTF-8"?>` at the top of the file',notes:["this is a warning because BehaviorTree.CPP can still parse many files without a declaration"]});else if(r.xmlDeclaration.encoding&&r.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let S=r.xmlDeclaration.encoding;f("XML009_INVALID_ENCODING",h.Warning,"XML encoding should be UTF-8",r.xmlDeclaration.range.start,r.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${S}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return L&&ho(L,S=>{f("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",Mi(S.range.start),Mi(S.range.end),{primaryLabel:"this element contains both text and child elements",help:"move the text into an attribute or split it into separate elements",notes:["text inside `<input_port>` and `<output_port>` remains allowed"]})}),Pi({document:r,diagnostics:n,partial:d,options:t})}var At={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Bi(e){if(!e)return At;let t=typeof e.indentWidth=="number"?e.indentWidth:At.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:At.xmlDeclaration,o=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:At.blankLineBetweenBehaviorTrees,r=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:At.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:o,lineEnding:r}}function rn(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function sn(e){return rn(e).replace(/"/g,""")}function Tc(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Dc(e,t,n){return`${" ".repeat(e*n)}${t}`}function lt(e,t,n,o){let r=" ".repeat(t*o),i=e.attributes||[];if(i.length===0)return[`${r}<${e.name}${n}`];if(i.length===1)return[`${r}<${e.name} ${i[0].name}="${sn(i[0].value)}"${n}`];let s=[`${r}<${e.name} ${i[0].name}="${sn(i[0].value)}"`],a=" ".repeat(r.length+1+e.name.length+1);for(let l=1;l<i.length;l+=1){let d=i[l],c=l===i.length-1?n:"";s.push(`${a}${d.name}="${sn(d.value)}"${c}`)}return s}function an(e,t,n,o){let r=" ".repeat(t*n);if(e.kind==="comment")return[`${r}<!--${e.text}-->`];if(e.kind==="text"){let c=e.text.trim();return c?[Dc(t,rn(c),n)]:[]}let i=Tc(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(c=>c.kind==="text").map(c=>c.text).join("").trim(),l=i.some(c=>c.kind==="element"||c.kind==="comment");if(a&&l&&!s&&o.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!l){if((e.attributes||[]).length<=1){let c=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${sn(e.attributes[0].value)}"`;return[`${r}<${e.name}${c}>${rn(a)}</${e.name}>`]}return lt(e,t,`>${rn(a)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return lt(e,t,"/>".slice(0),n);let c=lt(e,t,">",n);return c.push(`${r}</${e.name}>`),c}let d=lt(e,t,">",n);for(let c of e.children||[])c.kind==="text"&&c.text.trim()===""||d.push(...an(c,t+1,n,o));return d.push(`${r}</${e.name}>`),d}function kc(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function _i(e,t,n,o){let r=[],i=kc(e);for(let s=0;s<i.length;s+=1){let a=i[s],l=i[s-1],d=i[s+1],c=n&&a.kind==="element"&&a.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",m=a.kind==="element"&&a.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",p=a.kind==="comment"&&d&&d.kind==="element"&&d.name==="TreeNodesModel"&&l!==void 0;(c||m||p)&&r.length>0&&r[r.length-1]!==""&&r.push(""),a.kind==="element"?(r.push(...an(a,1,t,o)),a.name==="TreeNodesModel"&&r.push("")):r.push(...an(a,1,t,o))}return r}function dt(e,t={}){let n=Be(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(f=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(f.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let r=n.document.root,i=Bi(t),s=i.indentWidth,a=[],l=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&l)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...lt(r,0,">",s)),a.push(..._i(r.children||[],s,i.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${r.name}>`),n.diagnostics.some(f=>f.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let d=`
|
|
14
|
+
`;(i.lineEnding==="crlf"||i.lineEnding==="auto"&&e.includes(`\r
|
|
15
|
+
`))&&(d=`\r
|
|
16
|
+
`);let c=a.join(d),m=d.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${m})+$`,"u"),y=`${c.replace(p,"")}${d}`;return{ok:!0,text:y,changed:y!==e,skipped:!1,diagnostics:n.diagnostics.filter(f=>f.severity!==h.Error)}}function So(e,t){let n=e.valueOffsets;return!n||n.length===0?t:t<=0?0:t>=n.length?n[n.length-1]??0:n[t]??0}function vo(e,t,n){let o=t.valueContentRange??t.valueRange,r=So(t,n.start),i=So(t,n.end),s=O(e.originalText,o.start.offset+r),a=O(e.originalText,o.start.offset+i);return k(s,a)}function Ai(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function ji(e,t){return e.includeIssuesByUri.get(t)??[]}function Fi(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Li(e){let{document:t,semantic:n,config:o,view:r}=e,i=new Map(r.nodes.map(d=>[d.element,d])),s=new Map(r.subtreeCalls.map(d=>[d.node.element,d])),a=fe(o),l=Cc(t.root);return{document:t,view:r,semantic:n,config:o,options:e.options,facts:e.facts,report(d){let c=E(d.code??e.code,e.severity,d.message,d.range,t.uri,d.details,d.data);e.diagnostics.push({...c,rule:e.rule,...d.relatedInformation?{relatedInformation:d.relatedInformation}:{}})},getIncludeIssues(d){let c=ji(e.facts,t.uri);return d?c.filter(m=>m.kind===d):c},getSuppressionIssues(d){let c=Fi(e.facts,t.uri);return d?c.filter(m=>m.kind===d):c},getNodeUsage(d){return we(n,{element:d,documentRoot:t.root,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},getPortUsage(d,c){return on(n,{element:d,documentRoot:t.root,attributeName:c,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},resolveSubTree(d,c){return Bt(n,{id:d,fileLocalUri:c,config:o})},getNodeModel(d){return Pe(n,d)},getBehaviorTrees(d){return ge(n,d)},getTreeNodeView(d){return i.get(d)},getSubTreeCallView(d){return s.get(d)}}}function Cc(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return xo(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||xo(n,t);return t}function xo(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&xo(n,t)}function C(e){let t=z[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Ic={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files"};function _e(e){return C({name:Ic[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Ec(n)})}}}})}function Ec(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}var Oi=[_e("missing-path"),_e("not-found"),_e("cycle"),_e("outside-root"),_e("unresolved-variable"),_e("depth-exceeded"),_e("too-many-files"),_e("external-used")];import Nc from"ajv";var Pc=Nc,wc=new Pc,Mc=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],Bc={int8_t:{min:-128n,max:127n},"std::int8_t":{min:-128n,max:127n},int16_t:{min:-32768n,max:32767n},"std::int16_t":{min:-32768n,max:32767n},int32:{min:-2147483648n,max:2147483647n},int32_t:{min:-2147483648n,max:2147483647n},"std::int32_t":{min:-2147483648n,max:2147483647n},int64_t:{min:-9223372036854775808n,max:9223372036854775807n},int64:{min:-9223372036854775808n,max:9223372036854775807n},"std::int64_t":{min:-9223372036854775808n,max:9223372036854775807n},int:{min:-2147483648n,max:2147483647n},long:{min:-9223372036854775808n,max:9223372036854775807n},short:{min:-32768n,max:32767n},uint8_t:{min:0n,max:255n},"std::uint8_t":{min:0n,max:255n},uint16_t:{min:0n,max:65535n},"std::uint16_t":{min:0n,max:65535n},uint32:{min:0n,max:4294967295n},uint32_t:{min:0n,max:4294967295n},"std::uint32_t":{min:0n,max:4294967295n},uint64_t:{min:0n,max:18446744073709551615n},uint64:{min:0n,max:18446744073709551615n},"std::uint64_t":{min:0n,max:18446744073709551615n},uint:{min:0n,max:4294967295n},unsigned:{min:0n,max:4294967295n},"unsigned int":{min:0n,max:4294967295n},size_t:{min:0n,max:18446744073709551615n},"std::size_t":{min:0n,max:18446744073709551615n}},Ro=new Set(["int8_t","int16_t","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","int","long","short","std::int8_t","std::int16_t"]),$i=new Set(["uint8_t","uint16_t","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","uint","unsigned","unsigned int","std::uint8_t","std::uint16_t","size_t","std::size_t"]);function Ui(e){return e.children.filter(t=>t.kind==="element")}function ce(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function qi(e){return e.children.some(t=>t.kind==="element")}function dn(e,t){let n=Vi(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Vi(e){let t=ke(e.port.name,e.value);if(e.allowRemap&&t!==void 0)return;if(!e.allowRemap&&t!==void 0||e.port.enum&&!e.port.enum.includes(e.value))return ln(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Lc(e.registry,n,e.value)?void 0:ln(e.diagnosticCode,e.value,e.portLabel);let o=e.typeDefinition?.canonical??e.port.type;if(o&&!zi(o,e.value))return _c(o)?ln(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${o}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${o}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function ct(e){return e.effectiveType??e.type}function Xi(e,t){return le(e,ct(t))}function To(e,t){return ke(e,t)}function ln(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function _c(e){let t=xt(e)??e;return Gi(e)!==void 0||Oc.has(t.toLowerCase())}function zi(e,t){let n=Gi(e);if(n)return Ac(n,t);let o=(xt(e)??e).toLowerCase();switch(o){case"std::string":case"string":case"bt::any":case"bt::anytypeallowed":case"bt::anytype":case"any":return!0;case"bool":return t==="0"||t==="1"||t==="true"||t==="TRUE"||t==="True"||t==="false"||t==="FALSE"||t==="False";case"float":case"double":return/^-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/.test(t);case"bt::nodestatus":case"nodestatus":return Mc.includes(t);default:return Ro.has(o)||$i.has(o)?Wi(o,t):!1}}function Gi(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Ac(e,t){let n=Fc(t);return n?n.every(o=>jc(e,o)):!1}function jc(e,t){if(t.kind==="string")return zi(e,t.value);let n=(xt(e)??e).toLowerCase();switch(n){case"std::string":return typeof t.value=="string";case"bool":return typeof t.value=="boolean";case"float":case"double":return typeof t.value=="number"&&Number.isFinite(t.value);default:return Ro.has(n)||$i.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&Wi(n,String(t.value)):!1}}function Wi(e,t){let n=Bc[e];if(!n)return!1;if(Ro.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let o=BigInt(t);return o>=n.min&&o<=n.max}catch{return!1}}function Fc(e){if(e.startsWith("json:"))try{let t=JSON.parse(e.slice(5));return Array.isArray(t)?t.map(n=>({kind:"json",value:n})):void 0}catch{return}return e.split(";").map(t=>({kind:"string",value:t}))}function Lc(e,t,n){switch(t.kind){case"pattern":return new RegExp(`^(?:${t.pattern})$`).test(n);case"enum":return t.values.includes(n);case"tuple":{let o=n.split(t.separator);return o.length!==t.items.length?!1:o.every((r,i)=>{let s=t.items[i];return s?Vi({port:{name:`tuple[${i}]`,type:s},value:r,registry:e,typeDefinition:le(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${i}]`})===void 0:!1})}case"json-schema":try{let o=JSON.parse(n);return wc.compile(t.schema)(o)===!0}catch{return!1}}}var Oc=new Set(["std::string","string","bool","int8_t","std::int8_t","int16_t","std::int16_t","int","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","size_t","std::size_t","unsigned","unsigned int","float","double","bt::nodestatus","nodestatus","bt::any","bt::anytypeallowed","bt::anytype","any"]);var Ki=[C({name:"model/require-port-name",meta:{description:"Port elements require a name attribute."},create(e){return{TreeNodeModel(t){for(let n of t.ports)n.name||e.report({message:"Port must have name attribute",range:n.range||n.nameRange||t.idRange||t.range})}}}}),C({name:"model/no-duplicate-port-name",meta:{description:"Ports with the same name are not allowed."},create(e){return{TreeNodeModel(t){let n=new Set;for(let o of t.ports)o.name&&(n.has(o.name)&&e.report({message:`Duplicate port name "${o.name}" in ${t.id}`,range:o.nameRange||o.range||t.idRange||t.range}),n.add(o.name))}}}}),C({name:"model/valid-port-name",meta:{description:"Port names must be valid XML attribute names for BT nodes."},create(e){return{TreeNodeModel(t){for(let n of t.ports){if(!n.name)continue;let o=Xn(n.name);o&&e.report({code:u.InvalidPortName,message:`invalid port name \`${n.name}\`: ${o}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),C({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of Mt(e.semantic))t.uri&&t.uri!==e.document.uri||$c(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),C({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!Uc(t))return;let n=t.attributes.find(l=>l.name==="default")??t.attributes.find(l=>l.name==="default_value");if(!n)return;let o=t.attributes.find(l=>l.name==="name")?.value;if(!o)return;let i=qc(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!i)return;let a=e.getNodeModel(i)?.ports.find(l=>l.name===o);if(a){if(a.direction==="output"){ke(a.name,n.value)===void 0&&e.report({code:u.InvalidPortDefaultValue,message:`output port default for \`${a.name}\` must be a blackboard remap`,range:n.range,details:{primaryLabel:`output port default for \`${a.name}\` must be a blackboard remap`,help:`use \`${a.name}="{${a.name}}"\` or \`${a.name}="{=}"\``}});return}dn(e,{port:a,value:n.value,range:n.range,registry:de(e.semantic),typeDefinition:Ie(e.semantic,a.type),allowRemap:!0,diagnosticCode:u.InvalidPortDefaultValue,customLiteralDiagnosticCode:u.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),C({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=de(e.semantic),n=new Map,o=e.options.allowStringEntryCompatibility??!0;for(let r of e.view.nodes)for(let i of r.portBindings){if(i.declaredPort.status!=="resolved")continue;let s=To(i.name,i.value);if(!s)continue;let a=Xi(t,i.declaredPort.port);if(!a||a.kind==="any")continue;let l=n.get(s)??[];l.push({key:s,nodeId:zc(r.element),port:i.declaredPort.port,typeDefinition:a,range:i.attribute.range}),n.set(s,l)}for(let[r,i]of n){let s=Vc(e.semantic,i,o);if(s.length<2)continue;let a=i.find(l=>l.typeDefinition.canonical===s[0]);e.report({code:u.BlackboardTypeMismatch,message:`blackboard entry \`${r}\` is used with incompatible port types: ${s.map(l=>`\`${l}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${r}\` mixes incompatible port types`,notes:i.filter(l=>s.includes(l.typeDefinition.canonical)).map(l=>`${l.nodeId}.${l.port.name} declares ${Xc(l.port,l.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),C({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Gc(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let r=e.getPortUsage(t,o.name);r?.status==="resolved"&&r.port.direction==="output"&&To(r.port.name,o.value)===void 0&&e.report({code:u.OutputPortRequiresRemap,message:`output port \`${r.port.name}\` must be remapped to a blackboard entry`,range:o.range,details:{primaryLabel:`output port \`${r.port.name}\` requires a blackboard remap`,help:`use \`${r.port.name}="{${r.port.name}}"\` or \`${r.port.name}="{some_key}"\``}})}}}}})];function $c(e,t){return e.diagnostics.some(n=>n.code===u.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function Uc(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function qc(e,t){if(!e)return;return n(e,!1,void 0);function n(o,r,i){let s=r||o.name==="TreeNodesModel",a=s&&(o.name==="Action"||o.name==="Condition"||o.name==="Control"||o.name==="Decorator"||o.name==="SubTree")?o:i;if(o===t)return a;for(let l of o.children){if(l.kind!=="element")continue;let d=n(l,s,a);if(d)return d}}}function Vc(e,t,n){let o=new Set;for(let r=0;r<t.length;r+=1){let i=t[r];if(i)for(let s=r+1;s<t.length;s+=1){let a=t[s];a&&(n&&(i.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||st(e,i.typeDefinition.canonical,a.typeDefinition.canonical)||(o.add(i.typeDefinition.canonical),o.add(a.typeDefinition.canonical)))}}return[...o].sort()}function Xc(e,t){return ct(e)??t.canonical}function zc(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Gc(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Wc=new Set(["_failureIf","_successIf","_skipIf","_while"]),Kc=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Do(e){if(Wc.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Kc.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}var Hi=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),Ji=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function Yi(e){let t=[],n=0;for(;n<e.length;){let o=e[n];if(Zi(o)){n++;continue}if(ko(o)){let a=n;for(n++;n<e.length&&Yc(e[n]);)n++;let l=e.slice(a,n);t.push({type:l==="true"||l==="false"?"Boolean":"Identifier",text:l,start:a,end:n});continue}if(Ve(o)){let a=Jc(e,n);t.push(a),n=a.end;continue}if(o==="'"){let a=Hc(e,n);t.push(a),n=a.end;continue}let r=e.slice(n,n+2),i=Hi.get(r);if(i){t.push({type:i,text:r,start:n,end:n+2}),n+=2;continue}let s=Ji.get(o);if(s){t.push({type:s,text:o,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:o,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function Hc(e,t){let n=t+1;for(;n<e.length&&e[n]!=="'";)n++;return n>=e.length?{type:"Error",text:e.slice(t),start:t,end:e.length}:{type:"String",text:e.slice(t+1,n),start:t,end:n+1}}function Jc(e,t){let n=t;if(e[n]==="0"&&(e[n+1]==="x"||e[n+1]==="X")){n+=2;let r=n;for(;n<e.length&&Zc(e[n]);)n++;return r===n||eu(e,n)?(n=jt(e,n),Ft(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Ve(e[n]);)n++;let o="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:o,text:e.slice(t,n),start:t,end:n};if(!Ve(e[n+1]))return n=jt(e,n+1),Ft(e,t,n);for(o="Real",n+=1;n<e.length&&Ve(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let r=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let i=n;for(;n<e.length&&Ve(e[n]);)n++;if(i===n)return n=jt(e,Math.max(n,r+1)),Ft(e,t,n);o="Real"}return Qc(e,n)?(n=jt(e,n),Ft(e,t,n)):{type:o,text:e.slice(t,n),start:t,end:n}}function jt(e,t){let n=t;for(;n<e.length;){let o=e[n];if(Zi(o)||Ji.has(o)||Hi.has(e.slice(n,n+2))||o==="."&&e[n+1]===".")break;n++}return n}function Ft(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Zi(e){return e===" "||e===" "||e===`
|
|
17
|
+
`||e==="\r"}function ko(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Yc(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Ve(e){return e!==void 0&&/[0-9]/.test(e)}function Zc(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Qc(e,t){let n=e[t];return ko(n)||Ve(n)}function eu(e,t){let n=e[t];return n==="."||ko(n)||Ve(n)}var tu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),nu=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),Qi=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),re={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ot(e){let t=Yi(e),n=t.filter(o=>o.type==="Error");return n.length>0?{ok:!1,errors:n.map(o=>({kind:"invalid-token",message:`invalid token \`${o.text}\``,range:{start:o.start,end:o.end}})),tokens:t}:es(t,e)}function es(e,t=""){let n=new Co(e,t),o=[];if(n.peek().type==="EndOfInput")return{ok:!1,errors:[{kind:"empty-script",message:"empty script",range:{start:0,end:0}}],tokens:e};for(;n.peek().type!=="EndOfInput";){let i=n.parseExpression(0);if(!i)return{ok:!1,errors:n.errors,tokens:e};for(o.push(i);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let r=au(o);return{ok:!0,program:{kind:"Program",statements:o,range:r},tokens:e}}var Co=class{constructor(t,n,o=0){this.tokens=t;this.source=n;this.index=o}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let o=this.peek();if(o.type==="EndOfInput"||o.type==="Semicolon"||o.type==="RightParen"||o.type==="Colon")break;let r=tu.get(o.type);if(r){if(t>=re.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:r,left:n,right:l,range:Lt(n.range,l.range)};break}if(o.type==="Question"){if(t>=re.ternary)break;this.consume();let l=this.parseExpression(0);if(!l)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let d=this.parseExpression(re.ternary);if(!d)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:d,range:Lt(n.range,d.range)};break}let i=Qi.get(o.type);if(i){if(t>=re.comparison)break;this.consume();let l=[n],d=[i],c=this.parseExpression(re.comparison);if(!c)return;for(l.push(c);;){let m=Qi.get(this.peek().type);if(!m)break;this.consume();let p=this.parseExpression(re.comparison);if(!p)return;d.push(m),l.push(p)}n={kind:"ComparisonChain",operands:l,operators:d,range:Lt(l[0].range,l[l.length-1].range)};continue}let s=nu.get(o.type),a=s?iu(o.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let l=this.parseExpression(a);if(!l)return;n={kind:"BinaryExpression",operator:s,left:n,right:l,range:Lt(n.range,l.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${o.text||o.type}\``,o);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:Xe(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),ou(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:ru(t.type),argument:n,range:Lt(Xe(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),o=this.parseExpression(0);if(!o)return;let r=this.peek();if(r.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",r);return}return this.consume(),su(o,{start:n.start,end:r.end})}default:this.reportError("expected-operand","expected operand",t);return}}peek(){return this.tokens[this.index]??this.tokens[this.tokens.length-1]}consume(){let t=this.peek();return this.index+=1,t}match(t){return this.peek().type!==t?!1:(this.consume(),!0)}reportError(t,n,o){this.errors.push({kind:t,message:n,range:Xe(o)})}};function ou(e,t){switch(e.type){case"Integer":return{kind:"Literal",valueKind:"integer",raw:t.slice(e.start,e.end),value:e.text.startsWith("0x")||e.text.startsWith("0X")?Number(e.text):Number.parseInt(e.text,10),range:Xe(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Xe(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Xe(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Xe(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function ru(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function iu(e){switch(e){case"PipePipe":return re.pipePipe;case"AmpAmp":return re.ampAmp;case"Pipe":case"Caret":return re.pipeCaret;case"Ampersand":return re.ampersand;case"Plus":case"Minus":case"DotDot":return re.additive;case"Star":case"Slash":return re.multiplicative;default:return}}function Xe(e){return{start:e.start,end:e.end}}function Lt(e,t){return{start:e.start,end:t.end}}function su(e,t){return{...e,range:t}}function au(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var lu=new Set(["int8_t","std::int8_t","int16_t","std::int16_t","int32","int32_t","std::int32_t","int64","int64_t","std::int64_t","int","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint32","uint32_t","std::uint32_t","uint64","uint64_t","std::uint64_t","uint","unsigned","unsigned int","size_t","std::size_t","float","double"]);function Io(e={}){let t=nt(e.augmentations??[]),n=e.areTypesCompatible??((i,s)=>Rt(t,i,s)),o=new Map,r={symbols:new Map,enums:du(e.enums,e.augmentations??[])};for(let i of e.symbols??[])cu(r,o,i,n);return r}function ze(e){return{symbols:new Map([...e?.symbols.entries()??[]].map(([t,n])=>[t,{...n}])),enums:new Map(e?.enums??[])}}function Eo(e){let t=ze(e.baseEnvironment),n=[];for(let o of e.entries){let r=ze(t),i=o.parseResult??Ot(o.source),s=ze(r),a;i.ok&&(a=$t({program:i.program,environment:r,attributeName:o.attributeName,originId:o.originId??String(o.id)}),s=ze(a.environment)),n.push({id:o.id,parseResult:i,environmentBefore:r,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.enums.clear();for(let[l,d]of s.symbols)t.symbols.set(l,{...d});for(let[l,d]of s.enums)t.enums.set(l,d)}return n}function ts(e){let t=new Map;for(let n of e)for(let[o,r]of Object.entries(n.script?.enums??{}))t.set(o,r);return t}function cn(e,t){let n=le(e,t);return ns(t,n)}function ns(e,t){if(!e||!t)return{kind:"unknown"};if(t.kind==="any")return{kind:"any"};let n=t.canonical.toLowerCase();return n==="bool"?{kind:"bool"}:n==="std::string"||n==="string"?{kind:"string"}:lu.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function os(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:e.kind===t.kind}function un(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:!1:e.kind==="bool"&&t.kind==="number"?!0:e.kind===t.kind}function Ge(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function No(e,t){return e.kind==="error"||t.kind==="error"?{kind:"error"}:e.kind==="unknown"||t.kind==="unknown"?{kind:"unknown"}:e.kind==="any"||t.kind==="any"?e.kind===t.kind?e:{kind:"unknown"}:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"&&e.canonical===t.canonical?e:void 0:e.kind===t.kind?e:void 0}function du(e,t){if(e instanceof Map)return new Map(e);let n=ts(t??[]);for(let[o,r]of Object.entries(e??{}))n.set(o,r);return n}function cu(e,t,n,o){let r=e.symbols.get(n.name);if(!r){e.symbols.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let i=t.get(n.name),s=r.conflict===!0||i!==void 0&&n.compatibilityKey!==void 0&&!o(i,n.compatibilityKey)||!os(r.type,n.type);e.symbols.set(n.name,{...r,readable:r.readable||n.readable,writable:r.writable||n.writable,conflict:s}),i===void 0&&t.set(n.name,n.compatibilityKey)}var We={kind:"number"},mn={kind:"string"},pn={kind:"bool"},Ee={kind:"unknown"},G={kind:"error"};function $t(e){let t=ze(e.environment),n=[],o=[],r=[],i=[],s=[],a=[];return e.program.statements.forEach((l,d)=>{a.push(ye({expression:l,statementIndex:d,environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:r,introducedSymbols:i,diagnostics:s,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:r,introducedSymbols:i,diagnostics:s,statementTypes:a,finalType:a.at(-1)}}function ye(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?We:t.valueKind==="string"?mn:t.valueKind==="boolean"?pn:Ee;case"Identifier":return pu(e,t.name,t.range);case"UnaryExpression":{let n=ye({...e,expression:t.argument});return t.operator==="!"?Ge(n)?pn:(ue(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a bool-compatible operand`,`operand for \`${t.operator}\` is not bool-compatible`,"use a boolean, number, or unknown-compatible expression here"),G):n.kind==="number"?We:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?G:Ee:(ue(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a numeric operand`,`operand for \`${t.operator}\` is not numeric`,"use a number expression here"),G)}case"BinaryExpression":{let n=ye({...e,expression:t.left}),o=ye({...e,expression:t.right});switch(t.operator){case"&&":case"||":return rs(n)||rs(o)?(ue(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires bool-compatible operands`,`operands for \`${t.operator}\` are not bool-compatible`,"use boolean or numeric expressions here"),G):pn;case"+":return n.kind==="string"&&o.kind==="string"?mn:n.kind==="number"&&o.kind==="number"?We:Po(n,o)?Ee:(wo(e,t.range,t.operator),G);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&o.kind==="number"?We:Po(n,o)?Ee:(wo(e,t.range,t.operator),G);case"..":return n.kind==="string"&&(o.kind==="string"||o.kind==="number")||o.kind==="string"&&(n.kind==="string"||n.kind==="number")?mn:Po(n,o)?Ee:(wo(e,t.range,t.operator),G)}return Ee}case"ComparisonChain":{let n=t.operands.map(o=>ye({...e,expression:o}));for(let o=0;o<t.operators.length;o+=1){let r=t.operators[o],i=n[o],s=n[o+1];if(!fu(r,i,s))return ue(e,"invalid-operand-type",{start:t.operands[o]?.range.start??t.range.start,end:t.operands[o+1]?.range.end??t.range.end},`operator \`${r}\` cannot compare these operand types`,`comparison operands for \`${r}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),G}return pn}case"ConditionalExpression":{let n=ye({...e,expression:t.condition});Ge(n)||ue(e,"invalid-operand-type",t.condition.range,"ternary condition must be bool-compatible","ternary condition is not bool-compatible","use a boolean or numeric condition expression here");let o=ye({...e,expression:t.thenExpression}),r=ye({...e,expression:t.elseExpression}),i=No(o,r);return i||(ue(e,"invalid-operand-type",t.range,"ternary branches must produce compatible types","then and else branches have incompatible types","return the same type from both ternary branches"),G)}case"AssignmentExpression":return uu(e)}}function uu(e){let{environment:t,attributeName:n,identifiers:o,introducedSymbols:r}=e,i=e.expression,s=ye({...e,expression:i.right});if(i.left.kind!=="Identifier")return ye({...e,expression:i.left}),ue(e,"invalid-operand-type",i.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),G;let a=i.left,l=i.operator===":="?"declare":i.operator==="="?"write":"readwrite",d={name:a.name,kind:l,range:a.range,identifier:a,statementIndex:e.statementIndex};o.push(d);let c=t.symbols.get(a.name);if(i.operator===":="&&!c){let p={name:a.name,type:s,source:{kind:"script-assignment",attributeName:n,range:a.range,originId:e.originId},readable:!0,writable:!0};return t.symbols.set(a.name,p),e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:p}}),r.push(p),s}if(!c)return e.resolvedIdentifiers.push({access:d,resolution:{kind:"unknown"}}),ue(e,"assignment-to-unknown-variable",a.range,`assignment target \`${a.name}\` is not defined`,`\`${a.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),G;if(e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:c}}),i.operator==="=")return un(c.type,s)?(Mo(c,s),s):(is(e,a,c.type,s),G);if(i.operator===":=")return un(c.type,s)?(Mo(c,s),s):(is(e,a,c.type,s),G);let m=mu(c.type,s,i.operator);return m?(Mo(c,m),m):(ue(e,"invalid-compound-assignment",i.range,`operator \`${i.operator}\` is not valid for these operand types`,`compound assignment \`${i.operator}\` is not allowed here`,i.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),G)}function pu(e,t,n){let o={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(o);let r=e.environment.enums.get(t);if(r!==void 0)return e.resolvedIdentifiers.push({access:o,resolution:{kind:"enum",name:t,value:r}}),We;let i=e.environment.symbols.get(t);return i?(e.resolvedIdentifiers.push({access:o,resolution:{kind:"symbol",symbol:i}}),i.type):(e.resolvedIdentifiers.push({access:o,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(o),Ee)}function mu(e,t,n){return e.kind==="error"||t.kind==="error"?G:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?Ee:n==="+="?e.kind==="number"&&t.kind==="number"?We:e.kind==="string"&&t.kind==="string"?mn:void 0:e.kind==="number"&&t.kind==="number"?We:void 0}function Po(e,t){return fn(e)||fn(t)}function fn(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function rs(e){return!Ge(e)}function fu(e,t,n){return fn(t)||fn(n)?!0:e==="=="||e==="!="?t.kind==="custom"||n.kind==="custom"?t.kind==="custom"&&n.kind==="custom"&&t.canonical===n.canonical:t.kind===n.kind:t.kind==="custom"||n.kind==="custom"?!1:t.kind==="number"&&n.kind==="number"||t.kind==="string"&&n.kind==="string"}function wo(e,t,n){ue(e,"invalid-operand-type",t,`operator \`${n}\` cannot be applied to these operand types`,`operands for \`${n}\` are not compatible`,"use operands with the types required by this operator")}function is(e,t,n,o){ue(e,"variable-type-mismatch",t.range,`cannot assign ${Bo(o)} to variable \`${t.name}\` of type ${Bo(n)}`,`\`${t.name}\` expects ${Bo(n)} here`,"assign a compatible value or change the variable's source type")}function Mo(e,t){e.source.kind==="script-assignment"&&(e.type.kind!=="unknown"&&e.type.kind!=="error"||t.kind==="unknown"||t.kind==="any"||t.kind==="error"||(e.type=t))}function ue(e,t,n,o,r,i){e.diagnostics.push({code:t,range:n,message:o,details:{primaryLabel:r,help:i}})}function Bo(e){return e.kind==="custom"?e.name:e.kind}var ss=new WeakMap;function gn(e,t){let n=e.getNodeUsage(t),o=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(r=>{let i=Do({elementName:t.name,attributeName:r.name,resolvedNodeType:o});return i?[{attribute:r,info:i,parseResult:Ot(r.value)}]:[]})}function pe(e,t,n){return vo(e.document,t,n)}function as(e){return{start:0,end:e.value.length}}function Ae(e,t){let n=e.getTreeNodeView(t),o=n?.behaviorTree;return!n||!o?gn(e,t).map(r=>{let i=ls(e,[]);return{...r,environment:i,analysis:r.parseResult.ok?$t({program:r.parseResult.program,environment:i,attributeName:r.attribute.name}):void 0}}):gu(e,o).filter(r=>r.node.element===t).map(r=>({...r.candidate,environment:r.environmentBefore,analysis:r.analysis}))}function gu(e,t){let n=ss.get(e.view);n||(n=new WeakMap,ss.set(e.view,n));let o=n.get(t);if(o)return o;let r=t.nodes.flatMap(s=>gn(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),i=Eo({baseEnvironment:ls(e,t.nodes),entries:r.map(s=>({id:s.id,source:s.candidate.attribute.value,attributeName:s.candidate.attribute.name,originId:s.id,parseResult:s.candidate.parseResult}))}).flatMap((s,a)=>{let l=r[a];return l?[{...s,node:l.node,candidate:l.candidate}]:[]});return n.set(t,i),i}function ls(e,t){let n=de(e.semantic),o=[],r=t[0]?.behaviorTree.id;if(r){let i=e.getNodeModel(r);if(i?.kind==="SubTree")for(let s of i.ports){let a=ct(s),d=Ie(e.semantic,a)?.canonical??a;o.push({name:s.name,type:cn(n,a),source:{kind:"subtree-port",nodeType:r,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:d})}}for(let i of t){let s=i.usage.model.status==="resolved"?i.usage.model.model.id:i.usage.nodeType;for(let a of i.portBindings){if(a.usage.status!=="resolved")continue;let l=ke(a.usage.port.name,a.usage.value);if(!l)continue;let d=ct(a.usage.port),m=Ie(e.semantic,d)?.canonical??d,p=a.usage.port.direction;o.push({name:l,type:cn(n,d),source:{kind:"port-remap",nodeType:s,portName:a.usage.port.name,direction:p},readable:p==="input"||p==="output"||p==="inout",writable:p==="output"||p==="inout",compatibilityKey:m})}}return Io({symbols:o,augmentations:po(e.semantic),areTypesCompatible:(i,s)=>i&&s?st(e.semantic,i,s):!0})}var ds=C({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Ae(e,t))if(n.analysis)for(let o of n.analysis.unknownIdentifiers)e.report({code:u.UnknownScriptVariable,message:`unknown script variable \`${o.name}\``,range:pe(e,n.attribute,o.range),details:{primaryLabel:`\`${o.name}\` is not defined in the script environment`,help:"introduce it earlier with `:=`, add a matching blackboard remap, or define a script enum in btxml.model-augment.json"}})}}}});var cs=C({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Ae(e,t))if(n.analysis)for(let o of n.analysis.diagnostics){let r=o.code==="assignment-to-unknown-variable"?u.AssignmentToUnknownVariable:o.code==="invalid-compound-assignment"?u.InvalidCompoundAssignment:o.code==="variable-type-mismatch"?u.ScriptVariableTypeMismatch:void 0;r&&e.report({code:r,message:o.message,range:pe(e,n.attribute,o.range),details:o.details})}}}}});var us=C({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Ae(e,t))if(n.analysis)for(let o of n.analysis.diagnostics)o.code==="invalid-operand-type"&&e.report({code:u.InvalidScriptOperandType,message:o.message,range:pe(e,n.attribute,o.range),details:o.details})}}}});var ps=C({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Ae(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let o=n.parseResult.program.statements.at(-1),r=n.analysis.finalType;!o||!r||Ge(r)||e.report({code:u.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:pe(e,n.attribute,o.range),details:{primaryLabel:"script result is not bool-compatible here",help:"return a boolean or numeric expression, or move side effects into a postcondition/script node"}})}}}}});var ms=C({name:"script/valid-syntax",create(e){return{Element(t){for(let n of gn(e,t))if(!n.parseResult.ok)for(let o of n.parseResult.errors){let r=o.kind==="empty-script"?u.EmptyScript:o.kind==="invalid-token"?u.InvalidScriptToken:u.InvalidScriptSyntax;e.report({code:r,message:o.message,range:o.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??pe(e,n.attribute,as(n.attribute)):pe(e,n.attribute,o.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var fs=[ms,ds,cs,us,ps];var yu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function gs(e){return C({name:yu[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:hu(n)})}}}})}function hu(e){return e.code?{code:e.code}:void 0}var ys=[gs("unused"),gs("missing-reason")];function yn(e,t){return e.attributes.find(n=>n.name===t)}var hs=[C({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||yn(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),C({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Nt(e.semantic,e.document.uri);for(let o of n?.behaviorTrees??[])o.idRange&&(t.has(o.id)&&e.report({message:`Duplicate BehaviorTree ID: ${o.id}`,range:o.idRange}),t.add(o.id))}}}}),C({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of at(e.semantic)){let n=ge(e.semantic,t);if(n.length<=1||new Set(n.map(i=>i.uri)).size<=1)continue;let r=n.filter(i=>i.uri===e.document.uri);r.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:r[0]?.idRange})}}}}}),C({name:"tree/no-unknown-main-tree",create(e){return{Document(){let t=e.document.root;if(e.document.kind!=="bt-document"||!t)return;let n=yn(t,"main_tree_to_execute");!n?.value||so(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),C({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=e.getSubTreeCallView(t),o=n?.node.element.attributes.find(i=>i.name==="ID")??yn(t,"ID");!o||n?.target.status==="resolved"||e.resolveSubTree(o.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${o.value}\``,range:o.valueContentRange||o.valueRange})}}}}),C({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=yn(t,"ID");if(!n||e.getSubTreeCallView(t)?.target.status==="resolved")return;let r=e.resolveSubTree(n.value,e.document.uri);r.status!=="ambiguous"||r.behaviorTrees.length<=1||e.report({message:`ambiguous subtree \`${n.value}\``,range:n.valueContentRange||n.valueRange})}}}}),C({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var bu=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Su(e,t){return e===t?String(e):`${e}\u2013${t}`}var bs=C({name:"model/valid-child-count",create(e){return{Element(t){if(ce(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&vu(e,t,n.model.model.id,n.model.model.kind)}}}});function vu(e,t,n,o){let r=Ui(t).length,i=bu.get(n);if(i){if(r<i.min||r>i.max){let s=Su(i.min,i.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${r}.`,range:t.range})}return}if(o==="Action"||o==="Condition"){r>0&&e.report({message:`${o} node \`${n}\` must not have child nodes, but has ${r}.`,range:t.range});return}if(o==="Decorator"){r!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${r}.`,range:t.range});return}if(o==="Control"){r<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}o==="SubTree"&&r>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${r}.`,range:t.range})}var Ss=C({name:"model/valid-port-value",create(e){return{Element(t){if(ce(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let r=e.getPortUsage(t,o.name);r?.status==="resolved"&&dn(e,{port:r.port,value:o.value,range:o.range,registry:de(e.semantic),typeDefinition:Ie(e.semantic,r.port.type),allowRemap:!0,diagnosticCode:u.InvalidPortValueType,customLiteralDiagnosticCode:u.CustomLiteralRequiresValidator,portLabel:o.name})}}}}});var vs=C({name:"model/require-port",create(e){return{Element(t){if(ce(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of n.ports)!o.required||n.portUsages.some(i=>i.name===o.name&&i.status==="resolved")||e.report({message:`missing required port \`${o.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${o.name}\``:`SubTree requires port \`${o.name}\``,help:`add \`${o.name}="..."\` or provide a blackboard reference such as \`${o.name}="{value}"\``}:void 0})}}}});var xs=[C({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(ce(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let o=n.model.model.kind;o!=="Control"&&o!=="Decorator"||e.report({message:`${o} node \`${n.model.model.id}\` normally expects child nodes.`,range:t.range})}}}}),C({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(ce(t)||t.selfClosing||qi(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let o=n.model.model.kind;o!=="Action"&&o!=="Condition"&&o!=="SubTree"||e.report({message:`${o} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var Rs=C({name:"model/no-unknown-node",create(e){return{Element(t){let n=e.getNodeUsage(t);if(n.tagForm==="root"||n.tagForm==="behavior-tree"||n.tagForm==="tree-nodes-model"||n.tagForm==="include"||n.tagForm==="model-definition"||n.tagForm==="subtree"||n.tagForm==="unknown-xml"||n.model.status==="resolved"||n.model.status==="ambiguous")return;let o=t.attributes.find(r=>r.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:o?.valueContentRange??o?.valueRange??t.range})}}}});var Ts=C({name:"model/no-unknown-port",create(e){return{Element(t){if(ce(t))return;let n=e.getNodeUsage(t);for(let o of n.portUsages){if(o.status!=="undeclared")continue;let r=n.ports.map(s=>s.name).sort(),i=r.length>=1&&r.length<=8?[`note: defined ports: ${r.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${o.name}\``,range:o.attribute.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` does not define this port`:"SubTree does not define this port in strict mode",help:n.model.status==="resolved"?`remove \`${o.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${o.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:i}:void 0})}}}}});var Ds=[Rs,Ts,vs,Ss,...xs,bs];function xu(e,t){return e.attributes.find(n=>n.name===t)}function Ru(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var ks=[C({name:"xml/valid-root",create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||t.name==="root"||e.report({message:"Root element must be <root>",range:t.range})}}}}),{name:"xml/require-btcpp-format",code:u.MissingBTCPPFormat,defaultSeverity:"error",meta:{description:'Root element must declare BTCPP_format="4".'},create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||xu(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},C({name:"xml/no-unknown-top-level-element",meta:{description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},create(e){return{Element(t){let n=e.document.root;e.document.kind!=="bt-document"||!n||t===n||!n.children.includes(t)||Ru(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var _o=[...ks,...fs,...hs,...Ki,...Ds,...Oi,...ys],Db=new Map(_o.map(e=>[e.name,e]));function Cs(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Is(e,t){return Ce(e.linter.rules[t])?.options??{}}function Es(e){let t=Ce(e.config.linter.rules[e.rule]);return Cs(t?t.severity:e.defaultSeverity)}function Ns(e){let t=[],n=e.facts??Ai(),o=e.rules?new Set(e.rules):void 0,r=[];for(let s of _o){if(o&&!o.has(s.name))continue;let a=Es({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=Is(e.config,s.name),d=s.optionsSchema?.safeParse(l),c=d?.success?d.data:l,m=Li({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:c,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});r.push(s.create(m))}for(let s of r)s.Document?.();e.document.root&&Ps(e.document.root,r);let i=Nt(e.semantic,e.document.uri);for(let s of i?.treeNodesModel??[])for(let a of r)a.TreeNodeModel?.(s);for(let s of r)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>Tu(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function Ps(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Ps(n,t)}function Tu(e,t){let n=e.range,o=t.range;return!n&&!o?0:n?o?n.start.line-o.start.line||n.start.character-o.start.character||n.end.line-o.end.line||n.end.character-o.end.character:-1:1}function Ao(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let o=[...e.diagnostics],r=n.documentView??Me(e,{semantic:t,config:n.config,policy:fe(n.config)});return o.push(...Ns({document:e,view:r,semantic:t,config:n.config})),o}import Ko from"path";function Du(e){return e.endsWith("/")?e:`${e}/`}function ku(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):jo(e.split("/"))}function jo(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function Ke(e,t={}){let n=e.replace(/\\/g,"/"),o=s=>ku(s,t.preserveDotSegments),r=/^(?<scheme>[A-Za-z][A-Za-z\d+.-]*):\/\/(?<authority>[^/]*)(?<path>\/.*)?$/.exec(n);if(r?.groups)return{scheme:r.groups.scheme,authority:r.groups.authority,absolute:!0,segments:o(r.groups.path||"/")};let i=/^(?<drive>[A-Za-z]:)(?<rest>\/.*)?$/.exec(n);return i?.groups?{authority:i.groups.drive,absolute:!0,segments:o(i.groups.rest||"/")}:{absolute:n.startsWith("/"),segments:o(n)}}function hn(e){let n=jo(e.segments).join("/");if(e.scheme){let o=`${e.scheme}://${e.authority??""}`;return n?`${o}/${n}`:`${o}/`}return e.authority&&e.absolute?n?`${e.authority}/${n}`:`${e.authority}/`:e.absolute?n?`/${n}`:"/":n}function Cu(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Ut(e){return hn(Ke(e))}function Iu(e,...t){let n=Ke(e),o=[...n.segments];for(let r of t){let i=Ke(r,{preserveDotSegments:!0});if(i.scheme||i.absolute&&i.authority)return Ut(r);i.absolute&&(o.length=0),o.push(...i.segments)}return hn({...n,segments:jo(o)})}function Eu(e){let t=Ke(e);return t.segments.length===0?hn(t):hn({...t,segments:t.segments.slice(0,-1)})}function Nu(e){return Ke(e).segments.at(-1)??""}function Pu(e,t){let n=Ke(e),o=Ke(t);if(!Cu(n,o))return Ut(t);let r=0;for(;r<n.segments.length&&r<o.segments.length&&n.segments[r]===o.segments[r];)r+=1;let i=new Array(n.segments.length-r).fill(".."),s=o.segments.slice(r);return[...i,...s].join("/")}function wu(e,t){let n=Du(Ut(e)),o=Ut(t);return o===n.slice(0,-1)||o.startsWith(n)}var K={normalize:Ut,join:Iu,dirname:Eu,basename:Nu,relative:Pu,isWithin:wu};function he(e,...t){return K.join(e,...t)}function ws(e){return K.dirname(e)}function Ms(e){return K.basename(e)}function je(e,t){return K.relative(e,t)}function Bs(e,t){return K.isWithin(e,t)}async function js(e,t,n){let o=e;for(;;){for(let i of t){let s=K.join(o,i);if(await n.exists(s))return s}let r=K.dirname(o);if(r===o)return;o=r}}async function Mu(e,t){return js(e,["btxml.config.json"],t)}async function _s(e,t){return JSON.parse(await t.readFile(e))}function As(e,t){return e.map(n=>E(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function Fs(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await Mu(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[E("CFG006_CONFIG_PATH_NOT_FOUND",h.Error,`config file not found \`${t}\``,void 0,t,{help:"check the `--config` path or run without `--config` to use config discovery"})]};try{n=await _s(t,e.host)}catch(i){let s=String(i.message||i);return{ok:!1,configUri:t,diagnostics:[E("CFG001_INVALID_CONFIG_JSON",h.Error,"invalid configuration JSON",void 0,t,{primaryLabel:"the config file could not be parsed as JSON",help:"fix the JSON syntax in the config file",notes:[s]})]}}}else{let i=await js(e.startUri,["package.json"],e.host);if(i)try{let s=await _s(i,e.host);s.btxml&&(n=s.btxml,t=i)}catch{n={}}}let o=rt(n);if(!o.ok)return{ok:!1,configUri:t,diagnostics:As(o.diagnostics,t)};let r=to(o.value);return r.length>0?{ok:!1,configUri:t,diagnostics:As(r,t)}:{ok:!0,config:o.value,configUri:t,diagnostics:[]}}import Bu from"ignore";function Fo(e){return e.replace(/\\/g,"/")}function U(e,t){return Fo(je(e,t))}function _u(e){let t=e.replace(/\\/g,"/"),n="^";for(let o=0;o<t.length;o+=1){let r=t[o],i=t[o+1],s=t[o+2];if(r==="*"&&i==="*"&&s==="/"){n+="(?:.*/)?",o+=2;continue}if(r==="*"&&i==="*"){n+=".*",o+=1;continue}if(r==="*"){n+="[^/]*";continue}if(r==="?"){n+="[^/]";continue}".+-^${}()|[]\\".includes(r)?n+=`\\${r}`:n+=r}return n+="$",new RegExp(n)}function Fe(e,t){let n=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||Ms(n)===o:_u(o).test(n)}function Au(e){return e.includes("*")||e.includes("?")}async function Ls(e,t,n,o,r,i,s,a){let l=U(n,t);if(l&&o.some(c=>Fe(l,c)||Fe(`${l}/`,c)||Fe(`${l}/dummy`,c))||a&&l&&a.ignores(l))return;let d;try{d=await e.readDir(t)}catch{return}for(let c of d){let m=he(t,c.name),p=c.type==="directory",g=c.type==="file";if(c.type==="other"&&i&&e.realpath)try{let y=await e.realpath(m);if(s.has(y))continue;s.add(y);let f=await e.stat(y);p=f?.type==="directory",g=f?.type==="file"}catch{continue}p?await Ls(e,m,n,o,r,i,s,a):g&&r.push(m)}}async function qt(e,t,n,o,r,i,s){let a=new Set,l=new Set,d=[],c=r??t;for(let p of e){let g=he(c,p);if((await s.stat(g))?.type==="file"){let y=U(t,g),f=!y.startsWith("..");!n.some(x=>Fe(y,x))&&(!f||!i?.ignores(y))&&a.add(g);continue}if(!Au(p)){l.add(p);continue}d.push(p)}let m=[];if(d.length>0&&await s.exists(t)){let p=new Set([s.realpath?await s.realpath(t):t]);await Ls(s,t,t,n,m,o,p,i)}for(let p of m){let g=U(c,p);d.some(y=>Fe(g,y))&&(n.some(y=>Fe(U(t,p),y))||i?.ignores(U(t,p))||a.add(p))}for(let p of d)m.some(y=>{let f=U(c,y);return Fe(f,p)&&!n.some(x=>Fe(U(t,y),x))&&!i?.ignores(U(t,y))})||l.add(p);return{files:[...a].sort((p,g)=>U(t,p).localeCompare(U(t,g))),unmatchedPatterns:[...l].sort()}}async function Lo(e,t){let n=he(e,".gitignore");return await t.exists(n)?(await t.readFile(n)).split(/\r?\n/).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")):[]}function Oo(e){return Bu().add(e)}async function Os(e,t,n,o,r){let i=[...t.ignore],s=t.useGitignore?await Lo(e,r):[],a=Oo(s),l=n?.length?n:t.include,d=await qt(l,e,i,t.followSymlinks,n?.length?o:void 0,a,r),c=t.maxSize,m=[],p=[];for(let g of d.files){let y=U(e,g),f=await r.stat(g);if(f){if((f.size??0)>c){p.push({path:y,reason:"too-large"});continue}m.push({path:y,uri:g,kind:"unknown"})}}return{selectedFiles:m,skippedFiles:p,unmatchedPatterns:d.unmatchedPatterns}}function $s(e){return e.entrypoints.map(t=>({file:Fo(t)}))}function $o(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function Us(e,t,n,o){let r=[];for(let i of t)await o.exists(he(e,i.file))||r.push(E(u.EntrypointNotFound,h.Error,`entrypoint file not found \`${i.file}\``,void 0,n,{help:"check `resolver.entrypoints` and make sure the file exists under the project root"}));return r}async function qs(e,t,n,o){let r=[...n.ignore],i=n.useGitignore?await Lo(e,o):[],s=Oo(i),a=await qt(t.files,e,r,n.followSymlinks,void 0,s,o),l=await qt(t.definitions,e,r,n.followSymlinks,void 0,s,o),d=await qt(t.augmentations,e,r,n.followSymlinks,void 0,s,o),c=a.files.map(g=>({path:U(e,g),uri:g,kind:"model-xml"})),m=l.files.map(g=>({path:U(e,g),uri:g,kind:"node-definition"})),p=d.files.map(g=>({path:U(e,g),uri:g,kind:"model-augmentation"}));return{modelFiles:c,augmentationFiles:p,definitionFiles:m,unmatchedPatterns:{models:a.unmatchedPatterns,augmentations:d.unmatchedPatterns,definitions:l.unmatchedPatterns}}}function Uo(e){return e.rootUri}function qo(e){return e.configUri}function Vo(e){return e.config}function He(e){return e.resolvedConfig}function Xo(e){return e.selectedFiles.map(t=>({...t}))}function zo(e){return e.modelFiles.map(t=>({...t}))}function Go(e){return e.definitionFiles.map(t=>({...t}))}function Wo(e){return e.skippedFiles.map(t=>({...t}))}async function ju(e){if(e.configUri)return K.dirname(e.configUri);let t=e.startUri;for(;;){if(await e.host.exists(K.join(t,".git"))||await e.host.exists(K.join(t,".colcon")))return t;let n=K.dirname(t);if(n===t)return e.startUri;t=n}}async function Vs(e){let t=await Fs({startUri:e.rootUri,configUri:e.configUri,noConfig:e.noConfig,host:e.host});if(!t.ok||!t.config)return{ok:!1,diagnostics:t.diagnostics};let n=Yt(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let o=n.config,r=await ju({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:i,skippedFiles:s}=await Os(r,o.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?U(r,t.configUri):"",d=$s(o.resolver);for(let f of d){let x=K.join(r,f.file);await e.host.exists(x)&&!i.some(b=>b.uri===x)&&i.push({path:f.file,uri:x,kind:"bt-xml"})}let{modelFiles:c,augmentationFiles:m,definitionFiles:p,unmatchedPatterns:g}=await qs(r,o.models,o.files,e.host);for(let f of g.models)a.push(E(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${f}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let f of g.definitions)a.push(E(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${f}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let f of g.augmentations)a.push(E(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${f}\``,void 0,l,{help:"check `models.augmentations` and make sure the file exists"}));let y=o.models.builtins;return a.push(...await Us(r,d,l,e.host)),{ok:!0,diagnostics:a,project:{rootUri:r,configUri:t.configUri,host:e.host,config:t.config,resolvedConfig:o,selectedFiles:i,entrypoints:d,modelFiles:c,augmentationFiles:m,definitionFiles:p,skippedFiles:s,modelsBuiltins:y}}}import{constants as Ou}from"fs";import Vt from"fs/promises";import $u from"path";import Xs from"path";import{fileURLToPath as Fu,pathToFileURL as zs}from"url";function Lu(e){return e.startsWith("file://")?e:zs(Xs.resolve(e)).href}function ee(e){return Fu(Lu(e))}function Je(e){return zs(Xs.resolve(e)).href}function Uu(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function Ne(e=process.cwd(),t={}){let n=$u.resolve(e),o=Je(n);return{rootUri(){return o},async readFile(r){return Vt.readFile(ee(r),"utf8")},async exists(r){try{return await Vt.access(ee(r),Ou.F_OK),!0}catch(i){if(i.code!=="ENOENT")throw i;return!1}},async stat(r){try{let i=await Vt.stat(ee(r));return{type:Uu(i),size:i.size}}catch{return}},async readDir(r){return(await Vt.readdir(ee(r),{withFileTypes:!0})).map(s=>({name:s.name,type:s.isFile()?"file":s.isDirectory()?"directory":"other"}))},async realpath(r){return Je(await Vt.realpath(ee(r)))},async resolvePackageUri(r){return t.resolvePackageUri?.(r)}}}async function Ho(e={}){let t=Ko.resolve(e.cwd??process.cwd()),n=e.projectRoot?Ko.resolve(t,e.projectRoot):t,o=Ne(n,e.hostOptions);return Vs({rootUri:Je(n),host:o,configUri:e.configPath?Je(Ko.resolve(t,e.configPath)):void 0,noConfig:e.noConfig,cliFiles:e.cliFiles,command:e.command})}var Gs={InvalidJson:u.InvalidAugmentationJson,InvalidSchema:u.InvalidAugmentationSchema};function qu(e){return E(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function Vu(e,t){return t.issues.map(n=>qu({filePath:e,code:n.kind==="json"?Gs.InvalidJson:Gs.InvalidSchema,message:n.kind==="json"?`invalid augmentation JSON \`${e}\``:`invalid augmentation schema \`${e}\``,range:n.range,primaryLabel:n.message,help:n.kind==="json"?`fix the JSON syntax in \`${e}\``:n.path?`fix the schema issue at \`${n.path}\``:"fix the schema issue in the file",notes:n.notes}))}async function bn(e){let t=e.project,n=e.host??t.host,o=[],r=[];for(let i of t.augmentationFiles){if(!await n.exists(i.uri)){o.push(E(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${i.path}\``,void 0,i.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(i.uri),a=Jn(s,{uri:i.uri,path:i.path});if(!a.ok){o.push(...Vu(i.path,a));continue}r.push(a.data)}return{ok:o.every(i=>i.severity!==h.Error),augmentations:r,diagnostics:o}}function Xu(e){let t=e.root;if(!t)return;if(t.name==="TreeNodesModel")return{...e,kind:"model-document",isBtXml:!0};let n=t.children.find(r=>r.kind==="element"&&r.name==="TreeNodesModel");if(!n)return;let o=e.nodes.flatMap(r=>r===t?t.children.filter(i=>i===n||i.kind==="comment"):r.kind==="comment"?[r]:[]);return{...e,kind:"model-document",root:n,nodes:o,isBtXml:!0}}async function zu(e,t){return Be(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function Jo(e,t){if(!await t.exists(e.uri))return{diagnostics:[E(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${e.path}\``,void 0,e.path,{help:"check `models.files` and make sure the file exists"})]};let n=await zu(e,t);if(!n.document||n.diagnostics.some(r=>r.severity===h.Error)){let r=n.diagnostics[0];return{diagnostics:[E(u.ExternalModelXmlParseError,h.Error,`failed to parse external TreeNodesModel file \`${e.path}\``,n.diagnostics[0]?.range,e.path,{primaryLabel:"the external model file is not valid XML",help:`fix the XML syntax in \`${e.path}\` before using it as an external model file`,notes:r?[`first XML error: ${r.code} ${r.message}`]:void 0})]}}let o=Xu(n.document);return o?{document:o,diagnostics:[]}:{diagnostics:[E(u.MissingTreeNodesModel,h.Error,"missing `<TreeNodesModel>` in external model file",n.document.root?.range,e.path,{primaryLabel:"this file does not contain a `<TreeNodesModel>` element",help:"add a `<TreeNodesModel>` element or remove the file from `models.files`"})]}}async function H(e,t){let n=e,o=t??n.host,r=[];for(let d of n.selectedFiles){if(!await o.exists(d.uri))continue;let c=await o.readFile(d.uri),m=Be(c,{uri:d.uri,path:d.path});m.document&&r.push(m.document)}let i=await Promise.all(n.modelFiles.map(d=>Jo(d,o))),s=await bn({project:e,host:o}),a=i.flatMap(d=>d.diagnostics),l=i.flatMap(d=>d.document?[d.document]:[]);return{documents:r,externalModelDocuments:l,augmentations:[...s.augmentations],diagnostics:[...a,...s.diagnostics]}}function Ws(e,t){return e.attributes.find(n=>n.name===t)}function Ks(e,t){return je(e,t).replace(/\\/g,"/")}function Gu(e,t,n,o,r){return e.replace(/\$\{([^}]+)\}/g,(i,s)=>s.startsWith("env:")?process.env[s.slice(4)]??i:t[s]!==void 0?t[s]:(n.push({kind:"unresolved-variable",uri:r,variable:s,range:o,message:`unresolved include path variable \`${s}\``}),i))}function Wu(e,t){let n=t.resolvedConfig.resolver.includes.elements.map(i=>({name:i.name,pathAttribute:i.attribute,base:i.base==="project-root"?"project-root":"current-file"})),o=e.root;if(!o)return[];let r=[];for(let i of o.children||[]){if(i.kind!=="element")continue;let s=n.find(a=>a.name===i.name);s&&r.push({element:i,pathAttr:Ws(i,s.pathAttribute),rosPackageAttr:Ws(i,"ros_pkg"),base:s.base??"current-file"})}return r}async function Hs(e){let t=e.project,n=e.host??t.host,o=e.resolvedConfig.resolver.includes.allowOutsideRoot,r=e.resolvedConfig.resolver.includes.maxDepth,i=e.resolvedConfig.resolver.includes.maxFiles,s=[],a=new Map(e.documents.map(f=>[Ks(t.rootUri,f.path||f.uri),f])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},d=new Map,c=new Set,m=t.entrypoints.length?t.entrypoints.map(f=>f.file):t.selectedFiles.map(f=>f.path);l.entrypointFiles=[...new Set(m)];let p=new Set,g=new Set,y=async(f,x,b)=>{if(x.length>=r){s.push({kind:"depth-exceeded",uri:b?.uri??f,path:f,range:b?.range,message:`include \`${f}\` exceeds the configured maximum include depth`});return}if(l.reachableFiles.size>=i){s.push({kind:"too-many-files",uri:b?.uri??f,path:f,range:b?.range,message:`resolving \`${f}\` would exceed the configured file limit`});return}let v=f.replaceAll("\\","/");if(p.has(v)){let M=[...x.slice(x.indexOf(v)),v];l.cycles.push({files:M}),s.push({kind:"cycle",uri:b?.uri??v,path:v,cycle:M,range:b?.range,message:"include cycle detected"});return}if(g.has(v))return;p.add(v),l.reachableFiles.add(v);let D=he(t.rootUri,v);c.add(D);let P=await n.exists(D),A=a.get(v);!A&&P&&(A=Be(await n.readFile(D),{uri:D,path:v}).document,A&&a.set(v,A)),l.nodes.set(v,{path:v,document:A,exists:P}),A&&d.set(A.uri,A);let _=A?.uri??D;if(!P){s.push({kind:"not-found",uri:b?.uri??_,path:v,range:b?.range,message:`include file not found \`${v}\``}),p.delete(v);return}if(!A){p.delete(v);return}for(let M of Wu(A,e)){if(!M.pathAttr){s.push({kind:"missing-path",uri:_,range:M.element.range,message:"missing include path"});continue}let Te=Gu(M.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,M.pathAttr.range,_),Z;if(M.rosPackageAttr){let I=M.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:_,packageName:I,range:M.rosPackageAttr.range,message:`include uses ros_pkg=\`${I}\` but ProjectHost.resolvePackageUri is not available`});continue}let B=await n.resolvePackageUri(I);if(!B){s.push({kind:"ros-package-not-found",uri:_,packageName:I,path:Te,range:M.rosPackageAttr.range,message:`ROS package \`${I}\` could not be resolved for include path \`${Te}\``});continue}Z=he(B,Te)}else{let I=M.base==="project-root"?t.rootUri:ws(D);Z=he(I,Te)}let L=Ks(t.rootUri,Z),S=Z;try{await n.exists(Z)&&(S=n.realpath?await n.realpath(Z):Z)}catch{}if(!Bs(t.rootUri,S)){if(!o){s.push({kind:"outside-root",uri:_,path:L,range:M.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:_,path:L,range:M.pathAttr.range,message:`external include used \`${Te}\``})}l.edges.push({from:v,to:L,includeElementRange:M.element.range,includePathRange:M.pathAttr.range}),await y(L,[...x,v],{uri:_,range:M.pathAttr.range})}p.delete(v),g.add(v)};for(let f of l.entrypointFiles)await y(f,[]);return{graph:l,reachableUris:c,reachableDocuments:d,issues:s}}import{findNodeAtLocation as Js,parse as Ku,parseTree as Hu}from"jsonc-parser";function Ju(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
18
|
+
`&&t.push(n+1);return n=>{let o=0,r=t.length-1;for(;o<=r;){let s=Math.floor((o+r)/2);t[s]<=n?o=s+1:r=s-1}let i=Math.max(0,o-1);return{line:i,character:n-t[i],offset:n}}}function Ys(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function Zs(e){let t=e.project,n=e.host??t.host,o=[],r=[],i=new Set;for(let s of t.definitionFiles){if(!await n.exists(s.uri)){o.push(E(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,l=await n.readFile(s.uri),d=[],c=Hu(l,d,{allowTrailingComma:!0,disallowComments:!1});try{if(a=Ku(l,d,{allowTrailingComma:!0,disallowComments:!1}),d.length>0||!c)throw new Error(`JSON parse error at offset ${d[0]?.offset??0}`)}catch(p){let g=String(p.message||p);o.push(E(u.InvalidNodeDefinitionJson,h.Error,`invalid node definition JSON \`${s.path}\``,void 0,"",{primaryLabel:"the file could not be parsed as JSON",help:`fix the JSON syntax in \`${s.path}\``,notes:[g]}));continue}let m=Yn.safeParse(a);if(!m.success){for(let p of m.error.issues){let g=p.code==="unrecognized_keys"?p.keys.map(y=>({label:`Unrecognized key: "${y}"`,path:[...p.path,y].join(".")})):[{label:p.message,path:p.path.join(".")}];for(let{label:y,path:f}of g)o.push(E(u.InvalidNodeDefinitionSchema,h.Error,`invalid node definition schema \`${s.path}\``,void 0,"",{primaryLabel:y,help:f?`fix the schema issue at \`${f}\``:"fix the schema issue in the file",notes:f?[f]:[]}))}continue}for(let[p,g]of Object.entries(m.data.nodes)){i.has(p)&&o.push(E(u.DuplicateNodeDefinitionId,h.Error,`duplicate node definition ID \`${p}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),i.add(p);let y=Ju(l),f=Ys(Js(c,["nodes",p]),y),x=St(p,g),b=x.ports.map(v=>{let D=Ys(Js(c,["nodes",p,"ports",v.name]),y);return{...v,source:"node-definition-file",uri:s.path,range:D,nameRange:D}});r.push({...x,ports:b,source:"node-definition-file",sourceMeta:{sourceKind:"node-definition-file",file:s.path,range:f},editable:!0,uri:s.path,range:f,elementRange:f})}}return{ok:o.every(s=>s.severity!==h.Error),nodeModels:r,diagnostics:o}}function Qs(e,t){return je(e,t).replace(/\\/g,"/")}function Yu(e){return[...e.reachableDocuments.values()]}function Yo(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function ea(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function Zu(e){let t=new Map;for(let n of e){let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}async function Zo(e){let t=[],n=e.project,o=e.resolvedConfig,r=e.resolutionMode??$o(o),i=r==="entrypoints"||e.resolveGraph?await Hs({project:e.project,documents:e.documents,resolvedConfig:o,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await Zs({project:e.project,host:e.host});t.push(...l.diagnostics);let d=l.nodeModels,c=i&&(r==="entrypoints"||e.resolveGraph)?Yo([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)&&i.reachableUris.has(f.uri)),...i.reachableDocuments.values(),...s]):Yo([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)),...s]),m=Et(c,{config:o,models:d,augmentations:a}),p={includeIssuesByUri:Zu(i?.issues??[]),suppressionIssuesByUri:new Map};t.push(...m.diagnostics);let g=new Map(at(m.index).map(f=>[f,ge(m.index,f)])),y={mode:r,files:new Map(c.map(f=>[Qs(n.rootUri,f.path||f.uri),f])),documentViews:new Map(c.map(f=>[f.uri,(()=>{let x=Q(o,Qs(n.rootUri,f.path||f.uri));return Me(f,{semantic:m.index,config:x,policy:fe(x)})})()])),includeGraph:i?.graph,reachableDocuments:i?.reachableDocuments??new Map,behaviorTreesById:new Map(at(m.index).map(f=>[f,ge(m.index,f)])),reachableBehaviorTreesById:g,nodeModelsById:new Map(lo(m.index).map(f=>[f.id,f])),nodeModelSources:new Map(co(m.index).map(f=>[f,wt(m.index,f).flatMap(x=>x.sourceMeta?[x.sourceMeta]:[])])),nodeDefinitionModels:[...d],entrypoints:n.entrypoints,workspace:m.index,facts:p};return{ok:t.every(f=>f.severity!==h.Error),index:y,diagnostics:t}}async function ta(e){let t=e.project,n=e.resolvedConfig??t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=[...e.projectDiagnostics??[]],r=e.host??t.host,i=e.externalModelDocuments!==void 0?[...e.externalModelDocuments]:(await Promise.all(t.modelFiles.map(async y=>{let f=await Jo(y,r);return o.push(...f.diagnostics),f.document?[f.document]:[]}))).flat(),s=e.augmentations!==void 0?[...e.augmentations]:void 0;if(!s){let y=await bn({project:e.project,host:r});o.push(...y.diagnostics),s=[...y.augmentations]}let a=e.resolutionMode??$o(n),l=a==="entrypoints"?new Set(e.documents.filter(y=>y.kind==="bt-document").map(y=>y.uri)):new Set(e.documents.map(y=>y.uri)),d=await Zo({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:i,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:r}),c=Yo([...e.documents,...Yu(d.index),...i]),m=n.linter.enabled!==!1,p=e.showSuppressed,g=[...d.index.nodeDefinitionModels];return{input:e,project:e.project,documents:e.documents,externalModelDocuments:i,augmentations:s,projectDiagnostics:o,indexResult:d,nodeDefinitionModels:g,fileDocuments:c,lintEnabled:m,showSuppressed:p,resolvedConfig:n,suppressionIssuesByUri:void 0}}var Qu={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files","ros-package-resolver-missing":"include/require-ros-package-resolver","ros-package-not-found":"include/no-missing-ros-package"};function na(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function ep(e,t){let n=Ce(e.linter.rules[t]);return na(n?n.severity:z[t].defaultSeverity)}function tp(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"ros-package-resolver-missing":return{packageName:e.packageName};case"ros-package-not-found":return{packageName:e.packageName,path:e.path};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}function oa(e){let t=[];for(let n of e.issues){let o=Qu[n.kind],r=ep(e.config,o);if(!r)continue;let i=E(z[o].code,r,n.message,n.range,n.uri,void 0,tp(n));t.push({...i,rule:o})}return t}function ra(e,t){return je(e,t).replace(/\\/g,"/")}function np(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function op(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let o=ra(e,n);if(np(o))return o}return ra(e,t.uri)}function ia(e){let{project:t,indexResult:n,externalModelDocuments:o,fileDocuments:r,lintEnabled:i,resolvedConfig:s}=e,a=t,l=n.index.mode;return r.map(d=>{let c=op(a.rootUri,d);if(l==="entrypoints"&&n.index.includeGraph&&d.kind==="bt-document"&&!n.index.reachableDocuments.has(d.uri))return{path:c,uri:d.uri,kind:d.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:d.originalText};let m=l==="single-file"?Et([d,...o],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,p=l==="single-file"?(()=>{let y=Q(s,c);return Me(d,{semantic:m,config:y,policy:fe(y)})})():n.index.documentViews.get(d.uri),g=[];if(i){let y=Q(s,c);g=Ao(d,m,{config:y,documentView:p});let f=n.index.facts.includeIssuesByUri.get(d.uri)??[];g.push(...oa({issues:f,config:y}))}return e.input.mode==="check"&&d.kind==="generic-xml"?{path:c,uri:d.uri,kind:d.kind,documentView:p,diagnostics:[],rawDiagnostics:g,skipped:!0,skipReason:"generic-xml",originalText:d.originalText}:{path:c,uri:d.uri,kind:d.kind,documentView:p,diagnostics:g,rawDiagnostics:void 0,skipped:!1,originalText:d.originalText}})}function sa(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...sa(n.children));return t}function rp(e,t,n){let o=[],r=[];for(let i of e){let s=sa(i.nodes);for(let a of s){let l=a.text.trim();if(!l.includes("btxml-disable"))continue;let d=l.match(/\b(BT\d+|BT\d+_[A-Z0-9_]+|CFG\d+_[A-Z0-9_]+|XML\d+_[A-Z0-9_]+)\b/)?.[1],c=l.match(/reason:\s*(.+)$/)?.[1];t&&!c&&r.push({kind:"missing-reason",uri:i.uri,code:d,range:a.range,message:"missing suppression reason"}),l.startsWith("btxml-disable-file")?o.push({uri:i.uri,code:d,file:!0,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable-next-line")?n&&o.push({uri:i.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable")&&n&&o.push({uri:i.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c})}}return{suppressions:o,issues:r}}function aa(e,t){let n=rp(t.documents??[],!!t.requireReason,t.allowInline!==!1),o=[],r=[];for(let i of e){let s=n.suppressions.find(a=>a.uri===i.uri&&(!a.code||a.code===i.code||i.code.startsWith(a.code))&&(a.file||a.line===i.range?.start.line||a.line===(i.range?.start.line??0)+1));if(s){s.used=!0,r.push(i);continue}o.push(i)}for(let i of n.suppressions)i.used||n.issues.push({kind:"unused",uri:i.uri,code:i.code,range:i.range,message:i.code?`unused suppression for \`${i.code}\``:"unused suppression"});if(t.showSuppressed){let i=r.map(s=>({...s,severity:h.Info,suppressed:!0}));return{diagnostics:[...o,...i],suppressedDiagnostics:r,issues:n.issues}}return{diagnostics:o,suppressedDiagnostics:r,issues:n.issues}}function Qo(e,t,n,o=e.resolvedConfig){let r=Ct(o.linter.rules,"suppression/require-reason")!=="off";return aa(t,{documents:n??e.fileDocuments,requireReason:r,allowInline:o.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function Sn(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function la(e,t){if(!e.input.baseline)return{diagnostics:t,baselineDiagnostics:[],staleEntries:[]};let n=new Set,o=[],r=[];for(let i of t){let s=e.input.baseline.diagnostics.findIndex(a=>a.path===i.uri&&a.code===i.code&&a.messageHash===Sn(i.message)&&a.range?.start?.line===i.range?.start?.line&&a.range?.start?.character===i.range?.start?.character);if(s>=0){n.add(s),r.push(i);continue}o.push(i)}return{diagnostics:o,baselineDiagnostics:r,staleEntries:e.input.baseline.diagnostics.filter((i,s)=>!n.has(s))}}var da={error:0,warning:1,info:2};function ca(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function vn(e){return e.flat().sort((t,n)=>{let o=t.uri.localeCompare(n.uri);if(o!==0)return o;let r=t.range?.start.offset??-1,i=n.range?.start.offset??-1;if(r!==i)return r-i;let s=da[t.severity]-da[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function ua(e,t,n){let o=t.filter(i=>!i.skipped),r=vn([n,o.flatMap(i=>i.diagnostics)]);return{files:o.length,errors:r.filter(i=>i.severity===h.Error).length,warnings:r.filter(i=>i.severity===h.Warning).length,infos:r.filter(i=>i.severity===h.Info).length,suppressed:0,baselineFiltered:0,staleEntries:[]}}function ip(e,t){return e.map(({path:n,uri:o,kind:r,diagnostics:i,rawDiagnostics:s,skipped:a,skipReason:l})=>({path:n,uri:o,kind:r,diagnostics:i,rawDiagnostics:t?s:void 0,skipped:a,skipReason:l}))}function pa(e,t){let n=vn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(o=>o.diagnostics)??[]]);return{ok:!ca(n,e.input.maxWarnings),files:e.files?ip(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var sp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},ap={unused:u.UnusedSuppression,"missing-reason":u.MissingSuppressionReason};function lp(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function dp(e,t){return lp(Ct(e.linter.rules,t))}function er(e){let t=[];for(let n of e.issues){let o=sp[n.kind],r=dp(e.config,o);if(!r)continue;let i=E(ap[n.kind],r,n.message,n.range,n.uri,void 0,n.code?{code:n.code}:void 0);t.push({...i,rule:o})}return t}async function cp(e){let t=await ta(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=ia(t);let o=Qo(t,n);n=[...o.diagnostics,...er({issues:o.issues,config:t.resolvedConfig})];let r=o.suppressedDiagnostics.length;for(let l=0;l<t.files.length;l++){let d=t.files[l],c=t.fileDocuments[l];if(d.skipped)continue;let m=Q(t.resolvedConfig,d.path),p=Qo(t,d.diagnostics,[c],m);d.diagnostics=[...p.diagnostics,...er({issues:p.issues,config:m})],d.rawDiagnostics=[...d.diagnostics],r+=p.suppressedDiagnostics.length}let i=0,s=[];for(let l of t.files){if(l.skipped||l.diagnostics.length===0)continue;let d=la(t,l.diagnostics);l.diagnostics=d.diagnostics,i+=d.baselineDiagnostics.length,d.staleEntries.length>0&&(s=s.concat(d.staleEntries))}t.files=ea(t.files),t.finalProjectDiagnostics=n;let a=ua(t,t.files,n);return a.suppressed=r,a.baselineFiltered=i,a.staleEntries=s,{...pa(t,a),files:t.files??[]}}async function ut(e){let t=e.project,n=e.host??t.host,o=e.documents,r=e.externalModelDocuments,i=e.augmentations,s=[...e.projectDiagnostics??[]];if(!o||!r||!i){let a=await H(e.project,n);o??=a.documents,r??=a.externalModelDocuments,i??=a.augmentations,s=[...s,...a.diagnostics]}return cp({...e,host:n,documents:o,externalModelDocuments:r,augmentations:i,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}import{z as V}from"zod";var xn=V.object({version:V.literal(1),diagnostics:V.array(V.object({path:V.string(),code:V.string(),messageHash:V.string(),range:V.object({start:V.object({line:V.number(),character:V.number(),offset:V.number()}).strict(),end:V.object({line:V.number(),character:V.number(),offset:V.number()}).strict()}).strict().optional()}).strict())}).strict();function tr(e){return{path:e.uri,code:e.code,messageHash:Sn(e.message),range:e.range}}function nr(e){return e.linter.baseline}function ma(e){return[...e.files.values()]}function fa(e){return[...e.reachableDocuments.values()]}function ga(e){return e.workspace}function ya(e){return[...e.nodeDefinitionModels]}function ha(e){if(!e.includeGraph)return;let t=new Map;for(let s of e.files.values())s.path&&t.set(s.path,s.uri);let n=[];for(let[s,a]of e.includeGraph.nodes.entries()){let l=a.document?.uri??t.get(s)??s;n.push({path:s,uri:l,exists:a.exists})}let o=e.includeGraph.edges.map(s=>({from:s.from,to:s.to,includeElementRange:s.includeElementRange,includePathRange:s.includePathRange})),r=[];for(let s of e.facts.includeIssuesByUri.values())for(let a of s)r.push({kind:a.kind,uri:a.uri,path:"path"in a?a.path:void 0,message:a.message,range:a.range});let i=[...n];return i.sort((s,a)=>s.path.localeCompare(a.path)),{nodes:i,edges:o,issues:r}}async function Ye(e){let t=e.project,n=t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=e.host??t.host,r=e.documents,i=e.externalModelDocuments,s=e.augmentations,a=[];if(!r||!i||!s){let d=await H(e.project,o);a.push(...d.diagnostics),r??=d.documents,i??=d.externalModelDocuments,s??=d.augmentations}let l=await Zo({project:e.project,documents:r,activeDocumentUris:new Set(r.map(d=>d.uri)),externalModelDocuments:i,augmentations:s,resolveGraph:e.resolveGraph,resolvedConfig:n,host:o});return a.push(...l.diagnostics),{ok:l.ok,diagnostics:a,semanticIndex:ga(l.index),documents:ma(l.index),reachableDocuments:fa(l.index),nodeDefinitionModels:ya(l.index),includeGraph:ha(l.index)}}function or(e){return e.map(t=>({...t,absolutePath:ee(t.uri)}))}function ie(e){return ee(Uo(e))}function rr(e){let t=qo(e);return t?ee(t):void 0}function J(e){return or(Xo(e))}function be(e){return or(zo(e))}function Ze(e){return or(Go(e))}import sr from"fs";import Sa from"path";import{createColors as pp}from"picocolors";function Rn(e){return e.noColor?{enabled:!1}:e.env?.NO_COLOR!==void 0?{enabled:!1}:e.stream&&!e.stream.isTTY?{enabled:!1}:{enabled:!0}}function te(e,t,n){let o=pp(e.enabled);switch(t){case"error":return o.red(n);case"warning":return o.yellow(n);case"info":return o.cyan(n);case"help":return o.green(n);case"note":return o.dim(n);case"dim":return o.dim(n)}}function ir(e){let t=Rn({noColor:e.noColor,stream:e.stream,env:process.env}),n=[];if(n.push(`${te(t,"error","error:")} ${e.message}`),e.help&&(n.push(""),n.push(`${te(t,"help","help:")} ${e.help}`)),e.expected&&e.expected.length>0){n.push(""),n.push("expected one of:");for(let o of e.expected)n.push(` ${o}`)}return n.join(`
|
|
19
|
+
`)}var F=class extends Error{constructor(n,o,r,i){super(n);this.exitCode=o;this.help=r;this.expected=i;this.name="CliError"}exitCode;help;expected};function ba(e){return e instanceof F?(console.error(ir({message:e.message,help:e.help,expected:e.expected})),e.exitCode):(console.error(ir({message:"command failed"})),console.error(`
|
|
20
|
+
note: ${String(e.message||e)}`),3)}function ar(e,t){let n=t.baseline||nr(He(e)||Vo(e));if(!n||t.noBaseline)return;let o=Sa.resolve(ie(e),n);if(!sr.existsSync(o))return;let r;try{r=JSON.parse(sr.readFileSync(o,"utf8"))}catch{throw new F(`failed to read baseline file: ${o}`,2)}let i=xn.safeParse(r);if(!i.success)throw new F(`invalid baseline file: ${o}`,2,i.error.issues[0]?.message);return i.data}function lr(e,t,n){let o=t.updateBaseline;if(!o||t.noBaseline)return;let r=Sa.resolve(ie(e),o),i={version:1,diagnostics:n.map(s=>tr(s))};sr.writeFileSync(r,`${JSON.stringify(i,null,2)}
|
|
21
|
+
`,"utf8"),t.quiet||console.log(`Baseline updated: ${o}`)}import fp from"fs";import{z as Se}from"zod";var pt=Se.object({config:Se.string().optional(),projectRoot:Se.string().optional(),noConfig:Se.boolean().optional(),quiet:Se.boolean().optional(),verbose:Se.boolean().optional(),noColor:Se.boolean().optional()}).passthrough(),ve=Se.object({files:Se.array(Se.string()).default([])});function X(e,t){let n=e.safeParse(t);if(n.success)return n.data;let o=n.error.issues[0],r=o?.path[0];if((r==="output"||r==="reporter")&&t&&typeof t=="object"){let i=t[r];if(i==="")throw new F(`--${r} requires a value`,2);if(typeof i=="string")throw new F(`invalid value \`${i}\` for \`--${r}\``,2)}throw new F(o?.message||"invalid options",2)}import{z as Le}from"zod";import{z as va}from"zod";var mp=va.enum(["human"]),Xt=va.enum(["human","json"]),xa=mp.default("human"),se=Xt.default("human");var xe=pt.transform(e=>{let{config:t,...n}=e;return{...n,configPath:t}});var Ra=xe.pipe(Le.object({configPath:Le.string().optional(),projectRoot:Le.string().optional(),noConfig:Le.boolean().optional(),quiet:Le.boolean().optional(),verbose:Le.boolean().optional(),noColor:Le.boolean().optional(),output:se,json:Le.boolean().optional()}).merge(ve).transform(e=>({...e,output:e.json?"json":e.output})));async function Ta(e,t){let n=rr(e),o=!!(n&&fp.existsSync(n)),i=(await Ye({project:e,resolveGraph:!0})).includeGraph?.issues??[],s=i.filter(d=>d.kind==="not-found"),a=t.output??"human";if(a!=="human"&&a!=="json")return console.error(`Invalid --output: ${a}`),{ok:!1};let l={version:1,packageVersion:"0.1.0",cliVersion:"0.1.0",lspVersion:"0.1.0",configPath:n,configFound:o,configValid:o,projectRoot:ie(e),selectedFiles:J(e).length,ignoredFiles:Wo(e).length,externalModels:be(e).length,nodeDefinitions:Ze(e).length,includeGraphStatus:i.length===0?"ok":"has-diagnostics",missingIncludes:s.length,missingExternalModels:0,missingNodeDefinitions:0,workspaceHealth:i.length===0&&s.length===0?"healthy":"issues-found",hints:[be(e).length===0?"No external TreeNodesModel files configured":void 0,Ze(e).length===0?"No node definition files configured":void 0,"VS Code: install packaged VSIX or run extension tests for editor integration checks"].filter(Boolean)};if(a==="json")console.log(JSON.stringify(l,null,2));else{console.log(`Package version: ${l.packageVersion}`),console.log(`CLI version: ${l.cliVersion}`),console.log(`Project root: ${l.projectRoot}`),console.log(`Config path: ${l.configPath||"none"}`),console.log(`Config found: ${l.configFound}`),console.log(`Selected files: ${l.selectedFiles}`),console.log(`Ignored files: ${l.ignoredFiles}`),console.log(`External models: ${l.externalModels}`),console.log(`Node definitions: ${l.nodeDefinitions}`),console.log(`Include graph: ${l.includeGraphStatus}`),console.log(`Missing includes: ${l.missingIncludes}`),console.log(`Missing external models: ${l.missingExternalModels}`),console.log(`Missing node definitions: ${l.missingNodeDefinitions}`),console.log(`Workspace health: ${l.workspaceHealth}`);for(let d of l.hints)console.log(`Hint: ${d}`)}return{ok:!0}}var Da={command:"doctor [files..]",describe:"Diagnose workspace health",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}),handler:async e=>{let t=X(Ra,e);process.exitCode=await ka(t)}};import{z as Ca}from"zod";var Ia=pt.extend({rule:Ca.string().optional(),output:se,json:Ca.boolean().optional()}).transform(e=>({...e,output:e.json?"json":e.output}));function gp(e){let t=en(e);if(t)return t;let n=e.toUpperCase(),o=no().filter(r=>r.startsWith(n));if(o.length===1)return en(o[0]);if(o.length>1)return{ambiguity:o}}function Ea(e){if(!e)return console.error("explain requires a rule code"),{ok:!1};let t=gp(e);if(t&&"ambiguity"in t){console.error(`Ambiguous rule prefix: ${e}`);for(let n of t.ambiguity)console.error(` ${n}`);return{ok:!1}}return t?(console.log(`Rule: ${t.code}`),console.log(`Default severity: ${t.defaultSeverity}`),console.log(t.description),t.invalidExample&&console.log(`Invalid: ${t.invalidExample}`),t.validExample&&console.log(`Valid: ${t.validExample}`),t.fix&&console.log(`Fix: ${t.fix}`),t.configExample&&console.log(`Config: ${t.configExample}`),{ok:!0}):(console.error(`Unknown rule: ${e}`),{ok:!1})}var Na={command:"explain [rule]",describe:"Show rule documentation",builder:e=>e.positional("rule",{type:"string"}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}),handler:async e=>{let t=X(Ia,e);process.exitCode=await Pa(t)}};import Ma from"fs";import yp from"path";import{z as dr}from"zod";var wa=pt.extend({type:dr.string().optional(),force:dr.boolean().optional(),output:se,json:dr.boolean().optional()}).transform(e=>({...e,output:e.json?"json":e.output}));function Ba(e){let t=yp.resolve(process.cwd(),"btxml.config.json");if(Ma.existsSync(t)&&!e.force)return console.error("btxml.config.json already exists; use --force to overwrite"),{ok:!1,usage:!0};let n=Zt();return Ma.writeFileSync(t,`${JSON.stringify(n,null,2)}
|
|
22
|
+
`,"utf8"),console.log(`Created ${t}`),{ok:!0}}var _a={command:"init",describe:"Create a new btxml.config.json",builder:e=>e.option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("type",{type:"string"}).option("force",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}),handler:async e=>{let t=X(wa,e);process.exitCode=await Aa(t)}};import La from"fs";import Oe from"path";import{pathToFileURL as hp}from"url";import{z as ja}from"zod";var Fa=ja.object({stdio:ja.boolean().optional()}).transform(e=>({...e,stdio:e.stdio??!1}));function bp(){let e=process.argv[1]?Oe.dirname(Oe.resolve(process.argv[1])):process.cwd(),t=[Oe.resolve(e,"server.cjs"),Oe.resolve(e,"..","server.cjs"),Oe.resolve(e,"..","btxml-checker","dist","server.cjs"),Oe.resolve(e,"..","btxml-checker-monorepo","dist","server.cjs"),Oe.resolve(process.cwd(),"dist","server.cjs"),Oe.resolve(process.cwd(),"packages","btxml-lsp","dist","server.cjs")];return t.find(n=>La.existsSync(n))||t[0]}async function Oa(e){let t=bp();if(!La.existsSync(t))throw new Error(`LSP server build not found: ${t}. Run \`pnpm build\`.`);return await import(hp(t).href),{ok:!0}}var $a={command:"language-server",describe:!1,builder:e=>e.option("stdio",{type:"boolean"}),handler:async e=>{let t=X(Fa,e);process.exitCode=await Ua(t)}};var qa={error:0,warning:1,info:2};function Tn(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function mt(e){return e.flat().sort((t,n)=>{let o=t.uri.localeCompare(n.uri);if(o!==0)return o;let r=t.range?.start.offset??-1,i=n.range?.start.offset??-1;if(r!==i)return r-i;let s=qa[t.severity]-qa[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}import ft from"fs";import cr from"path";function ne(e){return ft.readFileSync(e,"utf8")}function gt(e,t){let n=cr.dirname(e),o=cr.join(n,`.${cr.basename(e)}.${process.pid}.tmp`);try{let r=ft.statSync(e);if(r.isSymbolicLink())throw new Error(`Refusing to format symbolic link: ${e}`);ft.writeFileSync(o,t,"utf8"),ft.chmodSync(o,r.mode),ft.renameSync(o,e)}catch(r){try{ft.unlinkSync(o)}catch{}throw r}}import{z as oe}from"zod";import{z as Dn}from"zod";var kn=Dn.object({baseline:Dn.string().optional(),updateBaseline:Dn.string().optional(),noBaseline:Dn.boolean().optional()});var Va=xe.pipe(oe.object({configPath:oe.string().optional(),projectRoot:oe.string().optional(),noConfig:oe.boolean().optional(),quiet:oe.boolean().optional(),verbose:oe.boolean().optional(),noColor:oe.boolean().optional(),output:se,reporter:Xt.optional(),json:oe.boolean().optional(),warningsAsErrors:oe.boolean().optional(),maxWarnings:oe.number().optional(),showSkipped:oe.boolean().optional(),showSuppressed:oe.boolean().optional(),fix:oe.boolean().optional()}).merge(kn).merge(ve).transform(e=>({...e,output:e.json?"json":e.output,reporter:e.json?"json":e.reporter??e.output,maxWarnings:e.warningsAsErrors?0:e.maxWarnings})));function Xa(e){let{sourceText:t,range:n,label:o,severity:r,colorMode:i}=e,s=[],a=n.start.line+1,l=t.split(/\r?\n/)[n.start.line]??"",d=String(a),c=d.length,m=" | ";s.push(" ".repeat(c)+m.trimEnd()),s.push(`${d}${m}${l}`);let p=n.start.character,g=n.end.character,y=p,f=g;f<=y&&(f=y+1);let x=l.slice(0,y),b=f-y,v=(x.match(/\t/g)||[]).length,D=x.length+v,P="^".repeat(Math.max(1,b)),_=te(i,r==="error"?"error":r==="warning"?"warning":"info",P),M=o?` ${te(i,"dim",o)}`:"";return s.push(" ".repeat(c)+m+" ".repeat(D)+_+M),s.push(" ".repeat(c)+m.trimEnd()),s}function $e(e){let t=Rn({noColor:e.noColor,stream:e.stream,env:process.env}),n=mt([e.diagnostics]),o=[];for(let r of n)o.push(Sp(r,e.defaultPath,e.sourceTextByUri,t));return o.join(`
|
|
23
|
+
|
|
24
|
+
`)}function Sp(e,t,n,o){let r=[],i=e.suppressed?"info":e.severity,s=e.suppressed?" [suppressed]":"",a=i==="error"?"error":i==="warning"?"warning":"info",l=Qn(e.code),d=l?` ${l}:`:":";r.push(`${te(o,a,i)}[${e.code}]${d} ${e.message}${s}`);let c=e.uri||t;if(c&&(e.range?r.push(` --> ${te(o,"dim",`${c}:${e.range.start.line+1}:${e.range.start.character+1}`)}`):r.push(` --> ${te(o,"dim",c)}`)),e.range&&n){let m=n.get(e.uri)||n.get(t||"");m&&r.push(...Xa({sourceText:m,range:e.range,label:e.details?.primaryLabel,severity:e.severity,colorMode:o}))}if(e.details?.help&&r.push(`${te(o,"help","help:")} ${e.details.help}`),e.details?.notes)for(let m of e.details.notes)r.push(`${te(o,"note","note:")} ${m}`);if(e.relatedInformation)for(let m of e.relatedInformation){let p=m.range?`${m.uri}:${m.range.start.line+1}:${m.range.start.character+1}`:m.uri;r.push(`${te(o,"note","note:")} ${p}: ${m.message}`)}return r.join(`
|
|
25
|
+
`)}var ur="0.1.0";function zt(e){return mt([e.projectDiagnostics,e.files.flatMap(t=>t.diagnostics)])}function Gt(e){let t=zt(e);return{files:e.files.length,errors:t.filter(n=>n.severity==="error").length,warnings:t.filter(n=>n.severity==="warning").length,infos:t.filter(n=>n.severity==="info").length,suppressed:0,baselineFiltered:0}}function Cn(e,t,n="human",o){return n!=="human"?"":$e({diagnostics:t,defaultPath:e,sourceTextByUri:o})}function In(e,t="human",n){return e.length===0||t!=="human"?"":$e({diagnostics:e,sourceTextByUri:n})}function En(e){let t=[...e.files].map(r=>{let{sourceText:i,rawDiagnostics:s,formatted:a,...l}=r;return{...l,diagnostics:mt([l.diagnostics])}}).sort((r,i)=>r.path.localeCompare(i.path)),n=mt([e.projectDiagnostics??[]]),o=Gt({projectDiagnostics:n,files:t});return JSON.stringify({ok:e.ok,version:2,schemaVersion:"2",toolVersion:ur,project:{},projectDiagnostics:n,files:t,summary:{...o,suppressed:e.summary?.suppressed||0,baselineFiltered:e.summary?.baselineFiltered||0}},null,2)}function Nn(e,t,n,o,r,i,s){if(e)return`ok: ${o==="lint"?"linted":"checked"} ${t} files`;let a=o==="lint"?"lint":"check";return s&&r===0&&i>0?`error: ${a} failed with 0 errors and ${i} warnings treated as errors in ${t} files`:`error: ${a} failed with ${r} errors and ${i} warnings in ${t} files`}function Pn(e){return!e||e===0?"":`note: ${e} stale baseline entries were found`}function za(e){return $e({diagnostics:[{code:"BTXML_FORMAT",severity:"error",message:"file is not formatted",uri:e,details:{help:`run \`btxmlc format ${e}\``}}]})}function Ga(e){let t=new Map;for(let n of e.diagnostics){if(n.code!=="BT002_MISSING_BTCPP_FORMAT")continue;let o=e.documents.find(a=>a.uri===n.uri);if(!o?.root||o.root.name!=="root"||o.root.attributes.some(a=>a.name==="BTCPP_format"))continue;let r;if(o.root.nameRange?r=o.root.nameRange.end.offset:o.root.openTagRange&&(r=o.root.openTagRange.start.offset+5),r===void 0)continue;let i=t.get(o.uri),s={range:{start:{line:0,character:0,offset:r},end:{line:0,character:0,offset:r}},newText:' BTCPP_format="4"'};t.set(o.uri,i?{uri:o.uri,edits:[...i.edits,s]}:{uri:o.uri,edits:[s]})}return[...t.values()]}async function Wa(e,t){let n=Ne(ie(e)),{documents:o,externalModelDocuments:r,diagnostics:i}=await H(e,n),s=await ut({project:e,documents:o,externalModelDocuments:r,mode:"lint",showSuppressed:t.showSuppressed,baseline:t.baseline,maxWarnings:t.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...t.projectDiagnostics||[],...i],host:n}),a=0,l=0;if(t.fix){let g=[...t.projectDiagnostics||[],...s.projectDiagnostics,...s.files.flatMap(f=>f.rawDiagnostics??f.diagnostics)],y=Ga({documents:o,diagnostics:g});if(y.length>0){let f=new Set;for(let b of y){let D=J(e).find(_=>_.absolutePath===b.uri||_.path===b.uri||_.uri===b.uri)?.absolutePath??(b.uri.startsWith("file://")?ee(b.uri):b.uri),P=ne(D),A=bt(P,b.edits);gt(D,A),f.has(b.uri)||(f.add(b.uri),l++),a+=b.edits.length}let x=await H(e,n);o=x.documents,r=x.externalModelDocuments,i=x.diagnostics,s=await ut({project:e,documents:o,externalModelDocuments:r,mode:"lint",showSuppressed:t.showSuppressed,baseline:t.baseline,maxWarnings:t.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...t.projectDiagnostics||[],...i],host:n})}}let d=[...t.projectDiagnostics||[],...s.projectDiagnostics],c=s.files.map(g=>({path:g.path,diagnostics:g.diagnostics,rawDiagnostics:g.rawDiagnostics,skipped:g.skipped,skipReason:g.skipReason})),m=!Tn(zt({projectDiagnostics:d,files:c}),t.maxWarnings),p=Gt({projectDiagnostics:d,files:c});if(t.reporter==="json"&&console.log(En({ok:m,files:c,projectDiagnostics:d,summary:s.summary})),!t.quiet&&t.reporter==="human"){t.fix&&(a>0?console.log(`fixed ${a} problem${a===1?"":"s"} in ${l} file${l===1?"":"s"}`):console.log("fixed 0 problems"));let g=new Map;for(let b of J(e))g.set(b.path,ne(b.absolutePath));let y=In(d,t.reporter,g);y&&console.error(y);for(let b of c){let v=Cn(b.path,b.diagnostics,t.reporter,g);v&&console.error(v)}let f=s.summary?.staleEntries?.length,x=Nn(m,c.length,f,"lint",p.errors,p.warnings,t.maxWarnings===0);if(m)t.fix?a===0&&console.log("ok: lint passed"):console.log(x);else{console.error(x);let b=Pn(f);b&&console.error(b)}}return{ok:m,files:c,projectDiagnostics:d,summary:p}}var Ka={command:"lint [files..]",describe:"Lint BT/XML files",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("reporter",{type:"string"}).option("json",{type:"boolean"}).option("warnings-as-errors",{type:"boolean"}).option("max-warnings",{type:"number"}).option("show-skipped",{type:"boolean"}).option("show-suppressed",{type:"boolean"}).option("baseline",{type:"string"}).option("update-baseline",{type:"string"}).option("no-baseline",{type:"boolean"}).option("fix",{type:"boolean"}).option("stdout",{type:"boolean",hidden:!0}),handler:async e=>{if(e.stdout)throw new F("--stdout is not supported for `lint`",2,"use `--output json` for machine-readable output");let t=X(Va,e);process.exitCode=await Ha(t)}};import{z as Re}from"zod";var Ja=xe.pipe(Re.object({configPath:Re.string().optional(),projectRoot:Re.string().optional(),noConfig:Re.boolean().optional(),quiet:Re.boolean().optional(),verbose:Re.boolean().optional(),noColor:Re.boolean().optional(),output:se,json:Re.boolean().optional(),write:Re.boolean().optional(),show:Re.string().optional()}).merge(ve).transform(e=>({...e,output:e.json?"json":e.output})));import{stdin as vp,stdout as Ya}from"process";import{createInterface as xp}from"readline/promises";async function wn(e){let t=xp({input:vp,output:Ya});try{let n=[`? ${e.message}`];for(let o=0;o<e.choices.length;o++)n.push(` ${o+1}. ${e.choices[o].label}`),e.choices[o].description&&n.push(` ${e.choices[o].description}`);for(n.push(`Select an action [1-${e.choices.length}]:`);;){let o=await t.question(`${n.join(`
|
|
26
|
+
`)} `),r=Number(o.trim());if(!Number.isNaN(r)&&r>=1&&r<=e.choices.length)return e.choices[r-1].value;Ya.write(`Please enter a number between 1 and ${e.choices.length}.
|
|
27
|
+
`)}}finally{t.close()}}function Za(e){return{name:e.name,direction:e.direction,type:e.type,required:e.required,defaultValue:e.defaultValue,enum:e.enum?[...e.enum].sort():void 0,description:e.description}}function Qa(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let o=new Map(e.ports.map(i=>[i.name,i])),r=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of o)r.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:Za(s)});for(let[i,s]of r)o.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:Za(s)});for(let[i,s]of o){let a=r.get(i);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:i,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:i,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:i,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:i,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:i,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:i,left:s.description,right:a.description})}return n}function Y(e){return e==null?"undefined":typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.sort().join(";")||"empty":String(e)}function pr(e){let t=[];for(let n of e)switch(n.kind){case"node-kind":t.push(`node-kind:${Y(n.left)}:${Y(n.right)}`);break;case"port-added":t.push(`added:${n.portName}`);break;case"port-removed":t.push(`removed:${n.portName}`);break;case"port-direction":t.push(`direction:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-type":t.push(`type:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-required":t.push(`required:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-default":t.push(`default:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-enum":t.push(`enum:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-description":t.push(`description:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break}return t.sort().join("|")}function Rp(e){return"portName"in e}function mr(e){let t=e.filter(o=>o.kind.startsWith("port-"));if(t.length===0)return e.length===1&&e[0].kind==="node-kind"?"node kind differs":`${e.length} structural differences`;let n=new Set(t.filter(Rp).map(o=>o.portName));if(n.size===1){let o=Array.from(n)[0];return`${t.map(i=>i.kind.replace("port-","")).join(", ")} on \`${o}\``}return`${n.size} differing ports`}function tl(e){return JSON.stringify({direction:e.direction,name:e.name,type:e.type??null,required:e.required,defaultValue:e.defaultValue??null,enumValues:e.enum??null,description:e.description??null})}function Tp(e){return JSON.stringify({kind:e.kind,ports:e.ports.map(t=>({name:t.name,direction:t.direction,type:t.type??null,required:t.required,defaultValue:t.defaultValue??null,enum:t.enum?[...t.enum].sort():null,description:t.description??null})).sort((t,n)=>t.name.localeCompare(n.name))})}function Dp(e){let t=[e.name];e.type&&t.push(`: ${e.type}`),!e.required&&e.defaultValue!==void 0&&t.push(` = "${e.defaultValue}"`);let n=t.join("");return e.direction==="output"?`${n} [output]`:e.direction==="inout"?`${n} [inout]`:n}function el(e){return`${e.kind} ${e.id}(${e.ports.map(Dp).join(", ")})`}function nl(e){let t=new Map;for(let r of e){let i=Tp(r),s=t.get(i)??[];s.push(r),t.set(i,s)}let n=Array.from(t.entries());n.sort((r,i)=>{let s=r[1][0],a=i[1][0],l=s.uri??"",d=a.uri??"";if(l!==d)return l.localeCompare(d);let c=s.range?.start.offset??0,m=a.range?.start.offset??0;return c-m});let o="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");return n.map(([r,i],s)=>{let a=o[s]??`S${s}`,l=i[0],d=i.map(c=>({definitionId:`${c.id}:${c.uri??""}:${c.range?.start.offset??0}`,uri:c.uri,sourceKind:c.source||"inline-tree-nodes-model",kind:c.kind,range:c.range,signatureKey:r,signatureId:a,signatureText:el(c),model:c}));return{id:a,signatureKey:r,signatureText:el(l),kind:l.kind,definitions:d,editableDefinitions:d.filter(c=>c.model.editable!==!1),nonEditableDefinitions:d.filter(c=>c.model.editable===!1)}})}function kp(e){return/^\{[^}]+\}$/.test(e.trim())}function Cp(e){return e.name==="SubTree"?e.attributes.find(n=>n.name==="ID")?.value??e.name:e.name}function ol(e,t,n,o){let r=0;if(Cp(e)===t){r++;for(let i of n){let s=o.get(i);s||(s={providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0},o.set(i,s));let a=e.attributes.find(l=>l.name===i);a?(s.providedCount++,kp(a.value)?s.blackboardReferenceCount++:s.literalValues[a.value]=(s.literalValues[a.value]||0)+1):s.omittedCount++}}for(let i of e.children)i.kind==="element"&&(r+=ol(i,t,n,o));return r}function fr(e){let t=new Map,n=0;for(let r of e.documents)if(r.root)for(let i of r.root.children)i.kind==="element"&&i.name==="TreeNodesModel"||i.kind==="element"&&(n+=ol(i,e.nodeId,e.candidatePorts,t));let o={};for(let r of e.candidatePorts)o[r]=t.get(r)||{providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0};return{nodeId:e.nodeId,totalUsages:n,byPort:o}}function Mn(e){let t={signatureId:e.signature.id,newMissingRequiredPorts:[],removedPortsUsedByUsages:[],directionChanges:[]},n=new Set(Object.keys(e.usageEvidence.byPort));for(let o of n){let r=e.usageEvidence.byPort[o],i=e.signature.definitions[0]?.model.ports.find(s=>s.name===o);i?.required&&r.omittedCount>0&&t.newMissingRequiredPorts.push({portName:o,omittedCount:r.omittedCount}),!i&&r.providedCount>0&&t.removedPortsUsedByUsages.push({portName:o,providedCount:r.providedCount})}return t}function Ip(e){let t=0;for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++)ot(e[n],e[o])||t++;return t}function Ep(e,t){return e.definitions.some(n=>n.model.editable===!1||n.range==null?!1:t.some(o=>o.uri===n.uri))}function Np(e){let t=e.targetSignature.definitions[0];if(!t)return[];let n=e.documents.find(i=>i.uri===t.uri);if(!n||!t.range)return[];let o=n.originalText.slice(t.range.start.offset,t.range.end.offset),r=[];for(let i of e.allDefinitions)i.signatureId===e.targetSignature.id||i.model.editable===!1||i.range==null||!e.documents.find(a=>a.uri===i.uri)||r.push({uri:i.uri??"",edits:[{range:i.range,newText:o}]});return r}function Pp(e){let t=[];for(let n of e.allDefinitions)n.definitionId!==e.keepDefinition.definitionId&&n.model.editable!==!1&&n.range!=null&&t.push({uri:n.uri??"",edits:[{range:n.range,newText:""}]});return t}function wp(e){if(e.model.editable===!1)return[];let t=[],n=e.keepDefinition.range?.start.offset,o=e.model.ports.filter(r=>r.name===e.portName);for(let r of o){let i=r.range??r.nameRange;i&&(n!=null&&i.start.offset===n||t.push({uri:e.model.uri??"",edits:[{range:i,newText:""}]}))}return t}function gr(e){let t=new Set,n=0;for(let o of e)t.add(o.uri),n+=o.edits.length;return{files:t.size,definitions:n,edits:n,affectedUris:Array.from(t).sort()}}function Qe(e){return e.definitions===0?"edits: none":e.definitions===1&&e.files===1?"edits: 1 definition in 1 file":`edits: ${e.definitions} definition${e.definitions===1?"":"s"} in ${e.files} file${e.files===1?"":"s"}`}function il(e){let t=[],{group:n,documents:o}=e,r=n.signatures.some(i=>i.nonEditableDefinitions.length>0);if(n.kind==="model-signature-conflict")for(let i of n.signatures){if(!Ep(i,o)||n.definitions.filter(l=>l.signatureId!==i.id&&l.model.editable!==!1&&l.range!=null).length===0)continue;let a=Np({targetSignature:i,allDefinitions:n.definitions,documents:o});a.length!==0&&t.push({id:`match-signature-${i.id}`,title:r?`Make editable definitions match signature ${i.id}`:`Make all definitions match signature ${i.id}`,description:`Replace editable definitions that do not match signature ${i.id}.`,kind:"match-signature",applicable:!0,targetSignatureId:i.id,workspaceEdits:a,editSummary:gr(a),usageImpact:Mn({signature:i,usageEvidence:n.usageEvidence})})}else if(n.kind==="duplicate-model-id"){let i=new Set;for(let s of n.definitions){if(i.has(s.signatureKey))continue;i.add(s.signatureKey);let a=Pp({keepDefinition:s,allDefinitions:n.definitions}),l=n.definitions.filter(d=>d.signatureKey===s.signatureKey).length;a.length!==0&&t.push({id:`keep-definition-${s.signatureId}`,title:l>1?"Keep the first definition and delete duplicate copies":`Keep variant ${s.signatureId} and delete duplicate \`${n.nodeId}\` definitions in this file`,description:l>1?`Keep one definition and remove ${l-1} duplicate copies.`:`Keep ${s.definitionId} and remove other duplicate definitions.`,kind:"keep-model-definition",applicable:!0,workspaceEdits:a,editSummary:gr(a)})}}else if(n.kind==="duplicate-port-name"){let i=new Set;for(let s of n.definitions){if(i.has(s.signatureKey))continue;i.add(s.signatureKey);let a=wp({model:s.model,portName:n.portName??n.nodeId,keepDefinition:s});if(a.length===0)continue;let l=n.definitions.filter(d=>d.signatureKey===s.signatureKey).length;t.push({id:`keep-port-${s.signatureId}`,title:l>1?`Keep the first \`${n.portName??n.nodeId}\` port and delete duplicate copies`:`Keep port variant ${s.signatureId} and delete other \`${n.portName??n.nodeId}\` ports`,description:l>1?`Keep one \`${n.portName??n.nodeId}\` port and remove duplicate copies.`:`Keep \`${n.portName??n.nodeId}\` port variant ${s.signatureId} and remove others.`,kind:"keep-port-definition",applicable:!0,workspaceEdits:a,editSummary:gr(a)})}}return t.length===0&&t.push({id:"manual",title:"Manual update required",description:"No editable definitions are available for automatic repair.",kind:"manual",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}),t.push({id:"skip",title:"Skip this model group",description:"Do not change any definitions for this node model.",kind:"skip",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}),t}function Mp(e,t){let n=[];e.direction!==t.direction&&n.push({kind:"port-direction",portName:e.name,left:e.direction,right:t.direction}),e.type!==t.type&&n.push({kind:"port-type",portName:e.name,left:e.type,right:t.type}),e.required!==t.required&&n.push({kind:"port-required",portName:e.name,left:e.required,right:t.required}),e.defaultValue!==t.defaultValue&&n.push({kind:"port-default",portName:e.name,left:e.defaultValue,right:t.defaultValue});let o=e.enum?JSON.stringify([...e.enum].sort()):"",r=t.enum?JSON.stringify([...t.enum].sort()):"";return o!==r&&n.push({kind:"port-enum",portName:e.name,left:e.enum?[...e.enum].sort():void 0,right:t.enum?[...t.enum].sort():void 0}),n}function yr(e){let t=[];for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++){let r=e[n].definitions[0]?.model,i=e[o].definitions[0]?.model;if(!r||!i)continue;let s=Qa(r,i);s.length>0&&t.push({leftSignatureId:e[n].id,rightSignatureId:e[o].id,differences:s})}return t}function rl(e){let t=e.flatMap(i=>i.differences),n=t.some(i=>i.kind!=="port-default"),o=t.some(i=>i.kind==="port-default"),r=[];return n&&r.push("BT012_CONFLICTING_NODE_MODEL"),o&&r.push("BT107_CONFLICTING_PORT_DEFAULT"),{codes:r,severity:n?"error":"warning"}}function sl(e){let{nodeId:t,models:n,documents:o,code:r}=e;if(n.length<2)return;let i=nl(n);if(i.length<2&&r!=="BT006_DUPLICATE_NODE_MODEL_ID")return;let s=i.flatMap(b=>b.definitions),a=Ip(n),l,d;if(r==="BT006_DUPLICATE_NODE_MODEL_ID")if(i.length===1)l=["BT006_DUPLICATE_NODE_MODEL_ID"],d="error";else{let b=yr(i),v=rl(b);l=["BT006_DUPLICATE_NODE_MODEL_ID",...v.codes],d=v.severity}else{let b=yr(i),v=rl(b);if(l=v.codes,d=v.severity,l.length===0)return}let c=[...new Set(s.flatMap(b=>b.model.ports.map(v=>v.name)))],m=fr({nodeId:t,documents:o,candidatePorts:c}),p=yr(i),g=p.flatMap(b=>b.differences),y=pr(g),f=mr(g),x={id:`model-group:${t}:${y}`,kind:e.kind??(r==="BT006_DUPLICATE_NODE_MODEL_ID"?"duplicate-model-id":"model-signature-conflict"),nodeId:t,displayName:t,codes:l,severity:d,definitions:s,signatures:i,differences:p,usageEvidence:m,differencePattern:{key:y,label:f},pairwiseConflictCount:a};return{...x,actions:il({group:x,documents:o}),usageImpacts:i.map(b=>Mn({signature:b,usageEvidence:m}))}}function Bp(e,t){let n=[];for(let o of Pt(e)){let r=new Map;for(let i of o.treeNodesModel){let s=r.get(i.id)??[];s.push(i),r.set(i.id,s)}for(let[i,s]of r){if(s.length<2)continue;let a=sl({nodeId:i,models:s,documents:t,code:"BT006_DUPLICATE_NODE_MODEL_ID",kind:"duplicate-model-id"});a&&n.push(a)}}return n}function _p(e){let{model:t,portName:n,ports:o,documents:r}=e,i=new Map;for(let p of o){let g=tl(p),y=i.get(g)??[];y.push(p),i.set(g,y)}let s=Array.from(i.entries()).sort((p,g)=>(p[1][0]?.range?.start.offset??0)-(g[1][0]?.range?.start.offset??0)),a="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),l=[];for(let p=0;p<s.length;p++){let[g,y]=s[p],f=a[p]??`S${p}`,x=y[0],b=`${t.kind} ${t.id}(${x.direction} ${x.name}${x.type?`: ${x.type}`:""}${x.defaultValue?` = "${x.defaultValue}"`:""})`,v=y.map((D,P)=>{let A=D.range??D.nameRange;return{definitionId:`${t.id}:${t.uri??""}:${t.range?.start.offset??0}:port:${n}:${A?.start.offset??P}`,uri:t.uri,sourceKind:t.source||"inline-tree-nodes-model",kind:t.kind,range:A,signatureKey:g,signatureId:f,signatureText:b,model:t}});l.push({id:f,signatureKey:g,signatureText:b,kind:t.kind,definitions:v,editableDefinitions:v.filter(D=>D.model.editable!==!1),nonEditableDefinitions:v.filter(D=>D.model.editable===!1)})}let d=[];for(let p=0;p<l.length;p++)for(let g=p+1;g<l.length;g++){let y=l[p].definitions[0]?.model.ports.find(b=>{let v=b.range??b.nameRange,D=l[p].definitions[0]?.range;return v&&D&&v.start.offset===D.start.offset}),f=l[g].definitions[0]?.model.ports.find(b=>{let v=b.range??b.nameRange,D=l[g].definitions[0]?.range;return v&&D&&v.start.offset===D.start.offset});if(!y||!f)continue;let x=Mp(y,f);x.length>0&&d.push({leftSignatureId:l[p].id,rightSignatureId:l[g].id,differences:x})}let c=d.flatMap(p=>p.differences),m={id:`duplicate-port:${t.id}:${n}:${t.uri??""}:${o[0]?.range?.start.offset??0}`,kind:"duplicate-port-name",nodeId:t.id,portName:n,displayName:`${t.id}.${n}`,codes:["BT008_DUPLICATE_PORT_NAME"],severity:"error",definitions:l.flatMap(p=>p.definitions),signatures:l,differences:d,usageEvidence:fr({nodeId:t.id,documents:r,candidatePorts:[n]}),differencePattern:{key:pr(c),label:mr(c)},pairwiseConflictCount:Math.max(1,o.length-1)};return{...m,actions:il({group:m,documents:r}),usageImpacts:l.map(p=>Mn({signature:p,usageEvidence:m.usageEvidence}))}}function Ap(e,t){let n=[];for(let o of Pt(e))for(let r of o.treeNodesModel){let i=new Map;for(let s of r.ports){let a=i.get(s.name)??[];a.push(s),i.set(s.name,a)}for(let[s,a]of i){if(a.length<2)continue;let l=_p({model:r,portName:s,ports:a,documents:t});l&&n.push(l)}}return n}function jp(e){let t=new Set;for(let n of Pt(e)){let o=new Map;for(let r of n.treeNodesModel){let i=o.get(r.id)??[];i.push(r),o.set(r.id,i)}for(let[r,i]of o)i.length>=2&&t.add(r)}return t}function Fp(e){let t=new Map;for(let n of ao(e)){let o=t.get(n.id)??[];o.push(n),t.set(n.id,o)}return t}function Bn(e){let t=[],n=jp(e.workspace);for(let[o,r]of Fp(e.workspace)){if(r.length<2||n.has(o))continue;let i=sl({nodeId:o,models:r,documents:e.documents,code:"BT012_CONFLICTING_NODE_MODEL"});i&&t.push(i)}return t.push(...Bp(e.workspace,e.documents)),t.push(...Ap(e.workspace,e.documents)),t}function _n(e){return e.applicable===!0}function al(e){return e.actions.filter(_n)}function ll(e){return e.actions.filter(t=>t.kind==="manual")}function dl(e){return{signatureConflictGroups:e.filter(t=>t.kind==="model-signature-conflict").length,duplicateModelGroups:e.filter(t=>t.kind==="duplicate-model-id").length,duplicatePortGroups:e.filter(t=>t.kind==="duplicate-port-name").length,pairwiseSignatureConflicts:e.filter(t=>t.kind==="model-signature-conflict").reduce((t,n)=>t+n.pairwiseConflictCount,0)}}function Lp(e){switch(e.kind){case"duplicate-port-name":return`1 model definition, ${e.definitions.length} duplicate ports, ${e.signatures.length} variants`;case"duplicate-model-id":return`1 file, ${e.definitions.length} duplicate model definitions, ${e.signatures.length} variants`;case"model-signature-conflict":return`${e.definitions.length} definitions, ${e.signatures.length} signatures`}}function cl(e){let t=e.usageEvidence.totalUsages,n=[];if(n.push(`${e.displayName} usages: ${t}`),t===0)return n.push(" no usage evidence available"),n;for(let[o,r]of Object.entries(e.usageEvidence.byPort)){let i=[];i.push(`provided ${r.providedCount}/${t}`),r.blackboardReferenceCount>0&&i.push(`blackboard refs ${r.blackboardReferenceCount}`),n.push(` ${o}: ${i.join(", ")}`)}return n}function ul(e){let t=[];if(e.newMissingRequiredPorts.length>0)for(let n of e.newMissingRequiredPorts)t.push(`would produce ${n.omittedCount} missing required-port report${n.omittedCount===1?"":"s"} for \`${n.portName}\``);if(e.removedPortsUsedByUsages.length>0)for(let n of e.removedPortsUsedByUsages)t.push(`\`${n.portName}\` is used in ${n.providedCount} usage${n.providedCount===1?"":"s"} but is not defined by this signature`);if(e.directionChanges.length>0)for(let n of e.directionChanges)t.push(`changes \`${n.portName}\` direction from ${n.from} to ${n.to}`);return t.length===0?"no existing usage omits required ports in this signature":t.join("; ")}function pl(e){let t=[];for(let n of e.differences){t.push(` ${n.leftSignatureId} vs ${n.rightSignatureId}:`);for(let o of n.differences)switch(o.kind){case"node-kind":t.push(` node kind: ${n.leftSignatureId}: ${o.left}, ${n.rightSignatureId}: ${o.right}`);break;case"port-added":t.push(` ${o.portName}: ${n.rightSignatureId}: exists, ${n.leftSignatureId}: not defined`);break;case"port-removed":t.push(` ${o.portName}: ${n.leftSignatureId}: exists, ${n.rightSignatureId}: not defined`);break;case"port-direction":t.push(` ${o.portName}: ${n.leftSignatureId}: ${o.left}, ${n.rightSignatureId}: ${o.right}`);break;case"port-type":t.push(` ${o.portName}: ${n.leftSignatureId}: type ${o.left??"not specified"}, ${n.rightSignatureId}: type ${o.right??"not specified"}`);break;case"port-required":t.push(` ${o.portName}: ${n.leftSignatureId}: ${o.left?"required":"optional"}, ${n.rightSignatureId}: ${o.right?"required":"optional"}`);break;case"port-default":t.push(` ${o.portName}: ${n.leftSignatureId}: default ${o.left??"not set"}, ${n.rightSignatureId}: default ${o.right??"not set"}`);break;case"port-enum":t.push(` ${o.portName}: ${n.leftSignatureId}: enum ${o.left?.join(";")??"not set"}, ${n.rightSignatureId}: enum ${o.right?.join(";")??"not set"}`);break;case"port-description":{let r=i=>i?i.length>120?`${i.slice(0,120)}...`:i:"not set";t.push(` - port \`${o.portName}\` description differs`,` ${n.leftSignatureId}: "${r(o.left)}"`,` ${n.rightSignatureId}: "${r(o.right)}"`);break}}}return t}function hr(e,t){let n=[],o=t?.index!==void 0?`[${t.index}${t.total?`/${t.total}`:""}] `:"";n.push(`${o}${e.displayName}`),n.push(""),e.kind==="duplicate-port-name"?n.push(`1 model definition contains ${e.definitions.length} ports named \`${e.portName??e.nodeId}\`.`):e.kind==="duplicate-model-id"?n.push(`1 file contains ${e.definitions.length} definitions with ID \`${e.nodeId}\`.`):n.push(`${e.definitions.length} definitions have ${e.signatures.length} signatures.`),n.push(`codes: ${e.codes.join(", ")}`),n.push("");for(let s of e.signatures){let a=e.kind==="duplicate-port-name"?"port variant":e.kind==="model-signature-conflict"?"signature":"variant";n.push(`${a} ${s.id}`),n.push(` ${s.signatureText}`),n.push(" locations:");for(let l of s.definitions){let d=l.range?`${l.uri??""}:${l.range.start.line+1}:${l.range.start.character+1}`:l.uri??"unknown";n.push(` ${d}`)}n.push("")}if(e.differences.length>0&&(n.push("differences:"),n.push(...pl(e)),n.push("")),n.push("usage:"),n.push(...cl(e).map(s=>` ${s}`)),n.push(""),e.usageImpacts.length>0){n.push("usage check:");for(let s of e.usageImpacts)n.push(` choose ${s.signatureId}: ${ul(s)}`);n.push("")}let r=al(e);if(r.length>0){n.push("actions:");for(let s=0;s<r.length;s++){let a=r[s];n.push(` ${s+1}. ${a.title}`);let l=Qe(a.editSummary);if(l!=="edits: none"&&n.push(` ${l}`),a.warnings)for(let d of a.warnings)n.push(` warning: ${d}`)}n.push("")}let i=ll(e);if(i.length>0){n.push("manual:");for(let s of i)if(n.push(` ${s.description}`),s.warnings)for(let a of s.warnings)n.push(` warning: ${a}`);n.push("")}return n.join(`
|
|
28
|
+
`)}function An(e){if(e.groups.length===0)return"ok: no model conflicts found";let t=dl(e.groups),n=[];n.push(`model repair: ${e.groups.length} group${e.groups.length===1?"":"s"} need${e.groups.length===1?"s":""} attention`),t.signatureConflictGroups>0&&n.push(` ${t.signatureConflictGroups} signature conflict group${t.signatureConflictGroups===1?"":"s"}`),t.duplicateModelGroups>0&&n.push(` ${t.duplicateModelGroups} duplicate model group${t.duplicateModelGroups===1?"":"s"}`),t.duplicatePortGroups>0&&n.push(` ${t.duplicatePortGroups} duplicate port group${t.duplicatePortGroups===1?"":"s"}`),t.pairwiseSignatureConflicts>0&&n.push(`${t.pairwiseSignatureConflicts} pairwise signature conflict${t.pairwiseSignatureConflicts===1?"":"s"} collapsed into ${t.signatureConflictGroups} group${t.signatureConflictGroups===1?"":"s"}`),n.push("");let o=10;if(e.groups.length<=o)for(let r=0;r<e.groups.length;r++){let i=e.groups[r];n.push(`[${r+1}] ${i.displayName}`),n.push(` ${Lp(i)}`),n.push(` codes: ${i.codes.join(", ")}`),n.push(""),n.push(" signatures:");for(let l of i.signatures)n.push(` ${l.id} ${l.definitions.length} definition${l.definitions.length===1?"":"s"}`),n.push(` ${l.signatureText}`);if(n.push(""),i.differences.length>0&&(n.push(" differences:"),n.push(...pl(i).map(l=>` ${l}`)),n.push("")),n.push(" usage:"),n.push(...cl(i).map(l=>` ${l}`)),n.push(""),i.usageImpacts.length>0){n.push(" usage check:");for(let l of i.usageImpacts)n.push(` choose ${l.signatureId}: ${ul(l)}`);n.push("")}let s=al(i);if(s.length>0){n.push(" actions:");for(let l=0;l<s.length;l++){let d=s[l];n.push(` ${l+1}. ${d.title}`);let c=Qe(d.editSummary);if(c!=="edits: none"&&n.push(` ${c}`),d.warnings)for(let m of d.warnings)n.push(` warning: ${m}`)}n.push("")}let a=ll(i);if(a.length>0){n.push(" manual:");for(let l of a)if(n.push(` ${l.description}`),l.warnings)for(let d of l.warnings)n.push(` warning: ${d}`);n.push("")}}else{n.push(`showing first ${o} groups. Use \`btxmlc repair --show <nodeId|index>\` for full details.`),n.push("");for(let r=0;r<o;r++){let i=e.groups[r],s=i.differences.flatMap(a=>a.differences).length;n.push(`[${r+1}] ${i.displayName.padEnd(20)} ${i.definitions.length} definitions, ${i.signatures.length} signatures, ${s} differing port${s===1?"":"s"}`)}n.push(""),n.push("remaining groups:");for(let r=o;r<e.groups.length;r++)n.push(` [${r+1}] ${e.groups[r].nodeId}`);n.push("")}return n.push("run `btxmlc repair --write` to resolve model groups interactively"),n.push("run `btxmlc repair --show <model|model.port|index>` to inspect one model group"),n.join(`
|
|
29
|
+
`)}function br(e){let t=e.groups.filter(r=>r.severity==="error").length,n=e.groups.filter(r=>r.severity==="warning").length,o=dl(e.groups);return JSON.stringify({ok:e.ok,version:2,schemaVersion:"2",toolVersion:"0.1.0",groups:e.groups.map(r=>({id:r.id,kind:r.kind,nodeId:r.nodeId,portName:r.portName,displayName:r.displayName,codes:r.codes,severity:r.severity,pairwiseConflictCount:r.pairwiseConflictCount,definitions:r.definitions.map(i=>({definitionId:i.definitionId,uri:i.uri,sourceKind:i.sourceKind,kind:i.kind,range:i.range,signatureId:i.signatureId,signatureText:i.signatureText})),signatures:r.signatures.map(i=>({id:i.id,signatureKey:i.signatureKey,signatureText:i.signatureText,definitions:i.definitions.map(s=>({definitionId:s.definitionId,uri:s.uri,range:s.range})),editableDefinitions:i.editableDefinitions.map(s=>({definitionId:s.definitionId,uri:s.uri,range:s.range})),nonEditableDefinitions:i.nonEditableDefinitions.map(s=>({definitionId:s.definitionId,uri:s.uri,range:s.range}))})),differences:r.differences,usageEvidence:r.usageEvidence,usageImpacts:r.usageImpacts,differencePattern:r.differencePattern,actions:r.actions.map(i=>({id:i.id,title:i.title,description:i.description,kind:i.kind,applicable:i.applicable,targetSignatureId:i.targetSignatureId,editSummary:i.editSummary,workspaceEdits:i.workspaceEdits,usageImpact:i.usageImpact,warnings:i.warnings}))})),summary:{groups:e.groups.length,signatureConflictGroups:o.signatureConflictGroups,duplicateModelGroups:o.duplicateModelGroups,duplicatePortGroups:o.duplicatePortGroups,pairwiseSignatureConflicts:o.pairwiseSignatureConflicts,errors:t,warnings:n}},null,2)}function Sr(e){let t=new Map;for(let n of e){let o=t.get(n.uri)??[];o.push(...n.edits),t.set(n.uri,o)}return Array.from(t.entries()).map(([n,o])=>({uri:n,edits:o}))}function Op(e,t){let n=Number(t);return!Number.isNaN(n)&&n>=1&&n<=e.length?e[n-1]:e.find(o=>o.displayName===t)??e.find(o=>o.nodeId===t&&o.kind!=="duplicate-port-name")}function jn(e){let t=new Map;for(let n of e)t.set(n.uri,n);return Array.from(t.values())}function vr(e){return Ze(e).flatMap(t=>{try{return[{uri:t.path,path:t.absolutePath,kind:"generic-xml",isBtXml:!1,nodes:[],diagnostics:[],originalText:ne(t.absolutePath)}]}catch{return[]}})}function fl(e,t){return[...J(e),...be(e),...Ze(e)].find(r=>r.absolutePath===t||r.path===t)?.absolutePath??t}function $p(e,t){for(let n of Sr(t)){let o=fl(e,n.uri),r=ne(o),i=bt(r,n.edits);gt(o,i)}}function ml(e,t){for(let n of Sr(t)){let o=fl(e,n.uri),r=ne(o);console.log(`
|
|
30
|
+
--- ${n.uri} ---`);for(let i of n.edits){let s=r.slice(Math.max(0,i.range.start.offset-40),i.range.start.offset),a=r.slice(i.range.end.offset,i.range.end.offset+40);console.log(`-${s}[...]${a}`),console.log(`+${s}${i.newText}${a}`)}}console.log("")}async function gl(e,t){let n=Ne(ie(e));if(!He(e))throw new Error("Invariant: resolvedConfig is required");let r=await H(e,n),{documents:i}=r,{externalModelDocuments:s}=r,a=jn([...i,...s,...vr(e)]),l=await Ye({project:e,documents:i,externalModelDocuments:s,host:n}),d=Bn({documents:a,workspace:l.semanticIndex,project:e});if(t.show){let p=Op(d,t.show);if(!p)throw new F(`error: no model group found for \`${t.show}\``,2,"run `btxmlc repair` to see available model groups");return t.output==="json"?console.log(br({ok:!1,groups:[p]})):console.log(hr(p)),{ok:!1,groups:[p]}}let c=!1;if(t.write){if(process.stdin.isTTY!==!0)throw new F("error: `btxmlc repair --write` requires an interactive terminal",2,"run `btxmlc repair --json` to inspect model conflicts in non-interactive environments");let p=new Set;for(;;){let f=await H(e,n);i=f.documents,s=f.externalModelDocuments;let x=jn([...i,...s,...vr(e)]);l=await Ye({project:e,documents:i,externalModelDocuments:s,host:n}),d=Bn({documents:x,workspace:l.semanticIndex,project:e});let b=d.filter(L=>!p.has(L.id));if(b.length===0)break;let v=b[0];t.output==="human"&&!t.quiet&&console.log(hr(v,{index:d.indexOf(v)+1,total:d.length}));let D=v.actions.filter(_n),A=[...D.map(L=>({label:L.title,value:L.id,description:Qe(L.editSummary)})),...D.length>0?[{label:"Preview an action",value:"preview",description:""}]:[],{label:"Skip this model group",value:"skip",description:""},{label:"Quit",value:"quit",description:""}],_=await wn({message:`Resolve \`${v.displayName}\``,choices:A});if(_==="quit"){c=!0;break}if(_==="skip"){p.add(v.id);continue}if(_==="preview"){let L=D.map(I=>({label:I.title,value:I.id,description:Qe(I.editSummary)}));L.push({label:"Back",value:"back",description:""});let S=await wn({message:"Preview which action?",choices:L});if(S==="back")continue;let w=v.actions.find(I=>I.id===S);w&&t.output==="human"&&!t.quiet&&(console.log(`
|
|
31
|
+
Edit preview for: ${w.title}`),ml(e,w.workspaceEdits));continue}let M=v.actions.find(L=>L.id===_);if(!M||!_n(M)){p.add(v.id);continue}let Te=[{label:"Apply",value:"apply",description:Qe(M.editSummary)},{label:"Show edit preview",value:"preview",description:""},{label:"Back",value:"back",description:""}],Z=await wn({message:`Apply edits for \`${v.displayName}\`?`,choices:Te});if(Z!=="back"){if(Z==="preview"){console.log(`
|
|
32
|
+
Edit preview for: ${M.title}`),ml(e,M.workspaceEdits);continue}$p(e,M.workspaceEdits)}}let g=await H(e,n);i=g.documents,s=g.externalModelDocuments;let y=jn([...i,...s]);l=await Ye({project:e,documents:i,externalModelDocuments:s}),d=Bn({documents:jn([...y,...vr(e)]),workspace:l.semanticIndex,project:e}),c&&d.length>0&&t.output==="human"&&!t.quiet&&console.log(An({ok:!1,groups:d}))}let m=d.length===0;return t.output==="json"?console.log(br({ok:m,groups:d})):t.quiet||(t.write?m?console.log("ok: all model conflicts resolved"):c||console.log(An({ok:m,groups:d})):console.log(An({ok:m,groups:d}))),{ok:m,groups:d}}var yl={command:"repair [files..]",describe:"Inspect and resolve conflicting node model signatures",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}).option("write",{type:"boolean"}).option("show",{type:"string"}),handler:async e=>{let t=X(Ja,e);process.exitCode=await hl(t)}};import Fn from"fs";import Ue from"path";function bl(e,t){for(let n of Fn.readdirSync(e,{withFileTypes:!0})){let o=Ue.join(e,n.name);t.push(o),n.isDirectory()&&!n.isSymbolicLink()&&bl(o,t)}}function Up(e){let t=e.replace(/\\/g,"/"),n="^";for(let o=0;o<t.length;o+=1){let r=t[o],i=t[o+1],s=t[o+2];if(r==="*"&&i==="*"&&s==="/"){n+="(?:.*/)?",o+=2;continue}if(r==="*"&&i==="*"){n+=".*",o+=1;continue}if(r==="*"){n+="[^/]*";continue}if(r==="?"){n+="[^/]";continue}if(".+^${}()|[]\\".includes(r)){n+=`\\${r}`;continue}n+=r}return n+="$",new RegExp(n)}function xr(e,t){let n=e.split(Ue.sep).join("/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||Ue.basename(n)===o:Up(o).test(n)}function qp(e){return e.includes("*")||e.includes("?")}function Sl(e,t,n=[]){let o=[],r=[];for(let i of e){let s=i.replace(/\\/g,Ue.sep);if(Fn.existsSync(s)&&Fn.statSync(s).isFile()){let a=Ue.relative(t,s).split(Ue.sep).join("/");n.some(l=>xr(a,l))||o.push(i);continue}qp(i)&&r.push(i)}if(r.length>0){let i=[];bl(t,i);for(let s of i.filter(a=>Fn.statSync(a).isFile())){let a=Ue.relative(t,s).split(Ue.sep).join("/"),l=r.some(c=>xr(a,c)),d=n.some(c=>xr(a,c));l&&!d&&o.push(s)}}return[...new Set(o)].sort()}async function yt(e,t){let n=await Ho({cwd:process.cwd(),cliFiles:t.files??t._?.slice(1)??[],configPath:t.configPath,noConfig:t.noConfig,command:e,projectRoot:t.projectRoot});if(!n.project){let i=$e({diagnostics:n.diagnostics});return i&&console.error(i),null}let o=n.project,r=He(o);return r?{...n,project:o,resolvedConfig:r}:null}import Vp from"path";function Ln(e,t,n="file.xml"){if(e===t)return"";let o=e.split(/\r?\n/),r=t.split(/\r?\n/),i=[`--- ${n}`,`+++ ${n}`],s=Math.max(o.length,r.length);for(let a=0;a<s;a+=1)o[a]!==r[a]&&(o[a]!==void 0&&i.push(`- ${o[a]}`),r[a]!==void 0&&i.push(`+ ${r[a]}`));return i.join(`
|
|
33
|
+
`)}function Xp(e){return[...new Map(e.map(t=>[t.path,t])).values()]}function zp(e,t,n){if(n.noFormat||n.lintOnly)return{diagnostics:[],needsFormat:!1,formatted:void 0};if(!n.resolvedConfig)return{diagnostics:[],needsFormat:!1,formatted:void 0};let o=Q(n.resolvedConfig,e),r=dt(t,{indentWidth:o.formatter.indentWidth,xmlDeclaration:o.formatter.xmlDeclaration,blankLineBetweenBehaviorTrees:o.formatter.blankLineBetweenBehaviorTrees,lineEnding:o.formatter.lineEnding}),i=[],s=!1;return r.ok&&!r.skipped&&(s=r.text!==t),s&&i.push(E("BTXML_FORMAT",h.Error,"file is not formatted",void 0,e,{help:`run \`btxmlc format ${e}\``})),{diagnostics:[...r.diagnostics,...i],needsFormat:s,formatted:r.ok&&!r.skipped?r.text:void 0,skipped:r.skipped}}async function Rr(e,t){let n=ie(e),o=Ne(n),{documents:r,externalModelDocuments:i,diagnostics:s}=await H(e,o),a=new Map;for(let b of J(e))a.set(b.path,ne(b.absolutePath));let l=t.noLint||t.formatOnly?void 0:await ut({project:e,documents:r,externalModelDocuments:i,mode:"check",showSuppressed:t.showSuppressed,baseline:t.baseline,maxWarnings:t.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...t.projectDiagnostics||[],...s],host:o}),d=l?.projectDiagnostics??t.projectDiagnostics??[],c=new Map((l?.files||[]).map(b=>[b.path,b])),m=[],p=Xp([...J(e),...be(e)]).map(b=>{let v=ne(b.absolutePath);return a.set(b.path,v),{path:b.path,uri:b.path,diagnostics:[],originalText:v}}),g=l?.files||p;for(let b of g){let v=a.get(b.path)??ne(Vp.resolve(n,b.path)),D=zp(b.path,v,t),P=c.get(b.path),A=[...P?.diagnostics||b.diagnostics||[],...D.diagnostics],_={path:b.path,diagnostics:A,rawDiagnostics:P?.rawDiagnostics,needsFormat:D.needsFormat,skipped:P?.skipped,skipReason:P?.skipReason,formatted:D.formatted};m.push(_)}let y=zt({projectDiagnostics:d,files:m}),f=!Tn(y,t.maxWarnings),x=Gt({projectDiagnostics:d,files:m});if(t.reporter==="json"&&console.log(En({ok:f,files:m,projectDiagnostics:d,summary:l?.summary})),!t.quiet&&t.reporter==="human"){let b=In(d,t.reporter,a);b&&console.error(b);for(let P of m){let A=a.get(P.path)??"",_=Cn(P.path,P.diagnostics,t.reporter,a);_&&console.error(_),P.needsFormat&&t.diff&&P.formatted&&console.log(Ln(A,P.formatted,P.path))}let v=l?.summary?.staleEntries?.length,D=Nn(f,m.length,v,"check",x.errors,x.warnings,t.maxWarnings===0);if(f)console.log(D);else{console.error(D);let P=Pn(v);P&&console.error(P)}}return{ok:f,files:m,projectDiagnostics:d,summary:x}}function Gp(e,t,n,o){o.quiet||(console.error(za(e)),o.diff&&console.log(Ln(t,n,e)))}function Wp(e,t,n){let o=Q(n.config,e),r=dt(t,{indentWidth:o.formatter.indentWidth,xmlDeclaration:o.formatter.xmlDeclaration,blankLineBetweenBehaviorTrees:o.formatter.blankLineBetweenBehaviorTrees,lineEnding:o.formatter.lineEnding,force:n.force});if(r.skipped)return!n.quiet&&n.output!=="json"&&console.log(`skipped ${e}`),{changed:!1,failed:!1};if(!r.ok||!r.text){if(!n.quiet){let i=new Map;i.set(e,t),console.error($e({diagnostics:r.diagnostics,defaultPath:e,sourceTextByUri:i}))}return{changed:!1,failed:!0}}if(n.check){let i=r.text!==t;return i&&Gp(e,t,r.text,n),{changed:i,failed:i}}return n.stdout?(process.stdout.write(r.text),{changed:r.text!==t,failed:!1}):(r.text!==t&>(e,r.text),{changed:r.text!==t,failed:!1})}function On(e,t){let n=[],o=!1;for(let r of e){let i=ne(r),s=Wp(r,i,t);n.push({path:r,changed:s.changed}),s.failed&&(o=!0)}return{ok:!o,results:n}}function Kp(e){return Sl(e.map(t=>t.replace(/\\/g,"/")),process.cwd(),[])}async function vl(e){let t=await yt("format",e);if(!t)return 2;let n=e.output??"human",o={...e,output:n,config:t.resolvedConfig};if(e.stdout){let i=Kp(e.files??[]);if(i.length!==1)throw new F("`--stdout` requires exactly one file",2,"pass exactly one XML file when using `--stdout`");if(e.check)throw new F("`--stdout` cannot be used with `--check`",2,"remove either `--stdout` or `--check`");if(e.diff)throw new F("`--stdout` cannot be used with `--diff`",2,"remove either `--stdout` or `--diff`");return On(i,o).ok?0:1}let r=(e.files??[]).length>0?J(t.project):[...J(t.project),...be(t.project)];return On([...new Map(r.map(i=>[i.absolutePath,i])).values()].map(i=>i.absolutePath),o).ok?0:1}async function Ha(e){let t=await yt("lint",e);if(!t)return 2;let n=e.reporter??e.output??"human",o=ar(t.project,e),r={...e,reporter:n,baseline:o,resolvedConfig:t.resolvedConfig,projectDiagnostics:t.diagnostics},i=await Wa(t.project,r);return lr(t.project,e,[...i.projectDiagnostics,...i.files.flatMap(s=>s.rawDiagnostics??s.diagnostics)]),i.ok?0:1}async function xl(e){let t=await yt("check",e);if(!t)return 2;let n=e.reporter??e.output??"human",o=ar(t.project,e),r={...e,reporter:n,baseline:o,resolvedConfig:t.resolvedConfig,projectDiagnostics:t.diagnostics},i=await Rr(t.project,r);return lr(t.project,e,[...i.projectDiagnostics,...i.files.flatMap(s=>s.rawDiagnostics??s.diagnostics)]),i.ok?0:1}async function hl(e){let t=await yt("repair",e);if(!t)return 2;let n=e.output??"human";return(await gl(t.project,{...e,output:n,show:e.show})).ok?0:1}async function ka(e){let t=await yt("check",e);if(!t)return 2;let n=e.output??"human";return(await Ta(t.project,{output:n})).ok?0:1}async function Aa(e){return Ba({type:e.type,force:e.force}).ok?0:2}async function Pa(e){return Ea(e.rule).ok?0:2}async function Ua(e){return await Oa({stdio:e.stdio}),0}import{z as $}from"zod";var Rl=xe.pipe($.object({configPath:$.string().optional(),projectRoot:$.string().optional(),noConfig:$.boolean().optional(),quiet:$.boolean().optional(),verbose:$.boolean().optional(),noColor:$.boolean().optional(),output:se,reporter:Xt.optional(),json:$.boolean().optional(),warningsAsErrors:$.boolean().optional(),noFormat:$.boolean().optional(),noLint:$.boolean().optional(),formatOnly:$.boolean().optional(),lintOnly:$.boolean().optional(),maxWarnings:$.number().optional(),showSkipped:$.boolean().optional(),showSuppressed:$.boolean().optional(),diff:$.boolean().optional(),fix:$.boolean().optional()}).merge(kn).merge(ve).superRefine((e,t)=>{e.noFormat&&e.formatOnly&&t.addIssue({code:"custom",message:"`--no-format` and `--format-only` cannot be used together"}),e.noLint&&e.lintOnly&&t.addIssue({code:"custom",message:"`--no-lint` and `--lint-only` cannot be used together"}),e.fix&&t.addIssue({code:"custom",message:"error: `--fix` is only supported for `lint`"})}).transform(e=>({...e,output:e.json?"json":e.output,reporter:e.json?"json":e.reporter??e.output,maxWarnings:e.warningsAsErrors?0:e.maxWarnings})));var Tl={command:"check [files..]",describe:"Check format and lint",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("reporter",{type:"string"}).option("json",{type:"boolean"}).option("warnings-as-errors",{type:"boolean"}).option("max-warnings",{type:"number"}).option("show-skipped",{type:"boolean"}).option("show-suppressed",{type:"boolean"}).option("baseline",{type:"string"}).option("update-baseline",{type:"string"}).option("no-baseline",{type:"boolean"}).option("diff",{type:"boolean"}).option("no-format",{type:"boolean"}).option("no-lint",{type:"boolean"}).option("format-only",{type:"boolean"}).option("lint-only",{type:"boolean"}).option("fix",{type:"boolean"}).option("stdout",{type:"boolean",hidden:!0}),handler:async e=>{if(e.stdout)throw new F("--stdout is not supported for `check`",2,"use `--output json` for machine-readable output");let t=X(Rl,e);process.exitCode=await xl(t)}};import{z as ae}from"zod";var Dl=xe.pipe(ae.object({configPath:ae.string().optional(),projectRoot:ae.string().optional(),noConfig:ae.boolean().optional(),quiet:ae.boolean().optional(),verbose:ae.boolean().optional(),noColor:ae.boolean().optional(),check:ae.boolean().optional(),diff:ae.boolean().optional(),stdout:ae.boolean().optional(),write:ae.boolean().optional(),force:ae.boolean().optional(),output:xa}).merge(ve).transform(e=>({...e})));var kl={command:"format [files..]",describe:"Format BT/XML files",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("check",{type:"boolean"}).option("diff",{type:"boolean"}).option("stdout",{type:"boolean"}).option("write",{type:"boolean"}).option("force",{type:"boolean"}).option("output",{type:"string"}),handler:async e=>{let t=X(Dl,e);process.exitCode=await vl(t)}};var Yp=new Set(["format","lint","check","repair","init","explain","doctor","language-server"]);function Zp(e,t){let n=e||"invalid command",o=n.match(/^Not enough arguments following: (.+)$/);if(o)return new F(`--${o[1]} requires a value`,2,"provide a value after the option");let r=n.match(/^Unknown argument: (.+)$/);if(r){let s=r[1],a=t[0];return a&&!a.startsWith("-")&&!Yp.has(a)?new F(`unknown command \`${a}\``,2,"run `btxmlc --help` to see available commands"):new F(`unknown option \`--${s}\``,2,"run `btxmlc --help` to see supported options")}let i=n.match(/^Unknown arguments: (.+)$/);if(i){let s=i[1].split(",")[0]?.trim()||"unknown";return new F(`unknown option \`--${s}\``,2,"run `btxmlc --help` to see supported options")}return new F(n,2)}async function Cl(e){try{return await Jp(Hp(["node","btxmlc",...e])).scriptName("btxmlc").version(ur).parserConfiguration({"boolean-negation":!1}).strict().recommendCommands().demandCommand(1).command(kl).command(Ka).command(Tl).command(yl).command(_a).command(Na).command(Da).command($a).fail((t,n)=>{throw n??Zp(t,e)}).parseAsync(),typeof process.exitCode=="number"?process.exitCode:0}catch(t){return ba(t)}}Cl(process.argv.slice(2)).then(e=>{process.exitCode=e});
|