@abco20/btxml-checker 0.1.4 → 0.1.5

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,32 +1,32 @@
1
- import{constants as vm}from"fs";import Ht from"fs/promises";import _e from"path";import{fileURLToPath as Rm,pathToFileURL as ko}from"url";var Yt=["off","info","warn","error"];var To={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"}}},hl={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:{},convention:"allow-unused"},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function et(){return structuredClone(hl)}function mt(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 P(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 tt(e,t,n){return{line:e,character:t,offset:n}}function I(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 Un(e,t,n){return Math.min(Math.max(e,t),n)}function nt(e,t,n=0,r="xml"){let o=Sl(t),i=c=>{let d=Un(c,0,t.length),u=0,p=o.length;for(;u<p;){let g=Math.floor((u+p)/2);o[g]>d?p=g:u=g+1}let m=Math.max(0,u-1);return{line:m,character:d-o[m],offset:d}},s=c=>{let d=Un(c.line,0,Math.max(0,o.length-1)),u=o[d],p=d+1<o.length?o[d+1]:t.length;return Un(u+c.character,u,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 vl=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function On(e){return{ok:!0,reference:e}}function De(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function xo(e){return vl.test(e)}function Do(e){if(!e)return De("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?xo(t)?{ok:!0,scope:"global",key:t}:De("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):De("empty-key",e,"Global blackboard reference key must not be empty")}return xo(e)?{ok:!0,scope:"local",key:e}:De("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function X(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return On({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return De("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return De("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let r=n.slice(1,-1).trim(),o=Do(r);return o.ok?On({scope:o.scope,key:o.key,raw:n,syntax:"braced"}):o}function ft(e){let{rawName:t}=e;if(!t.startsWith("@"))return De("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Do(t);return n.ok?n.scope!=="global"?De("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):On({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 Rl={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function kl(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function oe(e,t){return e.attributes.find(n=>n.name===t)}function Tl(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function xl(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Dl(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Io(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 Il(e,t,n){let r=Io(e,t),o=Io(r,n);return{start:r,end:o}}function Co(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 d=X({portName:o.name,rawValue:c.parsedRaw});if(!d.ok)return;let u=d.reference.raw.length;t.push({raw:d.reference.raw,key:d.reference.key,scope:d.reference.scope,identity:z(d.reference),syntax:d.reference.syntax,attributeName:o.name,element:e,uri:n,range:Il(i.start,s.slice(0,c.parsedOffset),d.reference.raw.slice(0,u))})},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 d=c[0],u=c.index??0;a({parsedRaw:d,parsedOffset:u})}}for(let o of e.children||[])o.kind==="element"&&Co(o,t,n,r)}function Cl(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!Tl(i.name))continue;let s=oe(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=oe(l,"name"),d=oe(l,"type"),u=oe(l,"default")||oe(l,"default_value"),p=oe(l,"enum"),m=(l.children||[]).filter(T=>T.kind==="text").map(T=>T.text).join("").trim()||void 0,g=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",f=(g==="input"||g==="inout")&&u===void 0;a.push({source:n,direction:g,name:c?c.value:"",type:d?.value||void 0,defaultValue:u?.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 Bl(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let o=oe(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 El(e,t){let n=[],r=(o,i,s=!1)=>{if(s)return;let a=o.name==="BehaviorTree"?oe(o,"ID")?.value??i:i,l=o.name==="TreeNodesModel";if(o.name==="SubTree"){let c=oe(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 Nl(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Bo(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 Pl(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Bo),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 wl(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Ml(e){return{id:e.id,uri:e.uri,kind:e.kind,range:e.range,elementRange:e.elementRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Al(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 _l(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(Nl),subtreeReferences:e.subtreeReferences.map(wl),nodeUsages:e.nodeUsages.map(Ml),blackboardReferences:e.blackboardReferences.map(Al),treeNodesModel:e.treeNodesModel.map(Pl),genericSubTreePorts:e.genericSubTreePorts.map(Bo),rootMainTreeToExecute:xl(e.rootMainTreeToExecute)}}function Ll(e,t){if(e.name==="TreeNodesModel")return[];let n=[],r=(o,i,s=!1)=>{if(s)return;let a=o.name==="TreeNodesModel",l=o.name==="BehaviorTree"?oe(o,"ID")?.value??i:i,c=l!==void 0;if(o.name==="SubTree"){let d=oe(o,"ID");d&&c&&n.push({id:d.value,kind:"SubTree",uri:t,range:o.range,elementRange:o.range,parentBehaviorTreeId:l})}else c&&o.name!=="root"&&o.name!=="BehaviorTree"&&o.name!=="TreeNodesModel"&&n.push({id:o.name,kind:"node",uri:t,range:o.range,elementRange:o.range,parentBehaviorTreeId:l});for(let d of o.children||[])d.kind==="element"&&r(d,l,a)};for(let o of e.children||[])o.kind==="element"&&r(o);return n}function jl(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Fl(e){return P(Rl.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 Ul(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,s=kl(e),a=Dl(e),l=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",c=o&&e.kind!=="model-document"?Bl(o,r):[],d=[],u=[],p=o?o.name==="TreeNodesModel"?[o]:o.children.filter(R=>R.kind==="element"&&R.name==="TreeNodesModel"):[];for(let R of p){let E=Cl(R,r,a,l),y=new Map;for(let b of E)jl({node:b,treeNodesModel:d,genericSubTreePorts:u})||(y.has(b.id)?n.push(Fl(b)):y.set(b.id,b))}let m=o?El(o,r):[],g=o?Ll(o,r):[],f=o?(()=>{let R=[];return Co(o,R,r,e.originalText),R})():[],T=o?oe(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:_l({uri:r,path:t?.path??e.path,isBtXml:i,kind:s,behaviorTrees:c,subtreeReferences:m,nodeUsages:g,blackboardReferences:f,treeNodesModel:d,genericSubTreePorts:u,rootMainTreeToExecute:T?{uri:r,range:T.range,value:T.value}:void 0}),extractedBehaviorTrees:c,extractedTreeNodesModel:d,extractedSubTreeReferences:m,extractedBlackboardReferences:f},diagnostics:n}}function Eo(e,t){let{extracted:n,diagnostics:r}=Ul(e,t);return{model:n.publicModel,diagnostics:r}}function Vn(e,t){return Eo(e,t)}var No=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Ol=new Set([...No,"_autoremap","_description","__shared_blackboard"]),Vl=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 qn(e){return No.has(e)}function Po(e){return Ol.has(e)}function $n(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(Po(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=Vl.get(t);if(r)return r}}function wo(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 gt(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>wo(n,r))}}var ql=[{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"]}],yt=new Map,Mo=new Map;for(let e of ql){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Mo.set(e.name,t),yt.set(e.name,e.name);for(let n of e.aliases)yt.set(n,e.name)}function $l(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 Xn(e){return yt.get(e)??e}function Xl(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 bt(e){return yt.get(e)}function rt(e=[]){let t=new Map,n=new Map(yt);for(let r of Mo.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=Xn(i.canonical??o),l=t.get(s)??$l(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)??Xn(o))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,o])=>[r,Xl(o)])),namesToCanonical:n}}function de(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Xn(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Jt(e,t){return de(e,t)?.canonical}function ht(e,t,n){let r=de(e,t),o=de(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 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:[]}],_o={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:[]}],jo={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=[{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:[]}],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 Oo=["4.6.2","4.8.2","4.9.0"],zn="4.9.0",St={"4.6.2":{models:Ao,genericSubTreeModel:_o},"4.8.2":{models:Lo,genericSubTreeModel:jo},"4.9.0":{models:Fo,genericSubTreeModel:Uo}};var Vo=Oo.map(e=>`btcpp-v${e}`),vt=["btcpp-v4",...Vo],qo=`btcpp-v${zn}`;function $o(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 zl(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map($o)}))}function Xo(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map($o)}}function Wl(){let e={};for(let[t,n]of Object.entries(St))e[`btcpp-v${t}`]=zl(n.models);return e}function Gl(){let e={};for(let[t,n]of Object.entries(St))e[`btcpp-v${t}`]=Xo(n.genericSubTreeModel);return e}var Kl=Wl(),Hl=Gl();function Yl(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(St,t)}function zo(e){return e==="btcpp-v4"?qo:e}function Jl(e){return e==="btcpp-v4"?zn:e.replace(/^btcpp-v/,"")}function Wo(e){if(e&&e!=="btcpp-v4"&&!Yl(e))throw new Error(`unsupported builtin model set: ${e}`)}function Wn(e="btcpp-v4"){Wo(e);let t=zo(e);return Kl[t].map(r=>Go(r))}function Gn(e="btcpp-v4"){Wo(e);let t=Hl[zo(e)]??Xo(St[Jl(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Go(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 Rt(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 Zt(e,t){let n=Rt(e),r=Rt(t);return JSON.stringify(n)===JSON.stringify(r)}function Kn(e,t){if(Zt(e,t))return"none";let n=Rt(e),r=Rt(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):"",d=l.enum?JSON.stringify(l.enum):"";c!==d&&(s=!0),a.description!==l.description&&(s=!0),a.defaultValue!==l.defaultValue&&(i=!0)}return s?"ports":i?"port-default":"mixed"}import{findNodeAtLocation as rc,parse as oc,parseTree as ic}from"jsonc-parser";import{z as w}from"zod";var Ko=w.discriminatedUnion("kind",[w.object({kind:w.literal("pattern"),pattern:w.string()}).strict(),w.object({kind:w.literal("enum"),values:w.array(w.string())}).strict(),w.object({kind:w.literal("tuple"),separator:w.string(),items:w.array(w.string())}).strict(),w.object({kind:w.literal("json-schema"),schema:w.unknown()}).strict()]),Zl=w.object({kind:w.enum(["primitive","opaque","any"]),canonical:w.string().optional(),aliases:w.array(w.string()).optional(),compatibleWith:w.array(w.string()).optional(),validate:Ko.optional()}).strict(),Ql=w.object({from:w.string().optional(),to:w.string()}).strict(),ec=w.object({typeRefinement:Ql.optional(),validate:Ko.optional(),required:w.boolean().optional(),enum:w.array(w.string()).optional(),description:w.string().optional()}).strict(),tc=w.object({ports:w.record(w.string(),ec).optional()}).strict(),nc=w.object({enums:w.record(w.string(),w.number().finite()).optional()}).strict(),Ho=w.object({version:w.literal(1),types:w.record(w.string(),Zl).optional(),augment:w.record(w.string(),tc).optional(),script:nc.optional()}).strict();function sc(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 ac(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function Yo(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function lc(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...Yo(e.path),t]}return Yo(e.path)}function cc(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 Hn(e,t){let n=t?.uri??"",r=[],o=ic(e,r,{allowTrailingComma:!0,disallowComments:!1});try{let i=oc(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=Ho.safeParse(i);if(!s.success){let a=sc(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let c=lc(l),{message:d,path:u}=cc(l);return{kind:"schema",message:d,path:u,range:ac(rc(o,c),a),notes:u?[u]: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 Jo=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(),Qt=W.object({kind:W.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:W.record(W.string(),Jo).optional(),description:W.string().optional()}).strict(),Yn=W.object({nodes:W.record(W.string(),Qt)}).strict();import{z as D}from"zod";var Zo=D.enum(["off","info","warn","error"]),Qo=D.union([Zo,D.tuple([Zo,D.record(D.string(),D.unknown())])]),dc=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(),uc=D.string(),pc=D.object({name:D.string(),attribute:D.string(),base:D.enum(["file","project-root"]).optional()}).strict(),mc=D.object({elements:D.array(pc).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(),fc=D.object({entrypoints:D.array(uc).optional(),includes:mc.optional(),behaviorTreeIds:D.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),gc=D.enum(["allow-unused","used-only","single-source"]),yc=D.object({builtins:D.array(D.enum(vt)).optional(),files:D.array(D.string()).optional(),augmentations:D.array(D.string()).optional(),definitions:D.array(D.string()).optional(),inline:D.record(D.string(),Qt).optional(),convention:gc.optional()}).strict(),ei=D.object({inline:D.enum(["allow","deny"]).optional()}).strict(),bc=D.object({enabled:D.boolean().optional(),rules:D.record(D.string(),Qo).optional(),baseline:D.string().optional(),suppressions:ei.optional()}).strict(),hc=D.object({rules:D.record(D.string(),Qo).optional(),suppressions:ei.optional()}).strict(),ti=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(),Sc=D.object({files:D.array(D.string()),linter:hc.optional(),formatter:ti.optional()}).strict(),ni=D.object({$schema:D.string().optional(),strict:D.boolean().optional(),files:dc.optional(),resolver:fc.optional(),models:yc.optional(),linter:bc.optional(),formatter:ti.optional(),overrides:D.array(Sc).optional()}).strict();function ii(e){return e.flatMap(vc)}function vc(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=ri([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=ri(e.path);return si(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 ri(e){return e.map(String).join(".")||void 0}function si(e){let t=String(e.code);if(t==="invalid_value"||t==="invalid_enum_value"||t==="invalid_literal")return!0;if(t!=="invalid_union")return!1;let n=e.errors;if(Array.isArray(n))return n.flat().some(oi);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(oi):!1}function oi(e){return typeof e=="object"&&e!==null&&si(e)}function kt(e){let t=ni.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:ii(t.error.issues)}}function Rc(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 kc(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 Tc(e){return e.map(t=>P(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function xc(e){let t=[],n=et(),{$schema:r,strict:o,overrides:i,...s}=e;o&&(n=mt(n,To)),n=mt(n,s),n.overrides=(i??[]).map(l=>({files:l.files,linter:kc(l.linter),formatter:Rc(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function Tt(e){let t=kt(e);return t.ok?xc(t.value):{ok:!1,config:et(),diagnostics:Tc(t.diagnostics)}}function Dc(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 en(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),o=r?t.slice(1):t,s=Dc(o).test(n);return r?!s:s}function ai(e,t){return e.overrides.filter(n=>n.files.some(r=>en(t,r)))}function xt(e){return e.replaceAll("\\","/")}function Ic(e){try{return decodeURIComponent(e)}catch{return e}}function Dt(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Ic(t.pathname);return/^\/[A-Za-z]:/.test(n)?xt(n.slice(1)):t.host?xt(`//${t.host}${n}`):xt(n)}function tn(e,t){let n=xt(t);return e.files.ignore.some(r=>en(n,r))?!1:e.files.include.some(r=>en(n,r))}function Jn(e,t){return tn(e,Dt(t))}function ee(e,t){let n=xt(t),r=ai(e,n),o=e;for(let i of r)o=mt(o,{linter:i.linter,formatter:i.formatter});return{files:o.files,resolver:o.resolver,models:o.models,linter:o.linter,formatter:o.formatter}}function Zn(e,t){return ee(e,Dt(t))}import{z as nn}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",ConflictingModelKind:"BT120_CONFLICTING_MODEL_KIND",UnusedModelDefinition:"BT121_UNUSED_MODEL_DEFINITION",DuplicateModelDefinition:"BT122_DUPLICATE_MODEL_DEFINITION",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"},Qn=Object.values(S).sort();var Cc=nn.object({subTreePorts:nn.enum(["loose","strict"]).optional()}).strict(),Bc=nn.object({allowStringEntryCompatibility:nn.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:Cc,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:Bc,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."},"model/no-conflicting-kind-for-id":{code:S.ConflictingModelKind,defaultSeverity:"error",description:"A model ID must not be defined with different kinds."},"model/no-unused-definition":{code:S.UnusedModelDefinition,defaultSeverity:"error",description:"Inline model definitions should be used in the same BT XML file."},"model/no-duplicate-definition":{code:S.DuplicateModelDefinition,defaultSeverity:"error",description:"A user-defined model (ID, kind) should be defined only once."},"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 ie(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 er(e){return e in ue}function ke(e){if(typeof e=="string")return Yt.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&Yt.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 Fe(e,t){let n=e[t];if(n!==void 0){let r=ke(n);if(r)return r.severity}return ue[t].defaultSeverity}function tr(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(...Ec(e,s));return n}function Ec(e,t){if(t.code==="unrecognized_keys")return t.keys.map(r=>P("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(r)}\` for rule \`${e}\``,void 0,void 0,{help:li(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[P("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:li(e)})]}function li(e){let n=ue[e].options?.map(r=>r.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function nr(e){let t=[];ci(e.linter,"linter.rules",t);for(let[n,r]of(e.overrides??[]).entries())ci(r.linter,`overrides.${n}.linter.rules`,t);return t}function ci(e,t,n){for(let[r,o]of Object.entries(e?.rules??{})){let i=`${t}.${r}`;if(!er(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 tr(r,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:Nc(i,s.options,a.message),message:a.message,help:a.details?.help})}}function Nc(e,t,n){let r=Object.keys(t).find(o=>n.includes(`\`${o}\``));return r?`${e}.1.${r}`:`${e}.1`}function di(e,t){if(t)return Jt(e,t)}function ui(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function pi(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return P(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Pc(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??ui(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=di(e,l.from),d=di(e,i);return c&&c!==d?(o.push(pi({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${i??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:i,actualFrom:l.from,to:l.to},notes:i||l.from?[`base type: ${i??"(unspecified)"}`,`requested from: ${l.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function wc(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(pi({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${i}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:i}}));continue}o.set(i,Pc(e,t,a,s,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function Mc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??ui(e)}}function mi(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,s])=>[i,{...s,ports:s.ports.map(Mc)}]));for(let i of n)for(let[s,a]of Object.entries(i.augment??{})){let l=o.get(s);if(!l){r.push(P("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,wc(t,l,a,r))}return{modelsById:o,diagnostics:r}}function yi(e){return It("builtin",0,!1,e)}function bi(e){return It("xml-tree-nodes-model",10,!0,e)}function hi(e){return It("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Si(e){return It("node-definition-file",20,!0,e)}function vi(e){return It("config-inline",30,!0,e)}function It(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>Ri(o,e,n&&o.editable!==!1))}}function Ac(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Ri(e,t,n){let r=Ac(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 ot(e,t){return{uri:e.uri,sourceKind:e.source||"inline-tree-nodes-model",nodeId:e.id,kind:e.kind,range:e.range,idRange:e.idRange,sourceIndex:t}}function fi(e){return{name:e.name,direction:e.direction,type:e.type,required:e.required,defaultValue:e.defaultValue,enum:e.enum?[...e.enum].sort():void 0,description:e.description}}function _c(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:fi(s)});for(let[i,s]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:fi(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 gi(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(Zt(o,r))continue;let i=Kn(o,r),s=_c(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}),d=c?.name??"unknown",u=[ot(o,0),ot(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:d,sources:[{source:ot(o,0),value:l.get(d)?.defaultValue},{source:ot(r,1),value:c?.defaultValue}]},t.push({id:r.id,definitions:[o,r],sources:u,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${d}\` 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=[ot(o,0),ot(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 Lc(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 ki(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(d=>Ri(d,a.kind,a.editable&&d.editable!==!1));l.push(...c),i.set(a.precedence,l);for(let d of c)s.set(d.id,a.precedence)}for(let[a,l]of[...i.entries()].sort((c,d)=>c[0]-d[0])){let c=l.filter(m=>s.get(m.id)===a),d=l.filter(m=>s.get(m.id)!==a),u=gi(d,[]);for(let[m,g]of gi(c,t))u.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 u)r.set(m,Lc(r.get(m),g))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function jc(e){return vt.includes(e)}function Fc(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:rt(),augmentations:[]}}function Uc(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function Oc(e,t,n){for(let r of new Set(n))if(jc(r)){for(let o of Wn(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...Gn(r))}}function Vc(e,t,n,r,o){for(let i of o){let s=Vn(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)Uc(e.behaviorTreesById,l.id,l);i.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function qc(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 $c(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=qc(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function Xc(e,t,n,r,o){e.modelLayers.push(yi(t),bi(n),hi(r)),o.models?.length&&e.modelLayers.push(Si([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Ue(e,t){return zc(e,t)}function zc(e,t){let n=Fc(),r=[],o=[],i=[],s=[];Oc(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=rt(t.augmentations??[]),Vc(n,r,i,s,e),$c(n),Xc(n,o,i,s,t);let a=t.config.models.inline;if(a){let d=[];for(let[u,p]of Object.entries(a))d.push(gt(u,p));n.modelLayers.push(vi(d))}let l=ki(n.modelLayers),c=mi(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(d=>d.severity!==h.Error),index:n,diagnostics:r}}var Ti={unknownSubTreePorts:"allow"};function xi(e){return{...Ti,...e}}var Wc=["Action","Condition","Control","Decorator"],Gc=new Set(Wc);var Kc=new Set(["input_port","output_port","inout_port"]);function Ct(e){return Gc.has(e)}function Oe(e){return Ct(e)?e:void 0}function rn(e,t){return e.attributes.find(n=>n.name===t)?.value}function rr(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&rr(n,t))return!0;return!1}function Di(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return rr(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&rr(n,t))return!0;return!1}function on(e){return Kc.has(e.name)}function Ii(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":on(e)?"unknown-xml":"concrete-node"}function sn(e){if(e.name==="SubTree")return rn(e,"ID")||"SubTree";if(Ct(e.name))return rn(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||on(e)))return e.name}function te(e){return e.typeRegistry}function Z(e,t){return de(te(e),t)}function Ie(e,t,n){return ht(te(e),t,n)}function Bt(e,t){return e.documents.get(t)}function Y(e,t){return e.behaviorTreesById.get(t)??[]}function or(e,t){return e.behaviorTreesById.has(t)}function ir(e){return[...e.behaviorTreesById.values()].flat()}function sr(e,t){return lr(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function Ci(e){return lr(e).flatMap(t=>t.nodeUsages)}function ar(e){let t=new Map;for(let n of Ci(e)){let r=t.get(n.uri)??[];r.push(n),t.set(n.uri,r)}return t}function Ce(e){return[...e.behaviorTreesById.keys()]}function lr(e){return[...e.documents.values()]}function se(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function Ve(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function an(e){return[...e.mergedNodeModelsById.values()]}function Et(e){return e.modelLayers.flatMap(t=>t.models)}function Nt(e){return[...e.mergedNodeModelsById.values()]}function cr(e){return[...e.nodeModelsById.keys()]}function dr(e){return[...e.genericSubTreePorts]}function Pt(e){return[...e.augmentations]}function wt(e){return e.modelConflicts}function Mt(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(d=>d.uri===r);c.length>0&&(i=c)}let a=se(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=se(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function ur(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=se(e,t);if(n){let o=wt(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=Ve(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 pr(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function mr(e){let t=dr(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return pr([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function fr(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}:qn(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 U(e,t){let n=xi(t.policy),r=t.element,o=Ii(r),i=Di(t.documentRoot,r);if((t.isModelDefinition||i&&(o==="generic-node"||o==="subtree"))&&(o="model-definition"),i&&on(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=sn(r);if(o!=="subtree"){let m=ur(e,s),g=mr({index:e,tagForm:o,model:m}),f=r.attributes.map(T=>fr({attribute:T,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=rn(r,"ID"),l=a?Mt(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},c={status:"unresolved",nodeType:a},d=!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=ur(e,l.treeId);m.status==="resolved"&&m.model.kind==="SubTree"?c=m:d=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}:d=n.unknownSubTreePorts==="allow";let u=mr({index:e,tagForm:o,model:c,subtreeModelPorts:l.status==="ambiguous"?pr(l.definitions.flatMap(m=>m.ports)):void 0}),p=r.attributes.map(m=>fr({attribute:m,ports:u,allowsArbitraryAttributes:d,model:c,unknownModelPortStatus:!d&&c.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:o,nodeType:s,model:c,subtree:{id:a,target:l},ports:u,allowsArbitraryAttributes:d,portUsages:p}}function ge(e,t){return U(e,t).portUsages.find(r=>r.name===t.attributeName)}function Jc(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Zc(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Bi(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 gr(e,t,n){let r=Bi(e,t),o=Bi(r,n);return{start:r,end:o}}function Ni(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:gr(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:gr(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:gr(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 Qc(e,t){return Jc(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Pi(e){let t=[];for(let n of e)t.push(n),t.push(...Pi(n.children));return t}function ed(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function td(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function nd(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function wi(e){return Be(e,"name")?.value}function rd(e){return wi(e)||Be(e,"ID")?.value||e.name}function od(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${rd(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function Mi(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 Ai(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 id(e){return e.status==="resolved"?e.port.direction:"unknown"}function sd(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 Ei(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:id(t.usage),valueKind:sd(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 ad(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 ld(e){return e.root?Be(e.root,"main_tree_to_execute")?.value:void 0}function cd(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=cd(e.root),o=Zc(e).map(l=>({id:Be(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),i=[],s=[],a=(l,c,d,u)=>{let p=U(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(l)}),m=Mi(p),g={element:l,path:u,tagName:l.name,kind:Qc(l,p),model:m,usage:p,portBindings:[],children:[],parent:d,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:Ai(f),usage:f,blackboardReferences:Ni(e,f.name,f.attribute)})),g.children=l.children.filter(f=>f.kind==="element").map((f,T)=>a(f,c,g,[...u,T])),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(d=>d.kind==="element").map((d,u)=>a(d,l,void 0,[u]));l.rootNode=c[0],l.nodes=Pi(c),s.push(...l.nodes)}return{document:e,behaviorTrees:o,subtreeCalls:i,nodes:s}}function ln(e,t,n){let r=G(e,{semantic:t,config:n?.config,policy:n?.policy}),o=td(r.behaviorTrees),i=r.nodes.map(c=>{let d=o(c),u=c.usage,p=u.nodeType??c.tagName,m=wi(c.element),g=Be(c.element,"ID")?.value,f=od(c);return{nodeId:d,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(nd),identityCandidates:ad({name:m,idAttr:g,nodeType:p,tagName:c.tagName,instancePath:f,behaviorTreeId:c.behaviorTree.id,nodeId:d}),model:Mi(u),usage:u,portBindings:u.portUsages.filter(T=>T.status!=="reserved-attribute").map(T=>Ei(d,{name:T.name,value:T.value,attribute:T.attribute,declaredPort:Ai(T),usage:T,blackboardReferences:Ni(e,T.name,T.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(d=>Ei(o(c.node),d))})),l=e.root?Be(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:ed(e),mainTreeToExecute:ld(e),mainTreeToExecuteRange:l?.valueContentRange||l?.valueRange,behaviorTrees:s,nodes:i,subtreeCalls:a}}function dd(e,t){let n=e.element.fullRange||e.element.range;return H(n,t)}function ud(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 cn(e,t){let n;for(let r of e.nodes)dd(r,t.offset)&&(!n||ud(r,n))&&(n=r);return n}function it(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(H(r.attribute.range,t.offset))return r}function pd(e,t){return H(e.fullRange||e.range,t)}function md(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 dn(e,t){let n;for(let r of e.nodes)pd(r,t.offset)&&(!n||md(r,n))&&(n=r);return n}function un(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(H(r.range,t.offset))return r}function kd(e){return`${e.kind}\0${e.id}`}function yr(e){return Et(e).map(t=>{let n=t.source??t.sourceMeta?.sourceKind;return{key:{id:t.id,kind:t.kind},model:t,id:t.id,kind:t.kind,uri:t.uri,range:t.range,sourceKind:n,isBuiltin:n==="builtin",isCanonicalModelFile:n==="external-tree-nodes-model",editable:t.editable!==!1}})}function br(e){let t=new Map;for(let n of e){let r=t.get(n.id)??[];r.push(n),t.set(n.id,r)}return t}function hr(e){let t=new Map;for(let n of e){let r=kd(n.key),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function _i(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,l=a.children.some(p=>p.kind==="element"&&p.name==="BehaviorTree"),c=a.children.some(p=>p.kind==="element"&&p.name==="TreeNodesModel"),d=a.attributes.some(p=>p.name==="BTCPP_format"&&p.value==="4"),u=a.name==="TreeNodesModel"||a.name==="root"&&!l&&c;r.kind==="model-xml"||u?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(d||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 Td(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 Sr(e,t){if(e.kind==="element"){Td(e)&&t(e);for(let n of e.children||[])Sr(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 tt(n,r,t)}function vr(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 u=1;if(i[u]==="x"||i[u]==="X"){u++;let T="";for(;u<i.length&&/[0-9a-fA-F]/.test(i[u]);)T+=i[u],u++;if(u<i.length&&i[u]===";"){u++;let y=e.slice(s,s+1+u),b=q(n,t+s),k=q(n,t+s+y.length);if(T){let x=Number.parseInt(T,16);if(x>0&&x<=1114111&&(x<55296||x>57343)){o+=u-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${y}\``,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+=u-1;continue}r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${y}\``,b,k,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=u-1;continue}let B=e.slice(s,s+1+u),R=q(n,t+s),E=q(n,t+s+B.length);r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${B}\``,R,E,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=u-1;continue}let p="";for(;u<i.length&&/[0-9]/.test(i[u]);)p+=i[u],u++;if(u<i.length&&i[u]===";"){u++;let T=e.slice(s,s+1+u),B=q(n,t+s),R=q(n,t+s+T.length);if(p){let E=Number.parseInt(p,10);if(E>0&&E<=1114111&&(E<55296||E>57343)){o+=u-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${T}\``,B,R,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=u-1;continue}r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${T}\``,B,R,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=u-1;continue}let m=e.slice(s,s+1+u),g=q(n,t+s),f=q(n,t+s+m.length);r("XML001_INVALID_SYNTAX",h.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+=u-1;continue}let a=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(a){let u=`&${a[0]}`,p=q(n,t+s),m=q(n,t+s+u.length);r("XML013_UNKNOWN_ENTITY",h.Error,`unknown XML entity \`${u}\``,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+=u.length-1;continue}let l=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let u=`&${l[0]}`,p=q(n,t+s),m=q(n,t+s+u.length);r("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",p,m,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"}),o+=u.length-1;continue}let c=q(n,t+s),d=q(n,t+s+1);r("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",c,d,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"})}}function At(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 Li(e){let t="",n=[0];for(let r=0;r<e.length;){let o=xd(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 xd(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:At(s),end:t+s.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let s=o[0];return{value:At(s),end:t+s.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let s=i[0];return{value:At(s),end:t+s.length}}}function ji(e){return tt(e.line,e.character,e.offset)}function Dd(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function Id(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function Cd(e){return e===" "||e===" "||e===`
8
- `||e==="\r"}function Bd(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 d(){return tt(s,a,i)}function u(){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(;!u()&&Cd(p());)m()}let f=(v,M,_,L,C,J)=>{n.push(P(v,M,_,I(L,C),o.uri,J))};function T(v,M,_,L,C,J){n.push(P(v,M,_,L&&C?I(L,C):void 0,o.uri,J))}function B(){if(!Dd(p()))return"";let v=i;for(m();!u()&&Id(p());)m();return e.slice(v,i)}function R(){let v=p();if(v!=='"'&&v!=="'")return{value:"",ok:!1};let M=d();m();let _=d(),L=i;for(;!u()&&p()!==v&&p()!=="<";)m();let C=d();if(u()||p()!==v)return{value:e.slice(L,i),ok:!1,valueRange:I(M,C),valueContentRange:I(_,C)};let J=e.slice(L,i);m(),vr(J,_.offset,e,f);let Re=Li(J);return{value:Re.value,valueOffsets:Re.offsets,ok:!0,valueRange:I(M,d()),valueContentRange:I(_,C)}}function E(){let v=[],M=new Set;for(;;){g();let _=p();if(!_||_===">"||_==="/"&&p(1)===">")break;let L=d(),C=B(),J=d();if(!C)break;g();let Re=d();if(p()!=="="){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",L,J,{primaryLabel:`expected \`=\` after attribute \`${C}\``,help:`write the attribute as \`${C}="..."\``}),c=!0,r)continue;break}m();let bl=d();g();let Fn=d(),Le=R(),Qe=d();if(!Le.ok&&(f("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",Fn,Qe,{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",h.Error,`duplicate attribute \`${C}\``,L,Qe,{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:I(L,Qe),fullRange:I(L,Qe),nameRange:I(L,J),equalsRange:I(Re,bl),valueRange:Le.valueRange||I(Fn,Qe),valueContentRange:Le.valueContentRange||I(Fn,Qe)}),!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 b(){let v=d(),M=i;for(;!u()&&p()!=="<";)m();let _=e.slice(M,i);if(_.length===0)return;for(let C of _)if(Bd(C)){f("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",v,d(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}vr(_,M,e,f);let L={kind:"text",text:At(_),range:I(v,d()),fullRange:I(v,d())};y(L)}function k(){let v=d();m(4);let M=d(),_=i;for(;!u()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)m();let L=e.slice(_,i);if(u()){if(f("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",v,d(),{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:I(v,d()),fullRange:I(v,d()),contentRange:I(M,d())};y(Re);return}(L.includes("--")||L.endsWith("-"))&&f("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",M,d(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let C=d();m(3);let J={kind:"comment",text:L,range:I(v,d()),fullRange:I(v,d()),contentRange:I(M,C)};y(J)}function x(){let v=d();m(5),g();let M=E();g(),p()==="?"&&p(1)===">"?m(2):f("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",v,d(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let _={range:I(v,d()),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=d();m(2),g();let M=d(),_=B(),L=d();if(g(),p()!==">")for(f("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",v,d(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),c=!0;!u()&&p()!==">";)m();p()===">"&&m();let C=l.pop();if(!C||C.name!==_){let J=C?C.name:_||"",Re=_||"";f("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${Re}>\``,v,d(),{primaryLabel:`opened as \`<${J}>\` but closed as \`</${Re}>\``,help:`change the closing tag to \`</${J}>\` or fix the nesting`});return}C.closeTagRange=I(v,d()),C.endTagRange=I(v,d()),C.nameRange||(C.nameRange=I(M,L)),C.range=I(C.range.start,d()),C.fullRange=I(C.range.start,d())}for(;!u();)if(p()==="<")if(p(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")x();else{let v=d();for(;!u()&&!(p()==="?"&&p(1)===">");)m();u()||m(2),f("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",v,d(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")k();else if(p(1)==="!"&&p(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let v=d();for(m(8);!u()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)m();u()||m(3),f("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",v,d(),{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=d();for(m(8);!u()&&p()!==">";)m();u()||m(1),f("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",v,d(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")A();else{let v=d();m();let M=d(),_=B(),L=d();if(!_){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,d(),{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:I(v,v),fullRange:I(v,v),openTagRange:I(v,v),startTagRange:I(v,v),nameRange:I(M,L),selfClosing:!1};if(C.attributes=E(),g(),p()==="/"&&p(1)===">"){m(2),C.selfClosing=!0,C.openTagRange=I(v,d()),C.startTagRange=C.openTagRange,C.range=I(v,d()),C.fullRange=I(v,d()),y(C);continue}if(p()!==">"){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,d(),{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=I(v,d()),C.startTagRange=C.openTagRange,C.range=I(v,d()),C.fullRange=I(v,d()),y(C);continue}break}m(),C.openTagRange=I(v,d()),C.startTagRange=C.openTagRange,C.range=I(v,d()),C.fullRange=I(v,d()),y(C),l.push(C)}else b();if(l.length>0){let v=l[l.length-1];if(f("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`}),c=!0,r)for(;l.length>0;){let M=l.pop();if(!M)break;M.range=I(M.range.start,d()),M.fullRange=I(M.range.start,d())}}let j=o.nodes.filter(v=>v.kind==="element");j.length===0?T("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&&T("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 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",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&&!ve)T("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;f("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 F&&Sr(F,v=>{f("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",ji(v.range.start),ji(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"]})}),_i({document:o,diagnostics:n,partial:c,options:t})}var _t={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Fi(e){if(!e)return _t;let t=typeof e.indentWidth=="number"?e.indentWidth:_t.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:_t.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:_t.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:_t.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:o}}function pn(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function mn(e){return pn(e).replace(/"/g,"&quot;")}function Ed(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Nd(e,t,n){return`${" ".repeat(e*n)}${t}`}function st(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}="${mn(i[0].value)}"${n}`];let s=[`${o}<${e.name} ${i[0].name}="${mn(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],d=l===i.length-1?n:"";s.push(`${a}${c.name}="${mn(c.value)}"${d}`)}return s}function fn(e,t,n,r){let o=" ".repeat(t*n);if(e.kind==="comment")return[`${o}<!--${e.text}-->`];if(e.kind==="text"){let d=e.text.trim();return d?[Nd(t,pn(d),n)]:[]}let i=Ed(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(d=>d.kind==="text").map(d=>d.text).join("").trim(),l=i.some(d=>d.kind==="element"||d.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 d=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${mn(e.attributes[0].value)}"`;return[`${o}<${e.name}${d}>${pn(a)}</${e.name}>`]}return st(e,t,`>${pn(a)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return st(e,t,"/>".slice(0),n);let d=st(e,t,">",n);return d.push(`${o}</${e.name}>`),d}let c=st(e,t,">",n);for(let d of e.children||[])d.kind==="text"&&d.text.trim()===""||c.push(...fn(d,t+1,n,r));return c.push(`${o}</${e.name}>`),c}function Pd(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Ui(e,t,n,r){let o=[],i=Pd(e);for(let s=0;s<i.length;s+=1){let a=i[s],l=i[s-1],c=i[s+1],d=n&&a.kind==="element"&&a.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",u=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;(d||u||p)&&o.length>0&&o[o.length-1]!==""&&o.push(""),a.kind==="element"?(o.push(...fn(a,1,t,r)),a.name==="TreeNodesModel"&&o.push("")):o.push(...fn(a,1,t,r))}return o}function Lt(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=Fi(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(...st(o,0,">",s)),a.push(...Ui(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=`
1
+ import{constants as Om}from"fs";import Ht from"fs/promises";import Le from"path";import{fileURLToPath as Vm,pathToFileURL as Do}from"url";var Yt=["off","info","warn","error"];var Io={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"}}},Tl={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:{},convention:"allow-unused"},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function tt(){return structuredClone(Tl)}function gt(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 P(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 nt(e,t,n){return{line:e,character:t,offset:n}}function I(e,t){return{start:e,end:t}}function H(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}function xl(e){let t=[0];for(let n=0;n<e.length;n+=1)e[n]===`
2
+ `&&t.push(n+1);return t}function Vn(e,t,n){return Math.min(Math.max(e,t),n)}function rt(e,t,n=0,r="xml"){let o=xl(t),i=c=>{let d=Vn(c,0,t.length),u=0,p=o.length;for(;u<p;){let g=Math.floor((u+p)/2);o[g]>d?p=g:u=g+1}let m=Math.max(0,u-1);return{line:m,character:d-o[m],offset:d}},s=c=>{let d=Vn(c.line,0,Math.max(0,o.length-1)),u=o[d],p=d+1<o.length?o[d+1]:t.length;return Vn(u+c.character,u,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 Dl=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function qn(e){return{ok:!0,reference:e}}function Ie(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Co(e){return Dl.test(e)}function Bo(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?Co(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 Co(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 qn({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=Bo(r);return o.ok?qn({scope:o.scope,key:o.key,raw:n,syntax:"braced"}):o}function yt(e){let{rawName:t}=e;if(!t.startsWith("@"))return Ie("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Bo(t);return n.ok?n.scope!=="global"?Ie("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):qn({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 Il={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Cl(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function ie(e,t){return e.attributes.find(n=>n.name===t)}function Bl(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function El(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Nl(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Eo(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 Pl(e,t,n){let r=Eo(e,t),o=Eo(r,n);return{start:r,end:o}}function No(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 d=X({portName:o.name,rawValue:c.parsedRaw});if(!d.ok)return;let u=d.reference.raw.length;t.push({raw:d.reference.raw,key:d.reference.key,scope:d.reference.scope,identity:z(d.reference),syntax:d.reference.syntax,attributeName:o.name,element:e,uri:n,range:Pl(i.start,s.slice(0,c.parsedOffset),d.reference.raw.slice(0,u))})},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 d=c[0],u=c.index??0;a({parsedRaw:d,parsedOffset:u})}}for(let o of e.children||[])o.kind==="element"&&No(o,t,n,r)}function wl(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!Bl(i.name))continue;let s=ie(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=ie(l,"name"),d=ie(l,"type"),u=ie(l,"default")||ie(l,"default_value"),p=ie(l,"enum"),m=(l.children||[]).filter(T=>T.kind==="text").map(T=>T.text).join("").trim()||void 0,g=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",f=(g==="input"||g==="inout")&&u===void 0;a.push({source:n,direction:g,name:c?c.value:"",type:d?.value||void 0,defaultValue:u?.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 Ml(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let o=ie(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 Al(e,t){let n=[],r=(o,i,s=!1)=>{if(s)return;let a=o.name==="BehaviorTree"?ie(o,"ID")?.value??i:i,l=o.name==="TreeNodesModel";if(o.name==="SubTree"){let c=ie(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 _l(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Po(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 Ll(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Po),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 Fl(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function jl(e){return{id:e.id,uri:e.uri,kind:e.kind,range:e.range,elementRange:e.elementRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Ul(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 Ol(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(_l),subtreeReferences:e.subtreeReferences.map(Fl),nodeUsages:e.nodeUsages.map(jl),blackboardReferences:e.blackboardReferences.map(Ul),treeNodesModel:e.treeNodesModel.map(Ll),genericSubTreePorts:e.genericSubTreePorts.map(Po),rootMainTreeToExecute:El(e.rootMainTreeToExecute)}}function Vl(e,t){if(e.name==="TreeNodesModel")return[];let n=[],r=(o,i,s=!1)=>{if(s)return;let a=o.name==="TreeNodesModel",l=o.name==="BehaviorTree"?ie(o,"ID")?.value??i:i,c=l!==void 0;if(o.name==="SubTree"){let d=ie(o,"ID");d&&c&&n.push({id:d.value,kind:"SubTree",uri:t,range:o.range,elementRange:o.range,parentBehaviorTreeId:l})}else c&&o.name!=="root"&&o.name!=="BehaviorTree"&&o.name!=="TreeNodesModel"&&n.push({id:o.name,kind:"node",uri:t,range:o.range,elementRange:o.range,parentBehaviorTreeId:l});for(let d of o.children||[])d.kind==="element"&&r(d,l,a)};for(let o of e.children||[])o.kind==="element"&&r(o);return n}function ql(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function $l(e){return P(Il.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 Xl(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,s=Cl(e),a=Nl(e),l=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",c=o&&e.kind!=="model-document"?Ml(o,r):[],d=[],u=[],p=o?o.name==="TreeNodesModel"?[o]:o.children.filter(R=>R.kind==="element"&&R.name==="TreeNodesModel"):[];for(let R of p){let E=wl(R,r,a,l),y=new Map;for(let b of E)ql({node:b,treeNodesModel:d,genericSubTreePorts:u})||(y.has(b.id)?n.push($l(b)):y.set(b.id,b))}let m=o?Al(o,r):[],g=o?Vl(o,r):[],f=o?(()=>{let R=[];return No(o,R,r,e.originalText),R})():[],T=o?ie(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Ol({uri:r,path:t?.path??e.path,isBtXml:i,kind:s,behaviorTrees:c,subtreeReferences:m,nodeUsages:g,blackboardReferences:f,treeNodesModel:d,genericSubTreePorts:u,rootMainTreeToExecute:T?{uri:r,range:T.range,value:T.value}:void 0}),extractedBehaviorTrees:c,extractedTreeNodesModel:d,extractedSubTreeReferences:m,extractedBlackboardReferences:f},diagnostics:n}}function wo(e,t){let{extracted:n,diagnostics:r}=Xl(e,t);return{model:n.publicModel,diagnostics:r}}function $n(e,t){return wo(e,t)}var Mo=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),zl=new Set([...Mo,"_autoremap","_description","__shared_blackboard"]),Wl=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 Xn(e){return Mo.has(e)}function Ao(e){return zl.has(e)}function zn(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(Ao(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=Wl.get(t);if(r)return r}}function _o(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 bt(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>_o(n,r))}}var Gl=[{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"]}],ht=new Map,Lo=new Map;for(let e of Gl){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Lo.set(e.name,t),ht.set(e.name,e.name);for(let n of e.aliases)ht.set(n,e.name)}function Kl(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 Wn(e){return ht.get(e)??e}function Hl(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 St(e){return ht.get(e)}function ot(e=[]){let t=new Map,n=new Map(ht);for(let r of Lo.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=Wn(i.canonical??o),l=t.get(s)??Kl(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)??Wn(o))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,o])=>[r,Hl(o)])),namesToCanonical:n}}function de(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Wn(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Jt(e,t){return de(e,t)?.canonical}function vt(e,t,n){let r=de(e,t),o=de(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 Fo=[{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:[]}],jo={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 Uo=[{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:[]}],Oo={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 Vo=[{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:[]}],qo={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 $o=["4.6.2","4.8.2","4.9.0"],Gn="4.9.0",Rt={"4.6.2":{models:Fo,genericSubTreeModel:jo},"4.8.2":{models:Uo,genericSubTreeModel:Oo},"4.9.0":{models:Vo,genericSubTreeModel:qo}};var Xo=$o.map(e=>`btcpp-v${e}`),kt=["btcpp-v4",...Xo],zo=`btcpp-v${Gn}`;function Wo(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 Yl(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Wo)}))}function Go(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Wo)}}function Jl(){let e={};for(let[t,n]of Object.entries(Rt))e[`btcpp-v${t}`]=Yl(n.models);return e}function Zl(){let e={};for(let[t,n]of Object.entries(Rt))e[`btcpp-v${t}`]=Go(n.genericSubTreeModel);return e}var Ql=Jl(),ec=Zl();function tc(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Rt,t)}function Ko(e){return e==="btcpp-v4"?zo:e}function nc(e){return e==="btcpp-v4"?Gn:e.replace(/^btcpp-v/,"")}function Ho(e){if(e&&e!=="btcpp-v4"&&!tc(e))throw new Error(`unsupported builtin model set: ${e}`)}function Kn(e="btcpp-v4"){Ho(e);let t=Ko(e);return Ql[t].map(r=>Yo(r))}function Hn(e="btcpp-v4"){Ho(e);let t=ec[Ko(e)]??Go(Rt[nc(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Yo(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 Tt(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 Zt(e,t){let n=Tt(e),r=Tt(t);return JSON.stringify(n)===JSON.stringify(r)}function Yn(e,t){if(Zt(e,t))return"none";let n=Tt(e),r=Tt(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):"",d=l.enum?JSON.stringify(l.enum):"";c!==d&&(s=!0),a.description!==l.description&&(s=!0),a.defaultValue!==l.defaultValue&&(i=!0)}return s?"ports":i?"port-default":"mixed"}import{findNodeAtLocation as lc,parse as cc,parseTree as dc}from"jsonc-parser";import{z as w}from"zod";var Jo=w.discriminatedUnion("kind",[w.object({kind:w.literal("pattern"),pattern:w.string()}).strict(),w.object({kind:w.literal("enum"),values:w.array(w.string())}).strict(),w.object({kind:w.literal("tuple"),separator:w.string(),items:w.array(w.string())}).strict(),w.object({kind:w.literal("json-schema"),schema:w.unknown()}).strict()]),rc=w.object({kind:w.enum(["primitive","opaque","any"]),canonical:w.string().optional(),aliases:w.array(w.string()).optional(),compatibleWith:w.array(w.string()).optional(),validate:Jo.optional()}).strict(),oc=w.object({from:w.string().optional(),to:w.string()}).strict(),ic=w.object({typeRefinement:oc.optional(),validate:Jo.optional(),required:w.boolean().optional(),enum:w.array(w.string()).optional(),description:w.string().optional()}).strict(),sc=w.object({ports:w.record(w.string(),ic).optional()}).strict(),ac=w.object({enums:w.record(w.string(),w.number().finite()).optional()}).strict(),Zo=w.object({version:w.literal(1),types:w.record(w.string(),rc).optional(),augment:w.record(w.string(),sc).optional(),script:ac.optional()}).strict();function uc(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 pc(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function Qo(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function mc(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...Qo(e.path),t]}return Qo(e.path)}function fc(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;return{message:`Unrecognized key: "${t??""}"`,path:[...e.path,t].filter(n=>n!==void 0).join(".")}}return{message:e.message,path:e.path.length>0?e.path.join("."):void 0}}function Jn(e,t){let n=t?.uri??"",r=[],o=dc(e,r,{allowTrailingComma:!0,disallowComments:!1});try{let i=cc(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=Zo.safeParse(i);if(!s.success){let a=uc(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let c=mc(l),{message:d,path:u}=fc(l);return{kind:"schema",message:d,path:u,range:pc(lc(o,c),a),notes:u?[u]: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 ei=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(),Qt=W.object({kind:W.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:W.record(W.string(),ei).optional(),description:W.string().optional()}).strict(),Zn=W.object({nodes:W.record(W.string(),Qt)}).strict();import{z as D}from"zod";var ti=D.enum(["off","info","warn","error"]),ni=D.union([ti,D.tuple([ti,D.record(D.string(),D.unknown())])]),gc=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(),yc=D.string(),bc=D.object({name:D.string(),attribute:D.string(),base:D.enum(["file","project-root"]).optional()}).strict(),hc=D.object({elements:D.array(bc).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(),Sc=D.object({entrypoints:D.array(yc).optional(),includes:hc.optional(),behaviorTreeIds:D.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),vc=D.enum(["allow-unused","used-only","single-source"]),Rc=D.object({builtins:D.array(D.enum(kt)).optional(),files:D.array(D.string()).optional(),augmentations:D.array(D.string()).optional(),definitions:D.array(D.string()).optional(),inline:D.record(D.string(),Qt).optional(),convention:vc.optional()}).strict(),ri=D.object({inline:D.enum(["allow","deny"]).optional()}).strict(),kc=D.object({enabled:D.boolean().optional(),rules:D.record(D.string(),ni).optional(),baseline:D.string().optional(),suppressions:ri.optional()}).strict(),Tc=D.object({rules:D.record(D.string(),ni).optional(),suppressions:ri.optional()}).strict(),oi=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(),xc=D.object({files:D.array(D.string()),linter:Tc.optional(),formatter:oi.optional()}).strict(),ii=D.object({$schema:D.string().optional(),strict:D.boolean().optional(),files:gc.optional(),resolver:Sc.optional(),models:Rc.optional(),linter:kc.optional(),formatter:oi.optional(),overrides:D.array(xc).optional()}).strict();function li(e){return e.flatMap(Dc)}function Dc(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=si([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=si(e.path);return ci(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 si(e){return e.map(String).join(".")||void 0}function ci(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(ai);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(ai):!1}function ai(e){return typeof e=="object"&&e!==null&&ci(e)}function xt(e){let t=ii.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:li(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 Cc(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 Bc(e){return e.map(t=>P(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function Ec(e){let t=[],n=tt(),{$schema:r,strict:o,overrides:i,...s}=e;o&&(n=gt(n,Io)),n=gt(n,s),n.overrides=(i??[]).map(l=>({files:l.files,linter:Cc(l.linter),formatter:Ic(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function Dt(e){let t=xt(e);return t.ok?Ec(t.value):{ok:!1,config:tt(),diagnostics:Bc(t.diagnostics)}}function Nc(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 en(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),o=r?t.slice(1):t,s=Nc(o).test(n);return r?!s:s}function di(e,t){return e.overrides.filter(n=>n.files.some(r=>en(t,r)))}function It(e){return e.replaceAll("\\","/")}function Pc(e){try{return decodeURIComponent(e)}catch{return e}}function Ct(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Pc(t.pathname);return/^\/[A-Za-z]:/.test(n)?It(n.slice(1)):t.host?It(`//${t.host}${n}`):It(n)}function tn(e,t){let n=It(t);return e.files.ignore.some(r=>en(n,r))?!1:e.files.include.some(r=>en(n,r))}function Qn(e,t){return tn(e,Ct(t))}function te(e,t){let n=It(t),r=di(e,n),o=e;for(let i of r)o=gt(o,{linter:i.linter,formatter:i.formatter});return{files:o.files,resolver:o.resolver,models:o.models,linter:o.linter,formatter:o.formatter}}function er(e,t){return te(e,Ct(t))}import{z as nn}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",ConflictingModelKind:"BT120_CONFLICTING_MODEL_KIND",UnusedModelDefinition:"BT121_UNUSED_MODEL_DEFINITION",DuplicateModelDefinition:"BT122_DUPLICATE_MODEL_DEFINITION",MissingLocalModelDefinition:"BT123_MISSING_LOCAL_MODEL_DEFINITION",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"},tr=Object.values(S).sort();var wc=nn.object({subTreePorts:nn.enum(["loose","strict"]).optional()}).strict(),Mc=nn.object({allowStringEntryCompatibility:nn.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:wc,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:Mc,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:"error",description:"Resolved output ports must be explicitly or default-remapped to a blackboard entry."},"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."},"model/no-conflicting-kind-for-id":{code:S.ConflictingModelKind,defaultSeverity:"error",description:"A model ID must not be defined with different kinds."},"model/no-unused-definition":{code:S.UnusedModelDefinition,defaultSeverity:"error",description:"Inline model definitions should be used in the same BT XML file."},"model/require-local-definition":{code:S.MissingLocalModelDefinition,defaultSeverity:"error",description:"When models.convention is used-only, normal node usages should have a local TreeNodesModel definition in the same file."},"model/no-duplicate-definition":{code:S.DuplicateModelDefinition,defaultSeverity:"error",description:"A user-defined model (ID, kind) should be defined only once."},"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 se(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 nr(e){return e in ue}function ke(e){if(typeof e=="string")return Yt.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&Yt.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 Ue(e,t){let n=e[t];if(n!==void 0){let r=ke(n);if(r)return r.severity}return ue[t].defaultSeverity}function rr(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(...Ac(e,s));return n}function Ac(e,t){if(t.code==="unrecognized_keys")return t.keys.map(r=>P("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(r)}\` for rule \`${e}\``,void 0,void 0,{help:ui(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[P("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:ui(e)})]}function ui(e){let n=ue[e].options?.map(r=>r.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function or(e){let t=[];pi(e.linter,"linter.rules",t);for(let[n,r]of(e.overrides??[]).entries())pi(r.linter,`overrides.${n}.linter.rules`,t);return t}function pi(e,t,n){for(let[r,o]of Object.entries(e?.rules??{})){let i=`${t}.${r}`;if(!nr(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 rr(r,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:_c(i,s.options,a.message),message:a.message,help:a.details?.help})}}function _c(e,t,n){let r=Object.keys(t).find(o=>n.includes(`\`${o}\``));return r?`${e}.1.${r}`:`${e}.1`}function mi(e,t){if(t)return Jt(e,t)}function fi(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function gi(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return P(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Lc(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??fi(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=mi(e,l.from),d=mi(e,i);return c&&c!==d?(o.push(gi({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 Fc(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(gi({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,Lc(e,t,a,s,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function jc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??fi(e)}}function yi(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,s])=>[i,{...s,ports:s.ports.map(jc)}]));for(let i of n)for(let[s,a]of Object.entries(i.augment??{})){let l=o.get(s);if(!l){r.push(P("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,Fc(t,l,a,r))}return{modelsById:o,diagnostics:r}}function Si(e){return Bt("builtin",0,!1,e)}function vi(e){return Bt("xml-tree-nodes-model",10,!0,e)}function Ri(e){return Bt("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function ki(e){return Bt("node-definition-file",20,!0,e)}function Ti(e){return Bt("config-inline",30,!0,e)}function Bt(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>xi(o,e,n&&o.editable!==!1))}}function Uc(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function xi(e,t,n){let r=Uc(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 it(e,t){return{uri:e.uri,sourceKind:e.source||"inline-tree-nodes-model",nodeId:e.id,kind:e.kind,range:e.range,idRange:e.idRange,sourceIndex:t}}function bi(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 Oc(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:bi(s)});for(let[i,s]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:bi(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 hi(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(Zt(o,r))continue;let i=Yn(o,r),s=Oc(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}),d=c?.name??"unknown",u=[it(o,0),it(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:d,sources:[{source:it(o,0),value:l.get(d)?.defaultValue},{source:it(r,1),value:c?.defaultValue}]},t.push({id:r.id,definitions:[o,r],sources:u,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${d}\` 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=[it(o,0),it(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 Di(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(d=>xi(d,a.kind,a.editable&&d.editable!==!1));l.push(...c),i.set(a.precedence,l);for(let d of c)s.set(d.id,a.precedence)}for(let[a,l]of[...i.entries()].sort((c,d)=>c[0]-d[0])){let c=l.filter(m=>s.get(m.id)===a),d=l.filter(m=>s.get(m.id)!==a),u=hi(d,[]);for(let[m,g]of hi(c,t))u.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 u)r.set(m,Vc(r.get(m),g))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function qc(e){return kt.includes(e)}function $c(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:ot(),augmentations:[]}}function Xc(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function zc(e,t,n){for(let r of new Set(n))if(qc(r)){for(let o of Kn(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...Hn(r))}}function Wc(e,t,n,r,o){for(let i of o){let s=$n(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)Xc(e.behaviorTreesById,l.id,l);i.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Gc(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 Kc(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=Gc(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function Hc(e,t,n,r,o){e.modelLayers.push(Si(t),vi(n),Ri(r)),o.models?.length&&e.modelLayers.push(ki([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Oe(e,t){return Yc(e,t)}function Yc(e,t){let n=$c(),r=[],o=[],i=[],s=[];zc(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=ot(t.augmentations??[]),Wc(n,r,i,s,e),Kc(n),Hc(n,o,i,s,t);let a=t.config.models.inline;if(a){let d=[];for(let[u,p]of Object.entries(a))d.push(bt(u,p));n.modelLayers.push(Ti(d))}let l=Di(n.modelLayers),c=yi(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(d=>d.severity!==h.Error),index:n,diagnostics:r}}var Ii={unknownSubTreePorts:"allow"};function Ci(e){return{...Ii,...e}}var Jc=["Action","Condition","Control","Decorator"],Zc=new Set(Jc);var Qc=new Set(["input_port","output_port","inout_port"]);function Et(e){return Zc.has(e)}function Ve(e){return Et(e)?e:void 0}function rn(e,t){return e.attributes.find(n=>n.name===t)?.value}function ir(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&ir(n,t))return!0;return!1}function Bi(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return ir(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&ir(n,t))return!0;return!1}function on(e){return Qc.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":Et(e.name)?"generic-node":on(e)?"unknown-xml":"concrete-node"}function sn(e){if(e.name==="SubTree")return rn(e,"ID")||"SubTree";if(Et(e.name))return rn(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||on(e)))return e.name}function ne(e){return e.typeRegistry}function Z(e,t){return de(ne(e),t)}function Ce(e,t,n){return vt(ne(e),t,n)}function Nt(e,t){return e.documents.get(t)}function Y(e,t){return e.behaviorTreesById.get(t)??[]}function sr(e,t){return e.behaviorTreesById.has(t)}function ar(e){return[...e.behaviorTreesById.values()].flat()}function lr(e,t){return dr(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function Ni(e){return dr(e).flatMap(t=>t.nodeUsages)}function cr(e){let t=new Map;for(let n of Ni(e)){let r=t.get(n.uri)??[];r.push(n),t.set(n.uri,r)}return t}function Be(e){return[...e.behaviorTreesById.keys()]}function dr(e){return[...e.documents.values()]}function Q(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function Te(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function an(e){return[...e.mergedNodeModelsById.values()]}function Pt(e){return e.modelLayers.flatMap(t=>t.models)}function wt(e){return[...e.mergedNodeModelsById.values()]}function ur(e){return[...e.nodeModelsById.keys()]}function pr(e){return[...e.genericSubTreePorts]}function Mt(e){return[...e.augmentations]}function qe(e){return e.modelConflicts}function At(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(d=>d.uri===r);c.length>0&&(i=c)}let a=Q(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=Q(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function mr(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Q(e,t);if(n){let o=qe(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=Te(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 fr(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function gr(e){let t=pr(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return fr([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function yr(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}:Xn(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 U(e,t){let n=Ci(t.policy),r=t.element,o=Ei(r),i=Bi(t.documentRoot,r);if((t.isModelDefinition||i&&(o==="generic-node"||o==="subtree"))&&(o="model-definition"),i&&on(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=sn(r);if(o!=="subtree"){let m=mr(e,s),g=gr({index:e,tagForm:o,model:m}),f=r.attributes.map(T=>yr({attribute:T,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=rn(r,"ID"),l=a?At(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},c={status:"unresolved",nodeType:a},d=!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=mr(e,l.treeId);m.status==="resolved"&&m.model.kind==="SubTree"?c=m:d=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}:d=n.unknownSubTreePorts==="allow";let u=gr({index:e,tagForm:o,model:c,subtreeModelPorts:l.status==="ambiguous"?fr(l.definitions.flatMap(m=>m.ports)):void 0}),p=r.attributes.map(m=>yr({attribute:m,ports:u,allowsArbitraryAttributes:d,model:c,unknownModelPortStatus:!d&&c.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:o,nodeType:s,model:c,subtree:{id:a,target:l},ports:u,allowsArbitraryAttributes:d,portUsages:p}}function ge(e,t){return U(e,t).portUsages.find(r=>r.name===t.attributeName)}function nd(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function rd(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Pi(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 br(e,t,n){let r=Pi(e,t),o=Pi(r,n);return{start:r,end:o}}function Mi(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:br(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:br(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:br(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 od(e,t){return nd(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Ai(e){let t=[];for(let n of e)t.push(n),t.push(...Ai(n.children));return t}function id(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function sd(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function ad(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function _i(e){return Ee(e,"name")?.value}function ld(e){return _i(e)||Ee(e,"ID")?.value||e.name}function cd(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${ld(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function Li(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 Fi(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 dd(e){return e.status==="resolved"?e.port.direction:"unknown"}function ud(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 wi(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:dd(t.usage),valueKind:ud(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 pd(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 Ee(e,t){return e.attributes.find(n=>n.name===t)}function md(e){return e.root?Ee(e.root,"main_tree_to_execute")?.value:void 0}function fd(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=fd(e.root),o=rd(e).map(l=>({id:Ee(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),i=[],s=[],a=(l,c,d,u)=>{let p=U(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(l)}),m=Li(p),g={element:l,path:u,tagName:l.name,kind:od(l,p),model:m,usage:p,portBindings:[],children:[],parent:d,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:Fi(f),usage:f,blackboardReferences:Mi(e,f.name,f.attribute)})),g.children=l.children.filter(f=>f.kind==="element").map((f,T)=>a(f,c,g,[...u,T])),l.name==="SubTree"){let f=Ee(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(d=>d.kind==="element").map((d,u)=>a(d,l,void 0,[u]));l.rootNode=c[0],l.nodes=Ai(c),s.push(...l.nodes)}return{document:e,behaviorTrees:o,subtreeCalls:i,nodes:s}}function ln(e,t,n){let r=G(e,{semantic:t,config:n?.config,policy:n?.policy}),o=sd(r.behaviorTrees),i=r.nodes.map(c=>{let d=o(c),u=c.usage,p=u.nodeType??c.tagName,m=_i(c.element),g=Ee(c.element,"ID")?.value,f=cd(c);return{nodeId:d,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(ad),identityCandidates:pd({name:m,idAttr:g,nodeType:p,tagName:c.tagName,instancePath:f,behaviorTreeId:c.behaviorTree.id,nodeId:d}),model:Li(u),usage:u,portBindings:u.portUsages.filter(T=>T.status!=="reserved-attribute").map(T=>wi(d,{name:T.name,value:T.value,attribute:T.attribute,declaredPort:Fi(T),usage:T,blackboardReferences:Mi(e,T.name,T.attribute)}))}}),s=r.behaviorTrees.map(c=>({id:c.id,range:c.element.range,idRange:Ee(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(d=>wi(o(c.node),d))})),l=e.root?Ee(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:id(e),mainTreeToExecute:md(e),mainTreeToExecuteRange:l?.valueContentRange||l?.valueRange,behaviorTrees:s,nodes:i,subtreeCalls:a}}function gd(e,t){let n=e.element.fullRange||e.element.range;return H(n,t)}function yd(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 cn(e,t){let n;for(let r of e.nodes)gd(r,t.offset)&&(!n||yd(r,n))&&(n=r);return n}function st(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(H(r.attribute.range,t.offset))return r}function bd(e,t){return H(e.fullRange||e.range,t)}function hd(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 dn(e,t){let n;for(let r of e.nodes)bd(r,t.offset)&&(!n||hd(r,n))&&(n=r);return n}function un(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(H(r.range,t.offset))return r}function Cd(e){return`${e.kind}\0${e.id}`}function hr(e){return Pt(e).map(t=>{let n=t.source??t.sourceMeta?.sourceKind;return{key:{id:t.id,kind:t.kind},model:t,id:t.id,kind:t.kind,uri:t.uri,range:t.range,sourceKind:n,isBuiltin:n==="builtin",isCanonicalModelFile:n==="external-tree-nodes-model",editable:t.editable!==!1}})}function Sr(e){let t=new Map;for(let n of e){let r=t.get(n.id)??[];r.push(n),t.set(n.id,r)}return t}function vr(e){let t=new Map;for(let n of e){let r=Cd(n.key),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function ji(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,l=a.children.some(p=>p.kind==="element"&&p.name==="BehaviorTree"),c=a.children.some(p=>p.kind==="element"&&p.name==="TreeNodesModel"),d=a.attributes.some(p=>p.name==="BTCPP_format"&&p.value==="4"),u=a.name==="TreeNodesModel"||a.name==="root"&&!l&&c;r.kind==="model-xml"||u?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(d||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 Bd(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 Rr(e,t){if(e.kind==="element"){Bd(e)&&t(e);for(let n of e.children||[])Rr(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 nt(n,r,t)}function kr(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 u=1;if(i[u]==="x"||i[u]==="X"){u++;let T="";for(;u<i.length&&/[0-9a-fA-F]/.test(i[u]);)T+=i[u],u++;if(u<i.length&&i[u]===";"){u++;let y=e.slice(s,s+1+u),b=q(n,t+s),k=q(n,t+s+y.length);if(T){let x=Number.parseInt(T,16);if(x>0&&x<=1114111&&(x<55296||x>57343)){o+=u-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${y}\``,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+=u-1;continue}r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${y}\``,b,k,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=u-1;continue}let B=e.slice(s,s+1+u),R=q(n,t+s),E=q(n,t+s+B.length);r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${B}\``,R,E,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=u-1;continue}let p="";for(;u<i.length&&/[0-9]/.test(i[u]);)p+=i[u],u++;if(u<i.length&&i[u]===";"){u++;let T=e.slice(s,s+1+u),B=q(n,t+s),R=q(n,t+s+T.length);if(p){let E=Number.parseInt(p,10);if(E>0&&E<=1114111&&(E<55296||E>57343)){o+=u-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${T}\``,B,R,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=u-1;continue}r("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${T}\``,B,R,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=u-1;continue}let m=e.slice(s,s+1+u),g=q(n,t+s),f=q(n,t+s+m.length);r("XML001_INVALID_SYNTAX",h.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+=u-1;continue}let a=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(a){let u=`&${a[0]}`,p=q(n,t+s),m=q(n,t+s+u.length);r("XML013_UNKNOWN_ENTITY",h.Error,`unknown XML entity \`${u}\``,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+=u.length-1;continue}let l=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let u=`&${l[0]}`,p=q(n,t+s),m=q(n,t+s+u.length);r("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",p,m,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"}),o+=u.length-1;continue}let c=q(n,t+s),d=q(n,t+s+1);r("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",c,d,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"})}}function _t(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 Ui(e){let t="",n=[0];for(let r=0;r<e.length;){let o=Ed(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 Ed(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:_t(s),end:t+s.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let s=o[0];return{value:_t(s),end:t+s.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let s=i[0];return{value:_t(s),end:t+s.length}}}function Oi(e){return nt(e.line,e.character,e.offset)}function Nd(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function Pd(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function wd(e){return e===" "||e===" "||e===`
8
+ `||e==="\r"}function Md(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 d(){return nt(s,a,i)}function u(){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(;!u()&&wd(p());)m()}let f=(v,M,_,L,C,J)=>{n.push(P(v,M,_,I(L,C),o.uri,J))};function T(v,M,_,L,C,J){n.push(P(v,M,_,L&&C?I(L,C):void 0,o.uri,J))}function B(){if(!Nd(p()))return"";let v=i;for(m();!u()&&Pd(p());)m();return e.slice(v,i)}function R(){let v=p();if(v!=='"'&&v!=="'")return{value:"",ok:!1};let M=d();m();let _=d(),L=i;for(;!u()&&p()!==v&&p()!=="<";)m();let C=d();if(u()||p()!==v)return{value:e.slice(L,i),ok:!1,valueRange:I(M,C),valueContentRange:I(_,C)};let J=e.slice(L,i);m(),kr(J,_.offset,e,f);let Re=Ui(J);return{value:Re.value,valueOffsets:Re.offsets,ok:!0,valueRange:I(M,d()),valueContentRange:I(_,C)}}function E(){let v=[],M=new Set;for(;;){g();let _=p();if(!_||_===">"||_==="/"&&p(1)===">")break;let L=d(),C=B(),J=d();if(!C)break;g();let Re=d();if(p()!=="="){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",L,J,{primaryLabel:`expected \`=\` after attribute \`${C}\``,help:`write the attribute as \`${C}="..."\``}),c=!0,r)continue;break}m();let kl=d();g();let On=d(),Fe=R(),et=d();if(!Fe.ok&&(f("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",On,et,{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",h.Error,`duplicate attribute \`${C}\``,L,et,{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:Fe.value,...Fe.valueOffsets?{valueOffsets:Fe.valueOffsets}:{},range:I(L,et),fullRange:I(L,et),nameRange:I(L,J),equalsRange:I(Re,kl),valueRange:Fe.valueRange||I(On,et),valueContentRange:Fe.valueContentRange||I(On,et)}),!Fe.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 b(){let v=d(),M=i;for(;!u()&&p()!=="<";)m();let _=e.slice(M,i);if(_.length===0)return;for(let C of _)if(Md(C)){f("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",v,d(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}kr(_,M,e,f);let L={kind:"text",text:_t(_),range:I(v,d()),fullRange:I(v,d())};y(L)}function k(){let v=d();m(4);let M=d(),_=i;for(;!u()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)m();let L=e.slice(_,i);if(u()){if(f("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",v,d(),{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:I(v,d()),fullRange:I(v,d()),contentRange:I(M,d())};y(Re);return}(L.includes("--")||L.endsWith("-"))&&f("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",M,d(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let C=d();m(3);let J={kind:"comment",text:L,range:I(v,d()),fullRange:I(v,d()),contentRange:I(M,C)};y(J)}function x(){let v=d();m(5),g();let M=E();g(),p()==="?"&&p(1)===">"?m(2):f("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",v,d(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let _={range:I(v,d()),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=d();m(2),g();let M=d(),_=B(),L=d();if(g(),p()!==">")for(f("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",v,d(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),c=!0;!u()&&p()!==">";)m();p()===">"&&m();let C=l.pop();if(!C||C.name!==_){let J=C?C.name:_||"",Re=_||"";f("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${Re}>\``,v,d(),{primaryLabel:`opened as \`<${J}>\` but closed as \`</${Re}>\``,help:`change the closing tag to \`</${J}>\` or fix the nesting`});return}C.closeTagRange=I(v,d()),C.endTagRange=I(v,d()),C.nameRange||(C.nameRange=I(M,L)),C.range=I(C.range.start,d()),C.fullRange=I(C.range.start,d())}for(;!u();)if(p()==="<")if(p(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")x();else{let v=d();for(;!u()&&!(p()==="?"&&p(1)===">");)m();u()||m(2),f("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",v,d(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")k();else if(p(1)==="!"&&p(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let v=d();for(m(8);!u()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)m();u()||m(3),f("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",v,d(),{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=d();for(m(8);!u()&&p()!==">";)m();u()||m(1),f("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",v,d(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")A();else{let v=d();m();let M=d(),_=B(),L=d();if(!_){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,d(),{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:I(v,v),fullRange:I(v,v),openTagRange:I(v,v),startTagRange:I(v,v),nameRange:I(M,L),selfClosing:!1};if(C.attributes=E(),g(),p()==="/"&&p(1)===">"){m(2),C.selfClosing=!0,C.openTagRange=I(v,d()),C.startTagRange=C.openTagRange,C.range=I(v,d()),C.fullRange=I(v,d()),y(C);continue}if(p()!==">"){if(f("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",v,d(),{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=I(v,d()),C.startTagRange=C.openTagRange,C.range=I(v,d()),C.fullRange=I(v,d()),y(C);continue}break}m(),C.openTagRange=I(v,d()),C.startTagRange=C.openTagRange,C.range=I(v,d()),C.fullRange=I(v,d()),y(C),l.push(C)}else b();if(l.length>0){let v=l[l.length-1];if(f("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`}),c=!0,r)for(;l.length>0;){let M=l.pop();if(!M)break;M.range=I(M.range.start,d()),M.fullRange=I(M.range.start,d())}}let F=o.nodes.filter(v=>v.kind==="element");F.length===0?T("XML002_MISSING_ROOT",h.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):F.length>1&&T("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 j=o.root,ve=j?.name==="BehaviorTree"||j?.name==="TreeNodesModel"||j?.name==="root"&&(j.attributes.some(v=>v.name==="BTCPP_format"&&v.value==="4")||j.children.some(v=>v.kind==="element"&&(v.name==="BehaviorTree"||v.name==="TreeNodesModel")));if(j)for(let v of o.nodes)v!==j&&v.kind==="text"&&v.text.trim().length>0&&f("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&&!ve)T("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;f("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 j&&Rr(j,v=>{f("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",Oi(v.range.start),Oi(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"]})}),ji({document:o,diagnostics:n,partial:c,options:t})}var Lt={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Vi(e){if(!e)return Lt;let t=typeof e.indentWidth=="number"?e.indentWidth:Lt.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:Lt.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:Lt.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:Lt.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:o}}function pn(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function mn(e){return pn(e).replace(/"/g,"&quot;")}function Ad(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function _d(e,t,n){return`${" ".repeat(e*n)}${t}`}function at(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}="${mn(i[0].value)}"${n}`];let s=[`${o}<${e.name} ${i[0].name}="${mn(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],d=l===i.length-1?n:"";s.push(`${a}${c.name}="${mn(c.value)}"${d}`)}return s}function fn(e,t,n,r){let o=" ".repeat(t*n);if(e.kind==="comment")return[`${o}<!--${e.text}-->`];if(e.kind==="text"){let d=e.text.trim();return d?[_d(t,pn(d),n)]:[]}let i=Ad(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(d=>d.kind==="text").map(d=>d.text).join("").trim(),l=i.some(d=>d.kind==="element"||d.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 d=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${mn(e.attributes[0].value)}"`;return[`${o}<${e.name}${d}>${pn(a)}</${e.name}>`]}return at(e,t,`>${pn(a)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return at(e,t,"/>".slice(0),n);let d=at(e,t,">",n);return d.push(`${o}</${e.name}>`),d}let c=at(e,t,">",n);for(let d of e.children||[])d.kind==="text"&&d.text.trim()===""||c.push(...fn(d,t+1,n,r));return c.push(`${o}</${e.name}>`),c}function Ld(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function qi(e,t,n,r){let o=[],i=Ld(e);for(let s=0;s<i.length;s+=1){let a=i[s],l=i[s-1],c=i[s+1],d=n&&a.kind==="element"&&a.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",u=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;(d||u||p)&&o.length>0&&o[o.length-1]!==""&&o.push(""),a.kind==="element"?(o.push(...fn(a,1,t,r)),a.name==="TreeNodesModel"&&o.push("")):o.push(...fn(a,1,t,r))}return o}function Ft(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=Vi(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(...at(o,0,">",s)),a.push(...qi(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=`
11
11
  `;(i.lineEnding==="crlf"||i.lineEnding==="auto"&&e.includes(`\r
12
12
  `))&&(c=`\r
13
- `);let d=a.join(c),u=c.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${u})+$`,"u"),g=`${d.replace(p,"")}${c}`;return{ok:!0,text:g,changed:g!==e,skipped:!1,diagnostics:n.diagnostics.filter(f=>f.severity!==h.Error)}}function at(e,t){if(!(!H(e.range,t)&&!H(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=at(n,t);if(r)return r}return e}}var Vi=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,wd=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function Md(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 d=e.slice(o+2).match(Vi)?.[0];if(d){for(let p=n.length-1;p>=0;p-=1)if(n[p]===d){n.length=p;break}}let u=e.indexOf(">",o+2);if(u<0||u>=t)break;r=u+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 gn(e,t){let n=e.positionAt(t);return I(n,n)}function ae(e,t,n){return I(e.positionAt(t),e.positionAt(n))}function yn(e){return{name:e.name,value:e.value,range:ae(e.document,e.nameStart,e.valueEnd),fullRange:ae(e.document,e.nameStart,e.valueEnd),nameRange:ae(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?ae(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:ae(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?ae(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function Ad(e,t,n){let r=[];for(let o of t.matchAll(wd)){let i=o.index??0,s=o[1],a=o[2],l=o[3],c=o[4],d=o[0].indexOf(s),u=o[0].indexOf("=",d+s.length),p=o[0].indexOf(a,u+1),m=n+i+p,g=m+a.length;r.push(yn({document:e,name:s,value:l??c??"",nameStart:n+i+d,nameEnd:n+i+d+s.length,equalsStart:n+i+u,equalsEnd:n+i+u+1,valueStart:m,valueEnd:g,valueContentStart:m+1,valueContentEnd:g-1}))}return r}function _d(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:ae(e,s+2,t)}}function Oi(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,d=l.slice(c).match(Vi);if(!d)return{kind:"tag-name"};let u=d[0],p=c,m=p+u.length,g=ae(e,a+p,a+m),f={kind:"element",name:u,attributes:Ad(e,l,a),children:[],range:ae(e,s,t),fullRange:ae(e,s,t),openTagRange:ae(e,s,t),startTagRange:ae(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 T=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(T){let E=T[0].indexOf(T[1]),y=(T.index??0)+E,b=y+T[1].length,k=l.indexOf("=",b),x=T[2],A=T[4]??"";if(x){let F=l.indexOf(x,k+1),ve=a+F+1,v=yn({document:e,name:T[1],value:T[3]??"",nameStart:a+y,nameEnd:a+b,equalsStart:a+k,equalsEnd:a+k+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:yn({document:e,name:T[1],value:A,nameStart:a+y,nameEnd:a+b,equalsStart:a+k,equalsEnd:a+k+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 R=B[1]??"",E=t-a-R.length;return{kind:"attribute-name",element:f,attribute:yn({document:e,name:R,value:"",nameStart:a+E,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:f,attribute:{name:"",value:"",range:gn(e,t),fullRange:gn(e,t),nameRange:gn(e,t),valueRange:gn(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=_d(t,o);if(s)return{kind:"closing-tag-name",tagNamePrefix:s.tagNamePrefix,replacementRange:s.replacementRange,tagText:Md(t.text,o)};if(n?.root){let c=at(n.root,o);if(c){for(let d of c.attributes){if(H(d.nameRange,o))return{kind:"attribute-name",element:c,attribute:d};if(H(d.valueRange,o)||H(d.valueContentRange,o))return{kind:"attribute-value",element:c,attribute:d,valuePrefix:d.valueContentRange&&o>=d.valueContentRange.start.offset?t.text.slice(d.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 d=Oi(t,o);if(d)return d.kind==="tag-name"?{...d,element:d.element??c}:d}i={kind:"element",element:c}}}let a=Oi(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 bn(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=bn(t,n.start),i=bn(t,n.end),s=q(e.originalText,r.start.offset+o),a=q(e.originalText,r.start.offset+i);return I(s,a)}function Rr(e){return e.rootUri}function kr(e){return e.resolvedConfig}var qi={InvalidJson:S.InvalidAugmentationJson,InvalidSchema:S.InvalidAugmentationSchema};function Ld(e){return P(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function jd(e,t){return t.issues.map(n=>Ld({filePath:e,code:n.kind==="json"?qi.InvalidJson:qi.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 hn(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(P(S.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=Hn(s,{uri:i.uri,path:i.path});if(!a.ok){r.push(...jd(i.path,a));continue}o.push(a.data)}return{ok:r.every(i=>i.severity!==h.Error),augmentations:o,diagnostics:r}}function Fd(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 Ud(e,t){return ye(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function Tr(e,t){if(!await t.exists(e.uri))return{diagnostics:[P(S.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 Ud(e,t);if(!n.document||n.diagnostics.some(o=>o.severity===h.Error)){let o=n.diagnostics[0];return{diagnostics:[P(S.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=Fd(n.document);return r?{document:r,diagnostics:[]}:{diagnostics:[P(S.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 qe(e,t){let n=e,r=t??n.host,o=[];for(let c of n.selectedFiles){if(!await r.exists(c.uri))continue;let d=await r.readFile(c.uri),u=ye(d,{uri:c.uri,path:c.path});u.document&&o.push(u.document)}let i=await Promise.all(n.modelFiles.map(c=>Tr(c,r))),s=await hn({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 Od(e){return e.endsWith("/")?e:`${e}/`}function Vd(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):xr(e.split("/"))}function xr(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function $e(e,t={}){let n=e.replace(/\\/g,"/"),r=s=>Vd(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 Sn(e){let n=xr(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 qd(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function jt(e){return Sn($e(e))}function $d(e,...t){let n=$e(e),r=[...n.segments];for(let o of t){let i=$e(o,{preserveDotSegments:!0});if(i.scheme||i.absolute&&i.authority)return jt(o);i.absolute&&(r.length=0),r.push(...i.segments)}return Sn({...n,segments:xr(r)})}function Xd(e){let t=$e(e);return t.segments.length===0?Sn(t):Sn({...t,segments:t.segments.slice(0,-1)})}function zd(e){return $e(e).segments.at(-1)??""}function Wd(e,t){let n=$e(e),r=$e(t);if(!qd(n,r))return jt(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 Gd(e,t){let n=Od(jt(e)),r=jt(t);return r===n.slice(0,-1)||r.startsWith(n)}var Q={normalize:jt,join:$d,dirname:Xd,basename:zd,relative:Wd,isWithin:Gd};function be(e,...t){return Q.join(e,...t)}function $i(e){return Q.dirname(e)}function Xi(e){return Q.basename(e)}function Ee(e,t){return Q.relative(e,t)}function zi(e,t){return Q.isWithin(e,t)}import Kd from"ignore";function Dr(e){return e.replace(/\\/g,"/")}function $(e,t){return Dr(Ee(e,t))}function Hd(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 Ne(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");return!r.includes("*")&&!r.includes("?")?n===r||Xi(n)===r:Hd(r).test(n)}function Yd(e){return e.includes("*")||e.includes("?")}async function Wi(e,t,n,r,o,i,s,a){let l=$(n,t);if(l&&r.some(d=>Ne(l,d)||Ne(`${l}/`,d)||Ne(`${l}/dummy`,d))||a&&l&&a.ignores(l))return;let c;try{c=await e.readDir(t)}catch{return}for(let d of c){let u=be(t,d.name),p=d.type==="directory",m=d.type==="file";if(d.type==="other"&&i&&e.realpath)try{let g=await e.realpath(u);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 Wi(e,u,n,r,o,i,s,a):m&&o.push(u)}}async function Ft(e,t,n,r,o,i,s){let a=new Set,l=new Set,c=[],d=o??t;for(let p of e){let m=be(d,p);if((await s.stat(m))?.type==="file"){let g=$(t,m),f=!g.startsWith("..");!n.some(T=>Ne(g,T))&&(!f||!i?.ignores(g))&&a.add(m);continue}if(!Yd(p)){l.add(p);continue}c.push(p)}let u=[];if(c.length>0&&await s.exists(t)){let p=new Set([s.realpath?await s.realpath(t):t]);await Wi(s,t,t,n,u,r,p,i)}for(let p of u){let m=$(d,p);c.some(g=>Ne(m,g))&&(n.some(g=>Ne($(t,p),g))||i?.ignores($(t,p))||a.add(p))}for(let p of c)u.some(g=>{let f=$(d,g);return Ne(f,p)&&!n.some(T=>Ne($(t,g),T))&&!i?.ignores($(t,g))})||l.add(p);return{files:[...a].sort((p,m)=>$(t,p).localeCompare($(t,m))),unmatchedPatterns:[...l].sort()}}async function Jd(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 Zd(e){return Kd().add(e)}async function Gi(e,t,n,r,o){let i=[...t.ignore],s=t.useGitignore?await Jd(e,o):[],a=Zd(s),l=n?.length?n:t.include,c=await Ft(l,e,i,t.followSymlinks,n?.length?r:void 0,a,o),d=t.maxSize,u=[],p=[];for(let m of c.files){let g=$(e,m),f=await o.stat(m);if(f){if((f.size??0)>d){p.push({path:g,reason:"too-large"});continue}u.push({path:g,uri:m,kind:"unknown"})}}return{selectedFiles:u,skippedFiles:p,unmatchedPatterns:c.unmatchedPatterns}}function Ki(e){return e.entrypoints.map(t=>({file:Dr(t)}))}function Ir(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function Hi(e,t,n,r){let o=[];for(let i of t)await r.exists(be(e,i.file))||o.push(P(S.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 Yi(e,t){return e.attributes.find(n=>n.name===t)}function Ji(e,t){return Ee(e,t).replace(/\\/g,"/")}function Qd(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 eu(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:Yi(i,s.pathAttribute),rosPackageAttr:Yi(i,"ros_pkg"),base:s.base??"current-file"})}return o}async function Zi(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=>[Ji(t.rootUri,f.path||f.uri),f])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},c=new Map,d=new Set,u=t.entrypoints.length?t.entrypoints.map(f=>f.file):t.selectedFiles.map(f=>f.path);l.entrypointFiles=[...new Set(u)];let p=new Set,m=new Set,g=async(f,T,B)=>{if(T.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 R=f.replaceAll("\\","/");if(p.has(R)){let x=[...T.slice(T.indexOf(R)),R];l.cycles.push({files:x}),s.push({kind:"cycle",uri:B?.uri??R,path:R,cycle:x,range:B?.range,message:"include cycle detected"});return}if(m.has(R))return;p.add(R),l.reachableFiles.add(R);let E=be(t.rootUri,R);d.add(E);let y=await n.exists(E),b=a.get(R);!b&&y&&(b=ye(await n.readFile(E),{uri:E,path:R}).document,b&&a.set(R,b)),l.nodes.set(R,{path:R,document:b,exists:y}),b&&c.set(b.uri,b);let k=b?.uri??E;if(!y){s.push({kind:"not-found",uri:B?.uri??k,path:R,range:B?.range,message:`include file not found \`${R}\``}),p.delete(R);return}if(!b){p.delete(R);return}for(let x of eu(b,e)){if(!x.pathAttr){s.push({kind:"missing-path",uri:k,range:x.element.range,message:"missing include path"});continue}let A=Qd(x.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,x.pathAttr.range,k),j;if(x.rosPackageAttr){let M=x.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:k,packageName:M,range:x.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:k,packageName:M,path:A,range:x.rosPackageAttr.range,message:`ROS package \`${M}\` could not be resolved for include path \`${A}\``});continue}j=be(_,A)}else{let M=x.base==="project-root"?t.rootUri:$i(E);j=be(M,A)}let F=Ji(t.rootUri,j),ve=j;try{await n.exists(j)&&(ve=n.realpath?await n.realpath(j):j)}catch{}if(!zi(t.rootUri,ve)){if(!r){s.push({kind:"outside-root",uri:k,path:F,range:x.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:k,path:F,range:x.pathAttr.range,message:`external include used \`${A}\``})}l.edges.push({from:R,to:F,includeElementRange:x.element.range,includePathRange:x.pathAttr.range}),await g(F,[...T,R],{uri:k,range:x.pathAttr.range})}p.delete(R),m.add(R)};for(let f of l.entrypointFiles)await g(f,[]);return{graph:l,reachableUris:d,reachableDocuments:c,issues:s}}var Qi="model/no-conflicting-kind-for-id",es="model/no-unused-definition",ts="model/no-duplicate-definition";function Cr(e){return{...P(e.code,e.severity,e.message,e.range,e.uri,void 0,e.data),rule:e.rule,...e.relatedInformation?{relatedInformation:e.relatedInformation}:{}}}function Br(e,t){let n=Fe(e.linter.rules,t);if(n!=="off")return n==="info"?h.Info:n==="warn"?h.Warning:h.Error}function Ut(e){return e.model.idRange??e.range}function vn(e){return e.range}function tu(e){return{uri:e.uri,sourceKind:e.sourceKind,modelKind:e.kind,range:e.range}}function nu(e){let t=Br(e.config,Qi);if(!t)return[];let n=[],r=br(e.facts.filter(o=>!o.isBuiltin));for(let[o,i]of r){if(new Set(i.map(l=>l.kind)).size<=1)continue;let a=i[0];if(a)for(let l of i.slice(1)){if(l.kind===a.kind)continue;let c=Ut(a),d=a.uri&&c?[{uri:a.uri,range:c,message:"first conflicting definition"}]:void 0;n.push(Cr({code:"BT120_CONFLICTING_MODEL_KIND",message:`model ID \`${o}\` has conflicting kinds (\`${a.kind}\` vs \`${l.kind}\`)`,uri:l.uri,range:Ut(l),rule:Qi,severity:t,data:{kind:"conflicting-model-kind",nodeId:o,definitions:i.map(tu)},relatedInformation:d}))}}return n}function ru(e){if(e.config.models.convention!=="used-only")return[];let t=Br(e.config,es);if(!t)return[];let n=[],r=ar(e.index);for(let o of e.facts){if(o.isBuiltin||o.sourceKind!=="inline-tree-nodes-model"||o.kind==="SubTree")continue;let i=r.get(o.uri??"")??[];new Set(i.filter(a=>a.kind==="node").map(a=>a.id)).has(o.id)||n.push(Cr({code:"BT121_UNUSED_MODEL_DEFINITION",message:`unused inline model definition \`${o.id}\` in this file`,uri:o.uri,range:Ut(o),rule:es,severity:t,data:{kind:"unused-model-definition",nodeId:o.id,modelKind:o.kind,sourceKind:"inline-tree-nodes-model",fix:o.uri&&vn(o)&&o.editable?{kind:"delete-definition",uri:o.uri,range:vn(o)}:void 0}}))}return n}function ou(e){let t=e.filter(o=>o.isCanonicalModelFile);if(t.length!==1)return;let n=t[0];if(!n?.uri)return;let r=e.filter(o=>o!==n);if(!r.some(o=>!o.uri||!vn(o)||!o.editable))return{kind:"delete-non-canonical-definitions",keep:{uri:n.uri,range:Ut(n)},delete:r.map(o=>({uri:o.uri,range:vn(o)}))}}function iu(e){if(e.config.models.convention!=="single-source")return[];let t=Br(e.config,ts);if(!t)return[];let n=[],r=hr(e.facts.filter(o=>!o.isBuiltin));for(let o of r.values()){if(o.length<=1)continue;let i=o[0];i&&n.push(Cr({code:"BT122_DUPLICATE_MODEL_DEFINITION",message:`duplicate model definition for \`${i.id}\` (${i.kind})`,uri:i.uri,range:Ut(i),rule:ts,severity:t,data:{kind:"duplicate-model-definition",nodeId:i.id,modelKind:i.kind,definitions:o.map(s=>({uri:s.uri,sourceKind:s.sourceKind,range:s.range,canonical:s.isCanonicalModelFile,editable:s.editable})),fix:ou(o)}}))}return n}function ns(e){if(e.config.linter.enabled===!1)return[];let t=yr(e.index);return[...nu({config:e.config,facts:t}),...ru({config:e.config,index:e.index,facts:t}),...iu({config:e.config,facts:t})]}import{findNodeAtLocation as rs,parse as su,parseTree as au}from"jsonc-parser";function lu(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 os(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function is(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(P(S.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,l=await n.readFile(s.uri),c=[],d=au(l,c,{allowTrailingComma:!0,disallowComments:!1});try{if(a=su(l,c,{allowTrailingComma:!0,disallowComments:!1}),c.length>0||!d)throw new Error(`JSON parse error at offset ${c[0]?.offset??0}`)}catch(p){let m=String(p.message||p);r.push(P(S.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:[m]}));continue}let u=Yn.safeParse(a);if(!u.success){for(let p of u.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(P(S.InvalidNodeDefinitionSchema,h.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(u.data.nodes)){i.has(p)&&r.push(P(S.DuplicateNodeDefinitionId,h.Error,`duplicate node definition ID \`${p}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),i.add(p);let g=lu(l),f=os(rs(d,["nodes",p]),g),T=gt(p,m),B=T.ports.map(R=>{let E=os(rs(d,["nodes",p,"ports",R.name]),g);return{...R,source:"node-definition-file",uri:s.path,range:E,nameRange:E}});o.push({...T,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!==h.Error),nodeModels:o,diagnostics:r}}function ss(e,t){return Ee(e,t).replace(/\\/g,"/")}function cu(e){return[...e.reachableDocuments.values()]}function Er(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function as(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function du(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 Nr(e){let t=[],n=e.project,r=e.resolvedConfig,o=e.resolutionMode??Ir(r),i=o==="entrypoints"||e.resolveGraph?await Zi({project:e.project,documents:e.documents,resolvedConfig:r,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await is({project:e.project,host:e.host});t.push(...l.diagnostics);let c=l.nodeModels,d=i&&(o==="entrypoints"||e.resolveGraph)?Er([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)&&i.reachableUris.has(f.uri)),...i.reachableDocuments.values(),...s]):Er([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)),...s]),u=Ue(d,{config:r,models:c,augmentations:a}),p={includeIssuesByUri:du(i?.issues??[]),suppressionIssuesByUri:new Map};t.push(...u.diagnostics,...ns({config:r,index:u.index}));let m=new Map(Ce(u.index).map(f=>[f,Y(u.index,f)])),g={mode:o,files:new Map(d.map(f=>[ss(n.rootUri,f.path||f.uri),f])),documentViews:new Map(d.map(f=>[f.uri,(()=>{let T=ee(r,ss(n.rootUri,f.path||f.uri));return G(f,{semantic:u.index,config:T,policy:ie(T)})})()])),includeGraph:i?.graph,reachableDocuments:i?.reachableDocuments??new Map,behaviorTreesById:new Map(Ce(u.index).map(f=>[f,Y(u.index,f)])),reachableBehaviorTreesById:m,nodeModelsById:new Map(Nt(u.index).map(f=>[f.id,f])),nodeModelSources:new Map(cr(u.index).map(f=>[f,Ve(u.index,f).flatMap(T=>T.sourceMeta?[T.sourceMeta]:[])])),nodeDefinitionModels:[...c],entrypoints:n.entrypoints,workspace:u.index,facts:p};return{ok:t.every(f=>f.severity!==h.Error),index:g,diagnostics:t}}async function ls(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 Tr(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 hn({project:e.project,host:o});r.push(...g.diagnostics),s=[...g.augmentations]}let a=e.resolutionMode??Ir(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 Nr({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:i,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:o}),d=Er([...e.documents,...cu(c.index),...i]),u=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:d,lintEnabled:u,showSuppressed:p,resolvedConfig:n,suppressionIssuesByUri:void 0}}function cs(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function ds(e,t){return e.includeIssuesByUri.get(t)??[]}function us(e,t){return e.suppressionIssuesByUri.get(t)??[]}function ps(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=ie(r),l=uu(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(c){let d=P(c.code??e.code,e.severity,c.message,c.range,t.uri,c.details,c.data);e.diagnostics.push({...d,rule:e.rule,...c.relatedInformation?{relatedInformation:c.relatedInformation}:{}})},getIncludeIssues(c){let d=ds(e.facts,t.uri);return c?d.filter(u=>u.kind===c):d},getSuppressionIssues(c){let d=us(e.facts,t.uri);return c?d.filter(u=>u.kind===c):d},getNodeUsage(c){return U(n,{element:c,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:l.has(c)})},getPortUsage(c,d){return ge(n,{element:c,documentRoot:t.root,attributeName:d,uri:t.uri,config:r,policy:a,isModelDefinition:l.has(c)})},resolveSubTree(c,d){return Mt(n,{id:c,fileLocalUri:d,config:r})},getNodeModel(c){return se(n,c)},getBehaviorTrees(c){return Y(n,c)},getTreeNodeView(c){return i.get(c)},getSubTreeCallView(c){return s.get(c)}}}function uu(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return Pr(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||Pr(n,t);return t}function Pr(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&Pr(n,t)}function N(e){let t=ue[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var pu={"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 Pe(e){return N({name:pu[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:mu(n)})}}}})}function mu(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 ms=[Pe("missing-path"),Pe("not-found"),Pe("cycle"),Pe("outside-root"),Pe("unresolved-variable"),Pe("depth-exceeded"),Pe("too-many-files"),Pe("external-used")];import fu from"ajv";var gu=fu,yu=new gu,bu=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],hu={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}},wr=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"]),fs=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 gs(e){return e.children.filter(t=>t.kind==="element")}function pe(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function ys(e){return e.children.some(t=>t.kind==="element")}function kn(e,t){let n=bs(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function bs(e){let t=Ot(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 Rn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Tu(e.registry,n,e.value)?void 0:Rn(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!Ss(r,e.value))return Su(r)?Rn(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 Xe(e){return e.effectiveType??e.type}function hs(e,t){return de(e,Xe(t))}function Ot(e,t){let n=X({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function Rn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function Su(e){let t=bt(e)??e;return vs(e)!==void 0||xu.has(t.toLowerCase())}function Ss(e,t){let n=vs(e);if(n)return vu(n,t);let r=(bt(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 bu.includes(t);default:return wr.has(r)||fs.has(r)?Rs(r,t):!1}}function vs(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function vu(e,t){let n=ku(t);return n?n.every(r=>Ru(e,r)):!1}function Ru(e,t){if(t.kind==="string")return Ss(e,t.value);let n=(bt(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 wr.has(n)||fs.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&Rs(n,String(t.value)):!1}}function Rs(e,t){let n=hu[e];if(!n)return!1;if(wr.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 ku(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 Tu(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?bs({port:{name:`tuple[${i}]`,type:s},value:o,registry:e,typeDefinition:de(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 yu.compile(t.schema)(r)===!0}catch{return!1}}}var xu=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 ks=[N({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})}}}}),N({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))}}}}),N({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=$n(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"}})}}}}}),N({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of wt(e.semantic))t.uri&&t.uri!==e.document.uri||Du(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),N({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!Iu(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=Cu(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"){Ot(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}kn(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})}}}}}),N({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=Ot(i.name,i.value);if(!s)continue;let a=hs(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:Nu(o.element),port:i.declaredPort.port,typeDefinition:a,range:i.attribute.range}),n.set(l,c)}for(let o of n.values()){let i=Bu(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 ${Eu(a.port,a.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),N({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Pu(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"&&Ot(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 Du(e,t){return e.diagnostics.some(n=>n.code===S.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function Iu(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function Cu(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 Bu(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")||Ie(e,i.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(i.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function Eu(e,t){return Xe(e)??t.canonical}function Nu(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Pu(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var wu=new Set(["_failureIf","_successIf","_skipIf","_while"]),Mu=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function ze(e){if(wu.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Mu.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 Vt(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=ft({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 Ts=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),xs=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function lt(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(Ds(r)){n++;continue}if(Mr(r)){let a=n;for(n++;n<e.length&&Lu(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(We(r)){let a=_u(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=Au(e,n);t.push(a),n=a.end;continue}let o=e.slice(n,n+2),i=Ts.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let s=xs.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 Au(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 _u(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&&ju(e[n]);)n++;return o===n||Uu(e,n)?(n=qt(e,n),$t(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&We(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(!We(e[n+1]))return n=qt(e,n+1),$t(e,t,n);for(r="Real",n+=1;n<e.length&&We(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&&We(e[n]);)n++;if(i===n)return n=qt(e,Math.max(n,o+1)),$t(e,t,n);r="Real"}return Fu(e,n)?(n=qt(e,n),$t(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function qt(e,t){let n=t;for(;n<e.length;){let r=e[n];if(Ds(r)||xs.has(r)||Ts.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function $t(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Ds(e){return e===" "||e===" "||e===`
15
- `||e==="\r"}function Mr(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Lu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function We(e){return e!==void 0&&/[0-9]/.test(e)}function ju(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Fu(e,t){let n=e[t];return Mr(n)||We(n)}function Uu(e,t){let n=e[t];return n==="."||Mr(n)||We(n)}var Ou=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Vu=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),Is=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),le={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ke(e){let t=lt(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}:Cs(t,e)}function Cs(e,t=""){let n=new Ar(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=Wu(r);return{ok:!0,program:{kind:"Program",statements:r,range:o},tokens:e}}var Ar=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=Ou.get(r.type);if(o){if(t>=le.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:o,left:n,right:l,range:Xt(n.range,l.range)};break}if(r.type==="Question"){if(t>=le.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(le.ternary);if(!c)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:c,range:Xt(n.range,c.range)};break}let i=Is.get(r.type);if(i){if(t>=le.comparison)break;this.consume();let l=[n],c=[i],d=this.parseExpression(le.comparison);if(!d)return;for(l.push(d);;){let u=Is.get(this.peek().type);if(!u)break;this.consume();let p=this.parseExpression(le.comparison);if(!p)return;c.push(u),l.push(p)}n={kind:"ComparisonChain",operands:l,operators:c,range:Xt(l[0].range,l[l.length-1].range)};continue}let s=Vu.get(r.type),a=s?Xu(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:Xt(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:Ge(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),qu(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:$u(t.type),argument:n,range:Xt(Ge(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(),zu(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:Ge(r)})}};function qu(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:Ge(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Ge(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Ge(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Ge(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function $u(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function Xu(e){switch(e){case"PipePipe":return le.pipePipe;case"AmpAmp":return le.ampAmp;case"Pipe":case"Caret":return le.pipeCaret;case"Ampersand":return le.ampersand;case"Plus":case"Minus":case"DotDot":return le.additive;case"Star":case"Slash":return le.multiplicative;default:return}}function Ge(e){return{start:e.start,end:e.end}}function Xt(e,t){return{start:e.start,end:t.end}}function zu(e,t){return{...e,range:t}}function Wu(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var Gu=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 zt(e={}){let t=rt(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>ht(t,s,a)),r=new Map,o=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:Ku(e.enums,e.augmentations??[])};for(let s of e.symbols??[])Bs(i.symbols,r,s,n);for(let s of e.globalBlackboardSymbols??[])Bs(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 Wt(e){let t=he(e.baseEnvironment),n=[];for(let r of e.entries){let o=he(t),i=r.parseResult??Ke(r.source),s=he(o),a;i.ok&&(a=Ye({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 Es(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=de(e,t);return Ns(t,n)}function Ns(e,t){if(!e||!t)return{kind:"unknown"};if(t.kind==="any")return{kind:"any"};let n=t.canonical.toLowerCase();return n==="bool"?{kind:"bool"}:n==="std::string"||n==="string"?{kind:"string"}:Gu.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function Ps(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 ct(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 He(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function _r(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 Ku(e,t){if(e instanceof Map)return new Map(e);let n=Es(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function Bs(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)||!Ps(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 Je={kind:"number"},xn={kind:"string"},Tn={kind:"bool"},ce={kind:"unknown"},V={kind:"error"};function Ye(e){let t=he(e.environment),n=[],r=[],o=[],i=[],s=[],a=[],l=[],c=[];return e.program.statements.forEach((d,u)=>{c.push(Se({expression:d,statementIndex:u,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"?Je:t.valueKind==="string"?xn:t.valueKind==="boolean"?Tn:ce;case"Identifier":return Yu(e,t.name,t.range);case"UnaryExpression":{let n=Se({...e,expression:t.argument});return t.operator==="!"?He(n)?Tn:(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"?Je:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?V:ce:(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 Ms(n)||Ms(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):Tn;case"+":return n.kind==="string"&&r.kind==="string"?xn:n.kind==="number"&&r.kind==="number"?Je:Lr(n,r)?ce:(jr(e,t.range,t.operator),V);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Je:Lr(n,r)?ce:(jr(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")?xn:Lr(n,r)?ce:(jr(e,t.range,t.operator),V)}return ce}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(!Ju(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 Tn}case"ConditionalExpression":{let n=Se({...e,expression:t.condition});He(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=_r(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 Hu(e)}}function Hu(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 d=Vt(a.name);if(d.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(c),As(e,a.range,d.raw,d.message),V;if(d.kind==="global-blackboard"){let m=t.globalBlackboard.get(d.key),g=i.operator===":="?s:i.operator==="="?m&&ct(m.type,s)?s:m?void 0:s:ws(m?.type??ce,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&&!ct(m.type,s))return Fr(e,a,m.type,s),V;let f=m?{...m}:{name:d.key,type:s,source:{kind:"global-blackboard",key:d.key,range:a.range,originId:e.originId},readable:!0,writable:!0};return f.type=g??s,t.globalBlackboard.set(d.key,f),e.resolvedIdentifiers.push({access:c,resolution:{kind:"global-blackboard",key:d.key,symbol:f}}),e.globalBlackboardAccesses.push({key:d.key,rawName:a.name,kind:l,range:a.range,inferredType:f.type}),f.type}let u=t.symbols.get(a.name);if(i.operator===":="&&!u){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(!u)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:u}}),i.operator==="=")return ct(u.type,s)?(Ur(u,s),s):(Fr(e,a,u.type,s),V);if(i.operator===":=")return ct(u.type,s)?(Ur(u,s),s):(Fr(e,a,u.type,s),V);let p=ws(u.type,s,i.operator);return p?(Ur(u,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 Yu(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let o=Vt(t);if(o.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(r),As(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??ce}),e.resolvedIdentifiers.push({access:r,resolution:{kind:"global-blackboard",key:o.key,...a?{symbol:a}:{}}}),a?.type??ce}let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),Je;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),ce)}function ws(e,t,n){return e.kind==="error"||t.kind==="error"?V:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?ce:n==="+="?e.kind==="number"&&t.kind==="number"?Je:e.kind==="string"&&t.kind==="string"?xn:void 0:e.kind==="number"&&t.kind==="number"?Je:void 0}function Lr(e,t){return Dn(e)||Dn(t)}function Dn(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Ms(e){return!He(e)}function Ju(e,t,n){return Dn(t)||Dn(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 jr(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 Fr(e,t,n,r){re(e,"variable-type-mismatch",t.range,`cannot assign ${Or(r)} to variable \`${t.name}\` of type ${Or(n)}`,`\`${t.name}\` expects ${Or(n)} here`,"assign a compatible value or change the variable's source type")}function As(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 Ur(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 Or(e){return e.kind==="custom"?e.name:e.kind}var _s=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),Zu=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"]),Qu=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],ep=[":=","=","+=","-=","*=","/="],Ls=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function Vr(e){let t=e.source,n=Us(t,e.cursorOffset),r=Cn({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...tp(e,r)),ap(e.attributeInfo,t,n)&&o.push(...op(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...np(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(...rp(r.range,r.prefix)),dp(o)}function Cn(e){let t=e.source,n=Us(t,e.cursorOffset),r=lt(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=lp(t,n),s=In(r,i.start);if(i.start<i.end&&s&&_s.has(s.type))return{kind:s.type==="Identifier"&&Fs(r,s)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let a=In(r,n);return a&&_s.has(a.type)&&a.end<=n?{kind:a.type==="Identifier"&&Fs(r,a)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!a||Zu.has(a.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function tp(e,t){let n=ip(e),r=t.prefix.toLowerCase(),o=[];for(let[i,s]of n.enums)dt(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&&dt(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:js(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}`;dt(s,r)&&o.push({label:s,kind:"identifier",detail:js(i),replaceRange:t.range,sortText:`2-${s}`})}for(let i of["true","false"])dt(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function np(e,t){return Qu.filter(n=>dt(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function rp(e,t){return ep.filter(n=>dt(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function op(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 ip(e){let t=he(e.environment),n=lt(e.source),r=Ke(e.source);if(r.ok){let o=Ye({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=cp(n,o.end);if(i?.type!=="ColonEqual"||i.end>e.cursorOffset)continue;let s=Vt(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 js(e){let t=sp(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 sp(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 ap(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=lt(t).filter(i=>i.type!=="EndOfInput"),o=In(r,n);return!o||o.type==="Semicolon"}function lp(e,t){let n=t;for(;n>0&&Ls.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&Ls.has(e[r]??"");)r+=1;return{start:n,end:r}}function In(e,t){for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r.end<=t)return r}}function Fs(e,t){if(t.type!=="Identifier")return!1;let n=In(e,t.start);return!n||n.type==="Semicolon"}function cp(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function dt(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function Us(e,t){return Math.max(0,Math.min(e.length,t))}function dp(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 Os=new WeakMap;function Bn(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=ze({elementName:t.name,attributeName:o.name,resolvedNodeType:r});return i?[{attribute:o,info:i,parseResult:Ke(o.value)}]:[]})}function me(e,t,n){return Te(e.document,t,n)}function Vs(e){return{start:0,end:e.value.length}}function we(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?Bn(e,t).map(o=>{let i=qs(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?Ye({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):up(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function up(e,t){let n=Os.get(e.view);n||(n=new WeakMap,Os.set(e.view,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(s=>Bn(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),i=Wt({baseEnvironment:qs(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 qs(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=Xe(a),d=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:d})}}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=Xe(a.usage.port),u=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:u})}return o.push(...pp(e,n)),zt({symbols:r,globalBlackboardSymbols:o,augmentations:Pt(e.semantic),areTypesCompatible:(s,a)=>s&&a?Ie(e.semantic,s,a):!0})}function pp(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=Xe(i.usage.port),c=Z(e.semantic,a)?.canonical??a,d=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:d,key:s.reference.key},readable:d==="input"||d==="output"||d==="inout",writable:d==="output"||d==="inout",compatibilityKey:c})}}return n}var $s=N({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:me(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 Xs=N({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:me(e,n.attribute,r.range),details:r.details})}}}}});var zs=N({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:me(e,n.attribute,r.range),details:r.details})}}}});var Ws=N({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||He(o)||e.report({code:S.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:me(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 Gs=N({name:"script/valid-syntax",create(e){return{Element(t){for(let n of Bn(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??me(e,n.attribute,Vs(n.attribute)):me(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Ks=[Gs,$s,Xs,zs,Ws];var mp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Hs(e){return N({name:mp[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:fp(n)})}}}})}function fp(e){return e.code?{code:e.code}:void 0}var Ys=[Hs("unused"),Hs("missing-reason")];function En(e,t){return e.attributes.find(n=>n.name===t)}function Js(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 Zs=[N({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||En(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),N({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))}}}}),N({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})}}}}}),N({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=En(t,"main_tree_to_execute");!n?.value||or(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),N({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Js(e.document.root,t))return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(i=>i.name==="ID")??En(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})}}}}),N({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Js(e.document.root,t))return;let n=En(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})}}}}),N({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var gp=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function yp(e,t){return e===t?String(e):`${e}\u2013${t}`}var Qs=N({name:"model/valid-child-count",create(e){return{Element(t){if(pe(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&bp(e,t,n.model.model.id,n.model.model.kind)}}}});function bp(e,t,n,r){let o=gs(t).length,i=gp.get(n);if(i){if(o<i.min||o>i.max){let s=yp(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 ea=N({name:"model/valid-port-value",create(e){return{Element(t){if(pe(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"&&kn(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 ta=N({name:"model/require-port",create(e){return{Element(t){if(pe(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 na=[N({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(pe(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})}}}}),N({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(pe(t)||t.selfClosing||ys(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 ra=N({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 oa=N({name:"model/no-unknown-port",create(e){return{Element(t){if(pe(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 ia=[ra,oa,ta,ea,...na,Qs];function hp(e,t){return e.attributes.find(n=>n.name===t)}function Sp(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var sa=[N({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||hp(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},N({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)||Sp(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var qr=[...sa,...Ks,...Zs,...ks,...ia,...ms,...Ys],uv=new Map(qr.map(e=>[e.name,e]));function aa(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function la(e,t){return ke(e.linter.rules[t])?.options??{}}function ca(e){let t=ke(e.config.linter.rules[e.rule]);return aa(t?t.severity:e.defaultSeverity)}function da(e){let t=[],n=e.facts??cs(),r=e.rules?new Set(e.rules):void 0,o=[];for(let s of qr){if(r&&!r.has(s.name))continue;let a=ca({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=la(e.config,s.name),c=s.optionsSchema?.safeParse(l),d=c?.success?c.data:l,u=ps({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:d,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});o.push(s.create(u))}for(let s of o)s.Document?.();e.document.root&&ua(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)=>vp(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function ua(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&ua(n,t)}function vp(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 Gt(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:ie(n.config)});return r.push(...da({document:e,view:o,semantic:t,config:n.config})),r}var Rp={"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 pa(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function kp(e,t){let n=ke(e.linter.rules[t]);return pa(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 ma(e){let t=[];for(let n of e.issues){let r=Rp[n.kind],o=kp(e.config,r);if(!o)continue;let i=P(ue[r].code,o,n.message,n.range,n.uri,void 0,Tp(n));t.push({...i,rule:r})}return t}function fa(e,t){return Ee(e,t).replace(/\\/g,"/")}function xp(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function Dp(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let r=fa(e,n);if(xp(r))return r}return fa(e,t.uri)}function ga(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 d=Dp(a.rootUri,c);if(l==="entrypoints"&&n.index.includeGraph&&c.kind==="bt-document"&&!n.index.reachableDocuments.has(c.uri))return{path:d,uri:c.uri,kind:c.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:c.originalText};let u=l==="single-file"?Ue([c,...r],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,p=l==="single-file"?(()=>{let g=ee(s,d);return G(c,{semantic:u,config:g,policy:ie(g)})})():n.index.documentViews.get(c.uri),m=[];if(i){let g=ee(s,d);m=Gt(c,u,{config:g,documentView:p});let f=n.index.facts.includeIssuesByUri.get(c.uri)??[];m.push(...ma({issues:f,config:g}))}return e.input.mode==="check"&&c.kind==="generic-xml"?{path:d,uri:c.uri,kind:c.kind,documentView:p,diagnostics:[],rawDiagnostics:m,skipped:!0,skipReason:"generic-xml",originalText:c.originalText}:{path:d,uri:c.uri,kind:c.kind,documentView:p,diagnostics:m,rawDiagnostics:void 0,skipped:!1,originalText:c.originalText}})}function ya(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...ya(n.children));return t}function Ip(e,t,n){let r=[],o=[];for(let i of e){let s=ya(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],d=l.match(/reason:\s*(.+)$/)?.[1];t&&!d&&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:d}):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:d}):l.startsWith("btxml-disable")&&n&&r.push({uri:i.uri,code:c,line:a.range.end.line+1,range:a.range,used:!1,reason:d})}}return{suppressions:r,issues:o}}function ba(e,t){let n=Ip(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 $r(e,t,n,r=e.resolvedConfig){let o=Fe(r.linter.rules,"suppression/require-reason")!=="off";return ba(t,{documents:n??e.fileDocuments,requireReason:o,allowInline:r.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function ha(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===ha(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 va={error:0,warning:1,info:2};function Ra(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function Nn(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=va[t.severity]-va[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function ka(e,t,n){let r=t.filter(i=>!i.skipped),o=Nn([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 Cp(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 Ta(e,t){let n=Nn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(r=>r.diagnostics)??[]]);return{ok:!Ra(n,e.input.maxWarnings),files:e.files?Cp(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var Bp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},Ep={unused:S.UnusedSuppression,"missing-reason":S.MissingSuppressionReason};function Np(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Pp(e,t){return Np(Fe(e.linter.rules,t))}function Xr(e){let t=[];for(let n of e.issues){let r=Bp[n.kind],o=Pp(e.config,r);if(!o)continue;let i=P(Ep[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 wp(e){let t=await ls(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=ga(t);let r=$r(t,n);n=[...r.diagnostics,...Xr({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],d=t.fileDocuments[l];if(c.skipped)continue;let u=ee(t.resolvedConfig,c.path),p=$r(t,c.diagnostics,[d],u);c.diagnostics=[...p.diagnostics,...Xr({issues:p.issues,config:u})],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=as(t.files),t.finalProjectDiagnostics=n;let a=ka(t,t.files,n);return a.suppressed=o,a.baselineFiltered=i,a.staleEntries=s,{...Ta(t,a),files:t.files??[]}}async function zr(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 qe(e.project,n);r??=a.documents,o??=a.externalModelDocuments,i??=a.augmentations,s=[...s,...a.diagnostics]}return wp({...e,host:n,documents:r,externalModelDocuments:o,augmentations:i,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}async function Ia(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 Mp(e,t){return Ia(e,["btxml.config.json"],t)}async function xa(e,t){return JSON.parse(await t.readFile(e))}function Da(e,t){return e.map(n=>P(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function Ca(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await Mp(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[P("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 xa(t,e.host)}catch(i){let s=String(i.message||i);return{ok:!1,configUri:t,diagnostics:[P("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 Ia(e.startUri,["package.json"],e.host);if(i)try{let s=await xa(i,e.host);s.btxml&&(n=s.btxml,t=i)}catch{n={}}}let r=kt(n);if(!r.ok)return{ok:!1,configUri:t,diagnostics:Da(r.diagnostics,t)};let o=nr(r.value);return o.length>0?{ok:!1,configUri:t,diagnostics:Da(o,t)}:{ok:!0,config:r.value,configUri:t,diagnostics:[]}}async function Ba(e,t,n,r){let o=await Ft(t.files,e,[],n.followSymlinks,void 0,void 0,r),i=await Ft(t.definitions,e,[],n.followSymlinks,void 0,void 0,r),s=await Ft(t.augmentations,e,[],n.followSymlinks,void 0,void 0,r),a=o.files.map(d=>({path:$(e,d),uri:d,kind:"model-xml"})),l=i.files.map(d=>({path:$(e,d),uri:d,kind:"node-definition"})),c=s.files.map(d=>({path:$(e,d),uri:d,kind:"model-augmentation"}));return{modelFiles:a,augmentationFiles:c,definitionFiles:l,unmatchedPatterns:{models:o.unmatchedPatterns,augmentations:s.unmatchedPatterns,definitions:i.unmatchedPatterns}}}async function Ap(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 Wr(e){let t=await Ca({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=Tt(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let r=n.config,o=await Ap({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:i,skippedFiles:s}=await Gi(o,r.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?$(o,t.configUri):"",c=Ki(r.resolver);for(let f of c){let T=Q.join(o,f.file);await e.host.exists(T)&&!i.some(B=>B.uri===T)&&i.push({path:f.file,uri:T,kind:"bt-xml"})}let{modelFiles:d,augmentationFiles:u,definitionFiles:p,unmatchedPatterns:m}=await Ba(o,r.models,r.files,e.host);for(let f of m.models)a.push(P(S.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${f}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let f of m.definitions)a.push(P(S.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${f}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let f of m.augmentations)a.push(P(S.AugmentationFileNotFound,h.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 Hi(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:d,augmentationFiles:u,definitionFiles:p,skippedFiles:s,modelsBuiltins:g}}}function Ea(e){return[...e.files.values()]}function Na(e){return[...e.reachableDocuments.values()]}function Pa(e){return e.workspace}function wa(e){return[...e.nodeDefinitionModels]}function Ma(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 Gr(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 qe(e.project,r);a.push(...c.diagnostics),o??=c.documents,i??=c.externalModelDocuments,s??=c.augmentations}let l=await Nr({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:Pa(l.index),documents:Ea(l.index),reachableDocuments:Na(l.index),nodeDefinitionModels:wa(l.index),includeGraph:Ma(l.index)}}import Aa from"path";import{fileURLToPath as Op,pathToFileURL as _a}from"url";function Vp(e){return e.startsWith("file://")?e:_a(Aa.resolve(e)).href}function Kr(e){return Op(Vp(e))}function ut(e){return _a(Aa.resolve(e)).href}function Hr(e){return Kr(Rr(e))}function La(e){return e?.documents??[]}function qp(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 $p(e){let t=et();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 fe(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,...La(r).filter(d=>!qp(e.document,d))]:La(r),i=$p(e.config||t.config),s=ie(i),a=r?.nodeDefinitionModels??[],l=Ue(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?Gt(n.document,l,{config:i,documentView:c}):n.diagnostics,partial:n.partial===!0,semantic:l,config:i,nodeUsagePolicy:s,workspace:r}}function ja(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:I(r,r),newText:n}}function Fa(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 Ua(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 Pn(e){return I(e.positionAt(0),e.positionAt(e.text.length))}function Yr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=Lt(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:Pn(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&&at(e.parsed.root,a)||("element"in s?s.element:void 0);if(!l)continue;let c=U(e.semantic,{element:l,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}),d=c.ports.find(u=>u.required&&!c.portUsages.some(p=>p.status==="resolved"&&p.name===u.name));d&&r.push({title:`Add missing port ${d.name}`,kind:"quickfix",diagnostics:[i],edits:[Ua(t.document,l,d.name)]})}if(i.code==="BT102_UNKNOWN_PORT"&&"attribute"in s&&"element"in s&&s.attribute){let l=(s.element?U(e.semantic,{element:s.element,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}):void 0)?.portUsages.find(d=>d.status==="undeclared"&&d.attribute===s.attribute),c=l?Fa(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:I(a,a),newText:' BTCPP_format="4"'}]})}r.push({title:`Suppress ${i.code} for next line`,kind:"quickfix",diagnostics:[i],edits:[ja(t.document,i.range.start.line,`<!-- btxml-disable-next-line ${i.code} reason: TODO -->
16
- `)]})}return{actions:r}}function O(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 Jr(e){return je(e)}function Ze(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function Oa(e,t){return!e||!t?!1:Ze(e)===Ze(t)}function Va(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=Ze(a.type),c=Ze(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 Xp(e,t,n){return I(e.positionAt(t),e.positionAt(n))}function zp(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,d=s[1]==="@"?c+1:c,u=l?i-1:i;return{replacementRange:Xp(e,d,Math.max(d,u)),wrapsReference:!1,hasScopeMarker:s[1]==="@"}}return{insertText:t.value,replacementRange:r,wrapsReference:!0,hasScopeMarker:!1}}function Zr(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,s=zp(t,n,r),a=s?.wrapsReference??!1,l=s?.hasScopeMarker??!1;if(l&&o.scope!=="global")return;let c=o.key;a?c=Jr(o):o.scope==="global"&&(c=`@${o.key}`);let d=o.key;a?d=Jr(o):o.scope==="global"&&(d=l?o.key:`@${o.key}`);let u=o.scope==="global"?` @${o.key}`:"",p=`${o.key} ${c}${u}`.trim();return O(c,"Reference",i,s?{range:s.replacementRange,newText:d}:void 0,{filterText:p,insertText:d})}var qa=new WeakMap;function pt(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=no(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,s=oo(r.attribute,i),a=Cn({source:r.source,cursorOffset:s});if(a.kind!=="identifier"||s<a.range.start||s>a.range.end)return;let l=Ga(e,r),c=l.analysis?.resolvedIdentifiers.find(u=>u.access.range.start===a.range.start&&u.access.range.end===a.range.end&&u.resolution.kind!=="unknown");if(!c||c.resolution.kind==="unknown")return;let d=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:Qr(e,r,a.range),reference:d,flowState:l,occurrence:{uri:e.document.uri,attributeContext:r,identifier:c.access,reference:d,documentRange:Qr(e,r,c.access.range)}}}function $a(e,t){let n=(t.reference.kind==="global-blackboard"?Ya(e):Mn(e,t.attributeContext.behaviorTree).flatMap(r=>Ka(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:Kp(t.reference.symbol,r.reference));return t.reference.kind==="global-blackboard"?Hp([...n,...Ha(e,t.reference.key)]):n}function Xa(e,t){return Ja(Ha(e,t).map(n=>({uri:n.uri,range:n.documentRange})))}function za(e,t){return Ja(Ya(e).filter(n=>n.reference.kind==="global-blackboard"&&n.reference.key===t).map(n=>({uri:n.uri,range:n.documentRange})))}function eo(e,t){return Mn(e,t)}function Wa(e,t,n){let r=no(e,t,n);if(r)return Ga(e,r).environmentBefore}function to(e){let t=wn(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 wn(e){return e.kind==="custom"?e.name:e.kind}function Ga(e,t){let r=Mn(e,t.behaviorTree).find(o=>o.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function Mn(e,t){let n=qa.get(e);n||(n=new WeakMap,qa.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=no(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=Wt({baseEnvironment:Wp(e,t.nodes),entries:i}).flatMap((a,l)=>{let c=o[l];return c?[{...a,context:c}]:[]});return n.set(t,s),s}function no(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(!ze({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 Wp(e,t){let n=te(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let a=se(e.semantic,i);if(a?.kind==="SubTree")for(let l of a.ports){let c=l.effectiveType??l.type,u=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:u})}}for(let a of t)for(let l of a.portBindings){if(l.declaredPort.status!=="resolved")continue;let c=Qa(l);if(!c||c.scope==="global")continue;let d=l.declaredPort.port.type,p=Z(e.semantic,d)?.canonical??d,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,d),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=ro(e).flatMap(({trees:a})=>a.flatMap(l=>l.nodes));return o.push(...Gp(e,n,s)),zt({symbols:r,globalBlackboardSymbols:o,augmentations:Pt(e.semantic),areTypesCompatible:(a,l)=>a&&l?Ie(e.semantic,a,l):!0})}function Gp(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=Qa(s);if(!a||a.scope!=="global")continue;let l=s.declaredPort.port.type,d=Z(e.semantic,l)?.canonical??l,u=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:u,key:a.key},readable:u==="input"||u==="output"||u==="inout",writable:u==="output"||u==="inout",compatibilityKey:d})}}return r}function Ka(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:Qr(e,t.context,n.access.range)}]}):[]}function Kp(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 Hp(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 Ha(e,t){return ro(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 Ya(e){return ro(e).flatMap(({uri:t,trees:n})=>n.flatMap(r=>{let o=Jp(e,t);return Mn(o,r).flatMap(i=>Yp(o,t,i))}))}function Yp(e,t,n){return Ka(e,n).map(r=>({...r,uri:t}))}function ro(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 Jp(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=nt(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 Ja(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 Qr(e,t,n){return Te(e.parsed??{originalText:e.document.text},t.attribute,n)}function oo(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 Za(e,t,n){let r=e.parsed??{originalText:e.document.text};return Te(r,t,n)}function Qa(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 Zp(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 ze({elementName:t.name,attributeName:n.name,resolvedNodeType:o})}function el(e,t,n,r){let o=Zp(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,s=Wa(e,n,r),a=Math.max(0,t.position.offset-i.start.offset);return Vr({source:r.value,cursorOffset:oo(r,a),environment:s,attributeName:r.name,attributeInfo:o}).map(c=>Qp(e,r,c))}function Qp(e,t,n){return O(n.label,em(n.kind),n.detail,{range:Za(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function em(e){switch(e){case"identifier":return"Variable";case"enum":return"Enum";case"value":return"Value";case"operator":return"Keyword";case"snippet":return"Snippet"}}var An={enumLiteral:"0",boolLiteral:"1",matchingKey:"2",unknownKey:"3"};function tl(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function nl(e,t){if(!e)return;let n=tl(e)?e.valueContentRange:e.valueRange;if(n)return K(n,tl(e)?t:`"${t}"`)}function rl(e,t,n,r){let o=[],i=[];for(let s of Ce(e)){let a=Y(e,s),l=O(s,"Value","BehaviorTree ID",r?nl(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 tm(e){return O("SubTree","Class","Built-in subtree tag",K(e,"SubTree"),{sortText:"0-SubTree"})}function nm(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())?[O(`${t}>`,"Value","Close current parent tag",K(e.replacementRange,`${t}>`))]:[]}function rm(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(o=>O(o,"Class",void 0,K(t,o))),...["Action","Condition","Control","Decorator"].map(o=>O(o,"Class",void 0,K(t,o))),tm(t)],r=new Set;for(let o of an(e))o.id!=="SubTree"&&(r.has(o.id)||(r.add(o.id),n.push(O(o.id,"Class",void 0,K(t,o.id)))));return Me(n)}function _n(e,t,n){return U(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function io(e,t){let n=new Set(e.element.attributes.map(r=>r.name));return e.ports.filter(r=>!n.has(r.name)).map(r=>O(r.name,"Property",`${r.direction}${r.type?` ${r.type}`:""}`,K(t,r.name)))}function om(e,t,n){let r=[O("ID","Property",void 0,K(n,"ID"))];return r.push(...io(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function im(e,t,n,r){if(!e)return[];if(Oe(e.name)){let i=[];e.attributes.some(a=>a.name==="ID")||i.push(O("ID","Property",void 0,K(r,"ID")));let s=_n(n,t,e);return i.push(...io(s,r)),i}return e.name==="SubTree"?om(e,_n(n,t,e),r):e.name==="include"?[O("path","Property",void 0,K(r,"path"))]:io(_n(n,t,e),r)}function sm(e,t,n,r){return rl(t.semantic,e.document.uri,n,r)}function am(e,t,n,r){let o=[],i=new Set;for(let s of an(e))s.kind===t&&(i.has(s.id)||(i.add(s.id),o.push(O(s.id,"Value",`${t} node ID`,r?nl(r,s.id):K(n,s.id)))));return o}function lm(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 am(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return sm(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return rl(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=>O(E,"File","XML file",K(r.valueContentRange||r.valueRange,E)));let s=el(n,e,o,r);if(s)return s;let a=_n(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,d=r.valueContentRange||r.valueRange,u=[];c.enum?.length&&u.push(...c.enum.map(R=>O(R,"Enum",c.type,K(d,R),{sortText:`${An.enumLiteral}-${R}`}))),(c.type||"").toLowerCase()==="bool"&&u.push(...["true","false"].map(R=>O(R,"Value","bool",K(d,R),{sortText:`${An.boolLiteral}-${R}`})));let p=Va(n),m=Ze(c.type),g=p.filter(R=>!R.conflict&&Oa(c.type,R.type)),f=p.filter(R=>!R.conflict&&!Ze(R.type)&&m),T=g.flatMap(R=>{let E=Zr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:R,detail:R.scope==="global"?`${R.type||"unknown"} global blackboard key from ${R.nodeType}.${R.portName}`:`${R.type||"unknown"} blackboard key from ${R.nodeType}.${R.portName}`});return E?[{...E,sortText:`${An.matchingKey}-${R.scope==="global"?R.identity:R.key}`}]:[]}),B=f.flatMap(R=>{let E=Zr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:R,detail:R.scope==="global"?`unknown-type global blackboard key from ${R.nodeType}.${R.portName}`:`unknown-type blackboard key from ${R.nodeType}.${R.portName}`});return E?[{...E,sortText:`${An.unknownKey}-${R.scope==="global"?R.identity:R.key}`}]:[]});return u.push(...T,...B),u.length>0?Me(u):(t.valuePrefix||"").includes("{")?Me(u):u}function so(e,t){let n=ne({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:Qn.map(r=>O(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:Me(lm(t,n,e))}:n.kind==="attribute-name"?{items:Me(im(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:Me(rm(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:Me(nm(n))}:{items:[]}}function Ln(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 cm(e,t,n){return Ve(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 ao(e,t,n){return e?Ln(e.nodes.flatMap(r=>r.portBindings.flatMap(o=>o.blackboardReferences.filter(i=>i.identity===t).map(i=>({uri:n,range:i.range}))))):[]}function lo(e,t,n,r,o,i,s){let a=ao(e,i,s),l=(t??[]).flatMap(c=>{if(c.uri===s)return[];let d=G(c,{semantic:n,config:r,policy:o});return ao(d,i,c.uri)});return Ln([...a,...l])}function co(e,t,n){return ao(e,t,n)}function jn(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,d=l?U(r,{element:l,documentRoot:e.root,uri:e.uri,config:o,policy:i}):void 0;if(l?.name==="SubTree"&&c?.name==="ID"){if(d?.tagForm==="model-definition")return Y(r,c.value).map(m=>m.idRange?{uri:m.uri,range:m.idRange}:void 0).filter(m=>!!m);let u=cm(r,c.value,e.uri),p=d?.subtree?.target;if(p?.status==="resolved"&&p.kind==="behavior-tree"){let m=p.behaviorTree;return m.idRange?Ln([{uri:m.uri,range:m.idRange},...u]):u}if(p?.status==="ambiguous")return Ln([...p.behaviorTrees.map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:void 0),...u].filter(m=>!!m));if(p?.status==="resolved"&&p.kind==="node-model"){if(u.length>0)return u;if(p.model.idRange)return[{uri:p.model.uri||e.uri,range:p.model.idRange}]}return u}if(l?.name==="root"&&c?.name==="main_tree_to_execute")return Y(r,c.value).map(u=>u.idRange?{uri:u.uri,range:u.idRange}:void 0).filter(u=>!!u);if(l?.name==="include"&&c?.name==="path"&&s){let u=s.find(p=>p.uri===c.value||p.path===c.value||(p.path?p.path.endsWith(`/${c.value}`):!1));if(u?.root?.range)return[{uri:u.uri,range:u.root.range}]}if(c&&l){let u=t?it(t,n):void 0,p=u?.blackboardReferences.find(m=>n.offset>=m.range.start.offset&&n.offset<=m.range.end.offset);if(p)return p.scope==="global"?lo(t,s,r,o,i,p.identity,e.uri):co(t,p.identity,e.uri);if(u?.declaredPort.status==="resolved"){let m=u.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(a.kind==="tag-name"&&l&&d?.model.status==="resolved"){let u=d.model.model;if(u.idRange)return[{uri:u.uri||e.uri,range:u.idRange}];if(u.range)return[{uri:u.uri||e.uri,range:u.range}]}if(c?.name==="ID"&&d?.tagForm==="generic-node"&&d.model.status==="resolved"){let u=d.model.model;if(u.idRange)return[{uri:u.uri||e.uri,range:u.idRange}];if(u.range)return[{uri:u.uri||e.uri,range:u.range}]}return[]}function uo(e,t){let n=pt(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let o=r.source,s=eo(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?se(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=Xa(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=eo(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:jn(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function po(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function ol(e,t){let n=Lt(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:Pn(e.document),newText:n.text}],diagnostics:[]}}function mo(e,t){return ol(t,e.config.formatter)}function il(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
13
+ `);let d=a.join(c),u=c.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${u})+$`,"u"),g=`${d.replace(p,"")}${c}`;return{ok:!0,text:g,changed:g!==e,skipped:!1,diagnostics:n.diagnostics.filter(f=>f.severity!==h.Error)}}function lt(e,t){if(!(!H(e.range,t)&&!H(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=lt(n,t);if(r)return r}return e}}var Xi=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,Fd=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function jd(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 d=e.slice(o+2).match(Xi)?.[0];if(d){for(let p=n.length-1;p>=0;p-=1)if(n[p]===d){n.length=p;break}}let u=e.indexOf(">",o+2);if(u<0||u>=t)break;r=u+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 gn(e,t){let n=e.positionAt(t);return I(n,n)}function ae(e,t,n){return I(e.positionAt(t),e.positionAt(n))}function yn(e){return{name:e.name,value:e.value,range:ae(e.document,e.nameStart,e.valueEnd),fullRange:ae(e.document,e.nameStart,e.valueEnd),nameRange:ae(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?ae(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:ae(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?ae(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function Ud(e,t,n){let r=[];for(let o of t.matchAll(Fd)){let i=o.index??0,s=o[1],a=o[2],l=o[3],c=o[4],d=o[0].indexOf(s),u=o[0].indexOf("=",d+s.length),p=o[0].indexOf(a,u+1),m=n+i+p,g=m+a.length;r.push(yn({document:e,name:s,value:l??c??"",nameStart:n+i+d,nameEnd:n+i+d+s.length,equalsStart:n+i+u,equalsEnd:n+i+u+1,valueStart:m,valueEnd:g,valueContentStart:m+1,valueContentEnd:g-1}))}return r}function Od(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:ae(e,s+2,t)}}function $i(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,d=l.slice(c).match(Xi);if(!d)return{kind:"tag-name"};let u=d[0],p=c,m=p+u.length,g=ae(e,a+p,a+m),f={kind:"element",name:u,attributes:Ud(e,l,a),children:[],range:ae(e,s,t),fullRange:ae(e,s,t),openTagRange:ae(e,s,t),startTagRange:ae(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 T=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(T){let E=T[0].indexOf(T[1]),y=(T.index??0)+E,b=y+T[1].length,k=l.indexOf("=",b),x=T[2],A=T[4]??"";if(x){let j=l.indexOf(x,k+1),ve=a+j+1,v=yn({document:e,name:T[1],value:T[3]??"",nameStart:a+y,nameEnd:a+b,equalsStart:a+k,equalsEnd:a+k+1,valueStart:a+j,valueEnd:t,valueContentStart:ve,valueContentEnd:t});return{kind:"attribute-value",element:f,attribute:v,valuePrefix:e.text.slice(ve,t)}}let F=A.length>0?t-a-A.length:t-a;return{kind:"attribute-value",element:f,attribute:yn({document:e,name:T[1],value:A,nameStart:a+y,nameEnd:a+b,equalsStart:a+k,equalsEnd:a+k+1,valueStart:a+F,valueEnd:t,valueContentStart:a+F,valueContentEnd:t}),valuePrefix:e.text.slice(a+F,t)}}let B=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)?$/s);if(B){let R=B[1]??"",E=t-a-R.length;return{kind:"attribute-name",element:f,attribute:yn({document:e,name:R,value:"",nameStart:a+E,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:f,attribute:{name:"",value:"",range:gn(e,t),fullRange:gn(e,t),nameRange:gn(e,t),valueRange:gn(e,t)}}}function re(e){let{document:t,parsed:n,position:r}=e,o=r.offset,i=t.text.length>0?{kind:"text"}:{kind:"unknown"},s=Od(t,o);if(s)return{kind:"closing-tag-name",tagNamePrefix:s.tagNamePrefix,replacementRange:s.replacementRange,tagText:jd(t.text,o)};if(n?.root){let c=lt(n.root,o);if(c){for(let d of c.attributes){if(H(d.nameRange,o))return{kind:"attribute-name",element:c,attribute:d};if(H(d.valueRange,o)||H(d.valueContentRange,o))return{kind:"attribute-value",element:c,attribute:d,valuePrefix:d.valueContentRange&&o>=d.valueContentRange.start.offset?t.text.slice(d.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 d=$i(t,o);if(d)return d.kind==="tag-name"?{...d,element:d.element??c}:d}i={kind:"element",element:c}}}let a=$i(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 bn(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 xe(e,t,n){let r=t.valueContentRange??t.valueRange,o=bn(t,n.start),i=bn(t,n.end),s=q(e.originalText,r.start.offset+o),a=q(e.originalText,r.start.offset+i);return I(s,a)}function Tr(e){return e.rootUri}function xr(e){return e.resolvedConfig}var zi={InvalidJson:S.InvalidAugmentationJson,InvalidSchema:S.InvalidAugmentationSchema};function Vd(e){return P(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function qd(e,t){return t.issues.map(n=>Vd({filePath:e,code:n.kind==="json"?zi.InvalidJson:zi.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 hn(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(P(S.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${i.path}\``,void 0,i.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(i.uri),a=Jn(s,{uri:i.uri,path:i.path});if(!a.ok){r.push(...qd(i.path,a));continue}o.push(a.data)}return{ok:r.every(i=>i.severity!==h.Error),augmentations:o,diagnostics:r}}function $d(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 Xd(e,t){return ye(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function Dr(e,t){if(!await t.exists(e.uri))return{diagnostics:[P(S.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 Xd(e,t);if(!n.document||n.diagnostics.some(o=>o.severity===h.Error)){let o=n.diagnostics[0];return{diagnostics:[P(S.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=$d(n.document);return r?{document:r,diagnostics:[]}:{diagnostics:[P(S.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 c of n.selectedFiles){if(!await r.exists(c.uri))continue;let d=await r.readFile(c.uri),u=ye(d,{uri:c.uri,path:c.path});u.document&&o.push(u.document)}let i=await Promise.all(n.modelFiles.map(c=>Dr(c,r))),s=await hn({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 zd(e){return e.endsWith("/")?e:`${e}/`}function Wd(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 Xe(e,t={}){let n=e.replace(/\\/g,"/"),r=s=>Wd(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 Sn(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 Gd(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function jt(e){return Sn(Xe(e))}function Kd(e,...t){let n=Xe(e),r=[...n.segments];for(let o of t){let i=Xe(o,{preserveDotSegments:!0});if(i.scheme||i.absolute&&i.authority)return jt(o);i.absolute&&(r.length=0),r.push(...i.segments)}return Sn({...n,segments:Ir(r)})}function Hd(e){let t=Xe(e);return t.segments.length===0?Sn(t):Sn({...t,segments:t.segments.slice(0,-1)})}function Yd(e){return Xe(e).segments.at(-1)??""}function Jd(e,t){let n=Xe(e),r=Xe(t);if(!Gd(n,r))return jt(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 Zd(e,t){let n=zd(jt(e)),r=jt(t);return r===n.slice(0,-1)||r.startsWith(n)}var ee={normalize:jt,join:Kd,dirname:Hd,basename:Yd,relative:Jd,isWithin:Zd};function be(e,...t){return ee.join(e,...t)}function Wi(e){return ee.dirname(e)}function Gi(e){return ee.basename(e)}function Ne(e,t){return ee.relative(e,t)}function Ki(e,t){return ee.isWithin(e,t)}import Qd from"ignore";function Cr(e){return e.replace(/\\/g,"/")}function $(e,t){return Cr(Ne(e,t))}function eu(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||Gi(n)===r:eu(r).test(n)}function tu(e){return e.includes("*")||e.includes("?")}async function Hi(e,t,n,r,o,i,s,a){let l=$(n,t);if(l&&r.some(d=>Pe(l,d)||Pe(`${l}/`,d)||Pe(`${l}/dummy`,d))||a&&l&&a.ignores(l))return;let c;try{c=await e.readDir(t)}catch{return}for(let d of c){let u=be(t,d.name),p=d.type==="directory",m=d.type==="file";if(d.type==="other"&&i&&e.realpath)try{let g=await e.realpath(u);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 Hi(e,u,n,r,o,i,s,a):m&&o.push(u)}}async function Ut(e,t,n,r,o,i,s){let a=new Set,l=new Set,c=[],d=o??t;for(let p of e){let m=be(d,p);if((await s.stat(m))?.type==="file"){let g=$(t,m),f=!g.startsWith("..");!n.some(T=>Pe(g,T))&&(!f||!i?.ignores(g))&&a.add(m);continue}if(!tu(p)){l.add(p);continue}c.push(p)}let u=[];if(c.length>0&&await s.exists(t)){let p=new Set([s.realpath?await s.realpath(t):t]);await Hi(s,t,t,n,u,r,p,i)}for(let p of u){let m=$(d,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)u.some(g=>{let f=$(d,g);return Pe(f,p)&&!n.some(T=>Pe($(t,g),T))&&!i?.ignores($(t,g))})||l.add(p);return{files:[...a].sort((p,m)=>$(t,p).localeCompare($(t,m))),unmatchedPatterns:[...l].sort()}}async function nu(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 ru(e){return Qd().add(e)}async function Yi(e,t,n,r,o){let i=[...t.ignore],s=t.useGitignore?await nu(e,o):[],a=ru(s),l=n?.length?n:t.include,c=await Ut(l,e,i,t.followSymlinks,n?.length?r:void 0,a,o),d=t.maxSize,u=[],p=[];for(let m of c.files){let g=$(e,m),f=await o.stat(m);if(f){if((f.size??0)>d){p.push({path:g,reason:"too-large"});continue}u.push({path:g,uri:m,kind:"unknown"})}}return{selectedFiles:u,skippedFiles:p,unmatchedPatterns:c.unmatchedPatterns}}function Ji(e){return e.entrypoints.map(t=>({file:Cr(t)}))}function Br(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function Zi(e,t,n,r){let o=[];for(let i of t)await r.exists(be(e,i.file))||o.push(P(S.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 Qi(e,t){return e.attributes.find(n=>n.name===t)}function es(e,t){return Ne(e,t).replace(/\\/g,"/")}function ou(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 iu(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:Qi(i,s.pathAttribute),rosPackageAttr:Qi(i,"ros_pkg"),base:s.base??"current-file"})}return o}async function ts(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=>[es(t.rootUri,f.path||f.uri),f])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},c=new Map,d=new Set,u=t.entrypoints.length?t.entrypoints.map(f=>f.file):t.selectedFiles.map(f=>f.path);l.entrypointFiles=[...new Set(u)];let p=new Set,m=new Set,g=async(f,T,B)=>{if(T.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 R=f.replaceAll("\\","/");if(p.has(R)){let x=[...T.slice(T.indexOf(R)),R];l.cycles.push({files:x}),s.push({kind:"cycle",uri:B?.uri??R,path:R,cycle:x,range:B?.range,message:"include cycle detected"});return}if(m.has(R))return;p.add(R),l.reachableFiles.add(R);let E=be(t.rootUri,R);d.add(E);let y=await n.exists(E),b=a.get(R);!b&&y&&(b=ye(await n.readFile(E),{uri:E,path:R}).document,b&&a.set(R,b)),l.nodes.set(R,{path:R,document:b,exists:y}),b&&c.set(b.uri,b);let k=b?.uri??E;if(!y){s.push({kind:"not-found",uri:B?.uri??k,path:R,range:B?.range,message:`include file not found \`${R}\``}),p.delete(R);return}if(!b){p.delete(R);return}for(let x of iu(b,e)){if(!x.pathAttr){s.push({kind:"missing-path",uri:k,range:x.element.range,message:"missing include path"});continue}let A=ou(x.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,x.pathAttr.range,k),F;if(x.rosPackageAttr){let M=x.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:k,packageName:M,range:x.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:k,packageName:M,path:A,range:x.rosPackageAttr.range,message:`ROS package \`${M}\` could not be resolved for include path \`${A}\``});continue}F=be(_,A)}else{let M=x.base==="project-root"?t.rootUri:Wi(E);F=be(M,A)}let j=es(t.rootUri,F),ve=F;try{await n.exists(F)&&(ve=n.realpath?await n.realpath(F):F)}catch{}if(!Ki(t.rootUri,ve)){if(!r){s.push({kind:"outside-root",uri:k,path:j,range:x.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:k,path:j,range:x.pathAttr.range,message:`external include used \`${A}\``})}l.edges.push({from:R,to:j,includeElementRange:x.element.range,includePathRange:x.pathAttr.range}),await g(j,[...T,R],{uri:k,range:x.pathAttr.range})}p.delete(R),m.add(R)};for(let f of l.entrypointFiles)await g(f,[]);return{graph:l,reachableUris:d,reachableDocuments:c,issues:s}}var ns="model/no-conflicting-kind-for-id",os="model/no-unused-definition",rs="model/no-duplicate-definition",is="model/require-local-definition",su=new Set(["Action","Condition","Decorator","Control"]);function kn(e){return{...P(e.code,e.severity,e.message,e.range,e.uri,void 0,e.data),rule:e.rule,...e.relatedInformation?{relatedInformation:e.relatedInformation}:{}}}function vn(e,t){let n=Ue(e.linter.rules,t);if(n!=="off")return n==="info"?h.Info:n==="warn"?h.Warning:h.Error}function Ot(e){return e.model.idRange??e.range}function Rn(e){return e.range}function au(e){return{uri:e.uri,sourceKind:e.sourceKind,modelKind:e.kind,range:e.range}}function Er(e){return su.has(e)}function lu(e,t){let n=Q(e,t);if(!(!n||!Er(n.kind)||qe(e).some(o=>o.id===t&&(o.code==="BT012_CONFLICTING_NODE_MODEL"||o.code==="BT107_CONFLICTING_PORT_DEFAULT"))))return{id:n.id,kind:n.kind,ports:n.ports.map(o=>({direction:o.direction,name:o.name,type:o.type,defaultValue:o.defaultValue,description:o.description,enum:o.enum}))}}function cu(e){let t=vn(e.config,ns);if(!t)return[];let n=[],r=Sr(e.facts.filter(o=>!o.isBuiltin));for(let[o,i]of r){if(new Set(i.map(l=>l.kind)).size<=1)continue;let a=i[0];if(a)for(let l of i.slice(1)){if(l.kind===a.kind)continue;let c=Ot(a),d=a.uri&&c?[{uri:a.uri,range:c,message:"first conflicting definition"}]:void 0;n.push(kn({code:"BT120_CONFLICTING_MODEL_KIND",message:`model ID \`${o}\` has conflicting kinds (\`${a.kind}\` vs \`${l.kind}\`)`,uri:l.uri,range:Ot(l),rule:ns,severity:t,data:{kind:"conflicting-model-kind",nodeId:o,definitions:i.map(au)},relatedInformation:d}))}}return n}function du(e){if(e.config.models.convention!=="used-only")return[];let t=vn(e.config,os),n=vn(e.config,is);if(!t&&!n)return[];let r=[],o=cr(e.index),i=uu(e.facts),s=pu(e.facts),a=new Set([...o.keys(),...s.keys(),...i.keys()]);for(let l of a){let c=o.get(l)??[],d=mu(c),u=s.get(l)??[],p=new Set(u.map(g=>g.id)),m=new Set((i.get(l)??[]).map(g=>g.id));t&&r.push(...fu(u,d,t)),n&&r.push(...gu({index:e.index,uri:l,usedNodeIds:d,localNormalIds:p,localAnyIds:m,sameFileNodeUsages:c,severity:n}))}return r}function uu(e){let t=new Map;for(let n of e){if(n.sourceKind!=="inline-tree-nodes-model"||!n.uri)continue;let r=t.get(n.uri)??[];r.push(n),t.set(n.uri,r)}return t}function pu(e){let t=new Map;for(let n of e){if(n.sourceKind!=="inline-tree-nodes-model"||!n.uri||!Er(n.kind))continue;let r=t.get(n.uri)??[];r.push(n),t.set(n.uri,r)}return t}function mu(e){return new Set(e.filter(t=>t.kind==="node").map(t=>t.id))}function fu(e,t,n){let r=[];for(let o of e)t.has(o.id)||r.push(kn({code:"BT121_UNUSED_MODEL_DEFINITION",message:`unused inline model definition \`${o.id}\` in this file`,uri:o.uri,range:Ot(o),rule:os,severity:n,data:{kind:"unused-model-definition",nodeId:o.id,modelKind:o.kind,sourceKind:"inline-tree-nodes-model",fix:o.uri&&Rn(o)&&o.editable?{kind:"delete-definition",uri:o.uri,range:Rn(o)}:void 0}}));return r}function gu(e){let t=[];for(let n of e.usedNodeIds){if(e.localNormalIds.has(n)||!Te(e.index,n).some(a=>Er(a.kind)))continue;let o=e.localAnyIds.has(n),i=e.sameFileNodeUsages.find(a=>a.kind==="node"&&a.id===n),s=o?void 0:lu(e.index,n);t.push(kn({code:"BT123_MISSING_LOCAL_MODEL_DEFINITION",message:`missing local model definition \`${n}\` in this file`,uri:e.uri,range:i?.elementRange??i?.range,rule:is,severity:e.severity,data:{kind:"missing-local-model-definition",nodeId:n,sourceKind:"inline-tree-nodes-model",fix:s&&e.uri?{kind:"add-local-definition",uri:e.uri,nodeId:n,model:s}:void 0}}))}return t}function yu(e){let t=e.filter(o=>o.isCanonicalModelFile);if(t.length!==1)return;let n=t[0];if(!n?.uri)return;let r=e.filter(o=>o!==n);if(!r.some(o=>!o.uri||!Rn(o)||!o.editable))return{kind:"delete-non-canonical-definitions",keep:{uri:n.uri,range:Ot(n)},delete:r.map(o=>({uri:o.uri,range:Rn(o)}))}}function bu(e){if(e.config.models.convention!=="single-source")return[];let t=vn(e.config,rs);if(!t)return[];let n=[],r=vr(e.facts.filter(o=>!o.isBuiltin));for(let o of r.values()){if(o.length<=1)continue;let i=o[0];i&&n.push(kn({code:"BT122_DUPLICATE_MODEL_DEFINITION",message:`duplicate model definition for \`${i.id}\` (${i.kind})`,uri:i.uri,range:Ot(i),rule:rs,severity:t,data:{kind:"duplicate-model-definition",nodeId:i.id,modelKind:i.kind,definitions:o.map(s=>({uri:s.uri,sourceKind:s.sourceKind,range:s.range,canonical:s.isCanonicalModelFile,editable:s.editable})),fix:yu(o)}}))}return n}function ss(e){if(e.config.linter.enabled===!1)return[];let t=hr(e.index);return[...cu({config:e.config,facts:t}),...du({config:e.config,index:e.index,facts:t}),...bu({config:e.config,facts:t})]}import{findNodeAtLocation as as,parse as hu,parseTree as Su}from"jsonc-parser";function vu(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 ls(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function cs(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(P(S.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,l=await n.readFile(s.uri),c=[],d=Su(l,c,{allowTrailingComma:!0,disallowComments:!1});try{if(a=hu(l,c,{allowTrailingComma:!0,disallowComments:!1}),c.length>0||!d)throw new Error(`JSON parse error at offset ${c[0]?.offset??0}`)}catch(p){let m=String(p.message||p);r.push(P(S.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:[m]}));continue}let u=Zn.safeParse(a);if(!u.success){for(let p of u.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(P(S.InvalidNodeDefinitionSchema,h.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(u.data.nodes)){i.has(p)&&r.push(P(S.DuplicateNodeDefinitionId,h.Error,`duplicate node definition ID \`${p}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),i.add(p);let g=vu(l),f=ls(as(d,["nodes",p]),g),T=bt(p,m),B=T.ports.map(R=>{let E=ls(as(d,["nodes",p,"ports",R.name]),g);return{...R,source:"node-definition-file",uri:s.path,range:E,nameRange:E}});o.push({...T,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!==h.Error),nodeModels:o,diagnostics:r}}function ds(e,t){return Ne(e,t).replace(/\\/g,"/")}function Ru(e){return[...e.reachableDocuments.values()]}function Nr(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function us(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function ku(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 Pr(e){let t=[],n=e.project,r=e.resolvedConfig,o=e.resolutionMode??Br(r),i=o==="entrypoints"||e.resolveGraph?await ts({project:e.project,documents:e.documents,resolvedConfig:r,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await cs({project:e.project,host:e.host});t.push(...l.diagnostics);let c=l.nodeModels,d=i&&(o==="entrypoints"||e.resolveGraph)?Nr([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)&&i.reachableUris.has(f.uri)),...i.reachableDocuments.values(),...s]):Nr([...e.documents.filter(f=>e.activeDocumentUris.has(f.uri)),...s]),u=Oe(d,{config:r,models:c,augmentations:a}),p={includeIssuesByUri:ku(i?.issues??[]),suppressionIssuesByUri:new Map};t.push(...u.diagnostics,...ss({config:r,index:u.index}));let m=new Map(Be(u.index).map(f=>[f,Y(u.index,f)])),g={mode:o,files:new Map(d.map(f=>[ds(n.rootUri,f.path||f.uri),f])),documentViews:new Map(d.map(f=>[f.uri,(()=>{let T=te(r,ds(n.rootUri,f.path||f.uri));return G(f,{semantic:u.index,config:T,policy:se(T)})})()])),includeGraph:i?.graph,reachableDocuments:i?.reachableDocuments??new Map,behaviorTreesById:new Map(Be(u.index).map(f=>[f,Y(u.index,f)])),reachableBehaviorTreesById:m,nodeModelsById:new Map(wt(u.index).map(f=>[f.id,f])),nodeModelSources:new Map(ur(u.index).map(f=>[f,Te(u.index,f).flatMap(T=>T.sourceMeta?[T.sourceMeta]:[])])),nodeDefinitionModels:[...c],entrypoints:n.entrypoints,workspace:u.index,facts:p};return{ok:t.every(f=>f.severity!==h.Error),index:g,diagnostics:t}}async function ps(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 Dr(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 hn({project:e.project,host:o});r.push(...g.diagnostics),s=[...g.augmentations]}let a=e.resolutionMode??Br(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 Pr({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:i,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:o}),d=Nr([...e.documents,...Ru(c.index),...i]),u=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:d,lintEnabled:u,showSuppressed:p,resolvedConfig:n,suppressionIssuesByUri:void 0}}function ms(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function fs(e,t){return e.includeIssuesByUri.get(t)??[]}function gs(e,t){return e.suppressionIssuesByUri.get(t)??[]}function ys(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=se(r),l=Tu(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(c){let d=P(c.code??e.code,e.severity,c.message,c.range,t.uri,c.details,c.data);e.diagnostics.push({...d,rule:e.rule,...c.relatedInformation?{relatedInformation:c.relatedInformation}:{}})},getIncludeIssues(c){let d=fs(e.facts,t.uri);return c?d.filter(u=>u.kind===c):d},getSuppressionIssues(c){let d=gs(e.facts,t.uri);return c?d.filter(u=>u.kind===c):d},getNodeUsage(c){return U(n,{element:c,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:l.has(c)})},getPortUsage(c,d){return ge(n,{element:c,documentRoot:t.root,attributeName:d,uri:t.uri,config:r,policy:a,isModelDefinition:l.has(c)})},resolveSubTree(c,d){return At(n,{id:c,fileLocalUri:d,config:r})},getNodeModel(c){return Q(n,c)},getBehaviorTrees(c){return Y(n,c)},getTreeNodeView(c){return i.get(c)},getSubTreeCallView(c){return s.get(c)}}}function Tu(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return wr(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||wr(n,t);return t}function wr(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&wr(n,t)}function N(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 we(e){return N({name:xu[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Du(n)})}}}})}function Du(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 bs=[we("missing-path"),we("not-found"),we("cycle"),we("outside-root"),we("unresolved-variable"),we("depth-exceeded"),we("too-many-files"),we("external-used")];import Iu from"ajv";var Cu=Iu,Bu=new Cu,Eu=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],Nu={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}},Mr=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"]),hs=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 Ss(e){return e.children.filter(t=>t.kind==="element")}function pe(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function vs(e){return e.children.some(t=>t.kind==="element")}function xn(e,t){let n=Rs(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Rs(e){let t=ct(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 Tn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return _u(e.registry,n,e.value)?void 0:Tn(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!Ts(r,e.value))return Pu(r)?Tn(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 ze(e){return e.effectiveType??e.type}function ks(e,t){return de(e,ze(t))}function ct(e,t){let n=X({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function Tn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function Pu(e){let t=St(e)??e;return xs(e)!==void 0||Lu.has(t.toLowerCase())}function Ts(e,t){let n=xs(e);if(n)return wu(n,t);let r=(St(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 Eu.includes(t);default:return Mr.has(r)||hs.has(r)?Ds(r,t):!1}}function xs(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function wu(e,t){let n=Au(t);return n?n.every(r=>Mu(e,r)):!1}function Mu(e,t){if(t.kind==="string")return Ts(e,t.value);let n=(St(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 Mr.has(n)||hs.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&Ds(n,String(t.value)):!1}}function Ds(e,t){let n=Nu[e];if(!n)return!1;if(Mr.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 Au(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 _u(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?Rs({port:{name:`tuple[${i}]`,type:s},value:o,registry:e,typeDefinition:de(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 Bu.compile(t.schema)(r)===!0}catch{return!1}}}var Lu=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 Is=[N({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})}}}}),N({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))}}}}),N({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=zn(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"}})}}}}}),N({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of qe(e.semantic))t.uri&&t.uri!==e.document.uri||Fu(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),N({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!ju(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=Uu(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"){ct(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}xn(e,{port:a,value:n.value,range:n.range,registry:ne(e.semantic),typeDefinition:Z(e.semantic,a.type),allowRemap:!0,diagnosticCode:S.InvalidPortDefaultValue,customLiteralDiagnosticCode:S.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),N({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=ne(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=ct(i.name,i.value);if(!s)continue;let a=ks(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:qu(o.element),port:i.declaredPort.port,typeDefinition:a,range:i.attribute.range}),n.set(l,c)}for(let o of n.values()){let i=Ou(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 ${Vu(a.port,a.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),N({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must be explicitly or default-remapped to a blackboard entry."},create(e){return{Element(t){if($u(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of n.ports){if(r.direction!=="output")continue;let o=n.portUsages.find(i=>i.name===r.name&&i.status==="resolved");if(o){if(ct(r.name,o.value)!==void 0)continue;e.report({code:S.OutputPortRequiresRemap,message:`output port \`${r.name}\` must be remapped to a blackboard entry`,range:o.attribute.range,details:{primaryLabel:`output port \`${r.name}\` requires a blackboard remap`,help:`use \`${r.name}="{${r.name}}"\` or \`${r.name}="{some_key}"\``}});continue}r.defaultValue!==void 0&&ct(r.name,r.defaultValue)!==void 0||e.report({code:S.OutputPortRequiresRemap,message:`output port \`${r.name}\` must be remapped to a blackboard entry`,range:t.range,details:{primaryLabel:`output port \`${r.name}\` requires a blackboard remap`,help:`use \`${r.name}="{${r.name}}"\` or \`${r.name}="{some_key}"\``}})}}}}})];function Fu(e,t){return e.diagnostics.some(n=>n.code===S.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function ju(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function Uu(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 Ou(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")||Ce(e,i.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(i.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function Vu(e,t){return ze(e)??t.canonical}function qu(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function $u(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Xu=new Set(["_failureIf","_successIf","_skipIf","_while"]),zu=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function We(e){if(Xu.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(zu.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 Vt(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=yt({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 Cs=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),Bs=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function dt(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(Es(r)){n++;continue}if(Ar(r)){let a=n;for(n++;n<e.length&&Ku(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(Ge(r)){let a=Gu(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=Wu(e,n);t.push(a),n=a.end;continue}let o=e.slice(n,n+2),i=Cs.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let s=Bs.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 Wu(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 Gu(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&&Hu(e[n]);)n++;return o===n||Ju(e,n)?(n=qt(e,n),$t(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Ge(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(!Ge(e[n+1]))return n=qt(e,n+1),$t(e,t,n);for(r="Real",n+=1;n<e.length&&Ge(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&&Ge(e[n]);)n++;if(i===n)return n=qt(e,Math.max(n,o+1)),$t(e,t,n);r="Real"}return Yu(e,n)?(n=qt(e,n),$t(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function qt(e,t){let n=t;for(;n<e.length;){let r=e[n];if(Es(r)||Bs.has(r)||Cs.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function $t(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Es(e){return e===" "||e===" "||e===`
15
+ `||e==="\r"}function Ar(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Ku(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Ge(e){return e!==void 0&&/[0-9]/.test(e)}function Hu(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Yu(e,t){let n=e[t];return Ar(n)||Ge(n)}function Ju(e,t){let n=e[t];return n==="."||Ar(n)||Ge(n)}var Zu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Qu=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),Ns=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),le={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function He(e){let t=dt(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}:Ps(t,e)}function Ps(e,t=""){let n=new _r(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=op(r);return{ok:!0,program:{kind:"Program",statements:r,range:o},tokens:e}}var _r=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=Zu.get(r.type);if(o){if(t>=le.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:o,left:n,right:l,range:Xt(n.range,l.range)};break}if(r.type==="Question"){if(t>=le.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(le.ternary);if(!c)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:c,range:Xt(n.range,c.range)};break}let i=Ns.get(r.type);if(i){if(t>=le.comparison)break;this.consume();let l=[n],c=[i],d=this.parseExpression(le.comparison);if(!d)return;for(l.push(d);;){let u=Ns.get(this.peek().type);if(!u)break;this.consume();let p=this.parseExpression(le.comparison);if(!p)return;c.push(u),l.push(p)}n={kind:"ComparisonChain",operands:l,operators:c,range:Xt(l[0].range,l[l.length-1].range)};continue}let s=Qu.get(r.type),a=s?np(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:Xt(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:Ke(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),ep(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:tp(t.type),argument:n,range:Xt(Ke(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(),rp(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:Ke(r)})}};function ep(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:Ke(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Ke(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Ke(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Ke(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function tp(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function np(e){switch(e){case"PipePipe":return le.pipePipe;case"AmpAmp":return le.ampAmp;case"Pipe":case"Caret":return le.pipeCaret;case"Ampersand":return le.ampersand;case"Plus":case"Minus":case"DotDot":return le.additive;case"Star":case"Slash":return le.multiplicative;default:return}}function Ke(e){return{start:e.start,end:e.end}}function Xt(e,t){return{start:e.start,end:t.end}}function rp(e,t){return{...e,range:t}}function op(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var ip=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 zt(e={}){let t=ot(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>vt(t,s,a)),r=new Map,o=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:sp(e.enums,e.augmentations??[])};for(let s of e.symbols??[])ws(i.symbols,r,s,n);for(let s of e.globalBlackboardSymbols??[])ws(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 Wt(e){let t=he(e.baseEnvironment),n=[];for(let r of e.entries){let o=he(t),i=r.parseResult??He(r.source),s=he(o),a;i.ok&&(a=Je({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 Ms(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 De(e,t){let n=de(e,t);return As(t,n)}function As(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"}:ip.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function _s(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 ut(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 Ye(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Lr(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 sp(e,t){if(e instanceof Map)return new Map(e);let n=Ms(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function ws(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)||!_s(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 Ze={kind:"number"},In={kind:"string"},Dn={kind:"bool"},ce={kind:"unknown"},V={kind:"error"};function Je(e){let t=he(e.environment),n=[],r=[],o=[],i=[],s=[],a=[],l=[],c=[];return e.program.statements.forEach((d,u)=>{c.push(Se({expression:d,statementIndex:u,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"?Ze:t.valueKind==="string"?In:t.valueKind==="boolean"?Dn:ce;case"Identifier":return lp(e,t.name,t.range);case"UnaryExpression":{let n=Se({...e,expression:t.argument});return t.operator==="!"?Ye(n)?Dn:(oe(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"?Ze:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?V:ce:(oe(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 Fs(n)||Fs(r)?(oe(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):Dn;case"+":return n.kind==="string"&&r.kind==="string"?In:n.kind==="number"&&r.kind==="number"?Ze:Fr(n,r)?ce:(jr(e,t.range,t.operator),V);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Ze:Fr(n,r)?ce:(jr(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")?In:Fr(n,r)?ce:(jr(e,t.range,t.operator),V)}return ce}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(!cp(o,i,s))return oe(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 Dn}case"ConditionalExpression":{let n=Se({...e,expression:t.condition});Ye(n)||oe(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=Lr(r,o);return i||(oe(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 ap(e)}}function ap(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}),oe(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 d=Vt(a.name);if(d.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(c),js(e,a.range,d.raw,d.message),V;if(d.kind==="global-blackboard"){let m=t.globalBlackboard.get(d.key),g=i.operator===":="?s:i.operator==="="?m&&ut(m.type,s)?s:m?void 0:s:Ls(m?.type??ce,s,i.operator);if(i.operator!==":="&&i.operator!=="="&&!g)return oe(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&&!ut(m.type,s))return Ur(e,a,m.type,s),V;let f=m?{...m}:{name:d.key,type:s,source:{kind:"global-blackboard",key:d.key,range:a.range,originId:e.originId},readable:!0,writable:!0};return f.type=g??s,t.globalBlackboard.set(d.key,f),e.resolvedIdentifiers.push({access:c,resolution:{kind:"global-blackboard",key:d.key,symbol:f}}),e.globalBlackboardAccesses.push({key:d.key,rawName:a.name,kind:l,range:a.range,inferredType:f.type}),f.type}let u=t.symbols.get(a.name);if(i.operator===":="&&!u){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(!u)return e.resolvedIdentifiers.push({access:c,resolution:{kind:"unknown"}}),oe(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:u}}),i.operator==="=")return ut(u.type,s)?(Or(u,s),s):(Ur(e,a,u.type,s),V);if(i.operator===":=")return ut(u.type,s)?(Or(u,s),s):(Ur(e,a,u.type,s),V);let p=Ls(u.type,s,i.operator);return p?(Or(u,p),p):(oe(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 lp(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let o=Vt(t);if(o.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(r),js(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??ce}),e.resolvedIdentifiers.push({access:r,resolution:{kind:"global-blackboard",key:o.key,...a?{symbol:a}:{}}}),a?.type??ce}let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),Ze;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),ce)}function Ls(e,t,n){return e.kind==="error"||t.kind==="error"?V:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?ce:n==="+="?e.kind==="number"&&t.kind==="number"?Ze:e.kind==="string"&&t.kind==="string"?In:void 0:e.kind==="number"&&t.kind==="number"?Ze:void 0}function Fr(e,t){return Cn(e)||Cn(t)}function Cn(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Fs(e){return!Ye(e)}function cp(e,t,n){return Cn(t)||Cn(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 jr(e,t,n){oe(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 Ur(e,t,n,r){oe(e,"variable-type-mismatch",t.range,`cannot assign ${Vr(r)} to variable \`${t.name}\` of type ${Vr(n)}`,`\`${t.name}\` expects ${Vr(n)} here`,"assign a compatible value or change the variable's source type")}function js(e,t,n,r){oe(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 Or(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 oe(e,t,n,r,o,i){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:o,help:i}})}function Vr(e){return e.kind==="custom"?e.name:e.kind}var Us=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),dp=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"]),up=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],pp=[":=","=","+=","-=","*=","/="],Os=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function qr(e){let t=e.source,n=$s(t,e.cursorOffset),r=En({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...mp(e,r)),Sp(e.attributeInfo,t,n)&&o.push(...yp(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...fp(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(...gp(r.range,r.prefix)),kp(o)}function En(e){let t=e.source,n=$s(t,e.cursorOffset),r=dt(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=vp(t,n),s=Bn(r,i.start);if(i.start<i.end&&s&&Us.has(s.type))return{kind:s.type==="Identifier"&&qs(r,s)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let a=Bn(r,n);return a&&Us.has(a.type)&&a.end<=n?{kind:a.type==="Identifier"&&qs(r,a)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!a||dp.has(a.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function mp(e,t){let n=bp(e),r=t.prefix.toLowerCase(),o=[];for(let[i,s]of n.enums)pt(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&&pt(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:Vs(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}`;pt(s,r)&&o.push({label:s,kind:"identifier",detail:Vs(i),replaceRange:t.range,sortText:`2-${s}`})}for(let i of["true","false"])pt(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function fp(e,t){return up.filter(n=>pt(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function gp(e,t){return pp.filter(n=>pt(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function yp(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 bp(e){let t=he(e.environment),n=dt(e.source),r=He(e.source);if(r.ok){let o=Je({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=Rp(n,o.end);if(i?.type!=="ColonEqual"||i.end>e.cursorOffset)continue;let s=Vt(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 Vs(e){let t=hp(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 hp(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 Sp(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=dt(t).filter(i=>i.type!=="EndOfInput"),o=Bn(r,n);return!o||o.type==="Semicolon"}function vp(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 Bn(e,t){for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r.end<=t)return r}}function qs(e,t){if(t.type!=="Identifier")return!1;let n=Bn(e,t.start);return!n||n.type==="Semicolon"}function Rp(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function pt(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function $s(e,t){return Math.max(0,Math.min(e.length,t))}function kp(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 Xs=new WeakMap;function Nn(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=We({elementName:t.name,attributeName:o.name,resolvedNodeType:r});return i?[{attribute:o,info:i,parseResult:He(o.value)}]:[]})}function me(e,t,n){return xe(e.document,t,n)}function zs(e){return{start:0,end:e.value.length}}function Me(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?Nn(e,t).map(o=>{let i=Ws(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?Je({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):Tp(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function Tp(e,t){let n=Xs.get(e.view);n||(n=new WeakMap,Xs.set(e.view,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(s=>Nn(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),i=Wt({baseEnvironment:Ws(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 Ws(e,t){let n=ne(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=ze(a),d=Z(e.semantic,l)?.canonical??l;r.push({name:a.name,type:De(n,l),source:{kind:"subtree-port",nodeType:i,portName:a.name,direction:a.direction},readable:!0,writable:a.direction==="output"||a.direction==="inout",compatibilityKey:d})}}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=ze(a.usage.port),u=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:De(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:u})}return o.push(...xp(e,n)),zt({symbols:r,globalBlackboardSymbols:o,augmentations:Mt(e.semantic),areTypesCompatible:(s,a)=>s&&a?Ce(e.semantic,s,a):!0})}function xp(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=ze(i.usage.port),c=Z(e.semantic,a)?.canonical??a,d=i.usage.port.direction;n.push({name:s.reference.key,type:De(t,a),source:{kind:"global-blackboard-remap",nodeType:o,portName:i.usage.port.name,direction:d,key:s.reference.key},readable:d==="input"||d==="output"||d==="inout",writable:d==="output"||d==="inout",compatibilityKey:c})}}return n}var Gs=N({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Me(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:S.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:me(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 Ks=N({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Me(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:me(e,n.attribute,r.range),details:r.details})}}}}});var Hs=N({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Me(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:me(e,n.attribute,r.range),details:r.details})}}}});var Ys=N({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Me(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||Ye(o)||e.report({code:S.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:me(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 Js=N({name:"script/valid-syntax",create(e){return{Element(t){for(let n of Nn(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??me(e,n.attribute,zs(n.attribute)):me(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Zs=[Js,Gs,Ks,Hs,Ys];var Dp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Qs(e){return N({name:Dp[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Ip(n)})}}}})}function Ip(e){return e.code?{code:e.code}:void 0}var ea=[Qs("unused"),Qs("missing-reason")];function Pn(e,t){return e.attributes.find(n=>n.name===t)}function ta(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 na=[N({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||Pn(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),N({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Nt(e.semantic,e.document.uri);for(let 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))}}}}),N({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of Be(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})}}}}}),N({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=Pn(t,"main_tree_to_execute");!n?.value||sr(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),N({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||ta(e.document.root,t))return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(i=>i.name==="ID")??Pn(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})}}}}),N({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||ta(e.document.root,t))return;let n=Pn(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})}}}}),N({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var Cp=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Bp(e,t){return e===t?String(e):`${e}\u2013${t}`}var ra=N({name:"model/valid-child-count",create(e){return{Element(t){if(pe(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Ep(e,t,n.model.model.id,n.model.model.kind)}}}});function Ep(e,t,n,r){let o=Ss(t).length,i=Cp.get(n);if(i){if(o<i.min||o>i.max){let s=Bp(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 oa=N({name:"model/valid-port-value",create(e){return{Element(t){if(pe(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"&&xn(e,{port:o.port,value:r.value,range:r.range,registry:ne(e.semantic),typeDefinition:Z(e.semantic,o.port.type),allowRemap:!0,diagnosticCode:S.InvalidPortValueType,customLiteralDiagnosticCode:S.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var ia=N({name:"model/require-port",create(e){return{Element(t){if(pe(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 sa=[N({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(pe(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})}}}}),N({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(pe(t)||t.selfClosing||vs(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 aa=N({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 la=N({name:"model/no-unknown-port",create(e){return{Element(t){if(pe(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 ca=[aa,la,ia,oa,...sa,ra];function Np(e,t){return e.attributes.find(n=>n.name===t)}function Pp(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var da=[N({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||Np(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},N({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)||Pp(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var $r=[...da,...Zs,...na,...Is,...ca,...bs,...ea],Pv=new Map($r.map(e=>[e.name,e]));function ua(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function pa(e,t){return ke(e.linter.rules[t])?.options??{}}function ma(e){let t=ke(e.config.linter.rules[e.rule]);return ua(t?t.severity:e.defaultSeverity)}function fa(e){let t=[],n=e.facts??ms(),r=e.rules?new Set(e.rules):void 0,o=[];for(let s of $r){if(r&&!r.has(s.name))continue;let a=ma({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=pa(e.config,s.name),c=s.optionsSchema?.safeParse(l),d=c?.success?c.data:l,u=ys({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:d,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});o.push(s.create(u))}for(let s of o)s.Document?.();e.document.root&&ga(e.document.root,o);let i=Nt(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)=>wp(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function ga(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&ga(n,t)}function wp(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 Gt(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:se(n.config)});return r.push(...fa({document:e,view:o,semantic:t,config:n.config})),r}var Mp={"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 ya(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Ap(e,t){let n=ke(e.linter.rules[t]);return ya(n?n.severity:ue[t].defaultSeverity)}function _p(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 ba(e){let t=[];for(let n of e.issues){let r=Mp[n.kind],o=Ap(e.config,r);if(!o)continue;let i=P(ue[r].code,o,n.message,n.range,n.uri,void 0,_p(n));t.push({...i,rule:r})}return t}function ha(e,t){return Ne(e,t).replace(/\\/g,"/")}function Lp(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function Fp(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let r=ha(e,n);if(Lp(r))return r}return ha(e,t.uri)}function Sa(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 d=Fp(a.rootUri,c);if(l==="entrypoints"&&n.index.includeGraph&&c.kind==="bt-document"&&!n.index.reachableDocuments.has(c.uri))return{path:d,uri:c.uri,kind:c.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:c.originalText};let u=l==="single-file"?Oe([c,...r],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,p=l==="single-file"?(()=>{let g=te(s,d);return G(c,{semantic:u,config:g,policy:se(g)})})():n.index.documentViews.get(c.uri),m=[];if(i){let g=te(s,d);m=Gt(c,u,{config:g,documentView:p});let f=n.index.facts.includeIssuesByUri.get(c.uri)??[];m.push(...ba({issues:f,config:g}))}return e.input.mode==="check"&&c.kind==="generic-xml"?{path:d,uri:c.uri,kind:c.kind,documentView:p,diagnostics:[],rawDiagnostics:m,skipped:!0,skipReason:"generic-xml",originalText:c.originalText}:{path:d,uri:c.uri,kind:c.kind,documentView:p,diagnostics:m,rawDiagnostics:void 0,skipped:!1,originalText:c.originalText}})}function va(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...va(n.children));return t}function jp(e,t,n){let r=[],o=[];for(let i of e){let s=va(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],d=l.match(/reason:\s*(.+)$/)?.[1];t&&!d&&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:d}):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:d}):l.startsWith("btxml-disable")&&n&&r.push({uri:i.uri,code:c,line:a.range.end.line+1,range:a.range,used:!1,reason:d})}}return{suppressions:r,issues:o}}function Ra(e,t){let n=jp(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 Xr(e,t,n,r=e.resolvedConfig){let o=Ue(r.linter.rules,"suppression/require-reason")!=="off";return Ra(t,{documents:n??e.fileDocuments,requireReason:o,allowInline:r.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function ka(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 Ta(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===ka(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 xa={error:0,warning:1,info:2};function Da(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function wn(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=xa[t.severity]-xa[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function Ia(e,t,n){let r=t.filter(i=>!i.skipped),o=wn([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 Up(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 Ca(e,t){let n=wn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(r=>r.diagnostics)??[]]);return{ok:!Da(n,e.input.maxWarnings),files:e.files?Up(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var Op={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},Vp={unused:S.UnusedSuppression,"missing-reason":S.MissingSuppressionReason};function qp(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function $p(e,t){return qp(Ue(e.linter.rules,t))}function zr(e){let t=[];for(let n of e.issues){let r=Op[n.kind],o=$p(e.config,r);if(!o)continue;let i=P(Vp[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 Xp(e){let t=await ps(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=Sa(t);let r=Xr(t,n);n=[...r.diagnostics,...zr({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],d=t.fileDocuments[l];if(c.skipped)continue;let u=te(t.resolvedConfig,c.path),p=Xr(t,c.diagnostics,[d],u);c.diagnostics=[...p.diagnostics,...zr({issues:p.issues,config:u})],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=Ta(t,l.diagnostics);l.diagnostics=c.diagnostics,i+=c.baselineDiagnostics.length,c.staleEntries.length>0&&(s=s.concat(c.staleEntries))}t.files=us(t.files),t.finalProjectDiagnostics=n;let a=Ia(t,t.files,n);return a.suppressed=o,a.baselineFiltered=i,a.staleEntries=s,{...Ca(t,a),files:t.files??[]}}async function Wr(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 Xp({...e,host:n,documents:r,externalModelDocuments:o,augmentations:i,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}async function Na(e,t,n){let r=e;for(;;){for(let i of t){let s=ee.join(r,i);if(await n.exists(s))return s}let o=ee.dirname(r);if(o===r)return;r=o}}async function zp(e,t){return Na(e,["btxml.config.json"],t)}async function Ba(e,t){return JSON.parse(await t.readFile(e))}function Ea(e,t){return e.map(n=>P(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function Pa(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await zp(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[P("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 Ba(t,e.host)}catch(i){let s=String(i.message||i);return{ok:!1,configUri:t,diagnostics:[P("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 Na(e.startUri,["package.json"],e.host);if(i)try{let s=await Ba(i,e.host);s.btxml&&(n=s.btxml,t=i)}catch{n={}}}let r=xt(n);if(!r.ok)return{ok:!1,configUri:t,diagnostics:Ea(r.diagnostics,t)};let o=or(r.value);return o.length>0?{ok:!1,configUri:t,diagnostics:Ea(o,t)}:{ok:!0,config:r.value,configUri:t,diagnostics:[]}}async function wa(e,t,n,r){let o=await Ut(t.files,e,[],n.followSymlinks,void 0,void 0,r),i=await Ut(t.definitions,e,[],n.followSymlinks,void 0,void 0,r),s=await Ut(t.augmentations,e,[],n.followSymlinks,void 0,void 0,r),a=o.files.map(d=>({path:$(e,d),uri:d,kind:"model-xml"})),l=i.files.map(d=>({path:$(e,d),uri:d,kind:"node-definition"})),c=s.files.map(d=>({path:$(e,d),uri:d,kind:"model-augmentation"}));return{modelFiles:a,augmentationFiles:c,definitionFiles:l,unmatchedPatterns:{models:o.unmatchedPatterns,augmentations:s.unmatchedPatterns,definitions:i.unmatchedPatterns}}}async function Wp(e){if(e.configUri)return ee.dirname(e.configUri);let t=e.startUri;for(;;){if(await e.host.exists(ee.join(t,".git"))||await e.host.exists(ee.join(t,".colcon")))return t;let n=ee.dirname(t);if(n===t)return e.startUri;t=n}}async function Gr(e){let t=await Pa({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=Dt(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let r=n.config,o=await Wp({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:i,skippedFiles:s}=await Yi(o,r.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?$(o,t.configUri):"",c=Ji(r.resolver);for(let f of c){let T=ee.join(o,f.file);await e.host.exists(T)&&!i.some(B=>B.uri===T)&&i.push({path:f.file,uri:T,kind:"bt-xml"})}let{modelFiles:d,augmentationFiles:u,definitionFiles:p,unmatchedPatterns:m}=await wa(o,r.models,r.files,e.host);for(let f of m.models)a.push(P(S.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${f}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let f of m.definitions)a.push(P(S.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${f}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let f of m.augmentations)a.push(P(S.AugmentationFileNotFound,h.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 Zi(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:d,augmentationFiles:u,definitionFiles:p,skippedFiles:s,modelsBuiltins:g}}}function Ma(e){return[...e.files.values()]}function Aa(e){return[...e.reachableDocuments.values()]}function _a(e){return e.workspace}function La(e){return[...e.nodeDefinitionModels]}function Fa(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 Kr(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 $e(e.project,r);a.push(...c.diagnostics),o??=c.documents,i??=c.externalModelDocuments,s??=c.augmentations}let l=await Pr({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:_a(l.index),documents:Ma(l.index),reachableDocuments:Aa(l.index),nodeDefinitionModels:La(l.index),includeGraph:Fa(l.index)}}import ja from"path";import{fileURLToPath as Zp,pathToFileURL as Ua}from"url";function Qp(e){return e.startsWith("file://")?e:Ua(ja.resolve(e)).href}function Hr(e){return Zp(Qp(e))}function mt(e){return Ua(ja.resolve(e)).href}function Yr(e){return Hr(Tr(e))}function Oa(e){return e?.documents??[]}function em(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 tm(e){let t=tt();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 fe(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,...Oa(r).filter(d=>!em(e.document,d))]:Oa(r),i=tm(e.config||t.config),s=se(i),a=r?.nodeDefinitionModels??[],l=Oe(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?Gt(n.document,l,{config:i,documentView:c}):n.diagnostics,partial:n.partial===!0,semantic:l,config:i,nodeUsagePolicy:s,workspace:r}}function Va(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:I(r,r),newText:n}}function qa(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 $a(e,t,n){return Jr(e,t,n,"")}function Jr(e,t,n,r){let o=Math.max(t.openTagRange.end.offset-(t.selfClosing?2:1),t.openTagRange.start.offset),i=e.positionAt(o);return{range:I(i,i),newText:` ${n}="${r}"`}}function Mn(e){return I(e.positionAt(0),e.positionAt(e.text.length))}function Zr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=Ft(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:Mn(t.document),newText:o.text}]});for(let i of n){if(!nm(i))continue;let s=re({document:t.document,parsed:e.parsed,position:i.range.start}),a=om(e,t,i,s);im(r,e,t,i.code,i,a),sm(r,e,t,i.code,i,s,a),am(r,e,t,i.code,i,s),lm(r,e,t,i.code,i),cm(r,t,i)}return{actions:r}}function nm(e){return!!e.range}function rm(e){return e.status==="resolved"}function Qr(e,t,n){return U(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function Xa(e){return"element"in e?e.element:void 0}function om(e,t,n,r){let o=Xa(r),i=e.parsed?.root;if(!i||!n.range)return o;let s=Math.min(n.range.start.offset+1,n.range.end.offset);return lt(i,s)??o}function im(e,t,n,r,o,i){if(r!=="BT101_MISSING_REQUIRED_PORT"||!i)return;let s=Qr(t,n,i),a=s.ports.find(l=>l.required&&!s.portUsages.some(c=>c.status==="resolved"&&c.name===l.name));a&&e.push({title:`Add missing port ${a.name}`,kind:"quickfix",diagnostics:[o],edits:[$a(n.document,i,a.name)]})}function sm(e,t,n,r,o,i,s){if(r!=="BT115_OUTPUT_PORT_REQUIRES_REMAP"||!s)return;let a=/`([^`]+)`/.exec(o.message)?.[1],l=Qr(t,n,s),c="attribute"in i?i.attribute:void 0;if(c){let u=l.portUsages.find(p=>rm(p)&&p.port.direction==="output"&&p.attribute===c&&(!a||p.port.name===a));if(u){e.push({title:`Remap output port ${u.port.name}`,kind:"quickfix",diagnostics:[o],edits:[{range:c.valueContentRange??c.valueRange,newText:`{${u.port.name}}`}]});return}}let d=l.ports.find(u=>u.direction==="output"&&(!a||u.name===a)&&!l.portUsages.some(p=>p.status==="resolved"&&p.name===u.name));d&&e.push({title:`Remap output port ${d.name}`,kind:"quickfix",diagnostics:[o],edits:[Jr(n.document,s,d.name,`{${d.name}}`)]})}function am(e,t,n,r,o,i){if(r!=="BT102_UNKNOWN_PORT"||!("attribute"in i&&i.attribute))return;let s=Xa(i);if(!s||!Qr(t,n,s).portUsages.find(d=>d.status==="undeclared"&&d.attribute===i.attribute))return;let c=qa(n.document,i.attribute);c&&e.push({title:`Remove unknown port ${i.attribute.name}`,kind:"quickfix",diagnostics:[o],edits:[c]})}function lm(e,t,n,r,o){if(r!=="BT002_MISSING_BTCPP_FORMAT"||!t.parsed?.root)return;let i=n.document.positionAt(t.parsed.root.nameRange?.end.offset||t.parsed.root.openTagRange.end.offset-1);e.push({title:'Add BTCPP_format="4" to <root>',kind:"quickfix",diagnostics:[o],edits:[{range:I(i,i),newText:' BTCPP_format="4"'}]})}function cm(e,t,n){n.range&&e.push({title:`Suppress ${n.code} for next line`,kind:"quickfix",diagnostics:[n],edits:[Va(t.document,n.range.start.line,`<!-- btxml-disable-next-line ${n.code} reason: TODO -->
16
+ `)]})}function O(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 Ae(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 eo(e){return je(e)}function Qe(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function za(e,t){return!e||!t?!1:Qe(e)===Qe(t)}function Wa(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=Qe(a.type),c=Qe(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 dm(e,t,n){return I(e.positionAt(t),e.positionAt(n))}function um(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,d=s[1]==="@"?c+1:c,u=l?i-1:i;return{replacementRange:dm(e,d,Math.max(d,u)),wrapsReference:!1,hasScopeMarker:s[1]==="@"}}return{insertText:t.value,replacementRange:r,wrapsReference:!0,hasScopeMarker:!1}}function to(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,s=um(t,n,r),a=s?.wrapsReference??!1,l=s?.hasScopeMarker??!1;if(l&&o.scope!=="global")return;let c=o.key;a?c=eo(o):o.scope==="global"&&(c=`@${o.key}`);let d=o.key;a?d=eo(o):o.scope==="global"&&(d=l?o.key:`@${o.key}`);let u=o.scope==="global"?` @${o.key}`:"",p=`${o.key} ${c}${u}`.trim();return O(c,"Reference",i,s?{range:s.replacementRange,newText:d}:void 0,{filterText:p,insertText:d})}var Ga=new WeakMap;function ft(e,t){let n=e.parsed?re({document:e.document,parsed:e.parsed,position:t}):void 0;if(!n||n.kind!=="attribute-value")return;let r=io(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,s=ao(r.attribute,i),a=En({source:r.source,cursorOffset:s});if(a.kind!=="identifier"||s<a.range.start||s>a.range.end)return;let l=Za(e,r),c=l.analysis?.resolvedIdentifiers.find(u=>u.access.range.start===a.range.start&&u.access.range.end===a.range.end&&u.resolution.kind!=="unknown");if(!c||c.resolution.kind==="unknown")return;let d=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:no(e,r,a.range),reference:d,flowState:l,occurrence:{uri:e.document.uri,attributeContext:r,identifier:c.access,reference:d,documentRange:no(e,r,c.access.range)}}}function Ka(e,t){let n=(t.reference.kind==="global-blackboard"?tl(e):_n(e,t.attributeContext.behaviorTree).flatMap(r=>Qa(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:fm(t.reference.symbol,r.reference));return t.reference.kind==="global-blackboard"?gm([...n,...el(e,t.reference.key)]):n}function Ha(e,t){return nl(el(e,t).map(n=>({uri:n.uri,range:n.documentRange})))}function Ya(e,t){return nl(tl(e).filter(n=>n.reference.kind==="global-blackboard"&&n.reference.key===t).map(n=>({uri:n.uri,range:n.documentRange})))}function ro(e,t){return _n(e,t)}function Ja(e,t,n){let r=io(e,t,n);if(r)return Za(e,r).environmentBefore}function oo(e){let t=An(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 An(e){return e.kind==="custom"?e.name:e.kind}function Za(e,t){let r=_n(e,t.behaviorTree).find(o=>o.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function _n(e,t){let n=Ga.get(e);n||(n=new WeakMap,Ga.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=io(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=Wt({baseEnvironment:pm(e,t.nodes),entries:i}).flatMap((a,l)=>{let c=o[l];return c?[{...a,context:c}]:[]});return n.set(t,s),s}function io(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(!We({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 pm(e,t){let n=ne(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let a=Q(e.semantic,i);if(a?.kind==="SubTree")for(let l of a.ports){let c=l.effectiveType??l.type,u=Z(e.semantic,c)?.canonical??c;r.push({name:l.name,type:De(n,c),source:{kind:"subtree-port",nodeType:i,portName:l.name,direction:l.direction},readable:!0,writable:l.direction==="output"||l.direction==="inout",compatibilityKey:u})}}for(let a of t)for(let l of a.portBindings){if(l.declaredPort.status!=="resolved")continue;let c=ol(l);if(!c||c.scope==="global")continue;let d=l.declaredPort.port.type,p=Z(e.semantic,d)?.canonical??d,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:De(n,d),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=so(e).flatMap(({trees:a})=>a.flatMap(l=>l.nodes));return o.push(...mm(e,n,s)),zt({symbols:r,globalBlackboardSymbols:o,augmentations:Mt(e.semantic),areTypesCompatible:(a,l)=>a&&l?Ce(e.semantic,a,l):!0})}function mm(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=ol(s);if(!a||a.scope!=="global")continue;let l=s.declaredPort.port.type,d=Z(e.semantic,l)?.canonical??l,u=s.declaredPort.port.direction;r.push({name:a.key,type:De(t,l),source:{kind:"global-blackboard-remap",nodeType:i,portName:s.declaredPort.port.name,direction:u,key:a.key},readable:u==="input"||u==="output"||u==="inout",writable:u==="output"||u==="inout",compatibilityKey:d})}}return r}function Qa(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:no(e,t.context,n.access.range)}]}):[]}function fm(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 gm(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 el(e,t){return so(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 tl(e){return so(e).flatMap(({uri:t,trees:n})=>n.flatMap(r=>{let o=bm(e,t);return _n(o,r).flatMap(i=>ym(o,t,i))}))}function ym(e,t,n){return Qa(e,n).map(r=>({...r,uri:t}))}function so(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 bm(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=rt(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 nl(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 no(e,t,n){return xe(e.parsed??{originalText:e.document.text},t.attribute,n)}function ao(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 rl(e,t,n){let r=e.parsed??{originalText:e.document.text};return xe(r,t,n)}function ol(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 hm(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 We({elementName:t.name,attributeName:n.name,resolvedNodeType:o})}function il(e,t,n,r){let o=hm(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,s=Ja(e,n,r),a=Math.max(0,t.position.offset-i.start.offset);return qr({source:r.value,cursorOffset:ao(r,a),environment:s,attributeName:r.name,attributeInfo:o}).map(c=>Sm(e,r,c))}function Sm(e,t,n){return O(n.label,vm(n.kind),n.detail,{range:rl(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function vm(e){switch(e){case"identifier":return"Variable";case"enum":return"Enum";case"value":return"Value";case"operator":return"Keyword";case"snippet":return"Snippet"}}var Ln={enumLiteral:"0",boolLiteral:"1",matchingKey:"2",unknownKey:"3"};function sl(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function al(e,t){if(!e)return;let n=sl(e)?e.valueContentRange:e.valueRange;if(n)return K(n,sl(e)?t:`"${t}"`)}function ll(e,t,n,r){let o=[],i=[];for(let s of Be(e)){let a=Y(e,s),l=O(s,"Value","BehaviorTree ID",r?al(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 Rm(e){return O("SubTree","Class","Built-in subtree tag",K(e,"SubTree"),{sortText:"0-SubTree"})}function km(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())?[O(`${t}>`,"Value","Close current parent tag",K(e.replacementRange,`${t}>`))]:[]}function Tm(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(o=>O(o,"Class",void 0,K(t,o))),...["Action","Condition","Control","Decorator"].map(o=>O(o,"Class",void 0,K(t,o))),Rm(t)],r=new Set;for(let o of an(e))o.id!=="SubTree"&&(r.has(o.id)||(r.add(o.id),n.push(O(o.id,"Class",void 0,K(t,o.id)))));return Ae(n)}function Fn(e,t,n){return U(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function lo(e,t){let n=new Set(e.element.attributes.map(r=>r.name));return e.ports.filter(r=>!n.has(r.name)).map(r=>O(r.name,"Property",`${r.direction}${r.type?` ${r.type}`:""}`,K(t,r.name)))}function xm(e,t,n){let r=[O("ID","Property",void 0,K(n,"ID"))];return r.push(...lo(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function Dm(e,t,n,r){if(!e)return[];if(Ve(e.name)){let i=[];e.attributes.some(a=>a.name==="ID")||i.push(O("ID","Property",void 0,K(r,"ID")));let s=Fn(n,t,e);return i.push(...lo(s,r)),i}return e.name==="SubTree"?xm(e,Fn(n,t,e),r):e.name==="include"?[O("path","Property",void 0,K(r,"path"))]:lo(Fn(n,t,e),r)}function Im(e,t,n,r){return ll(t.semantic,e.document.uri,n,r)}function Cm(e,t,n,r){let o=[],i=new Set;for(let s of an(e))s.kind===t&&(i.has(s.id)||(i.add(s.id),o.push(O(s.id,"Value",`${t} node ID`,r?al(r,s.id):K(n,s.id)))));return o}function Bm(e,t,n){if(t.kind!=="attribute-value")return[];let{attribute:r,element:o}=t;if(!r||!o)return[];let i=Ve(o.name);if(i&&r.name==="ID")return Cm(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return Im(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return ll(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=>O(E,"File","XML file",K(r.valueContentRange||r.valueRange,E)));let s=il(n,e,o,r);if(s)return s;let a=Fn(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,d=r.valueContentRange||r.valueRange,u=[];c.enum?.length&&u.push(...c.enum.map(R=>O(R,"Enum",c.type,K(d,R),{sortText:`${Ln.enumLiteral}-${R}`}))),(c.type||"").toLowerCase()==="bool"&&u.push(...["true","false"].map(R=>O(R,"Value","bool",K(d,R),{sortText:`${Ln.boolLiteral}-${R}`})));let p=Wa(n),m=Qe(c.type),g=p.filter(R=>!R.conflict&&za(c.type,R.type)),f=p.filter(R=>!R.conflict&&!Qe(R.type)&&m),T=g.flatMap(R=>{let E=to({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:R,detail:R.scope==="global"?`${R.type||"unknown"} global blackboard key from ${R.nodeType}.${R.portName}`:`${R.type||"unknown"} blackboard key from ${R.nodeType}.${R.portName}`});return E?[{...E,sortText:`${Ln.matchingKey}-${R.scope==="global"?R.identity:R.key}`}]:[]}),B=f.flatMap(R=>{let E=to({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:R,detail:R.scope==="global"?`unknown-type global blackboard key from ${R.nodeType}.${R.portName}`:`unknown-type blackboard key from ${R.nodeType}.${R.portName}`});return E?[{...E,sortText:`${Ln.unknownKey}-${R.scope==="global"?R.identity:R.key}`}]:[]});return u.push(...T,...B),u.length>0?Ae(u):(t.valuePrefix||"").includes("{")?Ae(u):u}function co(e,t){let n=re({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:tr.map(r=>O(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:Ae(Bm(t,n,e))}:n.kind==="attribute-name"?{items:Ae(Dm(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:Ae(Tm(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:Ae(km(n))}:{items:[]}}function jn(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 Em(e,t,n){return Te(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 uo(e,t,n){return e?jn(e.nodes.flatMap(r=>r.portBindings.flatMap(o=>o.blackboardReferences.filter(i=>i.identity===t).map(i=>({uri:n,range:i.range}))))):[]}function po(e,t,n,r,o,i,s){let a=uo(e,i,s),l=(t??[]).flatMap(c=>{if(c.uri===s)return[];let d=G(c,{semantic:n,config:r,policy:o});return uo(d,i,c.uri)});return jn([...a,...l])}function mo(e,t,n){return uo(e,t,n)}function Un(e,t,n,r,o,i,s){if(!e)return[];let a=re({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,d=l?U(r,{element:l,documentRoot:e.root,uri:e.uri,config:o,policy:i}):void 0;if(l?.name==="SubTree"&&c?.name==="ID"){if(d?.tagForm==="model-definition")return Y(r,c.value).map(m=>m.idRange?{uri:m.uri,range:m.idRange}:void 0).filter(m=>!!m);let u=Em(r,c.value,e.uri),p=d?.subtree?.target;if(p?.status==="resolved"&&p.kind==="behavior-tree"){let m=p.behaviorTree;return m.idRange?jn([{uri:m.uri,range:m.idRange},...u]):u}if(p?.status==="ambiguous")return jn([...p.behaviorTrees.map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:void 0),...u].filter(m=>!!m));if(p?.status==="resolved"&&p.kind==="node-model"){if(u.length>0)return u;if(p.model.idRange)return[{uri:p.model.uri||e.uri,range:p.model.idRange}]}return u}if(l?.name==="root"&&c?.name==="main_tree_to_execute")return Y(r,c.value).map(u=>u.idRange?{uri:u.uri,range:u.idRange}:void 0).filter(u=>!!u);if(l?.name==="include"&&c?.name==="path"&&s){let u=s.find(p=>p.uri===c.value||p.path===c.value||(p.path?p.path.endsWith(`/${c.value}`):!1));if(u?.root?.range)return[{uri:u.uri,range:u.root.range}]}if(c&&l){let u=t?st(t,n):void 0,p=u?.blackboardReferences.find(m=>n.offset>=m.range.start.offset&&n.offset<=m.range.end.offset);if(p)return p.scope==="global"?po(t,s,r,o,i,p.identity,e.uri):mo(t,p.identity,e.uri);if(u?.declaredPort.status==="resolved"){let m=u.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(a.kind==="tag-name"&&l&&d?.model.status==="resolved"){let u=d.model.model;if(u.idRange)return[{uri:u.uri||e.uri,range:u.idRange}];if(u.range)return[{uri:u.uri||e.uri,range:u.range}]}if(c?.name==="ID"&&d?.tagForm==="generic-node"&&d.model.status==="resolved"){let u=d.model.model;if(u.idRange)return[{uri:u.uri||e.uri,range:u.idRange}];if(u.range)return[{uri:u.uri||e.uri,range:u.range}]}return[]}function fo(e,t){let n=ft(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let o=r.source,s=ro(e,n.attributeContext.behaviorTree).find(a=>a.id===o.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:xe(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?Q(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=Ha(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=ro(e,n.attributeContext.behaviorTree).find(c=>c.id===s.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:xe(e.parsed??{originalText:e.document.text},l.attribute,s.range)}]}}}return{locations:Un(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function go(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function cl(e,t){let n=Ft(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:Mn(e.document),newText:n.text}],diagnostics:[]}}function yo(e,t){return cl(t,e.config.formatter)}function dl(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
17
17
  Description: ${e.description}`:""}`].join(`
18
- `)}function sl(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 ul(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?`
19
19
 
20
- Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function dm(e,t){return`**SubTree** \`${e}\`
20
+ Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function Nm(e,t){return`**SubTree** \`${e}\`
21
21
 
22
22
  Resolves ambiguously across ${t.length} candidates:
23
23
  ${t.map(n=>`- \`${n}\``).join(`
24
- `)}`}function um(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function fo(e,t){let n=pt(e,t.position);if(n){if(n.reference.kind==="enum")return{range:n.range,contents:`**Enum** \`${n.reference.name}\`
24
+ `)}`}function Pm(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function bo(e,t){let n=ft(e,t.position);if(n){if(n.reference.kind==="enum")return{range:n.range,contents:`**Enum** \`${n.reference.name}\`
25
25
 
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: \`${wn(c.type)}\``,`Source: ${to(c)}`].join(`
27
- `):`**Global Blackboard** \`@${n.reference.key}\``}}let l=n.reference.symbol;return{range:n.range,contents:[`**Script Symbol** \`${l.name}\``,"",`Type: \`${wn(l.type)}\``,`Source: ${to(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?U(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}\`
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: \`${An(c.type)}\``,`Source: ${oo(c)}`].join(`
27
+ `):`**Global Blackboard** \`@${n.reference.key}\``}}let l=n.reference.symbol;return{range:n.range,contents:[`**Script Symbol** \`${l.name}\``,"",`Type: \`${An(l.type)}\``,`Source: ${oo(l)}`].join(`
28
+ `)}}let r=re({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?U(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}\`
29
29
 
30
- Resolves to \`BehaviorTree ID="${i.value}"\` in \`${c.uri}\`.`}}if(l?.status==="ambiguous"){let c=e.parsed?.uri||"workspace",d=um([...l.behaviorTrees,...l.definitions],c);return{range:i.valueContentRange||i.valueRange,contents:dm(i.value,d)}}if(l?.status==="resolved"&&l.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",d=Pm([...l.behaviorTrees,...l.definitions],c);return{range:i.valueContentRange||i.valueRange,contents:Nm(i.value,d)}}if(l?.status==="resolved"&&l.kind==="node-model")return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
31
31
 
32
- Resolves to SubTree model in \`${l.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let l=e.documentView?it(e.documentView,t.position):void 0;if(l?.declaredPort.status==="resolved")return{range:i.nameRange,contents:il(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:il(c.port)}}let a=e.documentView?cn(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:sl(l)}}return o&&s?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:sl(s.model.model)}:{}}function go(e,t){return sr(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function yo(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 pm(e,t){let n=new Set;for(let r of t){let o=ir(e.semantic).find(s=>bo(r,{uri:s.uri,range:s.idRange}));o&&n.add(o.id);let i=Et(e.semantic).find(s=>s.kind==="SubTree"&&(bo(r,{uri:s.uri,range:s.idRange})||bo(r,{uri:s.uri,range:s.range})));i&&n.add(i.id)}return[...n]}function bo(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function ho(e,t){let n=pt(e,t.position);if(n)return{locations:yo($a(e,n).map(d=>({uri:d.uri,range:d.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(d=>d.portBindings).find(d=>d.attribute===i&&t.position.offset>=(d.attribute.valueContentRange??d.attribute.valueRange).start.offset&&t.position.offset<=(d.attribute.valueContentRange??d.attribute.valueRange).end.offset):void 0)?.blackboardReferences.find(d=>t.position.offset>=d.range.start.offset&&t.position.offset<=d.range.end.offset);if(a){let d=z({scope:a.scope,key:a.key});return{locations:yo([...a.scope==="global"?lo(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,d,e.document.uri):co(e.documentView,d,e.document.uri),...a.scope==="global"?za(e,a.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:go(e,i.value)};if(o&&i?.name==="ID"&&U(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:go(e,i.value)};let l=jn(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents);if(l.length===0)return{locations:[]};let c=pm(e,l);return c.length>0?{locations:yo(c.flatMap(d=>go(e,d)))}:{locations:[]}}function mm(e,t){return e.attributes.find(n=>n.name===t)}function So(e){let t=e.name==="BehaviorTree"?mm(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=>So(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 vo(e,t){return e.parsed?.root?{symbols:[So(e.parsed.root)]}:{symbols:[]}}function fm(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function al(e={}){return{getDiagnostics(t){return fm(po(fe(t,e),t))},getCompletions(t){return so(fe(t,e),t)},getHover(t){return fo(fe(t,e),t)},getDefinition(t){return uo(fe(t,e),t)},getReferences(t){return ho(fe(t,e),t)},getDocumentSymbols(t){return vo(fe(t,e),t)},getCodeActions(t){return Yr(fe(t,e),t)},getFormattingEdits(t){return mo(fe(t,e),t)}}}var ll={line:0,character:0,offset:0},Kt={start:ll,end:ll};function gm(e){return e?Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>({name:t,value:n??"",range:Kt,nameRange:Kt,valueRange:Kt})):[]}function ym(e,t){return{kind:"element",name:e,attributes:gm(t),children:[],range:Kt,openTagRange:Kt,selfClosing:!0}}function bm(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function Ro(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=>Ro(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Ro(r)}`).join(",")}}`:JSON.stringify(String(e))}function hm(e){return Ro(e)}function Sm(e,t,n,r,o){let i=fe({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 cl(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 dl(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function ul(e,t){if(!t.startsWith("file://"))return;let n=dl(e),r=dl(Dt(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function pl(e={}){let t=e,n=new Map,r=new Map,o=al(),i=[],s=e.config?Tt(e.config).config:void 0;function a(){return t.getRuntimeState?.()}function l(){return a()?.workspace}function c(){return a()?.version??0}function d(y,b){let k=l(),x=c(),A=hm(b),j=r.get(y.uri);if(j&&j.documentVersion===y.version&&j.workspaceVersion===x&&j.document===y&&j.workspace===k&&j.configFingerprint===A)return j;let F=Sm(y,k,x,b,A);return r.set(y.uri,F),F}function u(y){if(y.parsed)return y.view||(y.view=ln(y.parsed,y.semantic,{config:y.config,policy:y.nodeUsagePolicy})),y.view}function p(y){return y.models||(y.models=Nt(y.semantic)),y.models}function m(y){let b=l();return b?b.documents.some(k=>k.isBtXml&&k.uri===y):!1}function g(y){let b=E.getResolvedConfig();if(!b)return!1;let k=l()?.rootDir??e.configBasePath,x=k?ul(k,y):void 0;return x!==void 0?tn(b,x):Jn(b,y)}function f(y,b){return y.languageId==="btcpp-xml"||b.parsed?.isBtXml===!0||cl(b.parsed)||g(y.uri)||m(y.uri)}function T(y,b){return y.languageId==="btcpp-xml"||b.parsed?.isBtXml===!0||cl(b.parsed)||m(y.uri)}function B(y){let b=n.get(y);if(!b)return;let k=E.getEffectiveConfigForDocument(b.uri),x=d(b,k);if(f(b,x))return{document:b,effectiveConfig:k,snapshot:x,emitDiagnostics:T(b,x)}}function R(y,b){let k=n.get(y);if(!k)return{diagnostics:[]};let x=d(k,b),A=u(x);return A?{view:A,diagnostics:x.diagnostics.diagnostics,partial:x.diagnostics.partial}:{diagnostics:x.diagnostics.diagnostics,partial:x.diagnostics.partial}}let E={openDocument(y,b,k=0,x="xml"){n.set(y,nt(y,b,k,x)),r.delete(y)},updateDocument(y,b,k=0,x="xml"){n.set(y,nt(y,b,k,x)),r.delete(y)},closeDocument(y){n.delete(y),r.delete(y)},getResolvedConfig(){return a()?.resolvedConfig??s},getEffectiveConfigForDocument(y){let b=this.getResolvedConfig();if(!b)return;let k=l()?.rootDir??e.configBasePath,x=k?ul(k,y):void 0;return x!==void 0?ee(b,x):Zn(b,y)},getDocument(y){return n.get(y)},getDiagnostics(y){let b=B(y);if(!b||!b.emitDiagnostics)return{diagnostics:[]};let k={diagnostics:b.snapshot.diagnostics.diagnostics};return b.snapshot.diagnostics.partial&&(k.partial=!0),k},getWorkspaceDiagnostics(){return{diagnostics:[...a()?.diagnostics??i]}},getSemanticDocumentView(y){let b=B(y);return b?R(y,b.effectiveConfig):{diagnostics:[]}},getNodeCatalog(y){let b=B(y);return b?{models:p(b.snapshot)}:{models:[]}},getSemanticNode(y,b){let k=B(y);return k?{node:R(y,k.effectiveConfig).view?.nodes.find(A=>A.nodeId===b)}:{}},getNodeUsageAt(y,b){let k=B(y);if(!k)return{};let x=u(k.snapshot);if(!k.snapshot.parsed||!x)return{};let A=dn(x,b);return A?{node:A,usage:A.usage}:{}},getNodeModelById(y,b){let k=b??n.keys().next().value;return k?{model:this.getNodeCatalog(k).models.find(A=>A.id===y)}:{}},getChildCapability(y,b,k){if(b==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let x=Oe(b);if(x==="Control")return{capable:!0,reason:"generic-control"};if(x==="Decorator")return{capable:!0,reason:"generic-decorator"};if(x==="Action"||x==="Condition")return{capable:!1,reason:"generic-leaf"};let A=B(y);if(!A)return{capable:!1,reason:"unknown-model"};let j=U(A.snapshot.semantic,{element:ym(b,k),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}:{...bm(j.model.model.kind),modelId:j.model.model.id}},getPortInfoAt(y,b){let k=B(y);if(!k)return{};let x=u(k.snapshot);if(!k.snapshot.parsed||!x)return{};let A=un(x,b),j=this.getNodeUsageAt(y,b),F=j.node,ve=A&&F?ge(k.snapshot.semantic,{element:F.usage.element,documentRoot:k.snapshot.parsed.root,attributeName:A.portName,uri:y,config:k.snapshot.config,policy:k.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 b=B(y);return b?o.getFormattingEdits({document:b.document,config:b.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(y,b,k){let x=B(y);return x?o.getCompletions({document:x.document,position:b,workspace:l(),triggerCharacter:k,config:x.effectiveConfig}):{items:[]}},getHover(y,b){let k=B(y);return k?o.getHover({document:k.document,position:b,workspace:l(),config:k.effectiveConfig}):{}},getDefinition(y,b){let k=B(y);return k?o.getDefinition({document:k.document,position:b,workspace:l(),config:k.effectiveConfig}):{locations:[]}},getReferences(y,b){let k=B(y);return k?o.getReferences({document:k.document,position:b,workspace:l(),config:k.effectiveConfig}):{locations:[]}},getDocumentSymbols(y){let b=B(y);return b?o.getDocumentSymbols({document:b.document,workspace:l(),config:b.effectiveConfig}):{symbols:[]}},getCodeActions(y,b,k){let x=B(y);return x?o.getCodeActions({document:x.document,range:b,diagnostics:k,workspace:l(),config:x.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return E}function km(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 ml(e,t){return t.map(n=>{let r=km(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 xm(e){return e.startsWith("file://")?e:ko(_e.resolve(e)).href}function Ae(e){return Rm(xm(e))}function Dm(e){return ko(_e.resolve(e)).href}function Im(e){let t=e.toLowerCase();return t.endsWith(".xml")||t.endsWith(".json")||t.endsWith("btxml.config.json")||t.includes("treenodesmodel")}function Cm(e){return e.replace(/\\/g,"/").replace(/\/$/,"")}function Bm(e,t){let n=Cm(e),r=Ae(t).replace(/\\/g,"/");return r===n?"":r.startsWith(`${n}/`)?r.slice(n.length+1):t}function Em(e,t,n,r){return e&&t&&n.startsWith("file://")?ee(e,Bm(t,n)):r}function Nm(e,t){let n=Dm(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 fl(e){return{ok:e.projectOk??e.ok,diagnostics:e.diagnostics}}function gl(e=process.cwd()){let t=_e.resolve(e);return{async readFile(n){return Ht.readFile(Ae(n),"utf8")},async exists(n){try{return await Ht.access(Ae(n),vm.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(n){try{let r=await Ht.stat(Ae(n));return{type:Tm(r),size:r.size}}catch{return}},async readDir(n){return(await Ht.readdir(Ae(n),{withFileTypes:!0})).map(o=>({name:o.name,type:o.isFile()?"file":o.isDirectory()?"directory":"other"}))},async realpath(n){let r=await Ht.realpath(Ae(n));return ko(_e.isAbsolute(r)?r:_e.resolve(t,r)).href}}}function yl(e={}){let t=e.host??gl(e.cwd),n,r=0,o,i,s;async function a(d={}){i=Object.keys(d).length>0?{...d}:void 0;let u=e.config,p=d.projectRoot||e.projectRoot||d.cwd||e.cwd||process.cwd(),m=d.cwd||e.cwd||p,g=Nm(d.host??t,p),f=await Wr({rootUri:ut(p),configUri:d.configPath||e.configPath?ut(_e.resolve(m,d.configPath||e.configPath||"")):void 0,host:g});if(!f.project)return n={version:++r,diagnostics:f.diagnostics,rawConfig:u},{ok:!1,projectOk:!1,diagnostics:f.diagnostics,rawConfig:u};let T=await qe(f.project,g),B=ml(p,T.documents),R=ml(p,T.externalModelDocuments),E=kr(f.project);if(!E)return n={version:++r,diagnostics:f.diagnostics,rawConfig:u},{ok:!1,projectOk:!1,diagnostics:f.diagnostics,rawConfig:u};let y=await Gr({project:f.project,documents:B,externalModelDocuments:R,resolveGraph:!0,host:g}),b=await zr({project:f.project,documents:B,externalModelDocuments:R,projectDiagnostics:[...f.diagnostics,...T.diagnostics],host:g}),k=[...f.diagnostics,...T.diagnostics,...y.diagnostics,...b.projectDiagnostics,...b.files.flatMap(x=>x.diagnostics)];return n={version:++r,diagnostics:k,rawConfig:u,resolvedConfig:E,workspace:{rootDir:Hr(f.project),documents:B,nodeDefinitionModels:y.nodeDefinitionModels}},{ok:f.ok&&y.ok,projectOk:b.ok,diagnostics:[...k],rawConfig:u,resolvedConfig:E,workspace:n.workspace}}function l(d=300){if(o&&clearTimeout(o),!s){let u,p;s={promise:new Promise((g,f)=>{u=g,p=f}),resolve(g){u?.(g)},reject(g){p?.(g)}}}return o=setTimeout(()=>{o=void 0;let u=s;a(i).then(p=>{u?.resolve(p)}).catch(p=>{u?.reject(p)}).finally(()=>{s===u&&(s=void 0)})},d),s.promise}let c=pl({config:e.config,getRuntimeState:()=>n});return{...c,getResolvedConfig(){return n?.resolvedConfig??c.getResolvedConfig()},getEffectiveConfigForDocument(d){return Em(this.getResolvedConfig(),n?.workspace?.rootDir,d,c.getEffectiveConfigForDocument(d))},async loadProject(d){return fl(await a(d))},async refreshProject(d){let u=await a(d);return{ok:u.ok,diagnostics:u.diagnostics}},notifyWatchedFileChanged(d){return Im(d)?l().then(u=>fl(u)):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 zT(e={}){return yl(e)}export{zT as createBtProjectEditorService,gl as createNodeWorkspaceHost,Ae as fileUriToPath,ut as pathToFileUri};
32
+ Resolves to SubTree model in \`${l.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let l=e.documentView?st(e.documentView,t.position):void 0;if(l?.declaredPort.status==="resolved")return{range:i.nameRange,contents:dl(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:dl(c.port)}}let a=e.documentView?cn(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:ul(l)}}return o&&s?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:ul(s.model.model)}:{}}function ho(e,t){return lr(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 wm(e,t){let n=new Set;for(let r of t){let o=ar(e.semantic).find(s=>vo(r,{uri:s.uri,range:s.idRange}));o&&n.add(o.id);let i=Pt(e.semantic).find(s=>s.kind==="SubTree"&&(vo(r,{uri:s.uri,range:s.idRange})||vo(r,{uri:s.uri,range:s.range})));i&&n.add(i.id)}return[...n]}function vo(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function Ro(e,t){let n=ft(e,t.position);if(n)return{locations:So(Ka(e,n).map(d=>({uri:d.uri,range:d.documentRange})))};let r=e.parsed?re({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(d=>d.portBindings).find(d=>d.attribute===i&&t.position.offset>=(d.attribute.valueContentRange??d.attribute.valueRange).start.offset&&t.position.offset<=(d.attribute.valueContentRange??d.attribute.valueRange).end.offset):void 0)?.blackboardReferences.find(d=>t.position.offset>=d.range.start.offset&&t.position.offset<=d.range.end.offset);if(a){let d=z({scope:a.scope,key:a.key});return{locations:So([...a.scope==="global"?po(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,d,e.document.uri):mo(e.documentView,d,e.document.uri),...a.scope==="global"?Ya(e,a.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:ho(e,i.value)};if(o&&i?.name==="ID"&&U(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:ho(e,i.value)};let l=Un(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents);if(l.length===0)return{locations:[]};let c=wm(e,l);return c.length>0?{locations:So(c.flatMap(d=>ho(e,d)))}:{locations:[]}}function Mm(e,t){return e.attributes.find(n=>n.name===t)}function ko(e){let t=e.name==="BehaviorTree"?Mm(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=>ko(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 To(e,t){return e.parsed?.root?{symbols:[ko(e.parsed.root)]}:{symbols:[]}}function Am(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function pl(e={}){return{getDiagnostics(t){return Am(go(fe(t,e),t))},getCompletions(t){return co(fe(t,e),t)},getHover(t){return bo(fe(t,e),t)},getDefinition(t){return fo(fe(t,e),t)},getReferences(t){return Ro(fe(t,e),t)},getDocumentSymbols(t){return To(fe(t,e),t)},getCodeActions(t){return Zr(fe(t,e),t)},getFormattingEdits(t){return yo(fe(t,e),t)}}}var ml={line:0,character:0,offset:0},Kt={start:ml,end:ml};function _m(e){return e?Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>({name:t,value:n??"",range:Kt,nameRange:Kt,valueRange:Kt})):[]}function Lm(e,t){return{kind:"element",name:e,attributes:_m(t),children:[],range:Kt,openTagRange:Kt,selfClosing:!0}}function Fm(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function xo(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=>xo(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${xo(r)}`).join(",")}}`:JSON.stringify(String(e))}function jm(e){return xo(e)}function Um(e,t,n,r,o){let i=fe({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 fl(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 gl(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function yl(e,t){if(!t.startsWith("file://"))return;let n=gl(e),r=gl(Ct(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function bl(e={}){let t=e,n=new Map,r=new Map,o=pl(),i=[],s=e.config?Dt(e.config).config:void 0;function a(){return t.getRuntimeState?.()}function l(){return a()?.workspace}function c(){return a()?.version??0}function d(y,b){let k=l(),x=c(),A=jm(b),F=r.get(y.uri);if(F&&F.documentVersion===y.version&&F.workspaceVersion===x&&F.document===y&&F.workspace===k&&F.configFingerprint===A)return F;let j=Um(y,k,x,b,A);return r.set(y.uri,j),j}function u(y){if(y.parsed)return y.view||(y.view=ln(y.parsed,y.semantic,{config:y.config,policy:y.nodeUsagePolicy})),y.view}function p(y){return y.models||(y.models=wt(y.semantic)),y.models}function m(y){let b=l();return b?b.documents.some(k=>k.isBtXml&&k.uri===y):!1}function g(y){let b=E.getResolvedConfig();if(!b)return!1;let k=l()?.rootDir??e.configBasePath,x=k?yl(k,y):void 0;return x!==void 0?tn(b,x):Qn(b,y)}function f(y,b){return y.languageId==="btcpp-xml"||b.parsed?.isBtXml===!0||fl(b.parsed)||g(y.uri)||m(y.uri)}function T(y,b){return y.languageId==="btcpp-xml"||b.parsed?.isBtXml===!0||fl(b.parsed)||m(y.uri)}function B(y){let b=n.get(y);if(!b)return;let k=E.getEffectiveConfigForDocument(b.uri),x=d(b,k);if(f(b,x))return{document:b,effectiveConfig:k,snapshot:x,emitDiagnostics:T(b,x)}}function R(y,b){let k=n.get(y);if(!k)return{diagnostics:[]};let x=d(k,b),A=u(x);return A?{view:A,diagnostics:x.diagnostics.diagnostics,partial:x.diagnostics.partial}:{diagnostics:x.diagnostics.diagnostics,partial:x.diagnostics.partial}}let E={openDocument(y,b,k=0,x="xml"){n.set(y,rt(y,b,k,x)),r.delete(y)},updateDocument(y,b,k=0,x="xml"){n.set(y,rt(y,b,k,x)),r.delete(y)},closeDocument(y){n.delete(y),r.delete(y)},getResolvedConfig(){return a()?.resolvedConfig??s},getEffectiveConfigForDocument(y){let b=this.getResolvedConfig();if(!b)return;let k=l()?.rootDir??e.configBasePath,x=k?yl(k,y):void 0;return x!==void 0?te(b,x):er(b,y)},getDocument(y){return n.get(y)},getDiagnostics(y){let b=B(y);if(!b||!b.emitDiagnostics)return{diagnostics:[]};let k={diagnostics:b.snapshot.diagnostics.diagnostics};return b.snapshot.diagnostics.partial&&(k.partial=!0),k},getWorkspaceDiagnostics(){return{diagnostics:[...a()?.diagnostics??i]}},getSemanticDocumentView(y){let b=B(y);return b?R(y,b.effectiveConfig):{diagnostics:[]}},getNodeCatalog(y){let b=B(y);return b?{models:p(b.snapshot)}:{models:[]}},getSemanticNode(y,b){let k=B(y);return k?{node:R(y,k.effectiveConfig).view?.nodes.find(A=>A.nodeId===b)}:{}},getNodeUsageAt(y,b){let k=B(y);if(!k)return{};let x=u(k.snapshot);if(!k.snapshot.parsed||!x)return{};let A=dn(x,b);return A?{node:A,usage:A.usage}:{}},getNodeModelById(y,b){let k=b??n.keys().next().value;return k?{model:this.getNodeCatalog(k).models.find(A=>A.id===y)}:{}},getChildCapability(y,b,k){if(b==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let x=Ve(b);if(x==="Control")return{capable:!0,reason:"generic-control"};if(x==="Decorator")return{capable:!0,reason:"generic-decorator"};if(x==="Action"||x==="Condition")return{capable:!1,reason:"generic-leaf"};let A=B(y);if(!A)return{capable:!1,reason:"unknown-model"};let F=U(A.snapshot.semantic,{element:Lm(b,k),documentRoot:A.snapshot.parsed?.root,uri:y,config:A.snapshot.config,policy:A.snapshot.nodeUsagePolicy});return F.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:F.nodeType}:{...Fm(F.model.model.kind),modelId:F.model.model.id}},getPortInfoAt(y,b){let k=B(y);if(!k)return{};let x=u(k.snapshot);if(!k.snapshot.parsed||!x)return{};let A=un(x,b),F=this.getNodeUsageAt(y,b),j=F.node,ve=A&&j?ge(k.snapshot.semantic,{element:j.usage.element,documentRoot:k.snapshot.parsed.root,attributeName:A.portName,uri:y,config:k.snapshot.config,policy:k.snapshot.nodeUsagePolicy}):void 0;return{node:j,binding:A,port:A?.resolution.status==="resolved"?A.resolution.port:void 0,usage:ve,nodeUsage:F.usage}},getFormattingEdits(y){let b=B(y);return b?o.getFormattingEdits({document:b.document,config:b.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(y,b,k){let x=B(y);return x?o.getCompletions({document:x.document,position:b,workspace:l(),triggerCharacter:k,config:x.effectiveConfig}):{items:[]}},getHover(y,b){let k=B(y);return k?o.getHover({document:k.document,position:b,workspace:l(),config:k.effectiveConfig}):{}},getDefinition(y,b){let k=B(y);return k?o.getDefinition({document:k.document,position:b,workspace:l(),config:k.effectiveConfig}):{locations:[]}},getReferences(y,b){let k=B(y);return k?o.getReferences({document:k.document,position:b,workspace:l(),config:k.effectiveConfig}):{locations:[]}},getDocumentSymbols(y){let b=B(y);return b?o.getDocumentSymbols({document:b.document,workspace:l(),config:b.effectiveConfig}):{symbols:[]}},getCodeActions(y,b,k){let x=B(y);return x?o.getCodeActions({document:x.document,range:b,diagnostics:k,workspace:l(),config:x.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return E}function qm(e,t){if(t.uri.startsWith("file://"))return t.uri;if(t.path?.startsWith("file://"))return t.path;let n=t.path&&!Le.isAbsolute(t.path)?t.path:t.uri;return mt(Le.resolve(e,n))}function hl(e,t){return t.map(n=>{let r=qm(e,n),o=n.path?.startsWith("file://")?_e(n.path):n.path;return{...n,uri:r,path:o}})}function $m(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function Xm(e){return e.startsWith("file://")?e:Do(Le.resolve(e)).href}function _e(e){return Vm(Xm(e))}function zm(e){return Do(Le.resolve(e)).href}function Wm(e){let t=e.toLowerCase();return t.endsWith(".xml")||t.endsWith(".json")||t.endsWith("btxml.config.json")||t.includes("treenodesmodel")}function Gm(e){return e.replace(/\\/g,"/").replace(/\/$/,"")}function Km(e,t){let n=Gm(e),r=_e(t).replace(/\\/g,"/");return r===n?"":r.startsWith(`${n}/`)?r.slice(n.length+1):t}function Hm(e,t,n,r){return e&&t&&n.startsWith("file://")?te(e,Km(t,n)):r}function Ym(e,t){let n=zm(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 Sl(e){return{ok:e.projectOk??e.ok,diagnostics:e.diagnostics}}function vl(e=process.cwd()){let t=Le.resolve(e);return{async readFile(n){return Ht.readFile(_e(n),"utf8")},async exists(n){try{return await Ht.access(_e(n),Om.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(n){try{let r=await Ht.stat(_e(n));return{type:$m(r),size:r.size}}catch{return}},async readDir(n){return(await Ht.readdir(_e(n),{withFileTypes:!0})).map(o=>({name:o.name,type:o.isFile()?"file":o.isDirectory()?"directory":"other"}))},async realpath(n){let r=await Ht.realpath(_e(n));return Do(Le.isAbsolute(r)?r:Le.resolve(t,r)).href}}}function Rl(e={}){let t=e.host??vl(e.cwd),n,r=0,o,i,s;async function a(d={}){i=Object.keys(d).length>0?{...d}:void 0;let u=e.config,p=d.projectRoot||e.projectRoot||d.cwd||e.cwd||process.cwd(),m=d.cwd||e.cwd||p,g=Ym(d.host??t,p),f=await Gr({rootUri:mt(p),configUri:d.configPath||e.configPath?mt(Le.resolve(m,d.configPath||e.configPath||"")):void 0,host:g});if(!f.project)return n={version:++r,diagnostics:f.diagnostics,rawConfig:u},{ok:!1,projectOk:!1,diagnostics:f.diagnostics,rawConfig:u};let T=await $e(f.project,g),B=hl(p,T.documents),R=hl(p,T.externalModelDocuments),E=xr(f.project);if(!E)return n={version:++r,diagnostics:f.diagnostics,rawConfig:u},{ok:!1,projectOk:!1,diagnostics:f.diagnostics,rawConfig:u};let y=await Kr({project:f.project,documents:B,externalModelDocuments:R,resolveGraph:!0,host:g}),b=await Wr({project:f.project,documents:B,externalModelDocuments:R,projectDiagnostics:[...f.diagnostics,...T.diagnostics],host:g}),k=[...f.diagnostics,...T.diagnostics,...y.diagnostics,...b.projectDiagnostics,...b.files.flatMap(x=>x.diagnostics)];return n={version:++r,diagnostics:k,rawConfig:u,resolvedConfig:E,workspace:{rootDir:Yr(f.project),documents:B,nodeDefinitionModels:y.nodeDefinitionModels}},{ok:f.ok&&y.ok,projectOk:b.ok,diagnostics:[...k],rawConfig:u,resolvedConfig:E,workspace:n.workspace}}function l(d=300){if(o&&clearTimeout(o),!s){let u,p;s={promise:new Promise((g,f)=>{u=g,p=f}),resolve(g){u?.(g)},reject(g){p?.(g)}}}return o=setTimeout(()=>{o=void 0;let u=s;a(i).then(p=>{u?.resolve(p)}).catch(p=>{u?.reject(p)}).finally(()=>{s===u&&(s=void 0)})},d),s.promise}let c=bl({config:e.config,getRuntimeState:()=>n});return{...c,getResolvedConfig(){return n?.resolvedConfig??c.getResolvedConfig()},getEffectiveConfigForDocument(d){return Hm(this.getResolvedConfig(),n?.workspace?.rootDir,d,c.getEffectiveConfigForDocument(d))},async loadProject(d){return Sl(await a(d))},async refreshProject(d){let u=await a(d);return{ok:u.ok,diagnostics:u.diagnostics}},notifyWatchedFileChanged(d){return Wm(d)?l().then(u=>Sl(u)):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 ux(e={}){return Rl(e)}export{ux as createBtProjectEditorService,vl as createNodeWorkspaceHost,_e as fileUriToPath,mt as pathToFileUri};