@abco20/btxml-checker 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/THIRD_PARTY_NOTICES.md +33 -0
- package/dist/ast-BbfR3S_b.d.ts +62 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +33 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +1 -0
- package/dist/diagnostic-B5htzyJ9.d.ts +42 -0
- package/dist/editor-node.d.ts +21 -0
- package/dist/editor-node.js +30 -0
- package/dist/editor.d.ts +16 -0
- package/dist/editor.js +28 -0
- package/dist/effective-t_u6qJ-7.d.ts +12 -0
- package/dist/index-CZlTfNCD.d.ts +47 -0
- package/dist/index.d.ts +327 -0
- package/dist/index.js +11 -0
- package/dist/model.d.ts +127 -0
- package/dist/model.js +2 -0
- package/dist/public-types-B2noBQY9.d.ts +125 -0
- package/dist/public-types-DaawwXHQ.d.ts +250 -0
- package/dist/rules.d.ts +356 -0
- package/dist/rules.js +5 -0
- package/dist/semantic.d.ts +42 -0
- package/dist/semantic.js +2 -0
- package/dist/server.cjs +46155 -0
- package/dist/server.cjs.map +1 -0
- package/dist/syntax.d.ts +84 -0
- package/dist/syntax.js +8 -0
- package/dist/types-BaOc_AYN.d.ts +104 -0
- package/dist/types-BgqDzlJ8.d.ts +425 -0
- package/dist/types-CkOvIGPf.d.ts +105 -0
- package/dist/types-SY4-jKCn.d.ts +112 -0
- package/package.json +93 -0
- package/schemas/btxml.config.schema.json +441 -0
- package/schemas/btxml.nodes.schema.json +64 -0
package/dist/semantic.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
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};
|