@abco20/btxml-checker 0.1.0 → 0.1.2

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/dist/semantic.js CHANGED
@@ -1,2 +1,3 @@
1
- var S={Error:"error",Warning:"warning",Info:"info"};function M(e,t,n,i,r="",o,s){return{code:e,severity:t,message:n,uri:r,...i?{range:i}:{},...o?{details:o}:{},...s?{data:s}:{}}}function E(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}var pt={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function mt(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function T(e,t){return e.attributes.find(n=>n.name===t)}function ft(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function gt(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function yt(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function me(e,t,n){for(let i of e.attributes||[]){let r=[...String(i.value).matchAll(/\{([^}]+)\}/g)];for(let o of r){let s=o.index??0,a=i.valueRange.start,d={...a,character:a.character+o[0].length,offset:a.offset+s+o[0].length};t.push({name:o[1],attributeName:i.name,element:e,uri:n,range:{start:{...a,character:a.character+s,offset:a.offset+s},end:d}})}}for(let i of e.children||[])i.kind==="element"&&me(i,t,n)}function Tt(e,t,n,i){let r=[];for(let o of e.children||[]){if(o.kind!=="element"||!ft(o.name))continue;let s=T(o,"ID");if(!s)continue;let a=[];for(let d of o.children||[]){if(d.kind!=="element"||d.name!=="input_port"&&d.name!=="output_port"&&d.name!=="inout_port")continue;let u=T(d,"name"),l=T(d,"type"),m=T(d,"default")||T(d,"default_value"),f=T(d,"enum"),c=(d.children||[]).filter(y=>y.kind==="text").map(y=>y.text).join("").trim()||void 0,g=d.name==="input_port"?"input":d.name==="output_port"?"output":"inout",p=(g==="input"||g==="inout")&&m===void 0;a.push({source:n,direction:g,name:u?u.value:"",type:l?.value||void 0,defaultValue:m?.value||void 0,description:c,required:p,element:d,uri:t,range:d.range,nameRange:u?.range,enum:f?.value?f.value.split(";"):void 0})}r.push({id:s.value,kind:o.name,source:n,sourceMeta:{sourceKind:n,file:t,range:o.range},editable:i,ports:a,element:o,uri:t,range:o.range,elementRange:o.range,idRange:s.range})}return r}function St(e,t){let n=[];for(let i of e.children||[]){if(i.kind!=="element"||i.name!=="BehaviorTree")continue;let r=T(i,"ID");r&&n.push({id:r.value,kind:"BehaviorTree",uri:t,element:i,range:i.range,elementRange:i.range,idRange:r.range})}return n}function bt(e,t){let n=[],i=(r,o)=>{let s=r.name==="BehaviorTree"?T(r,"ID")?.value??o:o;if(r.name==="SubTree"){let a=T(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"&&i(a,s)};for(let r of e.children||[])r.kind==="element"&&i(r);return n}function Dt(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function fe(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 ht(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(fe),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 Nt(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Mt(e){return{name:e.name,attributeName:e.attributeName,uri:e.uri,range:e.range}}function Bt(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(Dt),subtreeReferences:e.subtreeReferences.map(Nt),blackboardReferences:e.blackboardReferences.map(Mt),treeNodesModel:e.treeNodesModel.map(ht),genericSubTreePorts:e.genericSubTreePorts.map(fe),rootMainTreeToExecute:gt(e.rootMainTreeToExecute)}}function vt(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function xt(e){return M(pt.DuplicateNodeModelId,S.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 kt(e,t){let n=[],i=t?.uri||e.uri,r=e.root,o=e.isBtXml,s=mt(e),a=yt(e),d=((t?.path??e.path)||i==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",u=r&&e.kind!=="model-document"?St(r,i):[],l=[],m=[],f=r?r.name==="TreeNodesModel"?[r]:r.children.filter(h=>h.kind==="element"&&h.name==="TreeNodesModel"):[];for(let h of f){let ct=Tt(h,i,a,d),pe=new Map;for(let x of ct)vt({node:x,treeNodesModel:l,genericSubTreePorts:m})||(pe.has(x.id)?n.push(xt(x)):pe.set(x.id,x))}let c=r?bt(r,i):[],g=r?(()=>{let h=[];return me(r,h,i),h})():[],p=r?T(r,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Bt({uri:i,path:t?.path??e.path,isBtXml:o,kind:s,behaviorTrees:u,subtreeReferences:c,blackboardReferences:g,treeNodesModel:l,genericSubTreePorts:m,rootMainTreeToExecute:p?{uri:i,range:p.range,value:p.value}:void 0}),extractedBehaviorTrees:u,extractedTreeNodesModel:l,extractedSubTreeReferences:c,extractedBlackboardReferences:g},diagnostics:n}}function ge(e,t){let{extracted:n,diagnostics:i}=kt(e,t);return{model:n.publicModel,diagnostics:i}}function G(e,t){return ge(e,t)}var ye=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),An=new Set([...ye,"_autoremap","_description","__shared_blackboard"]);function K(e){return ye.has(e)}function Te(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 j(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,i])=>Te(n,i))}}var Rt=[{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"]}],_=new Map,Se=new Map;for(let e of Rt){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Se.set(e.name,t),_.set(e.name,e.name);for(let n of e.aliases)_.set(n,e.name)}function Pt(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 X(e){return _.get(e)??e}function It(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 w(e=[]){let t=new Map,n=new Map(_);for(let i of Se.values())t.set(i.canonical,{name:i.name,kind:i.kind,canonical:i.canonical,aliases:new Set([i.name,i.canonical,...i.aliases]),compatibleWith:new Set(i.compatibleWith),validate:i.validate,source:i.source});for(let i of e)for(let[r,o]of Object.entries(i.types??{})){let s=X(o.canonical??r),d=t.get(s)??Pt(r,s,o);d.name=r,d.kind=o.kind,d.canonical=s,d.source="augmentation",d.validate=o.validate??d.validate,d.aliases.add(r),d.aliases.add(s);for(let u of o.aliases??[])d.aliases.add(u);for(let u of o.compatibleWith??[])d.compatibleWith.add(u);t.set(s,d),n.set(r,s),n.set(s,s);for(let u of o.aliases??[])n.set(u,s)}for(let i of t.values())i.compatibleWith=new Set([...i.compatibleWith].map(r=>n.get(r)??X(r))),i.compatibleWith.delete(i.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([i,r])=>[i,It(r)])),namesToCanonical:n}}function be(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??X(t),i=e.entriesByCanonical.get(n);return i||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function W(e,t){return be(e,t)?.canonical}var De=[{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:[]}],he={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 Ne=[{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:[]}],Me={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 Be=[{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:[]}],ve={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 xe=["4.6.2","4.8.2","4.9.0"],$="4.9.0",k={"4.6.2":{models:De,genericSubTreeModel:he},"4.8.2":{models:Ne,genericSubTreeModel:Me},"4.9.0":{models:Be,genericSubTreeModel:ve}};var ke=xe.map(e=>`btcpp-v${e}`),z=["btcpp-v4",...ke],Re=`btcpp-v${$}`;function Pe(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 Et(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Pe)}))}function Ie(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Pe)}}function _t(){let e={};for(let[t,n]of Object.entries(k))e[`btcpp-v${t}`]=Et(n.models);return e}function wt(){let e={};for(let[t,n]of Object.entries(k))e[`btcpp-v${t}`]=Ie(n.genericSubTreeModel);return e}var Ct=_t(),At=wt();function Vt(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(k,t)}function Ee(e){return e==="btcpp-v4"?Re:e}function qt(e){return e==="btcpp-v4"?$:e.replace(/^btcpp-v/,"")}function _e(e){if(e&&e!=="btcpp-v4"&&!Vt(e))throw new Error(`unsupported builtin model set: ${e}`)}function J(e="btcpp-v4"){_e(e);let t=Ee(e);return Ct[t].map(i=>we(i))}function Y(e="btcpp-v4"){_e(e);let t=At[Ee(e)]??Ie(k[qt(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function we(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 R(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let i=t.name.localeCompare(n.name);if(i!==0)return i;let r=t.direction.localeCompare(n.direction);if(r!==0)return r;let o=(t.type??"").localeCompare(n.type??"");if(o!==0)return o;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 C(e,t){let n=R(e),i=R(t);return JSON.stringify(n)===JSON.stringify(i)}function H(e,t){if(C(e,t))return"none";let n=R(e),i=R(t);if(n.kind!==i.kind)return"kind";if(n.ports.length!==i.ports.length)return"ports";let r=new Map(i.ports.map(a=>[a.name,a])),o=!1,s=!1;for(let a of n.ports){let d=r.get(a.name);if(!d){s=!0;continue}(a.direction!==d.direction||a.type!==d.type||a.required!==d.required)&&(s=!0);let u=a.enum?JSON.stringify(a.enum):"",l=d.enum?JSON.stringify(d.enum):"";u!==l&&(s=!0),a.description!==d.description&&(s=!0),a.defaultValue!==d.defaultValue&&(o=!0)}return s?"ports":o?"port-default":"mixed"}function Ce(e,t){if(t)return W(e,t)}function Ae(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Ve(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return M(e.code,S.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Lt(e,t,n,i,r){let o=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:o,typeSource:n.typeSource??Ae(n),validate:i.validate??n.validate,required:i.required??n.required,enum:i.enum?[...i.enum]:n.enum,description:i.description??n.description},d=i.typeRefinement;if(!d)return{...a,type:a.effectiveType};let u=Ce(e,d.from),l=Ce(e,o);return u&&u!==l?(r.push(Ve({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 \`${o??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:o,actualFrom:d.from,to:d.to},notes:o||d.from?[`base type: ${o??"(unspecified)"}`,`requested from: ${d.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:d.to,effectiveType:d.to,typeSource:"model-augmentation",typeRefinement:d}}function Ft(e,t,n,i){let r=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of Object.entries(n.ports??{})){let a=r.get(o);if(!a){i.push(Ve({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${o}\` 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:o}}));continue}r.set(o,Lt(e,t,a,s,i))}return{...t,ports:t.ports.map(o=>r.get(o.name)??o)}}function Ot(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Ae(e)}}function qe(e,t,n){let i=[],r=new Map([...e.entries()].map(([o,s])=>[o,{...s,ports:s.ports.map(Ot)}]));for(let o of n)for(let[s,a]of Object.entries(o.augment??{})){let d=r.get(s);if(!d){i.push(M("BT117_AUGMENT_TARGET_NOT_FOUND",S.Error,`augmentation target node \`${s}\` not found`,void 0,o.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:o.path?[`augmentation file: ${o.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:o.path}));continue}r.set(s,Ft(t,d,a,i))}return{modelsById:r,diagnostics:i}}function Fe(e){return P("builtin",0,!1,e)}function Oe(e){return P("xml-tree-nodes-model",10,!0,e)}function Ge(e){return P("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Ke(e){return P("node-definition-file",20,!0,e)}function je(e){return P("config-inline",30,!0,e)}function P(e,t,n,i){return{kind:e,precedence:t,editable:n,models:i.map(r=>Xe(r,e,n&&r.editable!==!1))}}function Gt(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Xe(e,t,n){let i=Gt(t);return{...e,source:i,sourceMeta:e.sourceMeta??{sourceKind:i,file:e.uri,range:e.range},editable:n,ports:e.ports.map(r=>({...r,source:i}))}}function B(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 Ue(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 Kt(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let i=new Map(e.ports.map(o=>[o.name,o])),r=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of i)r.has(o)||n.push({kind:"port-removed",portName:o,sourceIndex:0,port:Ue(s)});for(let[o,s]of r)i.has(o)||n.push({kind:"port-added",portName:o,sourceIndex:1,port:Ue(s)});for(let[o,s]of i){let a=r.get(o);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:o,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:o,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:o,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:o,left:s.defaultValue,right:a.defaultValue});let d=s.enum?JSON.stringify([...s.enum].sort()):"",u=a.enum?JSON.stringify([...a.enum].sort()):"";d!==u&&n.push({kind:"port-enum",portName:o,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:o,left:s.description,right:a.description})}return n}function Le(e,t){let n=new Map;for(let i of e){let r=n.get(i.id);if(!r){n.set(i.id,i);continue}if(C(r,i))continue;let o=H(r,i),s=Kt(r,i),a;if(o==="port-default"){let d=new Map(r.ports.map(f=>[f.name,f])),u=i.ports.find(f=>{let c=d.get(f.name);return c&&c.defaultValue!==f.defaultValue}),l=u?.name??"unknown",m=[B(r,0),B(i,1)];a={kind:"port-default-conflict",nodeId:i.id,portName:l,sources:[{source:B(r,0),value:d.get(l)?.defaultValue},{source:B(i,1),value:u?.defaultValue}]},t.push({id:i.id,definitions:[r,i],sources:m,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${l}\` on node \`${i.id}\``,uri:i.uri,range:i.idRange||i.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${i.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 d=[B(r,0),B(i,1)];a={kind:"node-model-conflict",nodeId:i.id,sources:d,differences:s},t.push({id:i.id,definitions:[r,i],sources:d,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${i.id}\``,uri:i.uri,range:i.idRange||i.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${i.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 jt(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(i=>[i.name,i]));for(let i of t.ports)n.set(i.name,i);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function We(e){let t=[],n=new Map,i=new Map,r=[...e].sort((a,d)=>a.precedence-d.precedence),o=new Map,s=new Map;for(let a of r){let d=o.get(a.precedence)??[],u=a.models.map(l=>Xe(l,a.kind,a.editable&&l.editable!==!1));d.push(...u),o.set(a.precedence,d);for(let l of u)s.set(l.id,a.precedence)}for(let[a,d]of[...o.entries()].sort((u,l)=>u[0]-l[0])){let u=d.filter(c=>s.get(c.id)===a),l=d.filter(c=>s.get(c.id)!==a),m=Le(l,[]);for(let[c,g]of Le(u,t))m.set(c,g);let f=new Set(d.map(c=>c.id));for(let c of f)s.get(c)===a&&n.set(c,d.filter(g=>g.id===c));for(let[c,g]of m)i.set(c,jt(i.get(c),g))}return{nodeModelsById:n,mergedNodeModelsById:i,conflicts:t}}function Xt(e){return z.includes(e)}function Wt(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:w(),augmentations:[]}}function $t(e,t,n){let i=e.get(t)||[];i.push(n),e.set(t,i)}function zt(e,t,n){for(let i of new Set(n))if(Xt(i)){for(let r of J(i))e.builtins.set(r.id,r),t.push(r);e.genericSubTreePorts.push(...Y(i))}}function Jt(e,t,n,i,r){for(let o of r){let s=G(o,{uri:o.uri,path:o.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(o.uri,a);for(let d of a.behaviorTrees)$t(e.behaviorTreesById,d.id,d);o.kind==="model-document"?i.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Yt(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 Ht(e){let t=new Set,n=[];for(let i of e.genericSubTreePorts){let r=Yt(i);t.has(r)||(t.add(r),n.push(i))}e.genericSubTreePorts=n}function Qt(e,t,n,i,r){e.modelLayers.push(Fe(t),Oe(n),Ge(i)),r.models?.length&&e.modelLayers.push(Ke([...r.models])),e.modelLayers.push(...r.additionalModelLayers??[])}function $e(e,t){return Zt(e,t)}function Zt(e,t){let n=Wt(),i=[],r=[],o=[],s=[];zt(n,r,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=w(t.augmentations??[]),Jt(n,i,o,s,e),Ht(n),Qt(n,r,o,s,t);let a=t.config.models.inline;if(a){let l=[];for(let[m,f]of Object.entries(a))l.push(j(m,f));n.modelLayers.push(je(l))}let d=We(n.modelLayers),u=qe(d.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=d.nodeModelsById,n.mergedNodeModelsById=u.modelsById,n.modelConflicts=d.conflicts,i.push(...u.diagnostics),{ok:i.every(l=>l.severity!==S.Error),index:n,diagnostics:i}}var ze={unknownSubTreePorts:"allow"};function Je(e){return{...ze,...e}}var en=["Action","Condition","Control","Decorator"],tn=new Set(en);var nn=new Set(["input_port","output_port","inout_port"]);function v(e){return tn.has(e)}function Z(e){return v(e)?e:void 0}function A(e,t){return e.attributes.find(n=>n.name===t)?.value}function Q(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&Q(n,t))return!0;return!1}function Ye(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return Q(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&Q(n,t))return!0;return!1}function V(e){return nn.has(e.name)}function He(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":v(e.name)?"generic-node":V(e)?"unknown-xml":"concrete-node"}function I(e){if(e.name==="SubTree")return A(e,"ID")||"SubTree";if(v(e.name))return A(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||V(e)))return e.name}function q(e,t){return e.behaviorTreesById.get(t)??[]}function Qe(e,t){return ee(e).flatMap(n=>n.subtreeReferences.filter(i=>i.id===t))}function Ze(e){return ee(e).flatMap(t=>t.subtreeReferences)}function et(e){return[...e.behaviorTreesById.keys()]}function ee(e){return[...e.documents.values()]}function N(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function U(e,t){return e.modelLayers.flatMap(n=>n.models.filter(i=>i.id===t))}function tt(e){return[...e.mergedNodeModelsById.values()]}function nt(e){return[...e.mergedNodeModelsById.values()]}function L(e){return[...e.genericSubTreePorts]}function F(e){return e.modelConflicts}function O(e,t){let{id:n,fileLocalUri:i,config:r}=t,o=q(e,n);if(o.length>0){if((r?.resolver?.behaviorTreeIds==="file-local-first"||r?.resolver?.behaviorTreeIds==="allow-ambiguous")&&i){let u=o.filter(l=>l.uri===i);u.length>0&&(o=u)}let a=N(e,n),d=a?.kind==="SubTree"?[a]:[];return o.length===1?{status:"resolved",kind:"behavior-tree",treeId:o[0].id,behaviorTree:o[0]}:{status:"ambiguous",candidates:[...o.map(u=>u.id),...d.map(u=>u.id)],behaviorTrees:o,definitions:d}}let s=N(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function te(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=N(e,t);if(n){let r=F(e).find(o=>o.id===t&&o.code==="BT012_CONFLICTING_NODE_MODEL");return r?{status:"ambiguous",nodeType:t,candidates:r.definitions}:{status:"resolved",model:n}}let i=U(e,t);return i.length===1?{status:"resolved",model:i[0]}:i.length>1?{status:"ambiguous",nodeType:t,candidates:i}:{status:"unresolved",nodeType:t}}function ne(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function ie(e){let t=L(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return ne([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function re(e){let{attribute:t}=e,n=e.ports.find(i=>i.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:K(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 b(e,t){let n=Je(t.policy),i=t.element,r=He(i),o=Ye(t.documentRoot,i);if((t.isModelDefinition||o&&(r==="generic-node"||r==="subtree"))&&(r="model-definition"),o&&V(i)&&(r="unknown-xml"),r==="root"||r==="behavior-tree"||r==="tree-nodes-model"||r==="include"||r==="model-definition"||r==="unknown-xml")return{element:i,tagName:i.name,tagForm:r,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=I(i);if(r!=="subtree"){let c=te(e,s),g=ie({index:e,tagForm:r,model:c}),p=i.attributes.map(y=>re({attribute:y,ports:g,allowsArbitraryAttributes:!1,model:c}));return{element:i,tagName:i.name,tagForm:r,nodeType:s,model:c,ports:g,allowsArbitraryAttributes:!1,portUsages:p}}let a=A(i,"ID"),d=a?O(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},u={status:"unresolved",nodeType:a},l=!1;if(d.status==="resolved"&&d.kind==="node-model")u={status:"resolved",model:d.model};else if(d.status==="resolved"&&d.kind==="behavior-tree"){let c=te(e,d.treeId);c.status==="resolved"&&c.model.kind==="SubTree"?u=c:l=n.unknownSubTreePorts==="allow"}else d.status==="ambiguous"&&d.definitions.length>0?u=d.definitions.length===1?{status:"resolved",model:d.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:d.definitions}:l=n.unknownSubTreePorts==="allow";let m=ie({index:e,tagForm:r,model:u,subtreeModelPorts:d.status==="ambiguous"?ne(d.definitions.flatMap(c=>c.ports)):void 0}),f=i.attributes.map(c=>re({attribute:c,ports:m,allowsArbitraryAttributes:l,model:u,unknownModelPortStatus:!l&&u.status!=="resolved"?"undeclared":void 0}));return{element:i,tagName:i.name,tagForm:r,nodeType:s,model:u,subtree:{id:a,target:d},ports:m,allowsArbitraryAttributes:l,portUsages:f}}function oe(e,t){return b(e,t).portUsages.find(i=>i.name===t.attributeName)}function de(e,t){return b(e,t).ports}function rn(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function on(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function it(e,t){let n=e.line,i=e.character,r=e.offset;for(let o of t){if(r+=o.length,o===`
2
- `){n+=1,i=0;continue}i+=o.length}return{line:n,character:i,offset:r}}function dn(e,t,n){let i=it(e,t),r=it(i,n);return{start:i,end:r}}function ot(e,t){let n=t.valueContentRange||t.valueRange,i=e.originalText.slice(n.start.offset,n.end.offset),r=[];for(let o of i.matchAll(/\{([^}]+)\}/g)){let s=o[0],a=o[1],d=o.index??0;r.push({raw:s,key:a,range:dn(n.start,i.slice(0,d),s),syntax:"braced"})}return r.length===0&&(i.includes("{")||i.includes("}"))&&r.push({raw:i,key:i,range:n,syntax:"invalid"}),r}function an(e,t){return rn(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function dt(e){let t=[];for(let n of e)t.push(n),t.push(...dt(n.children));return t}function sn(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function un(e){let t=new Map(e.map((n,i)=>[n,i]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function ln(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function at(e){return D(e,"name")?.value}function cn(e){return at(e)||D(e,"ID")?.value||e.name}function pn(e){let t=[],n=e;for(;n;){let i=n.path.at(-1)??0;t.unshift(`${i}:${cn(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function st(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 ut(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 mn(e){return e.status==="resolved"?e.port.direction:"unknown"}function fn(e,t){return e===""?"empty":e==="{=}"?"substitution":t.some(n=>n.syntax==="braced")?"blackboard-reference":t.some(n=>n.syntax==="invalid")?"unknown":"literal"}function rt(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:mn(t.usage),valueKind:fn(t.value,t.blackboardReferences),range:t.attribute.range,nameRange:t.attribute.nameRange,valueRange:t.attribute.valueContentRange||t.attribute.valueRange,resolution:t.declaredPort,usage:t.usage,blackboardReferences:t.blackboardReferences}}function gn(e){let t=new Set;for(let n of[e.name,e.idAttr,e.nodeType,e.tagName,e.instancePath,e.behaviorTreeId&&!e.instancePath.startsWith(`${e.behaviorTreeId}/`)?`${e.behaviorTreeId}/${e.instancePath}`:void 0,e.nodeId])n&&t.add(n);return[...t]}function D(e,t){return e.attributes.find(n=>n.name===t)}function yn(e){return e.root?D(e.root,"main_tree_to_execute")?.value:void 0}function Tn(e){let t=new Set;if(!e)return t;let n=i=>{t.add(i);for(let r of i.children)r.kind==="element"&&n(r)};if(e.name==="TreeNodesModel")return n(e),t;for(let i of e.children)i.kind!=="element"||i.name!=="TreeNodesModel"||n(i);return t}function lt(e,t){let n=t.semantic,i=Tn(e.root),r=on(e).map(d=>({id:D(d,"ID")?.value,element:d,rootNode:void 0,nodes:[]})),o=[],s=[],a=(d,u,l,m)=>{let f=b(n,{element:d,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:i.has(d)}),c=st(f),g={element:d,path:m,tagName:d.name,kind:an(d,f),model:c,usage:f,portBindings:[],children:[],parent:l,behaviorTree:u};if(g.portBindings=f.portUsages.filter(p=>p.status!=="reserved-attribute").map(p=>({name:p.name,value:p.value,attribute:p.attribute,declaredPort:ut(p),usage:p,blackboardReferences:ot(e,p.attribute)})),g.children=d.children.filter(p=>p.kind==="element").map((p,y)=>a(p,u,g,[...m,y])),d.name==="SubTree"){let p=D(d,"ID")?.value;o.push({node:g,id:p,target:f.subtree?.target??{status:"unresolved",id:p},portRemaps:g.portBindings})}return g};for(let d of r){let u=d.element.children.filter(l=>l.kind==="element").map((l,m)=>a(l,d,void 0,[m]));d.rootNode=u[0],d.nodes=dt(u),s.push(...d.nodes)}return{document:e,behaviorTrees:r,subtreeCalls:o,nodes:s}}function ae(e,t,n){let i=lt(e,{semantic:t,config:n?.config,policy:n?.policy}),r=un(i.behaviorTrees),o=i.nodes.map(u=>{let l=r(u),m=u.usage,f=m.nodeType??u.tagName,c=at(u.element),g=D(u.element,"ID")?.value,p=pn(u);return{nodeId:l,path:u.path,instancePath:p,tagName:u.tagName,nodeType:f,name:c,idAttr:g,kind:u.kind,range:u.element.range,fullRange:u.element.fullRange,nameRange:u.element.nameRange,parentNodeId:u.parent?r(u.parent):void 0,childNodeIds:u.children.map(r),behaviorTreeId:u.behaviorTree.id,attributes:u.element.attributes.map(ln),identityCandidates:gn({name:c,idAttr:g,nodeType:f,tagName:u.tagName,instancePath:p,behaviorTreeId:u.behaviorTree.id,nodeId:l}),model:st(m),usage:m,portBindings:m.portUsages.filter(y=>y.status!=="reserved-attribute").map(y=>rt(l,{name:y.name,value:y.value,attribute:y.attribute,declaredPort:ut(y),usage:y,blackboardReferences:ot(e,y.attribute)}))}}),s=i.behaviorTrees.map(u=>({id:u.id,range:u.element.range,idRange:D(u.element,"ID")?.valueContentRange,rootNodeId:u.rootNode?r(u.rootNode):void 0,nodeIds:u.nodes.map(r)})),a=i.subtreeCalls.map(u=>({nodeId:r(u.node),callId:u.id,range:u.node.element.range,target:u.target,portBindings:u.portRemaps.map(l=>rt(r(u.node),l))})),d=e.root?D(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:sn(e),mainTreeToExecute:yn(e),mainTreeToExecuteRange:d?.valueContentRange||d?.valueRange,behaviorTrees:s,nodes:o,subtreeCalls:a}}function Sn(e,t){return E(e.fullRange||e.range,t)}function bn(e,t){let n=e.fullRange||e.range,i=t.fullRange||t.range;return n.end.offset-n.start.offset<i.end.offset-i.start.offset}function se(e){return e.nodes}function ue(e){return e.subtreeCalls}function le(e,t){let n;for(let i of e.nodes)Sn(i,t.offset)&&(!n||bn(i,n))&&(n=i);return n}function ce(e,t){for(let n of e.nodes)for(let i of n.portBindings)if(E(i.range,t.offset))return i}export{ae as buildSemanticDocumentView,$e as buildSemanticIndex,le as findSemanticNodeAtPosition,ce as findSemanticPortBindingAtPosition,tt as getAllNodeModels,se as getAllSemanticTreeNodes,Ze as getAllSubTreeReferences,et as getBehaviorTreeIds,q as getBehaviorTrees,nt as getEffectiveNodeModels,Z as getGenericNodeKindFromTag,L as getGenericSubTreePorts,F as getModelConflicts,N as getNodeModel,U as getNodeModelDefinitions,I as getNodeTypeFromElement,ue as getSemanticSubTreeCalls,Qe as getSubTreeReferences,de as getUsagePorts,v as isGenericNodeTag,b as resolveNodeUsage,oe as resolvePortUsage,O as resolveSubTreeTarget};
1
+ var S={Error:"error",Warning:"warning",Info:"info"};function M(e,t,n,r,i="",o,s){return{code:e,severity:t,message:n,uri:i,...r?{range:r}:{},...o?{details:o}:{},...s?{data:s}:{}}}function A(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}var Tt=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function be(e){return{ok:!0,reference:e}}function x(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Se(e){return Tt.test(e)}function ht(e){if(!e)return x("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?Se(t)?{ok:!0,scope:"global",key:t}:x("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):x("empty-key",e,"Global blackboard reference key must not be empty")}return Se(e)?{ok:!0,scope:"local",key:e}:x("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function T(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return be({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return x("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return x("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let r=n.slice(1,-1).trim(),i=ht(r);return i.ok?be({scope:i.scope,key:i.key,raw:n,syntax:"braced"}):i}function B(e){return`${e.scope}:${e.key}`}var kt={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Dt(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function b(e,t){return e.attributes.find(n=>n.name===t)}function Bt(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Nt(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Mt(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Te(e,t){let n=e.line,r=e.character,i=e.offset;for(let o of t){if(i+=o.length,o===`
2
+ `){n+=1,r=0;continue}r+=o.length}return{line:n,character:r,offset:i}}function xt(e,t,n){let r=Te(e,t),i=Te(r,n);return{start:r,end:i}}function he(e,t,n,r){for(let i of e.attributes||[]){let o=i.valueContentRange??i.valueRange,s=r.slice(o.start.offset,o.end.offset),u=d=>{let c=T({portName:i.name,rawValue:d.parsedRaw});if(!c.ok)return;let p=c.reference.raw.length;t.push({raw:c.reference.raw,key:c.reference.key,scope:c.reference.scope,identity:B(c.reference),syntax:c.reference.syntax,attributeName:i.name,element:e,uri:n,range:xt(o.start,s.slice(0,d.parsedOffset),c.reference.raw.slice(0,p))})},a=T({portName:i.name,rawValue:s});if(a.ok){let d=Math.max(0,s.indexOf(a.reference.raw));u({parsedRaw:a.reference.raw,parsedOffset:d});continue}for(let d of s.matchAll(/\{[^}]*\}/g)){let c=d[0],p=d.index??0;u({parsedRaw:c,parsedOffset:p})}}for(let i of e.children||[])i.kind==="element"&&he(i,t,n,r)}function vt(e,t,n,r){let i=[];for(let o of e.children||[]){if(o.kind!=="element"||!Bt(o.name))continue;let s=b(o,"ID");if(!s)continue;let u=[];for(let a of o.children||[]){if(a.kind!=="element"||a.name!=="input_port"&&a.name!=="output_port"&&a.name!=="inout_port")continue;let d=b(a,"name"),c=b(a,"type"),p=b(a,"default")||b(a,"default_value"),f=b(a,"enum"),l=(a.children||[]).filter(y=>y.kind==="text").map(y=>y.text).join("").trim()||void 0,g=a.name==="input_port"?"input":a.name==="output_port"?"output":"inout",m=(g==="input"||g==="inout")&&p===void 0;u.push({source:n,direction:g,name:d?d.value:"",type:c?.value||void 0,defaultValue:p?.value||void 0,description:l,required:m,element:a,uri:t,range:a.range,nameRange:d?.range,enum:f?.value?f.value.split(";"):void 0})}i.push({id:s.value,kind:o.name,source:n,sourceMeta:{sourceKind:n,file:t,range:o.range},editable:r,ports:u,element:o,uri:t,range:o.range,elementRange:o.range,idRange:s.range})}return i}function Rt(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let i=b(r,"ID");i&&n.push({id:i.value,kind:"BehaviorTree",uri:t,element:r,range:r.range,elementRange:r.range,idRange:i.range})}return n}function Pt(e,t){let n=[],r=(i,o,s=!1)=>{if(s)return;let u=i.name==="BehaviorTree"?b(i,"ID")?.value??o:o,a=i.name==="TreeNodesModel";if(i.name==="SubTree"){let d=b(i,"ID");d&&n.push({id:d.value,uri:t,element:i,range:i.range,elementRange:i.range,idRange:d.range,parentBehaviorTreeId:u,attributes:i.attributes})}for(let d of i.children||[])d.kind==="element"&&r(d,u,a)};if(e.name==="TreeNodesModel")return n;for(let i of e.children||[])i.kind==="element"&&r(i);return n}function It(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function ke(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 wt(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(ke),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 Et(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function _t(e){return{raw:e.raw,key:e.key,scope:e.scope,identity:e.identity,syntax:e.syntax,attributeName:e.attributeName,uri:e.uri,range:e.range}}function At(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(It),subtreeReferences:e.subtreeReferences.map(Et),blackboardReferences:e.blackboardReferences.map(_t),treeNodesModel:e.treeNodesModel.map(wt),genericSubTreePorts:e.genericSubTreePorts.map(ke),rootMainTreeToExecute:Nt(e.rootMainTreeToExecute)}}function Vt(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Ct(e){return M(kt.DuplicateNodeModelId,S.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 qt(e,t){let n=[],r=t?.uri||e.uri,i=e.root,o=e.isBtXml,s=Dt(e),u=Mt(e),a=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",d=i&&e.kind!=="model-document"?Rt(i,r):[],c=[],p=[],f=i?i.name==="TreeNodesModel"?[i]:i.children.filter(D=>D.kind==="element"&&D.name==="TreeNodesModel"):[];for(let D of f){let St=vt(D,r,u,a),ye=new Map;for(let P of St)Vt({node:P,treeNodesModel:c,genericSubTreePorts:p})||(ye.has(P.id)?n.push(Ct(P)):ye.set(P.id,P))}let l=i?Pt(i,r):[],g=i?(()=>{let D=[];return he(i,D,r,e.originalText),D})():[],m=i?b(i,"main_tree_to_execute"):void 0;return{extracted:{publicModel:At({uri:r,path:t?.path??e.path,isBtXml:o,kind:s,behaviorTrees:d,subtreeReferences:l,blackboardReferences:g,treeNodesModel:c,genericSubTreePorts:p,rootMainTreeToExecute:m?{uri:r,range:m.range,value:m.value}:void 0}),extractedBehaviorTrees:d,extractedTreeNodesModel:c,extractedSubTreeReferences:l,extractedBlackboardReferences:g},diagnostics:n}}function De(e,t){let{extracted:n,diagnostics:r}=qt(e,t);return{model:n.publicModel,diagnostics:r}}function X(e,t){return De(e,t)}var Be=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Wn=new Set([...Be,"_autoremap","_description","__shared_blackboard"]);function $(e){return Be.has(e)}function Ne(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 W(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>Ne(n,r))}}var Ut=[{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"]}],V=new Map,Me=new Map;for(let e of Ut){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Me.set(e.name,t),V.set(e.name,e.name);for(let n of e.aliases)V.set(n,e.name)}function Lt(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 z(e){return V.get(e)??e}function Ft(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 C(e=[]){let t=new Map,n=new Map(V);for(let r of Me.values())t.set(r.canonical,{name:r.name,kind:r.kind,canonical:r.canonical,aliases:new Set([r.name,r.canonical,...r.aliases]),compatibleWith:new Set(r.compatibleWith),validate:r.validate,source:r.source});for(let r of e)for(let[i,o]of Object.entries(r.types??{})){let s=z(o.canonical??i),a=t.get(s)??Lt(i,s,o);a.name=i,a.kind=o.kind,a.canonical=s,a.source="augmentation",a.validate=o.validate??a.validate,a.aliases.add(i),a.aliases.add(s);for(let d of o.aliases??[])a.aliases.add(d);for(let d of o.compatibleWith??[])a.compatibleWith.add(d);t.set(s,a),n.set(i,s),n.set(s,s);for(let d of o.aliases??[])n.set(d,s)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(i=>n.get(i)??z(i))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,i])=>[r,Ft(i)])),namesToCanonical:n}}function xe(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??z(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function J(e,t){return xe(e,t)?.canonical}var ve=[{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:[]}],Re={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 Pe=[{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:[]}],Ie={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 we=[{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:[]}],Ee={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 _e=["4.6.2","4.8.2","4.9.0"],Y="4.9.0",I={"4.6.2":{models:ve,genericSubTreeModel:Re},"4.8.2":{models:Pe,genericSubTreeModel:Ie},"4.9.0":{models:we,genericSubTreeModel:Ee}};var Ae=_e.map(e=>`btcpp-v${e}`),Z=["btcpp-v4",...Ae],Ve=`btcpp-v${Y}`;function Ce(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 Ot(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Ce)}))}function qe(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Ce)}}function Kt(){let e={};for(let[t,n]of Object.entries(I))e[`btcpp-v${t}`]=Ot(n.models);return e}function Gt(){let e={};for(let[t,n]of Object.entries(I))e[`btcpp-v${t}`]=qe(n.genericSubTreeModel);return e}var jt=Kt(),Xt=Gt();function $t(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(I,t)}function Ue(e){return e==="btcpp-v4"?Ve:e}function Wt(e){return e==="btcpp-v4"?Y:e.replace(/^btcpp-v/,"")}function Le(e){if(e&&e!=="btcpp-v4"&&!$t(e))throw new Error(`unsupported builtin model set: ${e}`)}function H(e="btcpp-v4"){Le(e);let t=Ue(e);return jt[t].map(r=>Fe(r))}function Q(e="btcpp-v4"){Le(e);let t=Xt[Ue(e)]??qe(I[Wt(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Fe(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 w(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let r=t.name.localeCompare(n.name);if(r!==0)return r;let i=t.direction.localeCompare(n.direction);if(i!==0)return i;let o=(t.type??"").localeCompare(n.type??"");if(o!==0)return o;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 q(e,t){let n=w(e),r=w(t);return JSON.stringify(n)===JSON.stringify(r)}function ee(e,t){if(q(e,t))return"none";let n=w(e),r=w(t);if(n.kind!==r.kind)return"kind";if(n.ports.length!==r.ports.length)return"ports";let i=new Map(r.ports.map(u=>[u.name,u])),o=!1,s=!1;for(let u of n.ports){let a=i.get(u.name);if(!a){s=!0;continue}(u.direction!==a.direction||u.type!==a.type||u.required!==a.required)&&(s=!0);let d=u.enum?JSON.stringify(u.enum):"",c=a.enum?JSON.stringify(a.enum):"";d!==c&&(s=!0),u.description!==a.description&&(s=!0),u.defaultValue!==a.defaultValue&&(o=!0)}return s?"ports":o?"port-default":"mixed"}function Oe(e,t){if(t)return J(e,t)}function Ke(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Ge(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return M(e.code,S.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Yt(e,t,n,r,i){let o=n.effectiveType??n.type,s=n.originalType??n.type,u={...n,originalType:s,effectiveType:o,typeSource:n.typeSource??Ke(n),validate:r.validate??n.validate,required:r.required??n.required,enum:r.enum?[...r.enum]:n.enum,description:r.description??n.description},a=r.typeRefinement;if(!a)return{...u,type:u.effectiveType};let d=Oe(e,a.from),c=Oe(e,o);return d&&d!==c?(i.push(Ge({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 \`${o??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:o,actualFrom:a.from,to:a.to},notes:o||a.from?[`base type: ${o??"(unspecified)"}`,`requested from: ${a.from??"(unspecified)"}`]:void 0})),{...u,type:u.effectiveType}):{...u,type:a.to,effectiveType:a.to,typeSource:"model-augmentation",typeRefinement:a}}function Zt(e,t,n,r){let i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of Object.entries(n.ports??{})){let u=i.get(o);if(!u){r.push(Ge({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${o}\` 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:o}}));continue}i.set(o,Yt(e,t,u,s,r))}return{...t,ports:t.ports.map(o=>i.get(o.name)??o)}}function Ht(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Ke(e)}}function je(e,t,n){let r=[],i=new Map([...e.entries()].map(([o,s])=>[o,{...s,ports:s.ports.map(Ht)}]));for(let o of n)for(let[s,u]of Object.entries(o.augment??{})){let a=i.get(s);if(!a){r.push(M("BT117_AUGMENT_TARGET_NOT_FOUND",S.Error,`augmentation target node \`${s}\` not found`,void 0,o.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:o.path?[`augmentation file: ${o.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:o.path}));continue}i.set(s,Zt(t,a,u,r))}return{modelsById:i,diagnostics:r}}function We(e){return E("builtin",0,!1,e)}function ze(e){return E("xml-tree-nodes-model",10,!0,e)}function Je(e){return E("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Ye(e){return E("node-definition-file",20,!0,e)}function Ze(e){return E("config-inline",30,!0,e)}function E(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(i=>He(i,e,n&&i.editable!==!1))}}function Qt(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function He(e,t,n){let r=Qt(t);return{...e,source:r,sourceMeta:e.sourceMeta??{sourceKind:r,file:e.uri,range:e.range},editable:n,ports:e.ports.map(i=>({...i,source:r}))}}function v(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 Xe(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 en(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let r=new Map(e.ports.map(o=>[o.name,o])),i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of r)i.has(o)||n.push({kind:"port-removed",portName:o,sourceIndex:0,port:Xe(s)});for(let[o,s]of i)r.has(o)||n.push({kind:"port-added",portName:o,sourceIndex:1,port:Xe(s)});for(let[o,s]of r){let u=i.get(o);if(!u)continue;s.direction!==u.direction&&n.push({kind:"port-direction",portName:o,left:s.direction,right:u.direction}),s.type!==u.type&&n.push({kind:"port-type",portName:o,left:s.type,right:u.type}),s.required!==u.required&&n.push({kind:"port-required",portName:o,left:s.required,right:u.required}),s.defaultValue!==u.defaultValue&&n.push({kind:"port-default",portName:o,left:s.defaultValue,right:u.defaultValue});let a=s.enum?JSON.stringify([...s.enum].sort()):"",d=u.enum?JSON.stringify([...u.enum].sort()):"";a!==d&&n.push({kind:"port-enum",portName:o,left:s.enum?[...s.enum].sort():void 0,right:u.enum?[...u.enum].sort():void 0}),s.description!==u.description&&n.push({kind:"port-description",portName:o,left:s.description,right:u.description})}return n}function $e(e,t){let n=new Map;for(let r of e){let i=n.get(r.id);if(!i){n.set(r.id,r);continue}if(q(i,r))continue;let o=ee(i,r),s=en(i,r),u;if(o==="port-default"){let a=new Map(i.ports.map(f=>[f.name,f])),d=r.ports.find(f=>{let l=a.get(f.name);return l&&l.defaultValue!==f.defaultValue}),c=d?.name??"unknown",p=[v(i,0),v(r,1)];u={kind:"port-default-conflict",nodeId:r.id,portName:c,sources:[{source:v(i,0),value:a.get(c)?.defaultValue},{source:v(r,1),value:d?.defaultValue}]},t.push({id:r.id,definitions:[i,r],sources:p,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${c}\` on node \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${r.id}\` definition or remove the duplicate model`},data:u,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}else{let a=[v(i,0),v(r,1)];u={kind:"node-model-conflict",nodeId:r.id,sources:a,differences:s},t.push({id:r.id,definitions:[i,r],sources:a,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${r.id}\` model definitions agree, or keep only one definition at the same precedence level`},data:u,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}}return n}function tn(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(r=>[r.name,r]));for(let r of t.ports)n.set(r.name,r);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function Qe(e){let t=[],n=new Map,r=new Map,i=[...e].sort((u,a)=>u.precedence-a.precedence),o=new Map,s=new Map;for(let u of i){let a=o.get(u.precedence)??[],d=u.models.map(c=>He(c,u.kind,u.editable&&c.editable!==!1));a.push(...d),o.set(u.precedence,a);for(let c of d)s.set(c.id,u.precedence)}for(let[u,a]of[...o.entries()].sort((d,c)=>d[0]-c[0])){let d=a.filter(l=>s.get(l.id)===u),c=a.filter(l=>s.get(l.id)!==u),p=$e(c,[]);for(let[l,g]of $e(d,t))p.set(l,g);let f=new Set(a.map(l=>l.id));for(let l of f)s.get(l)===u&&n.set(l,a.filter(g=>g.id===l));for(let[l,g]of p)r.set(l,tn(r.get(l),g))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function nn(e){return Z.includes(e)}function rn(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:C(),augmentations:[]}}function on(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function an(e,t,n){for(let r of new Set(n))if(nn(r)){for(let i of H(r))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...Q(r))}}function dn(e,t,n,r,i){for(let o of i){let s=X(o,{uri:o.uri,path:o.path}),u=s.model;t.push(...s.diagnostics),e.documents.set(o.uri,u);for(let a of u.behaviorTrees)on(e.behaviorTreesById,a.id,a);o.kind==="model-document"?r.push(...u.treeNodesModel):n.push(...u.treeNodesModel),e.genericSubTreePorts.push(...u.genericSubTreePorts)}}function sn(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 un(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let i=sn(r);t.has(i)||(t.add(i),n.push(r))}e.genericSubTreePorts=n}function cn(e,t,n,r,i){e.modelLayers.push(We(t),ze(n),Je(r)),i.models?.length&&e.modelLayers.push(Ye([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function et(e,t){return ln(e,t)}function ln(e,t){let n=rn(),r=[],i=[],o=[],s=[];an(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=C(t.augmentations??[]),dn(n,r,o,s,e),un(n),cn(n,i,o,s,t);let u=t.config.models.inline;if(u){let c=[];for(let[p,f]of Object.entries(u))c.push(W(p,f));n.modelLayers.push(Ze(c))}let a=Qe(n.modelLayers),d=je(a.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=a.nodeModelsById,n.mergedNodeModelsById=d.modelsById,n.modelConflicts=a.conflicts,r.push(...d.diagnostics),{ok:r.every(c=>c.severity!==S.Error),index:n,diagnostics:r}}var tt={unknownSubTreePorts:"allow"};function nt(e){return{...tt,...e}}var pn=["Action","Condition","Control","Decorator"],mn=new Set(pn);var fn=new Set(["input_port","output_port","inout_port"]);function R(e){return mn.has(e)}function ne(e){return R(e)?e:void 0}function U(e,t){return e.attributes.find(n=>n.name===t)?.value}function te(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&te(n,t))return!0;return!1}function rt(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return te(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&te(n,t))return!0;return!1}function L(e){return fn.has(e.name)}function it(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":R(e.name)?"generic-node":L(e)?"unknown-xml":"concrete-node"}function _(e){if(e.name==="SubTree")return U(e,"ID")||"SubTree";if(R(e.name))return U(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||L(e)))return e.name}function F(e,t){return e.behaviorTreesById.get(t)??[]}function ot(e,t){return re(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function at(e){return re(e).flatMap(t=>t.subtreeReferences)}function dt(e){return[...e.behaviorTreesById.keys()]}function re(e){return[...e.documents.values()]}function N(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function O(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function st(e){return[...e.mergedNodeModelsById.values()]}function ut(e){return[...e.mergedNodeModelsById.values()]}function K(e){return[...e.genericSubTreePorts]}function G(e){return e.modelConflicts}function j(e,t){let{id:n,fileLocalUri:r,config:i}=t,o=F(e,n);if(o.length>0){if((i?.resolver?.behaviorTreeIds==="file-local-first"||i?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let d=o.filter(c=>c.uri===r);d.length>0&&(o=d)}let u=N(e,n),a=u?.kind==="SubTree"?[u]:[];return o.length===1?{status:"resolved",kind:"behavior-tree",treeId:o[0].id,behaviorTree:o[0]}:{status:"ambiguous",candidates:[...o.map(d=>d.id),...a.map(d=>d.id)],behaviorTrees:o,definitions:a}}let s=N(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function ie(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=N(e,t);if(n){let i=G(e).find(o=>o.id===t&&o.code==="BT012_CONFLICTING_NODE_MODEL");return i?{status:"ambiguous",nodeType:t,candidates:i.definitions}:{status:"resolved",model:n}}let r=O(e,t);return r.length===1?{status:"resolved",model:r[0]}:r.length>1?{status:"ambiguous",nodeType:t,candidates:r}:{status:"unresolved",nodeType:t}}function oe(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function ae(e){let t=K(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return oe([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function de(e){let{attribute:t}=e,n=e.ports.find(r=>r.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:$(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 h(e,t){let n=nt(t.policy),r=t.element,i=it(r),o=rt(t.documentRoot,r);if((t.isModelDefinition||o&&(i==="generic-node"||i==="subtree"))&&(i="model-definition"),o&&L(r)&&(i="unknown-xml"),i==="root"||i==="behavior-tree"||i==="tree-nodes-model"||i==="include"||i==="model-definition"||i==="unknown-xml")return{element:r,tagName:r.name,tagForm:i,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=_(r);if(i!=="subtree"){let l=ie(e,s),g=ae({index:e,tagForm:i,model:l}),m=r.attributes.map(y=>de({attribute:y,ports:g,allowsArbitraryAttributes:!1,model:l}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:l,ports:g,allowsArbitraryAttributes:!1,portUsages:m}}let u=U(r,"ID"),a=u?j(e,{id:u,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},d={status:"unresolved",nodeType:u},c=!1;if(a.status==="resolved"&&a.kind==="node-model")d={status:"resolved",model:a.model};else if(a.status==="resolved"&&a.kind==="behavior-tree"){let l=ie(e,a.treeId);l.status==="resolved"&&l.model.kind==="SubTree"?d=l:c=n.unknownSubTreePorts==="allow"}else a.status==="ambiguous"&&a.definitions.length>0?d=a.definitions.length===1?{status:"resolved",model:a.definitions[0]}:{status:"ambiguous",nodeType:u??"SubTree",candidates:a.definitions}:c=n.unknownSubTreePorts==="allow";let p=ae({index:e,tagForm:i,model:d,subtreeModelPorts:a.status==="ambiguous"?oe(a.definitions.flatMap(l=>l.ports)):void 0}),f=r.attributes.map(l=>de({attribute:l,ports:p,allowsArbitraryAttributes:c,model:d,unknownModelPortStatus:!c&&d.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:d,subtree:{id:u,target:a},ports:p,allowsArbitraryAttributes:c,portUsages:f}}function se(e,t){return h(e,t).portUsages.find(r=>r.name===t.attributeName)}function ue(e,t){return h(e,t).ports}function gn(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function yn(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function ct(e,t){let n=e.line,r=e.character,i=e.offset;for(let o of t){if(i+=o.length,o===`
3
+ `){n+=1,r=0;continue}r+=o.length}return{line:n,character:r,offset:i}}function ce(e,t,n){let r=ct(e,t),i=ct(r,n);return{start:r,end:i}}function pt(e,t,n){let r=n.valueContentRange||n.valueRange,i=e.originalText.slice(r.start.offset,r.end.offset),o=[];for(let s of i.matchAll(/\{[^}]*\}/g)){let u=s[0],a=s.index??0,d=T({portName:t,rawValue:u});if(d.ok){o.push({raw:u,key:d.reference.key,scope:d.reference.scope,identity:B(d.reference),range:ce(r.start,i.slice(0,a),u),syntax:d.reference.syntax==="shorthand"?"shorthand":"braced"});continue}o.push({raw:u,key:u,scope:"local",identity:`invalid:${u}`,range:ce(r.start,i.slice(0,a),u),syntax:"invalid"})}if(o.length===0){let s=T({portName:t,rawValue:i});if(s.ok){let u=Math.max(0,i.indexOf(s.reference.raw));return o.push({raw:s.reference.raw,key:s.reference.key,scope:s.reference.scope,identity:B(s.reference),range:ce(r.start,i.slice(0,u),s.reference.raw),syntax:s.reference.syntax==="shorthand"?"shorthand":"braced"}),o}}return o.length===0&&(i.includes("{")||i.includes("}"))&&o.push({raw:i,key:i,scope:"local",identity:`invalid:${i}`,range:r,syntax:"invalid"}),o}function bn(e,t){return gn(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function mt(e){let t=[];for(let n of e)t.push(n),t.push(...mt(n.children));return t}function Sn(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function Tn(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function hn(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function ft(e){return k(e,"name")?.value}function kn(e){return ft(e)||k(e,"ID")?.value||e.name}function Dn(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${kn(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function gt(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 yt(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 Bn(e){return e.status==="resolved"?e.port.direction:"unknown"}function Nn(e,t){return e===""?"empty":e==="{=}"||e==="="?"substitution":t.some(n=>n.syntax==="braced")?"blackboard-reference":t.some(n=>n.syntax==="shorthand")?"substitution":t.some(n=>n.syntax==="invalid")?"unknown":"literal"}function lt(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:Bn(t.usage),valueKind:Nn(t.value,t.blackboardReferences),range:t.attribute.range,nameRange:t.attribute.nameRange,valueRange:t.attribute.valueContentRange||t.attribute.valueRange,resolution:t.declaredPort,usage:t.usage,blackboardReferences:t.blackboardReferences}}function Mn(e){let t=new Set;for(let n of[e.name,e.idAttr,e.nodeType,e.tagName,e.instancePath,e.behaviorTreeId&&!e.instancePath.startsWith(`${e.behaviorTreeId}/`)?`${e.behaviorTreeId}/${e.instancePath}`:void 0,e.nodeId])n&&t.add(n);return[...t]}function k(e,t){return e.attributes.find(n=>n.name===t)}function xn(e){return e.root?k(e.root,"main_tree_to_execute")?.value:void 0}function vn(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let i of r.children)i.kind==="element"&&n(i)};if(e.name==="TreeNodesModel")return n(e),t;for(let r of e.children)r.kind!=="element"||r.name!=="TreeNodesModel"||n(r);return t}function bt(e,t){let n=t.semantic,r=vn(e.root),i=yn(e).map(a=>({id:k(a,"ID")?.value,element:a,rootNode:void 0,nodes:[]})),o=[],s=[],u=(a,d,c,p)=>{let f=h(n,{element:a,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(a)}),l=gt(f),g={element:a,path:p,tagName:a.name,kind:bn(a,f),model:l,usage:f,portBindings:[],children:[],parent:c,behaviorTree:d};if(g.portBindings=f.portUsages.filter(m=>m.status!=="reserved-attribute").map(m=>({name:m.name,value:m.value,attribute:m.attribute,declaredPort:yt(m),usage:m,blackboardReferences:pt(e,m.name,m.attribute)})),g.children=a.children.filter(m=>m.kind==="element").map((m,y)=>u(m,d,g,[...p,y])),a.name==="SubTree"){let m=k(a,"ID")?.value;o.push({node:g,id:m,target:f.subtree?.target??{status:"unresolved",id:m},portRemaps:g.portBindings})}return g};for(let a of i){let d=a.element.children.filter(c=>c.kind==="element").map((c,p)=>u(c,a,void 0,[p]));a.rootNode=d[0],a.nodes=mt(d),s.push(...a.nodes)}return{document:e,behaviorTrees:i,subtreeCalls:o,nodes:s}}function le(e,t,n){let r=bt(e,{semantic:t,config:n?.config,policy:n?.policy}),i=Tn(r.behaviorTrees),o=r.nodes.map(d=>{let c=i(d),p=d.usage,f=p.nodeType??d.tagName,l=ft(d.element),g=k(d.element,"ID")?.value,m=Dn(d);return{nodeId:c,path:d.path,instancePath:m,tagName:d.tagName,nodeType:f,name:l,idAttr:g,kind:d.kind,range:d.element.range,fullRange:d.element.fullRange,nameRange:d.element.nameRange,parentNodeId:d.parent?i(d.parent):void 0,childNodeIds:d.children.map(i),behaviorTreeId:d.behaviorTree.id,attributes:d.element.attributes.map(hn),identityCandidates:Mn({name:l,idAttr:g,nodeType:f,tagName:d.tagName,instancePath:m,behaviorTreeId:d.behaviorTree.id,nodeId:c}),model:gt(p),usage:p,portBindings:p.portUsages.filter(y=>y.status!=="reserved-attribute").map(y=>lt(c,{name:y.name,value:y.value,attribute:y.attribute,declaredPort:yt(y),usage:y,blackboardReferences:pt(e,y.name,y.attribute)}))}}),s=r.behaviorTrees.map(d=>({id:d.id,range:d.element.range,idRange:k(d.element,"ID")?.valueContentRange,rootNodeId:d.rootNode?i(d.rootNode):void 0,nodeIds:d.nodes.map(i)})),u=r.subtreeCalls.map(d=>({nodeId:i(d.node),callId:d.id,range:d.node.element.range,target:d.target,portBindings:d.portRemaps.map(c=>lt(i(d.node),c))})),a=e.root?k(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:Sn(e),mainTreeToExecute:xn(e),mainTreeToExecuteRange:a?.valueContentRange||a?.valueRange,behaviorTrees:s,nodes:o,subtreeCalls:u}}function Rn(e,t){return A(e.fullRange||e.range,t)}function Pn(e,t){let n=e.fullRange||e.range,r=t.fullRange||t.range;return n.end.offset-n.start.offset<r.end.offset-r.start.offset}function pe(e){return e.nodes}function me(e){return e.subtreeCalls}function fe(e,t){let n;for(let r of e.nodes)Rn(r,t.offset)&&(!n||Pn(r,n))&&(n=r);return n}function ge(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(A(r.range,t.offset))return r}export{le as buildSemanticDocumentView,et as buildSemanticIndex,fe as findSemanticNodeAtPosition,ge as findSemanticPortBindingAtPosition,st as getAllNodeModels,pe as getAllSemanticTreeNodes,at as getAllSubTreeReferences,dt as getBehaviorTreeIds,F as getBehaviorTrees,ut as getEffectiveNodeModels,ne as getGenericNodeKindFromTag,K as getGenericSubTreePorts,G as getModelConflicts,N as getNodeModel,O as getNodeModelDefinitions,_ as getNodeTypeFromElement,me as getSemanticSubTreeCalls,ot as getSubTreeReferences,ue as getUsagePorts,R as isGenericNodeTag,h as resolveNodeUsage,se as resolvePortUsage,j as resolveSubTreeTarget};