@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.
@@ -1,30 +1,32 @@
1
- import{constants as Cm}from"fs";import Ft from"fs/promises";import Ne from"path";import{fileURLToPath as Em,pathToFileURL as Yr}from"url";var Ut=["off","info","warn","error"];var Jr={linter:{rules:{"xml/require-btcpp-format":"error","xml/no-unknown-top-level-element":"error","model/no-unknown-node":"error","model/no-unknown-port":["error",{subTreePorts:"strict"}],"script/no-unknown-variable":"error","model/no-childless-control-shape-mismatch":"error","model/no-leaf-block-shape":"error","model/valid-child-count":"error","suppression/no-unused":"error","suppression/require-reason":"warn"}}},_a={files:{include:["**/*.xml"],ignore:["build/**","install/**","log/**","node_modules/**",".git/**"],useGitignore:!0,followSymlinks:!1,maxSize:5*1024*1024},resolver:{entrypoints:[],includes:{elements:[{name:"include",attribute:"path",base:"file"}],variables:{},allowOutsideRoot:!1,maxDepth:32,maxFiles:1e3},behaviorTreeIds:"workspace-unique"},models:{builtins:["btcpp-v4"],files:[],augmentations:[],definitions:[],inline:{}},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function Ge(){return structuredClone(_a)}function ot(e,t){return{files:t.files?{...e.files,...t.files}:e.files,resolver:t.resolver?{...e.resolver,...t.resolver,includes:{...e.resolver.includes,...t.resolver.includes||{},variables:{...e.resolver.includes.variables,...t.resolver.includes?.variables||{}}}}:e.resolver,models:t.models?{...e.models,...t.models}:e.models,linter:t.linter?{...e.linter,...t.linter,rules:t.linter.rules?{...e.linter.rules,...t.linter.rules}:e.linter.rules,suppressions:t.linter.suppressions?{...e.linter.suppressions,...t.linter.suppressions}:e.linter.suppressions}:e.linter,formatter:t.formatter?{...e.formatter,...t.formatter}:e.formatter,overrides:t.overrides?[...e.overrides,...t.overrides]:e.overrides}}var h={Error:"error",Warning:"warning",Info:"info"};function w(e,t,n,r,o="",i,s){return{code:e,severity:t,message:n,uri:o,...r?{range:r}:{},...i?{details:i}:{},...s?{data:s}:{}}}function Ke(e,t,n){return{line:e,character:t,offset:n}}function I(e,t){return{start:e,end:t}}function z(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}function La(e){let t=[0];for(let n=0;n<e.length;n+=1)e[n]===`
2
- `&&t.push(n+1);return t}function In(e,t,n){return Math.min(Math.max(e,t),n)}function Ot(e,t,n=0,r="xml"){let o=La(t),i=l=>{let c=In(l,0,t.length),d=0,m=o.length;for(;d<m;){let y=Math.floor((d+m)/2);o[y]>c?m=y:d=y+1}let f=Math.max(0,d-1);return{line:f,character:c-o[f],offset:c}},s=l=>{let c=In(l.line,0,Math.max(0,o.length-1)),d=o[c],m=c+1<o.length?o[c+1]:t.length;return In(d+l.character,d,m)};return{uri:e,languageId:r,version:n,text:t,lineOffsets:o,positionAt:i,offsetAt:s,getText:l=>l?t.slice(s(l.start),s(l.end)):t}}var ja={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Fa(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function me(e,t){return e.attributes.find(n=>n.name===t)}function Ua(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Oa(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Va(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Zr(e,t,n){for(let r of e.attributes||[]){let o=[...String(r.value).matchAll(/\{([^}]+)\}/g)];for(let i of o){let s=i.index??0,a=r.valueRange.start,u={...a,character:a.character+i[0].length,offset:a.offset+s+i[0].length};t.push({name:i[1],attributeName:r.name,element:e,uri:n,range:{start:{...a,character:a.character+s,offset:a.offset+s},end:u}})}}for(let r of e.children||[])r.kind==="element"&&Zr(r,t,n)}function qa(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!Ua(i.name))continue;let s=me(i,"ID");if(!s)continue;let a=[];for(let u of i.children||[]){if(u.kind!=="element"||u.name!=="input_port"&&u.name!=="output_port"&&u.name!=="inout_port")continue;let l=me(u,"name"),c=me(u,"type"),d=me(u,"default")||me(u,"default_value"),m=me(u,"enum"),f=(u.children||[]).filter(x=>x.kind==="text").map(x=>x.text).join("").trim()||void 0,y=u.name==="input_port"?"input":u.name==="output_port"?"output":"inout",p=(y==="input"||y==="inout")&&d===void 0;a.push({source:n,direction:y,name:l?l.value:"",type:c?.value||void 0,defaultValue:d?.value||void 0,description:f,required:p,element:u,uri:t,range:u.range,nameRange:l?.range,enum:m?.value?m.value.split(";"):void 0})}o.push({id:s.value,kind:i.name,source:n,sourceMeta:{sourceKind:n,file:t,range:i.range},editable:r,ports:a,element:i,uri:t,range:i.range,elementRange:i.range,idRange:s.range})}return o}function $a(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let o=me(r,"ID");o&&n.push({id:o.value,kind:"BehaviorTree",uri:t,element:r,range:r.range,elementRange:r.range,idRange:o.range})}return n}function Xa(e,t){let n=[],r=(o,i)=>{let s=o.name==="BehaviorTree"?me(o,"ID")?.value??i:i;if(o.name==="SubTree"){let a=me(o,"ID");a&&n.push({id:a.value,uri:t,element:o,range:o.range,elementRange:o.range,idRange:a.range,parentBehaviorTreeId:s,attributes:o.attributes})}for(let a of o.children||[])a.kind==="element"&&r(a,s)};for(let o of e.children||[])o.kind==="element"&&r(o);return n}function za(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Qr(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 Wa(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Qr),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 Ga(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Ka(e){return{name:e.name,attributeName:e.attributeName,uri:e.uri,range:e.range}}function Ha(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(za),subtreeReferences:e.subtreeReferences.map(Ga),blackboardReferences:e.blackboardReferences.map(Ka),treeNodesModel:e.treeNodesModel.map(Wa),genericSubTreePorts:e.genericSubTreePorts.map(Qr),rootMainTreeToExecute:Oa(e.rootMainTreeToExecute)}}function Ya(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Ja(e){return w(ja.DuplicateNodeModelId,h.Error,`duplicate node model ID \`${e.id}\``,e.idRange||e.range,e.uri,{primaryLabel:"this node model ID is already defined in the same model source",help:"merge the duplicate definitions or rename one of them"})}function Za(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,s=Fa(e),a=Va(e),u=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",l=o&&e.kind!=="model-document"?$a(o,r):[],c=[],d=[],m=o?o.name==="TreeNodesModel"?[o]:o.children.filter(E=>E.kind==="element"&&E.name==="TreeNodesModel"):[];for(let E of m){let k=qa(E,r,a,u),N=new Map;for(let g of k)Ya({node:g,treeNodesModel:c,genericSubTreePorts:d})||(N.has(g.id)?n.push(Ja(g)):N.set(g.id,g))}let f=o?Xa(o,r):[],y=o?(()=>{let E=[];return Zr(o,E,r),E})():[],p=o?me(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Ha({uri:r,path:t?.path??e.path,isBtXml:i,kind:s,behaviorTrees:l,subtreeReferences:f,blackboardReferences:y,treeNodesModel:c,genericSubTreePorts:d,rootMainTreeToExecute:p?{uri:r,range:p.range,value:p.value}:void 0}),extractedBehaviorTrees:l,extractedTreeNodesModel:c,extractedSubTreeReferences:f,extractedBlackboardReferences:y},diagnostics:n}}function eo(e,t){let{extracted:n,diagnostics:r}=Za(e,t);return{model:n.publicModel,diagnostics:r}}function Cn(e,t){return eo(e,t)}var to=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Qa=new Set([...to,"_autoremap","_description","__shared_blackboard"]),eu=new Map([[".","port names must not contain `.`"],["<","port names must not contain `<`"],[">","port names must not contain `>`"],["&","port names must not contain `&`"],['"','port names must not contain `"`'],["'","port names must not contain `'`"],["/","port names must not contain `/`"],["\\","port names must not contain `\\`"],[":","port names must not contain `:`"],["*","port names must not contain `*`"],["?","port names must not contain `?`"],["|","port names must not contain `|`"]]);function En(e){return to.has(e)}function no(e){return Qa.has(e)}function Pn(e){if(e.length===0)return"port names must not be empty";if(/^[0-9]/.test(e))return"port names must not start with a digit";if(no(e))return`\`${e}\` is a reserved attribute name`;for(let t of e){let n=t.charCodeAt(0);if(n<=31||n===127)return"port names must not contain ASCII control characters";if(t===" "||t===" "||t===`
3
- `||t==="\r")return"port names must not contain whitespace";let r=eu.get(t);if(r)return r}}function ro(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 it(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>ro(n,r))}}var tu=[{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"]}],st=new Map,oo=new Map;for(let e of tu){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};oo.set(e.name,t),st.set(e.name,e.name);for(let n of e.aliases)st.set(n,e.name)}function nu(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 Bn(e){return st.get(e)??e}function ru(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 at(e){return st.get(e)}function He(e=[]){let t=new Map,n=new Map(st);for(let r of oo.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[o,i]of Object.entries(r.types??{})){let s=Bn(i.canonical??o),u=t.get(s)??nu(o,s,i);u.name=o,u.kind=i.kind,u.canonical=s,u.source="augmentation",u.validate=i.validate??u.validate,u.aliases.add(o),u.aliases.add(s);for(let l of i.aliases??[])u.aliases.add(l);for(let l of i.compatibleWith??[])u.compatibleWith.add(l);t.set(s,u),n.set(o,s),n.set(s,s);for(let l of i.aliases??[])n.set(l,s)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(o=>n.get(o)??Bn(o))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,o])=>[r,ru(o)])),namesToCanonical:n}}function ie(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Bn(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Vt(e,t){return ie(e,t)?.canonical}function ut(e,t,n){let r=ie(e,t),o=ie(e,n);return!r||!o?!1:r.kind==="any"||o.kind==="any"||r.canonical===o.canonical?!0:r.compatibleWith.includes(o.canonical)||o.compatibleWith.includes(r.canonical)}function io(e,t){if(e.length<3)return!1;let n=0,r=e.length-1;for(;n<=r&&e[n]===" ";)n+=1;for(;n<=r&&e[r]===" ";)r-=1;let i=r-n+1>=3&&e[n]==="{"&&e[r]==="}";return i&&t&&(t.current=e.slice(n+1,r)),i}function so(e){let t={};return io(e,t)?t.current:void 0}function K(e,t){return t==="{=}"||t==="="?e:so(t)}var ao=[{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:[]}],uo={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 lo=[{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:[]}],co={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 mo=[{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:[]}],po={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 fo=["4.6.2","4.8.2","4.9.0"],Nn="4.9.0",lt={"4.6.2":{models:ao,genericSubTreeModel:uo},"4.8.2":{models:lo,genericSubTreeModel:co},"4.9.0":{models:mo,genericSubTreeModel:po}};var go=fo.map(e=>`btcpp-v${e}`),ct=["btcpp-v4",...go],yo=`btcpp-v${Nn}`;function ho(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 ou(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(ho)}))}function So(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(ho)}}function iu(){let e={};for(let[t,n]of Object.entries(lt))e[`btcpp-v${t}`]=ou(n.models);return e}function su(){let e={};for(let[t,n]of Object.entries(lt))e[`btcpp-v${t}`]=So(n.genericSubTreeModel);return e}var au=iu(),uu=su();function lu(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(lt,t)}function bo(e){return e==="btcpp-v4"?yo:e}function cu(e){return e==="btcpp-v4"?Nn:e.replace(/^btcpp-v/,"")}function vo(e){if(e&&e!=="btcpp-v4"&&!lu(e))throw new Error(`unsupported builtin model set: ${e}`)}function wn(e="btcpp-v4"){vo(e);let t=bo(e);return au[t].map(r=>Ro(r))}function Mn(e="btcpp-v4"){vo(e);let t=uu[bo(e)]??So(lt[cu(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Ro(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 dt(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 o=t.direction.localeCompare(n.direction);if(o!==0)return o;let i=(t.type??"").localeCompare(n.type??"");if(i!==0)return i;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function qt(e,t){let n=dt(e),r=dt(t);return JSON.stringify(n)===JSON.stringify(r)}function An(e,t){if(qt(e,t))return"none";let n=dt(e),r=dt(t);if(n.kind!==r.kind)return"kind";if(n.ports.length!==r.ports.length)return"ports";let o=new Map(r.ports.map(a=>[a.name,a])),i=!1,s=!1;for(let a of n.ports){let u=o.get(a.name);if(!u){s=!0;continue}(a.direction!==u.direction||a.type!==u.type||a.required!==u.required)&&(s=!0);let l=a.enum?JSON.stringify(a.enum):"",c=u.enum?JSON.stringify(u.enum):"";l!==c&&(s=!0),a.description!==u.description&&(s=!0),a.defaultValue!==u.defaultValue&&(i=!0)}return s?"ports":i?"port-default":"mixed"}import{findNodeAtLocation as yu,parse as hu,parseTree as Su}from"jsonc-parser";import{z as B}from"zod";var To=B.discriminatedUnion("kind",[B.object({kind:B.literal("pattern"),pattern:B.string()}).strict(),B.object({kind:B.literal("enum"),values:B.array(B.string())}).strict(),B.object({kind:B.literal("tuple"),separator:B.string(),items:B.array(B.string())}).strict(),B.object({kind:B.literal("json-schema"),schema:B.unknown()}).strict()]),du=B.object({kind:B.enum(["primitive","opaque","any"]),canonical:B.string().optional(),aliases:B.array(B.string()).optional(),compatibleWith:B.array(B.string()).optional(),validate:To.optional()}).strict(),mu=B.object({from:B.string().optional(),to:B.string()}).strict(),pu=B.object({typeRefinement:mu.optional(),validate:To.optional(),required:B.boolean().optional(),enum:B.array(B.string()).optional(),description:B.string().optional()}).strict(),fu=B.object({ports:B.record(B.string(),pu).optional()}).strict(),gu=B.object({enums:B.record(B.string(),B.number().finite()).optional()}).strict(),xo=B.object({version:B.literal(1),types:B.record(B.string(),du).optional(),augment:B.record(B.string(),fu).optional(),script:gu.optional()}).strict();function bu(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
4
- `&&t.push(n+1);return n=>{let r=0,o=t.length-1;for(;r<=o;){let s=Math.floor((r+o)/2);t[s]<=n?r=s+1:o=s-1}let i=Math.max(0,r-1);return{line:i,character:n-t[i],offset:n}}}function vu(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function ko(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function Ru(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...ko(e.path),t]}return ko(e.path)}function Tu(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;return{message:`Unrecognized key: "${t??""}"`,path:[...e.path,t].filter(n=>n!==void 0).join(".")}}return{message:e.message,path:e.path.length>0?e.path.join("."):void 0}}function _n(e,t){let n=t?.uri??"",r=[],o=Su(e,r,{allowTrailingComma:!0,disallowComments:!1});try{let i=hu(e,r,{allowTrailingComma:!0,disallowComments:!1});if(r.length>0||!o)throw new Error(`JSON parse error at offset ${r[0]?.offset??0}`);let s=xo.safeParse(i);if(!s.success){let a=bu(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(u=>{let l=Ru(u),{message:c,path:d}=Tu(u);return{kind:"schema",message:c,path:d,range:vu(yu(o,l),a),notes:d?[d]:void 0}})}}return{ok:!0,data:{...s.data,uri:n,path:t?.path},issues:[],uri:n,path:t?.path}}catch(i){return{ok:!1,uri:n,path:t?.path,issues:[{kind:"json",message:"the file could not be parsed as JSON",notes:[String(i.message||i)]}]}}}import{z as $}from"zod";var Do=$.object({direction:$.enum(["input","output","inout"]).optional(),type:$.string().optional(),required:$.boolean().optional(),default:$.string().optional(),description:$.string().optional(),enum:$.array($.string()).optional()}).strict(),$t=$.object({kind:$.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:$.record($.string(),Do).optional(),description:$.string().optional()}).strict(),Ln=$.object({nodes:$.record($.string(),$t)}).strict();import{z as D}from"zod";var Io=D.enum(["off","info","warn","error"]),Co=D.union([Io,D.tuple([Io,D.record(D.string(),D.unknown())])]),xu=D.object({include:D.array(D.string()).optional(),ignore:D.array(D.string()).optional(),useGitignore:D.boolean().optional(),followSymlinks:D.boolean().optional(),maxSize:D.number().int().positive().optional()}).strict(),ku=D.string(),Du=D.object({name:D.string(),attribute:D.string(),base:D.enum(["file","project-root"]).optional()}).strict(),Iu=D.object({elements:D.array(Du).optional(),variables:D.record(D.string(),D.string()).optional(),allowOutsideRoot:D.boolean().optional(),maxDepth:D.number().int().min(1).optional(),maxFiles:D.number().int().min(1).optional()}).strict(),Cu=D.object({entrypoints:D.array(ku).optional(),includes:Iu.optional(),behaviorTreeIds:D.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),Eu=D.object({builtins:D.array(D.enum(ct)).optional(),files:D.array(D.string()).optional(),augmentations:D.array(D.string()).optional(),definitions:D.array(D.string()).optional(),inline:D.record(D.string(),$t).optional()}).strict(),Eo=D.object({inline:D.enum(["allow","deny"]).optional()}).strict(),Pu=D.object({enabled:D.boolean().optional(),rules:D.record(D.string(),Co).optional(),baseline:D.string().optional(),suppressions:Eo.optional()}).strict(),Bu=D.object({rules:D.record(D.string(),Co).optional(),suppressions:Eo.optional()}).strict(),Po=D.object({indentWidth:D.number().int().min(1).max(8).optional(),xmlDeclaration:D.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:D.boolean().optional(),lineEnding:D.enum(["lf","crlf","auto"]).optional()}).strict(),Nu=D.object({files:D.array(D.string()),linter:Bu.optional(),formatter:Po.optional()}).strict(),Bo=D.object({$schema:D.string().optional(),strict:D.boolean().optional(),files:xu.optional(),resolver:Cu.optional(),models:Eu.optional(),linter:Pu.optional(),formatter:Po.optional(),overrides:D.array(Nu).optional()}).strict();function Mo(e){return e.flatMap(wu)}function wu(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=No([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=No(e.path);return Ao(e)?[{code:"CFG003_INVALID_CONFIG_VALUE",severity:"error",path:n,message:n?`invalid config value at \`${n}\``:"invalid config value"}]:[{code:"CFG001_INVALID_CONFIG",severity:"error",path:n,message:n?`invalid config at \`${n}\``:"invalid config"}]}function No(e){return e.map(String).join(".")||void 0}function Ao(e){let t=String(e.code);if(t==="invalid_value"||t==="invalid_enum_value"||t==="invalid_literal")return!0;if(t!=="invalid_union")return!1;let n=e.errors;if(Array.isArray(n))return n.flat().some(wo);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(wo):!1}function wo(e){return typeof e=="object"&&e!==null&&Ao(e)}function mt(e){let t=Bo.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:Mo(t.error.issues)}}function Mu(e){if(!e)return;let t={};return e.indentWidth!==void 0&&(t.indentWidth=e.indentWidth),e.xmlDeclaration!==void 0&&(t.xmlDeclaration=e.xmlDeclaration),e.blankLineBetweenBehaviorTrees!==void 0&&(t.blankLineBetweenBehaviorTrees=e.blankLineBetweenBehaviorTrees),e.lineEnding!==void 0&&(t.lineEnding=e.lineEnding),t}function Au(e){if(!e)return;let t={};return e.rules!==void 0&&(t.rules=e.rules),e.suppressions!==void 0&&(t.suppressions={},e.suppressions.inline!==void 0&&(t.suppressions.inline=e.suppressions.inline)),t}function _u(e){return e.map(t=>w(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function Lu(e){let t=[],n=Ge(),{$schema:r,strict:o,overrides:i,...s}=e;o&&(n=ot(n,Jr)),n=ot(n,s),n.overrides=(i??[]).map(u=>({files:u.files,linter:Au(u.linter),formatter:Mu(u.formatter)}));let a=!t.some(u=>u.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function pt(e){let t=mt(e);return t.ok?Lu(t.value):{ok:!1,config:Ge(),diagnostics:_u(t.diagnostics)}}function ju(e){let t="",n=0;for(;n<e.length;)e.slice(n,n+3)==="/**"&&(n+3===e.length||e[n+3]==="/")?n+3===e.length?(t+="(?:/.*)?",n+=3):(t+="(?:/.*)?/",n+=4):n===0&&e.slice(n,n+3)==="**/"?(t+="(?:.*/)?",n+=3):e.slice(n,n+2)==="**"?(t+=".*",n+=2):e[n]==="*"?(t+="[^/]*",n+=1):e[n]==="?"?(t+="[^/]",n+=1):(t+=e[n].replace(/[.+^${}()|[\]\\]/g,"\\$&"),n+=1);return new RegExp(`^${t}$`)}function Xt(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),o=r?t.slice(1):t,s=ju(o).test(n);return r?!s:s}function _o(e,t){return e.overrides.filter(n=>n.files.some(r=>Xt(t,r)))}function ft(e){return e.replaceAll("\\","/")}function Fu(e){try{return decodeURIComponent(e)}catch{return e}}function gt(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Fu(t.pathname);return/^\/[A-Za-z]:/.test(n)?ft(n.slice(1)):t.host?ft(`//${t.host}${n}`):ft(n)}function zt(e,t){let n=ft(t);return e.files.ignore.some(r=>Xt(n,r))?!1:e.files.include.some(r=>Xt(n,r))}function jn(e,t){return zt(e,gt(t))}function J(e,t){let n=ft(t),r=_o(e,n),o=e;for(let i of r)o=ot(o,{linter:i.linter,formatter:i.formatter});return{files:o.files,resolver:o.resolver,models:o.models,linter:o.linter,formatter:o.formatter}}function Fn(e,t){return J(e,gt(t))}import{z as Wt}from"zod";var b={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},Un=Object.values(b).sort();var Uu=Wt.object({subTreePorts:Wt.enum(["loose","strict"]).optional()}).strict(),Ou=Wt.object({allowStringEntryCompatibility:Wt.boolean().optional()}).strict(),se={"script/valid-syntax":{code:b.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:b.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:b.AssignmentToUnknownVariable,codes:[b.AssignmentToUnknownVariable,b.InvalidCompoundAssignment,b.ScriptVariableTypeMismatch],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:b.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:b.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:b.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:b.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:b.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:b.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:b.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:b.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:b.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:b.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:b.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:b.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:b.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:b.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:b.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:b.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:b.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:b.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:b.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:b.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:b.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:b.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:b.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:b.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:b.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:b.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:b.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:b.UnknownPort,defaultSeverity:"warn",optionsSchema:Uu,options:[{name:"subTreePorts",type:'"loose" | "strict"',default:"loose",description:"Controls whether SubTree remap attributes are checked strictly."}],description:"Reports ports that are not declared by the resolved node model."},"model/valid-port-value":{code:b.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:b.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:Ou,options:[{name:"allowStringEntryCompatibility",type:"boolean",default:"true",description:"Treat std::string blackboard entries as runtime-compatible with other port types, matching BT.CPP's existing-entry special case."}],description:"Blackboard entries must not mix incompatible resolved port types."},"model/valid-port-default-value":{code:b.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:b.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:b.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:b.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:b.InvalidChildCount,defaultSeverity:"warn",description:"Child count must match the expected count for the node kind (Action/Condition: 0, Decorator: 1, Control: >=1, special builtins: fixed range)."},"model/no-conflicting-definition":{code:b.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:b.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:b.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};function ee(e){let t=e.linter.rules["model/no-unknown-port"];return Array.isArray(t)&&t.length>=2&&t[1].subTreePorts==="strict"?{unknownSubTreePorts:"reject"}:{unknownSubTreePorts:"allow"}}function On(e){return e in se}function be(e){if(typeof e=="string")return Ut.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&Ut.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let r={severity:t};return n!==void 0&&(r.options=n),r}}return null}function yt(e,t){let n=e[t];if(n!==void 0){let r=be(n);if(r)return r.severity}return se[t].defaultSeverity}function Vn(e,t){let n=[],o=se[e].optionsSchema;if(!o)return n;let i=o.safeParse(t);if(i.success)return n;for(let s of i.error.issues)n.push(...Vu(e,s));return n}function Vu(e,t){if(t.code==="unrecognized_keys")return t.keys.map(r=>w("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(r)}\` for rule \`${e}\``,void 0,void 0,{help:Lo(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[w("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:Lo(e)})]}function Lo(e){let n=se[e].options?.map(r=>r.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function qn(e){let t=[];jo(e.linter,"linter.rules",t);for(let[n,r]of(e.overrides??[]).entries())jo(r.linter,`overrides.${n}.linter.rules`,t);return t}function jo(e,t,n){for(let[r,o]of Object.entries(e?.rules??{})){let i=`${t}.${r}`;if(!On(r)){n.push({code:"CFG010_UNKNOWN_RULE",severity:"error",path:i,message:`unknown lint rule \`${r}\``,help:"see docs/rules.md for a list of valid rule names"});continue}let s=be(o);if(s?.options)for(let a of Vn(r,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:qu(i,s.options,a.message),message:a.message,help:a.details?.help})}}function qu(e,t,n){let r=Object.keys(t).find(o=>n.includes(`\`${o}\``));return r?`${e}.1.${r}`:`${e}.1`}function Fo(e,t){if(t)return Vt(e,t)}function Uo(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Oo(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return w(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function $u(e,t,n,r,o){let i=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:i,typeSource:n.typeSource??Uo(n),validate:r.validate??n.validate,required:r.required??n.required,enum:r.enum?[...r.enum]:n.enum,description:r.description??n.description},u=r.typeRefinement;if(!u)return{...a,type:a.effectiveType};let l=Fo(e,u.from),c=Fo(e,i);return l&&l!==c?(o.push(Oo({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${i??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:i,actualFrom:u.from,to:u.to},notes:i||u.from?[`base type: ${i??"(unspecified)"}`,`requested from: ${u.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:u.to,effectiveType:u.to,typeSource:"model-augmentation",typeRefinement:u}}function Xu(e,t,n,r){let o=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of Object.entries(n.ports??{})){let a=o.get(i);if(!a){r.push(Oo({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${i}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:i}}));continue}o.set(i,$u(e,t,a,s,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function zu(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Uo(e)}}function Vo(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,s])=>[i,{...s,ports:s.ports.map(zu)}]));for(let i of n)for(let[s,a]of Object.entries(i.augment??{})){let u=o.get(s);if(!u){r.push(w("BT117_AUGMENT_TARGET_NOT_FOUND",h.Error,`augmentation target node \`${s}\` not found`,void 0,i.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:i.path?[`augmentation file: ${i.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:i.path}));continue}o.set(s,Xu(t,u,a,r))}return{modelsById:o,diagnostics:r}}function Xo(e){return ht("builtin",0,!1,e)}function zo(e){return ht("xml-tree-nodes-model",10,!0,e)}function Wo(e){return ht("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Go(e){return ht("node-definition-file",20,!0,e)}function Ko(e){return ht("config-inline",30,!0,e)}function ht(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>Ho(o,e,n&&o.editable!==!1))}}function Wu(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Ho(e,t,n){let r=Wu(t);return{...e,source:r,sourceMeta:e.sourceMeta??{sourceKind:r,file:e.uri,range:e.range},editable:n,ports:e.ports.map(o=>({...o,source:r}))}}function Ye(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 qo(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 Gu(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(i=>[i.name,i])),o=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of r)o.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:qo(s)});for(let[i,s]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:qo(s)});for(let[i,s]of r){let a=o.get(i);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:i,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:i,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:i,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:i,left:s.defaultValue,right:a.defaultValue});let u=s.enum?JSON.stringify([...s.enum].sort()):"",l=a.enum?JSON.stringify([...a.enum].sort()):"";u!==l&&n.push({kind:"port-enum",portName:i,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:i,left:s.description,right:a.description})}return n}function $o(e,t){let n=new Map;for(let r of e){let o=n.get(r.id);if(!o){n.set(r.id,r);continue}if(qt(o,r))continue;let i=An(o,r),s=Gu(o,r),a;if(i==="port-default"){let u=new Map(o.ports.map(m=>[m.name,m])),l=r.ports.find(m=>{let f=u.get(m.name);return f&&f.defaultValue!==m.defaultValue}),c=l?.name??"unknown",d=[Ye(o,0),Ye(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:c,sources:[{source:Ye(o,0),value:u.get(c)?.defaultValue},{source:Ye(r,1),value:l?.defaultValue}]},t.push({id:r.id,definitions:[o,r],sources:d,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:a,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}else{let u=[Ye(o,0),Ye(r,1)];a={kind:"node-model-conflict",nodeId:r.id,sources:u,differences:s},t.push({id:r.id,definitions:[o,r],sources:u,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:a,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}}return n}function Ku(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 Yo(e){let t=[],n=new Map,r=new Map,o=[...e].sort((a,u)=>a.precedence-u.precedence),i=new Map,s=new Map;for(let a of o){let u=i.get(a.precedence)??[],l=a.models.map(c=>Ho(c,a.kind,a.editable&&c.editable!==!1));u.push(...l),i.set(a.precedence,u);for(let c of l)s.set(c.id,a.precedence)}for(let[a,u]of[...i.entries()].sort((l,c)=>l[0]-c[0])){let l=u.filter(f=>s.get(f.id)===a),c=u.filter(f=>s.get(f.id)!==a),d=$o(c,[]);for(let[f,y]of $o(l,t))d.set(f,y);let m=new Set(u.map(f=>f.id));for(let f of m)s.get(f)===a&&n.set(f,u.filter(y=>y.id===f));for(let[f,y]of d)r.set(f,Ku(r.get(f),y))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Hu(e){return ct.includes(e)}function Yu(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:He(),augmentations:[]}}function Ju(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function Zu(e,t,n){for(let r of new Set(n))if(Hu(r)){for(let o of wn(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...Mn(r))}}function Qu(e,t,n,r,o){for(let i of o){let s=Cn(i,{uri:i.uri,path:i.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(i.uri,a);for(let u of a.behaviorTrees)Ju(e.behaviorTreesById,u.id,u);i.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function el(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 tl(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=el(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function nl(e,t,n,r,o){e.modelLayers.push(Xo(t),zo(n),Wo(r)),o.models?.length&&e.modelLayers.push(Go([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Me(e,t){return rl(e,t)}function rl(e,t){let n=Yu(),r=[],o=[],i=[],s=[];Zu(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=He(t.augmentations??[]),Qu(n,r,i,s,e),tl(n),nl(n,o,i,s,t);let a=t.config.models.inline;if(a){let c=[];for(let[d,m]of Object.entries(a))c.push(it(d,m));n.modelLayers.push(Ko(c))}let u=Yo(n.modelLayers),l=Vo(u.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=u.nodeModelsById,n.mergedNodeModelsById=l.modelsById,n.modelConflicts=u.conflicts,r.push(...l.diagnostics),{ok:r.every(c=>c.severity!==h.Error),index:n,diagnostics:r}}var Jo={unknownSubTreePorts:"allow"};function Zo(e){return{...Jo,...e}}var ol=["Action","Condition","Control","Decorator"],il=new Set(ol);var sl=new Set(["input_port","output_port","inout_port"]);function St(e){return il.has(e)}function Ae(e){return St(e)?e:void 0}function Gt(e,t){return e.attributes.find(n=>n.name===t)?.value}function $n(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&$n(n,t))return!0;return!1}function Qo(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return $n(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&$n(n,t))return!0;return!1}function Kt(e){return sl.has(e.name)}function ei(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":St(e.name)?"generic-node":Kt(e)?"unknown-xml":"concrete-node"}function Ht(e){if(e.name==="SubTree")return Gt(e,"ID")||"SubTree";if(St(e.name))return Gt(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||Kt(e)))return e.name}function Z(e){return e.typeRegistry}function te(e,t){return ie(Z(e),t)}function Re(e,t,n){return ut(Z(e),t,n)}function bt(e,t){return e.documents.get(t)}function H(e,t){return e.behaviorTreesById.get(t)??[]}function Xn(e,t){return e.behaviorTreesById.has(t)}function zn(e){return[...e.behaviorTreesById.values()].flat()}function Wn(e,t){return ti(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function Te(e){return[...e.behaviorTreesById.keys()]}function ti(e){return[...e.documents.values()]}function ne(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function vt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function Yt(e){return[...e.mergedNodeModelsById.values()]}function Gn(e){return e.modelLayers.flatMap(t=>t.models)}function Rt(e){return[...e.mergedNodeModelsById.values()]}function Kn(e){return[...e.nodeModelsById.keys()]}function Hn(e){return[...e.genericSubTreePorts]}function Tt(e){return[...e.augmentations]}function xt(e){return e.modelConflicts}function kt(e,t){let{id:n,fileLocalUri:r,config:o}=t,i=H(e,n);if(i.length>0){if((o?.resolver?.behaviorTreeIds==="file-local-first"||o?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let l=i.filter(c=>c.uri===r);l.length>0&&(i=l)}let a=ne(e,n),u=a?.kind==="SubTree"?[a]:[];return i.length===1?{status:"resolved",kind:"behavior-tree",treeId:i[0].id,behaviorTree:i[0]}:{status:"ambiguous",candidates:[...i.map(l=>l.id),...u.map(l=>l.id)],behaviorTrees:i,definitions:u}}let s=ne(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function Yn(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=ne(e,t);if(n){let o=xt(e).find(i=>i.id===t&&i.code==="BT012_CONFLICTING_NODE_MODEL");return o?{status:"ambiguous",nodeType:t,candidates:o.definitions}:{status:"resolved",model:n}}let r=vt(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 Jn(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function Zn(e){let t=Hn(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return Jn([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Qn(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}:En(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 F(e,t){let n=Zo(t.policy),r=t.element,o=ei(r),i=Qo(t.documentRoot,r);if((t.isModelDefinition||i&&(o==="generic-node"||o==="subtree"))&&(o="model-definition"),i&&Kt(r)&&(o="unknown-xml"),o==="root"||o==="behavior-tree"||o==="tree-nodes-model"||o==="include"||o==="model-definition"||o==="unknown-xml")return{element:r,tagName:r.name,tagForm:o,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=Ht(r);if(o!=="subtree"){let f=Yn(e,s),y=Zn({index:e,tagForm:o,model:f}),p=r.attributes.map(x=>Qn({attribute:x,ports:y,allowsArbitraryAttributes:!1,model:f}));return{element:r,tagName:r.name,tagForm:o,nodeType:s,model:f,ports:y,allowsArbitraryAttributes:!1,portUsages:p}}let a=Gt(r,"ID"),u=a?kt(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},l={status:"unresolved",nodeType:a},c=!1;if(u.status==="resolved"&&u.kind==="node-model")l={status:"resolved",model:u.model};else if(u.status==="resolved"&&u.kind==="behavior-tree"){let f=Yn(e,u.treeId);f.status==="resolved"&&f.model.kind==="SubTree"?l=f:c=n.unknownSubTreePorts==="allow"}else u.status==="ambiguous"&&u.definitions.length>0?l=u.definitions.length===1?{status:"resolved",model:u.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:u.definitions}:c=n.unknownSubTreePorts==="allow";let d=Zn({index:e,tagForm:o,model:l,subtreeModelPorts:u.status==="ambiguous"?Jn(u.definitions.flatMap(f=>f.ports)):void 0}),m=r.attributes.map(f=>Qn({attribute:f,ports:d,allowsArbitraryAttributes:c,model:l,unknownModelPortStatus:!c&&l.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:o,nodeType:s,model:l,subtree:{id:a,target:u},ports:d,allowsArbitraryAttributes:c,portUsages:m}}function pe(e,t){return F(e,t).portUsages.find(r=>r.name===t.attributeName)}function ll(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function cl(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function ni(e,t){let n=e.line,r=e.character,o=e.offset;for(let i of t){if(o+=i.length,i===`
5
- `){n+=1,r=0;continue}r+=i.length}return{line:n,character:r,offset:o}}function dl(e,t,n){let r=ni(e,t),o=ni(r,n);return{start:r,end:o}}function oi(e,t){let n=t.valueContentRange||t.valueRange,r=e.originalText.slice(n.start.offset,n.end.offset),o=[];for(let i of r.matchAll(/\{([^}]+)\}/g)){let s=i[0],a=i[1],u=i.index??0;o.push({raw:s,key:a,range:dl(n.start,r.slice(0,u),s),syntax:"braced"})}return o.length===0&&(r.includes("{")||r.includes("}"))&&o.push({raw:r,key:r,range:n,syntax:"invalid"}),o}function ml(e,t){return ll(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function ii(e){let t=[];for(let n of e)t.push(n),t.push(...ii(n.children));return t}function pl(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function fl(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function gl(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function si(e){return xe(e,"name")?.value}function yl(e){return si(e)||xe(e,"ID")?.value||e.name}function hl(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${yl(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function ai(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 ui(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 Sl(e){return e.status==="resolved"?e.port.direction:"unknown"}function bl(e,t){return e===""?"empty":e==="{=}"?"substitution":t.some(n=>n.syntax==="braced")?"blackboard-reference":t.some(n=>n.syntax==="invalid")?"unknown":"literal"}function ri(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:Sl(t.usage),valueKind:bl(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 vl(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 xe(e,t){return e.attributes.find(n=>n.name===t)}function Rl(e){return e.root?xe(e.root,"main_tree_to_execute")?.value:void 0}function Tl(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let o of r.children)o.kind==="element"&&n(o)};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 ae(e,t){let n=t.semantic,r=Tl(e.root),o=cl(e).map(u=>({id:xe(u,"ID")?.value,element:u,rootNode:void 0,nodes:[]})),i=[],s=[],a=(u,l,c,d)=>{let m=F(n,{element:u,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(u)}),f=ai(m),y={element:u,path:d,tagName:u.name,kind:ml(u,m),model:f,usage:m,portBindings:[],children:[],parent:c,behaviorTree:l};if(y.portBindings=m.portUsages.filter(p=>p.status!=="reserved-attribute").map(p=>({name:p.name,value:p.value,attribute:p.attribute,declaredPort:ui(p),usage:p,blackboardReferences:oi(e,p.attribute)})),y.children=u.children.filter(p=>p.kind==="element").map((p,x)=>a(p,l,y,[...d,x])),u.name==="SubTree"){let p=xe(u,"ID")?.value;i.push({node:y,id:p,target:m.subtree?.target??{status:"unresolved",id:p},portRemaps:y.portBindings})}return y};for(let u of o){let l=u.element.children.filter(c=>c.kind==="element").map((c,d)=>a(c,u,void 0,[d]));u.rootNode=l[0],u.nodes=ii(l),s.push(...u.nodes)}return{document:e,behaviorTrees:o,subtreeCalls:i,nodes:s}}function Jt(e,t,n){let r=ae(e,{semantic:t,config:n?.config,policy:n?.policy}),o=fl(r.behaviorTrees),i=r.nodes.map(l=>{let c=o(l),d=l.usage,m=d.nodeType??l.tagName,f=si(l.element),y=xe(l.element,"ID")?.value,p=hl(l);return{nodeId:c,path:l.path,instancePath:p,tagName:l.tagName,nodeType:m,name:f,idAttr:y,kind:l.kind,range:l.element.range,fullRange:l.element.fullRange,nameRange:l.element.nameRange,parentNodeId:l.parent?o(l.parent):void 0,childNodeIds:l.children.map(o),behaviorTreeId:l.behaviorTree.id,attributes:l.element.attributes.map(gl),identityCandidates:vl({name:f,idAttr:y,nodeType:m,tagName:l.tagName,instancePath:p,behaviorTreeId:l.behaviorTree.id,nodeId:c}),model:ai(d),usage:d,portBindings:d.portUsages.filter(x=>x.status!=="reserved-attribute").map(x=>ri(c,{name:x.name,value:x.value,attribute:x.attribute,declaredPort:ui(x),usage:x,blackboardReferences:oi(e,x.attribute)}))}}),s=r.behaviorTrees.map(l=>({id:l.id,range:l.element.range,idRange:xe(l.element,"ID")?.valueContentRange,rootNodeId:l.rootNode?o(l.rootNode):void 0,nodeIds:l.nodes.map(o)})),a=r.subtreeCalls.map(l=>({nodeId:o(l.node),callId:l.id,range:l.node.element.range,target:l.target,portBindings:l.portRemaps.map(c=>ri(o(l.node),c))})),u=e.root?xe(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:pl(e),mainTreeToExecute:Rl(e),mainTreeToExecuteRange:u?.valueContentRange||u?.valueRange,behaviorTrees:s,nodes:i,subtreeCalls:a}}function xl(e,t){let n=e.element.fullRange||e.element.range;return z(n,t)}function kl(e,t){let n=e.element.fullRange||e.element.range,r=t.element.fullRange||t.element.range;return n.end.offset-n.start.offset<r.end.offset-r.start.offset}function Zt(e,t){let n;for(let r of e.nodes)xl(r,t.offset)&&(!n||kl(r,n))&&(n=r);return n}function Je(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(z(r.attribute.range,t.offset))return r}function Dl(e,t){return z(e.fullRange||e.range,t)}function Il(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 Qt(e,t){let n;for(let r of e.nodes)Dl(r,t.offset)&&(!n||Il(r,n))&&(n=r);return n}function en(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(z(r.range,t.offset))return r}function li(e){let{document:t,diagnostics:n,options:r,partial:o}=e,i=n.some(a=>a.severity===h.Error),s="generic-xml";if(i)s="invalid-xml";else if(t.root){let a=t.root,u=a.children.some(m=>m.kind==="element"&&m.name==="BehaviorTree"),l=a.children.some(m=>m.kind==="element"&&m.name==="TreeNodesModel"),c=a.attributes.some(m=>m.name==="BTCPP_format"&&m.value==="4"),d=a.name==="TreeNodesModel"||a.name==="root"&&!u&&l;r.kind==="model-xml"||d?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(c||u)||r.kind==="bt-xml")&&(s="bt-document")}return t.kind=s,t.isBtXml=s==="bt-document"||s==="model-document",!i&&!o?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:o}}function _l(e){if(e.name==="input_port"||e.name==="output_port")return!1;let t=e.children||[],n=t.some(o=>o.kind==="text"&&o.text.trim()!==""),r=t.some(o=>o.kind==="element");return n&&r}function er(e,t){if(e.kind==="element"){_l(e)&&t(e);for(let n of e.children||[])er(n,t)}}function V(e,t){let n=0,r=0;for(let o=0;o<Math.min(t,e.length);o++)e[o]===`
6
- `?(n++,r=0):r++;return Ke(n,r,t)}function tr(e,t,n,r){for(let o=0;o<e.length;o++){if(e[o]!=="&")continue;let i=e.slice(o+1),s=o;if(i.startsWith("amp;")){o+=4;continue}if(i.startsWith("lt;")){o+=3;continue}if(i.startsWith("gt;")){o+=3;continue}if(i.startsWith("quot;")){o+=5;continue}if(i.startsWith("apos;")){o+=5;continue}if(i.startsWith("#")){let d=1;if(i[d]==="x"||i[d]==="X"){d++;let x="";for(;d<i.length&&/[0-9a-fA-F]/.test(i[d]);)x+=i[d],d++;if(d<i.length&&i[d]===";"){d++;let g=e.slice(s,s+1+d),S=V(n,t+s),R=V(n,t+s+g.length);if(x){let T=Number.parseInt(x,16);if(T>0&&T<=1114111&&(T<55296||T>57343)){o+=d-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${g}\``,S,R,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=d-1;continue}r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${g}\``,S,R,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let E=e.slice(s,s+1+d),k=V(n,t+s),N=V(n,t+s+E.length);r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${E}\``,k,N,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let m="";for(;d<i.length&&/[0-9]/.test(i[d]);)m+=i[d],d++;if(d<i.length&&i[d]===";"){d++;let x=e.slice(s,s+1+d),E=V(n,t+s),k=V(n,t+s+x.length);if(m){let N=Number.parseInt(m,10);if(N>0&&N<=1114111&&(N<55296||N>57343)){o+=d-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${x}\``,E,k,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=d-1;continue}r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${x}\``,E,k,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let f=e.slice(s,s+1+d),y=V(n,t+s),p=V(n,t+s+f.length);r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${f}\``,y,p,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let a=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(a){let d=`&${a[0]}`,m=V(n,t+s),f=V(n,t+s+d.length);r("XML013_UNKNOWN_ENTITY",h.Error,`unknown XML entity \`${d}\``,m,f,{primaryLabel:"this entity is not one of XML's predefined entities",help:"use one of `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&apos;`, or a valid numeric entity"}),o+=d.length-1;continue}let u=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(u){let d=`&${u[0]}`,m=V(n,t+s),f=V(n,t+s+d.length);r("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",m,f,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"}),o+=d.length-1;continue}let l=V(n,t+s),c=V(n,t+s+1);r("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",l,c,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"})}}function Dt(e){return e.replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let r=Number.parseInt(n,16);return r<=0||r>1114111||r>=55296&&r<=57343?t:String.fromCodePoint(r)}).replace(/&#([0-9]+);/g,(t,n)=>{let r=Number.parseInt(n,10);return r<=0||r>1114111||r>=55296&&r<=57343?t:String.fromCodePoint(r)})}function ci(e){let t="",n=[0];for(let r=0;r<e.length;){let o=Ll(e,r);if(!o){t+=e[r]??"",r+=1,n.push(r);continue}t+=o.value,r=o.end,n.push(r)}return{value:t,offsets:n}}function Ll(e,t){let n=e.slice(t);if(n.startsWith("&quot;")||n.startsWith("&apos;")||n.startsWith("&lt;")||n.startsWith("&gt;")||n.startsWith("&amp;")){let s=n.startsWith("&quot;")?"&quot;":n.startsWith("&apos;")?"&apos;":n.startsWith("&lt;")?"&lt;":n.startsWith("&gt;")?"&gt;":"&amp;";return{value:Dt(s),end:t+s.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let s=o[0];return{value:Dt(s),end:t+s.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let s=i[0];return{value:Dt(s),end:t+s.length}}}function di(e){return Ke(e.line,e.character,e.offset)}function jl(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function Fl(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function Ul(e){return e===" "||e===" "||e===`
7
- `||e==="\r"}function Ol(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
8
- `&&e!=="\r"}function fe(e,t={}){let n=[],r=t.mode==="tolerant",o={uri:t.uri||"",path:t.path,kind:"generic-xml",isBtXml:!1,xmlDeclaration:void 0,root:void 0,nodes:[],diagnostics:n,originalText:e},i=0,s=0,a=0,u=[],l=!1;function c(){return Ke(s,a,i)}function d(){return i>=e.length}function m(v=0){return e[i+v]}function f(v=1){for(let _=0;_<v;_+=1)e[i++]===`
9
- `?(s+=1,a=0):a+=1}function y(){for(;!d()&&Ul(m());)f()}let p=(v,_,M,L,C,G)=>{n.push(w(v,_,M,I(L,C),o.uri,G))};function x(v,_,M,L,C,G){n.push(w(v,_,M,L&&C?I(L,C):void 0,o.uri,G))}function E(){if(!jl(m()))return"";let v=i;for(f();!d()&&Fl(m());)f();return e.slice(v,i)}function k(){let v=m();if(v!=='"'&&v!=="'")return{value:"",ok:!1};let _=c();f();let M=c(),L=i;for(;!d()&&m()!==v&&m()!=="<";)f();let C=c();if(d()||m()!==v)return{value:e.slice(L,i),ok:!1,valueRange:I(_,C),valueContentRange:I(M,C)};let G=e.slice(L,i);f(),tr(G,M.offset,e,p);let Se=ci(G);return{value:Se.value,valueOffsets:Se.offsets,ok:!0,valueRange:I(_,c()),valueContentRange:I(M,C)}}function N(){let v=[],_=new Set;for(;;){y();let M=m();if(!M||M===">"||M==="/"&&m(1)===">")break;let L=c(),C=E(),G=c();if(!C)break;y();let Se=c();if(m()!=="="){if(p("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",L,G,{primaryLabel:`expected \`=\` after attribute \`${C}\``,help:`write the attribute as \`${C}="..."\``}),l=!0,r)continue;break}f();let Aa=c();y();let Dn=c(),we=k(),We=c();if(!we.ok&&(p("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",Dn,We,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${C}="value"\``}),l=!0,!r)||(_.has(C)?p("XML004_DUPLICATE_ATTRIBUTE",h.Error,`duplicate attribute \`${C}\``,L,We,{primaryLabel:`attribute \`${C}\` is already defined on this element`,help:`remove one of the duplicate \`${C}\` attributes`}):_.add(C),v.push({name:C,value:we.value,...we.valueOffsets?{valueOffsets:we.valueOffsets}:{},range:I(L,We),fullRange:I(L,We),nameRange:I(L,G),equalsRange:I(Se,Aa),valueRange:we.valueRange||I(Dn,We),valueContentRange:we.valueContentRange||I(Dn,We)}),!we.ok&&r))break}return v}function g(v){u.length>0?u[u.length-1].children.push(v):(o.nodes.push(v),!o.root&&v.kind==="element"&&(o.root=v))}function S(){let v=c(),_=i;for(;!d()&&m()!=="<";)f();let M=e.slice(_,i);if(M.length===0)return;for(let C of M)if(Ol(C)){p("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",v,c(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}tr(M,_,e,p);let L={kind:"text",text:Dt(M),range:I(v,c()),fullRange:I(v,c())};g(L)}function R(){let v=c();f(4);let _=c(),M=i;for(;!d()&&!(m()==="-"&&m(1)==="-"&&m(2)===">");)f();let L=e.slice(M,i);if(d()){if(p("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",v,c(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),l=!0,!r)return;let Se={kind:"comment",text:L,range:I(v,c()),fullRange:I(v,c()),contentRange:I(_,c())};g(Se);return}(L.includes("--")||L.endsWith("-"))&&p("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",_,c(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let C=c();f(3);let G={kind:"comment",text:L,range:I(v,c()),fullRange:I(v,c()),contentRange:I(_,C)};g(G)}function T(){let v=c();f(5),y();let _=N();y(),m()==="?"&&m(1)===">"?f(2):p("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",v,c(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let M={range:I(v,c()),attributes:_};for(let L of _)L.name==="version"&&(M.version=L.value),L.name==="encoding"&&(M.encoding=L.value),L.name==="standalone"&&(M.standalone=L.value);o.xmlDeclaration=M}function A(){let v=c();f(2),y();let _=c(),M=E(),L=c();if(y(),m()!==">")for(p("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",v,c(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),l=!0;!d()&&m()!==">";)f();m()===">"&&f();let C=u.pop();if(!C||C.name!==M){let G=C?C.name:M||"",Se=M||"";p("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${Se}>\``,v,c(),{primaryLabel:`opened as \`<${G}>\` but closed as \`</${Se}>\``,help:`change the closing tag to \`</${G}>\` or fix the nesting`});return}C.closeTagRange=I(v,c()),C.endTagRange=I(v,c()),C.nameRange||(C.nameRange=I(_,L)),C.range=I(C.range.start,c()),C.fullRange=I(C.range.start,c())}for(;!d();)if(m()==="<")if(m(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")T();else{let v=c();for(;!d()&&!(m()==="?"&&m(1)===">");)f();d()||f(2),p("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",v,c(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(m(1)==="!"&&m(2)==="-"&&m(3)==="-")R();else if(m(1)==="!"&&m(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let v=c();for(f(8);!d()&&!(m()==="]"&&m(1)==="]"&&m(2)===">");)f();d()||f(3),p("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",v,c(),{primaryLabel:"CDATA sections are not supported by btxml",help:"replace the CDATA section with normal escaped XML text",notes:["escape `<` as `&lt;`, `>` as `&gt;`, and `&` as `&amp;`"]})}else if(m(1)==="!"&&e.slice(i+2,i+9)==="DOCTYPE"){let v=c();for(f(8);!d()&&m()!==">";)f();d()||f(1),p("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",v,c(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(m(1)==="/")A();else{let v=c();f();let _=c(),M=E(),L=c();if(!M){if(p("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,c(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),l=!0,r){f();continue}break}let C={kind:"element",name:M,attributes:[],children:[],range:I(v,v),fullRange:I(v,v),openTagRange:I(v,v),startTagRange:I(v,v),nameRange:I(_,L),selfClosing:!1};if(C.attributes=N(),y(),m()==="/"&&m(1)===">"){f(2),C.selfClosing=!0,C.openTagRange=I(v,c()),C.startTagRange=C.openTagRange,C.range=I(v,c()),C.fullRange=I(v,c()),g(C);continue}if(m()!==">"){if(p("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,c(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),l=!0,r){C.openTagRange=I(v,c()),C.startTagRange=C.openTagRange,C.range=I(v,c()),C.fullRange=I(v,c()),g(C);continue}break}f(),C.openTagRange=I(v,c()),C.startTagRange=C.openTagRange,C.range=I(v,c()),C.fullRange=I(v,c()),g(C),u.push(C)}else S();if(u.length>0){let v=u[u.length-1];if(p("XML006_MISSING_CLOSING_TAG",h.Error,`missing closing tag for \`<${v.name}>\``,v.openTagRange.start,v.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${v.name}>\` before the end of the file`}),l=!0,r)for(;u.length>0;){let _=u.pop();if(!_)break;_.range=I(_.range.start,c()),_.fullRange=I(_.range.start,c())}}let j=o.nodes.filter(v=>v.kind==="element");j.length===0?x("XML002_MISSING_ROOT",h.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):j.length>1&&x("XML003_MULTIPLE_ROOTS",h.Error,"multiple root elements",void 0,void 0,{primaryLabel:"this document has more than one top-level element",help:'wrap the document content in one `<root BTCPP_format="4">...</root>` element'});let O=o.root;if(O)for(let v of o.nodes)v!==O&&v.kind==="text"&&v.text.trim().length>0&&p("XML016_TEXT_OUTSIDE_ROOT",h.Error,"text outside root element",v.range.start,v.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!o.xmlDeclaration)x("XML008_MISSING_DECLARATION",h.Warning,"missing XML declaration",void 0,void 0,{help:'add `<?xml version="1.0" encoding="UTF-8"?>` at the top of the file',notes:["this is a warning because BehaviorTree.CPP can still parse many files without a declaration"]});else if(o.xmlDeclaration.encoding&&o.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let v=o.xmlDeclaration.encoding;p("XML009_INVALID_ENCODING",h.Warning,"XML encoding should be UTF-8",o.xmlDeclaration.range.start,o.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${v}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return O&&er(O,v=>{p("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",di(v.range.start),di(v.range.end),{primaryLabel:"this element contains both text and child elements",help:"move the text into an attribute or split it into separate elements",notes:["text inside `<input_port>` and `<output_port>` remains allowed"]})}),li({document:o,diagnostics:n,partial:l,options:t})}var It={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function mi(e){if(!e)return It;let t=typeof e.indentWidth=="number"?e.indentWidth:It.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:It.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:It.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:It.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:o}}function tn(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function nn(e){return tn(e).replace(/"/g,"&quot;")}function Vl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function ql(e,t,n){return`${" ".repeat(e*n)}${t}`}function Ze(e,t,n,r){let o=" ".repeat(t*r),i=e.attributes||[];if(i.length===0)return[`${o}<${e.name}${n}`];if(i.length===1)return[`${o}<${e.name} ${i[0].name}="${nn(i[0].value)}"${n}`];let s=[`${o}<${e.name} ${i[0].name}="${nn(i[0].value)}"`],a=" ".repeat(o.length+1+e.name.length+1);for(let u=1;u<i.length;u+=1){let l=i[u],c=u===i.length-1?n:"";s.push(`${a}${l.name}="${nn(l.value)}"${c}`)}return s}function rn(e,t,n,r){let o=" ".repeat(t*n);if(e.kind==="comment")return[`${o}<!--${e.text}-->`];if(e.kind==="text"){let c=e.text.trim();return c?[ql(t,tn(c),n)]:[]}let i=Vl(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(c=>c.kind==="text").map(c=>c.text).join("").trim(),u=i.some(c=>c.kind==="element"||c.kind==="comment");if(a&&u&&!s&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!u){if((e.attributes||[]).length<=1){let c=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${nn(e.attributes[0].value)}"`;return[`${o}<${e.name}${c}>${tn(a)}</${e.name}>`]}return Ze(e,t,`>${tn(a)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return Ze(e,t,"/>".slice(0),n);let c=Ze(e,t,">",n);return c.push(`${o}</${e.name}>`),c}let l=Ze(e,t,">",n);for(let c of e.children||[])c.kind==="text"&&c.text.trim()===""||l.push(...rn(c,t+1,n,r));return l.push(`${o}</${e.name}>`),l}function $l(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function pi(e,t,n,r){let o=[],i=$l(e);for(let s=0;s<i.length;s+=1){let a=i[s],u=i[s-1],l=i[s+1],c=n&&a.kind==="element"&&a.name==="BehaviorTree"&&u&&u.kind==="element"&&u.name==="BehaviorTree",d=a.kind==="element"&&a.name==="TreeNodesModel"&&u!==void 0&&u.kind!=="comment",m=a.kind==="comment"&&l&&l.kind==="element"&&l.name==="TreeNodesModel"&&u!==void 0;(c||d||m)&&o.length>0&&o[o.length-1]!==""&&o.push(""),a.kind==="element"?(o.push(...rn(a,1,t,r)),a.name==="TreeNodesModel"&&o.push("")):o.push(...rn(a,1,t,r))}return o}function Ct(e,t={}){let n=fe(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(p=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(p.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let o=n.document.root,i=mi(t),s=i.indentWidth,a=[],u=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&u)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...Ze(o,0,">",s)),a.push(...pi(o.children||[],s,i.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${o.name}>`),n.diagnostics.some(p=>p.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let l=`
1
+ import{constants as Zp}from"fs";import Gt from"fs/promises";import _e from"path";import{fileURLToPath as Qp,pathToFileURL as mo}from"url";var Kt=["off","info","warn","error"];var fo={linter:{rules:{"xml/require-btcpp-format":"error","xml/no-unknown-top-level-element":"error","model/no-unknown-node":"error","model/no-unknown-port":["error",{subTreePorts:"strict"}],"script/no-unknown-variable":"error","model/no-childless-control-shape-mismatch":"error","model/no-leaf-block-shape":"error","model/valid-child-count":"error","suppression/no-unused":"error","suppression/require-reason":"warn"}}},il={files:{include:["**/*.xml"],ignore:["build/**","install/**","log/**","node_modules/**",".git/**"],useGitignore:!0,followSymlinks:!1,maxSize:5*1024*1024},resolver:{entrypoints:[],includes:{elements:[{name:"include",attribute:"path",base:"file"}],variables:{},allowOutsideRoot:!1,maxDepth:32,maxFiles:1e3},behaviorTreeIds:"workspace-unique"},models:{builtins:["btcpp-v4"],files:[],augmentations:[],definitions:[],inline:{}},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function Qe(){return structuredClone(il)}function pt(e,t){return{files:t.files?{...e.files,...t.files}:e.files,resolver:t.resolver?{...e.resolver,...t.resolver,includes:{...e.resolver.includes,...t.resolver.includes||{},variables:{...e.resolver.includes.variables,...t.resolver.includes?.variables||{}}}}:e.resolver,models:t.models?{...e.models,...t.models}:e.models,linter:t.linter?{...e.linter,...t.linter,rules:t.linter.rules?{...e.linter.rules,...t.linter.rules}:e.linter.rules,suppressions:t.linter.suppressions?{...e.linter.suppressions,...t.linter.suppressions}:e.linter.suppressions}:e.linter,formatter:t.formatter?{...e.formatter,...t.formatter}:e.formatter,overrides:t.overrides?[...e.overrides,...t.overrides]:e.overrides}}var b={Error:"error",Warning:"warning",Info:"info"};function w(e,t,n,r,o="",i,s){return{code:e,severity:t,message:n,uri:o,...r?{range:r}:{},...i?{details:i}:{},...s?{data:s}:{}}}function et(e,t,n){return{line:e,character:t,offset:n}}function D(e,t){return{start:e,end:t}}function H(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}function sl(e){let t=[0];for(let n=0;n<e.length;n+=1)e[n]===`
2
+ `&&t.push(n+1);return t}function Ln(e,t,n){return Math.min(Math.max(e,t),n)}function tt(e,t,n=0,r="xml"){let o=sl(t),i=c=>{let u=Ln(c,0,t.length),d=0,p=o.length;for(;d<p;){let g=Math.floor((d+p)/2);o[g]>u?p=g:d=g+1}let m=Math.max(0,d-1);return{line:m,character:u-o[m],offset:u}},s=c=>{let u=Ln(c.line,0,Math.max(0,o.length-1)),d=o[u],p=u+1<o.length?o[u+1]:t.length;return Ln(d+c.character,d,p)};return{uri:e,languageId:r,version:n,text:t,lineOffsets:o,positionAt:i,offsetAt:s,getText:c=>c?t.slice(s(c.start),s(c.end)):t}}var al=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function jn(e){return{ok:!0,reference:e}}function Ie(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function go(e){return al.test(e)}function yo(e){if(!e)return Ie("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?go(t)?{ok:!0,scope:"global",key:t}:Ie("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):Ie("empty-key",e,"Global blackboard reference key must not be empty")}return go(e)?{ok:!0,scope:"local",key:e}:Ie("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function X(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return jn({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return Ie("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return Ie("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let r=n.slice(1,-1).trim(),o=yo(r);return o.ok?jn({scope:o.scope,key:o.key,raw:n,syntax:"braced"}):o}function mt(e){let{rawName:t}=e;if(!t.startsWith("@"))return Ie("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=yo(t);return n.ok?n.scope!=="global"?Ie("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):jn({scope:n.scope,key:n.key,raw:t,syntax:"script"}):n}function je(e){return e.scope==="global"?`{@${e.key}}`:`{${e.key}}`}function z(e){return`${e.scope}:${e.key}`}var ll={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function cl(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function fe(e,t){return e.attributes.find(n=>n.name===t)}function ul(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function dl(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function pl(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function bo(e,t){let n=e.line,r=e.character,o=e.offset;for(let i of t){if(o+=i.length,i===`
3
+ `){n+=1,r=0;continue}r+=i.length}return{line:n,character:r,offset:o}}function ml(e,t,n){let r=bo(e,t),o=bo(r,n);return{start:r,end:o}}function ho(e,t,n,r){for(let o of e.attributes||[]){let i=o.valueContentRange??o.valueRange,s=r.slice(i.start.offset,i.end.offset),a=c=>{let u=X({portName:o.name,rawValue:c.parsedRaw});if(!u.ok)return;let d=u.reference.raw.length;t.push({raw:u.reference.raw,key:u.reference.key,scope:u.reference.scope,identity:z(u.reference),syntax:u.reference.syntax,attributeName:o.name,element:e,uri:n,range:ml(i.start,s.slice(0,c.parsedOffset),u.reference.raw.slice(0,d))})},l=X({portName:o.name,rawValue:s});if(l.ok){let c=Math.max(0,s.indexOf(l.reference.raw));a({parsedRaw:l.reference.raw,parsedOffset:c});continue}for(let c of s.matchAll(/\{[^}]*\}/g)){let u=c[0],d=c.index??0;a({parsedRaw:u,parsedOffset:d})}}for(let o of e.children||[])o.kind==="element"&&ho(o,t,n,r)}function fl(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!ul(i.name))continue;let s=fe(i,"ID");if(!s)continue;let a=[];for(let l of i.children||[]){if(l.kind!=="element"||l.name!=="input_port"&&l.name!=="output_port"&&l.name!=="inout_port")continue;let c=fe(l,"name"),u=fe(l,"type"),d=fe(l,"default")||fe(l,"default_value"),p=fe(l,"enum"),m=(l.children||[]).filter(x=>x.kind==="text").map(x=>x.text).join("").trim()||void 0,g=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",f=(g==="input"||g==="inout")&&d===void 0;a.push({source:n,direction:g,name:c?c.value:"",type:u?.value||void 0,defaultValue:d?.value||void 0,description:m,required:f,element:l,uri:t,range:l.range,nameRange:c?.range,enum:p?.value?p.value.split(";"):void 0})}o.push({id:s.value,kind:i.name,source:n,sourceMeta:{sourceKind:n,file:t,range:i.range},editable:r,ports:a,element:i,uri:t,range:i.range,elementRange:i.range,idRange:s.range})}return o}function gl(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let o=fe(r,"ID");o&&n.push({id:o.value,kind:"BehaviorTree",uri:t,element:r,range:r.range,elementRange:r.range,idRange:o.range})}return n}function yl(e,t){let n=[],r=(o,i,s=!1)=>{if(s)return;let a=o.name==="BehaviorTree"?fe(o,"ID")?.value??i:i,l=o.name==="TreeNodesModel";if(o.name==="SubTree"){let c=fe(o,"ID");c&&n.push({id:c.value,uri:t,element:o,range:o.range,elementRange:o.range,idRange:c.range,parentBehaviorTreeId:a,attributes:o.attributes})}for(let c of o.children||[])c.kind==="element"&&r(c,a,l)};if(e.name==="TreeNodesModel")return n;for(let o of e.children||[])o.kind==="element"&&r(o);return n}function bl(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function So(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 hl(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(So),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 Sl(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function vl(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 Rl(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(bl),subtreeReferences:e.subtreeReferences.map(Sl),blackboardReferences:e.blackboardReferences.map(vl),treeNodesModel:e.treeNodesModel.map(hl),genericSubTreePorts:e.genericSubTreePorts.map(So),rootMainTreeToExecute:dl(e.rootMainTreeToExecute)}}function kl(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Tl(e){return w(ll.DuplicateNodeModelId,b.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 xl(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,s=cl(e),a=pl(e),l=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",c=o&&e.kind!=="model-document"?gl(o,r):[],u=[],d=[],p=o?o.name==="TreeNodesModel"?[o]:o.children.filter(B=>B.kind==="element"&&B.name==="TreeNodesModel"):[];for(let B of p){let k=fl(B,r,a,l),E=new Map;for(let y of k)kl({node:y,treeNodesModel:u,genericSubTreePorts:d})||(E.has(y.id)?n.push(Tl(y)):E.set(y.id,y))}let m=o?yl(o,r):[],g=o?(()=>{let B=[];return ho(o,B,r,e.originalText),B})():[],f=o?fe(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Rl({uri:r,path:t?.path??e.path,isBtXml:i,kind:s,behaviorTrees:c,subtreeReferences:m,blackboardReferences:g,treeNodesModel:u,genericSubTreePorts:d,rootMainTreeToExecute:f?{uri:r,range:f.range,value:f.value}:void 0}),extractedBehaviorTrees:c,extractedTreeNodesModel:u,extractedSubTreeReferences:m,extractedBlackboardReferences:g},diagnostics:n}}function vo(e,t){let{extracted:n,diagnostics:r}=xl(e,t);return{model:n.publicModel,diagnostics:r}}function Fn(e,t){return vo(e,t)}var Ro=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Il=new Set([...Ro,"_autoremap","_description","__shared_blackboard"]),Dl=new Map([[".","port names must not contain `.`"],["<","port names must not contain `<`"],[">","port names must not contain `>`"],["&","port names must not contain `&`"],['"','port names must not contain `"`'],["'","port names must not contain `'`"],["/","port names must not contain `/`"],["\\","port names must not contain `\\`"],[":","port names must not contain `:`"],["*","port names must not contain `*`"],["?","port names must not contain `?`"],["|","port names must not contain `|`"]]);function On(e){return Ro.has(e)}function ko(e){return Il.has(e)}function Un(e){if(e.length===0)return"port names must not be empty";if(/^[0-9]/.test(e))return"port names must not start with a digit";if(ko(e))return`\`${e}\` is a reserved attribute name`;for(let t of e){let n=t.charCodeAt(0);if(n<=31||n===127)return"port names must not contain ASCII control characters";if(t===" "||t===" "||t===`
4
+ `||t==="\r")return"port names must not contain whitespace";let r=Dl.get(t);if(r)return r}}function To(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 ft(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>To(n,r))}}var Cl=[{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"]}],gt=new Map,xo=new Map;for(let e of Cl){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};xo.set(e.name,t),gt.set(e.name,e.name);for(let n of e.aliases)gt.set(n,e.name)}function Bl(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 Vn(e){return gt.get(e)??e}function El(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 yt(e){return gt.get(e)}function nt(e=[]){let t=new Map,n=new Map(gt);for(let r of xo.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[o,i]of Object.entries(r.types??{})){let s=Vn(i.canonical??o),l=t.get(s)??Bl(o,s,i);l.name=o,l.kind=i.kind,l.canonical=s,l.source="augmentation",l.validate=i.validate??l.validate,l.aliases.add(o),l.aliases.add(s);for(let c of i.aliases??[])l.aliases.add(c);for(let c of i.compatibleWith??[])l.compatibleWith.add(c);t.set(s,l),n.set(o,s),n.set(s,s);for(let c of i.aliases??[])n.set(c,s)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(o=>n.get(o)??Vn(o))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,o])=>[r,El(o)])),namesToCanonical:n}}function ce(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Vn(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Ht(e,t){return ce(e,t)?.canonical}function bt(e,t,n){let r=ce(e,t),o=ce(e,n);return!r||!o?!1:r.kind==="any"||o.kind==="any"||r.canonical===o.canonical?!0:r.compatibleWith.includes(o.canonical)||o.compatibleWith.includes(r.canonical)}var Io=[{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:[]}],Do={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 Co=[{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:[]}],Bo={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 Eo=[{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:[]}],Po={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 No=["4.6.2","4.8.2","4.9.0"],qn="4.9.0",ht={"4.6.2":{models:Io,genericSubTreeModel:Do},"4.8.2":{models:Co,genericSubTreeModel:Bo},"4.9.0":{models:Eo,genericSubTreeModel:Po}};var wo=No.map(e=>`btcpp-v${e}`),St=["btcpp-v4",...wo],Mo=`btcpp-v${qn}`;function Ao(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 Pl(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Ao)}))}function _o(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Ao)}}function Nl(){let e={};for(let[t,n]of Object.entries(ht))e[`btcpp-v${t}`]=Pl(n.models);return e}function wl(){let e={};for(let[t,n]of Object.entries(ht))e[`btcpp-v${t}`]=_o(n.genericSubTreeModel);return e}var Ml=Nl(),Al=wl();function _l(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(ht,t)}function Lo(e){return e==="btcpp-v4"?Mo:e}function Ll(e){return e==="btcpp-v4"?qn:e.replace(/^btcpp-v/,"")}function jo(e){if(e&&e!=="btcpp-v4"&&!_l(e))throw new Error(`unsupported builtin model set: ${e}`)}function $n(e="btcpp-v4"){jo(e);let t=Lo(e);return Ml[t].map(r=>Fo(r))}function Xn(e="btcpp-v4"){jo(e);let t=Al[Lo(e)]??_o(ht[Ll(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Fo(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 vt(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 o=t.direction.localeCompare(n.direction);if(o!==0)return o;let i=(t.type??"").localeCompare(n.type??"");if(i!==0)return i;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function Yt(e,t){let n=vt(e),r=vt(t);return JSON.stringify(n)===JSON.stringify(r)}function zn(e,t){if(Yt(e,t))return"none";let n=vt(e),r=vt(t);if(n.kind!==r.kind)return"kind";if(n.ports.length!==r.ports.length)return"ports";let o=new Map(r.ports.map(a=>[a.name,a])),i=!1,s=!1;for(let a of n.ports){let l=o.get(a.name);if(!l){s=!0;continue}(a.direction!==l.direction||a.type!==l.type||a.required!==l.required)&&(s=!0);let c=a.enum?JSON.stringify(a.enum):"",u=l.enum?JSON.stringify(l.enum):"";c!==u&&(s=!0),a.description!==l.description&&(s=!0),a.defaultValue!==l.defaultValue&&(i=!0)}return s?"ports":i?"port-default":"mixed"}import{findNodeAtLocation as ql,parse as $l,parseTree as Xl}from"jsonc-parser";import{z as N}from"zod";var Oo=N.discriminatedUnion("kind",[N.object({kind:N.literal("pattern"),pattern:N.string()}).strict(),N.object({kind:N.literal("enum"),values:N.array(N.string())}).strict(),N.object({kind:N.literal("tuple"),separator:N.string(),items:N.array(N.string())}).strict(),N.object({kind:N.literal("json-schema"),schema:N.unknown()}).strict()]),jl=N.object({kind:N.enum(["primitive","opaque","any"]),canonical:N.string().optional(),aliases:N.array(N.string()).optional(),compatibleWith:N.array(N.string()).optional(),validate:Oo.optional()}).strict(),Fl=N.object({from:N.string().optional(),to:N.string()}).strict(),Ol=N.object({typeRefinement:Fl.optional(),validate:Oo.optional(),required:N.boolean().optional(),enum:N.array(N.string()).optional(),description:N.string().optional()}).strict(),Ul=N.object({ports:N.record(N.string(),Ol).optional()}).strict(),Vl=N.object({enums:N.record(N.string(),N.number().finite()).optional()}).strict(),Uo=N.object({version:N.literal(1),types:N.record(N.string(),jl).optional(),augment:N.record(N.string(),Ul).optional(),script:Vl.optional()}).strict();function zl(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
5
+ `&&t.push(n+1);return n=>{let r=0,o=t.length-1;for(;r<=o;){let s=Math.floor((r+o)/2);t[s]<=n?r=s+1:o=s-1}let i=Math.max(0,r-1);return{line:i,character:n-t[i],offset:n}}}function Wl(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function Vo(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function Gl(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...Vo(e.path),t]}return Vo(e.path)}function Kl(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;return{message:`Unrecognized key: "${t??""}"`,path:[...e.path,t].filter(n=>n!==void 0).join(".")}}return{message:e.message,path:e.path.length>0?e.path.join("."):void 0}}function Wn(e,t){let n=t?.uri??"",r=[],o=Xl(e,r,{allowTrailingComma:!0,disallowComments:!1});try{let i=$l(e,r,{allowTrailingComma:!0,disallowComments:!1});if(r.length>0||!o)throw new Error(`JSON parse error at offset ${r[0]?.offset??0}`);let s=Uo.safeParse(i);if(!s.success){let a=zl(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let c=Gl(l),{message:u,path:d}=Kl(l);return{kind:"schema",message:u,path:d,range:Wl(ql(o,c),a),notes:d?[d]:void 0}})}}return{ok:!0,data:{...s.data,uri:n,path:t?.path},issues:[],uri:n,path:t?.path}}catch(i){return{ok:!1,uri:n,path:t?.path,issues:[{kind:"json",message:"the file could not be parsed as JSON",notes:[String(i.message||i)]}]}}}import{z as W}from"zod";var qo=W.object({direction:W.enum(["input","output","inout"]).optional(),type:W.string().optional(),required:W.boolean().optional(),default:W.string().optional(),description:W.string().optional(),enum:W.array(W.string()).optional()}).strict(),Jt=W.object({kind:W.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:W.record(W.string(),qo).optional(),description:W.string().optional()}).strict(),Gn=W.object({nodes:W.record(W.string(),Jt)}).strict();import{z as I}from"zod";var $o=I.enum(["off","info","warn","error"]),Xo=I.union([$o,I.tuple([$o,I.record(I.string(),I.unknown())])]),Hl=I.object({include:I.array(I.string()).optional(),ignore:I.array(I.string()).optional(),useGitignore:I.boolean().optional(),followSymlinks:I.boolean().optional(),maxSize:I.number().int().positive().optional()}).strict(),Yl=I.string(),Jl=I.object({name:I.string(),attribute:I.string(),base:I.enum(["file","project-root"]).optional()}).strict(),Zl=I.object({elements:I.array(Jl).optional(),variables:I.record(I.string(),I.string()).optional(),allowOutsideRoot:I.boolean().optional(),maxDepth:I.number().int().min(1).optional(),maxFiles:I.number().int().min(1).optional()}).strict(),Ql=I.object({entrypoints:I.array(Yl).optional(),includes:Zl.optional(),behaviorTreeIds:I.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),ec=I.object({builtins:I.array(I.enum(St)).optional(),files:I.array(I.string()).optional(),augmentations:I.array(I.string()).optional(),definitions:I.array(I.string()).optional(),inline:I.record(I.string(),Jt).optional()}).strict(),zo=I.object({inline:I.enum(["allow","deny"]).optional()}).strict(),tc=I.object({enabled:I.boolean().optional(),rules:I.record(I.string(),Xo).optional(),baseline:I.string().optional(),suppressions:zo.optional()}).strict(),nc=I.object({rules:I.record(I.string(),Xo).optional(),suppressions:zo.optional()}).strict(),Wo=I.object({indentWidth:I.number().int().min(1).max(8).optional(),xmlDeclaration:I.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:I.boolean().optional(),lineEnding:I.enum(["lf","crlf","auto"]).optional()}).strict(),rc=I.object({files:I.array(I.string()),linter:nc.optional(),formatter:Wo.optional()}).strict(),Go=I.object({$schema:I.string().optional(),strict:I.boolean().optional(),files:Hl.optional(),resolver:Ql.optional(),models:ec.optional(),linter:tc.optional(),formatter:Wo.optional(),overrides:I.array(rc).optional()}).strict();function Yo(e){return e.flatMap(oc)}function oc(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=Ko([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=Ko(e.path);return Jo(e)?[{code:"CFG003_INVALID_CONFIG_VALUE",severity:"error",path:n,message:n?`invalid config value at \`${n}\``:"invalid config value"}]:[{code:"CFG001_INVALID_CONFIG",severity:"error",path:n,message:n?`invalid config at \`${n}\``:"invalid config"}]}function Ko(e){return e.map(String).join(".")||void 0}function Jo(e){let t=String(e.code);if(t==="invalid_value"||t==="invalid_enum_value"||t==="invalid_literal")return!0;if(t!=="invalid_union")return!1;let n=e.errors;if(Array.isArray(n))return n.flat().some(Ho);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(Ho):!1}function Ho(e){return typeof e=="object"&&e!==null&&Jo(e)}function Rt(e){let t=Go.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:Yo(t.error.issues)}}function ic(e){if(!e)return;let t={};return e.indentWidth!==void 0&&(t.indentWidth=e.indentWidth),e.xmlDeclaration!==void 0&&(t.xmlDeclaration=e.xmlDeclaration),e.blankLineBetweenBehaviorTrees!==void 0&&(t.blankLineBetweenBehaviorTrees=e.blankLineBetweenBehaviorTrees),e.lineEnding!==void 0&&(t.lineEnding=e.lineEnding),t}function sc(e){if(!e)return;let t={};return e.rules!==void 0&&(t.rules=e.rules),e.suppressions!==void 0&&(t.suppressions={},e.suppressions.inline!==void 0&&(t.suppressions.inline=e.suppressions.inline)),t}function ac(e){return e.map(t=>w(t.code,t.severity==="error"?b.Error:b.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function lc(e){let t=[],n=Qe(),{$schema:r,strict:o,overrides:i,...s}=e;o&&(n=pt(n,fo)),n=pt(n,s),n.overrides=(i??[]).map(l=>({files:l.files,linter:sc(l.linter),formatter:ic(l.formatter)}));let a=!t.some(l=>l.severity===b.Error);return{config:n,diagnostics:t,ok:a}}function kt(e){let t=Rt(e);return t.ok?lc(t.value):{ok:!1,config:Qe(),diagnostics:ac(t.diagnostics)}}function cc(e){let t="",n=0;for(;n<e.length;)e.slice(n,n+3)==="/**"&&(n+3===e.length||e[n+3]==="/")?n+3===e.length?(t+="(?:/.*)?",n+=3):(t+="(?:/.*)?/",n+=4):n===0&&e.slice(n,n+3)==="**/"?(t+="(?:.*/)?",n+=3):e.slice(n,n+2)==="**"?(t+=".*",n+=2):e[n]==="*"?(t+="[^/]*",n+=1):e[n]==="?"?(t+="[^/]",n+=1):(t+=e[n].replace(/[.+^${}()|[\]\\]/g,"\\$&"),n+=1);return new RegExp(`^${t}$`)}function Zt(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),o=r?t.slice(1):t,s=cc(o).test(n);return r?!s:s}function Zo(e,t){return e.overrides.filter(n=>n.files.some(r=>Zt(t,r)))}function Tt(e){return e.replaceAll("\\","/")}function uc(e){try{return decodeURIComponent(e)}catch{return e}}function xt(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=uc(t.pathname);return/^\/[A-Za-z]:/.test(n)?Tt(n.slice(1)):t.host?Tt(`//${t.host}${n}`):Tt(n)}function Qt(e,t){let n=Tt(t);return e.files.ignore.some(r=>Zt(n,r))?!1:e.files.include.some(r=>Zt(n,r))}function Kn(e,t){return Qt(e,xt(t))}function ee(e,t){let n=Tt(t),r=Zo(e,n),o=e;for(let i of r)o=pt(o,{linter:i.linter,formatter:i.formatter});return{files:o.files,resolver:o.resolver,models:o.models,linter:o.linter,formatter:o.formatter}}function Hn(e,t){return ee(e,xt(t))}import{z as en}from"zod";var S={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidGlobalBlackboardIdentifier:"BT411_INVALID_GLOBAL_BLACKBOARD_IDENTIFIER",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},Yn=Object.values(S).sort();var dc=en.object({subTreePorts:en.enum(["loose","strict"]).optional()}).strict(),pc=en.object({allowStringEntryCompatibility:en.boolean().optional()}).strict(),ue={"script/valid-syntax":{code:S.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:S.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:S.AssignmentToUnknownVariable,codes:[S.AssignmentToUnknownVariable,S.InvalidCompoundAssignment,S.ScriptVariableTypeMismatch,S.InvalidGlobalBlackboardIdentifier],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:S.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:S.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:S.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:S.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:S.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:S.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:S.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:S.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:S.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:S.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:S.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:S.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:S.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:S.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:S.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:S.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:S.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:S.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:S.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:S.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:S.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:S.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:S.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:S.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:S.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:S.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:S.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:S.UnknownPort,defaultSeverity:"warn",optionsSchema:dc,options:[{name:"subTreePorts",type:'"loose" | "strict"',default:"loose",description:"Controls whether SubTree remap attributes are checked strictly."}],description:"Reports ports that are not declared by the resolved node model."},"model/valid-port-value":{code:S.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:S.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:pc,options:[{name:"allowStringEntryCompatibility",type:"boolean",default:"true",description:"Treat std::string blackboard entries as runtime-compatible with other port types, matching BT.CPP's existing-entry special case."}],description:"Blackboard entries must not mix incompatible resolved port types."},"model/valid-port-default-value":{code:S.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:S.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:S.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:S.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:S.InvalidChildCount,defaultSeverity:"warn",description:"Child count must match the expected count for the node kind (Action/Condition: 0, Decorator: 1, Control: >=1, special builtins: fixed range)."},"model/no-conflicting-definition":{code:S.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:S.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:S.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};function oe(e){let t=e.linter.rules["model/no-unknown-port"];return Array.isArray(t)&&t.length>=2&&t[1].subTreePorts==="strict"?{unknownSubTreePorts:"reject"}:{unknownSubTreePorts:"allow"}}function Jn(e){return e in ue}function ke(e){if(typeof e=="string")return Kt.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&Kt.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let r={severity:t};return n!==void 0&&(r.options=n),r}}return null}function It(e,t){let n=e[t];if(n!==void 0){let r=ke(n);if(r)return r.severity}return ue[t].defaultSeverity}function Zn(e,t){let n=[],o=ue[e].optionsSchema;if(!o)return n;let i=o.safeParse(t);if(i.success)return n;for(let s of i.error.issues)n.push(...mc(e,s));return n}function mc(e,t){if(t.code==="unrecognized_keys")return t.keys.map(r=>w("CFG011_INVALID_RULE_OPTION",b.Error,`unknown option \`${String(r)}\` for rule \`${e}\``,void 0,void 0,{help:Qo(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[w("CFG011_INVALID_RULE_OPTION",b.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:Qo(e)})]}function Qo(e){let n=ue[e].options?.map(r=>r.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function Qn(e){let t=[];ei(e.linter,"linter.rules",t);for(let[n,r]of(e.overrides??[]).entries())ei(r.linter,`overrides.${n}.linter.rules`,t);return t}function ei(e,t,n){for(let[r,o]of Object.entries(e?.rules??{})){let i=`${t}.${r}`;if(!Jn(r)){n.push({code:"CFG010_UNKNOWN_RULE",severity:"error",path:i,message:`unknown lint rule \`${r}\``,help:"see docs/rules.md for a list of valid rule names"});continue}let s=ke(o);if(s?.options)for(let a of Zn(r,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:fc(i,s.options,a.message),message:a.message,help:a.details?.help})}}function fc(e,t,n){let r=Object.keys(t).find(o=>n.includes(`\`${o}\``));return r?`${e}.1.${r}`:`${e}.1`}function ti(e,t){if(t)return Ht(e,t)}function ni(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function ri(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return w(e.code,b.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function gc(e,t,n,r,o){let i=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:i,typeSource:n.typeSource??ni(n),validate:r.validate??n.validate,required:r.required??n.required,enum:r.enum?[...r.enum]:n.enum,description:r.description??n.description},l=r.typeRefinement;if(!l)return{...a,type:a.effectiveType};let c=ti(e,l.from),u=ti(e,i);return c&&c!==u?(o.push(ri({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${i??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:i,actualFrom:l.from,to:l.to},notes:i||l.from?[`base type: ${i??"(unspecified)"}`,`requested from: ${l.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function yc(e,t,n,r){let o=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of Object.entries(n.ports??{})){let a=o.get(i);if(!a){r.push(ri({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${i}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:i}}));continue}o.set(i,gc(e,t,a,s,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function bc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??ni(e)}}function oi(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,s])=>[i,{...s,ports:s.ports.map(bc)}]));for(let i of n)for(let[s,a]of Object.entries(i.augment??{})){let l=o.get(s);if(!l){r.push(w("BT117_AUGMENT_TARGET_NOT_FOUND",b.Error,`augmentation target node \`${s}\` not found`,void 0,i.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:i.path?[`augmentation file: ${i.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:i.path}));continue}o.set(s,yc(t,l,a,r))}return{modelsById:o,diagnostics:r}}function ai(e){return Dt("builtin",0,!1,e)}function li(e){return Dt("xml-tree-nodes-model",10,!0,e)}function ci(e){return Dt("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function ui(e){return Dt("node-definition-file",20,!0,e)}function di(e){return Dt("config-inline",30,!0,e)}function Dt(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>pi(o,e,n&&o.editable!==!1))}}function hc(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function pi(e,t,n){let r=hc(t);return{...e,source:r,sourceMeta:e.sourceMeta??{sourceKind:r,file:e.uri,range:e.range},editable:n,ports:e.ports.map(o=>({...o,source:r}))}}function rt(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 ii(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 Sc(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(i=>[i.name,i])),o=new Map(t.ports.map(i=>[i.name,i]));for(let[i,s]of r)o.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:ii(s)});for(let[i,s]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:ii(s)});for(let[i,s]of r){let a=o.get(i);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:i,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:i,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:i,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:i,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",c=a.enum?JSON.stringify([...a.enum].sort()):"";l!==c&&n.push({kind:"port-enum",portName:i,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:i,left:s.description,right:a.description})}return n}function si(e,t){let n=new Map;for(let r of e){let o=n.get(r.id);if(!o){n.set(r.id,r);continue}if(Yt(o,r))continue;let i=zn(o,r),s=Sc(o,r),a;if(i==="port-default"){let l=new Map(o.ports.map(p=>[p.name,p])),c=r.ports.find(p=>{let m=l.get(p.name);return m&&m.defaultValue!==p.defaultValue}),u=c?.name??"unknown",d=[rt(o,0),rt(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:u,sources:[{source:rt(o,0),value:l.get(u)?.defaultValue},{source:rt(r,1),value:c?.defaultValue}]},t.push({id:r.id,definitions:[o,r],sources:d,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${u}\` 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:a,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}else{let l=[rt(o,0),rt(r,1)];a={kind:"node-model-conflict",nodeId:r.id,sources:l,differences:s},t.push({id:r.id,definitions:[o,r],sources:l,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:a,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}}return n}function vc(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 mi(e){let t=[],n=new Map,r=new Map,o=[...e].sort((a,l)=>a.precedence-l.precedence),i=new Map,s=new Map;for(let a of o){let l=i.get(a.precedence)??[],c=a.models.map(u=>pi(u,a.kind,a.editable&&u.editable!==!1));l.push(...c),i.set(a.precedence,l);for(let u of c)s.set(u.id,a.precedence)}for(let[a,l]of[...i.entries()].sort((c,u)=>c[0]-u[0])){let c=l.filter(m=>s.get(m.id)===a),u=l.filter(m=>s.get(m.id)!==a),d=si(u,[]);for(let[m,g]of si(c,t))d.set(m,g);let p=new Set(l.map(m=>m.id));for(let m of p)s.get(m)===a&&n.set(m,l.filter(g=>g.id===m));for(let[m,g]of d)r.set(m,vc(r.get(m),g))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Rc(e){return St.includes(e)}function kc(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:nt(),augmentations:[]}}function Tc(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function xc(e,t,n){for(let r of new Set(n))if(Rc(r)){for(let o of $n(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...Xn(r))}}function Ic(e,t,n,r,o){for(let i of o){let s=Fn(i,{uri:i.uri,path:i.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(i.uri,a);for(let l of a.behaviorTrees)Tc(e.behaviorTreesById,l.id,l);i.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Dc(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 Cc(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=Dc(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function Bc(e,t,n,r,o){e.modelLayers.push(ai(t),li(n),ci(r)),o.models?.length&&e.modelLayers.push(ui([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Fe(e,t){return Ec(e,t)}function Ec(e,t){let n=kc(),r=[],o=[],i=[],s=[];xc(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=nt(t.augmentations??[]),Ic(n,r,i,s,e),Cc(n),Bc(n,o,i,s,t);let a=t.config.models.inline;if(a){let u=[];for(let[d,p]of Object.entries(a))u.push(ft(d,p));n.modelLayers.push(di(u))}let l=mi(n.modelLayers),c=oi(l.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=l.nodeModelsById,n.mergedNodeModelsById=c.modelsById,n.modelConflicts=l.conflicts,r.push(...c.diagnostics),{ok:r.every(u=>u.severity!==b.Error),index:n,diagnostics:r}}var fi={unknownSubTreePorts:"allow"};function gi(e){return{...fi,...e}}var Pc=["Action","Condition","Control","Decorator"],Nc=new Set(Pc);var wc=new Set(["input_port","output_port","inout_port"]);function Ct(e){return Nc.has(e)}function Oe(e){return Ct(e)?e:void 0}function tn(e,t){return e.attributes.find(n=>n.name===t)?.value}function er(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&er(n,t))return!0;return!1}function yi(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return er(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&er(n,t))return!0;return!1}function nn(e){return wc.has(e.name)}function bi(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":Ct(e.name)?"generic-node":nn(e)?"unknown-xml":"concrete-node"}function rn(e){if(e.name==="SubTree")return tn(e,"ID")||"SubTree";if(Ct(e.name))return tn(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||nn(e)))return e.name}function te(e){return e.typeRegistry}function Z(e,t){return ce(te(e),t)}function De(e,t,n){return bt(te(e),t,n)}function Bt(e,t){return e.documents.get(t)}function Y(e,t){return e.behaviorTreesById.get(t)??[]}function tr(e,t){return e.behaviorTreesById.has(t)}function nr(e){return[...e.behaviorTreesById.values()].flat()}function rr(e,t){return hi(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function Ce(e){return[...e.behaviorTreesById.keys()]}function hi(e){return[...e.documents.values()]}function ie(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function Ue(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function on(e){return[...e.mergedNodeModelsById.values()]}function or(e){return e.modelLayers.flatMap(t=>t.models)}function Et(e){return[...e.mergedNodeModelsById.values()]}function ir(e){return[...e.nodeModelsById.keys()]}function sr(e){return[...e.genericSubTreePorts]}function Pt(e){return[...e.augmentations]}function Nt(e){return e.modelConflicts}function wt(e,t){let{id:n,fileLocalUri:r,config:o}=t,i=Y(e,n);if(i.length>0){if((o?.resolver?.behaviorTreeIds==="file-local-first"||o?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let c=i.filter(u=>u.uri===r);c.length>0&&(i=c)}let a=ie(e,n),l=a?.kind==="SubTree"?[a]:[];return i.length===1?{status:"resolved",kind:"behavior-tree",treeId:i[0].id,behaviorTree:i[0]}:{status:"ambiguous",candidates:[...i.map(c=>c.id),...l.map(c=>c.id)],behaviorTrees:i,definitions:l}}let s=ie(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function ar(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=ie(e,t);if(n){let o=Nt(e).find(i=>i.id===t&&i.code==="BT012_CONFLICTING_NODE_MODEL");return o?{status:"ambiguous",nodeType:t,candidates:o.definitions}:{status:"resolved",model:n}}let r=Ue(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 lr(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function cr(e){let t=sr(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return lr([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function ur(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}:On(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 O(e,t){let n=gi(t.policy),r=t.element,o=bi(r),i=yi(t.documentRoot,r);if((t.isModelDefinition||i&&(o==="generic-node"||o==="subtree"))&&(o="model-definition"),i&&nn(r)&&(o="unknown-xml"),o==="root"||o==="behavior-tree"||o==="tree-nodes-model"||o==="include"||o==="model-definition"||o==="unknown-xml")return{element:r,tagName:r.name,tagForm:o,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=rn(r);if(o!=="subtree"){let m=ar(e,s),g=cr({index:e,tagForm:o,model:m}),f=r.attributes.map(x=>ur({attribute:x,ports:g,allowsArbitraryAttributes:!1,model:m}));return{element:r,tagName:r.name,tagForm:o,nodeType:s,model:m,ports:g,allowsArbitraryAttributes:!1,portUsages:f}}let a=tn(r,"ID"),l=a?wt(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},c={status:"unresolved",nodeType:a},u=!1;if(l.status==="resolved"&&l.kind==="node-model")c={status:"resolved",model:l.model};else if(l.status==="resolved"&&l.kind==="behavior-tree"){let m=ar(e,l.treeId);m.status==="resolved"&&m.model.kind==="SubTree"?c=m:u=n.unknownSubTreePorts==="allow"}else l.status==="ambiguous"&&l.definitions.length>0?c=l.definitions.length===1?{status:"resolved",model:l.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:l.definitions}:u=n.unknownSubTreePorts==="allow";let d=cr({index:e,tagForm:o,model:c,subtreeModelPorts:l.status==="ambiguous"?lr(l.definitions.flatMap(m=>m.ports)):void 0}),p=r.attributes.map(m=>ur({attribute:m,ports:d,allowsArbitraryAttributes:u,model:c,unknownModelPortStatus:!u&&c.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:o,nodeType:s,model:c,subtree:{id:a,target:l},ports:d,allowsArbitraryAttributes:u,portUsages:p}}function ge(e,t){return O(e,t).portUsages.find(r=>r.name===t.attributeName)}function _c(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Lc(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Si(e,t){let n=e.line,r=e.character,o=e.offset;for(let i of t){if(o+=i.length,i===`
6
+ `){n+=1,r=0;continue}r+=i.length}return{line:n,character:r,offset:o}}function dr(e,t,n){let r=Si(e,t),o=Si(r,n);return{start:r,end:o}}function Ri(e,t,n){let r=n.valueContentRange||n.valueRange,o=e.originalText.slice(r.start.offset,r.end.offset),i=[];for(let s of o.matchAll(/\{[^}]*\}/g)){let a=s[0],l=s.index??0,c=X({portName:t,rawValue:a});if(c.ok){i.push({raw:a,key:c.reference.key,scope:c.reference.scope,identity:z(c.reference),range:dr(r.start,o.slice(0,l),a),syntax:c.reference.syntax==="shorthand"?"shorthand":"braced"});continue}i.push({raw:a,key:a,scope:"local",identity:`invalid:${a}`,range:dr(r.start,o.slice(0,l),a),syntax:"invalid"})}if(i.length===0){let s=X({portName:t,rawValue:o});if(s.ok){let a=Math.max(0,o.indexOf(s.reference.raw));return i.push({raw:s.reference.raw,key:s.reference.key,scope:s.reference.scope,identity:z(s.reference),range:dr(r.start,o.slice(0,a),s.reference.raw),syntax:s.reference.syntax==="shorthand"?"shorthand":"braced"}),i}}return i.length===0&&(o.includes("{")||o.includes("}"))&&i.push({raw:o,key:o,scope:"local",identity:`invalid:${o}`,range:r,syntax:"invalid"}),i}function jc(e,t){return _c(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function ki(e){let t=[];for(let n of e)t.push(n),t.push(...ki(n.children));return t}function Fc(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function Oc(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function Uc(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function Ti(e){return Be(e,"name")?.value}function Vc(e){return Ti(e)||Be(e,"ID")?.value||e.name}function qc(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${Vc(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function xi(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 Ii(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 $c(e){return e.status==="resolved"?e.port.direction:"unknown"}function Xc(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 vi(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:$c(t.usage),valueKind:Xc(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 zc(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 Be(e,t){return e.attributes.find(n=>n.name===t)}function Wc(e){return e.root?Be(e.root,"main_tree_to_execute")?.value:void 0}function Gc(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let o of r.children)o.kind==="element"&&n(o)};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 G(e,t){let n=t.semantic,r=Gc(e.root),o=Lc(e).map(l=>({id:Be(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),i=[],s=[],a=(l,c,u,d)=>{let p=O(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(l)}),m=xi(p),g={element:l,path:d,tagName:l.name,kind:jc(l,p),model:m,usage:p,portBindings:[],children:[],parent:u,behaviorTree:c};if(g.portBindings=p.portUsages.filter(f=>f.status!=="reserved-attribute").map(f=>({name:f.name,value:f.value,attribute:f.attribute,declaredPort:Ii(f),usage:f,blackboardReferences:Ri(e,f.name,f.attribute)})),g.children=l.children.filter(f=>f.kind==="element").map((f,x)=>a(f,c,g,[...d,x])),l.name==="SubTree"){let f=Be(l,"ID")?.value;i.push({node:g,id:f,target:p.subtree?.target??{status:"unresolved",id:f},portRemaps:g.portBindings})}return g};for(let l of o){let c=l.element.children.filter(u=>u.kind==="element").map((u,d)=>a(u,l,void 0,[d]));l.rootNode=c[0],l.nodes=ki(c),s.push(...l.nodes)}return{document:e,behaviorTrees:o,subtreeCalls:i,nodes:s}}function sn(e,t,n){let r=G(e,{semantic:t,config:n?.config,policy:n?.policy}),o=Oc(r.behaviorTrees),i=r.nodes.map(c=>{let u=o(c),d=c.usage,p=d.nodeType??c.tagName,m=Ti(c.element),g=Be(c.element,"ID")?.value,f=qc(c);return{nodeId:u,path:c.path,instancePath:f,tagName:c.tagName,nodeType:p,name:m,idAttr:g,kind:c.kind,range:c.element.range,fullRange:c.element.fullRange,nameRange:c.element.nameRange,parentNodeId:c.parent?o(c.parent):void 0,childNodeIds:c.children.map(o),behaviorTreeId:c.behaviorTree.id,attributes:c.element.attributes.map(Uc),identityCandidates:zc({name:m,idAttr:g,nodeType:p,tagName:c.tagName,instancePath:f,behaviorTreeId:c.behaviorTree.id,nodeId:u}),model:xi(d),usage:d,portBindings:d.portUsages.filter(x=>x.status!=="reserved-attribute").map(x=>vi(u,{name:x.name,value:x.value,attribute:x.attribute,declaredPort:Ii(x),usage:x,blackboardReferences:Ri(e,x.name,x.attribute)}))}}),s=r.behaviorTrees.map(c=>({id:c.id,range:c.element.range,idRange:Be(c.element,"ID")?.valueContentRange,rootNodeId:c.rootNode?o(c.rootNode):void 0,nodeIds:c.nodes.map(o)})),a=r.subtreeCalls.map(c=>({nodeId:o(c.node),callId:c.id,range:c.node.element.range,target:c.target,portBindings:c.portRemaps.map(u=>vi(o(c.node),u))})),l=e.root?Be(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:Fc(e),mainTreeToExecute:Wc(e),mainTreeToExecuteRange:l?.valueContentRange||l?.valueRange,behaviorTrees:s,nodes:i,subtreeCalls:a}}function Kc(e,t){let n=e.element.fullRange||e.element.range;return H(n,t)}function Hc(e,t){let n=e.element.fullRange||e.element.range,r=t.element.fullRange||t.element.range;return n.end.offset-n.start.offset<r.end.offset-r.start.offset}function an(e,t){let n;for(let r of e.nodes)Kc(r,t.offset)&&(!n||Hc(r,n))&&(n=r);return n}function ot(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(H(r.attribute.range,t.offset))return r}function Yc(e,t){return H(e.fullRange||e.range,t)}function Jc(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 ln(e,t){let n;for(let r of e.nodes)Yc(r,t.offset)&&(!n||Jc(r,n))&&(n=r);return n}function cn(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(H(r.range,t.offset))return r}function Di(e){let{document:t,diagnostics:n,options:r,partial:o}=e,i=n.some(a=>a.severity===b.Error),s="generic-xml";if(i)s="invalid-xml";else if(t.root){let a=t.root,l=a.children.some(p=>p.kind==="element"&&p.name==="BehaviorTree"),c=a.children.some(p=>p.kind==="element"&&p.name==="TreeNodesModel"),u=a.attributes.some(p=>p.name==="BTCPP_format"&&p.value==="4"),d=a.name==="TreeNodesModel"||a.name==="root"&&!l&&c;r.kind==="model-xml"||d?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(u||l)||r.kind==="bt-xml")&&(s="bt-document")}return t.kind=s,t.isBtXml=s==="bt-document"||s==="model-document",!i&&!o?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:o}}function su(e){if(e.name==="input_port"||e.name==="output_port")return!1;let t=e.children||[],n=t.some(o=>o.kind==="text"&&o.text.trim()!==""),r=t.some(o=>o.kind==="element");return n&&r}function pr(e,t){if(e.kind==="element"){su(e)&&t(e);for(let n of e.children||[])pr(n,t)}}function q(e,t){let n=0,r=0;for(let o=0;o<Math.min(t,e.length);o++)e[o]===`
7
+ `?(n++,r=0):r++;return et(n,r,t)}function mr(e,t,n,r){for(let o=0;o<e.length;o++){if(e[o]!=="&")continue;let i=e.slice(o+1),s=o;if(i.startsWith("amp;")){o+=4;continue}if(i.startsWith("lt;")){o+=3;continue}if(i.startsWith("gt;")){o+=3;continue}if(i.startsWith("quot;")){o+=5;continue}if(i.startsWith("apos;")){o+=5;continue}if(i.startsWith("#")){let d=1;if(i[d]==="x"||i[d]==="X"){d++;let x="";for(;d<i.length&&/[0-9a-fA-F]/.test(i[d]);)x+=i[d],d++;if(d<i.length&&i[d]===";"){d++;let y=e.slice(s,s+1+d),h=q(n,t+s),R=q(n,t+s+y.length);if(x){let T=Number.parseInt(x,16);if(T>0&&T<=1114111&&(T<55296||T>57343)){o+=d-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",b.Error,`invalid numeric XML entity \`${y}\``,h,R,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=d-1;continue}r("XML001_INVALID_SYNTAX",b.Error,`malformed numeric XML entity \`${y}\``,h,R,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let B=e.slice(s,s+1+d),k=q(n,t+s),E=q(n,t+s+B.length);r("XML001_INVALID_SYNTAX",b.Error,`malformed numeric XML entity \`${B}\``,k,E,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let p="";for(;d<i.length&&/[0-9]/.test(i[d]);)p+=i[d],d++;if(d<i.length&&i[d]===";"){d++;let x=e.slice(s,s+1+d),B=q(n,t+s),k=q(n,t+s+x.length);if(p){let E=Number.parseInt(p,10);if(E>0&&E<=1114111&&(E<55296||E>57343)){o+=d-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",b.Error,`invalid numeric XML entity \`${x}\``,B,k,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=d-1;continue}r("XML001_INVALID_SYNTAX",b.Error,`malformed numeric XML entity \`${x}\``,B,k,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let m=e.slice(s,s+1+d),g=q(n,t+s),f=q(n,t+s+m.length);r("XML001_INVALID_SYNTAX",b.Error,`malformed numeric XML entity \`${m}\``,g,f,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=d-1;continue}let a=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(a){let d=`&${a[0]}`,p=q(n,t+s),m=q(n,t+s+d.length);r("XML013_UNKNOWN_ENTITY",b.Error,`unknown XML entity \`${d}\``,p,m,{primaryLabel:"this entity is not one of XML's predefined entities",help:"use one of `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&apos;`, or a valid numeric entity"}),o+=d.length-1;continue}let l=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let d=`&${l[0]}`,p=q(n,t+s),m=q(n,t+s+d.length);r("XML001_INVALID_SYNTAX",b.Error,"bare ampersand in XML content",p,m,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"}),o+=d.length-1;continue}let c=q(n,t+s),u=q(n,t+s+1);r("XML001_INVALID_SYNTAX",b.Error,"bare ampersand in XML content",c,u,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"})}}function Mt(e){return e.replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let r=Number.parseInt(n,16);return r<=0||r>1114111||r>=55296&&r<=57343?t:String.fromCodePoint(r)}).replace(/&#([0-9]+);/g,(t,n)=>{let r=Number.parseInt(n,10);return r<=0||r>1114111||r>=55296&&r<=57343?t:String.fromCodePoint(r)})}function Ci(e){let t="",n=[0];for(let r=0;r<e.length;){let o=au(e,r);if(!o){t+=e[r]??"",r+=1,n.push(r);continue}t+=o.value,r=o.end,n.push(r)}return{value:t,offsets:n}}function au(e,t){let n=e.slice(t);if(n.startsWith("&quot;")||n.startsWith("&apos;")||n.startsWith("&lt;")||n.startsWith("&gt;")||n.startsWith("&amp;")){let s=n.startsWith("&quot;")?"&quot;":n.startsWith("&apos;")?"&apos;":n.startsWith("&lt;")?"&lt;":n.startsWith("&gt;")?"&gt;":"&amp;";return{value:Mt(s),end:t+s.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let s=o[0];return{value:Mt(s),end:t+s.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let s=i[0];return{value:Mt(s),end:t+s.length}}}function Bi(e){return et(e.line,e.character,e.offset)}function lu(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function cu(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function uu(e){return e===" "||e===" "||e===`
8
+ `||e==="\r"}function du(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
9
+ `&&e!=="\r"}function ye(e,t={}){let n=[],r=t.mode==="tolerant",o={uri:t.uri||"",path:t.path,kind:"generic-xml",isBtXml:!1,xmlDeclaration:void 0,root:void 0,nodes:[],diagnostics:n,originalText:e},i=0,s=0,a=0,l=[],c=!1;function u(){return et(s,a,i)}function d(){return i>=e.length}function p(v=0){return e[i+v]}function m(v=1){for(let M=0;M<v;M+=1)e[i++]===`
10
+ `?(s+=1,a=0):a+=1}function g(){for(;!d()&&uu(p());)m()}let f=(v,M,_,L,C,J)=>{n.push(w(v,M,_,D(L,C),o.uri,J))};function x(v,M,_,L,C,J){n.push(w(v,M,_,L&&C?D(L,C):void 0,o.uri,J))}function B(){if(!lu(p()))return"";let v=i;for(m();!d()&&cu(p());)m();return e.slice(v,i)}function k(){let v=p();if(v!=='"'&&v!=="'")return{value:"",ok:!1};let M=u();m();let _=u(),L=i;for(;!d()&&p()!==v&&p()!=="<";)m();let C=u();if(d()||p()!==v)return{value:e.slice(L,i),ok:!1,valueRange:D(M,C),valueContentRange:D(_,C)};let J=e.slice(L,i);m(),mr(J,_.offset,e,f);let Re=Ci(J);return{value:Re.value,valueOffsets:Re.offsets,ok:!0,valueRange:D(M,u()),valueContentRange:D(_,C)}}function E(){let v=[],M=new Set;for(;;){g();let _=p();if(!_||_===">"||_==="/"&&p(1)===">")break;let L=u(),C=B(),J=u();if(!C)break;g();let Re=u();if(p()!=="="){if(f("XML001_INVALID_SYNTAX",b.Error,"invalid attribute syntax",L,J,{primaryLabel:`expected \`=\` after attribute \`${C}\``,help:`write the attribute as \`${C}="..."\``}),c=!0,r)continue;break}m();let ol=u();g();let _n=u(),Le=k(),Ze=u();if(!Le.ok&&(f("XML005_INVALID_ATTRIBUTE_VALUE",b.Error,"invalid attribute value",_n,Ze,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${C}="value"\``}),c=!0,!r)||(M.has(C)?f("XML004_DUPLICATE_ATTRIBUTE",b.Error,`duplicate attribute \`${C}\``,L,Ze,{primaryLabel:`attribute \`${C}\` is already defined on this element`,help:`remove one of the duplicate \`${C}\` attributes`}):M.add(C),v.push({name:C,value:Le.value,...Le.valueOffsets?{valueOffsets:Le.valueOffsets}:{},range:D(L,Ze),fullRange:D(L,Ze),nameRange:D(L,J),equalsRange:D(Re,ol),valueRange:Le.valueRange||D(_n,Ze),valueContentRange:Le.valueContentRange||D(_n,Ze)}),!Le.ok&&r))break}return v}function y(v){l.length>0?l[l.length-1].children.push(v):(o.nodes.push(v),!o.root&&v.kind==="element"&&(o.root=v))}function h(){let v=u(),M=i;for(;!d()&&p()!=="<";)m();let _=e.slice(M,i);if(_.length===0)return;for(let C of _)if(du(C)){f("XML007_INVALID_CHARACTER",b.Error,"invalid XML character",v,u(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}mr(_,M,e,f);let L={kind:"text",text:Mt(_),range:D(v,u()),fullRange:D(v,u())};y(L)}function R(){let v=u();m(4);let M=u(),_=i;for(;!d()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)m();let L=e.slice(_,i);if(d()){if(f("XML001_INVALID_SYNTAX",b.Error,"unterminated XML comment",v,u(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),c=!0,!r)return;let Re={kind:"comment",text:L,range:D(v,u()),fullRange:D(v,u()),contentRange:D(M,u())};y(Re);return}(L.includes("--")||L.endsWith("-"))&&f("XML001_INVALID_SYNTAX",b.Error,"invalid XML comment",M,u(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let C=u();m(3);let J={kind:"comment",text:L,range:D(v,u()),fullRange:D(v,u()),contentRange:D(M,C)};y(J)}function T(){let v=u();m(5),g();let M=E();g(),p()==="?"&&p(1)===">"?m(2):f("XML001_INVALID_SYNTAX",b.Error,"invalid XML declaration",v,u(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let _={range:D(v,u()),attributes:M};for(let L of M)L.name==="version"&&(_.version=L.value),L.name==="encoding"&&(_.encoding=L.value),L.name==="standalone"&&(_.standalone=L.value);o.xmlDeclaration=_}function A(){let v=u();m(2),g();let M=u(),_=B(),L=u();if(g(),p()!==">")for(f("XML001_INVALID_SYNTAX",b.Error,"invalid closing tag syntax",v,u(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),c=!0;!d()&&p()!==">";)m();p()===">"&&m();let C=l.pop();if(!C||C.name!==_){let J=C?C.name:_||"",Re=_||"";f("XML006_MISSING_CLOSING_TAG",b.Error,`mismatched closing tag \`</${Re}>\``,v,u(),{primaryLabel:`opened as \`<${J}>\` but closed as \`</${Re}>\``,help:`change the closing tag to \`</${J}>\` or fix the nesting`});return}C.closeTagRange=D(v,u()),C.endTagRange=D(v,u()),C.nameRange||(C.nameRange=D(M,L)),C.range=D(C.range.start,u()),C.fullRange=D(C.range.start,u())}for(;!d();)if(p()==="<")if(p(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")T();else{let v=u();for(;!d()&&!(p()==="?"&&p(1)===">");)m();d()||m(2),f("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",b.Error,"processing instruction is not supported",v,u(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")R();else if(p(1)==="!"&&p(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let v=u();for(m(8);!d()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)m();d()||m(3),f("XML010_UNSUPPORTED_CDATA",b.Error,"CDATA is not supported",v,u(),{primaryLabel:"CDATA sections are not supported by btxml",help:"replace the CDATA section with normal escaped XML text",notes:["escape `<` as `&lt;`, `>` as `&gt;`, and `&` as `&amp;`"]})}else if(p(1)==="!"&&e.slice(i+2,i+9)==="DOCTYPE"){let v=u();for(m(8);!d()&&p()!==">";)m();d()||m(1),f("XML011_UNSUPPORTED_DOCTYPE",b.Error,"DOCTYPE is not supported",v,u(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")A();else{let v=u();m();let M=u(),_=B(),L=u();if(!_){if(f("XML001_INVALID_SYNTAX",b.Error,"invalid XML tag",v,u(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),c=!0,r){m();continue}break}let C={kind:"element",name:_,attributes:[],children:[],range:D(v,v),fullRange:D(v,v),openTagRange:D(v,v),startTagRange:D(v,v),nameRange:D(M,L),selfClosing:!1};if(C.attributes=E(),g(),p()==="/"&&p(1)===">"){m(2),C.selfClosing=!0,C.openTagRange=D(v,u()),C.startTagRange=C.openTagRange,C.range=D(v,u()),C.fullRange=D(v,u()),y(C);continue}if(p()!==">"){if(f("XML001_INVALID_SYNTAX",b.Error,"invalid XML tag",v,u(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),c=!0,r){C.openTagRange=D(v,u()),C.startTagRange=C.openTagRange,C.range=D(v,u()),C.fullRange=D(v,u()),y(C);continue}break}m(),C.openTagRange=D(v,u()),C.startTagRange=C.openTagRange,C.range=D(v,u()),C.fullRange=D(v,u()),y(C),l.push(C)}else h();if(l.length>0){let v=l[l.length-1];if(f("XML006_MISSING_CLOSING_TAG",b.Error,`missing closing tag for \`<${v.name}>\``,v.openTagRange.start,v.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${v.name}>\` before the end of the file`}),c=!0,r)for(;l.length>0;){let M=l.pop();if(!M)break;M.range=D(M.range.start,u()),M.fullRange=D(M.range.start,u())}}let j=o.nodes.filter(v=>v.kind==="element");j.length===0?x("XML002_MISSING_ROOT",b.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):j.length>1&&x("XML003_MULTIPLE_ROOTS",b.Error,"multiple root elements",void 0,void 0,{primaryLabel:"this document has more than one top-level element",help:'wrap the document content in one `<root BTCPP_format="4">...</root>` element'});let F=o.root,ve=F?.name==="BehaviorTree"||F?.name==="TreeNodesModel"||F?.name==="root"&&(F.attributes.some(v=>v.name==="BTCPP_format"&&v.value==="4")||F.children.some(v=>v.kind==="element"&&(v.name==="BehaviorTree"||v.name==="TreeNodesModel")));if(F)for(let v of o.nodes)v!==F&&v.kind==="text"&&v.text.trim().length>0&&f("XML016_TEXT_OUTSIDE_ROOT",b.Error,"text outside root element",v.range.start,v.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!o.xmlDeclaration&&!ve)x("XML008_MISSING_DECLARATION",b.Warning,"missing XML declaration",void 0,void 0,{help:'add `<?xml version="1.0" encoding="UTF-8"?>` at the top of the file',notes:["this is a warning because BehaviorTree.CPP can still parse many files without a declaration"]});else if(o.xmlDeclaration?.encoding&&o.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let v=o.xmlDeclaration.encoding;f("XML009_INVALID_ENCODING",b.Warning,"XML encoding should be UTF-8",o.xmlDeclaration.range.start,o.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${v}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return F&&pr(F,v=>{f("XML015_UNSUPPORTED_MIXED_CONTENT",b.Warning,"mixed XML content is not supported",Bi(v.range.start),Bi(v.range.end),{primaryLabel:"this element contains both text and child elements",help:"move the text into an attribute or split it into separate elements",notes:["text inside `<input_port>` and `<output_port>` remains allowed"]})}),Di({document:o,diagnostics:n,partial:c,options:t})}var At={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Ei(e){if(!e)return At;let t=typeof e.indentWidth=="number"?e.indentWidth:At.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:At.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:At.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:At.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:o}}function un(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function dn(e){return un(e).replace(/"/g,"&quot;")}function pu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function mu(e,t,n){return`${" ".repeat(e*n)}${t}`}function it(e,t,n,r){let o=" ".repeat(t*r),i=e.attributes||[];if(i.length===0)return[`${o}<${e.name}${n}`];if(i.length===1)return[`${o}<${e.name} ${i[0].name}="${dn(i[0].value)}"${n}`];let s=[`${o}<${e.name} ${i[0].name}="${dn(i[0].value)}"`],a=" ".repeat(o.length+1+e.name.length+1);for(let l=1;l<i.length;l+=1){let c=i[l],u=l===i.length-1?n:"";s.push(`${a}${c.name}="${dn(c.value)}"${u}`)}return s}function pn(e,t,n,r){let o=" ".repeat(t*n);if(e.kind==="comment")return[`${o}<!--${e.text}-->`];if(e.kind==="text"){let u=e.text.trim();return u?[mu(t,un(u),n)]:[]}let i=pu(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(u=>u.kind==="text").map(u=>u.text).join("").trim(),l=i.some(u=>u.kind==="element"||u.kind==="comment");if(a&&l&&!s&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!l){if((e.attributes||[]).length<=1){let u=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${dn(e.attributes[0].value)}"`;return[`${o}<${e.name}${u}>${un(a)}</${e.name}>`]}return it(e,t,`>${un(a)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return it(e,t,"/>".slice(0),n);let u=it(e,t,">",n);return u.push(`${o}</${e.name}>`),u}let c=it(e,t,">",n);for(let u of e.children||[])u.kind==="text"&&u.text.trim()===""||c.push(...pn(u,t+1,n,r));return c.push(`${o}</${e.name}>`),c}function fu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Pi(e,t,n,r){let o=[],i=fu(e);for(let s=0;s<i.length;s+=1){let a=i[s],l=i[s-1],c=i[s+1],u=n&&a.kind==="element"&&a.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",d=a.kind==="element"&&a.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",p=a.kind==="comment"&&c&&c.kind==="element"&&c.name==="TreeNodesModel"&&l!==void 0;(u||d||p)&&o.length>0&&o[o.length-1]!==""&&o.push(""),a.kind==="element"?(o.push(...pn(a,1,t,r)),a.name==="TreeNodesModel"&&o.push("")):o.push(...pn(a,1,t,r))}return o}function _t(e,t={}){let n=ye(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(f=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(f.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let o=n.document.root,i=Ei(t),s=i.indentWidth,a=[],l=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&l)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...it(o,0,">",s)),a.push(...Pi(o.children||[],s,i.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${o.name}>`),n.diagnostics.some(f=>f.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let c=`
10
11
  `;(i.lineEnding==="crlf"||i.lineEnding==="auto"&&e.includes(`\r
11
- `))&&(l=`\r
12
- `);let c=a.join(l),d=l.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),m=new RegExp(`(?:${d})+$`,"u"),y=`${c.replace(m,"")}${l}`;return{ok:!0,text:y,changed:y!==e,skipped:!1,diagnostics:n.diagnostics.filter(p=>p.severity!==h.Error)}}function Qe(e,t){if(!(!z(e.range,t)&&!z(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=Qe(n,t);if(r)return r}return e}}var gi=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,Xl=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function zl(e,t){let n=[],r=0;for(;r<t;){let o=e.indexOf("<",r);if(o<0||o>=t)break;if(e.startsWith("<!--",o)){let l=e.indexOf("-->",o+4);if(l<0||l+3>t)break;r=l+3;continue}if(e.startsWith("<![CDATA[",o)){let l=e.indexOf("]]>",o+9);if(l<0||l+3>t)break;r=l+3;continue}if(e.startsWith("<?",o)){let l=e.indexOf("?>",o+2);if(l<0||l+2>t)break;r=l+2;continue}if(e.startsWith("<!",o)){let l=e.indexOf(">",o+2);if(l<0||l+1>t)break;r=l+1;continue}if(e[o+1]==="/"){let c=e.slice(o+2).match(gi)?.[0];if(c){for(let m=n.length-1;m>=0;m-=1)if(n[m]===c){n.length=m;break}}let d=e.indexOf(">",o+2);if(d<0||d>=t)break;r=d+1;continue}let s=e.slice(o+1).match(/^\s*([A-Za-z_:][A-Za-z0-9_.:-]*)/)?.[1];if(!s){r=o+1;continue}let a=e.indexOf(">",o+1);if(a<0||a>=t)break;e.slice(o+1,a).trimEnd().endsWith("/")||n.push(s),r=a+1}return n.at(-1)}function on(e,t){let n=e.positionAt(t);return I(n,n)}function re(e,t,n){return I(e.positionAt(t),e.positionAt(n))}function sn(e){return{name:e.name,value:e.value,range:re(e.document,e.nameStart,e.valueEnd),fullRange:re(e.document,e.nameStart,e.valueEnd),nameRange:re(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?re(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:re(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?re(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function Wl(e,t,n){let r=[];for(let o of t.matchAll(Xl)){let i=o.index??0,s=o[1],a=o[2],u=o[3],l=o[4],c=o[0].indexOf(s),d=o[0].indexOf("=",c+s.length),m=o[0].indexOf(a,d+1),f=n+i+m,y=f+a.length;r.push(sn({document:e,name:s,value:u??l??"",nameStart:n+i+c,nameEnd:n+i+c+s.length,equalsStart:n+i+d,equalsEnd:n+i+d+1,valueStart:f,valueEnd:y,valueContentStart:f+1,valueContentEnd:y-1}))}return r}function Gl(e,t){let n=Math.max(0,t-4e3),r=e.text.slice(n,t),o=r.lastIndexOf("<"),i=r.lastIndexOf(">");if(o<0||o<i||!r.startsWith("</",o))return;let s=n+o,a=r.slice(o+2);if(!/\s/.test(a))return{kind:"closing-tag-name",tagNamePrefix:a,replacementRange:re(e,s+2,t)}}function fi(e,t){let n=Math.max(0,t-4e3),r=e.text.slice(n,t),o=r.lastIndexOf("<"),i=r.lastIndexOf(">");if(o<0||o<i)return;let s=n+o,a=s+1,u=r.slice(o+1);if(/^\s*[!?/]/.test(u))return;let l=u.match(/^\s*/)?.[0].length??0,c=u.slice(l).match(gi);if(!c)return{kind:"tag-name"};let d=c[0],m=l,f=m+d.length,y=re(e,a+m,a+f),p={kind:"element",name:d,attributes:Wl(e,u,a),children:[],range:re(e,s,t),fullRange:re(e,s,t),openTagRange:re(e,s,t),startTagRange:re(e,s,t),nameRange:y,selfClosing:!1};if(u.length<=f&&!/\s/.test(u.slice(f)))return{kind:"tag-name",element:p,replacementRange:y};let x=u.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(x){let N=x[0].indexOf(x[1]),g=(x.index??0)+N,S=g+x[1].length,R=u.indexOf("=",S),T=x[2],A=x[4]??"";if(T){let O=u.indexOf(T,R+1),v=a+O+1,_=sn({document:e,name:x[1],value:x[3]??"",nameStart:a+g,nameEnd:a+S,equalsStart:a+R,equalsEnd:a+R+1,valueStart:a+O,valueEnd:t,valueContentStart:v,valueContentEnd:t});return{kind:"attribute-value",element:p,attribute:_,valuePrefix:e.text.slice(v,t)}}let j=A.length>0?t-a-A.length:t-a;return{kind:"attribute-value",element:p,attribute:sn({document:e,name:x[1],value:A,nameStart:a+g,nameEnd:a+S,equalsStart:a+R,equalsEnd:a+R+1,valueStart:a+j,valueEnd:t,valueContentStart:a+j,valueContentEnd:t}),valuePrefix:e.text.slice(a+j,t)}}let E=u.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)?$/s);if(E){let k=E[1]??"",N=t-a-k.length;return{kind:"attribute-name",element:p,attribute:sn({document:e,name:k,value:"",nameStart:a+N,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:p,attribute:{name:"",value:"",range:on(e,t),fullRange:on(e,t),nameRange:on(e,t),valueRange:on(e,t)}}}function Q(e){let{document:t,parsed:n,position:r}=e,o=r.offset,i=t.text.length>0?{kind:"text"}:{kind:"unknown"},s=Gl(t,o);if(s)return{kind:"closing-tag-name",tagNamePrefix:s.tagNamePrefix,replacementRange:s.replacementRange,tagText:zl(t.text,o)};if(n?.root){let l=Qe(n.root,o);if(l){for(let c of l.attributes){if(z(c.nameRange,o))return{kind:"attribute-name",element:l,attribute:c};if(z(c.valueRange,o)||z(c.valueContentRange,o))return{kind:"attribute-value",element:l,attribute:c,valuePrefix:c.valueContentRange&&o>=c.valueContentRange.start.offset?t.text.slice(c.valueContentRange.start.offset,o):""}}if(z(l.nameRange||l.openTagRange,o))return{kind:"tag-name",element:l,replacementRange:l.nameRange};if(z(l.openTagRange,o)){let c=fi(t,o);if(c)return c.kind==="tag-name"?{...c,element:c.element??l}:c}i={kind:"element",element:l}}}let a=fi(t,o);if(a)return a;let u=t.text.slice(Math.max(0,o-200),o);return/<!--\s*btxml-disable-next-line\s+[A-Z0-9_]*$/.test(u)?{kind:"comment"}:i}function an(e,t){let n=e.valueOffsets;return!n||n.length===0?t:t<=0?0:t>=n.length?n[n.length-1]??0:n[t]??0}function ke(e,t,n){let r=t.valueContentRange??t.valueRange,o=an(t,n.start),i=an(t,n.end),s=V(e.originalText,r.start.offset+o),a=V(e.originalText,r.start.offset+i);return I(s,a)}function nr(e){return e.rootUri}function rr(e){return e.resolvedConfig}var yi={InvalidJson:b.InvalidAugmentationJson,InvalidSchema:b.InvalidAugmentationSchema};function Kl(e){return w(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function Hl(e,t){return t.issues.map(n=>Kl({filePath:e,code:n.kind==="json"?yi.InvalidJson:yi.InvalidSchema,message:n.kind==="json"?`invalid augmentation JSON \`${e}\``:`invalid augmentation schema \`${e}\``,range:n.range,primaryLabel:n.message,help:n.kind==="json"?`fix the JSON syntax in \`${e}\``:n.path?`fix the schema issue at \`${n.path}\``:"fix the schema issue in the file",notes:n.notes}))}async function un(e){let t=e.project,n=e.host??t.host,r=[],o=[];for(let i of t.augmentationFiles){if(!await n.exists(i.uri)){r.push(w(b.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${i.path}\``,void 0,i.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(i.uri),a=_n(s,{uri:i.uri,path:i.path});if(!a.ok){r.push(...Hl(i.path,a));continue}o.push(a.data)}return{ok:r.every(i=>i.severity!==h.Error),augmentations:o,diagnostics:r}}function Yl(e){let t=e.root;if(!t)return;if(t.name==="TreeNodesModel")return{...e,kind:"model-document",isBtXml:!0};let n=t.children.find(o=>o.kind==="element"&&o.name==="TreeNodesModel");if(!n)return;let r=e.nodes.flatMap(o=>o===t?t.children.filter(i=>i===n||i.kind==="comment"):o.kind==="comment"?[o]:[]);return{...e,kind:"model-document",root:n,nodes:r,isBtXml:!0}}async function Jl(e,t){return fe(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function or(e,t){if(!await t.exists(e.uri))return{diagnostics:[w(b.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${e.path}\``,void 0,e.path,{help:"check `models.files` and make sure the file exists"})]};let n=await Jl(e,t);if(!n.document||n.diagnostics.some(o=>o.severity===h.Error)){let o=n.diagnostics[0];return{diagnostics:[w(b.ExternalModelXmlParseError,h.Error,`failed to parse external TreeNodesModel file \`${e.path}\``,n.diagnostics[0]?.range,e.path,{primaryLabel:"the external model file is not valid XML",help:`fix the XML syntax in \`${e.path}\` before using it as an external model file`,notes:o?[`first XML error: ${o.code} ${o.message}`]:void 0})]}}let r=Yl(n.document);return r?{document:r,diagnostics:[]}:{diagnostics:[w(b.MissingTreeNodesModel,h.Error,"missing `<TreeNodesModel>` in external model file",n.document.root?.range,e.path,{primaryLabel:"this file does not contain a `<TreeNodesModel>` element",help:"add a `<TreeNodesModel>` element or remove the file from `models.files`"})]}}async function _e(e,t){let n=e,r=t??n.host,o=[];for(let l of n.selectedFiles){if(!await r.exists(l.uri))continue;let c=await r.readFile(l.uri),d=fe(c,{uri:l.uri,path:l.path});d.document&&o.push(d.document)}let i=await Promise.all(n.modelFiles.map(l=>or(l,r))),s=await un({project:e,host:r}),a=i.flatMap(l=>l.diagnostics),u=i.flatMap(l=>l.document?[l.document]:[]);return{documents:o,externalModelDocuments:u,augmentations:[...s.augmentations],diagnostics:[...a,...s.diagnostics]}}function Zl(e){return e.endsWith("/")?e:`${e}/`}function Ql(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):ir(e.split("/"))}function ir(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function Le(e,t={}){let n=e.replace(/\\/g,"/"),r=s=>Ql(s,t.preserveDotSegments),o=/^(?<scheme>[A-Za-z][A-Za-z\d+.-]*):\/\/(?<authority>[^/]*)(?<path>\/.*)?$/.exec(n);if(o?.groups)return{scheme:o.groups.scheme,authority:o.groups.authority,absolute:!0,segments:r(o.groups.path||"/")};let i=/^(?<drive>[A-Za-z]:)(?<rest>\/.*)?$/.exec(n);return i?.groups?{authority:i.groups.drive,absolute:!0,segments:r(i.groups.rest||"/")}:{absolute:n.startsWith("/"),segments:r(n)}}function ln(e){let n=ir(e.segments).join("/");if(e.scheme){let r=`${e.scheme}://${e.authority??""}`;return n?`${r}/${n}`:`${r}/`}return e.authority&&e.absolute?n?`${e.authority}/${n}`:`${e.authority}/`:e.absolute?n?`/${n}`:"/":n}function ec(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Et(e){return ln(Le(e))}function tc(e,...t){let n=Le(e),r=[...n.segments];for(let o of t){let i=Le(o,{preserveDotSegments:!0});if(i.scheme||i.absolute&&i.authority)return Et(o);i.absolute&&(r.length=0),r.push(...i.segments)}return ln({...n,segments:ir(r)})}function nc(e){let t=Le(e);return t.segments.length===0?ln(t):ln({...t,segments:t.segments.slice(0,-1)})}function rc(e){return Le(e).segments.at(-1)??""}function oc(e,t){let n=Le(e),r=Le(t);if(!ec(n,r))return Et(t);let o=0;for(;o<n.segments.length&&o<r.segments.length&&n.segments[o]===r.segments[o];)o+=1;let i=new Array(n.segments.length-o).fill(".."),s=r.segments.slice(o);return[...i,...s].join("/")}function ic(e,t){let n=Zl(Et(e)),r=Et(t);return r===n.slice(0,-1)||r.startsWith(n)}var Y={normalize:Et,join:tc,dirname:nc,basename:rc,relative:oc,isWithin:ic};function ge(e,...t){return Y.join(e,...t)}function hi(e){return Y.dirname(e)}function Si(e){return Y.basename(e)}function De(e,t){return Y.relative(e,t)}function bi(e,t){return Y.isWithin(e,t)}import sc from"ignore";function sr(e){return e.replace(/\\/g,"/")}function q(e,t){return sr(De(e,t))}function ac(e){let t=e.replace(/\\/g,"/"),n="^";for(let r=0;r<t.length;r+=1){let o=t[r],i=t[r+1],s=t[r+2];if(o==="*"&&i==="*"&&s==="/"){n+="(?:.*/)?",r+=2;continue}if(o==="*"&&i==="*"){n+=".*",r+=1;continue}if(o==="*"){n+="[^/]*";continue}if(o==="?"){n+="[^/]";continue}".+-^${}()|[]\\".includes(o)?n+=`\\${o}`:n+=o}return n+="$",new RegExp(n)}function Ie(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");return!r.includes("*")&&!r.includes("?")?n===r||Si(n)===r:ac(r).test(n)}function uc(e){return e.includes("*")||e.includes("?")}async function vi(e,t,n,r,o,i,s,a){let u=q(n,t);if(u&&r.some(c=>Ie(u,c)||Ie(`${u}/`,c)||Ie(`${u}/dummy`,c))||a&&u&&a.ignores(u))return;let l;try{l=await e.readDir(t)}catch{return}for(let c of l){let d=ge(t,c.name),m=c.type==="directory",f=c.type==="file";if(c.type==="other"&&i&&e.realpath)try{let y=await e.realpath(d);if(s.has(y))continue;s.add(y);let p=await e.stat(y);m=p?.type==="directory",f=p?.type==="file"}catch{continue}m?await vi(e,d,n,r,o,i,s,a):f&&o.push(d)}}async function Pt(e,t,n,r,o,i,s){let a=new Set,u=new Set,l=[],c=o??t;for(let m of e){let f=ge(c,m);if((await s.stat(f))?.type==="file"){let y=q(t,f),p=!y.startsWith("..");!n.some(x=>Ie(y,x))&&(!p||!i?.ignores(y))&&a.add(f);continue}if(!uc(m)){u.add(m);continue}l.push(m)}let d=[];if(l.length>0&&await s.exists(t)){let m=new Set([s.realpath?await s.realpath(t):t]);await vi(s,t,t,n,d,r,m,i)}for(let m of d){let f=q(c,m);l.some(y=>Ie(f,y))&&(n.some(y=>Ie(q(t,m),y))||i?.ignores(q(t,m))||a.add(m))}for(let m of l)d.some(y=>{let p=q(c,y);return Ie(p,m)&&!n.some(x=>Ie(q(t,y),x))&&!i?.ignores(q(t,y))})||u.add(m);return{files:[...a].sort((m,f)=>q(t,m).localeCompare(q(t,f))),unmatchedPatterns:[...u].sort()}}async function ar(e,t){let n=ge(e,".gitignore");return await t.exists(n)?(await t.readFile(n)).split(/\r?\n/).map(o=>o.trim()).filter(o=>o&&!o.startsWith("#")):[]}function ur(e){return sc().add(e)}async function Ri(e,t,n,r,o){let i=[...t.ignore],s=t.useGitignore?await ar(e,o):[],a=ur(s),u=n?.length?n:t.include,l=await Pt(u,e,i,t.followSymlinks,n?.length?r:void 0,a,o),c=t.maxSize,d=[],m=[];for(let f of l.files){let y=q(e,f),p=await o.stat(f);if(p){if((p.size??0)>c){m.push({path:y,reason:"too-large"});continue}d.push({path:y,uri:f,kind:"unknown"})}}return{selectedFiles:d,skippedFiles:m,unmatchedPatterns:l.unmatchedPatterns}}function Ti(e){return e.entrypoints.map(t=>({file:sr(t)}))}function lr(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function xi(e,t,n,r){let o=[];for(let i of t)await r.exists(ge(e,i.file))||o.push(w(b.EntrypointNotFound,h.Error,`entrypoint file not found \`${i.file}\``,void 0,n,{help:"check `resolver.entrypoints` and make sure the file exists under the project root"}));return o}function ki(e,t){return e.attributes.find(n=>n.name===t)}function Di(e,t){return De(e,t).replace(/\\/g,"/")}function lc(e,t,n,r,o){return e.replace(/\$\{([^}]+)\}/g,(i,s)=>s.startsWith("env:")?process.env[s.slice(4)]??i:t[s]!==void 0?t[s]:(n.push({kind:"unresolved-variable",uri:o,variable:s,range:r,message:`unresolved include path variable \`${s}\``}),i))}function cc(e,t){let n=t.resolvedConfig.resolver.includes.elements.map(i=>({name:i.name,pathAttribute:i.attribute,base:i.base==="project-root"?"project-root":"current-file"})),r=e.root;if(!r)return[];let o=[];for(let i of r.children||[]){if(i.kind!=="element")continue;let s=n.find(a=>a.name===i.name);s&&o.push({element:i,pathAttr:ki(i,s.pathAttribute),rosPackageAttr:ki(i,"ros_pkg"),base:s.base??"current-file"})}return o}async function Ii(e){let t=e.project,n=e.host??t.host,r=e.resolvedConfig.resolver.includes.allowOutsideRoot,o=e.resolvedConfig.resolver.includes.maxDepth,i=e.resolvedConfig.resolver.includes.maxFiles,s=[],a=new Map(e.documents.map(p=>[Di(t.rootUri,p.path||p.uri),p])),u={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},l=new Map,c=new Set,d=t.entrypoints.length?t.entrypoints.map(p=>p.file):t.selectedFiles.map(p=>p.path);u.entrypointFiles=[...new Set(d)];let m=new Set,f=new Set,y=async(p,x,E)=>{if(x.length>=o){s.push({kind:"depth-exceeded",uri:E?.uri??p,path:p,range:E?.range,message:`include \`${p}\` exceeds the configured maximum include depth`});return}if(u.reachableFiles.size>=i){s.push({kind:"too-many-files",uri:E?.uri??p,path:p,range:E?.range,message:`resolving \`${p}\` would exceed the configured file limit`});return}let k=p.replaceAll("\\","/");if(m.has(k)){let T=[...x.slice(x.indexOf(k)),k];u.cycles.push({files:T}),s.push({kind:"cycle",uri:E?.uri??k,path:k,cycle:T,range:E?.range,message:"include cycle detected"});return}if(f.has(k))return;m.add(k),u.reachableFiles.add(k);let N=ge(t.rootUri,k);c.add(N);let g=await n.exists(N),S=a.get(k);!S&&g&&(S=fe(await n.readFile(N),{uri:N,path:k}).document,S&&a.set(k,S)),u.nodes.set(k,{path:k,document:S,exists:g}),S&&l.set(S.uri,S);let R=S?.uri??N;if(!g){s.push({kind:"not-found",uri:E?.uri??R,path:k,range:E?.range,message:`include file not found \`${k}\``}),m.delete(k);return}if(!S){m.delete(k);return}for(let T of cc(S,e)){if(!T.pathAttr){s.push({kind:"missing-path",uri:R,range:T.element.range,message:"missing include path"});continue}let A=lc(T.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,T.pathAttr.range,R),j;if(T.rosPackageAttr){let M=T.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:R,packageName:M,range:T.rosPackageAttr.range,message:`include uses ros_pkg=\`${M}\` but ProjectHost.resolvePackageUri is not available`});continue}let L=await n.resolvePackageUri(M);if(!L){s.push({kind:"ros-package-not-found",uri:R,packageName:M,path:A,range:T.rosPackageAttr.range,message:`ROS package \`${M}\` could not be resolved for include path \`${A}\``});continue}j=ge(L,A)}else{let M=T.base==="project-root"?t.rootUri:hi(N);j=ge(M,A)}let O=Di(t.rootUri,j),v=j;try{await n.exists(j)&&(v=n.realpath?await n.realpath(j):j)}catch{}if(!bi(t.rootUri,v)){if(!r){s.push({kind:"outside-root",uri:R,path:O,range:T.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:R,path:O,range:T.pathAttr.range,message:`external include used \`${A}\``})}u.edges.push({from:k,to:O,includeElementRange:T.element.range,includePathRange:T.pathAttr.range}),await y(O,[...x,k],{uri:R,range:T.pathAttr.range})}m.delete(k),f.add(k)};for(let p of u.entrypointFiles)await y(p,[]);return{graph:u,reachableUris:c,reachableDocuments:l,issues:s}}import{findNodeAtLocation as Ci,parse as dc,parseTree as mc}from"jsonc-parser";function pc(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
13
- `&&t.push(n+1);return n=>{let r=0,o=t.length-1;for(;r<=o;){let s=Math.floor((r+o)/2);t[s]<=n?r=s+1:o=s-1}let i=Math.max(0,r-1);return{line:i,character:n-t[i],offset:n}}}function Ei(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function Pi(e){let t=e.project,n=e.host??t.host,r=[],o=[],i=new Set;for(let s of t.definitionFiles){if(!await n.exists(s.uri)){r.push(w(b.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,u=await n.readFile(s.uri),l=[],c=mc(u,l,{allowTrailingComma:!0,disallowComments:!1});try{if(a=dc(u,l,{allowTrailingComma:!0,disallowComments:!1}),l.length>0||!c)throw new Error(`JSON parse error at offset ${l[0]?.offset??0}`)}catch(m){let f=String(m.message||m);r.push(w(b.InvalidNodeDefinitionJson,h.Error,`invalid node definition JSON \`${s.path}\``,void 0,"",{primaryLabel:"the file could not be parsed as JSON",help:`fix the JSON syntax in \`${s.path}\``,notes:[f]}));continue}let d=Ln.safeParse(a);if(!d.success){for(let m of d.error.issues){let f=m.code==="unrecognized_keys"?m.keys.map(y=>({label:`Unrecognized key: "${y}"`,path:[...m.path,y].join(".")})):[{label:m.message,path:m.path.join(".")}];for(let{label:y,path:p}of f)r.push(w(b.InvalidNodeDefinitionSchema,h.Error,`invalid node definition schema \`${s.path}\``,void 0,"",{primaryLabel:y,help:p?`fix the schema issue at \`${p}\``:"fix the schema issue in the file",notes:p?[p]:[]}))}continue}for(let[m,f]of Object.entries(d.data.nodes)){i.has(m)&&r.push(w(b.DuplicateNodeDefinitionId,h.Error,`duplicate node definition ID \`${m}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),i.add(m);let y=pc(u),p=Ei(Ci(c,["nodes",m]),y),x=it(m,f),E=x.ports.map(k=>{let N=Ei(Ci(c,["nodes",m,"ports",k.name]),y);return{...k,source:"node-definition-file",uri:s.path,range:N,nameRange:N}});o.push({...x,ports:E,source:"node-definition-file",sourceMeta:{sourceKind:"node-definition-file",file:s.path,range:p},editable:!0,uri:s.path,range:p,elementRange:p})}}return{ok:r.every(s=>s.severity!==h.Error),nodeModels:o,diagnostics:r}}function Bi(e,t){return De(e,t).replace(/\\/g,"/")}function fc(e){return[...e.reachableDocuments.values()]}function cr(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function Ni(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function gc(e){let t=new Map;for(let n of e){let r=t.get(n.uri)??[];r.push(n),t.set(n.uri,r)}return t}async function dr(e){let t=[],n=e.project,r=e.resolvedConfig,o=e.resolutionMode??lr(r),i=o==="entrypoints"||e.resolveGraph?await Ii({project:e.project,documents:e.documents,resolvedConfig:r,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,u=await Pi({project:e.project,host:e.host});t.push(...u.diagnostics);let l=u.nodeModels,c=i&&(o==="entrypoints"||e.resolveGraph)?cr([...e.documents.filter(p=>e.activeDocumentUris.has(p.uri)&&i.reachableUris.has(p.uri)),...i.reachableDocuments.values(),...s]):cr([...e.documents.filter(p=>e.activeDocumentUris.has(p.uri)),...s]),d=Me(c,{config:r,models:l,augmentations:a}),m={includeIssuesByUri:gc(i?.issues??[]),suppressionIssuesByUri:new Map};t.push(...d.diagnostics);let f=new Map(Te(d.index).map(p=>[p,H(d.index,p)])),y={mode:o,files:new Map(c.map(p=>[Bi(n.rootUri,p.path||p.uri),p])),documentViews:new Map(c.map(p=>[p.uri,(()=>{let x=J(r,Bi(n.rootUri,p.path||p.uri));return ae(p,{semantic:d.index,config:x,policy:ee(x)})})()])),includeGraph:i?.graph,reachableDocuments:i?.reachableDocuments??new Map,behaviorTreesById:new Map(Te(d.index).map(p=>[p,H(d.index,p)])),reachableBehaviorTreesById:f,nodeModelsById:new Map(Rt(d.index).map(p=>[p.id,p])),nodeModelSources:new Map(Kn(d.index).map(p=>[p,vt(d.index,p).flatMap(x=>x.sourceMeta?[x.sourceMeta]:[])])),nodeDefinitionModels:[...l],entrypoints:n.entrypoints,workspace:d.index,facts:m};return{ok:t.every(p=>p.severity!==h.Error),index:y,diagnostics:t}}async function wi(e){let t=e.project,n=e.resolvedConfig??t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let r=[...e.projectDiagnostics??[]],o=e.host??t.host,i=e.externalModelDocuments!==void 0?[...e.externalModelDocuments]:(await Promise.all(t.modelFiles.map(async y=>{let p=await or(y,o);return r.push(...p.diagnostics),p.document?[p.document]:[]}))).flat(),s=e.augmentations!==void 0?[...e.augmentations]:void 0;if(!s){let y=await un({project:e.project,host:o});r.push(...y.diagnostics),s=[...y.augmentations]}let a=e.resolutionMode??lr(n),u=a==="entrypoints"?new Set(e.documents.filter(y=>y.kind==="bt-document").map(y=>y.uri)):new Set(e.documents.map(y=>y.uri)),l=await dr({project:e.project,documents:e.documents,activeDocumentUris:u,externalModelDocuments:i,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:o}),c=cr([...e.documents,...fc(l.index),...i]),d=n.linter.enabled!==!1,m=e.showSuppressed,f=[...l.index.nodeDefinitionModels];return{input:e,project:e.project,documents:e.documents,externalModelDocuments:i,augmentations:s,projectDiagnostics:r,indexResult:l,nodeDefinitionModels:f,fileDocuments:c,lintEnabled:d,showSuppressed:m,resolvedConfig:n,suppressionIssuesByUri:void 0}}function Mi(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Ai(e,t){return e.includeIssuesByUri.get(t)??[]}function _i(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Li(e){let{document:t,semantic:n,config:r,view:o}=e,i=new Map(o.nodes.map(l=>[l.element,l])),s=new Map(o.subtreeCalls.map(l=>[l.node.element,l])),a=ee(r),u=yc(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(l){let c=w(l.code??e.code,e.severity,l.message,l.range,t.uri,l.details,l.data);e.diagnostics.push({...c,rule:e.rule,...l.relatedInformation?{relatedInformation:l.relatedInformation}:{}})},getIncludeIssues(l){let c=Ai(e.facts,t.uri);return l?c.filter(d=>d.kind===l):c},getSuppressionIssues(l){let c=_i(e.facts,t.uri);return l?c.filter(d=>d.kind===l):c},getNodeUsage(l){return F(n,{element:l,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:u.has(l)})},getPortUsage(l,c){return pe(n,{element:l,documentRoot:t.root,attributeName:c,uri:t.uri,config:r,policy:a,isModelDefinition:u.has(l)})},resolveSubTree(l,c){return kt(n,{id:l,fileLocalUri:c,config:r})},getNodeModel(l){return ne(n,l)},getBehaviorTrees(l){return H(n,l)},getTreeNodeView(l){return i.get(l)},getSubTreeCallView(l){return s.get(l)}}}function yc(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return mr(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||mr(n,t);return t}function mr(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&mr(n,t)}function P(e){let t=se[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var hc={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files"};function Ce(e){return P({name:hc[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Sc(n)})}}}})}function Sc(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}var ji=[Ce("missing-path"),Ce("not-found"),Ce("cycle"),Ce("outside-root"),Ce("unresolved-variable"),Ce("depth-exceeded"),Ce("too-many-files"),Ce("external-used")];import bc from"ajv";var vc=bc,Rc=new vc,Tc=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],xc={int8_t:{min:-128n,max:127n},"std::int8_t":{min:-128n,max:127n},int16_t:{min:-32768n,max:32767n},"std::int16_t":{min:-32768n,max:32767n},int32:{min:-2147483648n,max:2147483647n},int32_t:{min:-2147483648n,max:2147483647n},"std::int32_t":{min:-2147483648n,max:2147483647n},int64_t:{min:-9223372036854775808n,max:9223372036854775807n},int64:{min:-9223372036854775808n,max:9223372036854775807n},"std::int64_t":{min:-9223372036854775808n,max:9223372036854775807n},int:{min:-2147483648n,max:2147483647n},long:{min:-9223372036854775808n,max:9223372036854775807n},short:{min:-32768n,max:32767n},uint8_t:{min:0n,max:255n},"std::uint8_t":{min:0n,max:255n},uint16_t:{min:0n,max:65535n},"std::uint16_t":{min:0n,max:65535n},uint32:{min:0n,max:4294967295n},uint32_t:{min:0n,max:4294967295n},"std::uint32_t":{min:0n,max:4294967295n},uint64_t:{min:0n,max:18446744073709551615n},uint64:{min:0n,max:18446744073709551615n},"std::uint64_t":{min:0n,max:18446744073709551615n},uint:{min:0n,max:4294967295n},unsigned:{min:0n,max:4294967295n},"unsigned int":{min:0n,max:4294967295n},size_t:{min:0n,max:18446744073709551615n},"std::size_t":{min:0n,max:18446744073709551615n}},pr=new Set(["int8_t","int16_t","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","int","long","short","std::int8_t","std::int16_t"]),Fi=new Set(["uint8_t","uint16_t","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","uint","unsigned","unsigned int","std::uint8_t","std::uint16_t","size_t","std::size_t"]);function Ui(e){return e.children.filter(t=>t.kind==="element")}function ue(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function Oi(e){return e.children.some(t=>t.kind==="element")}function dn(e,t){let n=Vi(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Vi(e){let t=K(e.port.name,e.value);if(e.allowRemap&&t!==void 0)return;if(!e.allowRemap&&t!==void 0||e.port.enum&&!e.port.enum.includes(e.value))return cn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Ec(e.registry,n,e.value)?void 0:cn(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!$i(r,e.value))return kc(r)?cn(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${r}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${r}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function et(e){return e.effectiveType??e.type}function qi(e,t){return ie(e,et(t))}function fr(e,t){return K(e,t)}function cn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function kc(e){let t=at(e)??e;return Xi(e)!==void 0||Pc.has(t.toLowerCase())}function $i(e,t){let n=Xi(e);if(n)return Dc(n,t);let r=(at(e)??e).toLowerCase();switch(r){case"std::string":case"string":case"bt::any":case"bt::anytypeallowed":case"bt::anytype":case"any":return!0;case"bool":return t==="0"||t==="1"||t==="true"||t==="TRUE"||t==="True"||t==="false"||t==="FALSE"||t==="False";case"float":case"double":return/^-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/.test(t);case"bt::nodestatus":case"nodestatus":return Tc.includes(t);default:return pr.has(r)||Fi.has(r)?zi(r,t):!1}}function Xi(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Dc(e,t){let n=Cc(t);return n?n.every(r=>Ic(e,r)):!1}function Ic(e,t){if(t.kind==="string")return $i(e,t.value);let n=(at(e)??e).toLowerCase();switch(n){case"std::string":return typeof t.value=="string";case"bool":return typeof t.value=="boolean";case"float":case"double":return typeof t.value=="number"&&Number.isFinite(t.value);default:return pr.has(n)||Fi.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&zi(n,String(t.value)):!1}}function zi(e,t){let n=xc[e];if(!n)return!1;if(pr.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let r=BigInt(t);return r>=n.min&&r<=n.max}catch{return!1}}function Cc(e){if(e.startsWith("json:"))try{let t=JSON.parse(e.slice(5));return Array.isArray(t)?t.map(n=>({kind:"json",value:n})):void 0}catch{return}return e.split(";").map(t=>({kind:"string",value:t}))}function Ec(e,t,n){switch(t.kind){case"pattern":return new RegExp(`^(?:${t.pattern})$`).test(n);case"enum":return t.values.includes(n);case"tuple":{let r=n.split(t.separator);return r.length!==t.items.length?!1:r.every((o,i)=>{let s=t.items[i];return s?Vi({port:{name:`tuple[${i}]`,type:s},value:o,registry:e,typeDefinition:ie(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${i}]`})===void 0:!1})}case"json-schema":try{let r=JSON.parse(n);return Rc.compile(t.schema)(r)===!0}catch{return!1}}}var Pc=new Set(["std::string","string","bool","int8_t","std::int8_t","int16_t","std::int16_t","int","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","size_t","std::size_t","unsigned","unsigned int","float","double","bt::nodestatus","nodestatus","bt::any","bt::anytypeallowed","bt::anytype","any"]);var Wi=[P({name:"model/require-port-name",meta:{description:"Port elements require a name attribute."},create(e){return{TreeNodeModel(t){for(let n of t.ports)n.name||e.report({message:"Port must have name attribute",range:n.range||n.nameRange||t.idRange||t.range})}}}}),P({name:"model/no-duplicate-port-name",meta:{description:"Ports with the same name are not allowed."},create(e){return{TreeNodeModel(t){let n=new Set;for(let r of t.ports)r.name&&(n.has(r.name)&&e.report({message:`Duplicate port name "${r.name}" in ${t.id}`,range:r.nameRange||r.range||t.idRange||t.range}),n.add(r.name))}}}}),P({name:"model/valid-port-name",meta:{description:"Port names must be valid XML attribute names for BT nodes."},create(e){return{TreeNodeModel(t){for(let n of t.ports){if(!n.name)continue;let r=Pn(n.name);r&&e.report({code:b.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),P({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of xt(e.semantic))t.uri&&t.uri!==e.document.uri||Bc(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),P({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!Nc(t))return;let n=t.attributes.find(u=>u.name==="default")??t.attributes.find(u=>u.name==="default_value");if(!n)return;let r=t.attributes.find(u=>u.name==="name")?.value;if(!r)return;let i=wc(e.document.root,t)?.attributes.find(u=>u.name==="ID")?.value;if(!i)return;let a=e.getNodeModel(i)?.ports.find(u=>u.name===r);if(a){if(a.direction==="output"){K(a.name,n.value)===void 0&&e.report({code:b.InvalidPortDefaultValue,message:`output port default for \`${a.name}\` must be a blackboard remap`,range:n.range,details:{primaryLabel:`output port default for \`${a.name}\` must be a blackboard remap`,help:`use \`${a.name}="{${a.name}}"\` or \`${a.name}="{=}"\``}});return}dn(e,{port:a,value:n.value,range:n.range,registry:Z(e.semantic),typeDefinition:te(e.semantic,a.type),allowRemap:!0,diagnosticCode:b.InvalidPortDefaultValue,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),P({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=Z(e.semantic),n=new Map,r=e.options.allowStringEntryCompatibility??!0;for(let o of e.view.nodes)for(let i of o.portBindings){if(i.declaredPort.status!=="resolved")continue;let s=fr(i.name,i.value);if(!s)continue;let a=qi(t,i.declaredPort.port);if(!a||a.kind==="any")continue;let u=n.get(s)??[];u.push({key:s,nodeId:_c(o.element),port:i.declaredPort.port,typeDefinition:a,range:i.attribute.range}),n.set(s,u)}for(let[o,i]of n){let s=Mc(e.semantic,i,r);if(s.length<2)continue;let a=i.find(u=>u.typeDefinition.canonical===s[0]);e.report({code:b.BlackboardTypeMismatch,message:`blackboard entry \`${o}\` is used with incompatible port types: ${s.map(u=>`\`${u}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${o}\` mixes incompatible port types`,notes:i.filter(u=>s.includes(u.typeDefinition.canonical)).map(u=>`${u.nodeId}.${u.port.name} declares ${Ac(u.port,u.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),P({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Lc(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let o=e.getPortUsage(t,r.name);o?.status==="resolved"&&o.port.direction==="output"&&fr(o.port.name,r.value)===void 0&&e.report({code:b.OutputPortRequiresRemap,message:`output port \`${o.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${o.port.name}\` requires a blackboard remap`,help:`use \`${o.port.name}="{${o.port.name}}"\` or \`${o.port.name}="{some_key}"\``}})}}}}})];function Bc(e,t){return e.diagnostics.some(n=>n.code===b.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function Nc(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function wc(e,t){if(!e)return;return n(e,!1,void 0);function n(r,o,i){let s=o||r.name==="TreeNodesModel",a=s&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:i;if(r===t)return a;for(let u of r.children){if(u.kind!=="element")continue;let l=n(u,s,a);if(l)return l}}}function Mc(e,t,n){let r=new Set;for(let o=0;o<t.length;o+=1){let i=t[o];if(i)for(let s=o+1;s<t.length;s+=1){let a=t[s];a&&(n&&(i.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||Re(e,i.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(i.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function Ac(e,t){return et(e)??t.canonical}function _c(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Lc(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var jc=new Set(["_failureIf","_successIf","_skipIf","_while"]),Fc=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function je(e){if(jc.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Fc.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}var Gi=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),Ki=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function tt(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(Hi(r)){n++;continue}if(gr(r)){let a=n;for(n++;n<e.length&&Vc(e[n]);)n++;let u=e.slice(a,n);t.push({type:u==="true"||u==="false"?"Boolean":"Identifier",text:u,start:a,end:n});continue}if(Fe(r)){let a=Oc(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=Uc(e,n);t.push(a),n=a.end;continue}let o=e.slice(n,n+2),i=Gi.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let s=Ki.get(r);if(s){t.push({type:s,text:r,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:r,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function Uc(e,t){let n=t+1;for(;n<e.length&&e[n]!=="'";)n++;return n>=e.length?{type:"Error",text:e.slice(t),start:t,end:e.length}:{type:"String",text:e.slice(t+1,n),start:t,end:n+1}}function Oc(e,t){let n=t;if(e[n]==="0"&&(e[n+1]==="x"||e[n+1]==="X")){n+=2;let o=n;for(;n<e.length&&qc(e[n]);)n++;return o===n||Xc(e,n)?(n=Bt(e,n),Nt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Fe(e[n]);)n++;let r="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:r,text:e.slice(t,n),start:t,end:n};if(!Fe(e[n+1]))return n=Bt(e,n+1),Nt(e,t,n);for(r="Real",n+=1;n<e.length&&Fe(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let o=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let i=n;for(;n<e.length&&Fe(e[n]);)n++;if(i===n)return n=Bt(e,Math.max(n,o+1)),Nt(e,t,n);r="Real"}return $c(e,n)?(n=Bt(e,n),Nt(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function Bt(e,t){let n=t;for(;n<e.length;){let r=e[n];if(Hi(r)||Ki.has(r)||Gi.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function Nt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Hi(e){return e===" "||e===" "||e===`
14
- `||e==="\r"}function gr(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Vc(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Fe(e){return e!==void 0&&/[0-9]/.test(e)}function qc(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function $c(e,t){let n=e[t];return gr(n)||Fe(n)}function Xc(e,t){let n=e[t];return n==="."||gr(n)||Fe(n)}var zc=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Wc=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),Yi=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),oe={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Oe(e){let t=tt(e),n=t.filter(r=>r.type==="Error");return n.length>0?{ok:!1,errors:n.map(r=>({kind:"invalid-token",message:`invalid token \`${r.text}\``,range:{start:r.start,end:r.end}})),tokens:t}:Ji(t,e)}function Ji(e,t=""){let n=new yr(e,t),r=[];if(n.peek().type==="EndOfInput")return{ok:!1,errors:[{kind:"empty-script",message:"empty script",range:{start:0,end:0}}],tokens:e};for(;n.peek().type!=="EndOfInput";){let i=n.parseExpression(0);if(!i)return{ok:!1,errors:n.errors,tokens:e};for(r.push(i);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let o=Jc(r);return{ok:!0,program:{kind:"Program",statements:r,range:o},tokens:e}}var yr=class{constructor(t,n,r=0){this.tokens=t;this.source=n;this.index=r}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let r=this.peek();if(r.type==="EndOfInput"||r.type==="Semicolon"||r.type==="RightParen"||r.type==="Colon")break;let o=zc.get(r.type);if(o){if(t>=oe.assignment)break;this.consume();let u=this.parseExpression(0);if(!u)return;n={kind:"AssignmentExpression",operator:o,left:n,right:u,range:wt(n.range,u.range)};break}if(r.type==="Question"){if(t>=oe.ternary)break;this.consume();let u=this.parseExpression(0);if(!u)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let l=this.parseExpression(oe.ternary);if(!l)return;n={kind:"ConditionalExpression",condition:n,thenExpression:u,elseExpression:l,range:wt(n.range,l.range)};break}let i=Yi.get(r.type);if(i){if(t>=oe.comparison)break;this.consume();let u=[n],l=[i],c=this.parseExpression(oe.comparison);if(!c)return;for(u.push(c);;){let d=Yi.get(this.peek().type);if(!d)break;this.consume();let m=this.parseExpression(oe.comparison);if(!m)return;l.push(d),u.push(m)}n={kind:"ComparisonChain",operands:u,operators:l,range:wt(u[0].range,u[u.length-1].range)};continue}let s=Wc.get(r.type),a=s?Hc(r.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let u=this.parseExpression(a);if(!u)return;n={kind:"BinaryExpression",operator:s,left:n,right:u,range:wt(n.range,u.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${r.text||r.type}\``,r);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:Ue(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),Gc(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:Kc(t.type),argument:n,range:wt(Ue(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),r=this.parseExpression(0);if(!r)return;let o=this.peek();if(o.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",o);return}return this.consume(),Yc(r,{start:n.start,end:o.end})}default:this.reportError("expected-operand","expected operand",t);return}}peek(){return this.tokens[this.index]??this.tokens[this.tokens.length-1]}consume(){let t=this.peek();return this.index+=1,t}match(t){return this.peek().type!==t?!1:(this.consume(),!0)}reportError(t,n,r){this.errors.push({kind:t,message:n,range:Ue(r)})}};function Gc(e,t){switch(e.type){case"Integer":return{kind:"Literal",valueKind:"integer",raw:t.slice(e.start,e.end),value:e.text.startsWith("0x")||e.text.startsWith("0X")?Number(e.text):Number.parseInt(e.text,10),range:Ue(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Ue(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Ue(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Ue(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function Kc(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function Hc(e){switch(e){case"PipePipe":return oe.pipePipe;case"AmpAmp":return oe.ampAmp;case"Pipe":case"Caret":return oe.pipeCaret;case"Ampersand":return oe.ampersand;case"Plus":case"Minus":case"DotDot":return oe.additive;case"Star":case"Slash":return oe.multiplicative;default:return}}function Ue(e){return{start:e.start,end:e.end}}function wt(e,t){return{start:e.start,end:t.end}}function Yc(e,t){return{...e,range:t}}function Jc(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var Zc=new Set(["int8_t","std::int8_t","int16_t","std::int16_t","int32","int32_t","std::int32_t","int64","int64_t","std::int64_t","int","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint32","uint32_t","std::uint32_t","uint64","uint64_t","std::uint64_t","uint","unsigned","unsigned int","size_t","std::size_t","float","double"]);function Mt(e={}){let t=He(e.augmentations??[]),n=e.areTypesCompatible??((i,s)=>ut(t,i,s)),r=new Map,o={symbols:new Map,enums:Qc(e.enums,e.augmentations??[])};for(let i of e.symbols??[])ed(o,r,i,n);return o}function ye(e){return{symbols:new Map([...e?.symbols.entries()??[]].map(([t,n])=>[t,{...n}])),enums:new Map(e?.enums??[])}}function At(e){let t=ye(e.baseEnvironment),n=[];for(let r of e.entries){let o=ye(t),i=r.parseResult??Oe(r.source),s=ye(o),a;i.ok&&(a=$e({program:i.program,environment:o,attributeName:r.attributeName,originId:r.originId??String(r.id)}),s=ye(a.environment)),n.push({id:r.id,parseResult:i,environmentBefore:o,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.enums.clear();for(let[u,l]of s.symbols)t.symbols.set(u,{...l});for(let[u,l]of s.enums)t.enums.set(u,l)}return n}function Zi(e){let t=new Map;for(let n of e)for(let[r,o]of Object.entries(n.script?.enums??{}))t.set(r,o);return t}function Ve(e,t){let n=ie(e,t);return Qi(t,n)}function Qi(e,t){if(!e||!t)return{kind:"unknown"};if(t.kind==="any")return{kind:"any"};let n=t.canonical.toLowerCase();return n==="bool"?{kind:"bool"}:n==="std::string"||n==="string"?{kind:"string"}:Zc.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function es(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:e.kind===t.kind}function mn(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:!1:e.kind==="bool"&&t.kind==="number"?!0:e.kind===t.kind}function qe(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function hr(e,t){return e.kind==="error"||t.kind==="error"?{kind:"error"}:e.kind==="unknown"||t.kind==="unknown"?{kind:"unknown"}:e.kind==="any"||t.kind==="any"?e.kind===t.kind?e:{kind:"unknown"}:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"&&e.canonical===t.canonical?e:void 0:e.kind===t.kind?e:void 0}function Qc(e,t){if(e instanceof Map)return new Map(e);let n=Zi(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function ed(e,t,n,r){let o=e.symbols.get(n.name);if(!o){e.symbols.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let i=t.get(n.name),s=o.conflict===!0||i!==void 0&&n.compatibilityKey!==void 0&&!r(i,n.compatibilityKey)||!es(o.type,n.type);e.symbols.set(n.name,{...o,readable:o.readable||n.readable,writable:o.writable||n.writable,conflict:s}),i===void 0&&t.set(n.name,n.compatibilityKey)}var Xe={kind:"number"},fn={kind:"string"},pn={kind:"bool"},ve={kind:"unknown"},W={kind:"error"};function $e(e){let t=ye(e.environment),n=[],r=[],o=[],i=[],s=[],a=[];return e.program.statements.forEach((u,l)=>{a.push(he({expression:u,statementIndex:l,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,introducedSymbols:i,diagnostics:s,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,introducedSymbols:i,diagnostics:s,statementTypes:a,finalType:a.at(-1)}}function he(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?Xe:t.valueKind==="string"?fn:t.valueKind==="boolean"?pn:ve;case"Identifier":return nd(e,t.name,t.range);case"UnaryExpression":{let n=he({...e,expression:t.argument});return t.operator==="!"?qe(n)?pn:(le(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a bool-compatible operand`,`operand for \`${t.operator}\` is not bool-compatible`,"use a boolean, number, or unknown-compatible expression here"),W):n.kind==="number"?Xe:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?W:ve:(le(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a numeric operand`,`operand for \`${t.operator}\` is not numeric`,"use a number expression here"),W)}case"BinaryExpression":{let n=he({...e,expression:t.left}),r=he({...e,expression:t.right});switch(t.operator){case"&&":case"||":return ts(n)||ts(r)?(le(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires bool-compatible operands`,`operands for \`${t.operator}\` are not bool-compatible`,"use boolean or numeric expressions here"),W):pn;case"+":return n.kind==="string"&&r.kind==="string"?fn:n.kind==="number"&&r.kind==="number"?Xe:Sr(n,r)?ve:(br(e,t.range,t.operator),W);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Xe:Sr(n,r)?ve:(br(e,t.range,t.operator),W);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?fn:Sr(n,r)?ve:(br(e,t.range,t.operator),W)}return ve}case"ComparisonChain":{let n=t.operands.map(r=>he({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let o=t.operators[r],i=n[r],s=n[r+1];if(!od(o,i,s))return le(e,"invalid-operand-type",{start:t.operands[r]?.range.start??t.range.start,end:t.operands[r+1]?.range.end??t.range.end},`operator \`${o}\` cannot compare these operand types`,`comparison operands for \`${o}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),W}return pn}case"ConditionalExpression":{let n=he({...e,expression:t.condition});qe(n)||le(e,"invalid-operand-type",t.condition.range,"ternary condition must be bool-compatible","ternary condition is not bool-compatible","use a boolean or numeric condition expression here");let r=he({...e,expression:t.thenExpression}),o=he({...e,expression:t.elseExpression}),i=hr(r,o);return i||(le(e,"invalid-operand-type",t.range,"ternary branches must produce compatible types","then and else branches have incompatible types","return the same type from both ternary branches"),W)}case"AssignmentExpression":return td(e)}}function td(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:o}=e,i=e.expression,s=he({...e,expression:i.right});if(i.left.kind!=="Identifier")return he({...e,expression:i.left}),le(e,"invalid-operand-type",i.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),W;let a=i.left,u=i.operator===":="?"declare":i.operator==="="?"write":"readwrite",l={name:a.name,kind:u,range:a.range,identifier:a,statementIndex:e.statementIndex};r.push(l);let c=t.symbols.get(a.name);if(i.operator===":="&&!c){let m={name:a.name,type:s,source:{kind:"script-assignment",attributeName:n,range:a.range,originId:e.originId},readable:!0,writable:!0};return t.symbols.set(a.name,m),e.resolvedIdentifiers.push({access:l,resolution:{kind:"symbol",symbol:m}}),o.push(m),s}if(!c)return e.resolvedIdentifiers.push({access:l,resolution:{kind:"unknown"}}),le(e,"assignment-to-unknown-variable",a.range,`assignment target \`${a.name}\` is not defined`,`\`${a.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),W;if(e.resolvedIdentifiers.push({access:l,resolution:{kind:"symbol",symbol:c}}),i.operator==="=")return mn(c.type,s)?(vr(c,s),s):(ns(e,a,c.type,s),W);if(i.operator===":=")return mn(c.type,s)?(vr(c,s),s):(ns(e,a,c.type,s),W);let d=rd(c.type,s,i.operator);return d?(vr(c,d),d):(le(e,"invalid-compound-assignment",i.range,`operator \`${i.operator}\` is not valid for these operand types`,`compound assignment \`${i.operator}\` is not allowed here`,i.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),W)}function nd(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let o=e.environment.enums.get(t);if(o!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:o}}),Xe;let i=e.environment.symbols.get(t);return i?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:i}}),i.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),ve)}function rd(e,t,n){return e.kind==="error"||t.kind==="error"?W:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?ve:n==="+="?e.kind==="number"&&t.kind==="number"?Xe:e.kind==="string"&&t.kind==="string"?fn:void 0:e.kind==="number"&&t.kind==="number"?Xe:void 0}function Sr(e,t){return gn(e)||gn(t)}function gn(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function ts(e){return!qe(e)}function od(e,t,n){return gn(t)||gn(n)?!0:e==="=="||e==="!="?t.kind==="custom"||n.kind==="custom"?t.kind==="custom"&&n.kind==="custom"&&t.canonical===n.canonical:t.kind===n.kind:t.kind==="custom"||n.kind==="custom"?!1:t.kind==="number"&&n.kind==="number"||t.kind==="string"&&n.kind==="string"}function br(e,t,n){le(e,"invalid-operand-type",t,`operator \`${n}\` cannot be applied to these operand types`,`operands for \`${n}\` are not compatible`,"use operands with the types required by this operator")}function ns(e,t,n,r){le(e,"variable-type-mismatch",t.range,`cannot assign ${Rr(r)} to variable \`${t.name}\` of type ${Rr(n)}`,`\`${t.name}\` expects ${Rr(n)} here`,"assign a compatible value or change the variable's source type")}function vr(e,t){e.source.kind==="script-assignment"&&(e.type.kind!=="unknown"&&e.type.kind!=="error"||t.kind==="unknown"||t.kind==="any"||t.kind==="error"||(e.type=t))}function le(e,t,n,r,o,i){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:o,help:i}})}function Rr(e){return e.kind==="custom"?e.name:e.kind}var rs=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),id=new Set(["LeftParen","Semicolon","Question","Colon","Plus","Minus","Star","Slash","DotDot","Ampersand","Pipe","Caret","Tilde","AmpAmp","PipePipe","Bang","EqualEqual","BangEqual","Less","Greater","LessEqual","GreaterEqual","ColonEqual","Equal","PlusEqual","MinusEqual","StarEqual","SlashEqual"]),sd=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],ad=[":=","=","+=","-=","*=","/="],os=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function Tr(e){let t=e.source,n=ss(t,e.cursorOffset),r=hn({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...ud(e,r)),gd(e.attributeInfo,t,n)&&o.push(...dd(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...ld(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(...cd(r.range,r.prefix)),Sd(o)}function hn(e){let t=e.source,n=ss(t,e.cursorOffset),r=tt(t).filter(u=>u.type!=="EndOfInput"),o=r.find(u=>u.start<=n&&n<=u.end);if(o?.type==="Identifier")return{kind:"identifier",prefix:o.text.slice(0,Math.max(0,n-o.start)),range:{start:o.start,end:o.end}};if(o&&(o.type==="Integer"||o.type==="Real"||o.type==="String"||o.type==="Boolean"))return{kind:"literal",range:{start:o.start,end:o.end}};let i=yd(t,n),s=yn(r,i.start);if(i.start<i.end&&s&&rs.has(s.type))return{kind:s.type==="Identifier"&&is(r,s)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let a=yn(r,n);return a&&rs.has(a.type)&&a.end<=n?{kind:a.type==="Identifier"&&is(r,a)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!a||id.has(a.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function ud(e,t){let n=md(e),r=t.prefix.toLowerCase(),o=[];for(let[i,s]of n.enums)_t(i,r)&&o.push({label:i,kind:"enum",detail:`enum value ${s}`,replaceRange:t.range,sortText:`0-${i}`});for(let i of n.symbols.values())i.conflict||i.readable&&_t(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:pd(i),replaceRange:t.range,sortText:i.source.kind==="script-assignment"?`1-${i.name}`:`2-${i.name}`});for(let i of["true","false"])_t(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function ld(e,t){return sd.filter(n=>_t(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function cd(e,t){return ad.filter(n=>_t(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function dd(e){return[{label:"name := value",kind:"snippet",detail:"Declare local script variable",replaceRange:e,insertText:"${1:name} := ${2:value}",insertTextFormat:"snippet",sortText:"6-name := value"},{label:"name = value",kind:"snippet",detail:"Assign existing variable",replaceRange:e,insertText:"${1:name} = ${2:value}",insertTextFormat:"snippet",sortText:"6-name = value"}]}function md(e){let t=ye(e.environment),n=tt(e.source),r=Oe(e.source);if(r.ok){let o=$e({program:r.program,environment:t,attributeName:e.attributeName}),i=ye(e.environment);for(let s of o.introducedSymbols)s.source.kind==="script-assignment"&&(s.source.range.end>e.cursorOffset||i.symbols.set(s.name,s));return i}for(let o of n){if(o.type!=="Identifier")continue;if(o.end>e.cursorOffset)break;let i=hd(n,o.end);i?.type==="ColonEqual"&&(i.end>e.cursorOffset||t.symbols.has(o.text)||t.symbols.set(o.text,{name:o.text,type:{kind:"unknown"},source:{kind:"script-assignment",attributeName:e.attributeName??"code",range:{start:o.start,end:o.end}},readable:!0,writable:!0}))}return t}function pd(e){let t=fd(e.type);switch(e.source.kind){case"port-remap":return`${t} from ${e.source.nodeType??"node"}.${e.source.portName}`;case"subtree-port":return`${t} from ${e.source.nodeType??"SubTree"}.${e.source.portName}`;case"script-assignment":return`${t} from earlier ${e.source.attributeName} declaration`;case"augmentation":return`${t} from augmentation`;case"enum":return`${t} enum`}}function fd(e){switch(e.kind){case"number":case"string":case"bool":case"any":case"unknown":case"error":return e.kind;case"custom":return e.name}}function gd(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=tt(t).filter(i=>i.type!=="EndOfInput"),o=yn(r,n);return!o||o.type==="Semicolon"}function yd(e,t){let n=t;for(;n>0&&os.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&os.has(e[r]??"");)r+=1;return{start:n,end:r}}function yn(e,t){for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r.end<=t)return r}}function is(e,t){if(t.type!=="Identifier")return!1;let n=yn(e,t.start);return!n||n.type==="Semicolon"}function hd(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function _t(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function ss(e,t){return Math.max(0,Math.min(e.length,t))}function Sd(e){let t=new Set;return e.filter(n=>{let r=`${n.kind}:${n.label}:${n.insertText??""}`;return t.has(r)?!1:(t.add(r),!0)})}var as=new WeakMap;function Sn(e,t){let n=e.getNodeUsage(t),r=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(o=>{let i=je({elementName:t.name,attributeName:o.name,resolvedNodeType:r});return i?[{attribute:o,info:i,parseResult:Oe(o.value)}]:[]})}function ce(e,t,n){return ke(e.document,t,n)}function us(e){return{start:0,end:e.value.length}}function Ee(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?Sn(e,t).map(o=>{let i=ls(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?$e({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):bd(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function bd(e,t){let n=as.get(e.view);n||(n=new WeakMap,as.set(e.view,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(s=>Sn(e,s.element).map((a,u)=>({id:`${s.path.join(".")}:${a.attribute.name}:${u}`,node:s,candidate:a}))),i=At({baseEnvironment:ls(e,t.nodes),entries:o.map(s=>({id:s.id,source:s.candidate.attribute.value,attributeName:s.candidate.attribute.name,originId:s.id,parseResult:s.candidate.parseResult}))}).flatMap((s,a)=>{let u=o[a];return u?[{...s,node:u.node,candidate:u.candidate}]:[]});return n.set(t,i),i}function ls(e,t){let n=Z(e.semantic),r=[],o=t[0]?.behaviorTree.id;if(o){let i=e.getNodeModel(o);if(i?.kind==="SubTree")for(let s of i.ports){let a=et(s),l=te(e.semantic,a)?.canonical??a;r.push({name:s.name,type:Ve(n,a),source:{kind:"subtree-port",nodeType:o,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:l})}}for(let i of t){let s=i.usage.model.status==="resolved"?i.usage.model.model.id:i.usage.nodeType;for(let a of i.portBindings){if(a.usage.status!=="resolved")continue;let u=K(a.usage.port.name,a.usage.value);if(!u)continue;let l=et(a.usage.port),d=te(e.semantic,l)?.canonical??l,m=a.usage.port.direction;r.push({name:u,type:Ve(n,l),source:{kind:"port-remap",nodeType:s,portName:a.usage.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:d})}}return Mt({symbols:r,augmentations:Tt(e.semantic),areTypesCompatible:(i,s)=>i&&s?Re(e.semantic,i,s):!0})}var cs=P({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Ee(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:b.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:ce(e,n.attribute,r.range),details:{primaryLabel:`\`${r.name}\` is not defined in the script environment`,help:"introduce it earlier with `:=`, add a matching blackboard remap, or define a script enum in btxml.model-augment.json"}})}}}});var ds=P({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Ee(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let o=r.code==="assignment-to-unknown-variable"?b.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?b.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?b.ScriptVariableTypeMismatch:void 0;o&&e.report({code:o,message:r.message,range:ce(e,n.attribute,r.range),details:r.details})}}}}});var ms=P({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Ee(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:b.InvalidScriptOperandType,message:r.message,range:ce(e,n.attribute,r.range),details:r.details})}}}});var ps=P({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Ee(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let r=n.parseResult.program.statements.at(-1),o=n.analysis.finalType;!r||!o||qe(o)||e.report({code:b.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:ce(e,n.attribute,r.range),details:{primaryLabel:"script result is not bool-compatible here",help:"return a boolean or numeric expression, or move side effects into a postcondition/script node"}})}}}}});var fs=P({name:"script/valid-syntax",create(e){return{Element(t){for(let n of Sn(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let o=r.kind==="empty-script"?b.EmptyScript:r.kind==="invalid-token"?b.InvalidScriptToken:b.InvalidScriptSyntax;e.report({code:o,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??ce(e,n.attribute,us(n.attribute)):ce(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var gs=[fs,cs,ds,ms,ps];var vd={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function ys(e){return P({name:vd[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Rd(n)})}}}})}function Rd(e){return e.code?{code:e.code}:void 0}var hs=[ys("unused"),ys("missing-reason")];function bn(e,t){return e.attributes.find(n=>n.name===t)}var Ss=[P({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||bn(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),P({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=bt(e.semantic,e.document.uri);for(let r of n?.behaviorTrees??[])r.idRange&&(t.has(r.id)&&e.report({message:`Duplicate BehaviorTree ID: ${r.id}`,range:r.idRange}),t.add(r.id))}}}}),P({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of Te(e.semantic)){let n=H(e.semantic,t);if(n.length<=1||new Set(n.map(i=>i.uri)).size<=1)continue;let o=n.filter(i=>i.uri===e.document.uri);o.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:o[0]?.idRange})}}}}}),P({name:"tree/no-unknown-main-tree",create(e){return{Document(){let t=e.document.root;if(e.document.kind!=="bt-document"||!t)return;let n=bn(t,"main_tree_to_execute");!n?.value||Xn(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),P({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(i=>i.name==="ID")??bn(t,"ID");!r||n?.target.status==="resolved"||e.resolveSubTree(r.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${r.value}\``,range:r.valueContentRange||r.valueRange})}}}}),P({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=bn(t,"ID");if(!n||e.getSubTreeCallView(t)?.target.status==="resolved")return;let o=e.resolveSubTree(n.value,e.document.uri);o.status!=="ambiguous"||o.behaviorTrees.length<=1||e.report({message:`ambiguous subtree \`${n.value}\``,range:n.valueContentRange||n.valueRange})}}}}),P({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var Td=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function xd(e,t){return e===t?String(e):`${e}\u2013${t}`}var bs=P({name:"model/valid-child-count",create(e){return{Element(t){if(ue(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&kd(e,t,n.model.model.id,n.model.model.kind)}}}});function kd(e,t,n,r){let o=Ui(t).length,i=Td.get(n);if(i){if(o<i.min||o>i.max){let s=xd(i.min,i.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${o}.`,range:t.range})}return}if(r==="Action"||r==="Condition"){o>0&&e.report({message:`${r} node \`${n}\` must not have child nodes, but has ${o}.`,range:t.range});return}if(r==="Decorator"){o!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${o}.`,range:t.range});return}if(r==="Control"){o<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}r==="SubTree"&&o>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${o}.`,range:t.range})}var vs=P({name:"model/valid-port-value",create(e){return{Element(t){if(ue(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let o=e.getPortUsage(t,r.name);o?.status==="resolved"&&dn(e,{port:o.port,value:r.value,range:r.range,registry:Z(e.semantic),typeDefinition:te(e.semantic,o.port.type),allowRemap:!0,diagnosticCode:b.InvalidPortValueType,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var Rs=P({name:"model/require-port",create(e){return{Element(t){if(ue(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of n.ports)!r.required||n.portUsages.some(i=>i.name===r.name&&i.status==="resolved")||e.report({message:`missing required port \`${r.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${r.name}\``:`SubTree requires port \`${r.name}\``,help:`add \`${r.name}="..."\` or provide a blackboard reference such as \`${r.name}="{value}"\``}:void 0})}}}});var Ts=[P({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(ue(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Control"&&r!=="Decorator"||e.report({message:`${r} node \`${n.model.model.id}\` normally expects child nodes.`,range:t.range})}}}}),P({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(ue(t)||t.selfClosing||Oi(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Action"&&r!=="Condition"&&r!=="SubTree"||e.report({message:`${r} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var xs=P({name:"model/no-unknown-node",create(e){return{Element(t){let n=e.getNodeUsage(t);if(n.tagForm==="root"||n.tagForm==="behavior-tree"||n.tagForm==="tree-nodes-model"||n.tagForm==="include"||n.tagForm==="model-definition"||n.tagForm==="subtree"||n.tagForm==="unknown-xml"||n.model.status==="resolved"||n.model.status==="ambiguous")return;let r=t.attributes.find(o=>o.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:r?.valueContentRange??r?.valueRange??t.range})}}}});var ks=P({name:"model/no-unknown-port",create(e){return{Element(t){if(ue(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let o=n.ports.map(s=>s.name).sort(),i=o.length>=1&&o.length<=8?[`note: defined ports: ${o.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${r.name}\``,range:r.attribute.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` does not define this port`:"SubTree does not define this port in strict mode",help:n.model.status==="resolved"?`remove \`${r.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${r.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:i}:void 0})}}}}});var Ds=[xs,ks,Rs,vs,...Ts,bs];function Dd(e,t){return e.attributes.find(n=>n.name===t)}function Id(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Is=[P({name:"xml/valid-root",create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||t.name==="root"||e.report({message:"Root element must be <root>",range:t.range})}}}}),{name:"xml/require-btcpp-format",code:b.MissingBTCPPFormat,defaultSeverity:"error",meta:{description:'Root element must declare BTCPP_format="4".'},create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||Dd(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},P({name:"xml/no-unknown-top-level-element",meta:{description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},create(e){return{Element(t){let n=e.document.root;e.document.kind!=="bt-document"||!n||t===n||!n.children.includes(t)||Id(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var xr=[...Is,...gs,...Ss,...Wi,...Ds,...ji,...hs],tb=new Map(xr.map(e=>[e.name,e]));function Cs(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Es(e,t){return be(e.linter.rules[t])?.options??{}}function Ps(e){let t=be(e.config.linter.rules[e.rule]);return Cs(t?t.severity:e.defaultSeverity)}function Bs(e){let t=[],n=e.facts??Mi(),r=e.rules?new Set(e.rules):void 0,o=[];for(let s of xr){if(r&&!r.has(s.name))continue;let a=Ps({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let u=Es(e.config,s.name),l=s.optionsSchema?.safeParse(u),c=l?.success?l.data:u,d=Li({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:c,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});o.push(s.create(d))}for(let s of o)s.Document?.();e.document.root&&Ns(e.document.root,o);let i=bt(e.semantic,e.document.uri);for(let s of i?.treeNodesModel??[])for(let a of o)a.TreeNodeModel?.(s);for(let s of o)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>Cd(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function Ns(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Ns(n,t)}function Cd(e,t){let n=e.range,r=t.range;return!n&&!r?0:n?r?n.start.line-r.start.line||n.start.character-r.start.character||n.end.line-r.end.line||n.end.character-r.end.character:-1:1}function Lt(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let r=[...e.diagnostics],o=n.documentView??ae(e,{semantic:t,config:n.config,policy:ee(n.config)});return r.push(...Bs({document:e,view:o,semantic:t,config:n.config})),r}var Ed={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files","ros-package-resolver-missing":"include/require-ros-package-resolver","ros-package-not-found":"include/no-missing-ros-package"};function ws(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Pd(e,t){let n=be(e.linter.rules[t]);return ws(n?n.severity:se[t].defaultSeverity)}function Bd(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"ros-package-resolver-missing":return{packageName:e.packageName};case"ros-package-not-found":return{packageName:e.packageName,path:e.path};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}function Ms(e){let t=[];for(let n of e.issues){let r=Ed[n.kind],o=Pd(e.config,r);if(!o)continue;let i=w(se[r].code,o,n.message,n.range,n.uri,void 0,Bd(n));t.push({...i,rule:r})}return t}function As(e,t){return De(e,t).replace(/\\/g,"/")}function Nd(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function wd(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let r=As(e,n);if(Nd(r))return r}return As(e,t.uri)}function _s(e){let{project:t,indexResult:n,externalModelDocuments:r,fileDocuments:o,lintEnabled:i,resolvedConfig:s}=e,a=t,u=n.index.mode;return o.map(l=>{let c=wd(a.rootUri,l);if(u==="entrypoints"&&n.index.includeGraph&&l.kind==="bt-document"&&!n.index.reachableDocuments.has(l.uri))return{path:c,uri:l.uri,kind:l.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:l.originalText};let d=u==="single-file"?Me([l,...r],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,m=u==="single-file"?(()=>{let y=J(s,c);return ae(l,{semantic:d,config:y,policy:ee(y)})})():n.index.documentViews.get(l.uri),f=[];if(i){let y=J(s,c);f=Lt(l,d,{config:y,documentView:m});let p=n.index.facts.includeIssuesByUri.get(l.uri)??[];f.push(...Ms({issues:p,config:y}))}return e.input.mode==="check"&&l.kind==="generic-xml"?{path:c,uri:l.uri,kind:l.kind,documentView:m,diagnostics:[],rawDiagnostics:f,skipped:!0,skipReason:"generic-xml",originalText:l.originalText}:{path:c,uri:l.uri,kind:l.kind,documentView:m,diagnostics:f,rawDiagnostics:void 0,skipped:!1,originalText:l.originalText}})}function Ls(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...Ls(n.children));return t}function Md(e,t,n){let r=[],o=[];for(let i of e){let s=Ls(i.nodes);for(let a of s){let u=a.text.trim();if(!u.includes("btxml-disable"))continue;let l=u.match(/\b(BT\d+|BT\d+_[A-Z0-9_]+|CFG\d+_[A-Z0-9_]+|XML\d+_[A-Z0-9_]+)\b/)?.[1],c=u.match(/reason:\s*(.+)$/)?.[1];t&&!c&&o.push({kind:"missing-reason",uri:i.uri,code:l,range:a.range,message:"missing suppression reason"}),u.startsWith("btxml-disable-file")?r.push({uri:i.uri,code:l,file:!0,range:a.range,used:!1,reason:c}):u.startsWith("btxml-disable-next-line")?n&&r.push({uri:i.uri,code:l,line:a.range.end.line+1,range:a.range,used:!1,reason:c}):u.startsWith("btxml-disable")&&n&&r.push({uri:i.uri,code:l,line:a.range.end.line+1,range:a.range,used:!1,reason:c})}}return{suppressions:r,issues:o}}function js(e,t){let n=Md(t.documents??[],!!t.requireReason,t.allowInline!==!1),r=[],o=[];for(let i of e){let s=n.suppressions.find(a=>a.uri===i.uri&&(!a.code||a.code===i.code||i.code.startsWith(a.code))&&(a.file||a.line===i.range?.start.line||a.line===(i.range?.start.line??0)+1));if(s){s.used=!0,o.push(i);continue}r.push(i)}for(let i of n.suppressions)i.used||n.issues.push({kind:"unused",uri:i.uri,code:i.code,range:i.range,message:i.code?`unused suppression for \`${i.code}\``:"unused suppression"});if(t.showSuppressed){let i=o.map(s=>({...s,severity:h.Info,suppressed:!0}));return{diagnostics:[...r,...i],suppressedDiagnostics:o,issues:n.issues}}return{diagnostics:r,suppressedDiagnostics:o,issues:n.issues}}function kr(e,t,n,r=e.resolvedConfig){let o=yt(r.linter.rules,"suppression/require-reason")!=="off";return js(t,{documents:n??e.fileDocuments,requireReason:o,allowInline:r.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function Fs(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Us(e,t){if(!e.input.baseline)return{diagnostics:t,baselineDiagnostics:[],staleEntries:[]};let n=new Set,r=[],o=[];for(let i of t){let s=e.input.baseline.diagnostics.findIndex(a=>a.path===i.uri&&a.code===i.code&&a.messageHash===Fs(i.message)&&a.range?.start?.line===i.range?.start?.line&&a.range?.start?.character===i.range?.start?.character);if(s>=0){n.add(s),o.push(i);continue}r.push(i)}return{diagnostics:r,baselineDiagnostics:o,staleEntries:e.input.baseline.diagnostics.filter((i,s)=>!n.has(s))}}var Os={error:0,warning:1,info:2};function Vs(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function vn(e){return e.flat().sort((t,n)=>{let r=t.uri.localeCompare(n.uri);if(r!==0)return r;let o=t.range?.start.offset??-1,i=n.range?.start.offset??-1;if(o!==i)return o-i;let s=Os[t.severity]-Os[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function qs(e,t,n){let r=t.filter(i=>!i.skipped),o=vn([n,r.flatMap(i=>i.diagnostics)]);return{files:r.length,errors:o.filter(i=>i.severity===h.Error).length,warnings:o.filter(i=>i.severity===h.Warning).length,infos:o.filter(i=>i.severity===h.Info).length,suppressed:0,baselineFiltered:0,staleEntries:[]}}function Ad(e,t){return e.map(({path:n,uri:r,kind:o,diagnostics:i,rawDiagnostics:s,skipped:a,skipReason:u})=>({path:n,uri:r,kind:o,diagnostics:i,rawDiagnostics:t?s:void 0,skipped:a,skipReason:u}))}function $s(e,t){let n=vn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(r=>r.diagnostics)??[]]);return{ok:!Vs(n,e.input.maxWarnings),files:e.files?Ad(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var _d={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},Ld={unused:b.UnusedSuppression,"missing-reason":b.MissingSuppressionReason};function jd(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Fd(e,t){return jd(yt(e.linter.rules,t))}function Dr(e){let t=[];for(let n of e.issues){let r=_d[n.kind],o=Fd(e.config,r);if(!o)continue;let i=w(Ld[n.kind],o,n.message,n.range,n.uri,void 0,n.code?{code:n.code}:void 0);t.push({...i,rule:r})}return t}async function Ud(e){let t=await wi(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=_s(t);let r=kr(t,n);n=[...r.diagnostics,...Dr({issues:r.issues,config:t.resolvedConfig})];let o=r.suppressedDiagnostics.length;for(let u=0;u<t.files.length;u++){let l=t.files[u],c=t.fileDocuments[u];if(l.skipped)continue;let d=J(t.resolvedConfig,l.path),m=kr(t,l.diagnostics,[c],d);l.diagnostics=[...m.diagnostics,...Dr({issues:m.issues,config:d})],l.rawDiagnostics=[...l.diagnostics],o+=m.suppressedDiagnostics.length}let i=0,s=[];for(let u of t.files){if(u.skipped||u.diagnostics.length===0)continue;let l=Us(t,u.diagnostics);u.diagnostics=l.diagnostics,i+=l.baselineDiagnostics.length,l.staleEntries.length>0&&(s=s.concat(l.staleEntries))}t.files=Ni(t.files),t.finalProjectDiagnostics=n;let a=qs(t,t.files,n);return a.suppressed=o,a.baselineFiltered=i,a.staleEntries=s,{...$s(t,a),files:t.files??[]}}async function Ir(e){let t=e.project,n=e.host??t.host,r=e.documents,o=e.externalModelDocuments,i=e.augmentations,s=[...e.projectDiagnostics??[]];if(!r||!o||!i){let a=await _e(e.project,n);r??=a.documents,o??=a.externalModelDocuments,i??=a.augmentations,s=[...s,...a.diagnostics]}return Ud({...e,host:n,documents:r,externalModelDocuments:o,augmentations:i,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}async function Ws(e,t,n){let r=e;for(;;){for(let i of t){let s=Y.join(r,i);if(await n.exists(s))return s}let o=Y.dirname(r);if(o===r)return;r=o}}async function Od(e,t){return Ws(e,["btxml.config.json"],t)}async function Xs(e,t){return JSON.parse(await t.readFile(e))}function zs(e,t){return e.map(n=>w(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function Gs(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await Od(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[w("CFG006_CONFIG_PATH_NOT_FOUND",h.Error,`config file not found \`${t}\``,void 0,t,{help:"check the `--config` path or run without `--config` to use config discovery"})]};try{n=await Xs(t,e.host)}catch(i){let s=String(i.message||i);return{ok:!1,configUri:t,diagnostics:[w("CFG001_INVALID_CONFIG_JSON",h.Error,"invalid configuration JSON",void 0,t,{primaryLabel:"the config file could not be parsed as JSON",help:"fix the JSON syntax in the config file",notes:[s]})]}}}else{let i=await Ws(e.startUri,["package.json"],e.host);if(i)try{let s=await Xs(i,e.host);s.btxml&&(n=s.btxml,t=i)}catch{n={}}}let r=mt(n);if(!r.ok)return{ok:!1,configUri:t,diagnostics:zs(r.diagnostics,t)};let o=qn(r.value);return o.length>0?{ok:!1,configUri:t,diagnostics:zs(o,t)}:{ok:!0,config:r.value,configUri:t,diagnostics:[]}}async function Ks(e,t,n,r){let o=[...n.ignore],i=n.useGitignore?await ar(e,r):[],s=ur(i),a=await Pt(t.files,e,o,n.followSymlinks,void 0,s,r),u=await Pt(t.definitions,e,o,n.followSymlinks,void 0,s,r),l=await Pt(t.augmentations,e,o,n.followSymlinks,void 0,s,r),c=a.files.map(f=>({path:q(e,f),uri:f,kind:"model-xml"})),d=u.files.map(f=>({path:q(e,f),uri:f,kind:"node-definition"})),m=l.files.map(f=>({path:q(e,f),uri:f,kind:"model-augmentation"}));return{modelFiles:c,augmentationFiles:m,definitionFiles:d,unmatchedPatterns:{models:a.unmatchedPatterns,augmentations:l.unmatchedPatterns,definitions:u.unmatchedPatterns}}}async function Vd(e){if(e.configUri)return Y.dirname(e.configUri);let t=e.startUri;for(;;){if(await e.host.exists(Y.join(t,".git"))||await e.host.exists(Y.join(t,".colcon")))return t;let n=Y.dirname(t);if(n===t)return e.startUri;t=n}}async function Cr(e){let t=await Gs({startUri:e.rootUri,configUri:e.configUri,noConfig:e.noConfig,host:e.host});if(!t.ok||!t.config)return{ok:!1,diagnostics:t.diagnostics};let n=pt(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let r=n.config,o=await Vd({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:i,skippedFiles:s}=await Ri(o,r.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],u=t.configUri?q(o,t.configUri):"",l=Ti(r.resolver);for(let p of l){let x=Y.join(o,p.file);await e.host.exists(x)&&!i.some(E=>E.uri===x)&&i.push({path:p.file,uri:x,kind:"bt-xml"})}let{modelFiles:c,augmentationFiles:d,definitionFiles:m,unmatchedPatterns:f}=await Ks(o,r.models,r.files,e.host);for(let p of f.models)a.push(w(b.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${p}\``,void 0,u,{help:"check `models.files` and make sure the file exists"}));for(let p of f.definitions)a.push(w(b.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${p}\``,void 0,u,{help:"check `models.definitions` and make sure the file exists"}));for(let p of f.augmentations)a.push(w(b.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${p}\``,void 0,u,{help:"check `models.augmentations` and make sure the file exists"}));let y=r.models.builtins;return a.push(...await xi(o,l,u,e.host)),{ok:!0,diagnostics:a,project:{rootUri:o,configUri:t.configUri,host:e.host,config:t.config,resolvedConfig:r,selectedFiles:i,entrypoints:l,modelFiles:c,augmentationFiles:d,definitionFiles:m,skippedFiles:s,modelsBuiltins:y}}}function Hs(e){return[...e.files.values()]}function Ys(e){return[...e.reachableDocuments.values()]}function Js(e){return e.workspace}function Zs(e){return[...e.nodeDefinitionModels]}function Qs(e){if(!e.includeGraph)return;let t=new Map;for(let s of e.files.values())s.path&&t.set(s.path,s.uri);let n=[];for(let[s,a]of e.includeGraph.nodes.entries()){let u=a.document?.uri??t.get(s)??s;n.push({path:s,uri:u,exists:a.exists})}let r=e.includeGraph.edges.map(s=>({from:s.from,to:s.to,includeElementRange:s.includeElementRange,includePathRange:s.includePathRange})),o=[];for(let s of e.facts.includeIssuesByUri.values())for(let a of s)o.push({kind:a.kind,uri:a.uri,path:"path"in a?a.path:void 0,message:a.message,range:a.range});let i=[...n];return i.sort((s,a)=>s.path.localeCompare(a.path)),{nodes:i,edges:r,issues:o}}async function Er(e){let t=e.project,n=t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let r=e.host??t.host,o=e.documents,i=e.externalModelDocuments,s=e.augmentations,a=[];if(!o||!i||!s){let l=await _e(e.project,r);a.push(...l.diagnostics),o??=l.documents,i??=l.externalModelDocuments,s??=l.augmentations}let u=await dr({project:e.project,documents:o,activeDocumentUris:new Set(o.map(l=>l.uri)),externalModelDocuments:i,augmentations:s,resolveGraph:e.resolveGraph,resolvedConfig:n,host:r});return a.push(...u.diagnostics),{ok:u.ok,diagnostics:a,semanticIndex:Js(u.index),documents:Hs(u.index),reachableDocuments:Ys(u.index),nodeDefinitionModels:Zs(u.index),includeGraph:Qs(u.index)}}import ea from"path";import{fileURLToPath as Gd,pathToFileURL as ta}from"url";function Kd(e){return e.startsWith("file://")?e:ta(ea.resolve(e)).href}function Pr(e){return Gd(Kd(e))}function nt(e){return ta(ea.resolve(e)).href}function Br(e){return Pr(nr(e))}function na(e){return e?.documents??[]}function Hd(e,t){if(t.uri===e.uri)return!0;if(e.uri.startsWith("file://"))try{let n=new URL(e.uri).pathname;if(t.uri.startsWith("file://")&&new URL(t.uri).pathname===n||t.path&&(t.path.startsWith("file://")?new URL(t.path).pathname:t.path)===n)return!0}catch{return!1}return!1}function Yd(e){let t=Ge();return e?{files:e.files??t.files,resolver:e.resolver??t.resolver,models:e.models??t.models,linter:e.linter??t.linter,formatter:e.formatter??t.formatter}:t}function de(e,t){let n=fe(e.document.text,{kind:e.document.languageId==="btcpp-xml"?"bt-xml":void 0,uri:e.document.uri,mode:"mode"in e?e.mode??"tolerant":"tolerant"}),r="workspace"in e?e.workspace:void 0,o=n.document?[n.document,...na(r).filter(c=>!Hd(e.document,c))]:na(r),i=Yd(e.config||t.config),s=ee(i),a=r?.nodeDefinitionModels??[],u=Me(o,{config:i,models:a,augmentations:t.augmentations}).index,l=n.document?ae(n.document,{semantic:u,config:i,policy:s}):void 0;return{document:e.document,parsed:n.document,documentView:l,diagnostics:n.document?Lt(n.document,u,{config:i,documentView:l}):n.diagnostics,partial:n.partial===!0,semantic:u,config:i,nodeUsagePolicy:s,workspace:r}}function ra(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:I(r,r),newText:n}}function oa(e,t){let r=(t.fullRange?.start||t.range.start).offset;for(;r>0&&/[ \t]/.test(e.text[r-1]||"");)r-=1;return{range:I(e.positionAt(r),e.positionAt(t.range.end.offset)),newText:""}}function ia(e,t,n){let r=Math.max(t.openTagRange.end.offset-(t.selfClosing?2:1),t.openTagRange.start.offset),o=e.positionAt(r);return{range:I(o,o),newText:` ${n}=""`}}function Rn(e){return I(e.positionAt(0),e.positionAt(e.text.length))}function Nr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=Ct(t.document.text,e.config.formatter);o.ok&&!o.skipped&&o.text!==t.document.text&&r.push({title:"Format document",kind:"source.format",edits:[{range:Rn(t.document),newText:o.text}]});for(let i of n){if(!i.range)continue;let s=Q({document:t.document,parsed:e.parsed,position:i.range.start});if(i.code==="BT101_MISSING_REQUIRED_PORT"){let a=Math.min(i.range.start.offset+1,i.range.end.offset),u=e.parsed?.root&&Qe(e.parsed.root,a)||("element"in s?s.element:void 0);if(!u)continue;let l=F(e.semantic,{element:u,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}),c=l.ports.find(d=>d.required&&!l.portUsages.some(m=>m.status==="resolved"&&m.name===d.name));c&&r.push({title:`Add missing port ${c.name}`,kind:"quickfix",diagnostics:[i],edits:[ia(t.document,u,c.name)]})}if(i.code==="BT102_UNKNOWN_PORT"&&"attribute"in s&&"element"in s&&s.attribute){let u=(s.element?F(e.semantic,{element:s.element,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}):void 0)?.portUsages.find(c=>c.status==="undeclared"&&c.attribute===s.attribute),l=u?oa(t.document,s.attribute):void 0;l&&u&&r.push({title:`Remove unknown port ${s.attribute.name}`,kind:"quickfix",diagnostics:[i],edits:[l]})}if(i.code==="BT002_MISSING_BTCPP_FORMAT"&&e.parsed?.root){let a=t.document.positionAt(e.parsed.root.nameRange?.end.offset||e.parsed.root.openTagRange.end.offset-1);r.push({title:'Add BTCPP_format="4" to <root>',kind:"quickfix",diagnostics:[i],edits:[{range:I(a,a),newText:' BTCPP_format="4"'}]})}r.push({title:`Suppress ${i.code} for next line`,kind:"quickfix",diagnostics:[i],edits:[ra(t.document,i.range.start.line,`<!-- btxml-disable-next-line ${i.code} reason: TODO -->
15
- `)]})}return{actions:r}}function U(e,t,n,r,o){return{label:e,kind:t,detail:n,textEdit:r,insertText:e,sortText:e,...o}}function X(e,t){return e?{range:e,newText:t}:void 0}function Pe(e){let t=new Set;return e.filter(n=>{let r=`${n.kind}:${n.label}:${n.insertText||""}`;return t.has(r)?!1:(t.add(r),!0)})}var Jd=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function Zd(e){let t=e?.trim();if(t&&!(t.includes("{")||t.includes("}")))return Jd.test(t)?t:void 0}function Qd(e){let t=e?.trim();if(!t)return;let n=t.startsWith("{")&&t.endsWith("}")?t.slice(1,-1).trim():t;return Zd(n)}function sa(e){return`{${e}}`}function ze(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function aa(e,t){return!e||!t?!1:ze(e)===ze(t)}function ua(e){let t=new Map;for(let n of e.documentView?.nodes??[])for(let r of n.portBindings){if(r.declaredPort.status!=="resolved")continue;let o=r.declaredPort.port;for(let i of r.blackboardReferences){let s=Qd(i.key);if(!s)continue;let a={key:s,type:o.type,direction:o.direction,nodeType:n.usage.nodeType||n.tagName,portName:o.name},u=t.get(s);if(!u){t.set(s,a);continue}let l=ze(u.type),c=ze(a.type);if(l&&c&&l!==c){t.set(s,{...u,conflict:!0});continue}!l&&c&&t.set(s,{...u,type:a.type})}}return[...t.values()]}function em(e,t,n){return I(e.positionAt(t),e.positionAt(n))}function tm(e,t,n){let r=t.valueContentRange;if(!r)return;let o=r.start.offset,i=r.end.offset,s=e.text.slice(o,i),a=s.startsWith("{"),u=s.endsWith("}");if(a&&n>o){let l=o+1,c=u?i-1:i;return{replacementRange:em(e,l,Math.max(l,c)),wrapsReference:!1}}return{insertText:t.value,replacementRange:r,wrapsReference:!0}}function wr(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,s=tm(t,n,r),a=sa(o.key),u=s?.wrapsReference?a:o.key;return U(a,"Reference",i,s?{range:s.replacementRange,newText:u}:void 0,{filterText:`${o.key} ${a}`,insertText:u})}var la=new WeakMap;function rt(e,t){let n=e.parsed?Q({document:e.document,parsed:e.parsed,position:t}):void 0;if(!n||n.kind!=="attribute-value")return;let r=Lr(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,s=jr(r.attribute,i),a=hn({source:r.source,cursorOffset:s});if(a.kind!=="identifier"||s<a.range.start||s>a.range.end)return;let u=fa(e,r),l=u.analysis?.resolvedIdentifiers.find(d=>d.access.range.start===a.range.start&&d.access.range.end===a.range.end&&d.resolution.kind!=="unknown");if(!l||l.resolution.kind==="unknown")return;let c=l.resolution.kind==="symbol"?{kind:"symbol",symbol:l.resolution.symbol}:l.resolution;return{attributeContext:r,range:Mr(e,r,a.range),reference:c,flowState:u,occurrence:{attributeContext:r,identifier:l.access,reference:c,documentRange:Mr(e,r,l.access.range)}}}function ca(e,t){return _r(e,t.attributeContext.behaviorTree).flatMap(r=>rm(e,r).filter(o=>t.reference.kind==="enum"?o.reference.kind==="enum"&&o.reference.name===t.reference.name:om(t.reference.symbol,o.reference)))}function da(e,t){return _r(e,t)}function ma(e,t,n){let r=Lr(e,t,n);if(r)return fa(e,r).environmentBefore}function pa(e){let t=Ar(e.type);switch(e.source.kind){case"port-remap":return`${t} from ${e.source.nodeType??"node"}.${e.source.portName}`;case"subtree-port":return`${t} from ${e.source.nodeType??"SubTree"}.${e.source.portName}`;case"script-assignment":return`${t} from earlier ${e.source.attributeName} declaration`;case"augmentation":return`${t} from augmentation`;case"enum":return`${t} enum`}}function Ar(e){return e.kind==="custom"?e.name:e.kind}function fa(e,t){let r=_r(e,t.behaviorTree).find(o=>o.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function _r(e,t){let n=la.get(e);n||(n=new WeakMap,la.set(e,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(a=>a.element.attributes.flatMap(u=>{let l=Lr(e,a.element,u);return l?[l]:[]})),i=o.map(a=>({id:a.id,source:a.source,attributeName:a.attribute.name,originId:a.id})),s=At({baseEnvironment:nm(e,t.nodes),entries:i}).flatMap((a,u)=>{let l=o[u];return l?[{...a,context:l}]:[]});return n.set(t,s),s}function Lr(e,t,n){let r=e.documentView?.nodes.find(a=>a.element===t);if(!r)return;let o=r.usage.model.status==="resolved"?r.usage.model.model.id:r.usage.nodeType;if(!je({elementName:t.name,attributeName:n.name,resolvedNodeType:o}))return;let s=t.attributes.indexOf(n);return{id:`${r.path.join(".")}:${n.name}:${s}`,node:r,element:t,attribute:n,source:n.value,behaviorTree:r.behaviorTree}}function nm(e,t){let n=Z(e.semantic),r=[],o=t[0]?.behaviorTree.id;if(o){let i=ne(e.semantic,o);if(i?.kind==="SubTree")for(let s of i.ports){let a=s.effectiveType??s.type,l=te(e.semantic,a)?.canonical??a;r.push({name:s.name,type:Ve(n,a),source:{kind:"subtree-port",nodeType:o,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:l})}}for(let i of t){let s=i.usage.model.status==="resolved"?i.usage.model.model.id:i.usage.nodeType;for(let a of i.portBindings){if(a.declaredPort.status!=="resolved")continue;let u=im(a);if(!u)continue;let l=a.declaredPort.port.type,d=te(e.semantic,l)?.canonical??l,m=a.declaredPort.port.direction;r.push({name:u,type:Ve(n,l),source:{kind:"port-remap",nodeType:s,portName:a.declaredPort.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:d})}}return Mt({symbols:r,augmentations:Tt(e.semantic),areTypesCompatible:(i,s)=>i&&s?Re(e.semantic,i,s):!0})}function rm(e,t){return t.analysis?t.analysis.resolvedIdentifiers.flatMap(n=>{if(n.resolution.kind==="unknown")return[];let r=n.resolution.kind==="symbol"?{kind:"symbol",symbol:n.resolution.symbol}:n.resolution;return[{attributeContext:t.context,identifier:n.access,reference:r,documentRange:Mr(e,t.context,n.access.range)}]}):[]}function om(e,t){if(t.kind!=="symbol")return!1;let n=t.symbol;return e.source.kind==="script-assignment"||n.source.kind==="script-assignment"?e.source.kind==="script-assignment"&&n.source.kind==="script-assignment"&&e.name===n.name&&e.source.originId===n.source.originId&&e.source.range.start===n.source.range.start&&e.source.range.end===n.source.range.end:(e.source.kind==="port-remap"||e.source.kind==="subtree-port")&&e.source.kind===n.source.kind?e.name===n.name&&e.source.portName===n.source.portName&&e.source.nodeType===n.source.nodeType:e.name===n.name&&e.source.kind===n.source.kind}function Mr(e,t,n){return ke(e.parsed??{originalText:e.document.text},t.attribute,n)}function jr(e,t){let n=e.valueOffsets;if(!n||n.length===0)return t;if(t<=0)return 0;for(let r=1;r<n.length;r+=1){let o=n[r];if(o!==void 0&&o>=t){let i=n[r-1]??0;return t<=i?r-1:r}}return Math.max(0,n.length-1)}function ga(e,t,n){let r=e.parsed??{originalText:e.document.text};return ke(r,t,n)}function im(e){if(e.declaredPort.status==="resolved")return K(e.declaredPort.port.name,e.value)}function sm(e,t,n){let r=e.documentView?.nodes.find(i=>i.element===t)?.usage,o=r?.model.status==="resolved"?r.model.model.id:r?.nodeType;return je({elementName:t.name,attributeName:n.name,resolvedNodeType:o})}function ya(e,t,n,r){let o=sm(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,s=ma(e,n,r),a=Math.max(0,t.position.offset-i.start.offset);return Tr({source:r.value,cursorOffset:jr(r,a),environment:s,attributeName:r.name,attributeInfo:o}).map(l=>am(e,r,l))}function am(e,t,n){return U(n.label,um(n.kind),n.detail,{range:ga(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function um(e){switch(e){case"identifier":return"Variable";case"enum":return"Enum";case"value":return"Value";case"operator":return"Keyword";case"snippet":return"Snippet"}}var Tn={enumLiteral:"0",boolLiteral:"1",matchingKey:"2",unknownKey:"3"};function ha(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function Sa(e,t){if(!e)return;let n=ha(e)?e.valueContentRange:e.valueRange;if(n)return X(n,ha(e)?t:`"${t}"`)}function ba(e,t,n,r){let o=[],i=[];for(let s of Te(e)){let a=H(e,s),u=U(s,"Value","BehaviorTree ID",r?Sa(r,s):X(n,s));a.some(l=>l.uri===t)?o.push({...u,sortText:`0-${s}`}):i.push({...u,sortText:`1-${s}`})}return[...o,...i]}function lm(e){return U("SubTree","Class","Built-in subtree tag",X(e,"SubTree"),{sortText:"0-SubTree"})}function cm(e){if(e.kind!=="closing-tag-name")return[];let t=e.tagText;if(!t)return[];let n=e.tagNamePrefix||"";return t.toLowerCase().startsWith(n.toLowerCase())?[U(`${t}>`,"Value","Close current parent tag",X(e.replacementRange,`${t}>`))]:[]}function dm(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(o=>U(o,"Class",void 0,X(t,o))),...["Action","Condition","Control","Decorator"].map(o=>U(o,"Class",void 0,X(t,o))),lm(t)],r=new Set;for(let o of Yt(e))o.id!=="SubTree"&&(r.has(o.id)||(r.add(o.id),n.push(U(o.id,"Class",void 0,X(t,o.id)))));return Pe(n)}function xn(e,t,n){return F(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function Fr(e,t){let n=new Set(e.element.attributes.map(r=>r.name));return e.ports.filter(r=>!n.has(r.name)).map(r=>U(r.name,"Property",`${r.direction}${r.type?` ${r.type}`:""}`,X(t,r.name)))}function mm(e,t,n){let r=[U("ID","Property",void 0,X(n,"ID"))];return r.push(...Fr(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function pm(e,t,n,r){if(!e)return[];if(Ae(e.name)){let i=[];e.attributes.some(a=>a.name==="ID")||i.push(U("ID","Property",void 0,X(r,"ID")));let s=xn(n,t,e);return i.push(...Fr(s,r)),i}return e.name==="SubTree"?mm(e,xn(n,t,e),r):e.name==="include"?[U("path","Property",void 0,X(r,"path"))]:Fr(xn(n,t,e),r)}function fm(e,t,n,r){return ba(t.semantic,e.document.uri,n,r)}function gm(e,t,n,r){let o=[],i=new Set;for(let s of Yt(e))s.kind===t&&(i.has(s.id)||(i.add(s.id),o.push(U(s.id,"Value",`${t} node ID`,r?Sa(r,s.id):X(n,s.id)))));return o}function ym(e,t,n){if(t.kind!=="attribute-value")return[];let{attribute:r,element:o}=t;if(!r||!o)return[];let i=Ae(o.name);if(i&&r.name==="ID")return gm(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return fm(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return ba(n.semantic,e.document.uri,r.valueContentRange||r.valueRange,r);if(o.name==="include"&&r.name==="path")return(n.workspace?n.workspace.documents.map(N=>N.path||N.uri).filter(N=>N.endsWith(".xml")):[]).map(N=>U(N,"File","XML file",X(r.valueContentRange||r.valueRange,N)));let s=ya(n,e,o,r);if(s)return s;let a=xn(n,e,o);if(i&&a.model.status!=="resolved")return[];let u=pe(n.semantic,{element:o,documentRoot:n.parsed?.root,attributeName:r.name,uri:e.document.uri,config:n.config,policy:n.nodeUsagePolicy});if(u?.status!=="resolved")return[];let l=u.port,c=r.valueContentRange||r.valueRange,d=[];l.enum?.length&&d.push(...l.enum.map(k=>U(k,"Enum",l.type,X(c,k),{sortText:`${Tn.enumLiteral}-${k}`}))),(l.type||"").toLowerCase()==="bool"&&d.push(...["true","false"].map(k=>U(k,"Value","bool",X(c,k),{sortText:`${Tn.boolLiteral}-${k}`})));let m=ua(n),f=ze(l.type),y=m.filter(k=>!k.conflict&&aa(l.type,k.type)),p=m.filter(k=>!k.conflict&&!ze(k.type)&&f),x=y.map(k=>({...wr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:k,detail:`${k.type||"unknown"} blackboard key from ${k.nodeType}.${k.portName}`}),sortText:`${Tn.matchingKey}-${k.key}`})),E=p.map(k=>({...wr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:k,detail:`unknown-type blackboard key from ${k.nodeType}.${k.portName}`}),sortText:`${Tn.unknownKey}-${k.key}`}));return d.push(...x),d.push(...E),d.length>0?Pe(d):(t.valuePrefix||"").includes("{")?Pe(d):d}function Ur(e,t){let n=Q({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:Un.map(r=>U(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:Pe(ym(t,n,e))}:n.kind==="attribute-name"?{items:Pe(pm(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:Pe(dm(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:Pe(cm(n))}:{items:[]}}function kn(e,t,n,r,o,i,s){if(!e)return[];let a=Q({document:{uri:e.uri,languageId:"xml",version:0,text:e.originalText,positionAt:()=>n,offsetAt:()=>n.offset,getText:()=>e.originalText},parsed:e,position:n}),u="element"in a?a.element:void 0,l="attribute"in a?a.attribute:void 0,c=u?F(r,{element:u,documentRoot:e.root,uri:e.uri,config:o,policy:i}):void 0;if(u?.name==="SubTree"&&l?.name==="ID"){let d=c?.subtree?.target;if(d?.status==="resolved"&&d.kind==="behavior-tree"){let m=d.behaviorTree;if(m.idRange)return[{uri:m.uri,range:m.idRange}]}return d?.status==="ambiguous"?[...d.behaviorTrees,...d.definitions].map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:m.range?{uri:m.uri||e.uri,range:m.range}:void 0).filter(m=>!!m):d?.status==="resolved"&&d.kind==="node-model"&&d.model.idRange?[{uri:d.model.uri||e.uri,range:d.model.idRange}]:[]}if(u?.name==="root"&&l?.name==="main_tree_to_execute")return H(r,l.value).map(d=>d.idRange?{uri:d.uri,range:d.idRange}:void 0).filter(d=>!!d);if(u?.name==="include"&&l?.name==="path"&&s){let d=s.find(m=>m.uri===l.value||m.path===l.value||(m.path?m.path.endsWith(`/${l.value}`):!1));if(d?.root?.range)return[{uri:d.uri,range:d.root.range}]}if(l&&u){let d=t?Je(t,n):void 0;if(d?.declaredPort.status==="resolved"){let m=d.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(a.kind==="tag-name"&&u&&c?.model.status==="resolved"){let d=c.model.model;if(d.idRange)return[{uri:d.uri||e.uri,range:d.idRange}];if(d.range)return[{uri:d.uri||e.uri,range:d.range}]}if(l?.name==="ID"&&c?.tagForm==="generic-node"&&c.model.status==="resolved"){let d=c.model.model;if(d.idRange)return[{uri:d.uri||e.uri,range:d.idRange}];if(d.range)return[{uri:d.uri||e.uri,range:d.range}]}return[]}function Or(e,t){let n=rt(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let o=r.source,s=da(e,n.attributeContext.behaviorTree).find(a=>a.id===o.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:ke(e.parsed??{originalText:e.document.text},s.attribute,o.range)}]}}if(r.source.kind==="port-remap"){let o=r.source,i=e.documentView?.nodes.filter(a=>a.behaviorTree===n.attributeContext.behaviorTree).flatMap(a=>a.portBindings).filter(a=>a.declaredPort.status==="resolved").find(a=>a.declaredPort.port.name===o.portName&&a.declaredPort.port.direction===o.direction&&K(a.declaredPort.port.name,a.value)===r.name),s=i?.declaredPort.port.nameRange;if(s)return{locations:[{uri:i.declaredPort.port.uri||e.document.uri,range:s}]}}if(r.source.kind==="subtree-port"){let o=r.source,s=(o.nodeType?ne(e.semantic,o.nodeType):void 0)?.ports.find(a=>a.name===o.portName&&a.direction===o.direction);if(s?.nameRange)return{locations:[{uri:s.uri||e.document.uri,range:s.nameRange}]}}}return{locations:kn(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function Vr(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function va(e,t){let n=Ct(e.document.text,{indentWidth:t?.indentWidth,xmlDeclaration:t?.xmlDeclaration,blankLineBetweenBehaviorTrees:t?.blankLineBetweenBehaviorTrees,lineEnding:t?.lineEnding});return!n.ok||n.skipped?{edits:[],diagnostics:n.diagnostics}:n.text===e.document.text?{edits:[],diagnostics:[]}:{edits:[{range:Rn(e.document),newText:n.text}],diagnostics:[]}}function qr(e,t){return va(t,e.config.formatter)}function Ra(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
12
+ `))&&(c=`\r
13
+ `);let u=a.join(c),d=c.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${d})+$`,"u"),g=`${u.replace(p,"")}${c}`;return{ok:!0,text:g,changed:g!==e,skipped:!1,diagnostics:n.diagnostics.filter(f=>f.severity!==b.Error)}}function st(e,t){if(!(!H(e.range,t)&&!H(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=st(n,t);if(r)return r}return e}}var wi=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,gu=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function yu(e,t){let n=[],r=0;for(;r<t;){let o=e.indexOf("<",r);if(o<0||o>=t)break;if(e.startsWith("<!--",o)){let c=e.indexOf("-->",o+4);if(c<0||c+3>t)break;r=c+3;continue}if(e.startsWith("<![CDATA[",o)){let c=e.indexOf("]]>",o+9);if(c<0||c+3>t)break;r=c+3;continue}if(e.startsWith("<?",o)){let c=e.indexOf("?>",o+2);if(c<0||c+2>t)break;r=c+2;continue}if(e.startsWith("<!",o)){let c=e.indexOf(">",o+2);if(c<0||c+1>t)break;r=c+1;continue}if(e[o+1]==="/"){let u=e.slice(o+2).match(wi)?.[0];if(u){for(let p=n.length-1;p>=0;p-=1)if(n[p]===u){n.length=p;break}}let d=e.indexOf(">",o+2);if(d<0||d>=t)break;r=d+1;continue}let s=e.slice(o+1).match(/^\s*([A-Za-z_:][A-Za-z0-9_.:-]*)/)?.[1];if(!s){r=o+1;continue}let a=e.indexOf(">",o+1);if(a<0||a>=t)break;e.slice(o+1,a).trimEnd().endsWith("/")||n.push(s),r=a+1}return n.at(-1)}function mn(e,t){let n=e.positionAt(t);return D(n,n)}function se(e,t,n){return D(e.positionAt(t),e.positionAt(n))}function fn(e){return{name:e.name,value:e.value,range:se(e.document,e.nameStart,e.valueEnd),fullRange:se(e.document,e.nameStart,e.valueEnd),nameRange:se(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?se(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:se(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?se(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function bu(e,t,n){let r=[];for(let o of t.matchAll(gu)){let i=o.index??0,s=o[1],a=o[2],l=o[3],c=o[4],u=o[0].indexOf(s),d=o[0].indexOf("=",u+s.length),p=o[0].indexOf(a,d+1),m=n+i+p,g=m+a.length;r.push(fn({document:e,name:s,value:l??c??"",nameStart:n+i+u,nameEnd:n+i+u+s.length,equalsStart:n+i+d,equalsEnd:n+i+d+1,valueStart:m,valueEnd:g,valueContentStart:m+1,valueContentEnd:g-1}))}return r}function hu(e,t){let n=Math.max(0,t-4e3),r=e.text.slice(n,t),o=r.lastIndexOf("<"),i=r.lastIndexOf(">");if(o<0||o<i||!r.startsWith("</",o))return;let s=n+o,a=r.slice(o+2);if(!/\s/.test(a))return{kind:"closing-tag-name",tagNamePrefix:a,replacementRange:se(e,s+2,t)}}function Ni(e,t){let n=Math.max(0,t-4e3),r=e.text.slice(n,t),o=r.lastIndexOf("<"),i=r.lastIndexOf(">");if(o<0||o<i)return;let s=n+o,a=s+1,l=r.slice(o+1);if(/^\s*[!?/]/.test(l))return;let c=l.match(/^\s*/)?.[0].length??0,u=l.slice(c).match(wi);if(!u)return{kind:"tag-name"};let d=u[0],p=c,m=p+d.length,g=se(e,a+p,a+m),f={kind:"element",name:d,attributes:bu(e,l,a),children:[],range:se(e,s,t),fullRange:se(e,s,t),openTagRange:se(e,s,t),startTagRange:se(e,s,t),nameRange:g,selfClosing:!1};if(l.length<=m&&!/\s/.test(l.slice(m)))return{kind:"tag-name",element:f,replacementRange:g};let x=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(x){let E=x[0].indexOf(x[1]),y=(x.index??0)+E,h=y+x[1].length,R=l.indexOf("=",h),T=x[2],A=x[4]??"";if(T){let F=l.indexOf(T,R+1),ve=a+F+1,v=fn({document:e,name:x[1],value:x[3]??"",nameStart:a+y,nameEnd:a+h,equalsStart:a+R,equalsEnd:a+R+1,valueStart:a+F,valueEnd:t,valueContentStart:ve,valueContentEnd:t});return{kind:"attribute-value",element:f,attribute:v,valuePrefix:e.text.slice(ve,t)}}let j=A.length>0?t-a-A.length:t-a;return{kind:"attribute-value",element:f,attribute:fn({document:e,name:x[1],value:A,nameStart:a+y,nameEnd:a+h,equalsStart:a+R,equalsEnd:a+R+1,valueStart:a+j,valueEnd:t,valueContentStart:a+j,valueContentEnd:t}),valuePrefix:e.text.slice(a+j,t)}}let B=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)?$/s);if(B){let k=B[1]??"",E=t-a-k.length;return{kind:"attribute-name",element:f,attribute:fn({document:e,name:k,value:"",nameStart:a+E,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:f,attribute:{name:"",value:"",range:mn(e,t),fullRange:mn(e,t),nameRange:mn(e,t),valueRange:mn(e,t)}}}function ne(e){let{document:t,parsed:n,position:r}=e,o=r.offset,i=t.text.length>0?{kind:"text"}:{kind:"unknown"},s=hu(t,o);if(s)return{kind:"closing-tag-name",tagNamePrefix:s.tagNamePrefix,replacementRange:s.replacementRange,tagText:yu(t.text,o)};if(n?.root){let c=st(n.root,o);if(c){for(let u of c.attributes){if(H(u.nameRange,o))return{kind:"attribute-name",element:c,attribute:u};if(H(u.valueRange,o)||H(u.valueContentRange,o))return{kind:"attribute-value",element:c,attribute:u,valuePrefix:u.valueContentRange&&o>=u.valueContentRange.start.offset?t.text.slice(u.valueContentRange.start.offset,o):""}}if(H(c.nameRange||c.openTagRange,o))return{kind:"tag-name",element:c,replacementRange:c.nameRange};if(H(c.openTagRange,o)){let u=Ni(t,o);if(u)return u.kind==="tag-name"?{...u,element:u.element??c}:u}i={kind:"element",element:c}}}let a=Ni(t,o);if(a)return a;let l=t.text.slice(Math.max(0,o-200),o);return/<!--\s*btxml-disable-next-line\s+[A-Z0-9_]*$/.test(l)?{kind:"comment"}:i}function gn(e,t){let n=e.valueOffsets;return!n||n.length===0?t:t<=0?0:t>=n.length?n[n.length-1]??0:n[t]??0}function Te(e,t,n){let r=t.valueContentRange??t.valueRange,o=gn(t,n.start),i=gn(t,n.end),s=q(e.originalText,r.start.offset+o),a=q(e.originalText,r.start.offset+i);return D(s,a)}function fr(e){return e.rootUri}function gr(e){return e.resolvedConfig}var Mi={InvalidJson:S.InvalidAugmentationJson,InvalidSchema:S.InvalidAugmentationSchema};function Su(e){return w(e.code,b.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function vu(e,t){return t.issues.map(n=>Su({filePath:e,code:n.kind==="json"?Mi.InvalidJson:Mi.InvalidSchema,message:n.kind==="json"?`invalid augmentation JSON \`${e}\``:`invalid augmentation schema \`${e}\``,range:n.range,primaryLabel:n.message,help:n.kind==="json"?`fix the JSON syntax in \`${e}\``:n.path?`fix the schema issue at \`${n.path}\``:"fix the schema issue in the file",notes:n.notes}))}async function yn(e){let t=e.project,n=e.host??t.host,r=[],o=[];for(let i of t.augmentationFiles){if(!await n.exists(i.uri)){r.push(w(S.AugmentationFileNotFound,b.Error,`model augmentation file not found \`${i.path}\``,void 0,i.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(i.uri),a=Wn(s,{uri:i.uri,path:i.path});if(!a.ok){r.push(...vu(i.path,a));continue}o.push(a.data)}return{ok:r.every(i=>i.severity!==b.Error),augmentations:o,diagnostics:r}}function Ru(e){let t=e.root;if(!t)return;if(t.name==="TreeNodesModel")return{...e,kind:"model-document",isBtXml:!0};let n=t.children.find(o=>o.kind==="element"&&o.name==="TreeNodesModel");if(!n)return;let r=e.nodes.flatMap(o=>o===t?t.children.filter(i=>i===n||i.kind==="comment"):o.kind==="comment"?[o]:[]);return{...e,kind:"model-document",root:n,nodes:r,isBtXml:!0}}async function ku(e,t){return ye(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function yr(e,t){if(!await t.exists(e.uri))return{diagnostics:[w(S.ExternalModelFileNotFound,b.Error,`external TreeNodesModel file not found \`${e.path}\``,void 0,e.path,{help:"check `models.files` and make sure the file exists"})]};let n=await ku(e,t);if(!n.document||n.diagnostics.some(o=>o.severity===b.Error)){let o=n.diagnostics[0];return{diagnostics:[w(S.ExternalModelXmlParseError,b.Error,`failed to parse external TreeNodesModel file \`${e.path}\``,n.diagnostics[0]?.range,e.path,{primaryLabel:"the external model file is not valid XML",help:`fix the XML syntax in \`${e.path}\` before using it as an external model file`,notes:o?[`first XML error: ${o.code} ${o.message}`]:void 0})]}}let r=Ru(n.document);return r?{document:r,diagnostics:[]}:{diagnostics:[w(S.MissingTreeNodesModel,b.Error,"missing `<TreeNodesModel>` in external model file",n.document.root?.range,e.path,{primaryLabel:"this file does not contain a `<TreeNodesModel>` element",help:"add a `<TreeNodesModel>` element or remove the file from `models.files`"})]}}async function Ve(e,t){let n=e,r=t??n.host,o=[];for(let c of n.selectedFiles){if(!await r.exists(c.uri))continue;let u=await r.readFile(c.uri),d=ye(u,{uri:c.uri,path:c.path});d.document&&o.push(d.document)}let i=await Promise.all(n.modelFiles.map(c=>yr(c,r))),s=await yn({project:e,host:r}),a=i.flatMap(c=>c.diagnostics),l=i.flatMap(c=>c.document?[c.document]:[]);return{documents:o,externalModelDocuments:l,augmentations:[...s.augmentations],diagnostics:[...a,...s.diagnostics]}}function Tu(e){return e.endsWith("/")?e:`${e}/`}function xu(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):br(e.split("/"))}function br(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function qe(e,t={}){let n=e.replace(/\\/g,"/"),r=s=>xu(s,t.preserveDotSegments),o=/^(?<scheme>[A-Za-z][A-Za-z\d+.-]*):\/\/(?<authority>[^/]*)(?<path>\/.*)?$/.exec(n);if(o?.groups)return{scheme:o.groups.scheme,authority:o.groups.authority,absolute:!0,segments:r(o.groups.path||"/")};let i=/^(?<drive>[A-Za-z]:)(?<rest>\/.*)?$/.exec(n);return i?.groups?{authority:i.groups.drive,absolute:!0,segments:r(i.groups.rest||"/")}:{absolute:n.startsWith("/"),segments:r(n)}}function bn(e){let n=br(e.segments).join("/");if(e.scheme){let r=`${e.scheme}://${e.authority??""}`;return n?`${r}/${n}`:`${r}/`}return e.authority&&e.absolute?n?`${e.authority}/${n}`:`${e.authority}/`:e.absolute?n?`/${n}`:"/":n}function Iu(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Lt(e){return bn(qe(e))}function Du(e,...t){let n=qe(e),r=[...n.segments];for(let o of t){let i=qe(o,{preserveDotSegments:!0});if(i.scheme||i.absolute&&i.authority)return Lt(o);i.absolute&&(r.length=0),r.push(...i.segments)}return bn({...n,segments:br(r)})}function Cu(e){let t=qe(e);return t.segments.length===0?bn(t):bn({...t,segments:t.segments.slice(0,-1)})}function Bu(e){return qe(e).segments.at(-1)??""}function Eu(e,t){let n=qe(e),r=qe(t);if(!Iu(n,r))return Lt(t);let o=0;for(;o<n.segments.length&&o<r.segments.length&&n.segments[o]===r.segments[o];)o+=1;let i=new Array(n.segments.length-o).fill(".."),s=r.segments.slice(o);return[...i,...s].join("/")}function Pu(e,t){let n=Tu(Lt(e)),r=Lt(t);return r===n.slice(0,-1)||r.startsWith(n)}var Q={normalize:Lt,join:Du,dirname:Cu,basename:Bu,relative:Eu,isWithin:Pu};function be(e,...t){return Q.join(e,...t)}function Ai(e){return Q.dirname(e)}function _i(e){return Q.basename(e)}function Ee(e,t){return Q.relative(e,t)}function Li(e,t){return Q.isWithin(e,t)}import Nu from"ignore";function hr(e){return e.replace(/\\/g,"/")}function $(e,t){return hr(Ee(e,t))}function wu(e){let t=e.replace(/\\/g,"/"),n="^";for(let r=0;r<t.length;r+=1){let o=t[r],i=t[r+1],s=t[r+2];if(o==="*"&&i==="*"&&s==="/"){n+="(?:.*/)?",r+=2;continue}if(o==="*"&&i==="*"){n+=".*",r+=1;continue}if(o==="*"){n+="[^/]*";continue}if(o==="?"){n+="[^/]";continue}".+-^${}()|[]\\".includes(o)?n+=`\\${o}`:n+=o}return n+="$",new RegExp(n)}function Pe(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");return!r.includes("*")&&!r.includes("?")?n===r||_i(n)===r:wu(r).test(n)}function Mu(e){return e.includes("*")||e.includes("?")}async function ji(e,t,n,r,o,i,s,a){let l=$(n,t);if(l&&r.some(u=>Pe(l,u)||Pe(`${l}/`,u)||Pe(`${l}/dummy`,u))||a&&l&&a.ignores(l))return;let c;try{c=await e.readDir(t)}catch{return}for(let u of c){let d=be(t,u.name),p=u.type==="directory",m=u.type==="file";if(u.type==="other"&&i&&e.realpath)try{let g=await e.realpath(d);if(s.has(g))continue;s.add(g);let f=await e.stat(g);p=f?.type==="directory",m=f?.type==="file"}catch{continue}p?await ji(e,d,n,r,o,i,s,a):m&&o.push(d)}}async function jt(e,t,n,r,o,i,s){let a=new Set,l=new Set,c=[],u=o??t;for(let p of e){let m=be(u,p);if((await s.stat(m))?.type==="file"){let g=$(t,m),f=!g.startsWith("..");!n.some(x=>Pe(g,x))&&(!f||!i?.ignores(g))&&a.add(m);continue}if(!Mu(p)){l.add(p);continue}c.push(p)}let d=[];if(c.length>0&&await s.exists(t)){let p=new Set([s.realpath?await s.realpath(t):t]);await ji(s,t,t,n,d,r,p,i)}for(let p of d){let m=$(u,p);c.some(g=>Pe(m,g))&&(n.some(g=>Pe($(t,p),g))||i?.ignores($(t,p))||a.add(p))}for(let p of c)d.some(g=>{let f=$(u,g);return Pe(f,p)&&!n.some(x=>Pe($(t,g),x))&&!i?.ignores($(t,g))})||l.add(p);return{files:[...a].sort((p,m)=>$(t,p).localeCompare($(t,m))),unmatchedPatterns:[...l].sort()}}async function Au(e,t){let n=be(e,".gitignore");return await t.exists(n)?(await t.readFile(n)).split(/\r?\n/).map(o=>o.trim()).filter(o=>o&&!o.startsWith("#")):[]}function _u(e){return Nu().add(e)}async function Fi(e,t,n,r,o){let i=[...t.ignore],s=t.useGitignore?await Au(e,o):[],a=_u(s),l=n?.length?n:t.include,c=await jt(l,e,i,t.followSymlinks,n?.length?r:void 0,a,o),u=t.maxSize,d=[],p=[];for(let m of c.files){let g=$(e,m),f=await o.stat(m);if(f){if((f.size??0)>u){p.push({path:g,reason:"too-large"});continue}d.push({path:g,uri:m,kind:"unknown"})}}return{selectedFiles:d,skippedFiles:p,unmatchedPatterns:c.unmatchedPatterns}}function Oi(e){return e.entrypoints.map(t=>({file:hr(t)}))}function Sr(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function Ui(e,t,n,r){let o=[];for(let i of t)await r.exists(be(e,i.file))||o.push(w(S.EntrypointNotFound,b.Error,`entrypoint file not found \`${i.file}\``,void 0,n,{help:"check `resolver.entrypoints` and make sure the file exists under the project root"}));return o}function Vi(e,t){return e.attributes.find(n=>n.name===t)}function qi(e,t){return Ee(e,t).replace(/\\/g,"/")}function Lu(e,t,n,r,o){return e.replace(/\$\{([^}]+)\}/g,(i,s)=>s.startsWith("env:")?process.env[s.slice(4)]??i:t[s]!==void 0?t[s]:(n.push({kind:"unresolved-variable",uri:o,variable:s,range:r,message:`unresolved include path variable \`${s}\``}),i))}function ju(e,t){let n=t.resolvedConfig.resolver.includes.elements.map(i=>({name:i.name,pathAttribute:i.attribute,base:i.base==="project-root"?"project-root":"current-file"})),r=e.root;if(!r)return[];let o=[];for(let i of r.children||[]){if(i.kind!=="element")continue;let s=n.find(a=>a.name===i.name);s&&o.push({element:i,pathAttr:Vi(i,s.pathAttribute),rosPackageAttr:Vi(i,"ros_pkg"),base:s.base??"current-file"})}return o}async function $i(e){let t=e.project,n=e.host??t.host,r=e.resolvedConfig.resolver.includes.allowOutsideRoot,o=e.resolvedConfig.resolver.includes.maxDepth,i=e.resolvedConfig.resolver.includes.maxFiles,s=[],a=new Map(e.documents.map(f=>[qi(t.rootUri,f.path||f.uri),f])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},c=new Map,u=new Set,d=t.entrypoints.length?t.entrypoints.map(f=>f.file):t.selectedFiles.map(f=>f.path);l.entrypointFiles=[...new Set(d)];let p=new Set,m=new Set,g=async(f,x,B)=>{if(x.length>=o){s.push({kind:"depth-exceeded",uri:B?.uri??f,path:f,range:B?.range,message:`include \`${f}\` exceeds the configured maximum include depth`});return}if(l.reachableFiles.size>=i){s.push({kind:"too-many-files",uri:B?.uri??f,path:f,range:B?.range,message:`resolving \`${f}\` would exceed the configured file limit`});return}let k=f.replaceAll("\\","/");if(p.has(k)){let T=[...x.slice(x.indexOf(k)),k];l.cycles.push({files:T}),s.push({kind:"cycle",uri:B?.uri??k,path:k,cycle:T,range:B?.range,message:"include cycle detected"});return}if(m.has(k))return;p.add(k),l.reachableFiles.add(k);let E=be(t.rootUri,k);u.add(E);let y=await n.exists(E),h=a.get(k);!h&&y&&(h=ye(await n.readFile(E),{uri:E,path:k}).document,h&&a.set(k,h)),l.nodes.set(k,{path:k,document:h,exists:y}),h&&c.set(h.uri,h);let R=h?.uri??E;if(!y){s.push({kind:"not-found",uri:B?.uri??R,path:k,range:B?.range,message:`include file not found \`${k}\``}),p.delete(k);return}if(!h){p.delete(k);return}for(let T of ju(h,e)){if(!T.pathAttr){s.push({kind:"missing-path",uri:R,range:T.element.range,message:"missing include path"});continue}let A=Lu(T.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,T.pathAttr.range,R),j;if(T.rosPackageAttr){let M=T.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:R,packageName:M,range:T.rosPackageAttr.range,message:`include uses ros_pkg=\`${M}\` but ProjectHost.resolvePackageUri is not available`});continue}let _=await n.resolvePackageUri(M);if(!_){s.push({kind:"ros-package-not-found",uri:R,packageName:M,path:A,range:T.rosPackageAttr.range,message:`ROS package \`${M}\` could not be resolved for include path \`${A}\``});continue}j=be(_,A)}else{let M=T.base==="project-root"?t.rootUri:Ai(E);j=be(M,A)}let F=qi(t.rootUri,j),ve=j;try{await n.exists(j)&&(ve=n.realpath?await n.realpath(j):j)}catch{}if(!Li(t.rootUri,ve)){if(!r){s.push({kind:"outside-root",uri:R,path:F,range:T.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:R,path:F,range:T.pathAttr.range,message:`external include used \`${A}\``})}l.edges.push({from:k,to:F,includeElementRange:T.element.range,includePathRange:T.pathAttr.range}),await g(F,[...x,k],{uri:R,range:T.pathAttr.range})}p.delete(k),m.add(k)};for(let f of l.entrypointFiles)await g(f,[]);return{graph:l,reachableUris:u,reachableDocuments:c,issues:s}}import{findNodeAtLocation as Xi,parse as Fu,parseTree as Ou}from"jsonc-parser";function Uu(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
14
+ `&&t.push(n+1);return n=>{let r=0,o=t.length-1;for(;r<=o;){let s=Math.floor((r+o)/2);t[s]<=n?r=s+1:o=s-1}let i=Math.max(0,r-1);return{line:i,character:n-t[i],offset:n}}}function zi(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function Wi(e){let t=e.project,n=e.host??t.host,r=[],o=[],i=new Set;for(let s of t.definitionFiles){if(!await n.exists(s.uri)){r.push(w(S.NodeDefinitionFileNotFound,b.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,l=await n.readFile(s.uri),c=[],u=Ou(l,c,{allowTrailingComma:!0,disallowComments:!1});try{if(a=Fu(l,c,{allowTrailingComma:!0,disallowComments:!1}),c.length>0||!u)throw new Error(`JSON parse error at offset ${c[0]?.offset??0}`)}catch(p){let m=String(p.message||p);r.push(w(S.InvalidNodeDefinitionJson,b.Error,`invalid node definition JSON \`${s.path}\``,void 0,"",{primaryLabel:"the file could not be parsed as JSON",help:`fix the JSON syntax in \`${s.path}\``,notes:[m]}));continue}let d=Gn.safeParse(a);if(!d.success){for(let p of d.error.issues){let m=p.code==="unrecognized_keys"?p.keys.map(g=>({label:`Unrecognized key: "${g}"`,path:[...p.path,g].join(".")})):[{label:p.message,path:p.path.join(".")}];for(let{label:g,path:f}of m)r.push(w(S.InvalidNodeDefinitionSchema,b.Error,`invalid node definition schema \`${s.path}\``,void 0,"",{primaryLabel:g,help:f?`fix the schema issue at \`${f}\``:"fix the schema issue in the file",notes:f?[f]:[]}))}continue}for(let[p,m]of Object.entries(d.data.nodes)){i.has(p)&&r.push(w(S.DuplicateNodeDefinitionId,b.Error,`duplicate node definition ID \`${p}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),i.add(p);let g=Uu(l),f=zi(Xi(u,["nodes",p]),g),x=ft(p,m),B=x.ports.map(k=>{let E=zi(Xi(u,["nodes",p,"ports",k.name]),g);return{...k,source:"node-definition-file",uri:s.path,range:E,nameRange:E}});o.push({...x,ports:B,source:"node-definition-file",sourceMeta:{sourceKind:"node-definition-file",file:s.path,range:f},editable:!0,uri:s.path,range:f,elementRange:f})}}return{ok:r.every(s=>s.severity!==b.Error),nodeModels:o,diagnostics:r}}function Gi(e,t){return Ee(e,t).replace(/\\/g,"/")}function Vu(e){return[...e.reachableDocuments.values()]}function vr(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function Ki(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function qu(e){let t=new Map;for(let n of e){let r=t.get(n.uri)??[];r.push(n),t.set(n.uri,r)}return t}async function Rr(e){let t=[],n=e.project,r=e.resolvedConfig,o=e.resolutionMode??Sr(r),i=o==="entrypoints"||e.resolveGraph?await $i({project:e.project,documents:e.documents,resolvedConfig:r,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await Wi({project:e.project,host:e.host});t.push(...l.diagnostics);let c=l.nodeModels,u=i&&(o==="entrypoints"||e.resolveGraph)?vr([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)&&i.reachableUris.has(f.uri)),...i.reachableDocuments.values(),...s]):vr([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)),...s]),d=Fe(u,{config:r,models:c,augmentations:a}),p={includeIssuesByUri:qu(i?.issues??[]),suppressionIssuesByUri:new Map};t.push(...d.diagnostics);let m=new Map(Ce(d.index).map(f=>[f,Y(d.index,f)])),g={mode:o,files:new Map(u.map(f=>[Gi(n.rootUri,f.path||f.uri),f])),documentViews:new Map(u.map(f=>[f.uri,(()=>{let x=ee(r,Gi(n.rootUri,f.path||f.uri));return G(f,{semantic:d.index,config:x,policy:oe(x)})})()])),includeGraph:i?.graph,reachableDocuments:i?.reachableDocuments??new Map,behaviorTreesById:new Map(Ce(d.index).map(f=>[f,Y(d.index,f)])),reachableBehaviorTreesById:m,nodeModelsById:new Map(Et(d.index).map(f=>[f.id,f])),nodeModelSources:new Map(ir(d.index).map(f=>[f,Ue(d.index,f).flatMap(x=>x.sourceMeta?[x.sourceMeta]:[])])),nodeDefinitionModels:[...c],entrypoints:n.entrypoints,workspace:d.index,facts:p};return{ok:t.every(f=>f.severity!==b.Error),index:g,diagnostics:t}}async function Hi(e){let t=e.project,n=e.resolvedConfig??t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let r=[...e.projectDiagnostics??[]],o=e.host??t.host,i=e.externalModelDocuments!==void 0?[...e.externalModelDocuments]:(await Promise.all(t.modelFiles.map(async g=>{let f=await yr(g,o);return r.push(...f.diagnostics),f.document?[f.document]:[]}))).flat(),s=e.augmentations!==void 0?[...e.augmentations]:void 0;if(!s){let g=await yn({project:e.project,host:o});r.push(...g.diagnostics),s=[...g.augmentations]}let a=e.resolutionMode??Sr(n),l=a==="entrypoints"?new Set(e.documents.filter(g=>g.kind==="bt-document").map(g=>g.uri)):new Set(e.documents.map(g=>g.uri)),c=await Rr({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:i,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:o}),u=vr([...e.documents,...Vu(c.index),...i]),d=n.linter.enabled!==!1,p=e.showSuppressed,m=[...c.index.nodeDefinitionModels];return{input:e,project:e.project,documents:e.documents,externalModelDocuments:i,augmentations:s,projectDiagnostics:r,indexResult:c,nodeDefinitionModels:m,fileDocuments:u,lintEnabled:d,showSuppressed:p,resolvedConfig:n,suppressionIssuesByUri:void 0}}function Yi(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Ji(e,t){return e.includeIssuesByUri.get(t)??[]}function Zi(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Qi(e){let{document:t,semantic:n,config:r,view:o}=e,i=new Map(o.nodes.map(c=>[c.element,c])),s=new Map(o.subtreeCalls.map(c=>[c.node.element,c])),a=oe(r),l=$u(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(c){let u=w(c.code??e.code,e.severity,c.message,c.range,t.uri,c.details,c.data);e.diagnostics.push({...u,rule:e.rule,...c.relatedInformation?{relatedInformation:c.relatedInformation}:{}})},getIncludeIssues(c){let u=Ji(e.facts,t.uri);return c?u.filter(d=>d.kind===c):u},getSuppressionIssues(c){let u=Zi(e.facts,t.uri);return c?u.filter(d=>d.kind===c):u},getNodeUsage(c){return O(n,{element:c,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:l.has(c)})},getPortUsage(c,u){return ge(n,{element:c,documentRoot:t.root,attributeName:u,uri:t.uri,config:r,policy:a,isModelDefinition:l.has(c)})},resolveSubTree(c,u){return wt(n,{id:c,fileLocalUri:u,config:r})},getNodeModel(c){return ie(n,c)},getBehaviorTrees(c){return Y(n,c)},getTreeNodeView(c){return i.get(c)},getSubTreeCallView(c){return s.get(c)}}}function $u(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return kr(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||kr(n,t);return t}function kr(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&kr(n,t)}function P(e){let t=ue[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Xu={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files"};function Ne(e){return P({name:Xu[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:zu(n)})}}}})}function zu(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}var es=[Ne("missing-path"),Ne("not-found"),Ne("cycle"),Ne("outside-root"),Ne("unresolved-variable"),Ne("depth-exceeded"),Ne("too-many-files"),Ne("external-used")];import Wu from"ajv";var Gu=Wu,Ku=new Gu,Hu=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],Yu={int8_t:{min:-128n,max:127n},"std::int8_t":{min:-128n,max:127n},int16_t:{min:-32768n,max:32767n},"std::int16_t":{min:-32768n,max:32767n},int32:{min:-2147483648n,max:2147483647n},int32_t:{min:-2147483648n,max:2147483647n},"std::int32_t":{min:-2147483648n,max:2147483647n},int64_t:{min:-9223372036854775808n,max:9223372036854775807n},int64:{min:-9223372036854775808n,max:9223372036854775807n},"std::int64_t":{min:-9223372036854775808n,max:9223372036854775807n},int:{min:-2147483648n,max:2147483647n},long:{min:-9223372036854775808n,max:9223372036854775807n},short:{min:-32768n,max:32767n},uint8_t:{min:0n,max:255n},"std::uint8_t":{min:0n,max:255n},uint16_t:{min:0n,max:65535n},"std::uint16_t":{min:0n,max:65535n},uint32:{min:0n,max:4294967295n},uint32_t:{min:0n,max:4294967295n},"std::uint32_t":{min:0n,max:4294967295n},uint64_t:{min:0n,max:18446744073709551615n},uint64:{min:0n,max:18446744073709551615n},"std::uint64_t":{min:0n,max:18446744073709551615n},uint:{min:0n,max:4294967295n},unsigned:{min:0n,max:4294967295n},"unsigned int":{min:0n,max:4294967295n},size_t:{min:0n,max:18446744073709551615n},"std::size_t":{min:0n,max:18446744073709551615n}},Tr=new Set(["int8_t","int16_t","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","int","long","short","std::int8_t","std::int16_t"]),ts=new Set(["uint8_t","uint16_t","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","uint","unsigned","unsigned int","std::uint8_t","std::uint16_t","size_t","std::size_t"]);function ns(e){return e.children.filter(t=>t.kind==="element")}function de(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function rs(e){return e.children.some(t=>t.kind==="element")}function Sn(e,t){let n=os(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function os(e){let t=Ft(e.port.name,e.value);if(e.allowRemap&&t!==void 0)return;if(!e.allowRemap&&t!==void 0||e.port.enum&&!e.port.enum.includes(e.value))return hn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return td(e.registry,n,e.value)?void 0:hn(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!ss(r,e.value))return Ju(r)?hn(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${r}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${r}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function $e(e){return e.effectiveType??e.type}function is(e,t){return ce(e,$e(t))}function Ft(e,t){let n=X({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function hn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function Ju(e){let t=yt(e)??e;return as(e)!==void 0||nd.has(t.toLowerCase())}function ss(e,t){let n=as(e);if(n)return Zu(n,t);let r=(yt(e)??e).toLowerCase();switch(r){case"std::string":case"string":case"bt::any":case"bt::anytypeallowed":case"bt::anytype":case"any":return!0;case"bool":return t==="0"||t==="1"||t==="true"||t==="TRUE"||t==="True"||t==="false"||t==="FALSE"||t==="False";case"float":case"double":return/^-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/.test(t);case"bt::nodestatus":case"nodestatus":return Hu.includes(t);default:return Tr.has(r)||ts.has(r)?ls(r,t):!1}}function as(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Zu(e,t){let n=ed(t);return n?n.every(r=>Qu(e,r)):!1}function Qu(e,t){if(t.kind==="string")return ss(e,t.value);let n=(yt(e)??e).toLowerCase();switch(n){case"std::string":return typeof t.value=="string";case"bool":return typeof t.value=="boolean";case"float":case"double":return typeof t.value=="number"&&Number.isFinite(t.value);default:return Tr.has(n)||ts.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&ls(n,String(t.value)):!1}}function ls(e,t){let n=Yu[e];if(!n)return!1;if(Tr.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let r=BigInt(t);return r>=n.min&&r<=n.max}catch{return!1}}function ed(e){if(e.startsWith("json:"))try{let t=JSON.parse(e.slice(5));return Array.isArray(t)?t.map(n=>({kind:"json",value:n})):void 0}catch{return}return e.split(";").map(t=>({kind:"string",value:t}))}function td(e,t,n){switch(t.kind){case"pattern":return new RegExp(`^(?:${t.pattern})$`).test(n);case"enum":return t.values.includes(n);case"tuple":{let r=n.split(t.separator);return r.length!==t.items.length?!1:r.every((o,i)=>{let s=t.items[i];return s?os({port:{name:`tuple[${i}]`,type:s},value:o,registry:e,typeDefinition:ce(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${i}]`})===void 0:!1})}case"json-schema":try{let r=JSON.parse(n);return Ku.compile(t.schema)(r)===!0}catch{return!1}}}var nd=new Set(["std::string","string","bool","int8_t","std::int8_t","int16_t","std::int16_t","int","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","size_t","std::size_t","unsigned","unsigned int","float","double","bt::nodestatus","nodestatus","bt::any","bt::anytypeallowed","bt::anytype","any"]);var cs=[P({name:"model/require-port-name",meta:{description:"Port elements require a name attribute."},create(e){return{TreeNodeModel(t){for(let n of t.ports)n.name||e.report({message:"Port must have name attribute",range:n.range||n.nameRange||t.idRange||t.range})}}}}),P({name:"model/no-duplicate-port-name",meta:{description:"Ports with the same name are not allowed."},create(e){return{TreeNodeModel(t){let n=new Set;for(let r of t.ports)r.name&&(n.has(r.name)&&e.report({message:`Duplicate port name "${r.name}" in ${t.id}`,range:r.nameRange||r.range||t.idRange||t.range}),n.add(r.name))}}}}),P({name:"model/valid-port-name",meta:{description:"Port names must be valid XML attribute names for BT nodes."},create(e){return{TreeNodeModel(t){for(let n of t.ports){if(!n.name)continue;let r=Un(n.name);r&&e.report({code:S.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),P({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of Nt(e.semantic))t.uri&&t.uri!==e.document.uri||rd(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),P({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!od(t))return;let n=t.attributes.find(l=>l.name==="default")??t.attributes.find(l=>l.name==="default_value");if(!n)return;let r=t.attributes.find(l=>l.name==="name")?.value;if(!r)return;let i=id(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!i)return;let a=e.getNodeModel(i)?.ports.find(l=>l.name===r);if(a){if(a.direction==="output"){Ft(a.name,n.value)===void 0&&e.report({code:S.InvalidPortDefaultValue,message:`output port default for \`${a.name}\` must be a blackboard remap`,range:n.range,details:{primaryLabel:`output port default for \`${a.name}\` must be a blackboard remap`,help:`use \`${a.name}="{${a.name}}"\` or \`${a.name}="{=}"\``}});return}Sn(e,{port:a,value:n.value,range:n.range,registry:te(e.semantic),typeDefinition:Z(e.semantic,a.type),allowRemap:!0,diagnosticCode:S.InvalidPortDefaultValue,customLiteralDiagnosticCode:S.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),P({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=te(e.semantic),n=new Map,r=e.options.allowStringEntryCompatibility??!0;for(let o of e.view.nodes)for(let i of o.portBindings){if(i.declaredPort.status!=="resolved")continue;let s=Ft(i.name,i.value);if(!s)continue;let a=is(t,i.declaredPort.port);if(!a||a.kind==="any")continue;let l=z(s),c=n.get(l)??[];c.push({key:s.key,scope:s.scope,displayName:je(s),identity:l,nodeId:ld(o.element),port:i.declaredPort.port,typeDefinition:a,range:i.attribute.range}),n.set(l,c)}for(let o of n.values()){let i=sd(e.semantic,o,r);if(i.length<2)continue;let s=o.find(a=>a.typeDefinition.canonical===i[0]);e.report({code:S.BlackboardTypeMismatch,message:`blackboard entry \`${s?.displayName??o[0]?.displayName??o[0]?.key??""}\` is used with incompatible port types: ${i.map(a=>`\`${a}\``).join(", ")}`,range:s?.range,details:{primaryLabel:`blackboard entry \`${s?.displayName??o[0]?.displayName??o[0]?.key??""}\` mixes incompatible port types`,notes:o.filter(a=>i.includes(a.typeDefinition.canonical)).map(a=>`${a.nodeId}.${a.port.name} declares ${ad(a.port,a.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),P({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(cd(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let o=e.getPortUsage(t,r.name);o?.status==="resolved"&&o.port.direction==="output"&&Ft(o.port.name,r.value)===void 0&&e.report({code:S.OutputPortRequiresRemap,message:`output port \`${o.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${o.port.name}\` requires a blackboard remap`,help:`use \`${o.port.name}="{${o.port.name}}"\` or \`${o.port.name}="{some_key}"\``}})}}}}})];function rd(e,t){return e.diagnostics.some(n=>n.code===S.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function od(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function id(e,t){if(!e)return;return n(e,!1,void 0);function n(r,o,i){let s=o||r.name==="TreeNodesModel",a=s&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:i;if(r===t)return a;for(let l of r.children){if(l.kind!=="element")continue;let c=n(l,s,a);if(c)return c}}}function sd(e,t,n){let r=new Set;for(let o=0;o<t.length;o+=1){let i=t[o];if(i)for(let s=o+1;s<t.length;s+=1){let a=t[s];a&&(n&&(i.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||De(e,i.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(i.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function ad(e,t){return $e(e)??t.canonical}function ld(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function cd(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var ud=new Set(["_failureIf","_successIf","_skipIf","_while"]),dd=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Xe(e){if(ud.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(dd.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}function Ot(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=mt({rawName:e});return t.ok?{kind:"global-blackboard",key:t.reference.key}:{kind:"invalid-global-blackboard",raw:e,message:`invalid global blackboard identifier \`${e}\``}}var us=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),ds=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function at(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(ps(r)){n++;continue}if(xr(r)){let a=n;for(n++;n<e.length&&fd(e[n]);)n++;let l=e.slice(a,n);t.push({type:l==="true"||l==="false"?"Boolean":"Identifier",text:l,start:a,end:n});continue}if(ze(r)){let a=md(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=pd(e,n);t.push(a),n=a.end;continue}let o=e.slice(n,n+2),i=us.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let s=ds.get(r);if(s){t.push({type:s,text:r,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:r,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function pd(e,t){let n=t+1;for(;n<e.length&&e[n]!=="'";)n++;return n>=e.length?{type:"Error",text:e.slice(t),start:t,end:e.length}:{type:"String",text:e.slice(t+1,n),start:t,end:n+1}}function md(e,t){let n=t;if(e[n]==="0"&&(e[n+1]==="x"||e[n+1]==="X")){n+=2;let o=n;for(;n<e.length&&gd(e[n]);)n++;return o===n||bd(e,n)?(n=Ut(e,n),Vt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&ze(e[n]);)n++;let r="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:r,text:e.slice(t,n),start:t,end:n};if(!ze(e[n+1]))return n=Ut(e,n+1),Vt(e,t,n);for(r="Real",n+=1;n<e.length&&ze(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let o=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let i=n;for(;n<e.length&&ze(e[n]);)n++;if(i===n)return n=Ut(e,Math.max(n,o+1)),Vt(e,t,n);r="Real"}return yd(e,n)?(n=Ut(e,n),Vt(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function Ut(e,t){let n=t;for(;n<e.length;){let r=e[n];if(ps(r)||ds.has(r)||us.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function Vt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function ps(e){return e===" "||e===" "||e===`
15
+ `||e==="\r"}function xr(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function fd(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function ze(e){return e!==void 0&&/[0-9]/.test(e)}function gd(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function yd(e,t){let n=e[t];return xr(n)||ze(n)}function bd(e,t){let n=e[t];return n==="."||xr(n)||ze(n)}var hd=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Sd=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),ms=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),ae={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ge(e){let t=at(e),n=t.filter(r=>r.type==="Error");return n.length>0?{ok:!1,errors:n.map(r=>({kind:"invalid-token",message:`invalid token \`${r.text}\``,range:{start:r.start,end:r.end}})),tokens:t}:fs(t,e)}function fs(e,t=""){let n=new Ir(e,t),r=[];if(n.peek().type==="EndOfInput")return{ok:!1,errors:[{kind:"empty-script",message:"empty script",range:{start:0,end:0}}],tokens:e};for(;n.peek().type!=="EndOfInput";){let i=n.parseExpression(0);if(!i)return{ok:!1,errors:n.errors,tokens:e};for(r.push(i);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let o=xd(r);return{ok:!0,program:{kind:"Program",statements:r,range:o},tokens:e}}var Ir=class{constructor(t,n,r=0){this.tokens=t;this.source=n;this.index=r}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let r=this.peek();if(r.type==="EndOfInput"||r.type==="Semicolon"||r.type==="RightParen"||r.type==="Colon")break;let o=hd.get(r.type);if(o){if(t>=ae.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:o,left:n,right:l,range:qt(n.range,l.range)};break}if(r.type==="Question"){if(t>=ae.ternary)break;this.consume();let l=this.parseExpression(0);if(!l)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let c=this.parseExpression(ae.ternary);if(!c)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:c,range:qt(n.range,c.range)};break}let i=ms.get(r.type);if(i){if(t>=ae.comparison)break;this.consume();let l=[n],c=[i],u=this.parseExpression(ae.comparison);if(!u)return;for(l.push(u);;){let d=ms.get(this.peek().type);if(!d)break;this.consume();let p=this.parseExpression(ae.comparison);if(!p)return;c.push(d),l.push(p)}n={kind:"ComparisonChain",operands:l,operators:c,range:qt(l[0].range,l[l.length-1].range)};continue}let s=Sd.get(r.type),a=s?kd(r.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let l=this.parseExpression(a);if(!l)return;n={kind:"BinaryExpression",operator:s,left:n,right:l,range:qt(n.range,l.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${r.text||r.type}\``,r);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:We(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),vd(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:Rd(t.type),argument:n,range:qt(We(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),r=this.parseExpression(0);if(!r)return;let o=this.peek();if(o.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",o);return}return this.consume(),Td(r,{start:n.start,end:o.end})}default:this.reportError("expected-operand","expected operand",t);return}}peek(){return this.tokens[this.index]??this.tokens[this.tokens.length-1]}consume(){let t=this.peek();return this.index+=1,t}match(t){return this.peek().type!==t?!1:(this.consume(),!0)}reportError(t,n,r){this.errors.push({kind:t,message:n,range:We(r)})}};function vd(e,t){switch(e.type){case"Integer":return{kind:"Literal",valueKind:"integer",raw:t.slice(e.start,e.end),value:e.text.startsWith("0x")||e.text.startsWith("0X")?Number(e.text):Number.parseInt(e.text,10),range:We(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:We(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:We(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:We(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function Rd(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function kd(e){switch(e){case"PipePipe":return ae.pipePipe;case"AmpAmp":return ae.ampAmp;case"Pipe":case"Caret":return ae.pipeCaret;case"Ampersand":return ae.ampersand;case"Plus":case"Minus":case"DotDot":return ae.additive;case"Star":case"Slash":return ae.multiplicative;default:return}}function We(e){return{start:e.start,end:e.end}}function qt(e,t){return{start:e.start,end:t.end}}function Td(e,t){return{...e,range:t}}function xd(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var Id=new Set(["int8_t","std::int8_t","int16_t","std::int16_t","int32","int32_t","std::int32_t","int64","int64_t","std::int64_t","int","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint32","uint32_t","std::uint32_t","uint64","uint64_t","std::uint64_t","uint","unsigned","unsigned int","size_t","std::size_t","float","double"]);function $t(e={}){let t=nt(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>bt(t,s,a)),r=new Map,o=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:Dd(e.enums,e.augmentations??[])};for(let s of e.symbols??[])gs(i.symbols,r,s,n);for(let s of e.globalBlackboardSymbols??[])gs(i.globalBlackboard,o,s,n);return i}function he(e){return{symbols:new Map([...e?.symbols.entries()??[]].map(([t,n])=>[t,{...n}])),globalBlackboard:new Map([...e?.globalBlackboard.entries()??[]].map(([t,n])=>[t,{...n}])),enums:new Map(e?.enums??[])}}function Xt(e){let t=he(e.baseEnvironment),n=[];for(let r of e.entries){let o=he(t),i=r.parseResult??Ge(r.source),s=he(o),a;i.ok&&(a=He({program:i.program,environment:o,attributeName:r.attributeName,originId:r.originId??String(r.id)}),s=he(a.environment)),n.push({id:r.id,parseResult:i,environmentBefore:o,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.globalBlackboard.clear(),t.enums.clear();for(let[l,c]of s.symbols)t.symbols.set(l,{...c});for(let[l,c]of s.globalBlackboard)t.globalBlackboard.set(l,{...c});for(let[l,c]of s.enums)t.enums.set(l,c)}return n}function ys(e){let t=new Map;for(let n of e)for(let[r,o]of Object.entries(n.script?.enums??{}))t.set(r,o);return t}function xe(e,t){let n=ce(e,t);return bs(t,n)}function bs(e,t){if(!e||!t)return{kind:"unknown"};if(t.kind==="any")return{kind:"any"};let n=t.canonical.toLowerCase();return n==="bool"?{kind:"bool"}:n==="std::string"||n==="string"?{kind:"string"}:Id.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function hs(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:e.kind===t.kind}function lt(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:!1:e.kind==="bool"&&t.kind==="number"?!0:e.kind===t.kind}function Ke(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Dr(e,t){return e.kind==="error"||t.kind==="error"?{kind:"error"}:e.kind==="unknown"||t.kind==="unknown"?{kind:"unknown"}:e.kind==="any"||t.kind==="any"?e.kind===t.kind?e:{kind:"unknown"}:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"&&e.canonical===t.canonical?e:void 0:e.kind===t.kind?e:void 0}function Dd(e,t){if(e instanceof Map)return new Map(e);let n=ys(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function gs(e,t,n,r){let o=e.get(n.name);if(!o){e.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let i=t.get(n.name),s=o.conflict===!0||i!==void 0&&n.compatibilityKey!==void 0&&!r(i,n.compatibilityKey)||!hs(o.type,n.type);e.set(n.name,{...o,readable:o.readable||n.readable,writable:o.writable||n.writable,conflict:s}),i===void 0&&t.set(n.name,n.compatibilityKey)}var Ye={kind:"number"},Rn={kind:"string"},vn={kind:"bool"},le={kind:"unknown"},V={kind:"error"};function He(e){let t=he(e.environment),n=[],r=[],o=[],i=[],s=[],a=[],l=[],c=[];return e.program.statements.forEach((u,d)=>{c.push(Se({expression:u,statementIndex:d,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,statementTypes:c,finalType:c.at(-1)}}function Se(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?Ye:t.valueKind==="string"?Rn:t.valueKind==="boolean"?vn:le;case"Identifier":return Bd(e,t.name,t.range);case"UnaryExpression":{let n=Se({...e,expression:t.argument});return t.operator==="!"?Ke(n)?vn:(re(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a bool-compatible operand`,`operand for \`${t.operator}\` is not bool-compatible`,"use a boolean, number, or unknown-compatible expression here"),V):n.kind==="number"?Ye:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?V:le:(re(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a numeric operand`,`operand for \`${t.operator}\` is not numeric`,"use a number expression here"),V)}case"BinaryExpression":{let n=Se({...e,expression:t.left}),r=Se({...e,expression:t.right});switch(t.operator){case"&&":case"||":return vs(n)||vs(r)?(re(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires bool-compatible operands`,`operands for \`${t.operator}\` are not bool-compatible`,"use boolean or numeric expressions here"),V):vn;case"+":return n.kind==="string"&&r.kind==="string"?Rn:n.kind==="number"&&r.kind==="number"?Ye:Cr(n,r)?le:(Br(e,t.range,t.operator),V);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Ye:Cr(n,r)?le:(Br(e,t.range,t.operator),V);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?Rn:Cr(n,r)?le:(Br(e,t.range,t.operator),V)}return le}case"ComparisonChain":{let n=t.operands.map(r=>Se({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let o=t.operators[r],i=n[r],s=n[r+1];if(!Ed(o,i,s))return re(e,"invalid-operand-type",{start:t.operands[r]?.range.start??t.range.start,end:t.operands[r+1]?.range.end??t.range.end},`operator \`${o}\` cannot compare these operand types`,`comparison operands for \`${o}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),V}return vn}case"ConditionalExpression":{let n=Se({...e,expression:t.condition});Ke(n)||re(e,"invalid-operand-type",t.condition.range,"ternary condition must be bool-compatible","ternary condition is not bool-compatible","use a boolean or numeric condition expression here");let r=Se({...e,expression:t.thenExpression}),o=Se({...e,expression:t.elseExpression}),i=Dr(r,o);return i||(re(e,"invalid-operand-type",t.range,"ternary branches must produce compatible types","then and else branches have incompatible types","return the same type from both ternary branches"),V)}case"AssignmentExpression":return Cd(e)}}function Cd(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:o}=e,i=e.expression,s=Se({...e,expression:i.right});if(i.left.kind!=="Identifier")return Se({...e,expression:i.left}),re(e,"invalid-operand-type",i.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),V;let a=i.left,l=i.operator===":="?"declare":i.operator==="="?"write":"readwrite",c={name:a.name,kind:l,range:a.range,identifier:a,statementIndex:e.statementIndex};r.push(c);let u=Ot(a.name);if(u.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(c),Rs(e,a.range,u.raw,u.message),V;if(u.kind==="global-blackboard"){let m=t.globalBlackboard.get(u.key),g=i.operator===":="?s:i.operator==="="?m&&lt(m.type,s)?s:m?void 0:s:Ss(m?.type??le,s,i.operator);if(i.operator!==":="&&i.operator!=="="&&!g)return re(e,"invalid-compound-assignment",i.range,`operator \`${i.operator}\` is not valid for these operand types`,`compound assignment \`${i.operator}\` is not allowed here`,i.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),V;if((i.operator===":="||i.operator==="=")&&m&&!lt(m.type,s))return Er(e,a,m.type,s),V;let f=m?{...m}:{name:u.key,type:s,source:{kind:"global-blackboard",key:u.key,range:a.range,originId:e.originId},readable:!0,writable:!0};return f.type=g??s,t.globalBlackboard.set(u.key,f),e.resolvedIdentifiers.push({access:c,resolution:{kind:"global-blackboard",key:u.key,symbol:f}}),e.globalBlackboardAccesses.push({key:u.key,rawName:a.name,kind:l,range:a.range,inferredType:f.type}),f.type}let d=t.symbols.get(a.name);if(i.operator===":="&&!d){let m={name:a.name,type:s,source:{kind:"script-assignment",attributeName:n,range:a.range,originId:e.originId},readable:!0,writable:!0};return t.symbols.set(a.name,m),e.resolvedIdentifiers.push({access:c,resolution:{kind:"symbol",symbol:m}}),o.push(m),s}if(!d)return e.resolvedIdentifiers.push({access:c,resolution:{kind:"unknown"}}),re(e,"assignment-to-unknown-variable",a.range,`assignment target \`${a.name}\` is not defined`,`\`${a.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),V;if(e.resolvedIdentifiers.push({access:c,resolution:{kind:"symbol",symbol:d}}),i.operator==="=")return lt(d.type,s)?(Pr(d,s),s):(Er(e,a,d.type,s),V);if(i.operator===":=")return lt(d.type,s)?(Pr(d,s),s):(Er(e,a,d.type,s),V);let p=Ss(d.type,s,i.operator);return p?(Pr(d,p),p):(re(e,"invalid-compound-assignment",i.range,`operator \`${i.operator}\` is not valid for these operand types`,`compound assignment \`${i.operator}\` is not allowed here`,i.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),V)}function Bd(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let o=Ot(t);if(o.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(r),Rs(e,n,o.raw,o.message),V;if(o.kind==="global-blackboard"){let a=e.environment.globalBlackboard.get(o.key);return e.globalBlackboardAccesses.push({key:o.key,rawName:t,kind:"read",range:n,inferredType:a?.type??le}),e.resolvedIdentifiers.push({access:r,resolution:{kind:"global-blackboard",key:o.key,...a?{symbol:a}:{}}}),a?.type??le}let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),Ye;let s=e.environment.symbols.get(t);return s?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:s}}),s.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),le)}function Ss(e,t,n){return e.kind==="error"||t.kind==="error"?V:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?le:n==="+="?e.kind==="number"&&t.kind==="number"?Ye:e.kind==="string"&&t.kind==="string"?Rn:void 0:e.kind==="number"&&t.kind==="number"?Ye:void 0}function Cr(e,t){return kn(e)||kn(t)}function kn(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function vs(e){return!Ke(e)}function Ed(e,t,n){return kn(t)||kn(n)?!0:e==="=="||e==="!="?t.kind==="custom"||n.kind==="custom"?t.kind==="custom"&&n.kind==="custom"&&t.canonical===n.canonical:t.kind===n.kind:t.kind==="custom"||n.kind==="custom"?!1:t.kind==="number"&&n.kind==="number"||t.kind==="string"&&n.kind==="string"}function Br(e,t,n){re(e,"invalid-operand-type",t,`operator \`${n}\` cannot be applied to these operand types`,`operands for \`${n}\` are not compatible`,"use operands with the types required by this operator")}function Er(e,t,n,r){re(e,"variable-type-mismatch",t.range,`cannot assign ${Nr(r)} to variable \`${t.name}\` of type ${Nr(n)}`,`\`${t.name}\` expects ${Nr(n)} here`,"assign a compatible value or change the variable's source type")}function Rs(e,t,n,r){re(e,"invalid-global-blackboard-identifier",t,r,`\`${n}\` is not a valid global blackboard identifier`,"use `@name` with a valid blackboard key that starts with a letter or underscore")}function Pr(e,t){e.source.kind==="script-assignment"&&(e.type.kind!=="unknown"&&e.type.kind!=="error"||t.kind==="unknown"||t.kind==="any"||t.kind==="error"||(e.type=t))}function re(e,t,n,r,o,i){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:o,help:i}})}function Nr(e){return e.kind==="custom"?e.name:e.kind}var ks=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),Pd=new Set(["LeftParen","Semicolon","Question","Colon","Plus","Minus","Star","Slash","DotDot","Ampersand","Pipe","Caret","Tilde","AmpAmp","PipePipe","Bang","EqualEqual","BangEqual","Less","Greater","LessEqual","GreaterEqual","ColonEqual","Equal","PlusEqual","MinusEqual","StarEqual","SlashEqual"]),Nd=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],wd=[":=","=","+=","-=","*=","/="],Ts=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function wr(e){let t=e.source,n=Ds(t,e.cursorOffset),r=xn({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...Md(e,r)),Od(e.attributeInfo,t,n)&&o.push(...Ld(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...Ad(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(..._d(r.range,r.prefix)),qd(o)}function xn(e){let t=e.source,n=Ds(t,e.cursorOffset),r=at(t).filter(l=>l.type!=="EndOfInput"),o=r.find(l=>l.start<=n&&n<=l.end);if(o?.type==="Identifier")return{kind:"identifier",prefix:o.text.slice(0,Math.max(0,n-o.start)),range:{start:o.start,end:o.end}};if(o&&(o.type==="Integer"||o.type==="Real"||o.type==="String"||o.type==="Boolean"))return{kind:"literal",range:{start:o.start,end:o.end}};let i=Ud(t,n),s=Tn(r,i.start);if(i.start<i.end&&s&&ks.has(s.type))return{kind:s.type==="Identifier"&&Is(r,s)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let a=Tn(r,n);return a&&ks.has(a.type)&&a.end<=n?{kind:a.type==="Identifier"&&Is(r,a)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!a||Pd.has(a.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function Md(e,t){let n=jd(e),r=t.prefix.toLowerCase(),o=[];for(let[i,s]of n.enums)ct(i,r)&&o.push({label:i,kind:"enum",detail:`enum value ${s}`,replaceRange:t.range,sortText:`0-${i}`});for(let i of n.symbols.values())i.conflict||i.readable&&ct(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:xs(i),replaceRange:t.range,sortText:i.source.kind==="script-assignment"?`1-${i.name}`:`2-${i.name}`});for(let i of n.globalBlackboard.values()){if(i.conflict||!i.readable)continue;let s=`@${i.name}`;ct(s,r)&&o.push({label:s,kind:"identifier",detail:xs(i),replaceRange:t.range,sortText:`2-${s}`})}for(let i of["true","false"])ct(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function Ad(e,t){return Nd.filter(n=>ct(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function _d(e,t){return wd.filter(n=>ct(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function Ld(e){return[{label:"name := value",kind:"snippet",detail:"Declare local script variable",replaceRange:e,insertText:"${1:name} := ${2:value}",insertTextFormat:"snippet",sortText:"6-name := value"},{label:"name = value",kind:"snippet",detail:"Assign existing variable",replaceRange:e,insertText:"${1:name} = ${2:value}",insertTextFormat:"snippet",sortText:"6-name = value"}]}function jd(e){let t=he(e.environment),n=at(e.source),r=Ge(e.source);if(r.ok){let o=He({program:r.program,environment:t,attributeName:e.attributeName}),i=he(e.environment);for(let s of o.introducedSymbols)s.source.kind==="script-assignment"&&(s.source.range.end>e.cursorOffset||i.symbols.set(s.name,s));for(let s of o.globalBlackboardAccesses){if(s.kind==="read"||s.range.end>e.cursorOffset)continue;let a=o.environment.globalBlackboard.get(s.key),l=i.globalBlackboard.get(s.key),c;a?c={...a}:l?c={...l,type:s.inferredType}:c={name:s.key,type:s.inferredType,source:{kind:"global-blackboard",key:s.key,range:s.range},readable:!0,writable:!0},i.globalBlackboard.set(s.key,c)}return i}for(let o of n){if(o.type!=="Identifier")continue;if(o.end>e.cursorOffset)break;let i=Vd(n,o.end);if(i?.type!=="ColonEqual"||i.end>e.cursorOffset)continue;let s=Ot(o.text);if(s.kind!=="invalid-global-blackboard"){if(s.kind==="global-blackboard"){if(t.globalBlackboard.has(s.key))continue;t.globalBlackboard.set(s.key,{name:s.key,type:{kind:"unknown"},source:{kind:"global-blackboard",key:s.key,range:{start:o.start,end:o.end}},readable:!0,writable:!0});continue}t.symbols.has(s.name)||t.symbols.set(s.name,{name:s.name,type:{kind:"unknown"},source:{kind:"script-assignment",attributeName:e.attributeName??"code",range:{start:o.start,end:o.end}},readable:!0,writable:!0})}}return t}function xs(e){let t=Fd(e.type);switch(e.source.kind){case"port-remap":return`${t} from ${e.source.nodeType??"node"}.${e.source.portName}`;case"global-blackboard-remap":return`${t} from global blackboard ${e.source.nodeType??"node"}.${e.source.portName}`;case"subtree-port":return`${t} from ${e.source.nodeType??"SubTree"}.${e.source.portName}`;case"script-assignment":return`${t} from earlier ${e.source.attributeName} declaration`;case"global-blackboard":return`${t} from global blackboard @${e.source.key}`;case"augmentation":return`${t} from augmentation`;case"enum":return`${t} enum`}}function Fd(e){switch(e.kind){case"number":case"string":case"bool":case"any":case"unknown":case"error":return e.kind;case"custom":return e.name}}function Od(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=at(t).filter(i=>i.type!=="EndOfInput"),o=Tn(r,n);return!o||o.type==="Semicolon"}function Ud(e,t){let n=t;for(;n>0&&Ts.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&Ts.has(e[r]??"");)r+=1;return{start:n,end:r}}function Tn(e,t){for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r.end<=t)return r}}function Is(e,t){if(t.type!=="Identifier")return!1;let n=Tn(e,t.start);return!n||n.type==="Semicolon"}function Vd(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function ct(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function Ds(e,t){return Math.max(0,Math.min(e.length,t))}function qd(e){let t=new Set;return e.filter(n=>{let r=`${n.kind}:${n.label}:${n.insertText??""}`;return t.has(r)?!1:(t.add(r),!0)})}var Cs=new WeakMap;function In(e,t){let n=e.getNodeUsage(t),r=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(o=>{let i=Xe({elementName:t.name,attributeName:o.name,resolvedNodeType:r});return i?[{attribute:o,info:i,parseResult:Ge(o.value)}]:[]})}function pe(e,t,n){return Te(e.document,t,n)}function Bs(e){return{start:0,end:e.value.length}}function we(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?In(e,t).map(o=>{let i=Es(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?He({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):$d(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function $d(e,t){let n=Cs.get(e.view);n||(n=new WeakMap,Cs.set(e.view,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(s=>In(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),i=Xt({baseEnvironment:Es(e,t.nodes),entries:o.map(s=>({id:s.id,source:s.candidate.attribute.value,attributeName:s.candidate.attribute.name,originId:s.id,parseResult:s.candidate.parseResult}))}).flatMap((s,a)=>{let l=o[a];return l?[{...s,node:l.node,candidate:l.candidate}]:[]});return n.set(t,i),i}function Es(e,t){let n=te(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let s=e.getNodeModel(i);if(s?.kind==="SubTree")for(let a of s.ports){let l=$e(a),u=Z(e.semantic,l)?.canonical??l;r.push({name:a.name,type:xe(n,l),source:{kind:"subtree-port",nodeType:i,portName:a.name,direction:a.direction},readable:!0,writable:a.direction==="output"||a.direction==="inout",compatibilityKey:u})}}for(let s of t)for(let a of s.portBindings){if(a.usage.status!=="resolved")continue;let l=X({portName:a.usage.port.name,rawValue:a.usage.value});if(!l.ok||l.reference.scope==="global")continue;let c=$e(a.usage.port),d=Z(e.semantic,c)?.canonical??c,p=a.usage.port.direction,m=s.usage.model.status==="resolved"?s.usage.model.model.id:s.usage.nodeType;r.push({name:l.reference.key,type:xe(n,c),source:{kind:"port-remap",nodeType:m,portName:a.usage.port.name,direction:p},readable:p==="input"||p==="output"||p==="inout",writable:p==="output"||p==="inout",compatibilityKey:d})}return o.push(...Xd(e,n)),$t({symbols:r,globalBlackboardSymbols:o,augmentations:Pt(e.semantic),areTypesCompatible:(s,a)=>s&&a?De(e.semantic,s,a):!0})}function Xd(e,t){let n=[];for(let r of e.view.nodes){let o=r.usage.model.status==="resolved"?r.usage.model.model.id:r.usage.nodeType;for(let i of r.portBindings){if(i.usage.status!=="resolved")continue;let s=X({portName:i.usage.port.name,rawValue:i.usage.value});if(!s.ok||s.reference.scope!=="global")continue;let a=$e(i.usage.port),c=Z(e.semantic,a)?.canonical??a,u=i.usage.port.direction;n.push({name:s.reference.key,type:xe(t,a),source:{kind:"global-blackboard-remap",nodeType:o,portName:i.usage.port.name,direction:u,key:s.reference.key},readable:u==="input"||u==="output"||u==="inout",writable:u==="output"||u==="inout",compatibilityKey:c})}}return n}var Ps=P({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of we(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:S.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:pe(e,n.attribute,r.range),details:{primaryLabel:`\`${r.name}\` is not defined in the script environment`,help:"introduce it earlier with `:=`, add a matching blackboard remap, or define a script enum in btxml.model-augment.json"}})}}}});var Ns=P({name:"script/valid-assignment",create(e){return{Element(t){for(let n of we(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let o=r.code==="assignment-to-unknown-variable"?S.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?S.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?S.ScriptVariableTypeMismatch:r.code==="invalid-global-blackboard-identifier"?S.InvalidGlobalBlackboardIdentifier:void 0;o&&e.report({code:o,message:r.message,range:pe(e,n.attribute,r.range),details:r.details})}}}}});var ws=P({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of we(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:S.InvalidScriptOperandType,message:r.message,range:pe(e,n.attribute,r.range),details:r.details})}}}});var Ms=P({name:"script/valid-result-type",create(e){return{Element(t){for(let n of we(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let r=n.parseResult.program.statements.at(-1),o=n.analysis.finalType;!r||!o||Ke(o)||e.report({code:S.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:pe(e,n.attribute,r.range),details:{primaryLabel:"script result is not bool-compatible here",help:"return a boolean or numeric expression, or move side effects into a postcondition/script node"}})}}}}});var As=P({name:"script/valid-syntax",create(e){return{Element(t){for(let n of In(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let o=r.kind==="empty-script"?S.EmptyScript:r.kind==="invalid-token"?S.InvalidScriptToken:S.InvalidScriptSyntax;e.report({code:o,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??pe(e,n.attribute,Bs(n.attribute)):pe(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var _s=[As,Ps,Ns,ws,Ms];var zd={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Ls(e){return P({name:zd[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Wd(n)})}}}})}function Wd(e){return e.code?{code:e.code}:void 0}var js=[Ls("unused"),Ls("missing-reason")];function Dn(e,t){return e.attributes.find(n=>n.name===t)}function Fs(e,t){if(!e)return!1;let n=(r,o)=>{let i=o||r.name==="TreeNodesModel";if(r===t)return i;for(let s of r.children)if(s.kind==="element"&&n(s,i))return!0;return!1};return n(e,!1)}var Os=[P({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||Dn(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),P({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Bt(e.semantic,e.document.uri);for(let r of n?.behaviorTrees??[])r.idRange&&(t.has(r.id)&&e.report({message:`Duplicate BehaviorTree ID: ${r.id}`,range:r.idRange}),t.add(r.id))}}}}),P({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of Ce(e.semantic)){let n=Y(e.semantic,t);if(n.length<=1||new Set(n.map(i=>i.uri)).size<=1)continue;let o=n.filter(i=>i.uri===e.document.uri);o.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:o[0]?.idRange})}}}}}),P({name:"tree/no-unknown-main-tree",create(e){return{Document(){let t=e.document.root;if(e.document.kind!=="bt-document"||!t)return;let n=Dn(t,"main_tree_to_execute");!n?.value||tr(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),P({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Fs(e.document.root,t))return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(i=>i.name==="ID")??Dn(t,"ID");!r||n?.target.status==="resolved"||e.resolveSubTree(r.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${r.value}\``,range:r.valueContentRange||r.valueRange})}}}}),P({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Fs(e.document.root,t))return;let n=Dn(t,"ID");if(!n||e.getSubTreeCallView(t)?.target.status==="resolved")return;let o=e.resolveSubTree(n.value,e.document.uri);o.status!=="ambiguous"||o.behaviorTrees.length<=1||e.report({message:`ambiguous subtree \`${n.value}\``,range:n.valueContentRange||n.valueRange})}}}}),P({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var Gd=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Kd(e,t){return e===t?String(e):`${e}\u2013${t}`}var Us=P({name:"model/valid-child-count",create(e){return{Element(t){if(de(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Hd(e,t,n.model.model.id,n.model.model.kind)}}}});function Hd(e,t,n,r){let o=ns(t).length,i=Gd.get(n);if(i){if(o<i.min||o>i.max){let s=Kd(i.min,i.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${o}.`,range:t.range})}return}if(r==="Action"||r==="Condition"){o>0&&e.report({message:`${r} node \`${n}\` must not have child nodes, but has ${o}.`,range:t.range});return}if(r==="Decorator"){o!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${o}.`,range:t.range});return}if(r==="Control"){o<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}r==="SubTree"&&o>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${o}.`,range:t.range})}var Vs=P({name:"model/valid-port-value",create(e){return{Element(t){if(de(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let o=e.getPortUsage(t,r.name);o?.status==="resolved"&&Sn(e,{port:o.port,value:r.value,range:r.range,registry:te(e.semantic),typeDefinition:Z(e.semantic,o.port.type),allowRemap:!0,diagnosticCode:S.InvalidPortValueType,customLiteralDiagnosticCode:S.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var qs=P({name:"model/require-port",create(e){return{Element(t){if(de(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of n.ports)!r.required||n.portUsages.some(i=>i.name===r.name&&i.status==="resolved")||e.report({message:`missing required port \`${r.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${r.name}\``:`SubTree requires port \`${r.name}\``,help:`add \`${r.name}="..."\` or provide a blackboard reference such as \`${r.name}="{value}"\``}:void 0})}}}});var $s=[P({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(de(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Control"&&r!=="Decorator"||e.report({message:`${r} node \`${n.model.model.id}\` normally expects child nodes.`,range:t.range})}}}}),P({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(de(t)||t.selfClosing||rs(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let r=n.model.model.kind;r!=="Action"&&r!=="Condition"&&r!=="SubTree"||e.report({message:`${r} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var Xs=P({name:"model/no-unknown-node",create(e){return{Element(t){let n=e.getNodeUsage(t);if(n.tagForm==="root"||n.tagForm==="behavior-tree"||n.tagForm==="tree-nodes-model"||n.tagForm==="include"||n.tagForm==="model-definition"||n.tagForm==="subtree"||n.tagForm==="unknown-xml"||n.model.status==="resolved"||n.model.status==="ambiguous")return;let r=t.attributes.find(o=>o.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:r?.valueContentRange??r?.valueRange??t.range})}}}});var zs=P({name:"model/no-unknown-port",create(e){return{Element(t){if(de(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let o=n.ports.map(s=>s.name).sort(),i=o.length>=1&&o.length<=8?[`note: defined ports: ${o.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${r.name}\``,range:r.attribute.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` does not define this port`:"SubTree does not define this port in strict mode",help:n.model.status==="resolved"?`remove \`${r.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${r.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:i}:void 0})}}}}});var Ws=[Xs,zs,qs,Vs,...$s,Us];function Yd(e,t){return e.attributes.find(n=>n.name===t)}function Jd(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Gs=[P({name:"xml/valid-root",create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||t.name==="root"||e.report({message:"Root element must be <root>",range:t.range})}}}}),{name:"xml/require-btcpp-format",code:S.MissingBTCPPFormat,defaultSeverity:"error",meta:{description:'Root element must declare BTCPP_format="4".'},create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||Yd(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},P({name:"xml/no-unknown-top-level-element",meta:{description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},create(e){return{Element(t){let n=e.document.root;e.document.kind!=="bt-document"||!n||t===n||!n.children.includes(t)||Jd(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Mr=[...Gs,..._s,...Os,...cs,...Ws,...es,...js],_S=new Map(Mr.map(e=>[e.name,e]));function Ks(e){if(e!=="off")return e==="info"?b.Info:e==="warn"?b.Warning:b.Error}function Hs(e,t){return ke(e.linter.rules[t])?.options??{}}function Ys(e){let t=ke(e.config.linter.rules[e.rule]);return Ks(t?t.severity:e.defaultSeverity)}function Js(e){let t=[],n=e.facts??Yi(),r=e.rules?new Set(e.rules):void 0,o=[];for(let s of Mr){if(r&&!r.has(s.name))continue;let a=Ys({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=Hs(e.config,s.name),c=s.optionsSchema?.safeParse(l),u=c?.success?c.data:l,d=Qi({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:u,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});o.push(s.create(d))}for(let s of o)s.Document?.();e.document.root&&Zs(e.document.root,o);let i=Bt(e.semantic,e.document.uri);for(let s of i?.treeNodesModel??[])for(let a of o)a.TreeNodeModel?.(s);for(let s of o)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>Zd(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function Zs(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Zs(n,t)}function Zd(e,t){let n=e.range,r=t.range;return!n&&!r?0:n?r?n.start.line-r.start.line||n.start.character-r.start.character||n.end.line-r.end.line||n.end.character-r.end.character:-1:1}function zt(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let r=[...e.diagnostics],o=n.documentView??G(e,{semantic:t,config:n.config,policy:oe(n.config)});return r.push(...Js({document:e,view:o,semantic:t,config:n.config})),r}var Qd={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files","ros-package-resolver-missing":"include/require-ros-package-resolver","ros-package-not-found":"include/no-missing-ros-package"};function Qs(e){if(e!=="off")return e==="info"?b.Info:e==="warn"?b.Warning:b.Error}function ep(e,t){let n=ke(e.linter.rules[t]);return Qs(n?n.severity:ue[t].defaultSeverity)}function tp(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"ros-package-resolver-missing":return{packageName:e.packageName};case"ros-package-not-found":return{packageName:e.packageName,path:e.path};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}function ea(e){let t=[];for(let n of e.issues){let r=Qd[n.kind],o=ep(e.config,r);if(!o)continue;let i=w(ue[r].code,o,n.message,n.range,n.uri,void 0,tp(n));t.push({...i,rule:r})}return t}function ta(e,t){return Ee(e,t).replace(/\\/g,"/")}function np(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function rp(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let r=ta(e,n);if(np(r))return r}return ta(e,t.uri)}function na(e){let{project:t,indexResult:n,externalModelDocuments:r,fileDocuments:o,lintEnabled:i,resolvedConfig:s}=e,a=t,l=n.index.mode;return o.map(c=>{let u=rp(a.rootUri,c);if(l==="entrypoints"&&n.index.includeGraph&&c.kind==="bt-document"&&!n.index.reachableDocuments.has(c.uri))return{path:u,uri:c.uri,kind:c.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:c.originalText};let d=l==="single-file"?Fe([c,...r],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,p=l==="single-file"?(()=>{let g=ee(s,u);return G(c,{semantic:d,config:g,policy:oe(g)})})():n.index.documentViews.get(c.uri),m=[];if(i){let g=ee(s,u);m=zt(c,d,{config:g,documentView:p});let f=n.index.facts.includeIssuesByUri.get(c.uri)??[];m.push(...ea({issues:f,config:g}))}return e.input.mode==="check"&&c.kind==="generic-xml"?{path:u,uri:c.uri,kind:c.kind,documentView:p,diagnostics:[],rawDiagnostics:m,skipped:!0,skipReason:"generic-xml",originalText:c.originalText}:{path:u,uri:c.uri,kind:c.kind,documentView:p,diagnostics:m,rawDiagnostics:void 0,skipped:!1,originalText:c.originalText}})}function ra(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...ra(n.children));return t}function op(e,t,n){let r=[],o=[];for(let i of e){let s=ra(i.nodes);for(let a of s){let l=a.text.trim();if(!l.includes("btxml-disable"))continue;let c=l.match(/\b(BT\d+|BT\d+_[A-Z0-9_]+|CFG\d+_[A-Z0-9_]+|XML\d+_[A-Z0-9_]+)\b/)?.[1],u=l.match(/reason:\s*(.+)$/)?.[1];t&&!u&&o.push({kind:"missing-reason",uri:i.uri,code:c,range:a.range,message:"missing suppression reason"}),l.startsWith("btxml-disable-file")?r.push({uri:i.uri,code:c,file:!0,range:a.range,used:!1,reason:u}):l.startsWith("btxml-disable-next-line")?n&&r.push({uri:i.uri,code:c,line:a.range.end.line+1,range:a.range,used:!1,reason:u}):l.startsWith("btxml-disable")&&n&&r.push({uri:i.uri,code:c,line:a.range.end.line+1,range:a.range,used:!1,reason:u})}}return{suppressions:r,issues:o}}function oa(e,t){let n=op(t.documents??[],!!t.requireReason,t.allowInline!==!1),r=[],o=[];for(let i of e){let s=n.suppressions.find(a=>a.uri===i.uri&&(!a.code||a.code===i.code||i.code.startsWith(a.code))&&(a.file||a.line===i.range?.start.line||a.line===(i.range?.start.line??0)+1));if(s){s.used=!0,o.push(i);continue}r.push(i)}for(let i of n.suppressions)i.used||n.issues.push({kind:"unused",uri:i.uri,code:i.code,range:i.range,message:i.code?`unused suppression for \`${i.code}\``:"unused suppression"});if(t.showSuppressed){let i=o.map(s=>({...s,severity:b.Info,suppressed:!0}));return{diagnostics:[...r,...i],suppressedDiagnostics:o,issues:n.issues}}return{diagnostics:r,suppressedDiagnostics:o,issues:n.issues}}function Ar(e,t,n,r=e.resolvedConfig){let o=It(r.linter.rules,"suppression/require-reason")!=="off";return oa(t,{documents:n??e.fileDocuments,requireReason:o,allowInline:r.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function ia(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function sa(e,t){if(!e.input.baseline)return{diagnostics:t,baselineDiagnostics:[],staleEntries:[]};let n=new Set,r=[],o=[];for(let i of t){let s=e.input.baseline.diagnostics.findIndex(a=>a.path===i.uri&&a.code===i.code&&a.messageHash===ia(i.message)&&a.range?.start?.line===i.range?.start?.line&&a.range?.start?.character===i.range?.start?.character);if(s>=0){n.add(s),o.push(i);continue}r.push(i)}return{diagnostics:r,baselineDiagnostics:o,staleEntries:e.input.baseline.diagnostics.filter((i,s)=>!n.has(s))}}var aa={error:0,warning:1,info:2};function la(e,t){return e.some(n=>n.severity===b.Error||t===0&&n.severity===b.Warning)}function Cn(e){return e.flat().sort((t,n)=>{let r=t.uri.localeCompare(n.uri);if(r!==0)return r;let o=t.range?.start.offset??-1,i=n.range?.start.offset??-1;if(o!==i)return o-i;let s=aa[t.severity]-aa[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function ca(e,t,n){let r=t.filter(i=>!i.skipped),o=Cn([n,r.flatMap(i=>i.diagnostics)]);return{files:r.length,errors:o.filter(i=>i.severity===b.Error).length,warnings:o.filter(i=>i.severity===b.Warning).length,infos:o.filter(i=>i.severity===b.Info).length,suppressed:0,baselineFiltered:0,staleEntries:[]}}function ip(e,t){return e.map(({path:n,uri:r,kind:o,diagnostics:i,rawDiagnostics:s,skipped:a,skipReason:l})=>({path:n,uri:r,kind:o,diagnostics:i,rawDiagnostics:t?s:void 0,skipped:a,skipReason:l}))}function ua(e,t){let n=Cn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(r=>r.diagnostics)??[]]);return{ok:!la(n,e.input.maxWarnings),files:e.files?ip(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var sp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},ap={unused:S.UnusedSuppression,"missing-reason":S.MissingSuppressionReason};function lp(e){if(e!=="off")return e==="info"?b.Info:e==="warn"?b.Warning:b.Error}function cp(e,t){return lp(It(e.linter.rules,t))}function _r(e){let t=[];for(let n of e.issues){let r=sp[n.kind],o=cp(e.config,r);if(!o)continue;let i=w(ap[n.kind],o,n.message,n.range,n.uri,void 0,n.code?{code:n.code}:void 0);t.push({...i,rule:r})}return t}async function up(e){let t=await Hi(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=na(t);let r=Ar(t,n);n=[...r.diagnostics,..._r({issues:r.issues,config:t.resolvedConfig})];let o=r.suppressedDiagnostics.length;for(let l=0;l<t.files.length;l++){let c=t.files[l],u=t.fileDocuments[l];if(c.skipped)continue;let d=ee(t.resolvedConfig,c.path),p=Ar(t,c.diagnostics,[u],d);c.diagnostics=[...p.diagnostics,..._r({issues:p.issues,config:d})],c.rawDiagnostics=[...c.diagnostics],o+=p.suppressedDiagnostics.length}let i=0,s=[];for(let l of t.files){if(l.skipped||l.diagnostics.length===0)continue;let c=sa(t,l.diagnostics);l.diagnostics=c.diagnostics,i+=c.baselineDiagnostics.length,c.staleEntries.length>0&&(s=s.concat(c.staleEntries))}t.files=Ki(t.files),t.finalProjectDiagnostics=n;let a=ca(t,t.files,n);return a.suppressed=o,a.baselineFiltered=i,a.staleEntries=s,{...ua(t,a),files:t.files??[]}}async function Lr(e){let t=e.project,n=e.host??t.host,r=e.documents,o=e.externalModelDocuments,i=e.augmentations,s=[...e.projectDiagnostics??[]];if(!r||!o||!i){let a=await Ve(e.project,n);r??=a.documents,o??=a.externalModelDocuments,i??=a.augmentations,s=[...s,...a.diagnostics]}return up({...e,host:n,documents:r,externalModelDocuments:o,augmentations:i,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}async function ma(e,t,n){let r=e;for(;;){for(let i of t){let s=Q.join(r,i);if(await n.exists(s))return s}let o=Q.dirname(r);if(o===r)return;r=o}}async function dp(e,t){return ma(e,["btxml.config.json"],t)}async function da(e,t){return JSON.parse(await t.readFile(e))}function pa(e,t){return e.map(n=>w(n.code,n.severity==="error"?b.Error:b.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function fa(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await dp(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[w("CFG006_CONFIG_PATH_NOT_FOUND",b.Error,`config file not found \`${t}\``,void 0,t,{help:"check the `--config` path or run without `--config` to use config discovery"})]};try{n=await da(t,e.host)}catch(i){let s=String(i.message||i);return{ok:!1,configUri:t,diagnostics:[w("CFG001_INVALID_CONFIG_JSON",b.Error,"invalid configuration JSON",void 0,t,{primaryLabel:"the config file could not be parsed as JSON",help:"fix the JSON syntax in the config file",notes:[s]})]}}}else{let i=await ma(e.startUri,["package.json"],e.host);if(i)try{let s=await da(i,e.host);s.btxml&&(n=s.btxml,t=i)}catch{n={}}}let r=Rt(n);if(!r.ok)return{ok:!1,configUri:t,diagnostics:pa(r.diagnostics,t)};let o=Qn(r.value);return o.length>0?{ok:!1,configUri:t,diagnostics:pa(o,t)}:{ok:!0,config:r.value,configUri:t,diagnostics:[]}}async function ga(e,t,n,r){let o=await jt(t.files,e,[],n.followSymlinks,void 0,void 0,r),i=await jt(t.definitions,e,[],n.followSymlinks,void 0,void 0,r),s=await jt(t.augmentations,e,[],n.followSymlinks,void 0,void 0,r),a=o.files.map(u=>({path:$(e,u),uri:u,kind:"model-xml"})),l=i.files.map(u=>({path:$(e,u),uri:u,kind:"node-definition"})),c=s.files.map(u=>({path:$(e,u),uri:u,kind:"model-augmentation"}));return{modelFiles:a,augmentationFiles:c,definitionFiles:l,unmatchedPatterns:{models:o.unmatchedPatterns,augmentations:s.unmatchedPatterns,definitions:i.unmatchedPatterns}}}async function pp(e){if(e.configUri)return Q.dirname(e.configUri);let t=e.startUri;for(;;){if(await e.host.exists(Q.join(t,".git"))||await e.host.exists(Q.join(t,".colcon")))return t;let n=Q.dirname(t);if(n===t)return e.startUri;t=n}}async function jr(e){let t=await fa({startUri:e.rootUri,configUri:e.configUri,noConfig:e.noConfig,host:e.host});if(!t.ok||!t.config)return{ok:!1,diagnostics:t.diagnostics};let n=kt(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let r=n.config,o=await pp({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:i,skippedFiles:s}=await Fi(o,r.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?$(o,t.configUri):"",c=Oi(r.resolver);for(let f of c){let x=Q.join(o,f.file);await e.host.exists(x)&&!i.some(B=>B.uri===x)&&i.push({path:f.file,uri:x,kind:"bt-xml"})}let{modelFiles:u,augmentationFiles:d,definitionFiles:p,unmatchedPatterns:m}=await ga(o,r.models,r.files,e.host);for(let f of m.models)a.push(w(S.ExternalModelFileNotFound,b.Error,`external TreeNodesModel file not found \`${f}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let f of m.definitions)a.push(w(S.NodeDefinitionFileNotFound,b.Error,`node definition file not found \`${f}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let f of m.augmentations)a.push(w(S.AugmentationFileNotFound,b.Error,`model augmentation file not found \`${f}\``,void 0,l,{help:"check `models.augmentations` and make sure the file exists"}));let g=r.models.builtins;return a.push(...await Ui(o,c,l,e.host)),{ok:!0,diagnostics:a,project:{rootUri:o,configUri:t.configUri,host:e.host,config:t.config,resolvedConfig:r,selectedFiles:i,entrypoints:c,modelFiles:u,augmentationFiles:d,definitionFiles:p,skippedFiles:s,modelsBuiltins:g}}}function ya(e){return[...e.files.values()]}function ba(e){return[...e.reachableDocuments.values()]}function ha(e){return e.workspace}function Sa(e){return[...e.nodeDefinitionModels]}function va(e){if(!e.includeGraph)return;let t=new Map;for(let s of e.files.values())s.path&&t.set(s.path,s.uri);let n=[];for(let[s,a]of e.includeGraph.nodes.entries()){let l=a.document?.uri??t.get(s)??s;n.push({path:s,uri:l,exists:a.exists})}let r=e.includeGraph.edges.map(s=>({from:s.from,to:s.to,includeElementRange:s.includeElementRange,includePathRange:s.includePathRange})),o=[];for(let s of e.facts.includeIssuesByUri.values())for(let a of s)o.push({kind:a.kind,uri:a.uri,path:"path"in a?a.path:void 0,message:a.message,range:a.range});let i=[...n];return i.sort((s,a)=>s.path.localeCompare(a.path)),{nodes:i,edges:r,issues:o}}async function Fr(e){let t=e.project,n=t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let r=e.host??t.host,o=e.documents,i=e.externalModelDocuments,s=e.augmentations,a=[];if(!o||!i||!s){let c=await Ve(e.project,r);a.push(...c.diagnostics),o??=c.documents,i??=c.externalModelDocuments,s??=c.augmentations}let l=await Rr({project:e.project,documents:o,activeDocumentUris:new Set(o.map(c=>c.uri)),externalModelDocuments:i,augmentations:s,resolveGraph:e.resolveGraph,resolvedConfig:n,host:r});return a.push(...l.diagnostics),{ok:l.ok,diagnostics:a,semanticIndex:ha(l.index),documents:ya(l.index),reachableDocuments:ba(l.index),nodeDefinitionModels:Sa(l.index),includeGraph:va(l.index)}}import Ra from"path";import{fileURLToPath as hp,pathToFileURL as ka}from"url";function Sp(e){return e.startsWith("file://")?e:ka(Ra.resolve(e)).href}function Or(e){return hp(Sp(e))}function ut(e){return ka(Ra.resolve(e)).href}function Ur(e){return Or(fr(e))}function Ta(e){return e?.documents??[]}function vp(e,t){if(t.uri===e.uri)return!0;if(e.uri.startsWith("file://"))try{let n=new URL(e.uri).pathname;if(t.uri.startsWith("file://")&&new URL(t.uri).pathname===n||t.path&&(t.path.startsWith("file://")?new URL(t.path).pathname:t.path)===n)return!0}catch{return!1}return!1}function Rp(e){let t=Qe();return e?{files:e.files??t.files,resolver:e.resolver??t.resolver,models:e.models??t.models,linter:e.linter??t.linter,formatter:e.formatter??t.formatter}:t}function me(e,t){let n=ye(e.document.text,{kind:e.document.languageId==="btcpp-xml"?"bt-xml":void 0,uri:e.document.uri,mode:"mode"in e?e.mode??"tolerant":"tolerant"}),r="workspace"in e?e.workspace:void 0,o=n.document?[n.document,...Ta(r).filter(u=>!vp(e.document,u))]:Ta(r),i=Rp(e.config||t.config),s=oe(i),a=r?.nodeDefinitionModels??[],l=Fe(o,{config:i,models:a,augmentations:t.augmentations}).index,c=n.document?G(n.document,{semantic:l,config:i,policy:s}):void 0;return{document:e.document,parsed:n.document,documentView:c,diagnostics:n.document?zt(n.document,l,{config:i,documentView:c}):n.diagnostics,partial:n.partial===!0,semantic:l,config:i,nodeUsagePolicy:s,workspace:r}}function xa(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:D(r,r),newText:n}}function Ia(e,t){let r=(t.fullRange?.start||t.range.start).offset;for(;r>0&&/[ \t]/.test(e.text[r-1]||"");)r-=1;return{range:D(e.positionAt(r),e.positionAt(t.range.end.offset)),newText:""}}function Da(e,t,n){let r=Math.max(t.openTagRange.end.offset-(t.selfClosing?2:1),t.openTagRange.start.offset),o=e.positionAt(r);return{range:D(o,o),newText:` ${n}=""`}}function Bn(e){return D(e.positionAt(0),e.positionAt(e.text.length))}function Vr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=_t(t.document.text,e.config.formatter);o.ok&&!o.skipped&&o.text!==t.document.text&&r.push({title:"Format document",kind:"source.format",edits:[{range:Bn(t.document),newText:o.text}]});for(let i of n){if(!i.range)continue;let s=ne({document:t.document,parsed:e.parsed,position:i.range.start});if(i.code==="BT101_MISSING_REQUIRED_PORT"){let a=Math.min(i.range.start.offset+1,i.range.end.offset),l=e.parsed?.root&&st(e.parsed.root,a)||("element"in s?s.element:void 0);if(!l)continue;let c=O(e.semantic,{element:l,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}),u=c.ports.find(d=>d.required&&!c.portUsages.some(p=>p.status==="resolved"&&p.name===d.name));u&&r.push({title:`Add missing port ${u.name}`,kind:"quickfix",diagnostics:[i],edits:[Da(t.document,l,u.name)]})}if(i.code==="BT102_UNKNOWN_PORT"&&"attribute"in s&&"element"in s&&s.attribute){let l=(s.element?O(e.semantic,{element:s.element,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}):void 0)?.portUsages.find(u=>u.status==="undeclared"&&u.attribute===s.attribute),c=l?Ia(t.document,s.attribute):void 0;c&&l&&r.push({title:`Remove unknown port ${s.attribute.name}`,kind:"quickfix",diagnostics:[i],edits:[c]})}if(i.code==="BT002_MISSING_BTCPP_FORMAT"&&e.parsed?.root){let a=t.document.positionAt(e.parsed.root.nameRange?.end.offset||e.parsed.root.openTagRange.end.offset-1);r.push({title:'Add BTCPP_format="4" to <root>',kind:"quickfix",diagnostics:[i],edits:[{range:D(a,a),newText:' BTCPP_format="4"'}]})}r.push({title:`Suppress ${i.code} for next line`,kind:"quickfix",diagnostics:[i],edits:[xa(t.document,i.range.start.line,`<!-- btxml-disable-next-line ${i.code} reason: TODO -->
16
+ `)]})}return{actions:r}}function U(e,t,n,r,o){return{label:e,kind:t,detail:n,textEdit:r,insertText:e,sortText:e,...o}}function K(e,t){return e?{range:e,newText:t}:void 0}function Me(e){let t=new Set;return e.filter(n=>{let r=`${n.kind}:${n.label}:${n.insertText||""}`;return t.has(r)?!1:(t.add(r),!0)})}function qr(e){return je(e)}function Je(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function Ca(e,t){return!e||!t?!1:Je(e)===Je(t)}function Ba(e){let t=new Map;for(let n of e.documentView?.nodes??[])for(let r of n.portBindings){if(r.declaredPort.status!=="resolved")continue;let o=r.declaredPort.port;for(let i of r.blackboardReferences){if(i.syntax==="invalid")continue;let s={identity:i.identity,key:i.key,scope:i.scope,type:o.type,direction:o.direction,nodeType:n.usage.nodeType||n.tagName,portName:o.name},a=t.get(i.identity);if(!a){t.set(i.identity,s);continue}let l=Je(a.type),c=Je(s.type);if(l&&c&&l!==c){t.set(i.identity,{...a,conflict:!0});continue}!l&&c&&t.set(i.identity,{...a,type:s.type})}}return[...t.values()]}function kp(e,t,n){return D(e.positionAt(t),e.positionAt(n))}function Tp(e,t,n){let r=t.valueContentRange;if(!r)return;let o=r.start.offset,i=r.end.offset,s=e.text.slice(o,i),a=s.startsWith("{"),l=s.endsWith("}");if(a&&n>o){let c=o+1,u=s[1]==="@"?c+1:c,d=l?i-1:i;return{replacementRange:kp(e,u,Math.max(u,d)),wrapsReference:!1,hasScopeMarker:s[1]==="@"}}return{insertText:t.value,replacementRange:r,wrapsReference:!0,hasScopeMarker:!1}}function $r(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,s=Tp(t,n,r),a=s?.wrapsReference??!1,l=s?.hasScopeMarker??!1;if(l&&o.scope!=="global")return;let c=o.key;a?c=qr(o):o.scope==="global"&&(c=`@${o.key}`);let u=o.key;a?u=qr(o):o.scope==="global"&&(u=l?o.key:`@${o.key}`);let d=o.scope==="global"?` @${o.key}`:"",p=`${o.key} ${c}${d}`.trim();return U(c,"Reference",i,s?{range:s.replacementRange,newText:u}:void 0,{filterText:p,insertText:u})}var Ea=new WeakMap;function dt(e,t){let n=e.parsed?ne({document:e.document,parsed:e.parsed,position:t}):void 0;if(!n||n.kind!=="attribute-value")return;let r=Gr(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,s=Hr(r.attribute,i),a=xn({source:r.source,cursorOffset:s});if(a.kind!=="identifier"||s<a.range.start||s>a.range.end)return;let l=Aa(e,r),c=l.analysis?.resolvedIdentifiers.find(d=>d.access.range.start===a.range.start&&d.access.range.end===a.range.end&&d.resolution.kind!=="unknown");if(!c||c.resolution.kind==="unknown")return;let u=c.resolution.kind==="symbol"?{kind:"symbol",symbol:c.resolution.symbol}:c.resolution.kind==="global-blackboard"?{...c.resolution,origin:"script"}:c.resolution;return{attributeContext:r,range:Xr(e,r,a.range),reference:u,flowState:l,occurrence:{uri:e.document.uri,attributeContext:r,identifier:c.access,reference:u,documentRange:Xr(e,r,c.access.range)}}}function Pa(e,t){let n=(t.reference.kind==="global-blackboard"?ja(e):Pn(e,t.attributeContext.behaviorTree).flatMap(r=>_a(e,r))).filter(r=>t.reference.kind==="enum"?r.reference.kind==="enum"&&r.reference.name===t.reference.name:t.reference.kind==="global-blackboard"?r.reference.kind==="global-blackboard"&&r.reference.key===t.reference.key:Dp(t.reference.symbol,r.reference));return t.reference.kind==="global-blackboard"?Cp([...n,...La(e,t.reference.key)]):n}function Na(e,t){return Fa(La(e,t).map(n=>({uri:n.uri,range:n.documentRange})))}function wa(e,t){return Fa(ja(e).filter(n=>n.reference.kind==="global-blackboard"&&n.reference.key===t).map(n=>({uri:n.uri,range:n.documentRange})))}function zr(e,t){return Pn(e,t)}function Ma(e,t,n){let r=Gr(e,t,n);if(r)return Aa(e,r).environmentBefore}function Wr(e){let t=En(e.type);switch(e.source.kind){case"port-remap":return`${t} from ${e.source.nodeType??"node"}.${e.source.portName}`;case"global-blackboard-remap":return`${t} from global blackboard ${e.source.nodeType??"node"}.${e.source.portName}`;case"subtree-port":return`${t} from ${e.source.nodeType??"SubTree"}.${e.source.portName}`;case"script-assignment":return`${t} from earlier ${e.source.attributeName} declaration`;case"global-blackboard":return`${t} from global blackboard @${e.source.key}`;case"augmentation":return`${t} from augmentation`;case"enum":return`${t} enum`}}function En(e){return e.kind==="custom"?e.name:e.kind}function Aa(e,t){let r=Pn(e,t.behaviorTree).find(o=>o.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function Pn(e,t){let n=Ea.get(e);n||(n=new WeakMap,Ea.set(e,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(a=>a.element.attributes.flatMap(l=>{let c=Gr(e,a.element,l);return c?[c]:[]})),i=o.map(a=>({id:a.id,source:a.source,attributeName:a.attribute.name,originId:a.id})),s=Xt({baseEnvironment:xp(e,t.nodes),entries:i}).flatMap((a,l)=>{let c=o[l];return c?[{...a,context:c}]:[]});return n.set(t,s),s}function Gr(e,t,n){let r=e.documentView?.nodes.find(a=>a.element===t);if(!r)return;let o=r.usage.model.status==="resolved"?r.usage.model.model.id:r.usage.nodeType;if(!Xe({elementName:t.name,attributeName:n.name,resolvedNodeType:o}))return;let s=t.attributes.indexOf(n);return{id:`${r.path.join(".")}:${n.name}:${s}`,node:r,element:t,attribute:n,source:n.value,behaviorTree:r.behaviorTree}}function xp(e,t){let n=te(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let a=ie(e.semantic,i);if(a?.kind==="SubTree")for(let l of a.ports){let c=l.effectiveType??l.type,d=Z(e.semantic,c)?.canonical??c;r.push({name:l.name,type:xe(n,c),source:{kind:"subtree-port",nodeType:i,portName:l.name,direction:l.direction},readable:!0,writable:l.direction==="output"||l.direction==="inout",compatibilityKey:d})}}for(let a of t)for(let l of a.portBindings){if(l.declaredPort.status!=="resolved")continue;let c=Ua(l);if(!c||c.scope==="global")continue;let u=l.declaredPort.port.type,p=Z(e.semantic,u)?.canonical??u,m=l.declaredPort.port.direction,g=a.usage.model.status==="resolved"?a.usage.model.model.id:a.usage.nodeType;r.push({name:c.key,type:xe(n,u),source:{kind:"port-remap",nodeType:g,portName:l.declaredPort.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:p})}let s=Kr(e).flatMap(({trees:a})=>a.flatMap(l=>l.nodes));return o.push(...Ip(e,n,s)),$t({symbols:r,globalBlackboardSymbols:o,augmentations:Pt(e.semantic),areTypesCompatible:(a,l)=>a&&l?De(e.semantic,a,l):!0})}function Ip(e,t,n){let r=[];for(let o of n){let i=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let s of o.portBindings){if(s.declaredPort.status!=="resolved")continue;let a=Ua(s);if(!a||a.scope!=="global")continue;let l=s.declaredPort.port.type,u=Z(e.semantic,l)?.canonical??l,d=s.declaredPort.port.direction;r.push({name:a.key,type:xe(t,l),source:{kind:"global-blackboard-remap",nodeType:i,portName:s.declaredPort.port.name,direction:d,key:a.key},readable:d==="input"||d==="output"||d==="inout",writable:d==="output"||d==="inout",compatibilityKey:u})}}return r}function _a(e,t){return t.analysis?t.analysis.resolvedIdentifiers.flatMap(n=>{if(n.resolution.kind==="unknown")return[];let r=n.resolution.kind==="symbol"?{kind:"symbol",symbol:n.resolution.symbol}:n.resolution.kind==="global-blackboard"?{...n.resolution,origin:"script"}:n.resolution;return[{uri:e.document.uri,attributeContext:t.context,identifier:n.access,reference:r,documentRange:Xr(e,t.context,n.access.range)}]}):[]}function Dp(e,t){if(t.kind!=="symbol")return!1;let n=t.symbol;return e.source.kind==="script-assignment"||n.source.kind==="script-assignment"?e.source.kind==="script-assignment"&&n.source.kind==="script-assignment"&&e.name===n.name&&e.source.originId===n.source.originId&&e.source.range.start===n.source.range.start&&e.source.range.end===n.source.range.end:(e.source.kind==="port-remap"||e.source.kind==="subtree-port")&&e.source.kind===n.source.kind?e.name===n.name&&e.source.portName===n.source.portName&&e.source.nodeType===n.source.nodeType:e.name===n.name&&e.source.kind===n.source.kind}function Cp(e){let t=new Set,n=[];for(let r of e){let o=`${r.uri}:${r.documentRange.start.offset}:${r.documentRange.end.offset}:${r.reference.kind}`;t.has(o)||(t.add(o),n.push(r))}return n}function La(e,t){return Kr(e).flatMap(({uri:n,trees:r})=>r.flatMap(o=>o.nodes.flatMap(i=>i.portBindings.flatMap(s=>s.blackboardReferences.filter(a=>a.scope==="global"&&a.key===t).map(a=>({uri:n,attributeContext:{id:`${i.path.join(".")}:${s.attribute.name}:${i.element.attributes.indexOf(s.attribute)}`,node:i,element:i.element,attribute:s.attribute,source:s.attribute.value,behaviorTree:i.behaviorTree},identifier:{name:`@${a.key}`,kind:"read",range:{start:0,end:0},identifier:{kind:"Identifier",name:`@${a.key}`,range:{start:0,end:0}},statementIndex:-1},reference:{kind:"global-blackboard",key:a.key,origin:"port-remap"},documentRange:a.range}))))))}function ja(e){return Kr(e).flatMap(({uri:t,trees:n})=>n.flatMap(r=>{let o=Ep(e,t);return Pn(o,r).flatMap(i=>Bp(o,t,i))}))}function Bp(e,t,n){return _a(e,n).map(r=>({...r,uri:t}))}function Kr(e){let t=e.documentView?[{uri:e.document.uri,trees:e.documentView.behaviorTrees}]:[],r=(e.workspace?.documents??[]).filter(o=>o.uri!==e.document.uri).map(o=>{let i=G(o,{semantic:e.semantic,config:e.config,policy:e.nodeUsagePolicy});return{uri:o.uri,trees:i.behaviorTrees}}).filter(o=>o.trees.length>0);return[...t,...r]}function Ep(e,t){if(t===e.document.uri)return e;let n=e.workspace?.documents.find(i=>i.uri===t);if(!n)return e;let r=tt(t,n.originalText,0,"btcpp-xml"),o=G(n,{semantic:e.semantic,config:e.config,policy:e.nodeUsagePolicy});return{...e,document:r,parsed:n,documentView:o}}function Fa(e){let t=new Set,n=[];for(let r of e){let o=`${r.uri}:${r.range.start.offset}:${r.range.end.offset}`;t.has(o)||(t.add(o),n.push(r))}return n}function Xr(e,t,n){return Te(e.parsed??{originalText:e.document.text},t.attribute,n)}function Hr(e,t){let n=e.valueOffsets;if(!n||n.length===0)return t;if(t<=0)return 0;for(let r=1;r<n.length;r+=1){let o=n[r];if(o!==void 0&&o>=t){let i=n[r-1]??0;return t<=i?r-1:r}}return Math.max(0,n.length-1)}function Oa(e,t,n){let r=e.parsed??{originalText:e.document.text};return Te(r,t,n)}function Ua(e){if(e.declaredPort.status!=="resolved")return;let t=X({portName:e.declaredPort.port.name,rawValue:e.value});return t.ok?t.reference:void 0}function Pp(e,t,n){let r=e.documentView?.nodes.find(i=>i.element===t)?.usage,o=r?.model.status==="resolved"?r.model.model.id:r?.nodeType;return Xe({elementName:t.name,attributeName:n.name,resolvedNodeType:o})}function Va(e,t,n,r){let o=Pp(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,s=Ma(e,n,r),a=Math.max(0,t.position.offset-i.start.offset);return wr({source:r.value,cursorOffset:Hr(r,a),environment:s,attributeName:r.name,attributeInfo:o}).map(c=>Np(e,r,c))}function Np(e,t,n){return U(n.label,wp(n.kind),n.detail,{range:Oa(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function wp(e){switch(e){case"identifier":return"Variable";case"enum":return"Enum";case"value":return"Value";case"operator":return"Keyword";case"snippet":return"Snippet"}}var Nn={enumLiteral:"0",boolLiteral:"1",matchingKey:"2",unknownKey:"3"};function qa(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function $a(e,t){if(!e)return;let n=qa(e)?e.valueContentRange:e.valueRange;if(n)return K(n,qa(e)?t:`"${t}"`)}function Xa(e,t,n,r){let o=[],i=[];for(let s of Ce(e)){let a=Y(e,s),l=U(s,"Value","BehaviorTree ID",r?$a(r,s):K(n,s));a.some(c=>c.uri===t)?o.push({...l,sortText:`0-${s}`}):i.push({...l,sortText:`1-${s}`})}return[...o,...i]}function Mp(e){return U("SubTree","Class","Built-in subtree tag",K(e,"SubTree"),{sortText:"0-SubTree"})}function Ap(e){if(e.kind!=="closing-tag-name")return[];let t=e.tagText;if(!t)return[];let n=e.tagNamePrefix||"";return t.toLowerCase().startsWith(n.toLowerCase())?[U(`${t}>`,"Value","Close current parent tag",K(e.replacementRange,`${t}>`))]:[]}function _p(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(o=>U(o,"Class",void 0,K(t,o))),...["Action","Condition","Control","Decorator"].map(o=>U(o,"Class",void 0,K(t,o))),Mp(t)],r=new Set;for(let o of on(e))o.id!=="SubTree"&&(r.has(o.id)||(r.add(o.id),n.push(U(o.id,"Class",void 0,K(t,o.id)))));return Me(n)}function wn(e,t,n){return O(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function Yr(e,t){let n=new Set(e.element.attributes.map(r=>r.name));return e.ports.filter(r=>!n.has(r.name)).map(r=>U(r.name,"Property",`${r.direction}${r.type?` ${r.type}`:""}`,K(t,r.name)))}function Lp(e,t,n){let r=[U("ID","Property",void 0,K(n,"ID"))];return r.push(...Yr(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function jp(e,t,n,r){if(!e)return[];if(Oe(e.name)){let i=[];e.attributes.some(a=>a.name==="ID")||i.push(U("ID","Property",void 0,K(r,"ID")));let s=wn(n,t,e);return i.push(...Yr(s,r)),i}return e.name==="SubTree"?Lp(e,wn(n,t,e),r):e.name==="include"?[U("path","Property",void 0,K(r,"path"))]:Yr(wn(n,t,e),r)}function Fp(e,t,n,r){return Xa(t.semantic,e.document.uri,n,r)}function Op(e,t,n,r){let o=[],i=new Set;for(let s of on(e))s.kind===t&&(i.has(s.id)||(i.add(s.id),o.push(U(s.id,"Value",`${t} node ID`,r?$a(r,s.id):K(n,s.id)))));return o}function Up(e,t,n){if(t.kind!=="attribute-value")return[];let{attribute:r,element:o}=t;if(!r||!o)return[];let i=Oe(o.name);if(i&&r.name==="ID")return Op(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return Fp(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return Xa(n.semantic,e.document.uri,r.valueContentRange||r.valueRange,r);if(o.name==="include"&&r.name==="path")return(n.workspace?n.workspace.documents.map(E=>E.path||E.uri).filter(E=>E.endsWith(".xml")):[]).map(E=>U(E,"File","XML file",K(r.valueContentRange||r.valueRange,E)));let s=Va(n,e,o,r);if(s)return s;let a=wn(n,e,o);if(i&&a.model.status!=="resolved")return[];let l=ge(n.semantic,{element:o,documentRoot:n.parsed?.root,attributeName:r.name,uri:e.document.uri,config:n.config,policy:n.nodeUsagePolicy});if(l?.status!=="resolved")return[];let c=l.port,u=r.valueContentRange||r.valueRange,d=[];c.enum?.length&&d.push(...c.enum.map(k=>U(k,"Enum",c.type,K(u,k),{sortText:`${Nn.enumLiteral}-${k}`}))),(c.type||"").toLowerCase()==="bool"&&d.push(...["true","false"].map(k=>U(k,"Value","bool",K(u,k),{sortText:`${Nn.boolLiteral}-${k}`})));let p=Ba(n),m=Je(c.type),g=p.filter(k=>!k.conflict&&Ca(c.type,k.type)),f=p.filter(k=>!k.conflict&&!Je(k.type)&&m),x=g.flatMap(k=>{let E=$r({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:k,detail:k.scope==="global"?`${k.type||"unknown"} global blackboard key from ${k.nodeType}.${k.portName}`:`${k.type||"unknown"} blackboard key from ${k.nodeType}.${k.portName}`});return E?[{...E,sortText:`${Nn.matchingKey}-${k.scope==="global"?k.identity:k.key}`}]:[]}),B=f.flatMap(k=>{let E=$r({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:k,detail:k.scope==="global"?`unknown-type global blackboard key from ${k.nodeType}.${k.portName}`:`unknown-type blackboard key from ${k.nodeType}.${k.portName}`});return E?[{...E,sortText:`${Nn.unknownKey}-${k.scope==="global"?k.identity:k.key}`}]:[]});return d.push(...x,...B),d.length>0?Me(d):(t.valuePrefix||"").includes("{")?Me(d):d}function Jr(e,t){let n=ne({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:Yn.map(r=>U(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:Me(Up(t,n,e))}:n.kind==="attribute-name"?{items:Me(jp(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:Me(_p(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:Me(Ap(n))}:{items:[]}}function Mn(e){let t=new Set,n=[];for(let r of e){let o=`${r.uri}:${r.range.start.offset}:${r.range.end.offset}`;t.has(o)||(t.add(o),n.push(r))}return n}function Vp(e,t,n){return Ue(e,t).filter(r=>r.kind==="SubTree").map(r=>{if(r.idRange)return{uri:r.uri||n,range:r.idRange};if(r.range)return{uri:r.uri||n,range:r.range}}).filter(r=>!!r)}function Zr(e,t,n){return e?Mn(e.nodes.flatMap(r=>r.portBindings.flatMap(o=>o.blackboardReferences.filter(i=>i.identity===t).map(i=>({uri:n,range:i.range}))))):[]}function Qr(e,t,n,r,o,i,s){let a=Zr(e,i,s),l=(t??[]).flatMap(c=>{if(c.uri===s)return[];let u=G(c,{semantic:n,config:r,policy:o});return Zr(u,i,c.uri)});return Mn([...a,...l])}function eo(e,t,n){return Zr(e,t,n)}function An(e,t,n,r,o,i,s){if(!e)return[];let a=ne({document:{uri:e.uri,languageId:"xml",version:0,text:e.originalText,positionAt:()=>n,offsetAt:()=>n.offset,getText:()=>e.originalText},parsed:e,position:n}),l="element"in a?a.element:void 0,c="attribute"in a?a.attribute:void 0,u=l?O(r,{element:l,documentRoot:e.root,uri:e.uri,config:o,policy:i}):void 0;if(l?.name==="SubTree"&&c?.name==="ID"){if(u?.tagForm==="model-definition")return Y(r,c.value).map(m=>m.idRange?{uri:m.uri,range:m.idRange}:void 0).filter(m=>!!m);let d=Vp(r,c.value,e.uri),p=u?.subtree?.target;if(p?.status==="resolved"&&p.kind==="behavior-tree"){let m=p.behaviorTree;return m.idRange?Mn([{uri:m.uri,range:m.idRange},...d]):d}if(p?.status==="ambiguous")return Mn([...p.behaviorTrees.map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:void 0),...d].filter(m=>!!m));if(p?.status==="resolved"&&p.kind==="node-model"){if(d.length>0)return d;if(p.model.idRange)return[{uri:p.model.uri||e.uri,range:p.model.idRange}]}return d}if(l?.name==="root"&&c?.name==="main_tree_to_execute")return Y(r,c.value).map(d=>d.idRange?{uri:d.uri,range:d.idRange}:void 0).filter(d=>!!d);if(l?.name==="include"&&c?.name==="path"&&s){let d=s.find(p=>p.uri===c.value||p.path===c.value||(p.path?p.path.endsWith(`/${c.value}`):!1));if(d?.root?.range)return[{uri:d.uri,range:d.root.range}]}if(c&&l){let d=t?ot(t,n):void 0,p=d?.blackboardReferences.find(m=>n.offset>=m.range.start.offset&&n.offset<=m.range.end.offset);if(p)return p.scope==="global"?Qr(t,s,r,o,i,p.identity,e.uri):eo(t,p.identity,e.uri);if(d?.declaredPort.status==="resolved"){let m=d.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(a.kind==="tag-name"&&l&&u?.model.status==="resolved"){let d=u.model.model;if(d.idRange)return[{uri:d.uri||e.uri,range:d.idRange}];if(d.range)return[{uri:d.uri||e.uri,range:d.range}]}if(c?.name==="ID"&&u?.tagForm==="generic-node"&&u.model.status==="resolved"){let d=u.model.model;if(d.idRange)return[{uri:d.uri||e.uri,range:d.idRange}];if(d.range)return[{uri:d.uri||e.uri,range:d.range}]}return[]}function to(e,t){let n=dt(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let o=r.source,s=zr(e,n.attributeContext.behaviorTree).find(a=>a.id===o.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:Te(e.parsed??{originalText:e.document.text},s.attribute,o.range)}]}}if(r.source.kind==="port-remap"||r.source.kind==="global-blackboard-remap"){let o=r.source,i=z({scope:o.kind==="global-blackboard-remap"?"global":"local",key:r.name}),s=e.documentView?.nodes.filter(l=>l.behaviorTree===n.attributeContext.behaviorTree).flatMap(l=>l.portBindings).filter(l=>l.declaredPort.status==="resolved").find(l=>l.declaredPort.port.name===o.portName&&l.declaredPort.port.direction===o.direction&&l.blackboardReferences.some(c=>c.identity===i)),a=s?.declaredPort.port.nameRange;if(a)return{locations:[{uri:s.declaredPort.port.uri||e.document.uri,range:a}]}}if(r.source.kind==="subtree-port"){let o=r.source,s=(o.nodeType?ie(e.semantic,o.nodeType):void 0)?.ports.find(a=>a.name===o.portName&&a.direction===o.direction);if(s?.nameRange)return{locations:[{uri:s.uri||e.document.uri,range:s.nameRange}]}}}if(n?.reference.kind==="global-blackboard"){let r=z({scope:"global",key:n.reference.key}),o=Na(e,n.reference.key);if(o.length>0)return{locations:o};let i=n.reference.symbol;if(i?.source.kind==="global-blackboard"){let s=i.source,l=zr(e,n.attributeContext.behaviorTree).find(c=>c.id===s.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:Te(e.parsed??{originalText:e.document.text},l.attribute,s.range)}]}}}return{locations:An(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function no(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function za(e,t){let n=_t(e.document.text,{indentWidth:t?.indentWidth,xmlDeclaration:t?.xmlDeclaration,blankLineBetweenBehaviorTrees:t?.blankLineBetweenBehaviorTrees,lineEnding:t?.lineEnding});return!n.ok||n.skipped?{edits:[],diagnostics:n.diagnostics}:n.text===e.document.text?{edits:[],diagnostics:[]}:{edits:[{range:Bn(e.document),newText:n.text}],diagnostics:[]}}function ro(e,t){return za(t,e.config.formatter)}function Wa(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
16
17
  Description: ${e.description}`:""}`].join(`
17
- `)}function Ta(e){let t=e.source==="builtin"?`${e.kind.toLowerCase()} node`:`${e.kind} node`;return`**${t[0].toUpperCase()}${t.slice(1)}** \`${e.id}\`${e.ports.length?`
18
+ `)}function Ga(e){let t=e.source==="builtin"?`${e.kind.toLowerCase()} node`:`${e.kind} node`;return`**${t[0].toUpperCase()}${t.slice(1)}** \`${e.id}\`${e.ports.length?`
18
19
 
19
- Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function hm(e,t){return`**SubTree** \`${e}\`
20
+ Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function qp(e,t){return`**SubTree** \`${e}\`
20
21
 
21
22
  Resolves ambiguously across ${t.length} candidates:
22
23
  ${t.map(n=>`- \`${n}\``).join(`
23
- `)}`}function Sm(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function $r(e,t){let n=rt(e,t.position);if(n){if(n.reference.kind==="enum")return{range:n.range,contents:`**Enum** \`${n.reference.name}\`
24
+ `)}`}function $p(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function oo(e,t){let n=dt(e,t.position);if(n){if(n.reference.kind==="enum")return{range:n.range,contents:`**Enum** \`${n.reference.name}\`
24
25
 
25
- Value: \`${n.reference.value}\``};let u=n.reference.symbol;return{range:n.range,contents:[`**Script Symbol** \`${u.name}\``,"",`Type: \`${Ar(u.type)}\``,`Source: ${pa(u)}`].join(`
26
- `)}}let r=Q({document:t.document,parsed:e.parsed,position:t.position}),o="element"in r?r.element:void 0,i="attribute"in r?r.attribute:void 0,s=o?F(e.semantic,{element:o,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}):void 0;if(o?.name==="SubTree"&&i?.name==="ID"){let u=s?.subtree?.target;if(u?.status==="resolved"&&u.kind==="behavior-tree"){let l=u.behaviorTree;return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
26
+ Value: \`${n.reference.value}\``};if(n.reference.kind==="global-blackboard"){let c=n.reference.symbol;return{range:n.range,contents:c?[`**Global Blackboard** \`@${n.reference.key}\``,"",`Type: \`${En(c.type)}\``,`Source: ${Wr(c)}`].join(`
27
+ `):`**Global Blackboard** \`@${n.reference.key}\``}}let l=n.reference.symbol;return{range:n.range,contents:[`**Script Symbol** \`${l.name}\``,"",`Type: \`${En(l.type)}\``,`Source: ${Wr(l)}`].join(`
28
+ `)}}let r=ne({document:t.document,parsed:e.parsed,position:t.position}),o="element"in r?r.element:void 0,i="attribute"in r?r.attribute:void 0,s=o?O(e.semantic,{element:o,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}):void 0;if(o?.name==="SubTree"&&i?.name==="ID"){let l=s?.subtree?.target;if(l?.status==="resolved"&&l.kind==="behavior-tree"){let c=l.behaviorTree;return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
27
29
 
28
- Resolves to \`BehaviorTree ID="${i.value}"\` in \`${l.uri}\`.`}}if(u?.status==="ambiguous"){let l=e.parsed?.uri||"workspace",c=Sm([...u.behaviorTrees,...u.definitions],l);return{range:i.valueContentRange||i.valueRange,contents:hm(i.value,c)}}if(u?.status==="resolved"&&u.kind==="node-model")return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
30
+ Resolves to \`BehaviorTree ID="${i.value}"\` in \`${c.uri}\`.`}}if(l?.status==="ambiguous"){let c=e.parsed?.uri||"workspace",u=$p([...l.behaviorTrees,...l.definitions],c);return{range:i.valueContentRange||i.valueRange,contents:qp(i.value,u)}}if(l?.status==="resolved"&&l.kind==="node-model")return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
29
31
 
30
- Resolves to SubTree model in \`${u.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let u=e.documentView?Je(e.documentView,t.position):void 0;if(u?.declaredPort.status==="resolved")return{range:i.nameRange,contents:Ra(u.declaredPort.port)};let l=pe(e.semantic,{element:o,documentRoot:e.parsed?.root,attributeName:i.name,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy});if(l?.status==="resolved")return{range:i.nameRange,contents:Ra(l.port)}}let a=e.documentView?Zt(e.documentView,t.position):void 0;if(a&&a.usage.model.status==="resolved"){let u=a.usage.model.model;return{range:a.element.nameRange||a.element.openTagRange,contents:Ta(u)}}return o&&s?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:Ta(s.model.model)}:{}}function Xr(e,t){return Wn(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function xa(e){let t=new Set,n=[];for(let r of e){let o=`${r.uri}:${r.range.start.offset}:${r.range.end.offset}`;t.has(o)||(t.add(o),n.push(r))}return n}function bm(e,t){let n=new Set;for(let r of t){let o=zn(e.semantic).find(s=>zr(r,{uri:s.uri,range:s.idRange}));o&&n.add(o.id);let i=Gn(e.semantic).find(s=>s.kind==="SubTree"&&(zr(r,{uri:s.uri,range:s.idRange})||zr(r,{uri:s.uri,range:s.range})));i&&n.add(i.id)}return[...n]}function zr(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function Wr(e,t){let n=rt(e,t.position);if(n)return{locations:xa(ca(e,n).map(u=>({uri:e.document.uri,range:u.documentRange})))};let r=e.parsed?Q({document:t.document,parsed:e.parsed,position:t.position}):void 0,o=r&&"element"in r?r.element:void 0,i=r&&"attribute"in r?r.attribute:void 0;if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:Xr(e,i.value)};if(o&&i?.name==="ID"&&F(e.semantic,{element:o,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}).tagForm==="model-definition"&&o.name==="SubTree")return{locations:Xr(e,i.value)};let s=kn(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents);if(s.length===0)return{locations:[]};let a=bm(e,s);return a.length>0?{locations:xa(a.flatMap(u=>Xr(e,u)))}:{locations:[]}}function vm(e,t){return e.attributes.find(n=>n.name===t)}function Gr(e){let t=e.name==="BehaviorTree"?vm(e,"ID")?.value||"BehaviorTree":e.name,n=e.name==="BehaviorTree"?"Class":e.name==="TreeNodesModel"?"Namespace":e.name==="include"?"File":e.name==="SubTree"?"Reference":["input_port","output_port"].includes(e.name)?"Property":"Function",r=e.children.filter(o=>o.kind==="element").map(o=>Gr(o));return{name:t,detail:e.name,kind:n,range:e.range,selectionRange:e.nameRange||e.openTagRange,children:r.length>0?r:void 0}}function Kr(e,t){return e.parsed?.root?{symbols:[Gr(e.parsed.root)]}:{symbols:[]}}function Rm(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function ka(e={}){return{getDiagnostics(t){return Rm(Vr(de(t,e),t))},getCompletions(t){return Ur(de(t,e),t)},getHover(t){return $r(de(t,e),t)},getDefinition(t){return Or(de(t,e),t)},getReferences(t){return Wr(de(t,e),t)},getDocumentSymbols(t){return Kr(de(t,e),t)},getCodeActions(t){return Nr(de(t,e),t)},getFormattingEdits(t){return qr(de(t,e),t)}}}var Da={line:0,character:0,offset:0},jt={start:Da,end:Da};function Tm(e){return e?Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>({name:t,value:n??"",range:jt,nameRange:jt,valueRange:jt})):[]}function xm(e,t){return{kind:"element",name:e,attributes:Tm(t),children:[],range:jt,openTagRange:jt,selfClosing:!0}}function km(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function Hr(e){return e===null?"null":e===void 0?"undefined":typeof e=="string"?JSON.stringify(e):typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`[${e.map(t=>Hr(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Hr(r)}`).join(",")}}`:JSON.stringify(String(e))}function Dm(e){return Hr(e)}function Im(e,t,n,r,o){let i=de({document:e,workspace:t,config:r,mode:"tolerant"},{});return{document:e,documentVersion:e.version,workspace:t,workspaceVersion:n,configFingerprint:o,diagnostics:{diagnostics:i.diagnostics,partial:i.partial},parsed:i.parsed,semantic:i.semantic,config:i.config,nodeUsagePolicy:i.nodeUsagePolicy}}function Ia(e){let t=e?.root;if(!t)return!1;if(t.name==="BehaviorTree"||t.name==="TreeNodesModel")return!0;let n=t.children.some(i=>i.kind==="element"&&i.name==="BehaviorTree"),r=t.children.some(i=>i.kind==="element"&&i.name==="TreeNodesModel"),o=t.attributes.some(i=>i.name==="BTCPP_format"&&i.value==="4");return t.name==="root"&&(o||n||r)}function Ca(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function Ea(e,t){if(!t.startsWith("file://"))return;let n=Ca(e),r=Ca(gt(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function Pa(e={}){let t=e,n=new Map,r=new Map,o=ka(),i=[],s=e.config?pt(e.config).config:void 0;function a(){return t.getRuntimeState?.()}function u(){return a()?.workspace}function l(){return a()?.version??0}function c(g,S){let R=u(),T=l(),A=Dm(S),j=r.get(g.uri);if(j&&j.documentVersion===g.version&&j.workspaceVersion===T&&j.document===g&&j.workspace===R&&j.configFingerprint===A)return j;let O=Im(g,R,T,S,A);return r.set(g.uri,O),O}function d(g){if(g.parsed)return g.view||(g.view=Jt(g.parsed,g.semantic,{config:g.config,policy:g.nodeUsagePolicy})),g.view}function m(g){return g.models||(g.models=Rt(g.semantic)),g.models}function f(g){let S=u();return S?S.documents.some(R=>R.isBtXml&&R.uri===g):!1}function y(g){let S=N.getResolvedConfig();if(!S)return!1;let R=u()?.rootDir??e.configBasePath,T=R?Ea(R,g):void 0;return T!==void 0?zt(S,T):jn(S,g)}function p(g,S){return g.languageId==="btcpp-xml"||S.parsed?.isBtXml===!0||Ia(S.parsed)||y(g.uri)||f(g.uri)}function x(g,S){return g.languageId==="btcpp-xml"||S.parsed?.isBtXml===!0||Ia(S.parsed)||f(g.uri)}function E(g){let S=n.get(g);if(!S)return;let R=N.getEffectiveConfigForDocument(S.uri),T=c(S,R);if(p(S,T))return{document:S,effectiveConfig:R,snapshot:T,emitDiagnostics:x(S,T)}}function k(g,S){let R=n.get(g);if(!R)return{diagnostics:[]};let T=c(R,S),A=d(T);return A?{view:A,diagnostics:T.diagnostics.diagnostics,partial:T.diagnostics.partial}:{diagnostics:T.diagnostics.diagnostics,partial:T.diagnostics.partial}}let N={openDocument(g,S,R=0,T="xml"){n.set(g,Ot(g,S,R,T)),r.delete(g)},updateDocument(g,S,R=0,T="xml"){n.set(g,Ot(g,S,R,T)),r.delete(g)},closeDocument(g){n.delete(g),r.delete(g)},getResolvedConfig(){return a()?.resolvedConfig??s},getEffectiveConfigForDocument(g){let S=this.getResolvedConfig();if(!S)return;let R=u()?.rootDir??e.configBasePath,T=R?Ea(R,g):void 0;return T!==void 0?J(S,T):Fn(S,g)},getDocument(g){return n.get(g)},getDiagnostics(g){let S=E(g);if(!S||!S.emitDiagnostics)return{diagnostics:[]};let R={diagnostics:S.snapshot.diagnostics.diagnostics};return S.snapshot.diagnostics.partial&&(R.partial=!0),R},getWorkspaceDiagnostics(){return{diagnostics:[...a()?.diagnostics??i]}},getSemanticDocumentView(g){let S=E(g);return S?k(g,S.effectiveConfig):{diagnostics:[]}},getNodeCatalog(g){let S=E(g);return S?{models:m(S.snapshot)}:{models:[]}},getSemanticNode(g,S){let R=E(g);return R?{node:k(g,R.effectiveConfig).view?.nodes.find(A=>A.nodeId===S)}:{}},getNodeUsageAt(g,S){let R=E(g);if(!R)return{};let T=d(R.snapshot);if(!R.snapshot.parsed||!T)return{};let A=Qt(T,S);return A?{node:A,usage:A.usage}:{}},getNodeModelById(g,S){let R=S??n.keys().next().value;return R?{model:this.getNodeCatalog(R).models.find(A=>A.id===g)}:{}},getChildCapability(g,S,R){if(S==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let T=Ae(S);if(T==="Control")return{capable:!0,reason:"generic-control"};if(T==="Decorator")return{capable:!0,reason:"generic-decorator"};if(T==="Action"||T==="Condition")return{capable:!1,reason:"generic-leaf"};let A=E(g);if(!A)return{capable:!1,reason:"unknown-model"};let j=F(A.snapshot.semantic,{element:xm(S,R),documentRoot:A.snapshot.parsed?.root,uri:g,config:A.snapshot.config,policy:A.snapshot.nodeUsagePolicy});return j.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:j.nodeType}:{...km(j.model.model.kind),modelId:j.model.model.id}},getPortInfoAt(g,S){let R=E(g);if(!R)return{};let T=d(R.snapshot);if(!R.snapshot.parsed||!T)return{};let A=en(T,S),j=this.getNodeUsageAt(g,S),O=j.node,v=A&&O?pe(R.snapshot.semantic,{element:O.usage.element,documentRoot:R.snapshot.parsed.root,attributeName:A.portName,uri:g,config:R.snapshot.config,policy:R.snapshot.nodeUsagePolicy}):void 0;return{node:O,binding:A,port:A?.resolution.status==="resolved"?A.resolution.port:void 0,usage:v,nodeUsage:j.usage}},getFormattingEdits(g){let S=E(g);return S?o.getFormattingEdits({document:S.document,config:S.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(g,S,R){let T=E(g);return T?o.getCompletions({document:T.document,position:S,workspace:u(),triggerCharacter:R,config:T.effectiveConfig}):{items:[]}},getHover(g,S){let R=E(g);return R?o.getHover({document:R.document,position:S,workspace:u(),config:R.effectiveConfig}):{}},getDefinition(g,S){let R=E(g);return R?o.getDefinition({document:R.document,position:S,workspace:u(),config:R.effectiveConfig}):{locations:[]}},getReferences(g,S){let R=E(g);return R?o.getReferences({document:R.document,position:S,workspace:u(),config:R.effectiveConfig}):{locations:[]}},getDocumentSymbols(g){let S=E(g);return S?o.getDocumentSymbols({document:S.document,workspace:u(),config:S.effectiveConfig}):{symbols:[]}},getCodeActions(g,S,R){let T=E(g);return T?o.getCodeActions({document:T.document,range:S,diagnostics:R,workspace:u(),config:T.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return N}function Pm(e,t){if(t.uri.startsWith("file://"))return t.uri;if(t.path?.startsWith("file://"))return t.path;let n=t.path&&!Ne.isAbsolute(t.path)?t.path:t.uri;return nt(Ne.resolve(e,n))}function Ba(e,t){return t.map(n=>{let r=Pm(e,n),o=n.path?.startsWith("file://")?Be(n.path):n.path;return{...n,uri:r,path:o}})}function Bm(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function Nm(e){return e.startsWith("file://")?e:Yr(Ne.resolve(e)).href}function Be(e){return Em(Nm(e))}function wm(e){return Yr(Ne.resolve(e)).href}function Mm(e){let t=e.toLowerCase();return t.endsWith(".xml")||t.endsWith(".json")||t.endsWith("btxml.config.json")||t.includes("treenodesmodel")}function Am(e){return e.replace(/\\/g,"/").replace(/\/$/,"")}function _m(e,t){let n=Am(e),r=Be(t).replace(/\\/g,"/");return r===n?"":r.startsWith(`${n}/`)?r.slice(n.length+1):t}function Lm(e,t,n,r){return e&&t&&n.startsWith("file://")?J(e,_m(t,n)):r}function jm(e,t){let n=wm(t),r=e.realpath;return{rootUri(){return n},readFile(i){return e.readFile(i)},exists(i){return e.exists(i)},async stat(i){return e.stat?e.stat(i):void 0},async readDir(i){return[...await e.readDir(i)]},realpath:r?async i=>r(i):void 0}}function Na(e){return{ok:e.projectOk??e.ok,diagnostics:e.diagnostics}}function wa(e=process.cwd()){let t=Ne.resolve(e);return{async readFile(n){return Ft.readFile(Be(n),"utf8")},async exists(n){try{return await Ft.access(Be(n),Cm.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(n){try{let r=await Ft.stat(Be(n));return{type:Bm(r),size:r.size}}catch{return}},async readDir(n){return(await Ft.readdir(Be(n),{withFileTypes:!0})).map(o=>({name:o.name,type:o.isFile()?"file":o.isDirectory()?"directory":"other"}))},async realpath(n){let r=await Ft.realpath(Be(n));return Yr(Ne.isAbsolute(r)?r:Ne.resolve(t,r)).href}}}function Ma(e={}){let t=e.host??wa(e.cwd),n,r=0,o,i,s;async function a(c={}){i=Object.keys(c).length>0?{...c}:void 0;let d=e.config,m=c.projectRoot||e.projectRoot||c.cwd||e.cwd||process.cwd(),f=c.cwd||e.cwd||m,y=jm(c.host??t,m),p=await Cr({rootUri:nt(m),configUri:c.configPath||e.configPath?nt(Ne.resolve(f,c.configPath||e.configPath||"")):void 0,host:y});if(!p.project)return n={version:++r,diagnostics:p.diagnostics,rawConfig:d},{ok:!1,projectOk:!1,diagnostics:p.diagnostics,rawConfig:d};let x=await _e(p.project,y),E=Ba(m,x.documents),k=Ba(m,x.externalModelDocuments),N=rr(p.project);if(!N)return n={version:++r,diagnostics:p.diagnostics,rawConfig:d},{ok:!1,projectOk:!1,diagnostics:p.diagnostics,rawConfig:d};let g=await Er({project:p.project,documents:E,externalModelDocuments:k,resolveGraph:!0,host:y}),S=await Ir({project:p.project,documents:E,externalModelDocuments:k,projectDiagnostics:[...p.diagnostics,...x.diagnostics],host:y}),R=[...p.diagnostics,...x.diagnostics,...g.diagnostics,...S.projectDiagnostics,...S.files.flatMap(T=>T.diagnostics)];return n={version:++r,diagnostics:R,rawConfig:d,resolvedConfig:N,workspace:{rootDir:Br(p.project),documents:E,nodeDefinitionModels:g.nodeDefinitionModels}},{ok:p.ok&&g.ok,projectOk:S.ok,diagnostics:[...R],rawConfig:d,resolvedConfig:N,workspace:n.workspace}}function u(c=300){if(o&&clearTimeout(o),!s){let d,m;s={promise:new Promise((y,p)=>{d=y,m=p}),resolve(y){d?.(y)},reject(y){m?.(y)}}}return o=setTimeout(()=>{o=void 0;let d=s;a(i).then(m=>{d?.resolve(m)}).catch(m=>{d?.reject(m)}).finally(()=>{s===d&&(s=void 0)})},c),s.promise}let l=Pa({config:e.config,getRuntimeState:()=>n});return{...l,getResolvedConfig(){return n?.resolvedConfig??l.getResolvedConfig()},getEffectiveConfigForDocument(c){return Lm(this.getResolvedConfig(),n?.workspace?.rootDir,c,l.getEffectiveConfigForDocument(c))},async loadProject(c){return Na(await a(c))},async refreshProject(c){let d=await a(c);return{ok:d.ok,diagnostics:d.diagnostics}},notifyWatchedFileChanged(c){return Mm(c)?u().then(d=>Na(d)):Promise.resolve(void 0)},getProjectConfig(){return n?.rawConfig??e.config},dispose(){l.dispose(),n=void 0,o&&clearTimeout(o),s?.reject(new Error("Node workspace service disposed during pending reload")),s=void 0}}}function wT(e={}){return Ma(e)}export{wT as createBtProjectEditorService,wa as createNodeWorkspaceHost,Be as fileUriToPath,nt as pathToFileUri};
32
+ Resolves to SubTree model in \`${l.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let l=e.documentView?ot(e.documentView,t.position):void 0;if(l?.declaredPort.status==="resolved")return{range:i.nameRange,contents:Wa(l.declaredPort.port)};let c=ge(e.semantic,{element:o,documentRoot:e.parsed?.root,attributeName:i.name,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy});if(c?.status==="resolved")return{range:i.nameRange,contents:Wa(c.port)}}let a=e.documentView?an(e.documentView,t.position):void 0;if(a&&a.usage.model.status==="resolved"){let l=a.usage.model.model;return{range:a.element.nameRange||a.element.openTagRange,contents:Ga(l)}}return o&&s?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:Ga(s.model.model)}:{}}function io(e,t){return rr(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function so(e){let t=new Set,n=[];for(let r of e){let o=`${r.uri}:${r.range.start.offset}:${r.range.end.offset}`;t.has(o)||(t.add(o),n.push(r))}return n}function Xp(e,t){let n=new Set;for(let r of t){let o=nr(e.semantic).find(s=>ao(r,{uri:s.uri,range:s.idRange}));o&&n.add(o.id);let i=or(e.semantic).find(s=>s.kind==="SubTree"&&(ao(r,{uri:s.uri,range:s.idRange})||ao(r,{uri:s.uri,range:s.range})));i&&n.add(i.id)}return[...n]}function ao(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function lo(e,t){let n=dt(e,t.position);if(n)return{locations:so(Pa(e,n).map(u=>({uri:u.uri,range:u.documentRange})))};let r=e.parsed?ne({document:t.document,parsed:e.parsed,position:t.position}):void 0,o=r&&"element"in r?r.element:void 0,i=r&&"attribute"in r?r.attribute:void 0,a=(e.documentView&&e.parsed?e.documentView.nodes.flatMap(u=>u.portBindings).find(u=>u.attribute===i&&t.position.offset>=(u.attribute.valueContentRange??u.attribute.valueRange).start.offset&&t.position.offset<=(u.attribute.valueContentRange??u.attribute.valueRange).end.offset):void 0)?.blackboardReferences.find(u=>t.position.offset>=u.range.start.offset&&t.position.offset<=u.range.end.offset);if(a){let u=z({scope:a.scope,key:a.key});return{locations:so([...a.scope==="global"?Qr(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,u,e.document.uri):eo(e.documentView,u,e.document.uri),...a.scope==="global"?wa(e,a.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:io(e,i.value)};if(o&&i?.name==="ID"&&O(e.semantic,{element:o,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}).tagForm==="model-definition"&&o.name==="SubTree")return{locations:io(e,i.value)};let l=An(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents);if(l.length===0)return{locations:[]};let c=Xp(e,l);return c.length>0?{locations:so(c.flatMap(u=>io(e,u)))}:{locations:[]}}function zp(e,t){return e.attributes.find(n=>n.name===t)}function co(e){let t=e.name==="BehaviorTree"?zp(e,"ID")?.value||"BehaviorTree":e.name,n=e.name==="BehaviorTree"?"Class":e.name==="TreeNodesModel"?"Namespace":e.name==="include"?"File":e.name==="SubTree"?"Reference":["input_port","output_port"].includes(e.name)?"Property":"Function",r=e.children.filter(o=>o.kind==="element").map(o=>co(o));return{name:t,detail:e.name,kind:n,range:e.range,selectionRange:e.nameRange||e.openTagRange,children:r.length>0?r:void 0}}function uo(e,t){return e.parsed?.root?{symbols:[co(e.parsed.root)]}:{symbols:[]}}function Wp(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function Ka(e={}){return{getDiagnostics(t){return Wp(no(me(t,e),t))},getCompletions(t){return Jr(me(t,e),t)},getHover(t){return oo(me(t,e),t)},getDefinition(t){return to(me(t,e),t)},getReferences(t){return lo(me(t,e),t)},getDocumentSymbols(t){return uo(me(t,e),t)},getCodeActions(t){return Vr(me(t,e),t)},getFormattingEdits(t){return ro(me(t,e),t)}}}var Ha={line:0,character:0,offset:0},Wt={start:Ha,end:Ha};function Gp(e){return e?Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>({name:t,value:n??"",range:Wt,nameRange:Wt,valueRange:Wt})):[]}function Kp(e,t){return{kind:"element",name:e,attributes:Gp(t),children:[],range:Wt,openTagRange:Wt,selfClosing:!0}}function Hp(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function po(e){return e===null?"null":e===void 0?"undefined":typeof e=="string"?JSON.stringify(e):typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`[${e.map(t=>po(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${po(r)}`).join(",")}}`:JSON.stringify(String(e))}function Yp(e){return po(e)}function Jp(e,t,n,r,o){let i=me({document:e,workspace:t,config:r,mode:"tolerant"},{});return{document:e,documentVersion:e.version,workspace:t,workspaceVersion:n,configFingerprint:o,diagnostics:{diagnostics:i.diagnostics,partial:i.partial},parsed:i.parsed,semantic:i.semantic,config:i.config,nodeUsagePolicy:i.nodeUsagePolicy}}function Ya(e){let t=e?.root;if(!t)return!1;if(t.name==="BehaviorTree"||t.name==="TreeNodesModel")return!0;let n=t.children.some(i=>i.kind==="element"&&i.name==="BehaviorTree"),r=t.children.some(i=>i.kind==="element"&&i.name==="TreeNodesModel"),o=t.attributes.some(i=>i.name==="BTCPP_format"&&i.value==="4");return t.name==="root"&&(o||n||r)}function Ja(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function Za(e,t){if(!t.startsWith("file://"))return;let n=Ja(e),r=Ja(xt(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function Qa(e={}){let t=e,n=new Map,r=new Map,o=Ka(),i=[],s=e.config?kt(e.config).config:void 0;function a(){return t.getRuntimeState?.()}function l(){return a()?.workspace}function c(){return a()?.version??0}function u(y,h){let R=l(),T=c(),A=Yp(h),j=r.get(y.uri);if(j&&j.documentVersion===y.version&&j.workspaceVersion===T&&j.document===y&&j.workspace===R&&j.configFingerprint===A)return j;let F=Jp(y,R,T,h,A);return r.set(y.uri,F),F}function d(y){if(y.parsed)return y.view||(y.view=sn(y.parsed,y.semantic,{config:y.config,policy:y.nodeUsagePolicy})),y.view}function p(y){return y.models||(y.models=Et(y.semantic)),y.models}function m(y){let h=l();return h?h.documents.some(R=>R.isBtXml&&R.uri===y):!1}function g(y){let h=E.getResolvedConfig();if(!h)return!1;let R=l()?.rootDir??e.configBasePath,T=R?Za(R,y):void 0;return T!==void 0?Qt(h,T):Kn(h,y)}function f(y,h){return y.languageId==="btcpp-xml"||h.parsed?.isBtXml===!0||Ya(h.parsed)||g(y.uri)||m(y.uri)}function x(y,h){return y.languageId==="btcpp-xml"||h.parsed?.isBtXml===!0||Ya(h.parsed)||m(y.uri)}function B(y){let h=n.get(y);if(!h)return;let R=E.getEffectiveConfigForDocument(h.uri),T=u(h,R);if(f(h,T))return{document:h,effectiveConfig:R,snapshot:T,emitDiagnostics:x(h,T)}}function k(y,h){let R=n.get(y);if(!R)return{diagnostics:[]};let T=u(R,h),A=d(T);return A?{view:A,diagnostics:T.diagnostics.diagnostics,partial:T.diagnostics.partial}:{diagnostics:T.diagnostics.diagnostics,partial:T.diagnostics.partial}}let E={openDocument(y,h,R=0,T="xml"){n.set(y,tt(y,h,R,T)),r.delete(y)},updateDocument(y,h,R=0,T="xml"){n.set(y,tt(y,h,R,T)),r.delete(y)},closeDocument(y){n.delete(y),r.delete(y)},getResolvedConfig(){return a()?.resolvedConfig??s},getEffectiveConfigForDocument(y){let h=this.getResolvedConfig();if(!h)return;let R=l()?.rootDir??e.configBasePath,T=R?Za(R,y):void 0;return T!==void 0?ee(h,T):Hn(h,y)},getDocument(y){return n.get(y)},getDiagnostics(y){let h=B(y);if(!h||!h.emitDiagnostics)return{diagnostics:[]};let R={diagnostics:h.snapshot.diagnostics.diagnostics};return h.snapshot.diagnostics.partial&&(R.partial=!0),R},getWorkspaceDiagnostics(){return{diagnostics:[...a()?.diagnostics??i]}},getSemanticDocumentView(y){let h=B(y);return h?k(y,h.effectiveConfig):{diagnostics:[]}},getNodeCatalog(y){let h=B(y);return h?{models:p(h.snapshot)}:{models:[]}},getSemanticNode(y,h){let R=B(y);return R?{node:k(y,R.effectiveConfig).view?.nodes.find(A=>A.nodeId===h)}:{}},getNodeUsageAt(y,h){let R=B(y);if(!R)return{};let T=d(R.snapshot);if(!R.snapshot.parsed||!T)return{};let A=ln(T,h);return A?{node:A,usage:A.usage}:{}},getNodeModelById(y,h){let R=h??n.keys().next().value;return R?{model:this.getNodeCatalog(R).models.find(A=>A.id===y)}:{}},getChildCapability(y,h,R){if(h==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let T=Oe(h);if(T==="Control")return{capable:!0,reason:"generic-control"};if(T==="Decorator")return{capable:!0,reason:"generic-decorator"};if(T==="Action"||T==="Condition")return{capable:!1,reason:"generic-leaf"};let A=B(y);if(!A)return{capable:!1,reason:"unknown-model"};let j=O(A.snapshot.semantic,{element:Kp(h,R),documentRoot:A.snapshot.parsed?.root,uri:y,config:A.snapshot.config,policy:A.snapshot.nodeUsagePolicy});return j.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:j.nodeType}:{...Hp(j.model.model.kind),modelId:j.model.model.id}},getPortInfoAt(y,h){let R=B(y);if(!R)return{};let T=d(R.snapshot);if(!R.snapshot.parsed||!T)return{};let A=cn(T,h),j=this.getNodeUsageAt(y,h),F=j.node,ve=A&&F?ge(R.snapshot.semantic,{element:F.usage.element,documentRoot:R.snapshot.parsed.root,attributeName:A.portName,uri:y,config:R.snapshot.config,policy:R.snapshot.nodeUsagePolicy}):void 0;return{node:F,binding:A,port:A?.resolution.status==="resolved"?A.resolution.port:void 0,usage:ve,nodeUsage:j.usage}},getFormattingEdits(y){let h=B(y);return h?o.getFormattingEdits({document:h.document,config:h.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(y,h,R){let T=B(y);return T?o.getCompletions({document:T.document,position:h,workspace:l(),triggerCharacter:R,config:T.effectiveConfig}):{items:[]}},getHover(y,h){let R=B(y);return R?o.getHover({document:R.document,position:h,workspace:l(),config:R.effectiveConfig}):{}},getDefinition(y,h){let R=B(y);return R?o.getDefinition({document:R.document,position:h,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getReferences(y,h){let R=B(y);return R?o.getReferences({document:R.document,position:h,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getDocumentSymbols(y){let h=B(y);return h?o.getDocumentSymbols({document:h.document,workspace:l(),config:h.effectiveConfig}):{symbols:[]}},getCodeActions(y,h,R){let T=B(y);return T?o.getCodeActions({document:T.document,range:h,diagnostics:R,workspace:l(),config:T.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return E}function em(e,t){if(t.uri.startsWith("file://"))return t.uri;if(t.path?.startsWith("file://"))return t.path;let n=t.path&&!_e.isAbsolute(t.path)?t.path:t.uri;return ut(_e.resolve(e,n))}function el(e,t){return t.map(n=>{let r=em(e,n),o=n.path?.startsWith("file://")?Ae(n.path):n.path;return{...n,uri:r,path:o}})}function tm(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function nm(e){return e.startsWith("file://")?e:mo(_e.resolve(e)).href}function Ae(e){return Qp(nm(e))}function rm(e){return mo(_e.resolve(e)).href}function om(e){let t=e.toLowerCase();return t.endsWith(".xml")||t.endsWith(".json")||t.endsWith("btxml.config.json")||t.includes("treenodesmodel")}function im(e){return e.replace(/\\/g,"/").replace(/\/$/,"")}function sm(e,t){let n=im(e),r=Ae(t).replace(/\\/g,"/");return r===n?"":r.startsWith(`${n}/`)?r.slice(n.length+1):t}function am(e,t,n,r){return e&&t&&n.startsWith("file://")?ee(e,sm(t,n)):r}function lm(e,t){let n=rm(t),r=e.realpath;return{rootUri(){return n},readFile(i){return e.readFile(i)},exists(i){return e.exists(i)},async stat(i){return e.stat?e.stat(i):void 0},async readDir(i){return[...await e.readDir(i)]},realpath:r?async i=>r(i):void 0}}function tl(e){return{ok:e.projectOk??e.ok,diagnostics:e.diagnostics}}function nl(e=process.cwd()){let t=_e.resolve(e);return{async readFile(n){return Gt.readFile(Ae(n),"utf8")},async exists(n){try{return await Gt.access(Ae(n),Zp.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(n){try{let r=await Gt.stat(Ae(n));return{type:tm(r),size:r.size}}catch{return}},async readDir(n){return(await Gt.readdir(Ae(n),{withFileTypes:!0})).map(o=>({name:o.name,type:o.isFile()?"file":o.isDirectory()?"directory":"other"}))},async realpath(n){let r=await Gt.realpath(Ae(n));return mo(_e.isAbsolute(r)?r:_e.resolve(t,r)).href}}}function rl(e={}){let t=e.host??nl(e.cwd),n,r=0,o,i,s;async function a(u={}){i=Object.keys(u).length>0?{...u}:void 0;let d=e.config,p=u.projectRoot||e.projectRoot||u.cwd||e.cwd||process.cwd(),m=u.cwd||e.cwd||p,g=lm(u.host??t,p),f=await jr({rootUri:ut(p),configUri:u.configPath||e.configPath?ut(_e.resolve(m,u.configPath||e.configPath||"")):void 0,host:g});if(!f.project)return n={version:++r,diagnostics:f.diagnostics,rawConfig:d},{ok:!1,projectOk:!1,diagnostics:f.diagnostics,rawConfig:d};let x=await Ve(f.project,g),B=el(p,x.documents),k=el(p,x.externalModelDocuments),E=gr(f.project);if(!E)return n={version:++r,diagnostics:f.diagnostics,rawConfig:d},{ok:!1,projectOk:!1,diagnostics:f.diagnostics,rawConfig:d};let y=await Fr({project:f.project,documents:B,externalModelDocuments:k,resolveGraph:!0,host:g}),h=await Lr({project:f.project,documents:B,externalModelDocuments:k,projectDiagnostics:[...f.diagnostics,...x.diagnostics],host:g}),R=[...f.diagnostics,...x.diagnostics,...y.diagnostics,...h.projectDiagnostics,...h.files.flatMap(T=>T.diagnostics)];return n={version:++r,diagnostics:R,rawConfig:d,resolvedConfig:E,workspace:{rootDir:Ur(f.project),documents:B,nodeDefinitionModels:y.nodeDefinitionModels}},{ok:f.ok&&y.ok,projectOk:h.ok,diagnostics:[...R],rawConfig:d,resolvedConfig:E,workspace:n.workspace}}function l(u=300){if(o&&clearTimeout(o),!s){let d,p;s={promise:new Promise((g,f)=>{d=g,p=f}),resolve(g){d?.(g)},reject(g){p?.(g)}}}return o=setTimeout(()=>{o=void 0;let d=s;a(i).then(p=>{d?.resolve(p)}).catch(p=>{d?.reject(p)}).finally(()=>{s===d&&(s=void 0)})},u),s.promise}let c=Qa({config:e.config,getRuntimeState:()=>n});return{...c,getResolvedConfig(){return n?.resolvedConfig??c.getResolvedConfig()},getEffectiveConfigForDocument(u){return am(this.getResolvedConfig(),n?.workspace?.rootDir,u,c.getEffectiveConfigForDocument(u))},async loadProject(u){return tl(await a(u))},async refreshProject(u){let d=await a(u);return{ok:d.ok,diagnostics:d.diagnostics}},notifyWatchedFileChanged(u){return om(u)?l().then(d=>tl(d)):Promise.resolve(void 0)},getProjectConfig(){return n?.rawConfig??e.config},dispose(){c.dispose(),n=void 0,o&&clearTimeout(o),s?.reject(new Error("Node workspace service disposed during pending reload")),s=void 0}}}function gT(e={}){return rl(e)}export{gT as createBtProjectEditorService,nl as createNodeWorkspaceHost,Ae as fileUriToPath,ut as pathToFileUri};