@abco20/btxml-checker 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/editor.js CHANGED
@@ -1,30 +1,30 @@
1
- import{z as xt}from"zod";var b={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidGlobalBlackboardIdentifier:"BT411_INVALID_GLOBAL_BLACKBOARD_IDENTIFIER",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},pn=Object.values(b).sort();var ka=xt.object({subTreePorts:xt.enum(["loose","strict"]).optional()}).strict(),xa=xt.object({allowStringEntryCompatibility:xt.boolean().optional()}).strict(),Br={"script/valid-syntax":{code:b.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:b.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:b.AssignmentToUnknownVariable,codes:[b.AssignmentToUnknownVariable,b.InvalidCompoundAssignment,b.ScriptVariableTypeMismatch,b.InvalidGlobalBlackboardIdentifier],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:b.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:b.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:b.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:b.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:b.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:b.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:b.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:b.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:b.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:b.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:b.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:b.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:b.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:b.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:b.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:b.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:b.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:b.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:b.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:b.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:b.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:b.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:b.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:b.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:b.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:b.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:b.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:b.UnknownPort,defaultSeverity:"warn",optionsSchema:ka,options:[{name:"subTreePorts",type:'"loose" | "strict"',default:"loose",description:"Controls whether SubTree remap attributes are checked strictly."}],description:"Reports ports that are not declared by the resolved node model."},"model/valid-port-value":{code:b.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:b.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:xa,options:[{name:"allowStringEntryCompatibility",type:"boolean",default:"true",description:"Treat std::string blackboard entries as runtime-compatible with other port types, matching BT.CPP's existing-entry special case."}],description:"Blackboard entries must not mix incompatible resolved port types."},"model/valid-port-default-value":{code:b.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:b.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:b.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:b.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:b.InvalidChildCount,defaultSeverity:"warn",description:"Child count must match the expected count for the node kind (Action/Condition: 0, Decorator: 1, Control: >=1, special builtins: fixed range)."},"model/no-conflicting-definition":{code:b.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:b.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:b.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var It=["off","info","warn","error"];var Dr={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"}}},Ia={files:{include:["**/*.xml"],ignore:["build/**","install/**","log/**","node_modules/**",".git/**"],useGitignore:!0,followSymlinks:!1,maxSize:5*1024*1024},resolver:{entrypoints:[],includes:{elements:[{name:"include",attribute:"path",base:"file"}],variables:{},allowOutsideRoot:!1,maxDepth:32,maxFiles:1e3},behaviorTreeIds:"workspace-unique"},models:{builtins:["btcpp-v4"],files:[],augmentations:[],definitions:[],inline:{}},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function Le(){return structuredClone(Ia)}function We(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 I={Error:"error",Warning:"warning",Info:"info"};function W(e,t,n,r,o="",i,a){return{code:e,severity:t,message:n,uri:o,...r?{range:r}:{},...i?{details:i}:{},...a?{data:a}:{}}}function Oe(e,t,n){return{line:e,character:t,offset:n}}function T(e,t){return{start:e,end:t}}function z(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}function Ca(e){let t=[0];for(let n=0;n<e.length;n+=1)e[n]===`
2
- `&&t.push(n+1);return t}function mn(e,t,n){return Math.min(Math.max(e,t),n)}function Ve(e,t,n=0,r="xml"){let o=Ca(t),i=u=>{let d=mn(u,0,t.length),c=0,p=o.length;for(;c<p;){let h=Math.floor((c+p)/2);o[h]>d?p=h:c=h+1}let m=Math.max(0,c-1);return{line:m,character:d-o[m],offset:d}},a=u=>{let d=mn(u.line,0,Math.max(0,o.length-1)),c=o[d],p=d+1<o.length?o[d+1]:t.length;return mn(c+u.character,c,p)};return{uri:e,languageId:r,version:n,text:t,lineOffsets:o,positionAt:i,offsetAt:a,getText:u=>u?t.slice(a(u.start),a(u.end)):t}}var Ba=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function fn(e){return{ok:!0,reference:e}}function ge(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Er(e){return Ba.test(e)}function Nr(e){if(!e)return ge("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?Er(t)?{ok:!0,scope:"global",key:t}:ge("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):ge("empty-key",e,"Global blackboard reference key must not be empty")}return Er(e)?{ok:!0,scope:"local",key:e}:ge("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function F(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return fn({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return ge("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return ge("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let r=n.slice(1,-1).trim(),o=Nr(r);return o.ok?fn({scope:o.scope,key:o.key,raw:n,syntax:"braced"}):o}function Ye(e){let{rawName:t}=e;if(!t.startsWith("@"))return ge("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Nr(t);return n.ok?n.scope!=="global"?ge("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):fn({scope:n.scope,key:n.key,raw:t,syntax:"script"}):n}function ke(e){return e.scope==="global"?`{@${e.key}}`:`{${e.key}}`}function $(e){return`${e.scope}:${e.key}`}var Da={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Ea(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function le(e,t){return e.attributes.find(n=>n.name===t)}function Na(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function wa(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Ma(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function wr(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 Pa(e,t,n){let r=wr(e,t),o=wr(r,n);return{start:r,end:o}}function Mr(e,t,n,r){for(let o of e.attributes||[]){let i=o.valueContentRange??o.valueRange,a=r.slice(i.start.offset,i.end.offset),s=u=>{let d=F({portName:o.name,rawValue:u.parsedRaw});if(!d.ok)return;let c=d.reference.raw.length;t.push({raw:d.reference.raw,key:d.reference.key,scope:d.reference.scope,identity:$(d.reference),syntax:d.reference.syntax,attributeName:o.name,element:e,uri:n,range:Pa(i.start,a.slice(0,u.parsedOffset),d.reference.raw.slice(0,c))})},l=F({portName:o.name,rawValue:a});if(l.ok){let u=Math.max(0,a.indexOf(l.reference.raw));s({parsedRaw:l.reference.raw,parsedOffset:u});continue}for(let u of a.matchAll(/\{[^}]*\}/g)){let d=u[0],c=u.index??0;s({parsedRaw:d,parsedOffset:c})}}for(let o of e.children||[])o.kind==="element"&&Mr(o,t,n,r)}function Aa(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!Na(i.name))continue;let a=le(i,"ID");if(!a)continue;let s=[];for(let l of i.children||[]){if(l.kind!=="element"||l.name!=="input_port"&&l.name!=="output_port"&&l.name!=="inout_port")continue;let u=le(l,"name"),d=le(l,"type"),c=le(l,"default")||le(l,"default_value"),p=le(l,"enum"),m=(l.children||[]).filter(D=>D.kind==="text").map(D=>D.text).join("").trim()||void 0,h=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",S=(h==="input"||h==="inout")&&c===void 0;s.push({source:n,direction:h,name:u?u.value:"",type:d?.value||void 0,defaultValue:c?.value||void 0,description:m,required:S,element:l,uri:t,range:l.range,nameRange:u?.range,enum:p?.value?p.value.split(";"):void 0})}o.push({id:a.value,kind:i.name,source:n,sourceMeta:{sourceKind:n,file:t,range:i.range},editable:r,ports:s,element:i,uri:t,range:i.range,elementRange:i.range,idRange:a.range})}return o}function _a(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let o=le(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 La(e,t){let n=[],r=(o,i,a=!1)=>{if(a)return;let s=o.name==="BehaviorTree"?le(o,"ID")?.value??i:i,l=o.name==="TreeNodesModel";if(o.name==="SubTree"){let u=le(o,"ID");u&&n.push({id:u.value,uri:t,element:o,range:o.range,elementRange:o.range,idRange:u.range,parentBehaviorTreeId:s,attributes:o.attributes})}for(let u of o.children||[])u.kind==="element"&&r(u,s,l)};if(e.name==="TreeNodesModel")return n;for(let o of e.children||[])o.kind==="element"&&r(o);return n}function Oa(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Pr(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 Va(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Pr),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 qa(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Ua(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 Fa(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(Oa),subtreeReferences:e.subtreeReferences.map(qa),blackboardReferences:e.blackboardReferences.map(Ua),treeNodesModel:e.treeNodesModel.map(Va),genericSubTreePorts:e.genericSubTreePorts.map(Pr),rootMainTreeToExecute:wa(e.rootMainTreeToExecute)}}function $a(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Xa(e){return W(Da.DuplicateNodeModelId,I.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 ja(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,a=Ea(e),s=Ma(e),l=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",u=o&&e.kind!=="model-document"?_a(o,r):[],d=[],c=[],p=o?o.name==="TreeNodesModel"?[o]:o.children.filter(E=>E.kind==="element"&&E.name==="TreeNodesModel"):[];for(let E of p){let C=Aa(E,r,s,l),N=new Map;for(let f of C)$a({node:f,treeNodesModel:d,genericSubTreePorts:c})||(N.has(f.id)?n.push(Xa(f)):N.set(f.id,f))}let m=o?La(o,r):[],h=o?(()=>{let E=[];return Mr(o,E,r,e.originalText),E})():[],S=o?le(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Fa({uri:r,path:t?.path??e.path,isBtXml:i,kind:a,behaviorTrees:u,subtreeReferences:m,blackboardReferences:h,treeNodesModel:d,genericSubTreePorts:c,rootMainTreeToExecute:S?{uri:r,range:S.range,value:S.value}:void 0}),extractedBehaviorTrees:u,extractedTreeNodesModel:d,extractedSubTreeReferences:m,extractedBlackboardReferences:h},diagnostics:n}}function Ar(e,t){let{extracted:n,diagnostics:r}=ja(e,t);return{model:n.publicModel,diagnostics:r}}function gn(e,t){return Ar(e,t)}var _r=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),za=new Set([..._r,"_autoremap","_description","__shared_blackboard"]),Ka=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 yn(e){return _r.has(e)}function Lr(e){return za.has(e)}function bn(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(Lr(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=Ka.get(t);if(r)return r}}function Or(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 Sn(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>Or(n,r))}}var Ga=[{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"]}],He=new Map,Vr=new Map;for(let e of Ga){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Vr.set(e.name,t),He.set(e.name,e.name);for(let n of e.aliases)He.set(n,e.name)}function Wa(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 Rn(e){return He.get(e)??e}function Ya(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 Ze(e){return He.get(e)}function qe(e=[]){let t=new Map,n=new Map(He);for(let r of Vr.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 a=Rn(i.canonical??o),l=t.get(a)??Wa(o,a,i);l.name=o,l.kind=i.kind,l.canonical=a,l.source="augmentation",l.validate=i.validate??l.validate,l.aliases.add(o),l.aliases.add(a);for(let u of i.aliases??[])l.aliases.add(u);for(let u of i.compatibleWith??[])l.compatibleWith.add(u);t.set(a,l),n.set(o,a),n.set(a,a);for(let u of i.aliases??[])n.set(u,a)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(o=>n.get(o)??Rn(o))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,o])=>[r,Ya(o)])),namesToCanonical:n}}function oe(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Rn(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Ct(e,t){return oe(e,t)?.canonical}function Je(e,t,n){let r=oe(e,t),o=oe(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 qr=[{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:[]}],Ur={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Fr=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"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:[]}],$r={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Xr=[{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:[]}],jr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var zr=["4.6.2","4.8.2","4.9.0"],vn="4.9.0",Qe={"4.6.2":{models:qr,genericSubTreeModel:Ur},"4.8.2":{models:Fr,genericSubTreeModel:$r},"4.9.0":{models:Xr,genericSubTreeModel:jr}};var Kr=zr.map(e=>`btcpp-v${e}`),et=["btcpp-v4",...Kr],Gr=`btcpp-v${vn}`;function Wr(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 Ha(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Wr)}))}function Yr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Wr)}}function Za(){let e={};for(let[t,n]of Object.entries(Qe))e[`btcpp-v${t}`]=Ha(n.models);return e}function Ja(){let e={};for(let[t,n]of Object.entries(Qe))e[`btcpp-v${t}`]=Yr(n.genericSubTreeModel);return e}var Qa=Za(),es=Ja();function ts(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Qe,t)}function Hr(e){return e==="btcpp-v4"?Gr:e}function ns(e){return e==="btcpp-v4"?vn:e.replace(/^btcpp-v/,"")}function Zr(e){if(e&&e!=="btcpp-v4"&&!ts(e))throw new Error(`unsupported builtin model set: ${e}`)}function Tn(e="btcpp-v4"){Zr(e);let t=Hr(e);return Qa[t].map(r=>Jr(r))}function hn(e="btcpp-v4"){Zr(e);let t=es[Hr(e)]??Yr(Qe[ns(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Jr(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 a=(t.defaultValue??"").localeCompare(n.defaultValue??"");return a!==0?a:(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 Bt(e,t){let n=tt(e),r=tt(t);return JSON.stringify(n)===JSON.stringify(r)}function kn(e,t){if(Bt(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(s=>[s.name,s])),i=!1,a=!1;for(let s of n.ports){let l=o.get(s.name);if(!l){a=!0;continue}(s.direction!==l.direction||s.type!==l.type||s.required!==l.required)&&(a=!0);let u=s.enum?JSON.stringify(s.enum):"",d=l.enum?JSON.stringify(l.enum):"";u!==d&&(a=!0),s.description!==l.description&&(a=!0),s.defaultValue!==l.defaultValue&&(i=!0)}return a?"ports":i?"port-default":"mixed"}import{z as X}from"zod";var Qr=X.object({direction:X.enum(["input","output","inout"]).optional(),type:X.string().optional(),required:X.boolean().optional(),default:X.string().optional(),description:X.string().optional(),enum:X.array(X.string()).optional()}).strict(),Dt=X.object({kind:X.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:X.record(X.string(),Qr).optional(),description:X.string().optional()}).strict(),rs=X.object({nodes:X.record(X.string(),Dt)}).strict();import{z as v}from"zod";var eo=v.enum(["off","info","warn","error"]),to=v.union([eo,v.tuple([eo,v.record(v.string(),v.unknown())])]),os=v.object({include:v.array(v.string()).optional(),ignore:v.array(v.string()).optional(),useGitignore:v.boolean().optional(),followSymlinks:v.boolean().optional(),maxSize:v.number().int().positive().optional()}).strict(),is=v.string(),as=v.object({name:v.string(),attribute:v.string(),base:v.enum(["file","project-root"]).optional()}).strict(),ss=v.object({elements:v.array(as).optional(),variables:v.record(v.string(),v.string()).optional(),allowOutsideRoot:v.boolean().optional(),maxDepth:v.number().int().min(1).optional(),maxFiles:v.number().int().min(1).optional()}).strict(),ls=v.object({entrypoints:v.array(is).optional(),includes:ss.optional(),behaviorTreeIds:v.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),us=v.object({builtins:v.array(v.enum(et)).optional(),files:v.array(v.string()).optional(),augmentations:v.array(v.string()).optional(),definitions:v.array(v.string()).optional(),inline:v.record(v.string(),Dt).optional()}).strict(),no=v.object({inline:v.enum(["allow","deny"]).optional()}).strict(),ds=v.object({enabled:v.boolean().optional(),rules:v.record(v.string(),to).optional(),baseline:v.string().optional(),suppressions:no.optional()}).strict(),cs=v.object({rules:v.record(v.string(),to).optional(),suppressions:no.optional()}).strict(),ro=v.object({indentWidth:v.number().int().min(1).max(8).optional(),xmlDeclaration:v.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:v.boolean().optional(),lineEnding:v.enum(["lf","crlf","auto"]).optional()}).strict(),ps=v.object({files:v.array(v.string()),linter:cs.optional(),formatter:ro.optional()}).strict(),oo=v.object({$schema:v.string().optional(),strict:v.boolean().optional(),files:os.optional(),resolver:ls.optional(),models:us.optional(),linter:ds.optional(),formatter:ro.optional(),overrides:v.array(ps).optional()}).strict();function so(e){return e.flatMap(ms)}function ms(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=io([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=io(e.path);return lo(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 io(e){return e.map(String).join(".")||void 0}function lo(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(ao);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(ao):!1}function ao(e){return typeof e=="object"&&e!==null&&lo(e)}function uo(e){let t=oo.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:so(t.error.issues)}}function fs(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 gs(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 ys(e){return e.map(t=>W(t.code,t.severity==="error"?I.Error:I.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function bs(e){let t=[],n=Le(),{$schema:r,strict:o,overrides:i,...a}=e;o&&(n=We(n,Dr)),n=We(n,a),n.overrides=(i??[]).map(l=>({files:l.files,linter:gs(l.linter),formatter:fs(l.formatter)}));let s=!t.some(l=>l.severity===I.Error);return{config:n,diagnostics:t,ok:s}}function xn(e){let t=uo(e);return t.ok?bs(t.value):{ok:!1,config:Le(),diagnostics:ys(t.diagnostics)}}function Ss(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 Et(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),o=r?t.slice(1):t,a=Ss(o).test(n);return r?!a:a}function co(e,t){return e.overrides.filter(n=>n.files.some(r=>Et(t,r)))}function nt(e){return e.replaceAll("\\","/")}function Rs(e){try{return decodeURIComponent(e)}catch{return e}}function rt(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Rs(t.pathname);return/^\/[A-Za-z]:/.test(n)?nt(n.slice(1)):t.host?nt(`//${t.host}${n}`):nt(n)}function Nt(e,t){let n=nt(t);return e.files.ignore.some(r=>Et(n,r))?!1:e.files.include.some(r=>Et(n,r))}function In(e,t){return Nt(e,rt(t))}function wt(e,t){let n=nt(t),r=co(e,n),o=e;for(let i of r)o=We(o,{linter:i.linter,formatter:i.formatter});return{files:o.files,resolver:o.resolver,models:o.models,linter:o.linter,formatter:o.formatter}}function Cn(e,t){return wt(e,rt(t))}function ye(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 Mt(e){if(typeof e=="string")return It.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&It.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 po(e,t){if(t)return Ct(e,t)}function mo(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function fo(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return W(e.code,I.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function vs(e,t,n,r,o){let i=n.effectiveType??n.type,a=n.originalType??n.type,s={...n,originalType:a,effectiveType:i,typeSource:n.typeSource??mo(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{...s,type:s.effectiveType};let u=po(e,l.from),d=po(e,i);return u&&u!==d?(o.push(fo({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})),{...s,type:s.effectiveType}):{...s,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function Ts(e,t,n,r){let o=new Map(t.ports.map(i=>[i.name,i]));for(let[i,a]of Object.entries(n.ports??{})){let s=o.get(i);if(!s){r.push(fo({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,vs(e,t,s,a,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function hs(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??mo(e)}}function go(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,a])=>[i,{...a,ports:a.ports.map(hs)}]));for(let i of n)for(let[a,s]of Object.entries(i.augment??{})){let l=o.get(a);if(!l){r.push(W("BT117_AUGMENT_TARGET_NOT_FOUND",I.Error,`augmentation target node \`${a}\` not found`,void 0,i.uri??"",{primaryLabel:`augmentation target \`${a}\` 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:a,filePath:i.path}));continue}o.set(a,Ts(t,l,s,r))}return{modelsById:o,diagnostics:r}}function So(e){return ot("builtin",0,!1,e)}function Ro(e){return ot("xml-tree-nodes-model",10,!0,e)}function vo(e){return ot("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function To(e){return ot("node-definition-file",20,!0,e)}function ho(e){return ot("config-inline",30,!0,e)}function ot(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>ko(o,e,n&&o.editable!==!1))}}function ks(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function ko(e,t,n){let r=ks(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 Ue(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 yo(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 xs(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,a]of r)o.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:yo(a)});for(let[i,a]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:yo(a)});for(let[i,a]of r){let s=o.get(i);if(!s)continue;a.direction!==s.direction&&n.push({kind:"port-direction",portName:i,left:a.direction,right:s.direction}),a.type!==s.type&&n.push({kind:"port-type",portName:i,left:a.type,right:s.type}),a.required!==s.required&&n.push({kind:"port-required",portName:i,left:a.required,right:s.required}),a.defaultValue!==s.defaultValue&&n.push({kind:"port-default",portName:i,left:a.defaultValue,right:s.defaultValue});let l=a.enum?JSON.stringify([...a.enum].sort()):"",u=s.enum?JSON.stringify([...s.enum].sort()):"";l!==u&&n.push({kind:"port-enum",portName:i,left:a.enum?[...a.enum].sort():void 0,right:s.enum?[...s.enum].sort():void 0}),a.description!==s.description&&n.push({kind:"port-description",portName:i,left:a.description,right:s.description})}return n}function bo(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(Bt(o,r))continue;let i=kn(o,r),a=xs(o,r),s;if(i==="port-default"){let l=new Map(o.ports.map(p=>[p.name,p])),u=r.ports.find(p=>{let m=l.get(p.name);return m&&m.defaultValue!==p.defaultValue}),d=u?.name??"unknown",c=[Ue(o,0),Ue(r,1)];s={kind:"port-default-conflict",nodeId:r.id,portName:d,sources:[{source:Ue(o,0),value:l.get(d)?.defaultValue},{source:Ue(r,1),value:u?.defaultValue}]},t.push({id:r.id,definitions:[o,r],sources:c,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:s,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}else{let l=[Ue(o,0),Ue(r,1)];s={kind:"node-model-conflict",nodeId:r.id,sources:l,differences:a},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:s,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}}return n}function Is(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 xo(e){let t=[],n=new Map,r=new Map,o=[...e].sort((s,l)=>s.precedence-l.precedence),i=new Map,a=new Map;for(let s of o){let l=i.get(s.precedence)??[],u=s.models.map(d=>ko(d,s.kind,s.editable&&d.editable!==!1));l.push(...u),i.set(s.precedence,l);for(let d of u)a.set(d.id,s.precedence)}for(let[s,l]of[...i.entries()].sort((u,d)=>u[0]-d[0])){let u=l.filter(m=>a.get(m.id)===s),d=l.filter(m=>a.get(m.id)!==s),c=bo(d,[]);for(let[m,h]of bo(u,t))c.set(m,h);let p=new Set(l.map(m=>m.id));for(let m of p)a.get(m)===s&&n.set(m,l.filter(h=>h.id===m));for(let[m,h]of c)r.set(m,Is(r.get(m),h))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Cs(e){return et.includes(e)}function Bs(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:qe(),augmentations:[]}}function Ds(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function Es(e,t,n){for(let r of new Set(n))if(Cs(r)){for(let o of Tn(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...hn(r))}}function Ns(e,t,n,r,o){for(let i of o){let a=gn(i,{uri:i.uri,path:i.path}),s=a.model;t.push(...a.diagnostics),e.documents.set(i.uri,s);for(let l of s.behaviorTrees)Ds(e.behaviorTreesById,l.id,l);i.kind==="model-document"?r.push(...s.treeNodesModel):n.push(...s.treeNodesModel),e.genericSubTreePorts.push(...s.genericSubTreePorts)}}function ws(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 Ms(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=ws(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function Ps(e,t,n,r,o){e.modelLayers.push(So(t),Ro(n),vo(r)),o.models?.length&&e.modelLayers.push(To([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Bn(e,t){return As(e,t)}function As(e,t){let n=Bs(),r=[],o=[],i=[],a=[];Es(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=qe(t.augmentations??[]),Ns(n,r,i,a,e),Ms(n),Ps(n,o,i,a,t);let s=t.config.models.inline;if(s){let d=[];for(let[c,p]of Object.entries(s))d.push(Sn(c,p));n.modelLayers.push(ho(d))}let l=xo(n.modelLayers),u=go(l.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=l.nodeModelsById,n.mergedNodeModelsById=u.modelsById,n.modelConflicts=l.conflicts,r.push(...u.diagnostics),{ok:r.every(d=>d.severity!==I.Error),index:n,diagnostics:r}}var Io={unknownSubTreePorts:"allow"};function Co(e){return{...Io,...e}}var _s=["Action","Condition","Control","Decorator"],Ls=new Set(_s);var Os=new Set(["input_port","output_port","inout_port"]);function it(e){return Ls.has(e)}function xe(e){return it(e)?e:void 0}function Pt(e,t){return e.attributes.find(n=>n.name===t)?.value}function Dn(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&Dn(n,t))return!0;return!1}function Bo(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return Dn(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&Dn(n,t))return!0;return!1}function At(e){return Os.has(e.name)}function Do(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":it(e.name)?"generic-node":At(e)?"unknown-xml":"concrete-node"}function _t(e){if(e.name==="SubTree")return Pt(e,"ID")||"SubTree";if(it(e.name))return Pt(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||At(e)))return e.name}function Y(e){return e.typeRegistry}function G(e,t){return oe(Y(e),t)}function be(e,t,n){return Je(Y(e),t,n)}function at(e,t){return e.documents.get(t)}function J(e,t){return e.behaviorTreesById.get(t)??[]}function En(e,t){return e.behaviorTreesById.has(t)}function Nn(e){return[...e.behaviorTreesById.values()].flat()}function wn(e,t){return Eo(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function st(e){return[...e.behaviorTreesById.keys()]}function Eo(e){return[...e.documents.values()]}function Q(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function lt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function Lt(e){return[...e.mergedNodeModelsById.values()]}function Mn(e){return e.modelLayers.flatMap(t=>t.models)}function Pn(e){return[...e.mergedNodeModelsById.values()]}function An(e){return[...e.genericSubTreePorts]}function ut(e){return[...e.augmentations]}function dt(e){return e.modelConflicts}function ct(e,t){let{id:n,fileLocalUri:r,config:o}=t,i=J(e,n);if(i.length>0){if((o?.resolver?.behaviorTreeIds==="file-local-first"||o?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let u=i.filter(d=>d.uri===r);u.length>0&&(i=u)}let s=Q(e,n),l=s?.kind==="SubTree"?[s]:[];return i.length===1?{status:"resolved",kind:"behavior-tree",treeId:i[0].id,behaviorTree:i[0]}:{status:"ambiguous",candidates:[...i.map(u=>u.id),...l.map(u=>u.id)],behaviorTrees:i,definitions:l}}let a=Q(e,n);return a?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:a.id,model:a}:{status:"unresolved",id:n}}function _n(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Q(e,t);if(n){let o=dt(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=lt(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 Ln(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function On(e){let t=An(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return Ln([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Vn(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}:yn(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 L(e,t){let n=Co(t.policy),r=t.element,o=Do(r),i=Bo(t.documentRoot,r);if((t.isModelDefinition||i&&(o==="generic-node"||o==="subtree"))&&(o="model-definition"),i&&At(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 a=_t(r);if(o!=="subtree"){let m=_n(e,a),h=On({index:e,tagForm:o,model:m}),S=r.attributes.map(D=>Vn({attribute:D,ports:h,allowsArbitraryAttributes:!1,model:m}));return{element:r,tagName:r.name,tagForm:o,nodeType:a,model:m,ports:h,allowsArbitraryAttributes:!1,portUsages:S}}let s=Pt(r,"ID"),l=s?ct(e,{id:s,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},u={status:"unresolved",nodeType:s},d=!1;if(l.status==="resolved"&&l.kind==="node-model")u={status:"resolved",model:l.model};else if(l.status==="resolved"&&l.kind==="behavior-tree"){let m=_n(e,l.treeId);m.status==="resolved"&&m.model.kind==="SubTree"?u=m:d=n.unknownSubTreePorts==="allow"}else l.status==="ambiguous"&&l.definitions.length>0?u=l.definitions.length===1?{status:"resolved",model:l.definitions[0]}:{status:"ambiguous",nodeType:s??"SubTree",candidates:l.definitions}:d=n.unknownSubTreePorts==="allow";let c=On({index:e,tagForm:o,model:u,subtreeModelPorts:l.status==="ambiguous"?Ln(l.definitions.flatMap(m=>m.ports)):void 0}),p=r.attributes.map(m=>Vn({attribute:m,ports:c,allowsArbitraryAttributes:d,model:u,unknownModelPortStatus:!d&&u.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:o,nodeType:a,model:u,subtree:{id:s,target:l},ports:c,allowsArbitraryAttributes:d,portUsages:p}}function ue(e,t){return L(e,t).portUsages.find(r=>r.name===t.attributeName)}function Us(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Fs(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function No(e,t){let n=e.line,r=e.character,o=e.offset;for(let i of t){if(o+=i.length,i===`
5
- `){n+=1,r=0;continue}r+=i.length}return{line:n,character:r,offset:o}}function qn(e,t,n){let r=No(e,t),o=No(r,n);return{start:r,end:o}}function Mo(e,t,n){let r=n.valueContentRange||n.valueRange,o=e.originalText.slice(r.start.offset,r.end.offset),i=[];for(let a of o.matchAll(/\{[^}]*\}/g)){let s=a[0],l=a.index??0,u=F({portName:t,rawValue:s});if(u.ok){i.push({raw:s,key:u.reference.key,scope:u.reference.scope,identity:$(u.reference),range:qn(r.start,o.slice(0,l),s),syntax:u.reference.syntax==="shorthand"?"shorthand":"braced"});continue}i.push({raw:s,key:s,scope:"local",identity:`invalid:${s}`,range:qn(r.start,o.slice(0,l),s),syntax:"invalid"})}if(i.length===0){let a=F({portName:t,rawValue:o});if(a.ok){let s=Math.max(0,o.indexOf(a.reference.raw));return i.push({raw:a.reference.raw,key:a.reference.key,scope:a.reference.scope,identity:$(a.reference),range:qn(r.start,o.slice(0,s),a.reference.raw),syntax:a.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 $s(e,t){return Us(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Po(e){let t=[];for(let n of e)t.push(n),t.push(...Po(n.children));return t}function Xs(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function js(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function zs(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function Ao(e){return Se(e,"name")?.value}function Ks(e){return Ao(e)||Se(e,"ID")?.value||e.name}function Gs(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${Ks(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function _o(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 Lo(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 Ws(e){return e.status==="resolved"?e.port.direction:"unknown"}function Ys(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 wo(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:Ws(t.usage),valueKind:Ys(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 Hs(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 Se(e,t){return e.attributes.find(n=>n.name===t)}function Zs(e){return e.root?Se(e.root,"main_tree_to_execute")?.value:void 0}function Js(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 ee(e,t){let n=t.semantic,r=Js(e.root),o=Fs(e).map(l=>({id:Se(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),i=[],a=[],s=(l,u,d,c)=>{let p=L(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(l)}),m=_o(p),h={element:l,path:c,tagName:l.name,kind:$s(l,p),model:m,usage:p,portBindings:[],children:[],parent:d,behaviorTree:u};if(h.portBindings=p.portUsages.filter(S=>S.status!=="reserved-attribute").map(S=>({name:S.name,value:S.value,attribute:S.attribute,declaredPort:Lo(S),usage:S,blackboardReferences:Mo(e,S.name,S.attribute)})),h.children=l.children.filter(S=>S.kind==="element").map((S,D)=>s(S,u,h,[...c,D])),l.name==="SubTree"){let S=Se(l,"ID")?.value;i.push({node:h,id:S,target:p.subtree?.target??{status:"unresolved",id:S},portRemaps:h.portBindings})}return h};for(let l of o){let u=l.element.children.filter(d=>d.kind==="element").map((d,c)=>s(d,l,void 0,[c]));l.rootNode=u[0],l.nodes=Po(u),a.push(...l.nodes)}return{document:e,behaviorTrees:o,subtreeCalls:i,nodes:a}}function Ot(e,t,n){let r=ee(e,{semantic:t,config:n?.config,policy:n?.policy}),o=js(r.behaviorTrees),i=r.nodes.map(u=>{let d=o(u),c=u.usage,p=c.nodeType??u.tagName,m=Ao(u.element),h=Se(u.element,"ID")?.value,S=Gs(u);return{nodeId:d,path:u.path,instancePath:S,tagName:u.tagName,nodeType:p,name:m,idAttr:h,kind:u.kind,range:u.element.range,fullRange:u.element.fullRange,nameRange:u.element.nameRange,parentNodeId:u.parent?o(u.parent):void 0,childNodeIds:u.children.map(o),behaviorTreeId:u.behaviorTree.id,attributes:u.element.attributes.map(zs),identityCandidates:Hs({name:m,idAttr:h,nodeType:p,tagName:u.tagName,instancePath:S,behaviorTreeId:u.behaviorTree.id,nodeId:d}),model:_o(c),usage:c,portBindings:c.portUsages.filter(D=>D.status!=="reserved-attribute").map(D=>wo(d,{name:D.name,value:D.value,attribute:D.attribute,declaredPort:Lo(D),usage:D,blackboardReferences:Mo(e,D.name,D.attribute)}))}}),a=r.behaviorTrees.map(u=>({id:u.id,range:u.element.range,idRange:Se(u.element,"ID")?.valueContentRange,rootNodeId:u.rootNode?o(u.rootNode):void 0,nodeIds:u.nodes.map(o)})),s=r.subtreeCalls.map(u=>({nodeId:o(u.node),callId:u.id,range:u.node.element.range,target:u.target,portBindings:u.portRemaps.map(d=>wo(o(u.node),d))})),l=e.root?Se(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:Xs(e),mainTreeToExecute:Zs(e),mainTreeToExecuteRange:l?.valueContentRange||l?.valueRange,behaviorTrees:a,nodes:i,subtreeCalls:s}}function Qs(e,t){let n=e.element.fullRange||e.element.range;return z(n,t)}function el(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 Vt(e,t){let n;for(let r of e.nodes)Qs(r,t.offset)&&(!n||el(r,n))&&(n=r);return n}function Fe(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(z(r.attribute.range,t.offset))return r}function tl(e,t){return z(e.fullRange||e.range,t)}function nl(e,t){let n=e.fullRange||e.range,r=t.fullRange||t.range;return n.end.offset-n.start.offset<r.end.offset-r.start.offset}function qt(e,t){let n;for(let r of e.nodes)tl(r,t.offset)&&(!n||nl(r,n))&&(n=r);return n}function Ut(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(z(r.range,t.offset))return r}function Oo(e){let{document:t,diagnostics:n,options:r,partial:o}=e,i=n.some(s=>s.severity===I.Error),a="generic-xml";if(i)a="invalid-xml";else if(t.root){let s=t.root,l=s.children.some(p=>p.kind==="element"&&p.name==="BehaviorTree"),u=s.children.some(p=>p.kind==="element"&&p.name==="TreeNodesModel"),d=s.attributes.some(p=>p.name==="BTCPP_format"&&p.value==="4"),c=s.name==="TreeNodesModel"||s.name==="root"&&!l&&u;r.kind==="model-xml"||c?a="model-document":(s.name==="BehaviorTree"||s.name==="root"&&(d||l)||r.kind==="bt-xml")&&(a="bt-document")}return t.kind=a,t.isBtXml=a==="bt-document"||a==="model-document",!i&&!o?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:o}}function cl(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 Un(e,t){if(e.kind==="element"){cl(e)&&t(e);for(let n of e.children||[])Un(n,t)}}function U(e,t){let n=0,r=0;for(let o=0;o<Math.min(t,e.length);o++)e[o]===`
6
- `?(n++,r=0):r++;return Oe(n,r,t)}function Fn(e,t,n,r){for(let o=0;o<e.length;o++){if(e[o]!=="&")continue;let i=e.slice(o+1),a=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 c=1;if(i[c]==="x"||i[c]==="X"){c++;let D="";for(;c<i.length&&/[0-9a-fA-F]/.test(i[c]);)D+=i[c],c++;if(c<i.length&&i[c]===";"){c++;let f=e.slice(a,a+1+c),y=U(n,t+a),R=U(n,t+a+f.length);if(D){let x=Number.parseInt(D,16);if(x>0&&x<=1114111&&(x<55296||x>57343)){o+=c-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",I.Error,`invalid numeric XML entity \`${f}\``,y,R,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=c-1;continue}r("XML001_INVALID_SYNTAX",I.Error,`malformed numeric XML entity \`${f}\``,y,R,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let E=e.slice(a,a+1+c),C=U(n,t+a),N=U(n,t+a+E.length);r("XML001_INVALID_SYNTAX",I.Error,`malformed numeric XML entity \`${E}\``,C,N,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let p="";for(;c<i.length&&/[0-9]/.test(i[c]);)p+=i[c],c++;if(c<i.length&&i[c]===";"){c++;let D=e.slice(a,a+1+c),E=U(n,t+a),C=U(n,t+a+D.length);if(p){let N=Number.parseInt(p,10);if(N>0&&N<=1114111&&(N<55296||N>57343)){o+=c-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",I.Error,`invalid numeric XML entity \`${D}\``,E,C,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=c-1;continue}r("XML001_INVALID_SYNTAX",I.Error,`malformed numeric XML entity \`${D}\``,E,C,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let m=e.slice(a,a+1+c),h=U(n,t+a),S=U(n,t+a+m.length);r("XML001_INVALID_SYNTAX",I.Error,`malformed numeric XML entity \`${m}\``,h,S,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let s=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(s){let c=`&${s[0]}`,p=U(n,t+a),m=U(n,t+a+c.length);r("XML013_UNKNOWN_ENTITY",I.Error,`unknown XML entity \`${c}\``,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+=c.length-1;continue}let l=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let c=`&${l[0]}`,p=U(n,t+a),m=U(n,t+a+c.length);r("XML001_INVALID_SYNTAX",I.Error,"bare ampersand in XML content",p,m,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"}),o+=c.length-1;continue}let u=U(n,t+a),d=U(n,t+a+1);r("XML001_INVALID_SYNTAX",I.Error,"bare ampersand in XML content",u,d,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"})}}function pt(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 Vo(e){let t="",n=[0];for(let r=0;r<e.length;){let o=pl(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 pl(e,t){let n=e.slice(t);if(n.startsWith("&quot;")||n.startsWith("&apos;")||n.startsWith("&lt;")||n.startsWith("&gt;")||n.startsWith("&amp;")){let a=n.startsWith("&quot;")?"&quot;":n.startsWith("&apos;")?"&apos;":n.startsWith("&lt;")?"&lt;":n.startsWith("&gt;")?"&gt;":"&amp;";return{value:pt(a),end:t+a.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let a=o[0];return{value:pt(a),end:t+a.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let a=i[0];return{value:pt(a),end:t+a.length}}}function qo(e){return Oe(e.line,e.character,e.offset)}function ml(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function fl(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function gl(e){return e===" "||e===" "||e===`
7
- `||e==="\r"}function yl(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
8
- `&&e!=="\r"}function mt(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,a=0,s=0,l=[],u=!1;function d(){return Oe(a,s,i)}function c(){return i>=e.length}function p(g=0){return e[i+g]}function m(g=1){for(let w=0;w<g;w+=1)e[i++]===`
9
- `?(a+=1,s=0):s+=1}function h(){for(;!c()&&gl(p());)m()}let S=(g,w,P,A,k,K)=>{n.push(W(g,w,P,T(A,k),o.uri,K))};function D(g,w,P,A,k,K){n.push(W(g,w,P,A&&k?T(A,k):void 0,o.uri,K))}function E(){if(!ml(p()))return"";let g=i;for(m();!c()&&fl(p());)m();return e.slice(g,i)}function C(){let g=p();if(g!=='"'&&g!=="'")return{value:"",ok:!1};let w=d();m();let P=d(),A=i;for(;!c()&&p()!==g&&p()!=="<";)m();let k=d();if(c()||p()!==g)return{value:e.slice(A,i),ok:!1,valueRange:T(w,k),valueContentRange:T(P,k)};let K=e.slice(A,i);m(),Fn(K,P.offset,e,S);let pe=Vo(K);return{value:pe.value,valueOffsets:pe.offsets,ok:!0,valueRange:T(w,d()),valueContentRange:T(P,k)}}function N(){let g=[],w=new Set;for(;;){h();let P=p();if(!P||P===">"||P==="/"&&p(1)===">")break;let A=d(),k=E(),K=d();if(!k)break;h();let pe=d();if(p()!=="="){if(S("XML001_INVALID_SYNTAX",I.Error,"invalid attribute syntax",A,K,{primaryLabel:`expected \`=\` after attribute \`${k}\``,help:`write the attribute as \`${k}="..."\``}),u=!0,r)continue;break}m();let ha=d();h();let cn=d(),he=C(),_e=d();if(!he.ok&&(S("XML005_INVALID_ATTRIBUTE_VALUE",I.Error,"invalid attribute value",cn,_e,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${k}="value"\``}),u=!0,!r)||(w.has(k)?S("XML004_DUPLICATE_ATTRIBUTE",I.Error,`duplicate attribute \`${k}\``,A,_e,{primaryLabel:`attribute \`${k}\` is already defined on this element`,help:`remove one of the duplicate \`${k}\` attributes`}):w.add(k),g.push({name:k,value:he.value,...he.valueOffsets?{valueOffsets:he.valueOffsets}:{},range:T(A,_e),fullRange:T(A,_e),nameRange:T(A,K),equalsRange:T(pe,ha),valueRange:he.valueRange||T(cn,_e),valueContentRange:he.valueContentRange||T(cn,_e)}),!he.ok&&r))break}return g}function f(g){l.length>0?l[l.length-1].children.push(g):(o.nodes.push(g),!o.root&&g.kind==="element"&&(o.root=g))}function y(){let g=d(),w=i;for(;!c()&&p()!=="<";)m();let P=e.slice(w,i);if(P.length===0)return;for(let k of P)if(yl(k)){S("XML007_INVALID_CHARACTER",I.Error,"invalid XML character",g,d(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}Fn(P,w,e,S);let A={kind:"text",text:pt(P),range:T(g,d()),fullRange:T(g,d())};f(A)}function R(){let g=d();m(4);let w=d(),P=i;for(;!c()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)m();let A=e.slice(P,i);if(c()){if(S("XML001_INVALID_SYNTAX",I.Error,"unterminated XML comment",g,d(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),u=!0,!r)return;let pe={kind:"comment",text:A,range:T(g,d()),fullRange:T(g,d()),contentRange:T(w,d())};f(pe);return}(A.includes("--")||A.endsWith("-"))&&S("XML001_INVALID_SYNTAX",I.Error,"invalid XML comment",w,d(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let k=d();m(3);let K={kind:"comment",text:A,range:T(g,d()),fullRange:T(g,d()),contentRange:T(w,k)};f(K)}function x(){let g=d();m(5),h();let w=N();h(),p()==="?"&&p(1)===">"?m(2):S("XML001_INVALID_SYNTAX",I.Error,"invalid XML declaration",g,d(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let P={range:T(g,d()),attributes:w};for(let A of w)A.name==="version"&&(P.version=A.value),A.name==="encoding"&&(P.encoding=A.value),A.name==="standalone"&&(P.standalone=A.value);o.xmlDeclaration=P}function M(){let g=d();m(2),h();let w=d(),P=E(),A=d();if(h(),p()!==">")for(S("XML001_INVALID_SYNTAX",I.Error,"invalid closing tag syntax",g,d(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),u=!0;!c()&&p()!==">";)m();p()===">"&&m();let k=l.pop();if(!k||k.name!==P){let K=k?k.name:P||"",pe=P||"";S("XML006_MISSING_CLOSING_TAG",I.Error,`mismatched closing tag \`</${pe}>\``,g,d(),{primaryLabel:`opened as \`<${K}>\` but closed as \`</${pe}>\``,help:`change the closing tag to \`</${K}>\` or fix the nesting`});return}k.closeTagRange=T(g,d()),k.endTagRange=T(g,d()),k.nameRange||(k.nameRange=T(w,A)),k.range=T(k.range.start,d()),k.fullRange=T(k.range.start,d())}for(;!c();)if(p()==="<")if(p(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")x();else{let g=d();for(;!c()&&!(p()==="?"&&p(1)===">");)m();c()||m(2),S("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",I.Error,"processing instruction is not supported",g,d(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")R();else if(p(1)==="!"&&p(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let g=d();for(m(8);!c()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)m();c()||m(3),S("XML010_UNSUPPORTED_CDATA",I.Error,"CDATA is not supported",g,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 g=d();for(m(8);!c()&&p()!==">";)m();c()||m(1),S("XML011_UNSUPPORTED_DOCTYPE",I.Error,"DOCTYPE is not supported",g,d(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")M();else{let g=d();m();let w=d(),P=E(),A=d();if(!P){if(S("XML001_INVALID_SYNTAX",I.Error,"invalid XML tag",g,d(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),u=!0,r){m();continue}break}let k={kind:"element",name:P,attributes:[],children:[],range:T(g,g),fullRange:T(g,g),openTagRange:T(g,g),startTagRange:T(g,g),nameRange:T(w,A),selfClosing:!1};if(k.attributes=N(),h(),p()==="/"&&p(1)===">"){m(2),k.selfClosing=!0,k.openTagRange=T(g,d()),k.startTagRange=k.openTagRange,k.range=T(g,d()),k.fullRange=T(g,d()),f(k);continue}if(p()!==">"){if(S("XML001_INVALID_SYNTAX",I.Error,"invalid XML tag",g,d(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),u=!0,r){k.openTagRange=T(g,d()),k.startTagRange=k.openTagRange,k.range=T(g,d()),k.fullRange=T(g,d()),f(k);continue}break}m(),k.openTagRange=T(g,d()),k.startTagRange=k.openTagRange,k.range=T(g,d()),k.fullRange=T(g,d()),f(k),l.push(k)}else y();if(l.length>0){let g=l[l.length-1];if(S("XML006_MISSING_CLOSING_TAG",I.Error,`missing closing tag for \`<${g.name}>\``,g.openTagRange.start,g.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${g.name}>\` before the end of the file`}),u=!0,r)for(;l.length>0;){let w=l.pop();if(!w)break;w.range=T(w.range.start,d()),w.fullRange=T(w.range.start,d())}}let _=o.nodes.filter(g=>g.kind==="element");_.length===0?D("XML002_MISSING_ROOT",I.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):_.length>1&&D("XML003_MULTIPLE_ROOTS",I.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 V=o.root,Ae=V?.name==="BehaviorTree"||V?.name==="TreeNodesModel"||V?.name==="root"&&(V.attributes.some(g=>g.name==="BTCPP_format"&&g.value==="4")||V.children.some(g=>g.kind==="element"&&(g.name==="BehaviorTree"||g.name==="TreeNodesModel")));if(V)for(let g of o.nodes)g!==V&&g.kind==="text"&&g.text.trim().length>0&&S("XML016_TEXT_OUTSIDE_ROOT",I.Error,"text outside root element",g.range.start,g.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!o.xmlDeclaration&&!Ae)D("XML008_MISSING_DECLARATION",I.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 g=o.xmlDeclaration.encoding;S("XML009_INVALID_ENCODING",I.Warning,"XML encoding should be UTF-8",o.xmlDeclaration.range.start,o.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${g}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return V&&Un(V,g=>{S("XML015_UNSUPPORTED_MIXED_CONTENT",I.Warning,"mixed XML content is not supported",qo(g.range.start),qo(g.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"]})}),Oo({document:o,diagnostics:n,partial:u,options:t})}var ft={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Uo(e){if(!e)return ft;let t=typeof e.indentWidth=="number"?e.indentWidth:ft.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:ft.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:ft.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:ft.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:o}}function Ft(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function $t(e){return Ft(e).replace(/"/g,"&quot;")}function bl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Sl(e,t,n){return`${" ".repeat(e*n)}${t}`}function $e(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}="${$t(i[0].value)}"${n}`];let a=[`${o}<${e.name} ${i[0].name}="${$t(i[0].value)}"`],s=" ".repeat(o.length+1+e.name.length+1);for(let l=1;l<i.length;l+=1){let u=i[l],d=l===i.length-1?n:"";a.push(`${s}${u.name}="${$t(u.value)}"${d}`)}return a}function Xt(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?[Sl(t,Ft(d),n)]:[]}let i=bl(e.children||[]),a=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),s=(e.children||[]).filter(d=>d.kind==="text").map(d=>d.text).join("").trim(),l=i.some(d=>d.kind==="element"||d.kind==="comment");if(s&&l&&!a&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),s&&!l){if((e.attributes||[]).length<=1){let d=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${$t(e.attributes[0].value)}"`;return[`${o}<${e.name}${d}>${Ft(s)}</${e.name}>`]}return $e(e,t,`>${Ft(s)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return $e(e,t,"/>".slice(0),n);let d=$e(e,t,">",n);return d.push(`${o}</${e.name}>`),d}let u=$e(e,t,">",n);for(let d of e.children||[])d.kind==="text"&&d.text.trim()===""||u.push(...Xt(d,t+1,n,r));return u.push(`${o}</${e.name}>`),u}function Rl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Fo(e,t,n,r){let o=[],i=Rl(e);for(let a=0;a<i.length;a+=1){let s=i[a],l=i[a-1],u=i[a+1],d=n&&s.kind==="element"&&s.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",c=s.kind==="element"&&s.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",p=s.kind==="comment"&&u&&u.kind==="element"&&u.name==="TreeNodesModel"&&l!==void 0;(d||c||p)&&o.length>0&&o[o.length-1]!==""&&o.push(""),s.kind==="element"?(o.push(...Xt(s,1,t,r)),s.name==="TreeNodesModel"&&o.push("")):o.push(...Xt(s,1,t,r))}return o}function gt(e,t={}){let n=mt(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(S=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(S.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=Uo(t),a=i.indentWidth,s=[],l=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&l)&&s.push('<?xml version="1.0" encoding="UTF-8"?>'),s.push(...$e(o,0,">",a)),s.push(...Fo(o.children||[],a,i.blankLineBetweenBehaviorTrees,n.diagnostics)),s.push(`</${o.name}>`),n.diagnostics.some(S=>S.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let u=`
1
+ import{z as xt}from"zod";var b={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",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"},pn=Object.values(b).sort();var ka=xt.object({subTreePorts:xt.enum(["loose","strict"]).optional()}).strict(),xa=xt.object({allowStringEntryCompatibility:xt.boolean().optional()}).strict(),Dr={"script/valid-syntax":{code:b.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:b.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:b.AssignmentToUnknownVariable,codes:[b.AssignmentToUnknownVariable,b.InvalidCompoundAssignment,b.ScriptVariableTypeMismatch,b.InvalidGlobalBlackboardIdentifier],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:b.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:b.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:b.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:b.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:b.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:b.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:b.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:b.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:b.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:b.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:b.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:b.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:b.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:b.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:b.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:b.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:b.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:b.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:b.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:b.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:b.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:b.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:b.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:b.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:b.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:b.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:b.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:b.UnknownPort,defaultSeverity:"warn",optionsSchema:ka,options:[{name:"subTreePorts",type:'"loose" | "strict"',default:"loose",description:"Controls whether SubTree remap attributes are checked strictly."}],description:"Reports ports that are not declared by the resolved node model."},"model/valid-port-value":{code:b.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:b.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:xa,options:[{name:"allowStringEntryCompatibility",type:"boolean",default:"true",description:"Treat std::string blackboard entries as runtime-compatible with other port types, matching BT.CPP's existing-entry special case."}],description:"Blackboard entries must not mix incompatible resolved port types."},"model/valid-port-default-value":{code:b.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:b.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:b.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:b.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:b.InvalidChildCount,defaultSeverity:"warn",description:"Child count must match the expected count for the node kind (Action/Condition: 0, Decorator: 1, Control: >=1, special builtins: fixed range)."},"model/no-conflicting-definition":{code:b.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"model/no-conflicting-kind-for-id":{code:b.ConflictingModelKind,defaultSeverity:"error",description:"A model ID must not be defined with different kinds."},"model/no-unused-definition":{code:b.UnusedModelDefinition,defaultSeverity:"error",description:"Inline model definitions should be used in the same BT XML file."},"model/no-duplicate-definition":{code:b.DuplicateModelDefinition,defaultSeverity:"error",description:"A user-defined model (ID, kind) should be defined only once."},"suppression/no-unused":{code:b.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:b.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var It=["off","info","warn","error"];var Br={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"}}},Ia={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 Le(){return structuredClone(Ia)}function We(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 C={Error:"error",Warning:"warning",Info:"info"};function W(e,t,n,r,o="",i,a){return{code:e,severity:t,message:n,uri:o,...r?{range:r}:{},...i?{details:i}:{},...a?{data:a}:{}}}function Oe(e,t,n){return{line:e,character:t,offset:n}}function v(e,t){return{start:e,end:t}}function K(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}function Ca(e){let t=[0];for(let n=0;n<e.length;n+=1)e[n]===`
2
+ `&&t.push(n+1);return t}function mn(e,t,n){return Math.min(Math.max(e,t),n)}function Ve(e,t,n=0,r="xml"){let o=Ca(t),i=u=>{let d=mn(u,0,t.length),c=0,p=o.length;for(;c<p;){let x=Math.floor((c+p)/2);o[x]>d?p=x:c=x+1}let m=Math.max(0,c-1);return{line:m,character:d-o[m],offset:d}},a=u=>{let d=mn(u.line,0,Math.max(0,o.length-1)),c=o[d],p=d+1<o.length?o[d+1]:t.length;return mn(c+u.character,c,p)};return{uri:e,languageId:r,version:n,text:t,lineOffsets:o,positionAt:i,offsetAt:a,getText:u=>u?t.slice(a(u.start),a(u.end)):t}}var Da=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function fn(e){return{ok:!0,reference:e}}function ge(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Er(e){return Da.test(e)}function Nr(e){if(!e)return ge("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?Er(t)?{ok:!0,scope:"global",key:t}:ge("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):ge("empty-key",e,"Global blackboard reference key must not be empty")}return Er(e)?{ok:!0,scope:"local",key:e}:ge("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function F(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return fn({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return ge("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return ge("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let r=n.slice(1,-1).trim(),o=Nr(r);return o.ok?fn({scope:o.scope,key:o.key,raw:n,syntax:"braced"}):o}function Ye(e){let{rawName:t}=e;if(!t.startsWith("@"))return ge("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Nr(t);return n.ok?n.scope!=="global"?ge("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):fn({scope:n.scope,key:n.key,raw:t,syntax:"script"}):n}function ke(e){return e.scope==="global"?`{@${e.key}}`:`{${e.key}}`}function $(e){return`${e.scope}:${e.key}`}var Ba={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Ea(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function J(e,t){return e.attributes.find(n=>n.name===t)}function Na(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function wa(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Ma(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function wr(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 Pa(e,t,n){let r=wr(e,t),o=wr(r,n);return{start:r,end:o}}function Mr(e,t,n,r){for(let o of e.attributes||[]){let i=o.valueContentRange??o.valueRange,a=r.slice(i.start.offset,i.end.offset),s=u=>{let d=F({portName:o.name,rawValue:u.parsedRaw});if(!d.ok)return;let c=d.reference.raw.length;t.push({raw:d.reference.raw,key:d.reference.key,scope:d.reference.scope,identity:$(d.reference),syntax:d.reference.syntax,attributeName:o.name,element:e,uri:n,range:Pa(i.start,a.slice(0,u.parsedOffset),d.reference.raw.slice(0,c))})},l=F({portName:o.name,rawValue:a});if(l.ok){let u=Math.max(0,a.indexOf(l.reference.raw));s({parsedRaw:l.reference.raw,parsedOffset:u});continue}for(let u of a.matchAll(/\{[^}]*\}/g)){let d=u[0],c=u.index??0;s({parsedRaw:d,parsedOffset:c})}}for(let o of e.children||[])o.kind==="element"&&Mr(o,t,n,r)}function Aa(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!Na(i.name))continue;let a=J(i,"ID");if(!a)continue;let s=[];for(let l of i.children||[]){if(l.kind!=="element"||l.name!=="input_port"&&l.name!=="output_port"&&l.name!=="inout_port")continue;let u=J(l,"name"),d=J(l,"type"),c=J(l,"default")||J(l,"default_value"),p=J(l,"enum"),m=(l.children||[]).filter(D=>D.kind==="text").map(D=>D.text).join("").trim()||void 0,x=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",S=(x==="input"||x==="inout")&&c===void 0;s.push({source:n,direction:x,name:u?u.value:"",type:d?.value||void 0,defaultValue:c?.value||void 0,description:m,required:S,element:l,uri:t,range:l.range,nameRange:u?.range,enum:p?.value?p.value.split(";"):void 0})}o.push({id:a.value,kind:i.name,source:n,sourceMeta:{sourceKind:n,file:t,range:i.range},editable:r,ports:s,element:i,uri:t,range:i.range,elementRange:i.range,idRange:a.range})}return o}function _a(e,t){let n=[];for(let r of e.children||[]){if(r.kind!=="element"||r.name!=="BehaviorTree")continue;let o=J(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 La(e,t){let n=[],r=(o,i,a=!1)=>{if(a)return;let s=o.name==="BehaviorTree"?J(o,"ID")?.value??i:i,l=o.name==="TreeNodesModel";if(o.name==="SubTree"){let u=J(o,"ID");u&&n.push({id:u.value,uri:t,element:o,range:o.range,elementRange:o.range,idRange:u.range,parentBehaviorTreeId:s,attributes:o.attributes})}for(let u of o.children||[])u.kind==="element"&&r(u,s,l)};if(e.name==="TreeNodesModel")return n;for(let o of e.children||[])o.kind==="element"&&r(o);return n}function Oa(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Pr(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 Va(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Pr),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 Ua(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function qa(e){return{id:e.id,uri:e.uri,kind:e.kind,range:e.range,elementRange:e.elementRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Fa(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 $a(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(Oa),subtreeReferences:e.subtreeReferences.map(Ua),nodeUsages:e.nodeUsages.map(qa),blackboardReferences:e.blackboardReferences.map(Fa),treeNodesModel:e.treeNodesModel.map(Va),genericSubTreePorts:e.genericSubTreePorts.map(Pr),rootMainTreeToExecute:wa(e.rootMainTreeToExecute)}}function Xa(e,t){if(e.name==="TreeNodesModel")return[];let n=[],r=(o,i,a=!1)=>{if(a)return;let s=o.name==="TreeNodesModel",l=o.name==="BehaviorTree"?J(o,"ID")?.value??i:i,u=l!==void 0;if(o.name==="SubTree"){let d=J(o,"ID");d&&u&&n.push({id:d.value,kind:"SubTree",uri:t,range:o.range,elementRange:o.range,parentBehaviorTreeId:l})}else u&&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,s)};for(let o of e.children||[])o.kind==="element"&&r(o);return n}function ja(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Ka(e){return W(Ba.DuplicateNodeModelId,C.Error,`duplicate node model ID \`${e.id}\``,e.idRange||e.range,e.uri,{primaryLabel:"this node model ID is already defined in the same model source",help:"merge the duplicate definitions or rename one of them"})}function za(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,a=Ea(e),s=Ma(e),l=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",u=o&&e.kind!=="model-document"?_a(o,r):[],d=[],c=[],p=o?o.name==="TreeNodesModel"?[o]:o.children.filter(h=>h.kind==="element"&&h.name==="TreeNodesModel"):[];for(let h of p){let E=Aa(h,r,s,l),f=new Map;for(let y of E)ja({node:y,treeNodesModel:d,genericSubTreePorts:c})||(f.has(y.id)?n.push(Ka(y)):f.set(y.id,y))}let m=o?La(o,r):[],x=o?Xa(o,r):[],S=o?(()=>{let h=[];return Mr(o,h,r,e.originalText),h})():[],D=o?J(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:$a({uri:r,path:t?.path??e.path,isBtXml:i,kind:a,behaviorTrees:u,subtreeReferences:m,nodeUsages:x,blackboardReferences:S,treeNodesModel:d,genericSubTreePorts:c,rootMainTreeToExecute:D?{uri:r,range:D.range,value:D.value}:void 0}),extractedBehaviorTrees:u,extractedTreeNodesModel:d,extractedSubTreeReferences:m,extractedBlackboardReferences:S},diagnostics:n}}function Ar(e,t){let{extracted:n,diagnostics:r}=za(e,t);return{model:n.publicModel,diagnostics:r}}function gn(e,t){return Ar(e,t)}var _r=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Ga=new Set([..._r,"_autoremap","_description","__shared_blackboard"]),Wa=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 yn(e){return _r.has(e)}function Lr(e){return Ga.has(e)}function bn(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(Lr(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=Wa.get(t);if(r)return r}}function Or(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 Sn(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,r])=>Or(n,r))}}var Ya=[{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"]}],He=new Map,Vr=new Map;for(let e of Ya){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Vr.set(e.name,t),He.set(e.name,e.name);for(let n of e.aliases)He.set(n,e.name)}function Ha(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 Rn(e){return He.get(e)??e}function Za(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 Ze(e){return He.get(e)}function Ue(e=[]){let t=new Map,n=new Map(He);for(let r of Vr.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 a=Rn(i.canonical??o),l=t.get(a)??Ha(o,a,i);l.name=o,l.kind=i.kind,l.canonical=a,l.source="augmentation",l.validate=i.validate??l.validate,l.aliases.add(o),l.aliases.add(a);for(let u of i.aliases??[])l.aliases.add(u);for(let u of i.compatibleWith??[])l.compatibleWith.add(u);t.set(a,l),n.set(o,a),n.set(a,a);for(let u of i.aliases??[])n.set(u,a)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(o=>n.get(o)??Rn(o))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,o])=>[r,Za(o)])),namesToCanonical:n}}function ie(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??Rn(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function Ct(e,t){return ie(e,t)?.canonical}function Je(e,t,n){let r=ie(e,t),o=ie(e,n);return!r||!o?!1:r.kind==="any"||o.kind==="any"||r.canonical===o.canonical?!0:r.compatibleWith.includes(o.canonical)||o.compatibleWith.includes(r.canonical)}var Ur=[{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:[]}],qr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Fr=[{id:"AlwaysFailure",kind:"Action",ports:[]},{id:"AlwaysSuccess",kind:"Action",ports:[]},{id:"AsyncFallback",kind:"Control",ports:[]},{id:"AsyncSequence",kind:"Control",ports:[]},{id:"Delay",kind:"Decorator",ports:[{name:"delay_msec",direction:"input",type:"unsigned int",description:"Tick the child after a few milliseconds",required:!0}]},{id:"Fallback",kind:"Control",ports:[]},{id:"ForceFailure",kind:"Decorator",ports:[]},{id:"ForceSuccess",kind:"Decorator",ports:[]},{id:"IfThenElse",kind:"Control",ports:[]},{id:"Inverter",kind:"Decorator",ports:[]},{id:"KeepRunningUntilFailure",kind:"Decorator",ports:[]},{id:"LoopBool",kind:"Decorator",ports:[{name:"value",direction:"output",type:"bool",required:!1},{name:"if_empty",direction:"input",type:"BT::NodeStatus",defaultValue:"SUCCESS",description:"Status to return if queue is empty: SUCCESS, FAILURE, SKIPPED",required:!1},{name:"queue",direction:"inout",type:"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:[]}],$r={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Xr=[{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:[]}],jr={id:"SubTree",kind:"SubTree",ports:[{name:"_autoremap",direction:"input",type:"bool",defaultValue:"false",description:"If true, all the ports with the same name will be remapped",required:!1}]};var Kr=["4.6.2","4.8.2","4.9.0"],Tn="4.9.0",Qe={"4.6.2":{models:Ur,genericSubTreeModel:qr},"4.8.2":{models:Fr,genericSubTreeModel:$r},"4.9.0":{models:Xr,genericSubTreeModel:jr}};var zr=Kr.map(e=>`btcpp-v${e}`),et=["btcpp-v4",...zr],Gr=`btcpp-v${Tn}`;function Wr(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 Ja(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Wr)}))}function Yr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Wr)}}function Qa(){let e={};for(let[t,n]of Object.entries(Qe))e[`btcpp-v${t}`]=Ja(n.models);return e}function es(){let e={};for(let[t,n]of Object.entries(Qe))e[`btcpp-v${t}`]=Yr(n.genericSubTreeModel);return e}var ts=Qa(),ns=es();function rs(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Qe,t)}function Hr(e){return e==="btcpp-v4"?Gr:e}function os(e){return e==="btcpp-v4"?Tn:e.replace(/^btcpp-v/,"")}function Zr(e){if(e&&e!=="btcpp-v4"&&!rs(e))throw new Error(`unsupported builtin model set: ${e}`)}function vn(e="btcpp-v4"){Zr(e);let t=Hr(e);return ts[t].map(r=>Jr(r))}function hn(e="btcpp-v4"){Zr(e);let t=ns[Hr(e)]??Yr(Qe[os(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Jr(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 a=(t.defaultValue??"").localeCompare(n.defaultValue??"");return a!==0?a:(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 Dt(e,t){let n=tt(e),r=tt(t);return JSON.stringify(n)===JSON.stringify(r)}function kn(e,t){if(Dt(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(s=>[s.name,s])),i=!1,a=!1;for(let s of n.ports){let l=o.get(s.name);if(!l){a=!0;continue}(s.direction!==l.direction||s.type!==l.type||s.required!==l.required)&&(a=!0);let u=s.enum?JSON.stringify(s.enum):"",d=l.enum?JSON.stringify(l.enum):"";u!==d&&(a=!0),s.description!==l.description&&(a=!0),s.defaultValue!==l.defaultValue&&(i=!0)}return a?"ports":i?"port-default":"mixed"}import{z as X}from"zod";var Qr=X.object({direction:X.enum(["input","output","inout"]).optional(),type:X.string().optional(),required:X.boolean().optional(),default:X.string().optional(),description:X.string().optional(),enum:X.array(X.string()).optional()}).strict(),Bt=X.object({kind:X.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:X.record(X.string(),Qr).optional(),description:X.string().optional()}).strict(),is=X.object({nodes:X.record(X.string(),Bt)}).strict();import{z as T}from"zod";var eo=T.enum(["off","info","warn","error"]),to=T.union([eo,T.tuple([eo,T.record(T.string(),T.unknown())])]),as=T.object({include:T.array(T.string()).optional(),ignore:T.array(T.string()).optional(),useGitignore:T.boolean().optional(),followSymlinks:T.boolean().optional(),maxSize:T.number().int().positive().optional()}).strict(),ss=T.string(),ls=T.object({name:T.string(),attribute:T.string(),base:T.enum(["file","project-root"]).optional()}).strict(),us=T.object({elements:T.array(ls).optional(),variables:T.record(T.string(),T.string()).optional(),allowOutsideRoot:T.boolean().optional(),maxDepth:T.number().int().min(1).optional(),maxFiles:T.number().int().min(1).optional()}).strict(),ds=T.object({entrypoints:T.array(ss).optional(),includes:us.optional(),behaviorTreeIds:T.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),cs=T.enum(["allow-unused","used-only","single-source"]),ps=T.object({builtins:T.array(T.enum(et)).optional(),files:T.array(T.string()).optional(),augmentations:T.array(T.string()).optional(),definitions:T.array(T.string()).optional(),inline:T.record(T.string(),Bt).optional(),convention:cs.optional()}).strict(),no=T.object({inline:T.enum(["allow","deny"]).optional()}).strict(),ms=T.object({enabled:T.boolean().optional(),rules:T.record(T.string(),to).optional(),baseline:T.string().optional(),suppressions:no.optional()}).strict(),fs=T.object({rules:T.record(T.string(),to).optional(),suppressions:no.optional()}).strict(),ro=T.object({indentWidth:T.number().int().min(1).max(8).optional(),xmlDeclaration:T.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:T.boolean().optional(),lineEnding:T.enum(["lf","crlf","auto"]).optional()}).strict(),gs=T.object({files:T.array(T.string()),linter:fs.optional(),formatter:ro.optional()}).strict(),oo=T.object({$schema:T.string().optional(),strict:T.boolean().optional(),files:as.optional(),resolver:ds.optional(),models:ps.optional(),linter:ms.optional(),formatter:ro.optional(),overrides:T.array(gs).optional()}).strict();function so(e){return e.flatMap(ys)}function ys(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=io([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=io(e.path);return lo(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 io(e){return e.map(String).join(".")||void 0}function lo(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(ao);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(ao):!1}function ao(e){return typeof e=="object"&&e!==null&&lo(e)}function uo(e){let t=oo.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:so(t.error.issues)}}function bs(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 Ss(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 Rs(e){return e.map(t=>W(t.code,t.severity==="error"?C.Error:C.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function Ts(e){let t=[],n=Le(),{$schema:r,strict:o,overrides:i,...a}=e;o&&(n=We(n,Br)),n=We(n,a),n.overrides=(i??[]).map(l=>({files:l.files,linter:Ss(l.linter),formatter:bs(l.formatter)}));let s=!t.some(l=>l.severity===C.Error);return{config:n,diagnostics:t,ok:s}}function xn(e){let t=uo(e);return t.ok?Ts(t.value):{ok:!1,config:Le(),diagnostics:Rs(t.diagnostics)}}function vs(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 Et(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),o=r?t.slice(1):t,a=vs(o).test(n);return r?!a:a}function co(e,t){return e.overrides.filter(n=>n.files.some(r=>Et(t,r)))}function nt(e){return e.replaceAll("\\","/")}function hs(e){try{return decodeURIComponent(e)}catch{return e}}function rt(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=hs(t.pathname);return/^\/[A-Za-z]:/.test(n)?nt(n.slice(1)):t.host?nt(`//${t.host}${n}`):nt(n)}function Nt(e,t){let n=nt(t);return e.files.ignore.some(r=>Et(n,r))?!1:e.files.include.some(r=>Et(n,r))}function In(e,t){return Nt(e,rt(t))}function wt(e,t){let n=nt(t),r=co(e,n),o=e;for(let i of r)o=We(o,{linter:i.linter,formatter:i.formatter});return{files:o.files,resolver:o.resolver,models:o.models,linter:o.linter,formatter:o.formatter}}function Cn(e,t){return wt(e,rt(t))}function ye(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 Mt(e){if(typeof e=="string")return It.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&It.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 po(e,t){if(t)return Ct(e,t)}function mo(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function fo(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return W(e.code,C.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function ks(e,t,n,r,o){let i=n.effectiveType??n.type,a=n.originalType??n.type,s={...n,originalType:a,effectiveType:i,typeSource:n.typeSource??mo(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{...s,type:s.effectiveType};let u=po(e,l.from),d=po(e,i);return u&&u!==d?(o.push(fo({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})),{...s,type:s.effectiveType}):{...s,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function xs(e,t,n,r){let o=new Map(t.ports.map(i=>[i.name,i]));for(let[i,a]of Object.entries(n.ports??{})){let s=o.get(i);if(!s){r.push(fo({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,ks(e,t,s,a,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function Is(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??mo(e)}}function go(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,a])=>[i,{...a,ports:a.ports.map(Is)}]));for(let i of n)for(let[a,s]of Object.entries(i.augment??{})){let l=o.get(a);if(!l){r.push(W("BT117_AUGMENT_TARGET_NOT_FOUND",C.Error,`augmentation target node \`${a}\` not found`,void 0,i.uri??"",{primaryLabel:`augmentation target \`${a}\` 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:a,filePath:i.path}));continue}o.set(a,xs(t,l,s,r))}return{modelsById:o,diagnostics:r}}function So(e){return ot("builtin",0,!1,e)}function Ro(e){return ot("xml-tree-nodes-model",10,!0,e)}function To(e){return ot("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function vo(e){return ot("node-definition-file",20,!0,e)}function ho(e){return ot("config-inline",30,!0,e)}function ot(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>ko(o,e,n&&o.editable!==!1))}}function Cs(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function ko(e,t,n){let r=Cs(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 qe(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 yo(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 Ds(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,a]of r)o.has(i)||n.push({kind:"port-removed",portName:i,sourceIndex:0,port:yo(a)});for(let[i,a]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:yo(a)});for(let[i,a]of r){let s=o.get(i);if(!s)continue;a.direction!==s.direction&&n.push({kind:"port-direction",portName:i,left:a.direction,right:s.direction}),a.type!==s.type&&n.push({kind:"port-type",portName:i,left:a.type,right:s.type}),a.required!==s.required&&n.push({kind:"port-required",portName:i,left:a.required,right:s.required}),a.defaultValue!==s.defaultValue&&n.push({kind:"port-default",portName:i,left:a.defaultValue,right:s.defaultValue});let l=a.enum?JSON.stringify([...a.enum].sort()):"",u=s.enum?JSON.stringify([...s.enum].sort()):"";l!==u&&n.push({kind:"port-enum",portName:i,left:a.enum?[...a.enum].sort():void 0,right:s.enum?[...s.enum].sort():void 0}),a.description!==s.description&&n.push({kind:"port-description",portName:i,left:a.description,right:s.description})}return n}function bo(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(Dt(o,r))continue;let i=kn(o,r),a=Ds(o,r),s;if(i==="port-default"){let l=new Map(o.ports.map(p=>[p.name,p])),u=r.ports.find(p=>{let m=l.get(p.name);return m&&m.defaultValue!==p.defaultValue}),d=u?.name??"unknown",c=[qe(o,0),qe(r,1)];s={kind:"port-default-conflict",nodeId:r.id,portName:d,sources:[{source:qe(o,0),value:l.get(d)?.defaultValue},{source:qe(r,1),value:u?.defaultValue}]},t.push({id:r.id,definitions:[o,r],sources:c,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:s,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}else{let l=[qe(o,0),qe(r,1)];s={kind:"node-model-conflict",nodeId:r.id,sources:l,differences:a},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:s,relatedInformation:o.uri&&o.range?[{uri:o.uri,range:o.range,message:"previous definition"}]:void 0})}}return n}function Bs(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 xo(e){let t=[],n=new Map,r=new Map,o=[...e].sort((s,l)=>s.precedence-l.precedence),i=new Map,a=new Map;for(let s of o){let l=i.get(s.precedence)??[],u=s.models.map(d=>ko(d,s.kind,s.editable&&d.editable!==!1));l.push(...u),i.set(s.precedence,l);for(let d of u)a.set(d.id,s.precedence)}for(let[s,l]of[...i.entries()].sort((u,d)=>u[0]-d[0])){let u=l.filter(m=>a.get(m.id)===s),d=l.filter(m=>a.get(m.id)!==s),c=bo(d,[]);for(let[m,x]of bo(u,t))c.set(m,x);let p=new Set(l.map(m=>m.id));for(let m of p)a.get(m)===s&&n.set(m,l.filter(x=>x.id===m));for(let[m,x]of c)r.set(m,Bs(r.get(m),x))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Es(e){return et.includes(e)}function Ns(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:Ue(),augmentations:[]}}function ws(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function Ms(e,t,n){for(let r of new Set(n))if(Es(r)){for(let o of vn(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...hn(r))}}function Ps(e,t,n,r,o){for(let i of o){let a=gn(i,{uri:i.uri,path:i.path}),s=a.model;t.push(...a.diagnostics),e.documents.set(i.uri,s);for(let l of s.behaviorTrees)ws(e.behaviorTreesById,l.id,l);i.kind==="model-document"?r.push(...s.treeNodesModel):n.push(...s.treeNodesModel),e.genericSubTreePorts.push(...s.genericSubTreePorts)}}function As(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 _s(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=As(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function Ls(e,t,n,r,o){e.modelLayers.push(So(t),Ro(n),To(r)),o.models?.length&&e.modelLayers.push(vo([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Dn(e,t){return Os(e,t)}function Os(e,t){let n=Ns(),r=[],o=[],i=[],a=[];Ms(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=Ue(t.augmentations??[]),Ps(n,r,i,a,e),_s(n),Ls(n,o,i,a,t);let s=t.config.models.inline;if(s){let d=[];for(let[c,p]of Object.entries(s))d.push(Sn(c,p));n.modelLayers.push(ho(d))}let l=xo(n.modelLayers),u=go(l.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=l.nodeModelsById,n.mergedNodeModelsById=u.modelsById,n.modelConflicts=l.conflicts,r.push(...u.diagnostics),{ok:r.every(d=>d.severity!==C.Error),index:n,diagnostics:r}}var Io={unknownSubTreePorts:"allow"};function Co(e){return{...Io,...e}}var Vs=["Action","Condition","Control","Decorator"],Us=new Set(Vs);var qs=new Set(["input_port","output_port","inout_port"]);function it(e){return Us.has(e)}function xe(e){return it(e)?e:void 0}function Pt(e,t){return e.attributes.find(n=>n.name===t)?.value}function Bn(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&Bn(n,t))return!0;return!1}function Do(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return Bn(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&Bn(n,t))return!0;return!1}function At(e){return qs.has(e.name)}function Bo(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":it(e.name)?"generic-node":At(e)?"unknown-xml":"concrete-node"}function _t(e){if(e.name==="SubTree")return Pt(e,"ID")||"SubTree";if(it(e.name))return Pt(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||At(e)))return e.name}function Y(e){return e.typeRegistry}function G(e,t){return ie(Y(e),t)}function be(e,t,n){return Je(Y(e),t,n)}function at(e,t){return e.documents.get(t)}function Q(e,t){return e.behaviorTreesById.get(t)??[]}function En(e,t){return e.behaviorTreesById.has(t)}function Nn(e){return[...e.behaviorTreesById.values()].flat()}function wn(e,t){return Eo(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function st(e){return[...e.behaviorTreesById.keys()]}function Eo(e){return[...e.documents.values()]}function ee(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function lt(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function Lt(e){return[...e.mergedNodeModelsById.values()]}function Mn(e){return e.modelLayers.flatMap(t=>t.models)}function Pn(e){return[...e.mergedNodeModelsById.values()]}function An(e){return[...e.genericSubTreePorts]}function ut(e){return[...e.augmentations]}function dt(e){return e.modelConflicts}function ct(e,t){let{id:n,fileLocalUri:r,config:o}=t,i=Q(e,n);if(i.length>0){if((o?.resolver?.behaviorTreeIds==="file-local-first"||o?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let u=i.filter(d=>d.uri===r);u.length>0&&(i=u)}let s=ee(e,n),l=s?.kind==="SubTree"?[s]:[];return i.length===1?{status:"resolved",kind:"behavior-tree",treeId:i[0].id,behaviorTree:i[0]}:{status:"ambiguous",candidates:[...i.map(u=>u.id),...l.map(u=>u.id)],behaviorTrees:i,definitions:l}}let a=ee(e,n);return a?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:a.id,model:a}:{status:"unresolved",id:n}}function _n(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=ee(e,t);if(n){let o=dt(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=lt(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 Ln(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function On(e){let t=An(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return Ln([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Vn(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}:yn(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 L(e,t){let n=Co(t.policy),r=t.element,o=Bo(r),i=Do(t.documentRoot,r);if((t.isModelDefinition||i&&(o==="generic-node"||o==="subtree"))&&(o="model-definition"),i&&At(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 a=_t(r);if(o!=="subtree"){let m=_n(e,a),x=On({index:e,tagForm:o,model:m}),S=r.attributes.map(D=>Vn({attribute:D,ports:x,allowsArbitraryAttributes:!1,model:m}));return{element:r,tagName:r.name,tagForm:o,nodeType:a,model:m,ports:x,allowsArbitraryAttributes:!1,portUsages:S}}let s=Pt(r,"ID"),l=s?ct(e,{id:s,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},u={status:"unresolved",nodeType:s},d=!1;if(l.status==="resolved"&&l.kind==="node-model")u={status:"resolved",model:l.model};else if(l.status==="resolved"&&l.kind==="behavior-tree"){let m=_n(e,l.treeId);m.status==="resolved"&&m.model.kind==="SubTree"?u=m:d=n.unknownSubTreePorts==="allow"}else l.status==="ambiguous"&&l.definitions.length>0?u=l.definitions.length===1?{status:"resolved",model:l.definitions[0]}:{status:"ambiguous",nodeType:s??"SubTree",candidates:l.definitions}:d=n.unknownSubTreePorts==="allow";let c=On({index:e,tagForm:o,model:u,subtreeModelPorts:l.status==="ambiguous"?Ln(l.definitions.flatMap(m=>m.ports)):void 0}),p=r.attributes.map(m=>Vn({attribute:m,ports:c,allowsArbitraryAttributes:d,model:u,unknownModelPortStatus:!d&&u.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:o,nodeType:a,model:u,subtree:{id:s,target:l},ports:c,allowsArbitraryAttributes:d,portUsages:p}}function ue(e,t){return L(e,t).portUsages.find(r=>r.name===t.attributeName)}function Xs(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function js(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function No(e,t){let n=e.line,r=e.character,o=e.offset;for(let i of t){if(o+=i.length,i===`
5
+ `){n+=1,r=0;continue}r+=i.length}return{line:n,character:r,offset:o}}function Un(e,t,n){let r=No(e,t),o=No(r,n);return{start:r,end:o}}function Mo(e,t,n){let r=n.valueContentRange||n.valueRange,o=e.originalText.slice(r.start.offset,r.end.offset),i=[];for(let a of o.matchAll(/\{[^}]*\}/g)){let s=a[0],l=a.index??0,u=F({portName:t,rawValue:s});if(u.ok){i.push({raw:s,key:u.reference.key,scope:u.reference.scope,identity:$(u.reference),range:Un(r.start,o.slice(0,l),s),syntax:u.reference.syntax==="shorthand"?"shorthand":"braced"});continue}i.push({raw:s,key:s,scope:"local",identity:`invalid:${s}`,range:Un(r.start,o.slice(0,l),s),syntax:"invalid"})}if(i.length===0){let a=F({portName:t,rawValue:o});if(a.ok){let s=Math.max(0,o.indexOf(a.reference.raw));return i.push({raw:a.reference.raw,key:a.reference.key,scope:a.reference.scope,identity:$(a.reference),range:Un(r.start,o.slice(0,s),a.reference.raw),syntax:a.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 Ks(e,t){return Xs(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Po(e){let t=[];for(let n of e)t.push(n),t.push(...Po(n.children));return t}function zs(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function Gs(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function Ws(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function Ao(e){return Se(e,"name")?.value}function Ys(e){return Ao(e)||Se(e,"ID")?.value||e.name}function Hs(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${Ys(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function _o(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 Lo(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 Zs(e){return e.status==="resolved"?e.port.direction:"unknown"}function Js(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 wo(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:Zs(t.usage),valueKind:Js(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 Qs(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 Se(e,t){return e.attributes.find(n=>n.name===t)}function el(e){return e.root?Se(e.root,"main_tree_to_execute")?.value:void 0}function tl(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let o of r.children)o.kind==="element"&&n(o)};if(e.name==="TreeNodesModel")return n(e),t;for(let r of e.children)r.kind!=="element"||r.name!=="TreeNodesModel"||n(r);return t}function te(e,t){let n=t.semantic,r=tl(e.root),o=js(e).map(l=>({id:Se(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),i=[],a=[],s=(l,u,d,c)=>{let p=L(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(l)}),m=_o(p),x={element:l,path:c,tagName:l.name,kind:Ks(l,p),model:m,usage:p,portBindings:[],children:[],parent:d,behaviorTree:u};if(x.portBindings=p.portUsages.filter(S=>S.status!=="reserved-attribute").map(S=>({name:S.name,value:S.value,attribute:S.attribute,declaredPort:Lo(S),usage:S,blackboardReferences:Mo(e,S.name,S.attribute)})),x.children=l.children.filter(S=>S.kind==="element").map((S,D)=>s(S,u,x,[...c,D])),l.name==="SubTree"){let S=Se(l,"ID")?.value;i.push({node:x,id:S,target:p.subtree?.target??{status:"unresolved",id:S},portRemaps:x.portBindings})}return x};for(let l of o){let u=l.element.children.filter(d=>d.kind==="element").map((d,c)=>s(d,l,void 0,[c]));l.rootNode=u[0],l.nodes=Po(u),a.push(...l.nodes)}return{document:e,behaviorTrees:o,subtreeCalls:i,nodes:a}}function Ot(e,t,n){let r=te(e,{semantic:t,config:n?.config,policy:n?.policy}),o=Gs(r.behaviorTrees),i=r.nodes.map(u=>{let d=o(u),c=u.usage,p=c.nodeType??u.tagName,m=Ao(u.element),x=Se(u.element,"ID")?.value,S=Hs(u);return{nodeId:d,path:u.path,instancePath:S,tagName:u.tagName,nodeType:p,name:m,idAttr:x,kind:u.kind,range:u.element.range,fullRange:u.element.fullRange,nameRange:u.element.nameRange,parentNodeId:u.parent?o(u.parent):void 0,childNodeIds:u.children.map(o),behaviorTreeId:u.behaviorTree.id,attributes:u.element.attributes.map(Ws),identityCandidates:Qs({name:m,idAttr:x,nodeType:p,tagName:u.tagName,instancePath:S,behaviorTreeId:u.behaviorTree.id,nodeId:d}),model:_o(c),usage:c,portBindings:c.portUsages.filter(D=>D.status!=="reserved-attribute").map(D=>wo(d,{name:D.name,value:D.value,attribute:D.attribute,declaredPort:Lo(D),usage:D,blackboardReferences:Mo(e,D.name,D.attribute)}))}}),a=r.behaviorTrees.map(u=>({id:u.id,range:u.element.range,idRange:Se(u.element,"ID")?.valueContentRange,rootNodeId:u.rootNode?o(u.rootNode):void 0,nodeIds:u.nodes.map(o)})),s=r.subtreeCalls.map(u=>({nodeId:o(u.node),callId:u.id,range:u.node.element.range,target:u.target,portBindings:u.portRemaps.map(d=>wo(o(u.node),d))})),l=e.root?Se(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:zs(e),mainTreeToExecute:el(e),mainTreeToExecuteRange:l?.valueContentRange||l?.valueRange,behaviorTrees:a,nodes:i,subtreeCalls:s}}function nl(e,t){let n=e.element.fullRange||e.element.range;return K(n,t)}function rl(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 Vt(e,t){let n;for(let r of e.nodes)nl(r,t.offset)&&(!n||rl(r,n))&&(n=r);return n}function Fe(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(K(r.attribute.range,t.offset))return r}function ol(e,t){return K(e.fullRange||e.range,t)}function il(e,t){let n=e.fullRange||e.range,r=t.fullRange||t.range;return n.end.offset-n.start.offset<r.end.offset-r.start.offset}function Ut(e,t){let n;for(let r of e.nodes)ol(r,t.offset)&&(!n||il(r,n))&&(n=r);return n}function qt(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(K(r.range,t.offset))return r}function Oo(e){let{document:t,diagnostics:n,options:r,partial:o}=e,i=n.some(s=>s.severity===C.Error),a="generic-xml";if(i)a="invalid-xml";else if(t.root){let s=t.root,l=s.children.some(p=>p.kind==="element"&&p.name==="BehaviorTree"),u=s.children.some(p=>p.kind==="element"&&p.name==="TreeNodesModel"),d=s.attributes.some(p=>p.name==="BTCPP_format"&&p.value==="4"),c=s.name==="TreeNodesModel"||s.name==="root"&&!l&&u;r.kind==="model-xml"||c?a="model-document":(s.name==="BehaviorTree"||s.name==="root"&&(d||l)||r.kind==="bt-xml")&&(a="bt-document")}return t.kind=a,t.isBtXml=a==="bt-document"||a==="model-document",!i&&!o?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:o}}function fl(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 qn(e,t){if(e.kind==="element"){fl(e)&&t(e);for(let n of e.children||[])qn(n,t)}}function q(e,t){let n=0,r=0;for(let o=0;o<Math.min(t,e.length);o++)e[o]===`
6
+ `?(n++,r=0):r++;return Oe(n,r,t)}function Fn(e,t,n,r){for(let o=0;o<e.length;o++){if(e[o]!=="&")continue;let i=e.slice(o+1),a=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 c=1;if(i[c]==="x"||i[c]==="X"){c++;let D="";for(;c<i.length&&/[0-9a-fA-F]/.test(i[c]);)D+=i[c],c++;if(c<i.length&&i[c]===";"){c++;let f=e.slice(a,a+1+c),y=q(n,t+a),R=q(n,t+a+f.length);if(D){let I=Number.parseInt(D,16);if(I>0&&I<=1114111&&(I<55296||I>57343)){o+=c-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",C.Error,`invalid numeric XML entity \`${f}\``,y,R,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=c-1;continue}r("XML001_INVALID_SYNTAX",C.Error,`malformed numeric XML entity \`${f}\``,y,R,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let A=e.slice(a,a+1+c),h=q(n,t+a),E=q(n,t+a+A.length);r("XML001_INVALID_SYNTAX",C.Error,`malformed numeric XML entity \`${A}\``,h,E,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let p="";for(;c<i.length&&/[0-9]/.test(i[c]);)p+=i[c],c++;if(c<i.length&&i[c]===";"){c++;let D=e.slice(a,a+1+c),A=q(n,t+a),h=q(n,t+a+D.length);if(p){let E=Number.parseInt(p,10);if(E>0&&E<=1114111&&(E<55296||E>57343)){o+=c-1;continue}r("XML014_INVALID_NUMERIC_ENTITY",C.Error,`invalid numeric XML entity \`${D}\``,A,h,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),o+=c-1;continue}r("XML001_INVALID_SYNTAX",C.Error,`malformed numeric XML entity \`${D}\``,A,h,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let m=e.slice(a,a+1+c),x=q(n,t+a),S=q(n,t+a+m.length);r("XML001_INVALID_SYNTAX",C.Error,`malformed numeric XML entity \`${m}\``,x,S,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as `&#10;` or escape the ampersand as `&amp;`"}),o+=c-1;continue}let s=i.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(s){let c=`&${s[0]}`,p=q(n,t+a),m=q(n,t+a+c.length);r("XML013_UNKNOWN_ENTITY",C.Error,`unknown XML entity \`${c}\``,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+=c.length-1;continue}let l=i.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let c=`&${l[0]}`,p=q(n,t+a),m=q(n,t+a+c.length);r("XML001_INVALID_SYNTAX",C.Error,"bare ampersand in XML content",p,m,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"}),o+=c.length-1;continue}let u=q(n,t+a),d=q(n,t+a+1);r("XML001_INVALID_SYNTAX",C.Error,"bare ampersand in XML content",u,d,{primaryLabel:"escape `&` as `&amp;`",help:"replace `&` with `&amp;` unless this is a valid XML entity"})}}function pt(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 Vo(e){let t="",n=[0];for(let r=0;r<e.length;){let o=gl(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 gl(e,t){let n=e.slice(t);if(n.startsWith("&quot;")||n.startsWith("&apos;")||n.startsWith("&lt;")||n.startsWith("&gt;")||n.startsWith("&amp;")){let a=n.startsWith("&quot;")?"&quot;":n.startsWith("&apos;")?"&apos;":n.startsWith("&lt;")?"&lt;":n.startsWith("&gt;")?"&gt;":"&amp;";return{value:pt(a),end:t+a.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let a=o[0];return{value:pt(a),end:t+a.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let a=i[0];return{value:pt(a),end:t+a.length}}}function Uo(e){return Oe(e.line,e.character,e.offset)}function yl(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function bl(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function Sl(e){return e===" "||e===" "||e===`
7
+ `||e==="\r"}function Rl(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
8
+ `&&e!=="\r"}function mt(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,a=0,s=0,l=[],u=!1;function d(){return Oe(a,s,i)}function c(){return i>=e.length}function p(g=0){return e[i+g]}function m(g=1){for(let N=0;N<g;N+=1)e[i++]===`
9
+ `?(a+=1,s=0):s+=1}function x(){for(;!c()&&Sl(p());)m()}let S=(g,N,M,P,k,z)=>{n.push(W(g,N,M,v(P,k),o.uri,z))};function D(g,N,M,P,k,z){n.push(W(g,N,M,P&&k?v(P,k):void 0,o.uri,z))}function A(){if(!yl(p()))return"";let g=i;for(m();!c()&&bl(p());)m();return e.slice(g,i)}function h(){let g=p();if(g!=='"'&&g!=="'")return{value:"",ok:!1};let N=d();m();let M=d(),P=i;for(;!c()&&p()!==g&&p()!=="<";)m();let k=d();if(c()||p()!==g)return{value:e.slice(P,i),ok:!1,valueRange:v(N,k),valueContentRange:v(M,k)};let z=e.slice(P,i);m(),Fn(z,M.offset,e,S);let pe=Vo(z);return{value:pe.value,valueOffsets:pe.offsets,ok:!0,valueRange:v(N,d()),valueContentRange:v(M,k)}}function E(){let g=[],N=new Set;for(;;){x();let M=p();if(!M||M===">"||M==="/"&&p(1)===">")break;let P=d(),k=A(),z=d();if(!k)break;x();let pe=d();if(p()!=="="){if(S("XML001_INVALID_SYNTAX",C.Error,"invalid attribute syntax",P,z,{primaryLabel:`expected \`=\` after attribute \`${k}\``,help:`write the attribute as \`${k}="..."\``}),u=!0,r)continue;break}m();let ha=d();x();let cn=d(),he=h(),_e=d();if(!he.ok&&(S("XML005_INVALID_ATTRIBUTE_VALUE",C.Error,"invalid attribute value",cn,_e,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${k}="value"\``}),u=!0,!r)||(N.has(k)?S("XML004_DUPLICATE_ATTRIBUTE",C.Error,`duplicate attribute \`${k}\``,P,_e,{primaryLabel:`attribute \`${k}\` is already defined on this element`,help:`remove one of the duplicate \`${k}\` attributes`}):N.add(k),g.push({name:k,value:he.value,...he.valueOffsets?{valueOffsets:he.valueOffsets}:{},range:v(P,_e),fullRange:v(P,_e),nameRange:v(P,z),equalsRange:v(pe,ha),valueRange:he.valueRange||v(cn,_e),valueContentRange:he.valueContentRange||v(cn,_e)}),!he.ok&&r))break}return g}function f(g){l.length>0?l[l.length-1].children.push(g):(o.nodes.push(g),!o.root&&g.kind==="element"&&(o.root=g))}function y(){let g=d(),N=i;for(;!c()&&p()!=="<";)m();let M=e.slice(N,i);if(M.length===0)return;for(let k of M)if(Rl(k)){S("XML007_INVALID_CHARACTER",C.Error,"invalid XML character",g,d(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}Fn(M,N,e,S);let P={kind:"text",text:pt(M),range:v(g,d()),fullRange:v(g,d())};f(P)}function R(){let g=d();m(4);let N=d(),M=i;for(;!c()&&!(p()==="-"&&p(1)==="-"&&p(2)===">");)m();let P=e.slice(M,i);if(c()){if(S("XML001_INVALID_SYNTAX",C.Error,"unterminated XML comment",g,d(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),u=!0,!r)return;let pe={kind:"comment",text:P,range:v(g,d()),fullRange:v(g,d()),contentRange:v(N,d())};f(pe);return}(P.includes("--")||P.endsWith("-"))&&S("XML001_INVALID_SYNTAX",C.Error,"invalid XML comment",N,d(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let k=d();m(3);let z={kind:"comment",text:P,range:v(g,d()),fullRange:v(g,d()),contentRange:v(N,k)};f(z)}function I(){let g=d();m(5),x();let N=E();x(),p()==="?"&&p(1)===">"?m(2):S("XML001_INVALID_SYNTAX",C.Error,"invalid XML declaration",g,d(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let M={range:v(g,d()),attributes:N};for(let P of N)P.name==="version"&&(M.version=P.value),P.name==="encoding"&&(M.encoding=P.value),P.name==="standalone"&&(M.standalone=P.value);o.xmlDeclaration=M}function w(){let g=d();m(2),x();let N=d(),M=A(),P=d();if(x(),p()!==">")for(S("XML001_INVALID_SYNTAX",C.Error,"invalid closing tag syntax",g,d(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),u=!0;!c()&&p()!==">";)m();p()===">"&&m();let k=l.pop();if(!k||k.name!==M){let z=k?k.name:M||"",pe=M||"";S("XML006_MISSING_CLOSING_TAG",C.Error,`mismatched closing tag \`</${pe}>\``,g,d(),{primaryLabel:`opened as \`<${z}>\` but closed as \`</${pe}>\``,help:`change the closing tag to \`</${z}>\` or fix the nesting`});return}k.closeTagRange=v(g,d()),k.endTagRange=v(g,d()),k.nameRange||(k.nameRange=v(N,P)),k.range=v(k.range.start,d()),k.fullRange=v(k.range.start,d())}for(;!c();)if(p()==="<")if(p(1)==="?")if(e.slice(i,i+5).toLowerCase()==="<?xml"&&e.charAt(i+5)===" ")I();else{let g=d();for(;!c()&&!(p()==="?"&&p(1)===">");)m();c()||m(2),S("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",C.Error,"processing instruction is not supported",g,d(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(p(1)==="!"&&p(2)==="-"&&p(3)==="-")R();else if(p(1)==="!"&&p(2)==="["&&e.slice(i+3,i+9)==="CDATA["){let g=d();for(m(8);!c()&&!(p()==="]"&&p(1)==="]"&&p(2)===">");)m();c()||m(3),S("XML010_UNSUPPORTED_CDATA",C.Error,"CDATA is not supported",g,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 g=d();for(m(8);!c()&&p()!==">";)m();c()||m(1),S("XML011_UNSUPPORTED_DOCTYPE",C.Error,"DOCTYPE is not supported",g,d(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(p(1)==="/")w();else{let g=d();m();let N=d(),M=A(),P=d();if(!M){if(S("XML001_INVALID_SYNTAX",C.Error,"invalid XML tag",g,d(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),u=!0,r){m();continue}break}let k={kind:"element",name:M,attributes:[],children:[],range:v(g,g),fullRange:v(g,g),openTagRange:v(g,g),startTagRange:v(g,g),nameRange:v(N,P),selfClosing:!1};if(k.attributes=E(),x(),p()==="/"&&p(1)===">"){m(2),k.selfClosing=!0,k.openTagRange=v(g,d()),k.startTagRange=k.openTagRange,k.range=v(g,d()),k.fullRange=v(g,d()),f(k);continue}if(p()!==">"){if(S("XML001_INVALID_SYNTAX",C.Error,"invalid XML tag",g,d(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),u=!0,r){k.openTagRange=v(g,d()),k.startTagRange=k.openTagRange,k.range=v(g,d()),k.fullRange=v(g,d()),f(k);continue}break}m(),k.openTagRange=v(g,d()),k.startTagRange=k.openTagRange,k.range=v(g,d()),k.fullRange=v(g,d()),f(k),l.push(k)}else y();if(l.length>0){let g=l[l.length-1];if(S("XML006_MISSING_CLOSING_TAG",C.Error,`missing closing tag for \`<${g.name}>\``,g.openTagRange.start,g.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${g.name}>\` before the end of the file`}),u=!0,r)for(;l.length>0;){let N=l.pop();if(!N)break;N.range=v(N.range.start,d()),N.fullRange=v(N.range.start,d())}}let _=o.nodes.filter(g=>g.kind==="element");_.length===0?D("XML002_MISSING_ROOT",C.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):_.length>1&&D("XML003_MULTIPLE_ROOTS",C.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 V=o.root,Ae=V?.name==="BehaviorTree"||V?.name==="TreeNodesModel"||V?.name==="root"&&(V.attributes.some(g=>g.name==="BTCPP_format"&&g.value==="4")||V.children.some(g=>g.kind==="element"&&(g.name==="BehaviorTree"||g.name==="TreeNodesModel")));if(V)for(let g of o.nodes)g!==V&&g.kind==="text"&&g.text.trim().length>0&&S("XML016_TEXT_OUTSIDE_ROOT",C.Error,"text outside root element",g.range.start,g.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!o.xmlDeclaration&&!Ae)D("XML008_MISSING_DECLARATION",C.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 g=o.xmlDeclaration.encoding;S("XML009_INVALID_ENCODING",C.Warning,"XML encoding should be UTF-8",o.xmlDeclaration.range.start,o.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${g}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return V&&qn(V,g=>{S("XML015_UNSUPPORTED_MIXED_CONTENT",C.Warning,"mixed XML content is not supported",Uo(g.range.start),Uo(g.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"]})}),Oo({document:o,diagnostics:n,partial:u,options:t})}var ft={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function qo(e){if(!e)return ft;let t=typeof e.indentWidth=="number"?e.indentWidth:ft.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:ft.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:ft.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:ft.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:o}}function Ft(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function $t(e){return Ft(e).replace(/"/g,"&quot;")}function Tl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function vl(e,t,n){return`${" ".repeat(e*n)}${t}`}function $e(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}="${$t(i[0].value)}"${n}`];let a=[`${o}<${e.name} ${i[0].name}="${$t(i[0].value)}"`],s=" ".repeat(o.length+1+e.name.length+1);for(let l=1;l<i.length;l+=1){let u=i[l],d=l===i.length-1?n:"";a.push(`${s}${u.name}="${$t(u.value)}"${d}`)}return a}function Xt(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?[vl(t,Ft(d),n)]:[]}let i=Tl(e.children||[]),a=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),s=(e.children||[]).filter(d=>d.kind==="text").map(d=>d.text).join("").trim(),l=i.some(d=>d.kind==="element"||d.kind==="comment");if(s&&l&&!a&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),s&&!l){if((e.attributes||[]).length<=1){let d=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${$t(e.attributes[0].value)}"`;return[`${o}<${e.name}${d}>${Ft(s)}</${e.name}>`]}return $e(e,t,`>${Ft(s)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return $e(e,t,"/>".slice(0),n);let d=$e(e,t,">",n);return d.push(`${o}</${e.name}>`),d}let u=$e(e,t,">",n);for(let d of e.children||[])d.kind==="text"&&d.text.trim()===""||u.push(...Xt(d,t+1,n,r));return u.push(`${o}</${e.name}>`),u}function hl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Fo(e,t,n,r){let o=[],i=hl(e);for(let a=0;a<i.length;a+=1){let s=i[a],l=i[a-1],u=i[a+1],d=n&&s.kind==="element"&&s.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",c=s.kind==="element"&&s.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",p=s.kind==="comment"&&u&&u.kind==="element"&&u.name==="TreeNodesModel"&&l!==void 0;(d||c||p)&&o.length>0&&o[o.length-1]!==""&&o.push(""),s.kind==="element"?(o.push(...Xt(s,1,t,r)),s.name==="TreeNodesModel"&&o.push("")):o.push(...Xt(s,1,t,r))}return o}function gt(e,t={}){let n=mt(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(S=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(S.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=qo(t),a=i.indentWidth,s=[],l=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&l)&&s.push('<?xml version="1.0" encoding="UTF-8"?>'),s.push(...$e(o,0,">",a)),s.push(...Fo(o.children||[],a,i.blankLineBetweenBehaviorTrees,n.diagnostics)),s.push(`</${o.name}>`),n.diagnostics.some(S=>S.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let u=`
10
10
  `;(i.lineEnding==="crlf"||i.lineEnding==="auto"&&e.includes(`\r
11
11
  `))&&(u=`\r
12
- `);let d=s.join(u),c=u.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${c})+$`,"u"),h=`${d.replace(p,"")}${u}`;return{ok:!0,text:h,changed:h!==e,skipped:!1,diagnostics:n.diagnostics.filter(S=>S.severity!==I.Error)}}function Xe(e,t){if(!(!z(e.range,t)&&!z(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=Xe(n,t);if(r)return r}return e}}var Xo=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,vl=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function Tl(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 u=e.indexOf("-->",o+4);if(u<0||u+3>t)break;r=u+3;continue}if(e.startsWith("<![CDATA[",o)){let u=e.indexOf("]]>",o+9);if(u<0||u+3>t)break;r=u+3;continue}if(e.startsWith("<?",o)){let u=e.indexOf("?>",o+2);if(u<0||u+2>t)break;r=u+2;continue}if(e.startsWith("<!",o)){let u=e.indexOf(">",o+2);if(u<0||u+1>t)break;r=u+1;continue}if(e[o+1]==="/"){let d=e.slice(o+2).match(Xo)?.[0];if(d){for(let p=n.length-1;p>=0;p-=1)if(n[p]===d){n.length=p;break}}let c=e.indexOf(">",o+2);if(c<0||c>=t)break;r=c+1;continue}let a=e.slice(o+1).match(/^\s*([A-Za-z_:][A-Za-z0-9_.:-]*)/)?.[1];if(!a){r=o+1;continue}let s=e.indexOf(">",o+1);if(s<0||s>=t)break;e.slice(o+1,s).trimEnd().endsWith("/")||n.push(a),r=s+1}return n.at(-1)}function jt(e,t){let n=e.positionAt(t);return T(n,n)}function te(e,t,n){return T(e.positionAt(t),e.positionAt(n))}function zt(e){return{name:e.name,value:e.value,range:te(e.document,e.nameStart,e.valueEnd),fullRange:te(e.document,e.nameStart,e.valueEnd),nameRange:te(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?te(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:te(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?te(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function hl(e,t,n){let r=[];for(let o of t.matchAll(vl)){let i=o.index??0,a=o[1],s=o[2],l=o[3],u=o[4],d=o[0].indexOf(a),c=o[0].indexOf("=",d+a.length),p=o[0].indexOf(s,c+1),m=n+i+p,h=m+s.length;r.push(zt({document:e,name:a,value:l??u??"",nameStart:n+i+d,nameEnd:n+i+d+a.length,equalsStart:n+i+c,equalsEnd:n+i+c+1,valueStart:m,valueEnd:h,valueContentStart:m+1,valueContentEnd:h-1}))}return r}function kl(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 a=n+o,s=r.slice(o+2);if(!/\s/.test(s))return{kind:"closing-tag-name",tagNamePrefix:s,replacementRange:te(e,a+2,t)}}function $o(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 a=n+o,s=a+1,l=r.slice(o+1);if(/^\s*[!?/]/.test(l))return;let u=l.match(/^\s*/)?.[0].length??0,d=l.slice(u).match(Xo);if(!d)return{kind:"tag-name"};let c=d[0],p=u,m=p+c.length,h=te(e,s+p,s+m),S={kind:"element",name:c,attributes:hl(e,l,s),children:[],range:te(e,a,t),fullRange:te(e,a,t),openTagRange:te(e,a,t),startTagRange:te(e,a,t),nameRange:h,selfClosing:!1};if(l.length<=m&&!/\s/.test(l.slice(m)))return{kind:"tag-name",element:S,replacementRange:h};let D=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(D){let N=D[0].indexOf(D[1]),f=(D.index??0)+N,y=f+D[1].length,R=l.indexOf("=",y),x=D[2],M=D[4]??"";if(x){let V=l.indexOf(x,R+1),Ae=s+V+1,g=zt({document:e,name:D[1],value:D[3]??"",nameStart:s+f,nameEnd:s+y,equalsStart:s+R,equalsEnd:s+R+1,valueStart:s+V,valueEnd:t,valueContentStart:Ae,valueContentEnd:t});return{kind:"attribute-value",element:S,attribute:g,valuePrefix:e.text.slice(Ae,t)}}let _=M.length>0?t-s-M.length:t-s;return{kind:"attribute-value",element:S,attribute:zt({document:e,name:D[1],value:M,nameStart:s+f,nameEnd:s+y,equalsStart:s+R,equalsEnd:s+R+1,valueStart:s+_,valueEnd:t,valueContentStart:s+_,valueContentEnd:t}),valuePrefix:e.text.slice(s+_,t)}}let E=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)?$/s);if(E){let C=E[1]??"",N=t-s-C.length;return{kind:"attribute-name",element:S,attribute:zt({document:e,name:C,value:"",nameStart:s+N,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:S,attribute:{name:"",value:"",range:jt(e,t),fullRange:jt(e,t),nameRange:jt(e,t),valueRange:jt(e,t)}}}function H(e){let{document:t,parsed:n,position:r}=e,o=r.offset,i=t.text.length>0?{kind:"text"}:{kind:"unknown"},a=kl(t,o);if(a)return{kind:"closing-tag-name",tagNamePrefix:a.tagNamePrefix,replacementRange:a.replacementRange,tagText:Tl(t.text,o)};if(n?.root){let u=Xe(n.root,o);if(u){for(let d of u.attributes){if(z(d.nameRange,o))return{kind:"attribute-name",element:u,attribute:d};if(z(d.valueRange,o)||z(d.valueContentRange,o))return{kind:"attribute-value",element:u,attribute:d,valuePrefix:d.valueContentRange&&o>=d.valueContentRange.start.offset?t.text.slice(d.valueContentRange.start.offset,o):""}}if(z(u.nameRange||u.openTagRange,o))return{kind:"tag-name",element:u,replacementRange:u.nameRange};if(z(u.openTagRange,o)){let d=$o(t,o);if(d)return d.kind==="tag-name"?{...d,element:d.element??u}:d}i={kind:"element",element:u}}}let s=$o(t,o);if(s)return s;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 Kt(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 me(e,t,n){let r=t.valueContentRange??t.valueRange,o=Kt(t,n.start),i=Kt(t,n.end),a=U(e.originalText,r.start.offset+o),s=U(e.originalText,r.start.offset+i);return T(a,s)}function jo(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function zo(e,t){return e.includeIssuesByUri.get(t)??[]}function Ko(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Go(e){let{document:t,semantic:n,config:r,view:o}=e,i=new Map(o.nodes.map(u=>[u.element,u])),a=new Map(o.subtreeCalls.map(u=>[u.node.element,u])),s=ye(r),l=xl(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(u){let d=W(u.code??e.code,e.severity,u.message,u.range,t.uri,u.details,u.data);e.diagnostics.push({...d,rule:e.rule,...u.relatedInformation?{relatedInformation:u.relatedInformation}:{}})},getIncludeIssues(u){let d=zo(e.facts,t.uri);return u?d.filter(c=>c.kind===u):d},getSuppressionIssues(u){let d=Ko(e.facts,t.uri);return u?d.filter(c=>c.kind===u):d},getNodeUsage(u){return L(n,{element:u,documentRoot:t.root,uri:t.uri,config:r,policy:s,isModelDefinition:l.has(u)})},getPortUsage(u,d){return ue(n,{element:u,documentRoot:t.root,attributeName:d,uri:t.uri,config:r,policy:s,isModelDefinition:l.has(u)})},resolveSubTree(u,d){return ct(n,{id:u,fileLocalUri:d,config:r})},getNodeModel(u){return Q(n,u)},getBehaviorTrees(u){return J(n,u)},getTreeNodeView(u){return i.get(u)},getSubTreeCallView(u){return a.get(u)}}}function xl(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return $n(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||$n(n,t);return t}function $n(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&$n(n,t)}function B(e){let t=Br[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Il={"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 Re(e){return B({name:Il[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Cl(n)})}}}})}function Cl(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 Wo=[Re("missing-path"),Re("not-found"),Re("cycle"),Re("outside-root"),Re("unresolved-variable"),Re("depth-exceeded"),Re("too-many-files"),Re("external-used")];import Bl from"ajv";var Dl=Bl,El=new Dl,Nl=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],wl={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}},Xn=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"]),Yo=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 Ho(e){return e.children.filter(t=>t.kind==="element")}function ie(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function Zo(e){return e.children.some(t=>t.kind==="element")}function Wt(e,t){let n=Jo(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Jo(e){let t=yt(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 Gt(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Ll(e.registry,n,e.value)?void 0:Gt(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!ei(r,e.value))return Ml(r)?Gt(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 Ie(e){return e.effectiveType??e.type}function Qo(e,t){return oe(e,Ie(t))}function yt(e,t){let n=F({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function Gt(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function Ml(e){let t=Ze(e)??e;return ti(e)!==void 0||Ol.has(t.toLowerCase())}function ei(e,t){let n=ti(e);if(n)return Pl(n,t);let r=(Ze(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 Nl.includes(t);default:return Xn.has(r)||Yo.has(r)?ni(r,t):!1}}function ti(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Pl(e,t){let n=_l(t);return n?n.every(r=>Al(e,r)):!1}function Al(e,t){if(t.kind==="string")return ei(e,t.value);let n=(Ze(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 Xn.has(n)||Yo.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&ni(n,String(t.value)):!1}}function ni(e,t){let n=wl[e];if(!n)return!1;if(Xn.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 _l(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 Ll(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 a=t.items[i];return a?Jo({port:{name:`tuple[${i}]`,type:a},value:o,registry:e,typeDefinition:oe(e,a),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 El.compile(t.schema)(r)===!0}catch{return!1}}}var Ol=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 ri=[B({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})}}}}),B({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))}}}}),B({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=bn(n.name);r&&e.report({code:b.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),B({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of dt(e.semantic))t.uri&&t.uri!==e.document.uri||Vl(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),B({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!ql(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=Ul(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!i)return;let s=e.getNodeModel(i)?.ports.find(l=>l.name===r);if(s){if(s.direction==="output"){yt(s.name,n.value)===void 0&&e.report({code:b.InvalidPortDefaultValue,message:`output port default for \`${s.name}\` must be a blackboard remap`,range:n.range,details:{primaryLabel:`output port default for \`${s.name}\` must be a blackboard remap`,help:`use \`${s.name}="{${s.name}}"\` or \`${s.name}="{=}"\``}});return}Wt(e,{port:s,value:n.value,range:n.range,registry:Y(e.semantic),typeDefinition:G(e.semantic,s.type),allowRemap:!0,diagnosticCode:b.InvalidPortDefaultValue,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:s.name})}}}}}),B({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=Y(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 a=yt(i.name,i.value);if(!a)continue;let s=Qo(t,i.declaredPort.port);if(!s||s.kind==="any")continue;let l=$(a),u=n.get(l)??[];u.push({key:a.key,scope:a.scope,displayName:ke(a),identity:l,nodeId:Xl(o.element),port:i.declaredPort.port,typeDefinition:s,range:i.attribute.range}),n.set(l,u)}for(let o of n.values()){let i=Fl(e.semantic,o,r);if(i.length<2)continue;let a=o.find(s=>s.typeDefinition.canonical===i[0]);e.report({code:b.BlackboardTypeMismatch,message:`blackboard entry \`${a?.displayName??o[0]?.displayName??o[0]?.key??""}\` is used with incompatible port types: ${i.map(s=>`\`${s}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${a?.displayName??o[0]?.displayName??o[0]?.key??""}\` mixes incompatible port types`,notes:o.filter(s=>i.includes(s.typeDefinition.canonical)).map(s=>`${s.nodeId}.${s.port.name} declares ${$l(s.port,s.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),B({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(jl(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"&&yt(o.port.name,r.value)===void 0&&e.report({code:b.OutputPortRequiresRemap,message:`output port \`${o.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${o.port.name}\` requires a blackboard remap`,help:`use \`${o.port.name}="{${o.port.name}}"\` or \`${o.port.name}="{some_key}"\``}})}}}}})];function Vl(e,t){return e.diagnostics.some(n=>n.code===b.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function ql(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function Ul(e,t){if(!e)return;return n(e,!1,void 0);function n(r,o,i){let a=o||r.name==="TreeNodesModel",s=a&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:i;if(r===t)return s;for(let l of r.children){if(l.kind!=="element")continue;let u=n(l,a,s);if(u)return u}}}function Fl(e,t,n){let r=new Set;for(let o=0;o<t.length;o+=1){let i=t[o];if(i)for(let a=o+1;a<t.length;a+=1){let s=t[a];s&&(n&&(i.typeDefinition.canonical==="std::string"||s.typeDefinition.canonical==="std::string")||be(e,i.typeDefinition.canonical,s.typeDefinition.canonical)||(r.add(i.typeDefinition.canonical),r.add(s.typeDefinition.canonical)))}}return[...r].sort()}function $l(e,t){return Ie(e)??t.canonical}function Xl(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function jl(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var zl=new Set(["_failureIf","_successIf","_skipIf","_while"]),Kl=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Ce(e){if(zl.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Kl.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 bt(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=Ye({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 oi=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),ii=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function je(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(ai(r)){n++;continue}if(jn(r)){let s=n;for(n++;n<e.length&&Yl(e[n]);)n++;let l=e.slice(s,n);t.push({type:l==="true"||l==="false"?"Boolean":"Identifier",text:l,start:s,end:n});continue}if(Be(r)){let s=Wl(e,n);t.push(s),n=s.end;continue}if(r==="'"){let s=Gl(e,n);t.push(s),n=s.end;continue}let o=e.slice(n,n+2),i=oi.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let a=ii.get(r);if(a){t.push({type:a,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 Gl(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 Wl(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&&Hl(e[n]);)n++;return o===n||Jl(e,n)?(n=St(e,n),Rt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Be(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(!Be(e[n+1]))return n=St(e,n+1),Rt(e,t,n);for(r="Real",n+=1;n<e.length&&Be(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&&Be(e[n]);)n++;if(i===n)return n=St(e,Math.max(n,o+1)),Rt(e,t,n);r="Real"}return Zl(e,n)?(n=St(e,n),Rt(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function St(e,t){let n=t;for(;n<e.length;){let r=e[n];if(ai(r)||ii.has(r)||oi.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function Rt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function ai(e){return e===" "||e===" "||e===`
13
- `||e==="\r"}function jn(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Yl(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Be(e){return e!==void 0&&/[0-9]/.test(e)}function Hl(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Zl(e,t){let n=e[t];return jn(n)||Be(n)}function Jl(e,t){let n=e[t];return n==="."||jn(n)||Be(n)}var Ql=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),eu=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),si=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),ne={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ee(e){let t=je(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}:li(t,e)}function li(e,t=""){let n=new zn(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=iu(r);return{ok:!0,program:{kind:"Program",statements:r,range:o},tokens:e}}var zn=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=Ql.get(r.type);if(o){if(t>=ne.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:o,left:n,right:l,range:vt(n.range,l.range)};break}if(r.type==="Question"){if(t>=ne.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 u=this.parseExpression(ne.ternary);if(!u)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:u,range:vt(n.range,u.range)};break}let i=si.get(r.type);if(i){if(t>=ne.comparison)break;this.consume();let l=[n],u=[i],d=this.parseExpression(ne.comparison);if(!d)return;for(l.push(d);;){let c=si.get(this.peek().type);if(!c)break;this.consume();let p=this.parseExpression(ne.comparison);if(!p)return;u.push(c),l.push(p)}n={kind:"ComparisonChain",operands:l,operators:u,range:vt(l[0].range,l[l.length-1].range)};continue}let a=eu.get(r.type),s=a?ru(r.type):void 0;if(a&&s!==void 0){if(t>=s)break;this.consume();let l=this.parseExpression(s);if(!l)return;n={kind:"BinaryExpression",operator:a,left:n,right:l,range:vt(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:De(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),tu(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:nu(t.type),argument:n,range:vt(De(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(),ou(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:De(r)})}};function tu(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:De(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:De(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:De(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:De(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function nu(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function ru(e){switch(e){case"PipePipe":return ne.pipePipe;case"AmpAmp":return ne.ampAmp;case"Pipe":case"Caret":return ne.pipeCaret;case"Ampersand":return ne.ampersand;case"Plus":case"Minus":case"DotDot":return ne.additive;case"Star":case"Slash":return ne.multiplicative;default:return}}function De(e){return{start:e.start,end:e.end}}function vt(e,t){return{start:e.start,end:t.end}}function ou(e,t){return{...e,range:t}}function iu(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var au=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 Tt(e={}){let t=qe(e.augmentations??[]),n=e.areTypesCompatible??((a,s)=>Je(t,a,s)),r=new Map,o=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:su(e.enums,e.augmentations??[])};for(let a of e.symbols??[])ui(i.symbols,r,a,n);for(let a of e.globalBlackboardSymbols??[])ui(i.globalBlackboard,o,a,n);return i}function de(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 ht(e){let t=de(e.baseEnvironment),n=[];for(let r of e.entries){let o=de(t),i=r.parseResult??Ee(r.source),a=de(o),s;i.ok&&(s=we({program:i.program,environment:o,attributeName:r.attributeName,originId:r.originId??String(r.id)}),a=de(s.environment)),n.push({id:r.id,parseResult:i,environmentBefore:o,environmentAfter:a,...s?{analysis:s}:{}}),t.symbols.clear(),t.globalBlackboard.clear(),t.enums.clear();for(let[l,u]of a.symbols)t.symbols.set(l,{...u});for(let[l,u]of a.globalBlackboard)t.globalBlackboard.set(l,{...u});for(let[l,u]of a.enums)t.enums.set(l,u)}return n}function di(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 fe(e,t){let n=oe(e,t);return ci(t,n)}function ci(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"}:au.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function pi(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 ze(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 Ne(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Kn(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 su(e,t){if(e instanceof Map)return new Map(e);let n=di(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function ui(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),a=o.conflict===!0||i!==void 0&&n.compatibilityKey!==void 0&&!r(i,n.compatibilityKey)||!pi(o.type,n.type);e.set(n.name,{...o,readable:o.readable||n.readable,writable:o.writable||n.writable,conflict:a}),i===void 0&&t.set(n.name,n.compatibilityKey)}var Me={kind:"number"},Ht={kind:"string"},Yt={kind:"bool"},re={kind:"unknown"},q={kind:"error"};function we(e){let t=de(e.environment),n=[],r=[],o=[],i=[],a=[],s=[],l=[],u=[];return e.program.statements.forEach((d,c)=>{u.push(ce({expression:d,statementIndex:c,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:a,introducedSymbols:s,diagnostics:l,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:a,introducedSymbols:s,diagnostics:l,statementTypes:u,finalType:u.at(-1)}}function ce(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?Me:t.valueKind==="string"?Ht:t.valueKind==="boolean"?Yt:re;case"Identifier":return uu(e,t.name,t.range);case"UnaryExpression":{let n=ce({...e,expression:t.argument});return t.operator==="!"?Ne(n)?Yt:(Z(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"),q):n.kind==="number"?Me:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?q:re:(Z(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"),q)}case"BinaryExpression":{let n=ce({...e,expression:t.left}),r=ce({...e,expression:t.right});switch(t.operator){case"&&":case"||":return fi(n)||fi(r)?(Z(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"),q):Yt;case"+":return n.kind==="string"&&r.kind==="string"?Ht:n.kind==="number"&&r.kind==="number"?Me:Gn(n,r)?re:(Wn(e,t.range,t.operator),q);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Me:Gn(n,r)?re:(Wn(e,t.range,t.operator),q);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?Ht:Gn(n,r)?re:(Wn(e,t.range,t.operator),q)}return re}case"ComparisonChain":{let n=t.operands.map(r=>ce({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let o=t.operators[r],i=n[r],a=n[r+1];if(!du(o,i,a))return Z(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"),q}return Yt}case"ConditionalExpression":{let n=ce({...e,expression:t.condition});Ne(n)||Z(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=ce({...e,expression:t.thenExpression}),o=ce({...e,expression:t.elseExpression}),i=Kn(r,o);return i||(Z(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"),q)}case"AssignmentExpression":return lu(e)}}function lu(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:o}=e,i=e.expression,a=ce({...e,expression:i.right});if(i.left.kind!=="Identifier")return ce({...e,expression:i.left}),Z(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"),q;let s=i.left,l=i.operator===":="?"declare":i.operator==="="?"write":"readwrite",u={name:s.name,kind:l,range:s.range,identifier:s,statementIndex:e.statementIndex};r.push(u);let d=bt(s.name);if(d.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(u),gi(e,s.range,d.raw,d.message),q;if(d.kind==="global-blackboard"){let m=t.globalBlackboard.get(d.key),h=i.operator===":="?a:i.operator==="="?m&&ze(m.type,a)?a:m?void 0:a:mi(m?.type??re,a,i.operator);if(i.operator!==":="&&i.operator!=="="&&!h)return Z(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"),q;if((i.operator===":="||i.operator==="=")&&m&&!ze(m.type,a))return Yn(e,s,m.type,a),q;let S=m?{...m}:{name:d.key,type:a,source:{kind:"global-blackboard",key:d.key,range:s.range,originId:e.originId},readable:!0,writable:!0};return S.type=h??a,t.globalBlackboard.set(d.key,S),e.resolvedIdentifiers.push({access:u,resolution:{kind:"global-blackboard",key:d.key,symbol:S}}),e.globalBlackboardAccesses.push({key:d.key,rawName:s.name,kind:l,range:s.range,inferredType:S.type}),S.type}let c=t.symbols.get(s.name);if(i.operator===":="&&!c){let m={name:s.name,type:a,source:{kind:"script-assignment",attributeName:n,range:s.range,originId:e.originId},readable:!0,writable:!0};return t.symbols.set(s.name,m),e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:m}}),o.push(m),a}if(!c)return e.resolvedIdentifiers.push({access:u,resolution:{kind:"unknown"}}),Z(e,"assignment-to-unknown-variable",s.range,`assignment target \`${s.name}\` is not defined`,`\`${s.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),q;if(e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:c}}),i.operator==="=")return ze(c.type,a)?(Hn(c,a),a):(Yn(e,s,c.type,a),q);if(i.operator===":=")return ze(c.type,a)?(Hn(c,a),a):(Yn(e,s,c.type,a),q);let p=mi(c.type,a,i.operator);return p?(Hn(c,p),p):(Z(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"),q)}function uu(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let o=bt(t);if(o.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(r),gi(e,n,o.raw,o.message),q;if(o.kind==="global-blackboard"){let s=e.environment.globalBlackboard.get(o.key);return e.globalBlackboardAccesses.push({key:o.key,rawName:t,kind:"read",range:n,inferredType:s?.type??re}),e.resolvedIdentifiers.push({access:r,resolution:{kind:"global-blackboard",key:o.key,...s?{symbol:s}:{}}}),s?.type??re}let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),Me;let a=e.environment.symbols.get(t);return a?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:a}}),a.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),re)}function mi(e,t,n){return e.kind==="error"||t.kind==="error"?q:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?re:n==="+="?e.kind==="number"&&t.kind==="number"?Me:e.kind==="string"&&t.kind==="string"?Ht:void 0:e.kind==="number"&&t.kind==="number"?Me:void 0}function Gn(e,t){return Zt(e)||Zt(t)}function Zt(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function fi(e){return!Ne(e)}function du(e,t,n){return Zt(t)||Zt(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 Wn(e,t,n){Z(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 Yn(e,t,n,r){Z(e,"variable-type-mismatch",t.range,`cannot assign ${Zn(r)} to variable \`${t.name}\` of type ${Zn(n)}`,`\`${t.name}\` expects ${Zn(n)} here`,"assign a compatible value or change the variable's source type")}function gi(e,t,n,r){Z(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 Hn(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 Z(e,t,n,r,o,i){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:o,help:i}})}function Zn(e){return e.kind==="custom"?e.name:e.kind}var yi=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),cu=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"]),pu=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],mu=[":=","=","+=","-=","*=","/="],bi=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function Jn(e){let t=e.source,n=vi(t,e.cursorOffset),r=Qt({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...fu(e,r)),vu(e.attributeInfo,t,n)&&o.push(...bu(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...gu(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(...yu(r.range,r.prefix)),ku(o)}function Qt(e){let t=e.source,n=vi(t,e.cursorOffset),r=je(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=Tu(t,n),a=Jt(r,i.start);if(i.start<i.end&&a&&yi.has(a.type))return{kind:a.type==="Identifier"&&Ri(r,a)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let s=Jt(r,n);return s&&yi.has(s.type)&&s.end<=n?{kind:s.type==="Identifier"&&Ri(r,s)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!s||cu.has(s.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function fu(e,t){let n=Su(e),r=t.prefix.toLowerCase(),o=[];for(let[i,a]of n.enums)Ke(i,r)&&o.push({label:i,kind:"enum",detail:`enum value ${a}`,replaceRange:t.range,sortText:`0-${i}`});for(let i of n.symbols.values())i.conflict||i.readable&&Ke(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:Si(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 a=`@${i.name}`;Ke(a,r)&&o.push({label:a,kind:"identifier",detail:Si(i),replaceRange:t.range,sortText:`2-${a}`})}for(let i of["true","false"])Ke(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function gu(e,t){return pu.filter(n=>Ke(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function yu(e,t){return mu.filter(n=>Ke(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function bu(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 Su(e){let t=de(e.environment),n=je(e.source),r=Ee(e.source);if(r.ok){let o=we({program:r.program,environment:t,attributeName:e.attributeName}),i=de(e.environment);for(let a of o.introducedSymbols)a.source.kind==="script-assignment"&&(a.source.range.end>e.cursorOffset||i.symbols.set(a.name,a));for(let a of o.globalBlackboardAccesses){if(a.kind==="read"||a.range.end>e.cursorOffset)continue;let s=o.environment.globalBlackboard.get(a.key),l=i.globalBlackboard.get(a.key),u;s?u={...s}:l?u={...l,type:a.inferredType}:u={name:a.key,type:a.inferredType,source:{kind:"global-blackboard",key:a.key,range:a.range},readable:!0,writable:!0},i.globalBlackboard.set(a.key,u)}return i}for(let o of n){if(o.type!=="Identifier")continue;if(o.end>e.cursorOffset)break;let i=hu(n,o.end);if(i?.type!=="ColonEqual"||i.end>e.cursorOffset)continue;let a=bt(o.text);if(a.kind!=="invalid-global-blackboard"){if(a.kind==="global-blackboard"){if(t.globalBlackboard.has(a.key))continue;t.globalBlackboard.set(a.key,{name:a.key,type:{kind:"unknown"},source:{kind:"global-blackboard",key:a.key,range:{start:o.start,end:o.end}},readable:!0,writable:!0});continue}t.symbols.has(a.name)||t.symbols.set(a.name,{name:a.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 Si(e){let t=Ru(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 Ru(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 vu(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=je(t).filter(i=>i.type!=="EndOfInput"),o=Jt(r,n);return!o||o.type==="Semicolon"}function Tu(e,t){let n=t;for(;n>0&&bi.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&bi.has(e[r]??"");)r+=1;return{start:n,end:r}}function Jt(e,t){for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r.end<=t)return r}}function Ri(e,t){if(t.type!=="Identifier")return!1;let n=Jt(e,t.start);return!n||n.type==="Semicolon"}function hu(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function Ke(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function vi(e,t){return Math.max(0,Math.min(e.length,t))}function ku(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 Ti=new WeakMap;function en(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=Ce({elementName:t.name,attributeName:o.name,resolvedNodeType:r});return i?[{attribute:o,info:i,parseResult:Ee(o.value)}]:[]})}function ae(e,t,n){return me(e.document,t,n)}function hi(e){return{start:0,end:e.value.length}}function ve(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?en(e,t).map(o=>{let i=ki(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?we({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):xu(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function xu(e,t){let n=Ti.get(e.view);n||(n=new WeakMap,Ti.set(e.view,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(a=>en(e,a.element).map((s,l)=>({id:`${a.path.join(".")}:${s.attribute.name}:${l}`,node:a,candidate:s}))),i=ht({baseEnvironment:ki(e,t.nodes),entries:o.map(a=>({id:a.id,source:a.candidate.attribute.value,attributeName:a.candidate.attribute.name,originId:a.id,parseResult:a.candidate.parseResult}))}).flatMap((a,s)=>{let l=o[s];return l?[{...a,node:l.node,candidate:l.candidate}]:[]});return n.set(t,i),i}function ki(e,t){let n=Y(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let a=e.getNodeModel(i);if(a?.kind==="SubTree")for(let s of a.ports){let l=Ie(s),d=G(e.semantic,l)?.canonical??l;r.push({name:s.name,type:fe(n,l),source:{kind:"subtree-port",nodeType:i,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:d})}}for(let a of t)for(let s of a.portBindings){if(s.usage.status!=="resolved")continue;let l=F({portName:s.usage.port.name,rawValue:s.usage.value});if(!l.ok||l.reference.scope==="global")continue;let u=Ie(s.usage.port),c=G(e.semantic,u)?.canonical??u,p=s.usage.port.direction,m=a.usage.model.status==="resolved"?a.usage.model.model.id:a.usage.nodeType;r.push({name:l.reference.key,type:fe(n,u),source:{kind:"port-remap",nodeType:m,portName:s.usage.port.name,direction:p},readable:p==="input"||p==="output"||p==="inout",writable:p==="output"||p==="inout",compatibilityKey:c})}return o.push(...Iu(e,n)),Tt({symbols:r,globalBlackboardSymbols:o,augmentations:ut(e.semantic),areTypesCompatible:(a,s)=>a&&s?be(e.semantic,a,s):!0})}function Iu(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 a=F({portName:i.usage.port.name,rawValue:i.usage.value});if(!a.ok||a.reference.scope!=="global")continue;let s=Ie(i.usage.port),u=G(e.semantic,s)?.canonical??s,d=i.usage.port.direction;n.push({name:a.reference.key,type:fe(t,s),source:{kind:"global-blackboard-remap",nodeType:o,portName:i.usage.port.name,direction:d,key:a.reference.key},readable:d==="input"||d==="output"||d==="inout",writable:d==="output"||d==="inout",compatibilityKey:u})}}return n}var xi=B({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of ve(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:b.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:ae(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 Ii=B({name:"script/valid-assignment",create(e){return{Element(t){for(let n of ve(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let o=r.code==="assignment-to-unknown-variable"?b.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?b.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?b.ScriptVariableTypeMismatch:r.code==="invalid-global-blackboard-identifier"?b.InvalidGlobalBlackboardIdentifier:void 0;o&&e.report({code:o,message:r.message,range:ae(e,n.attribute,r.range),details:r.details})}}}}});var Ci=B({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of ve(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:b.InvalidScriptOperandType,message:r.message,range:ae(e,n.attribute,r.range),details:r.details})}}}});var Bi=B({name:"script/valid-result-type",create(e){return{Element(t){for(let n of ve(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||Ne(o)||e.report({code:b.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:ae(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 Di=B({name:"script/valid-syntax",create(e){return{Element(t){for(let n of en(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let o=r.kind==="empty-script"?b.EmptyScript:r.kind==="invalid-token"?b.InvalidScriptToken:b.InvalidScriptSyntax;e.report({code:o,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??ae(e,n.attribute,hi(n.attribute)):ae(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Ei=[Di,xi,Ii,Ci,Bi];var Cu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Ni(e){return B({name:Cu[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Bu(n)})}}}})}function Bu(e){return e.code?{code:e.code}:void 0}var wi=[Ni("unused"),Ni("missing-reason")];function tn(e,t){return e.attributes.find(n=>n.name===t)}function Mi(e,t){if(!e)return!1;let n=(r,o)=>{let i=o||r.name==="TreeNodesModel";if(r===t)return i;for(let a of r.children)if(a.kind==="element"&&n(a,i))return!0;return!1};return n(e,!1)}var Pi=[B({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||tn(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),B({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=at(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))}}}}),B({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of st(e.semantic)){let n=J(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})}}}}}),B({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=tn(t,"main_tree_to_execute");!n?.value||En(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),B({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Mi(e.document.root,t))return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(i=>i.name==="ID")??tn(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})}}}}),B({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Mi(e.document.root,t))return;let n=tn(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})}}}}),B({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var Du=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Eu(e,t){return e===t?String(e):`${e}\u2013${t}`}var Ai=B({name:"model/valid-child-count",create(e){return{Element(t){if(ie(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Nu(e,t,n.model.model.id,n.model.model.kind)}}}});function Nu(e,t,n,r){let o=Ho(t).length,i=Du.get(n);if(i){if(o<i.min||o>i.max){let a=Eu(i.min,i.max);e.report({message:`\`${n}\` requires ${a} 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 _i=B({name:"model/valid-port-value",create(e){return{Element(t){if(ie(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"&&Wt(e,{port:o.port,value:r.value,range:r.range,registry:Y(e.semantic),typeDefinition:G(e.semantic,o.port.type),allowRemap:!0,diagnosticCode:b.InvalidPortValueType,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var Li=B({name:"model/require-port",create(e){return{Element(t){if(ie(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 Oi=[B({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(ie(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})}}}}),B({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(ie(t)||t.selfClosing||Zo(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 Vi=B({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 qi=B({name:"model/no-unknown-port",create(e){return{Element(t){if(ie(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let o=n.ports.map(a=>a.name).sort(),i=o.length>=1&&o.length<=8?[`note: defined ports: ${o.map(a=>`\`${a}\``).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 Ui=[Vi,qi,Li,_i,...Oi,Ai];function wu(e,t){return e.attributes.find(n=>n.name===t)}function Mu(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Fi=[B({name:"xml/valid-root",create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||t.name==="root"||e.report({message:"Root element must be <root>",range:t.range})}}}}),{name:"xml/require-btcpp-format",code:b.MissingBTCPPFormat,defaultSeverity:"error",meta:{description:'Root element must declare BTCPP_format="4".'},create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||wu(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},B({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)||Mu(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Qn=[...Fi,...Ei,...Pi,...ri,...Ui,...Wo,...wi],Xg=new Map(Qn.map(e=>[e.name,e]));function $i(e){if(e!=="off")return e==="info"?I.Info:e==="warn"?I.Warning:I.Error}function Xi(e,t){return Mt(e.linter.rules[t])?.options??{}}function ji(e){let t=Mt(e.config.linter.rules[e.rule]);return $i(t?t.severity:e.defaultSeverity)}function zi(e){let t=[],n=e.facts??jo(),r=e.rules?new Set(e.rules):void 0,o=[];for(let a of Qn){if(r&&!r.has(a.name))continue;let s=ji({config:e.config,rule:a.name,defaultSeverity:a.defaultSeverity});if(!s)continue;let l=Xi(e.config,a.name),u=a.optionsSchema?.safeParse(l),d=u?.success?u.data:l,c=Go({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:d,diagnostics:t,rule:a.name,code:a.code,severity:s,facts:n});o.push(a.create(c))}for(let a of o)a.Document?.();e.document.root&&Ki(e.document.root,o);let i=at(e.semantic,e.document.uri);for(let a of i?.treeNodesModel??[])for(let s of o)s.TreeNodeModel?.(a);for(let a of o)a.ProgramExit?.();return t.map((a,s)=>({diag:a,index:s})).sort((a,s)=>Pu(a.diag,s.diag)||a.index-s.index).map(a=>a.diag)}function Ki(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Ki(n,t)}function Pu(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 er(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let r=[...e.diagnostics],o=n.documentView??ee(e,{semantic:t,config:n.config,policy:ye(n.config)});return r.push(...zi({document:e,view:o,semantic:t,config:n.config})),r}function Gi(e){return e?.documents??[]}function Au(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 _u(e){let t=Le();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 se(e,t){let n=mt(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,...Gi(r).filter(d=>!Au(e.document,d))]:Gi(r),i=_u(e.config||t.config),a=ye(i),s=r?.nodeDefinitionModels??[],l=Bn(o,{config:i,models:s,augmentations:t.augmentations}).index,u=n.document?ee(n.document,{semantic:l,config:i,policy:a}):void 0;return{document:e.document,parsed:n.document,documentView:u,diagnostics:n.document?er(n.document,l,{config:i,documentView:u}):n.diagnostics,partial:n.partial===!0,semantic:l,config:i,nodeUsagePolicy:a,workspace:r}}function Wi(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:T(r,r),newText:n}}function Yi(e,t){let r=(t.fullRange?.start||t.range.start).offset;for(;r>0&&/[ \t]/.test(e.text[r-1]||"");)r-=1;return{range:T(e.positionAt(r),e.positionAt(t.range.end.offset)),newText:""}}function Hi(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:T(o,o),newText:` ${n}=""`}}function nn(e){return T(e.positionAt(0),e.positionAt(e.text.length))}function tr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=gt(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:nn(t.document),newText:o.text}]});for(let i of n){if(!i.range)continue;let a=H({document:t.document,parsed:e.parsed,position:i.range.start});if(i.code==="BT101_MISSING_REQUIRED_PORT"){let s=Math.min(i.range.start.offset+1,i.range.end.offset),l=e.parsed?.root&&Xe(e.parsed.root,s)||("element"in a?a.element:void 0);if(!l)continue;let u=L(e.semantic,{element:l,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}),d=u.ports.find(c=>c.required&&!u.portUsages.some(p=>p.status==="resolved"&&p.name===c.name));d&&r.push({title:`Add missing port ${d.name}`,kind:"quickfix",diagnostics:[i],edits:[Hi(t.document,l,d.name)]})}if(i.code==="BT102_UNKNOWN_PORT"&&"attribute"in a&&"element"in a&&a.attribute){let l=(a.element?L(e.semantic,{element:a.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===a.attribute),u=l?Yi(t.document,a.attribute):void 0;u&&l&&r.push({title:`Remove unknown port ${a.attribute.name}`,kind:"quickfix",diagnostics:[i],edits:[u]})}if(i.code==="BT002_MISSING_BTCPP_FORMAT"&&e.parsed?.root){let s=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:T(s,s),newText:' BTCPP_format="4"'}]})}r.push({title:`Suppress ${i.code} for next line`,kind:"quickfix",diagnostics:[i],edits:[Wi(t.document,i.range.start.line,`<!-- btxml-disable-next-line ${i.code} reason: TODO -->
14
- `)]})}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 j(e,t){return e?{range:e,newText:t}:void 0}function Te(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 nr(e){return ke(e)}function Pe(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function Zi(e,t){return!e||!t?!1:Pe(e)===Pe(t)}function Ji(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 a={identity:i.identity,key:i.key,scope:i.scope,type:o.type,direction:o.direction,nodeType:n.usage.nodeType||n.tagName,portName:o.name},s=t.get(i.identity);if(!s){t.set(i.identity,a);continue}let l=Pe(s.type),u=Pe(a.type);if(l&&u&&l!==u){t.set(i.identity,{...s,conflict:!0});continue}!l&&u&&t.set(i.identity,{...s,type:a.type})}}return[...t.values()]}function Lu(e,t,n){return T(e.positionAt(t),e.positionAt(n))}function Ou(e,t,n){let r=t.valueContentRange;if(!r)return;let o=r.start.offset,i=r.end.offset,a=e.text.slice(o,i),s=a.startsWith("{"),l=a.endsWith("}");if(s&&n>o){let u=o+1,d=a[1]==="@"?u+1:u,c=l?i-1:i;return{replacementRange:Lu(e,d,Math.max(d,c)),wrapsReference:!1,hasScopeMarker:a[1]==="@"}}return{insertText:t.value,replacementRange:r,wrapsReference:!0,hasScopeMarker:!1}}function rr(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,a=Ou(t,n,r),s=a?.wrapsReference??!1,l=a?.hasScopeMarker??!1;if(l&&o.scope!=="global")return;let u=o.key;s?u=nr(o):o.scope==="global"&&(u=`@${o.key}`);let d=o.key;s?d=nr(o):o.scope==="global"&&(d=l?o.key:`@${o.key}`);let c=o.scope==="global"?` @${o.key}`:"",p=`${o.key} ${u}${c}`.trim();return O(u,"Reference",i,a?{range:a.replacementRange,newText:d}:void 0,{filterText:p,insertText:d})}var Qi=new WeakMap;function Ge(e,t){let n=e.parsed?H({document:e.document,parsed:e.parsed,position:t}):void 0;if(!n||n.kind!=="attribute-value")return;let r=sr(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,a=ur(r.attribute,i),s=Qt({source:r.source,cursorOffset:a});if(s.kind!=="identifier"||a<s.range.start||a>s.range.end)return;let l=oa(e,r),u=l.analysis?.resolvedIdentifiers.find(c=>c.access.range.start===s.range.start&&c.access.range.end===s.range.end&&c.resolution.kind!=="unknown");if(!u||u.resolution.kind==="unknown")return;let d=u.resolution.kind==="symbol"?{kind:"symbol",symbol:u.resolution.symbol}:u.resolution.kind==="global-blackboard"?{...u.resolution,origin:"script"}:u.resolution;return{attributeContext:r,range:or(e,r,s.range),reference:d,flowState:l,occurrence:{uri:e.document.uri,attributeContext:r,identifier:u.access,reference:d,documentRange:or(e,r,u.access.range)}}}function ea(e,t){let n=(t.reference.kind==="global-blackboard"?sa(e):on(e,t.attributeContext.behaviorTree).flatMap(r=>ia(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:Uu(t.reference.symbol,r.reference));return t.reference.kind==="global-blackboard"?Fu([...n,...aa(e,t.reference.key)]):n}function ta(e,t){return la(aa(e,t).map(n=>({uri:n.uri,range:n.documentRange})))}function na(e,t){return la(sa(e).filter(n=>n.reference.kind==="global-blackboard"&&n.reference.key===t).map(n=>({uri:n.uri,range:n.documentRange})))}function ir(e,t){return on(e,t)}function ra(e,t,n){let r=sr(e,t,n);if(r)return oa(e,r).environmentBefore}function ar(e){let t=rn(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 rn(e){return e.kind==="custom"?e.name:e.kind}function oa(e,t){let r=on(e,t.behaviorTree).find(o=>o.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function on(e,t){let n=Qi.get(e);n||(n=new WeakMap,Qi.set(e,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(s=>s.element.attributes.flatMap(l=>{let u=sr(e,s.element,l);return u?[u]:[]})),i=o.map(s=>({id:s.id,source:s.source,attributeName:s.attribute.name,originId:s.id})),a=ht({baseEnvironment:Vu(e,t.nodes),entries:i}).flatMap((s,l)=>{let u=o[l];return u?[{...s,context:u}]:[]});return n.set(t,a),a}function sr(e,t,n){let r=e.documentView?.nodes.find(s=>s.element===t);if(!r)return;let o=r.usage.model.status==="resolved"?r.usage.model.model.id:r.usage.nodeType;if(!Ce({elementName:t.name,attributeName:n.name,resolvedNodeType:o}))return;let a=t.attributes.indexOf(n);return{id:`${r.path.join(".")}:${n.name}:${a}`,node:r,element:t,attribute:n,source:n.value,behaviorTree:r.behaviorTree}}function Vu(e,t){let n=Y(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let s=Q(e.semantic,i);if(s?.kind==="SubTree")for(let l of s.ports){let u=l.effectiveType??l.type,c=G(e.semantic,u)?.canonical??u;r.push({name:l.name,type:fe(n,u),source:{kind:"subtree-port",nodeType:i,portName:l.name,direction:l.direction},readable:!0,writable:l.direction==="output"||l.direction==="inout",compatibilityKey:c})}}for(let s of t)for(let l of s.portBindings){if(l.declaredPort.status!=="resolved")continue;let u=da(l);if(!u||u.scope==="global")continue;let d=l.declaredPort.port.type,p=G(e.semantic,d)?.canonical??d,m=l.declaredPort.port.direction,h=s.usage.model.status==="resolved"?s.usage.model.model.id:s.usage.nodeType;r.push({name:u.key,type:fe(n,d),source:{kind:"port-remap",nodeType:h,portName:l.declaredPort.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:p})}let a=lr(e).flatMap(({trees:s})=>s.flatMap(l=>l.nodes));return o.push(...qu(e,n,a)),Tt({symbols:r,globalBlackboardSymbols:o,augmentations:ut(e.semantic),areTypesCompatible:(s,l)=>s&&l?be(e.semantic,s,l):!0})}function qu(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 a of o.portBindings){if(a.declaredPort.status!=="resolved")continue;let s=da(a);if(!s||s.scope!=="global")continue;let l=a.declaredPort.port.type,d=G(e.semantic,l)?.canonical??l,c=a.declaredPort.port.direction;r.push({name:s.key,type:fe(t,l),source:{kind:"global-blackboard-remap",nodeType:i,portName:a.declaredPort.port.name,direction:c,key:s.key},readable:c==="input"||c==="output"||c==="inout",writable:c==="output"||c==="inout",compatibilityKey:d})}}return r}function ia(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:or(e,t.context,n.access.range)}]}):[]}function Uu(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 Fu(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 aa(e,t){return lr(e).flatMap(({uri:n,trees:r})=>r.flatMap(o=>o.nodes.flatMap(i=>i.portBindings.flatMap(a=>a.blackboardReferences.filter(s=>s.scope==="global"&&s.key===t).map(s=>({uri:n,attributeContext:{id:`${i.path.join(".")}:${a.attribute.name}:${i.element.attributes.indexOf(a.attribute)}`,node:i,element:i.element,attribute:a.attribute,source:a.attribute.value,behaviorTree:i.behaviorTree},identifier:{name:`@${s.key}`,kind:"read",range:{start:0,end:0},identifier:{kind:"Identifier",name:`@${s.key}`,range:{start:0,end:0}},statementIndex:-1},reference:{kind:"global-blackboard",key:s.key,origin:"port-remap"},documentRange:s.range}))))))}function sa(e){return lr(e).flatMap(({uri:t,trees:n})=>n.flatMap(r=>{let o=Xu(e,t);return on(o,r).flatMap(i=>$u(o,t,i))}))}function $u(e,t,n){return ia(e,n).map(r=>({...r,uri:t}))}function lr(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=ee(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 Xu(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=Ve(t,n.originalText,0,"btcpp-xml"),o=ee(n,{semantic:e.semantic,config:e.config,policy:e.nodeUsagePolicy});return{...e,document:r,parsed:n,documentView:o}}function la(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 or(e,t,n){return me(e.parsed??{originalText:e.document.text},t.attribute,n)}function ur(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 ua(e,t,n){let r=e.parsed??{originalText:e.document.text};return me(r,t,n)}function da(e){if(e.declaredPort.status!=="resolved")return;let t=F({portName:e.declaredPort.port.name,rawValue:e.value});return t.ok?t.reference:void 0}function ju(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 Ce({elementName:t.name,attributeName:n.name,resolvedNodeType:o})}function ca(e,t,n,r){let o=ju(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,a=ra(e,n,r),s=Math.max(0,t.position.offset-i.start.offset);return Jn({source:r.value,cursorOffset:ur(r,s),environment:a,attributeName:r.name,attributeInfo:o}).map(u=>zu(e,r,u))}function zu(e,t,n){return O(n.label,Ku(n.kind),n.detail,{range:ua(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function Ku(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 pa(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function ma(e,t){if(!e)return;let n=pa(e)?e.valueContentRange:e.valueRange;if(n)return j(n,pa(e)?t:`"${t}"`)}function fa(e,t,n,r){let o=[],i=[];for(let a of st(e)){let s=J(e,a),l=O(a,"Value","BehaviorTree ID",r?ma(r,a):j(n,a));s.some(u=>u.uri===t)?o.push({...l,sortText:`0-${a}`}):i.push({...l,sortText:`1-${a}`})}return[...o,...i]}function Gu(e){return O("SubTree","Class","Built-in subtree tag",j(e,"SubTree"),{sortText:"0-SubTree"})}function Wu(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",j(e.replacementRange,`${t}>`))]:[]}function Yu(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(o=>O(o,"Class",void 0,j(t,o))),...["Action","Condition","Control","Decorator"].map(o=>O(o,"Class",void 0,j(t,o))),Gu(t)],r=new Set;for(let o of Lt(e))o.id!=="SubTree"&&(r.has(o.id)||(r.add(o.id),n.push(O(o.id,"Class",void 0,j(t,o.id)))));return Te(n)}function sn(e,t,n){return L(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function dr(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}`:""}`,j(t,r.name)))}function Hu(e,t,n){let r=[O("ID","Property",void 0,j(n,"ID"))];return r.push(...dr(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function Zu(e,t,n,r){if(!e)return[];if(xe(e.name)){let i=[];e.attributes.some(s=>s.name==="ID")||i.push(O("ID","Property",void 0,j(r,"ID")));let a=sn(n,t,e);return i.push(...dr(a,r)),i}return e.name==="SubTree"?Hu(e,sn(n,t,e),r):e.name==="include"?[O("path","Property",void 0,j(r,"path"))]:dr(sn(n,t,e),r)}function Ju(e,t,n,r){return fa(t.semantic,e.document.uri,n,r)}function Qu(e,t,n,r){let o=[],i=new Set;for(let a of Lt(e))a.kind===t&&(i.has(a.id)||(i.add(a.id),o.push(O(a.id,"Value",`${t} node ID`,r?ma(r,a.id):j(n,a.id)))));return o}function ed(e,t,n){if(t.kind!=="attribute-value")return[];let{attribute:r,element:o}=t;if(!r||!o)return[];let i=xe(o.name);if(i&&r.name==="ID")return Qu(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return Ju(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return fa(n.semantic,e.document.uri,r.valueContentRange||r.valueRange,r);if(o.name==="include"&&r.name==="path")return(n.workspace?n.workspace.documents.map(N=>N.path||N.uri).filter(N=>N.endsWith(".xml")):[]).map(N=>O(N,"File","XML file",j(r.valueContentRange||r.valueRange,N)));let a=ca(n,e,o,r);if(a)return a;let s=sn(n,e,o);if(i&&s.model.status!=="resolved")return[];let l=ue(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 u=l.port,d=r.valueContentRange||r.valueRange,c=[];u.enum?.length&&c.push(...u.enum.map(C=>O(C,"Enum",u.type,j(d,C),{sortText:`${an.enumLiteral}-${C}`}))),(u.type||"").toLowerCase()==="bool"&&c.push(...["true","false"].map(C=>O(C,"Value","bool",j(d,C),{sortText:`${an.boolLiteral}-${C}`})));let p=Ji(n),m=Pe(u.type),h=p.filter(C=>!C.conflict&&Zi(u.type,C.type)),S=p.filter(C=>!C.conflict&&!Pe(C.type)&&m),D=h.flatMap(C=>{let N=rr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:C,detail:C.scope==="global"?`${C.type||"unknown"} global blackboard key from ${C.nodeType}.${C.portName}`:`${C.type||"unknown"} blackboard key from ${C.nodeType}.${C.portName}`});return N?[{...N,sortText:`${an.matchingKey}-${C.scope==="global"?C.identity:C.key}`}]:[]}),E=S.flatMap(C=>{let N=rr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:C,detail:C.scope==="global"?`unknown-type global blackboard key from ${C.nodeType}.${C.portName}`:`unknown-type blackboard key from ${C.nodeType}.${C.portName}`});return N?[{...N,sortText:`${an.unknownKey}-${C.scope==="global"?C.identity:C.key}`}]:[]});return c.push(...D,...E),c.length>0?Te(c):(t.valuePrefix||"").includes("{")?Te(c):c}function cr(e,t){let n=H({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:pn.map(r=>O(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:Te(ed(t,n,e))}:n.kind==="attribute-name"?{items:Te(Zu(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:Te(Yu(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:Te(Wu(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 td(e,t,n){return lt(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 pr(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 mr(e,t,n,r,o,i,a){let s=pr(e,i,a),l=(t??[]).flatMap(u=>{if(u.uri===a)return[];let d=ee(u,{semantic:n,config:r,policy:o});return pr(d,i,u.uri)});return ln([...s,...l])}function fr(e,t,n){return pr(e,t,n)}function un(e,t,n,r,o,i,a){if(!e)return[];let s=H({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 s?s.element:void 0,u="attribute"in s?s.attribute:void 0,d=l?L(r,{element:l,documentRoot:e.root,uri:e.uri,config:o,policy:i}):void 0;if(l?.name==="SubTree"&&u?.name==="ID"){if(d?.tagForm==="model-definition")return J(r,u.value).map(m=>m.idRange?{uri:m.uri,range:m.idRange}:void 0).filter(m=>!!m);let c=td(r,u.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},...c]):c}if(p?.status==="ambiguous")return ln([...p.behaviorTrees.map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:void 0),...c].filter(m=>!!m));if(p?.status==="resolved"&&p.kind==="node-model"){if(c.length>0)return c;if(p.model.idRange)return[{uri:p.model.uri||e.uri,range:p.model.idRange}]}return c}if(l?.name==="root"&&u?.name==="main_tree_to_execute")return J(r,u.value).map(c=>c.idRange?{uri:c.uri,range:c.idRange}:void 0).filter(c=>!!c);if(l?.name==="include"&&u?.name==="path"&&a){let c=a.find(p=>p.uri===u.value||p.path===u.value||(p.path?p.path.endsWith(`/${u.value}`):!1));if(c?.root?.range)return[{uri:c.uri,range:c.root.range}]}if(u&&l){let c=t?Fe(t,n):void 0,p=c?.blackboardReferences.find(m=>n.offset>=m.range.start.offset&&n.offset<=m.range.end.offset);if(p)return p.scope==="global"?mr(t,a,r,o,i,p.identity,e.uri):fr(t,p.identity,e.uri);if(c?.declaredPort.status==="resolved"){let m=c.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(s.kind==="tag-name"&&l&&d?.model.status==="resolved"){let c=d.model.model;if(c.idRange)return[{uri:c.uri||e.uri,range:c.idRange}];if(c.range)return[{uri:c.uri||e.uri,range:c.range}]}if(u?.name==="ID"&&d?.tagForm==="generic-node"&&d.model.status==="resolved"){let c=d.model.model;if(c.idRange)return[{uri:c.uri||e.uri,range:c.idRange}];if(c.range)return[{uri:c.uri||e.uri,range:c.range}]}return[]}function gr(e,t){let n=Ge(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let o=r.source,a=ir(e,n.attributeContext.behaviorTree).find(s=>s.id===o.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:me(e.parsed??{originalText:e.document.text},a.attribute,o.range)}]}}if(r.source.kind==="port-remap"||r.source.kind==="global-blackboard-remap"){let o=r.source,i=$({scope:o.kind==="global-blackboard-remap"?"global":"local",key:r.name}),a=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(u=>u.identity===i)),s=a?.declaredPort.port.nameRange;if(s)return{locations:[{uri:a.declaredPort.port.uri||e.document.uri,range:s}]}}if(r.source.kind==="subtree-port"){let o=r.source,a=(o.nodeType?Q(e.semantic,o.nodeType):void 0)?.ports.find(s=>s.name===o.portName&&s.direction===o.direction);if(a?.nameRange)return{locations:[{uri:a.uri||e.document.uri,range:a.nameRange}]}}}if(n?.reference.kind==="global-blackboard"){let r=$({scope:"global",key:n.reference.key}),o=ta(e,n.reference.key);if(o.length>0)return{locations:o};let i=n.reference.symbol;if(i?.source.kind==="global-blackboard"){let a=i.source,l=ir(e,n.attributeContext.behaviorTree).find(u=>u.id===a.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:me(e.parsed??{originalText:e.document.text},l.attribute,a.range)}]}}}return{locations:un(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function yr(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function ga(e,t){let n=gt(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:nn(e.document),newText:n.text}],diagnostics:[]}}function br(e,t){return ga(t,e.config.formatter)}function ya(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
12
+ `);let d=s.join(u),c=u.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),p=new RegExp(`(?:${c})+$`,"u"),x=`${d.replace(p,"")}${u}`;return{ok:!0,text:x,changed:x!==e,skipped:!1,diagnostics:n.diagnostics.filter(S=>S.severity!==C.Error)}}function Xe(e,t){if(!(!K(e.range,t)&&!K(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=Xe(n,t);if(r)return r}return e}}var Xo=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,kl=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function xl(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 u=e.indexOf("-->",o+4);if(u<0||u+3>t)break;r=u+3;continue}if(e.startsWith("<![CDATA[",o)){let u=e.indexOf("]]>",o+9);if(u<0||u+3>t)break;r=u+3;continue}if(e.startsWith("<?",o)){let u=e.indexOf("?>",o+2);if(u<0||u+2>t)break;r=u+2;continue}if(e.startsWith("<!",o)){let u=e.indexOf(">",o+2);if(u<0||u+1>t)break;r=u+1;continue}if(e[o+1]==="/"){let d=e.slice(o+2).match(Xo)?.[0];if(d){for(let p=n.length-1;p>=0;p-=1)if(n[p]===d){n.length=p;break}}let c=e.indexOf(">",o+2);if(c<0||c>=t)break;r=c+1;continue}let a=e.slice(o+1).match(/^\s*([A-Za-z_:][A-Za-z0-9_.:-]*)/)?.[1];if(!a){r=o+1;continue}let s=e.indexOf(">",o+1);if(s<0||s>=t)break;e.slice(o+1,s).trimEnd().endsWith("/")||n.push(a),r=s+1}return n.at(-1)}function jt(e,t){let n=e.positionAt(t);return v(n,n)}function ne(e,t,n){return v(e.positionAt(t),e.positionAt(n))}function Kt(e){return{name:e.name,value:e.value,range:ne(e.document,e.nameStart,e.valueEnd),fullRange:ne(e.document,e.nameStart,e.valueEnd),nameRange:ne(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?ne(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:ne(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?ne(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function Il(e,t,n){let r=[];for(let o of t.matchAll(kl)){let i=o.index??0,a=o[1],s=o[2],l=o[3],u=o[4],d=o[0].indexOf(a),c=o[0].indexOf("=",d+a.length),p=o[0].indexOf(s,c+1),m=n+i+p,x=m+s.length;r.push(Kt({document:e,name:a,value:l??u??"",nameStart:n+i+d,nameEnd:n+i+d+a.length,equalsStart:n+i+c,equalsEnd:n+i+c+1,valueStart:m,valueEnd:x,valueContentStart:m+1,valueContentEnd:x-1}))}return r}function Cl(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 a=n+o,s=r.slice(o+2);if(!/\s/.test(s))return{kind:"closing-tag-name",tagNamePrefix:s,replacementRange:ne(e,a+2,t)}}function $o(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 a=n+o,s=a+1,l=r.slice(o+1);if(/^\s*[!?/]/.test(l))return;let u=l.match(/^\s*/)?.[0].length??0,d=l.slice(u).match(Xo);if(!d)return{kind:"tag-name"};let c=d[0],p=u,m=p+c.length,x=ne(e,s+p,s+m),S={kind:"element",name:c,attributes:Il(e,l,s),children:[],range:ne(e,a,t),fullRange:ne(e,a,t),openTagRange:ne(e,a,t),startTagRange:ne(e,a,t),nameRange:x,selfClosing:!1};if(l.length<=m&&!/\s/.test(l.slice(m)))return{kind:"tag-name",element:S,replacementRange:x};let D=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(D){let E=D[0].indexOf(D[1]),f=(D.index??0)+E,y=f+D[1].length,R=l.indexOf("=",y),I=D[2],w=D[4]??"";if(I){let V=l.indexOf(I,R+1),Ae=s+V+1,g=Kt({document:e,name:D[1],value:D[3]??"",nameStart:s+f,nameEnd:s+y,equalsStart:s+R,equalsEnd:s+R+1,valueStart:s+V,valueEnd:t,valueContentStart:Ae,valueContentEnd:t});return{kind:"attribute-value",element:S,attribute:g,valuePrefix:e.text.slice(Ae,t)}}let _=w.length>0?t-s-w.length:t-s;return{kind:"attribute-value",element:S,attribute:Kt({document:e,name:D[1],value:w,nameStart:s+f,nameEnd:s+y,equalsStart:s+R,equalsEnd:s+R+1,valueStart:s+_,valueEnd:t,valueContentStart:s+_,valueContentEnd:t}),valuePrefix:e.text.slice(s+_,t)}}let A=l.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)?$/s);if(A){let h=A[1]??"",E=t-s-h.length;return{kind:"attribute-name",element:S,attribute:Kt({document:e,name:h,value:"",nameStart:s+E,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:S,attribute:{name:"",value:"",range:jt(e,t),fullRange:jt(e,t),nameRange:jt(e,t),valueRange:jt(e,t)}}}function H(e){let{document:t,parsed:n,position:r}=e,o=r.offset,i=t.text.length>0?{kind:"text"}:{kind:"unknown"},a=Cl(t,o);if(a)return{kind:"closing-tag-name",tagNamePrefix:a.tagNamePrefix,replacementRange:a.replacementRange,tagText:xl(t.text,o)};if(n?.root){let u=Xe(n.root,o);if(u){for(let d of u.attributes){if(K(d.nameRange,o))return{kind:"attribute-name",element:u,attribute:d};if(K(d.valueRange,o)||K(d.valueContentRange,o))return{kind:"attribute-value",element:u,attribute:d,valuePrefix:d.valueContentRange&&o>=d.valueContentRange.start.offset?t.text.slice(d.valueContentRange.start.offset,o):""}}if(K(u.nameRange||u.openTagRange,o))return{kind:"tag-name",element:u,replacementRange:u.nameRange};if(K(u.openTagRange,o)){let d=$o(t,o);if(d)return d.kind==="tag-name"?{...d,element:d.element??u}:d}i={kind:"element",element:u}}}let s=$o(t,o);if(s)return s;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 zt(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 me(e,t,n){let r=t.valueContentRange??t.valueRange,o=zt(t,n.start),i=zt(t,n.end),a=q(e.originalText,r.start.offset+o),s=q(e.originalText,r.start.offset+i);return v(a,s)}function jo(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Ko(e,t){return e.includeIssuesByUri.get(t)??[]}function zo(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Go(e){let{document:t,semantic:n,config:r,view:o}=e,i=new Map(o.nodes.map(u=>[u.element,u])),a=new Map(o.subtreeCalls.map(u=>[u.node.element,u])),s=ye(r),l=Dl(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(u){let d=W(u.code??e.code,e.severity,u.message,u.range,t.uri,u.details,u.data);e.diagnostics.push({...d,rule:e.rule,...u.relatedInformation?{relatedInformation:u.relatedInformation}:{}})},getIncludeIssues(u){let d=Ko(e.facts,t.uri);return u?d.filter(c=>c.kind===u):d},getSuppressionIssues(u){let d=zo(e.facts,t.uri);return u?d.filter(c=>c.kind===u):d},getNodeUsage(u){return L(n,{element:u,documentRoot:t.root,uri:t.uri,config:r,policy:s,isModelDefinition:l.has(u)})},getPortUsage(u,d){return ue(n,{element:u,documentRoot:t.root,attributeName:d,uri:t.uri,config:r,policy:s,isModelDefinition:l.has(u)})},resolveSubTree(u,d){return ct(n,{id:u,fileLocalUri:d,config:r})},getNodeModel(u){return ee(n,u)},getBehaviorTrees(u){return Q(n,u)},getTreeNodeView(u){return i.get(u)},getSubTreeCallView(u){return a.get(u)}}}function Dl(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return $n(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||$n(n,t);return t}function $n(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&$n(n,t)}function B(e){let t=Dr[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Bl={"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 Re(e){return B({name:Bl[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:El(n)})}}}})}function El(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 Wo=[Re("missing-path"),Re("not-found"),Re("cycle"),Re("outside-root"),Re("unresolved-variable"),Re("depth-exceeded"),Re("too-many-files"),Re("external-used")];import Nl from"ajv";var wl=Nl,Ml=new wl,Pl=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],Al={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}},Xn=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"]),Yo=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 Ho(e){return e.children.filter(t=>t.kind==="element")}function ae(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function Zo(e){return e.children.some(t=>t.kind==="element")}function Wt(e,t){let n=Jo(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Jo(e){let t=yt(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 Gt(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Ul(e.registry,n,e.value)?void 0:Gt(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!ei(r,e.value))return _l(r)?Gt(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 Ie(e){return e.effectiveType??e.type}function Qo(e,t){return ie(e,Ie(t))}function yt(e,t){let n=F({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function Gt(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function _l(e){let t=Ze(e)??e;return ti(e)!==void 0||ql.has(t.toLowerCase())}function ei(e,t){let n=ti(e);if(n)return Ll(n,t);let r=(Ze(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 Pl.includes(t);default:return Xn.has(r)||Yo.has(r)?ni(r,t):!1}}function ti(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Ll(e,t){let n=Vl(t);return n?n.every(r=>Ol(e,r)):!1}function Ol(e,t){if(t.kind==="string")return ei(e,t.value);let n=(Ze(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 Xn.has(n)||Yo.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&ni(n,String(t.value)):!1}}function ni(e,t){let n=Al[e];if(!n)return!1;if(Xn.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 Vl(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 Ul(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 a=t.items[i];return a?Jo({port:{name:`tuple[${i}]`,type:a},value:o,registry:e,typeDefinition:ie(e,a),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 Ml.compile(t.schema)(r)===!0}catch{return!1}}}var ql=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 ri=[B({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})}}}}),B({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))}}}}),B({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=bn(n.name);r&&e.report({code:b.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),B({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of dt(e.semantic))t.uri&&t.uri!==e.document.uri||Fl(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),B({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!$l(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=Xl(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!i)return;let s=e.getNodeModel(i)?.ports.find(l=>l.name===r);if(s){if(s.direction==="output"){yt(s.name,n.value)===void 0&&e.report({code:b.InvalidPortDefaultValue,message:`output port default for \`${s.name}\` must be a blackboard remap`,range:n.range,details:{primaryLabel:`output port default for \`${s.name}\` must be a blackboard remap`,help:`use \`${s.name}="{${s.name}}"\` or \`${s.name}="{=}"\``}});return}Wt(e,{port:s,value:n.value,range:n.range,registry:Y(e.semantic),typeDefinition:G(e.semantic,s.type),allowRemap:!0,diagnosticCode:b.InvalidPortDefaultValue,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:s.name})}}}}}),B({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=Y(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 a=yt(i.name,i.value);if(!a)continue;let s=Qo(t,i.declaredPort.port);if(!s||s.kind==="any")continue;let l=$(a),u=n.get(l)??[];u.push({key:a.key,scope:a.scope,displayName:ke(a),identity:l,nodeId:zl(o.element),port:i.declaredPort.port,typeDefinition:s,range:i.attribute.range}),n.set(l,u)}for(let o of n.values()){let i=jl(e.semantic,o,r);if(i.length<2)continue;let a=o.find(s=>s.typeDefinition.canonical===i[0]);e.report({code:b.BlackboardTypeMismatch,message:`blackboard entry \`${a?.displayName??o[0]?.displayName??o[0]?.key??""}\` is used with incompatible port types: ${i.map(s=>`\`${s}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${a?.displayName??o[0]?.displayName??o[0]?.key??""}\` mixes incompatible port types`,notes:o.filter(s=>i.includes(s.typeDefinition.canonical)).map(s=>`${s.nodeId}.${s.port.name} declares ${Kl(s.port,s.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),B({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Gl(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"&&yt(o.port.name,r.value)===void 0&&e.report({code:b.OutputPortRequiresRemap,message:`output port \`${o.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${o.port.name}\` requires a blackboard remap`,help:`use \`${o.port.name}="{${o.port.name}}"\` or \`${o.port.name}="{some_key}"\``}})}}}}})];function Fl(e,t){return e.diagnostics.some(n=>n.code===b.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function $l(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function Xl(e,t){if(!e)return;return n(e,!1,void 0);function n(r,o,i){let a=o||r.name==="TreeNodesModel",s=a&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:i;if(r===t)return s;for(let l of r.children){if(l.kind!=="element")continue;let u=n(l,a,s);if(u)return u}}}function jl(e,t,n){let r=new Set;for(let o=0;o<t.length;o+=1){let i=t[o];if(i)for(let a=o+1;a<t.length;a+=1){let s=t[a];s&&(n&&(i.typeDefinition.canonical==="std::string"||s.typeDefinition.canonical==="std::string")||be(e,i.typeDefinition.canonical,s.typeDefinition.canonical)||(r.add(i.typeDefinition.canonical),r.add(s.typeDefinition.canonical)))}}return[...r].sort()}function Kl(e,t){return Ie(e)??t.canonical}function zl(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Gl(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Wl=new Set(["_failureIf","_successIf","_skipIf","_while"]),Yl=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Ce(e){if(Wl.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Yl.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 bt(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=Ye({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 oi=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),ii=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function je(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(ai(r)){n++;continue}if(jn(r)){let s=n;for(n++;n<e.length&&Jl(e[n]);)n++;let l=e.slice(s,n);t.push({type:l==="true"||l==="false"?"Boolean":"Identifier",text:l,start:s,end:n});continue}if(De(r)){let s=Zl(e,n);t.push(s),n=s.end;continue}if(r==="'"){let s=Hl(e,n);t.push(s),n=s.end;continue}let o=e.slice(n,n+2),i=oi.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let a=ii.get(r);if(a){t.push({type:a,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 Hl(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 Zl(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&&Ql(e[n]);)n++;return o===n||tu(e,n)?(n=St(e,n),Rt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&De(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(!De(e[n+1]))return n=St(e,n+1),Rt(e,t,n);for(r="Real",n+=1;n<e.length&&De(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&&De(e[n]);)n++;if(i===n)return n=St(e,Math.max(n,o+1)),Rt(e,t,n);r="Real"}return eu(e,n)?(n=St(e,n),Rt(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function St(e,t){let n=t;for(;n<e.length;){let r=e[n];if(ai(r)||ii.has(r)||oi.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function Rt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function ai(e){return e===" "||e===" "||e===`
13
+ `||e==="\r"}function jn(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Jl(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function De(e){return e!==void 0&&/[0-9]/.test(e)}function Ql(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function eu(e,t){let n=e[t];return jn(n)||De(n)}function tu(e,t){let n=e[t];return n==="."||jn(n)||De(n)}var nu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),ru=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),si=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),re={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ee(e){let t=je(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}:li(t,e)}function li(e,t=""){let n=new Kn(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=lu(r);return{ok:!0,program:{kind:"Program",statements:r,range:o},tokens:e}}var Kn=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=nu.get(r.type);if(o){if(t>=re.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:o,left:n,right:l,range:Tt(n.range,l.range)};break}if(r.type==="Question"){if(t>=re.ternary)break;this.consume();let l=this.parseExpression(0);if(!l)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let u=this.parseExpression(re.ternary);if(!u)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:u,range:Tt(n.range,u.range)};break}let i=si.get(r.type);if(i){if(t>=re.comparison)break;this.consume();let l=[n],u=[i],d=this.parseExpression(re.comparison);if(!d)return;for(l.push(d);;){let c=si.get(this.peek().type);if(!c)break;this.consume();let p=this.parseExpression(re.comparison);if(!p)return;u.push(c),l.push(p)}n={kind:"ComparisonChain",operands:l,operators:u,range:Tt(l[0].range,l[l.length-1].range)};continue}let a=ru.get(r.type),s=a?au(r.type):void 0;if(a&&s!==void 0){if(t>=s)break;this.consume();let l=this.parseExpression(s);if(!l)return;n={kind:"BinaryExpression",operator:a,left:n,right:l,range:Tt(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:Be(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),ou(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:iu(t.type),argument:n,range:Tt(Be(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(),su(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:Be(r)})}};function ou(e,t){switch(e.type){case"Integer":return{kind:"Literal",valueKind:"integer",raw:t.slice(e.start,e.end),value:e.text.startsWith("0x")||e.text.startsWith("0X")?Number(e.text):Number.parseInt(e.text,10),range:Be(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Be(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Be(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Be(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function iu(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function au(e){switch(e){case"PipePipe":return re.pipePipe;case"AmpAmp":return re.ampAmp;case"Pipe":case"Caret":return re.pipeCaret;case"Ampersand":return re.ampersand;case"Plus":case"Minus":case"DotDot":return re.additive;case"Star":case"Slash":return re.multiplicative;default:return}}function Be(e){return{start:e.start,end:e.end}}function Tt(e,t){return{start:e.start,end:t.end}}function su(e,t){return{...e,range:t}}function lu(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var uu=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 vt(e={}){let t=Ue(e.augmentations??[]),n=e.areTypesCompatible??((a,s)=>Je(t,a,s)),r=new Map,o=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:du(e.enums,e.augmentations??[])};for(let a of e.symbols??[])ui(i.symbols,r,a,n);for(let a of e.globalBlackboardSymbols??[])ui(i.globalBlackboard,o,a,n);return i}function de(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 ht(e){let t=de(e.baseEnvironment),n=[];for(let r of e.entries){let o=de(t),i=r.parseResult??Ee(r.source),a=de(o),s;i.ok&&(s=we({program:i.program,environment:o,attributeName:r.attributeName,originId:r.originId??String(r.id)}),a=de(s.environment)),n.push({id:r.id,parseResult:i,environmentBefore:o,environmentAfter:a,...s?{analysis:s}:{}}),t.symbols.clear(),t.globalBlackboard.clear(),t.enums.clear();for(let[l,u]of a.symbols)t.symbols.set(l,{...u});for(let[l,u]of a.globalBlackboard)t.globalBlackboard.set(l,{...u});for(let[l,u]of a.enums)t.enums.set(l,u)}return n}function di(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 fe(e,t){let n=ie(e,t);return ci(t,n)}function ci(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"}:uu.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function pi(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 Ke(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 Ne(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function zn(e,t){return e.kind==="error"||t.kind==="error"?{kind:"error"}:e.kind==="unknown"||t.kind==="unknown"?{kind:"unknown"}:e.kind==="any"||t.kind==="any"?e.kind===t.kind?e:{kind:"unknown"}:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"&&e.canonical===t.canonical?e:void 0:e.kind===t.kind?e:void 0}function du(e,t){if(e instanceof Map)return new Map(e);let n=di(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function ui(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),a=o.conflict===!0||i!==void 0&&n.compatibilityKey!==void 0&&!r(i,n.compatibilityKey)||!pi(o.type,n.type);e.set(n.name,{...o,readable:o.readable||n.readable,writable:o.writable||n.writable,conflict:a}),i===void 0&&t.set(n.name,n.compatibilityKey)}var Me={kind:"number"},Ht={kind:"string"},Yt={kind:"bool"},oe={kind:"unknown"},U={kind:"error"};function we(e){let t=de(e.environment),n=[],r=[],o=[],i=[],a=[],s=[],l=[],u=[];return e.program.statements.forEach((d,c)=>{u.push(ce({expression:d,statementIndex:c,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:a,introducedSymbols:s,diagnostics:l,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:o,globalBlackboardAccesses:i,invalidGlobalBlackboardIdentifiers:a,introducedSymbols:s,diagnostics:l,statementTypes:u,finalType:u.at(-1)}}function ce(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?Me:t.valueKind==="string"?Ht:t.valueKind==="boolean"?Yt:oe;case"Identifier":return pu(e,t.name,t.range);case"UnaryExpression":{let n=ce({...e,expression:t.argument});return t.operator==="!"?Ne(n)?Yt:(Z(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"),U):n.kind==="number"?Me:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?U:oe:(Z(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"),U)}case"BinaryExpression":{let n=ce({...e,expression:t.left}),r=ce({...e,expression:t.right});switch(t.operator){case"&&":case"||":return fi(n)||fi(r)?(Z(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"),U):Yt;case"+":return n.kind==="string"&&r.kind==="string"?Ht:n.kind==="number"&&r.kind==="number"?Me:Gn(n,r)?oe:(Wn(e,t.range,t.operator),U);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Me:Gn(n,r)?oe:(Wn(e,t.range,t.operator),U);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?Ht:Gn(n,r)?oe:(Wn(e,t.range,t.operator),U)}return oe}case"ComparisonChain":{let n=t.operands.map(r=>ce({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let o=t.operators[r],i=n[r],a=n[r+1];if(!mu(o,i,a))return Z(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"),U}return Yt}case"ConditionalExpression":{let n=ce({...e,expression:t.condition});Ne(n)||Z(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=ce({...e,expression:t.thenExpression}),o=ce({...e,expression:t.elseExpression}),i=zn(r,o);return i||(Z(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"),U)}case"AssignmentExpression":return cu(e)}}function cu(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:o}=e,i=e.expression,a=ce({...e,expression:i.right});if(i.left.kind!=="Identifier")return ce({...e,expression:i.left}),Z(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"),U;let s=i.left,l=i.operator===":="?"declare":i.operator==="="?"write":"readwrite",u={name:s.name,kind:l,range:s.range,identifier:s,statementIndex:e.statementIndex};r.push(u);let d=bt(s.name);if(d.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(u),gi(e,s.range,d.raw,d.message),U;if(d.kind==="global-blackboard"){let m=t.globalBlackboard.get(d.key),x=i.operator===":="?a:i.operator==="="?m&&Ke(m.type,a)?a:m?void 0:a:mi(m?.type??oe,a,i.operator);if(i.operator!==":="&&i.operator!=="="&&!x)return Z(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"),U;if((i.operator===":="||i.operator==="=")&&m&&!Ke(m.type,a))return Yn(e,s,m.type,a),U;let S=m?{...m}:{name:d.key,type:a,source:{kind:"global-blackboard",key:d.key,range:s.range,originId:e.originId},readable:!0,writable:!0};return S.type=x??a,t.globalBlackboard.set(d.key,S),e.resolvedIdentifiers.push({access:u,resolution:{kind:"global-blackboard",key:d.key,symbol:S}}),e.globalBlackboardAccesses.push({key:d.key,rawName:s.name,kind:l,range:s.range,inferredType:S.type}),S.type}let c=t.symbols.get(s.name);if(i.operator===":="&&!c){let m={name:s.name,type:a,source:{kind:"script-assignment",attributeName:n,range:s.range,originId:e.originId},readable:!0,writable:!0};return t.symbols.set(s.name,m),e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:m}}),o.push(m),a}if(!c)return e.resolvedIdentifiers.push({access:u,resolution:{kind:"unknown"}}),Z(e,"assignment-to-unknown-variable",s.range,`assignment target \`${s.name}\` is not defined`,`\`${s.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),U;if(e.resolvedIdentifiers.push({access:u,resolution:{kind:"symbol",symbol:c}}),i.operator==="=")return Ke(c.type,a)?(Hn(c,a),a):(Yn(e,s,c.type,a),U);if(i.operator===":=")return Ke(c.type,a)?(Hn(c,a),a):(Yn(e,s,c.type,a),U);let p=mi(c.type,a,i.operator);return p?(Hn(c,p),p):(Z(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"),U)}function pu(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let o=bt(t);if(o.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(r),gi(e,n,o.raw,o.message),U;if(o.kind==="global-blackboard"){let s=e.environment.globalBlackboard.get(o.key);return e.globalBlackboardAccesses.push({key:o.key,rawName:t,kind:"read",range:n,inferredType:s?.type??oe}),e.resolvedIdentifiers.push({access:r,resolution:{kind:"global-blackboard",key:o.key,...s?{symbol:s}:{}}}),s?.type??oe}let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),Me;let a=e.environment.symbols.get(t);return a?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:a}}),a.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),oe)}function mi(e,t,n){return e.kind==="error"||t.kind==="error"?U:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?oe:n==="+="?e.kind==="number"&&t.kind==="number"?Me:e.kind==="string"&&t.kind==="string"?Ht:void 0:e.kind==="number"&&t.kind==="number"?Me:void 0}function Gn(e,t){return Zt(e)||Zt(t)}function Zt(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function fi(e){return!Ne(e)}function mu(e,t,n){return Zt(t)||Zt(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 Wn(e,t,n){Z(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 Yn(e,t,n,r){Z(e,"variable-type-mismatch",t.range,`cannot assign ${Zn(r)} to variable \`${t.name}\` of type ${Zn(n)}`,`\`${t.name}\` expects ${Zn(n)} here`,"assign a compatible value or change the variable's source type")}function gi(e,t,n,r){Z(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 Hn(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 Z(e,t,n,r,o,i){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:o,help:i}})}function Zn(e){return e.kind==="custom"?e.name:e.kind}var yi=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),fu=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"]),gu=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],yu=[":=","=","+=","-=","*=","/="],bi=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function Jn(e){let t=e.source,n=Ti(t,e.cursorOffset),r=Qt({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...bu(e,r)),ku(e.attributeInfo,t,n)&&o.push(...Tu(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...Su(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(...Ru(r.range,r.prefix)),Cu(o)}function Qt(e){let t=e.source,n=Ti(t,e.cursorOffset),r=je(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=xu(t,n),a=Jt(r,i.start);if(i.start<i.end&&a&&yi.has(a.type))return{kind:a.type==="Identifier"&&Ri(r,a)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let s=Jt(r,n);return s&&yi.has(s.type)&&s.end<=n?{kind:s.type==="Identifier"&&Ri(r,s)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!s||fu.has(s.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function bu(e,t){let n=vu(e),r=t.prefix.toLowerCase(),o=[];for(let[i,a]of n.enums)ze(i,r)&&o.push({label:i,kind:"enum",detail:`enum value ${a}`,replaceRange:t.range,sortText:`0-${i}`});for(let i of n.symbols.values())i.conflict||i.readable&&ze(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:Si(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 a=`@${i.name}`;ze(a,r)&&o.push({label:a,kind:"identifier",detail:Si(i),replaceRange:t.range,sortText:`2-${a}`})}for(let i of["true","false"])ze(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function Su(e,t){return gu.filter(n=>ze(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function Ru(e,t){return yu.filter(n=>ze(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function Tu(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 vu(e){let t=de(e.environment),n=je(e.source),r=Ee(e.source);if(r.ok){let o=we({program:r.program,environment:t,attributeName:e.attributeName}),i=de(e.environment);for(let a of o.introducedSymbols)a.source.kind==="script-assignment"&&(a.source.range.end>e.cursorOffset||i.symbols.set(a.name,a));for(let a of o.globalBlackboardAccesses){if(a.kind==="read"||a.range.end>e.cursorOffset)continue;let s=o.environment.globalBlackboard.get(a.key),l=i.globalBlackboard.get(a.key),u;s?u={...s}:l?u={...l,type:a.inferredType}:u={name:a.key,type:a.inferredType,source:{kind:"global-blackboard",key:a.key,range:a.range},readable:!0,writable:!0},i.globalBlackboard.set(a.key,u)}return i}for(let o of n){if(o.type!=="Identifier")continue;if(o.end>e.cursorOffset)break;let i=Iu(n,o.end);if(i?.type!=="ColonEqual"||i.end>e.cursorOffset)continue;let a=bt(o.text);if(a.kind!=="invalid-global-blackboard"){if(a.kind==="global-blackboard"){if(t.globalBlackboard.has(a.key))continue;t.globalBlackboard.set(a.key,{name:a.key,type:{kind:"unknown"},source:{kind:"global-blackboard",key:a.key,range:{start:o.start,end:o.end}},readable:!0,writable:!0});continue}t.symbols.has(a.name)||t.symbols.set(a.name,{name:a.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 Si(e){let t=hu(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 hu(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 ku(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=je(t).filter(i=>i.type!=="EndOfInput"),o=Jt(r,n);return!o||o.type==="Semicolon"}function xu(e,t){let n=t;for(;n>0&&bi.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&bi.has(e[r]??"");)r+=1;return{start:n,end:r}}function Jt(e,t){for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r.end<=t)return r}}function Ri(e,t){if(t.type!=="Identifier")return!1;let n=Jt(e,t.start);return!n||n.type==="Semicolon"}function Iu(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function ze(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function Ti(e,t){return Math.max(0,Math.min(e.length,t))}function Cu(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 vi=new WeakMap;function en(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=Ce({elementName:t.name,attributeName:o.name,resolvedNodeType:r});return i?[{attribute:o,info:i,parseResult:Ee(o.value)}]:[]})}function se(e,t,n){return me(e.document,t,n)}function hi(e){return{start:0,end:e.value.length}}function Te(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?en(e,t).map(o=>{let i=ki(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?we({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):Du(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function Du(e,t){let n=vi.get(e.view);n||(n=new WeakMap,vi.set(e.view,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(a=>en(e,a.element).map((s,l)=>({id:`${a.path.join(".")}:${s.attribute.name}:${l}`,node:a,candidate:s}))),i=ht({baseEnvironment:ki(e,t.nodes),entries:o.map(a=>({id:a.id,source:a.candidate.attribute.value,attributeName:a.candidate.attribute.name,originId:a.id,parseResult:a.candidate.parseResult}))}).flatMap((a,s)=>{let l=o[s];return l?[{...a,node:l.node,candidate:l.candidate}]:[]});return n.set(t,i),i}function ki(e,t){let n=Y(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let a=e.getNodeModel(i);if(a?.kind==="SubTree")for(let s of a.ports){let l=Ie(s),d=G(e.semantic,l)?.canonical??l;r.push({name:s.name,type:fe(n,l),source:{kind:"subtree-port",nodeType:i,portName:s.name,direction:s.direction},readable:!0,writable:s.direction==="output"||s.direction==="inout",compatibilityKey:d})}}for(let a of t)for(let s of a.portBindings){if(s.usage.status!=="resolved")continue;let l=F({portName:s.usage.port.name,rawValue:s.usage.value});if(!l.ok||l.reference.scope==="global")continue;let u=Ie(s.usage.port),c=G(e.semantic,u)?.canonical??u,p=s.usage.port.direction,m=a.usage.model.status==="resolved"?a.usage.model.model.id:a.usage.nodeType;r.push({name:l.reference.key,type:fe(n,u),source:{kind:"port-remap",nodeType:m,portName:s.usage.port.name,direction:p},readable:p==="input"||p==="output"||p==="inout",writable:p==="output"||p==="inout",compatibilityKey:c})}return o.push(...Bu(e,n)),vt({symbols:r,globalBlackboardSymbols:o,augmentations:ut(e.semantic),areTypesCompatible:(a,s)=>a&&s?be(e.semantic,a,s):!0})}function Bu(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 a=F({portName:i.usage.port.name,rawValue:i.usage.value});if(!a.ok||a.reference.scope!=="global")continue;let s=Ie(i.usage.port),u=G(e.semantic,s)?.canonical??s,d=i.usage.port.direction;n.push({name:a.reference.key,type:fe(t,s),source:{kind:"global-blackboard-remap",nodeType:o,portName:i.usage.port.name,direction:d,key:a.reference.key},readable:d==="input"||d==="output"||d==="inout",writable:d==="output"||d==="inout",compatibilityKey:u})}}return n}var xi=B({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Te(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:b.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:se(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 Ii=B({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Te(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let o=r.code==="assignment-to-unknown-variable"?b.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?b.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?b.ScriptVariableTypeMismatch:r.code==="invalid-global-blackboard-identifier"?b.InvalidGlobalBlackboardIdentifier:void 0;o&&e.report({code:o,message:r.message,range:se(e,n.attribute,r.range),details:r.details})}}}}});var Ci=B({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Te(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:b.InvalidScriptOperandType,message:r.message,range:se(e,n.attribute,r.range),details:r.details})}}}});var Di=B({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Te(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||Ne(o)||e.report({code:b.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:se(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 Bi=B({name:"script/valid-syntax",create(e){return{Element(t){for(let n of en(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let o=r.kind==="empty-script"?b.EmptyScript:r.kind==="invalid-token"?b.InvalidScriptToken:b.InvalidScriptSyntax;e.report({code:o,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??se(e,n.attribute,hi(n.attribute)):se(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Ei=[Bi,xi,Ii,Ci,Di];var Eu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Ni(e){return B({name:Eu[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Nu(n)})}}}})}function Nu(e){return e.code?{code:e.code}:void 0}var wi=[Ni("unused"),Ni("missing-reason")];function tn(e,t){return e.attributes.find(n=>n.name===t)}function Mi(e,t){if(!e)return!1;let n=(r,o)=>{let i=o||r.name==="TreeNodesModel";if(r===t)return i;for(let a of r.children)if(a.kind==="element"&&n(a,i))return!0;return!1};return n(e,!1)}var Pi=[B({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||tn(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),B({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=at(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))}}}}),B({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of st(e.semantic)){let n=Q(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})}}}}}),B({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=tn(t,"main_tree_to_execute");!n?.value||En(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),B({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Mi(e.document.root,t))return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(i=>i.name==="ID")??tn(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})}}}}),B({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||Mi(e.document.root,t))return;let n=tn(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})}}}}),B({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var wu=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Mu(e,t){return e===t?String(e):`${e}\u2013${t}`}var Ai=B({name:"model/valid-child-count",create(e){return{Element(t){if(ae(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Pu(e,t,n.model.model.id,n.model.model.kind)}}}});function Pu(e,t,n,r){let o=Ho(t).length,i=wu.get(n);if(i){if(o<i.min||o>i.max){let a=Mu(i.min,i.max);e.report({message:`\`${n}\` requires ${a} 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 _i=B({name:"model/valid-port-value",create(e){return{Element(t){if(ae(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"&&Wt(e,{port:o.port,value:r.value,range:r.range,registry:Y(e.semantic),typeDefinition:G(e.semantic,o.port.type),allowRemap:!0,diagnosticCode:b.InvalidPortValueType,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var Li=B({name:"model/require-port",create(e){return{Element(t){if(ae(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 Oi=[B({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(ae(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})}}}}),B({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(ae(t)||t.selfClosing||Zo(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 Vi=B({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 Ui=B({name:"model/no-unknown-port",create(e){return{Element(t){if(ae(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let o=n.ports.map(a=>a.name).sort(),i=o.length>=1&&o.length<=8?[`note: defined ports: ${o.map(a=>`\`${a}\``).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 qi=[Vi,Ui,Li,_i,...Oi,Ai];function Au(e,t){return e.attributes.find(n=>n.name===t)}function _u(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Fi=[B({name:"xml/valid-root",create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||t.name==="root"||e.report({message:"Root element must be <root>",range:t.range})}}}}),{name:"xml/require-btcpp-format",code:b.MissingBTCPPFormat,defaultSeverity:"error",meta:{description:'Root element must declare BTCPP_format="4".'},create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||Au(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},B({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)||_u(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Qn=[...Fi,...Ei,...Pi,...ri,...qi,...Wo,...wi],Wg=new Map(Qn.map(e=>[e.name,e]));function $i(e){if(e!=="off")return e==="info"?C.Info:e==="warn"?C.Warning:C.Error}function Xi(e,t){return Mt(e.linter.rules[t])?.options??{}}function ji(e){let t=Mt(e.config.linter.rules[e.rule]);return $i(t?t.severity:e.defaultSeverity)}function Ki(e){let t=[],n=e.facts??jo(),r=e.rules?new Set(e.rules):void 0,o=[];for(let a of Qn){if(r&&!r.has(a.name))continue;let s=ji({config:e.config,rule:a.name,defaultSeverity:a.defaultSeverity});if(!s)continue;let l=Xi(e.config,a.name),u=a.optionsSchema?.safeParse(l),d=u?.success?u.data:l,c=Go({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:d,diagnostics:t,rule:a.name,code:a.code,severity:s,facts:n});o.push(a.create(c))}for(let a of o)a.Document?.();e.document.root&&zi(e.document.root,o);let i=at(e.semantic,e.document.uri);for(let a of i?.treeNodesModel??[])for(let s of o)s.TreeNodeModel?.(a);for(let a of o)a.ProgramExit?.();return t.map((a,s)=>({diag:a,index:s})).sort((a,s)=>Lu(a.diag,s.diag)||a.index-s.index).map(a=>a.diag)}function zi(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&zi(n,t)}function Lu(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 er(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let r=[...e.diagnostics],o=n.documentView??te(e,{semantic:t,config:n.config,policy:ye(n.config)});return r.push(...Ki({document:e,view:o,semantic:t,config:n.config})),r}function Gi(e){return e?.documents??[]}function Ou(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 Vu(e){let t=Le();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 le(e,t){let n=mt(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,...Gi(r).filter(d=>!Ou(e.document,d))]:Gi(r),i=Vu(e.config||t.config),a=ye(i),s=r?.nodeDefinitionModels??[],l=Dn(o,{config:i,models:s,augmentations:t.augmentations}).index,u=n.document?te(n.document,{semantic:l,config:i,policy:a}):void 0;return{document:e.document,parsed:n.document,documentView:u,diagnostics:n.document?er(n.document,l,{config:i,documentView:u}):n.diagnostics,partial:n.partial===!0,semantic:l,config:i,nodeUsagePolicy:a,workspace:r}}function Wi(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:v(r,r),newText:n}}function Yi(e,t){let r=(t.fullRange?.start||t.range.start).offset;for(;r>0&&/[ \t]/.test(e.text[r-1]||"");)r-=1;return{range:v(e.positionAt(r),e.positionAt(t.range.end.offset)),newText:""}}function Hi(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:v(o,o),newText:` ${n}=""`}}function nn(e){return v(e.positionAt(0),e.positionAt(e.text.length))}function tr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=gt(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:nn(t.document),newText:o.text}]});for(let i of n){if(!i.range)continue;let a=H({document:t.document,parsed:e.parsed,position:i.range.start});if(i.code==="BT101_MISSING_REQUIRED_PORT"){let s=Math.min(i.range.start.offset+1,i.range.end.offset),l=e.parsed?.root&&Xe(e.parsed.root,s)||("element"in a?a.element:void 0);if(!l)continue;let u=L(e.semantic,{element:l,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}),d=u.ports.find(c=>c.required&&!u.portUsages.some(p=>p.status==="resolved"&&p.name===c.name));d&&r.push({title:`Add missing port ${d.name}`,kind:"quickfix",diagnostics:[i],edits:[Hi(t.document,l,d.name)]})}if(i.code==="BT102_UNKNOWN_PORT"&&"attribute"in a&&"element"in a&&a.attribute){let l=(a.element?L(e.semantic,{element:a.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===a.attribute),u=l?Yi(t.document,a.attribute):void 0;u&&l&&r.push({title:`Remove unknown port ${a.attribute.name}`,kind:"quickfix",diagnostics:[i],edits:[u]})}if(i.code==="BT002_MISSING_BTCPP_FORMAT"&&e.parsed?.root){let s=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:v(s,s),newText:' BTCPP_format="4"'}]})}r.push({title:`Suppress ${i.code} for next line`,kind:"quickfix",diagnostics:[i],edits:[Wi(t.document,i.range.start.line,`<!-- btxml-disable-next-line ${i.code} reason: TODO -->
14
+ `)]})}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 j(e,t){return e?{range:e,newText:t}:void 0}function ve(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 nr(e){return ke(e)}function Pe(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function Zi(e,t){return!e||!t?!1:Pe(e)===Pe(t)}function Ji(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 a={identity:i.identity,key:i.key,scope:i.scope,type:o.type,direction:o.direction,nodeType:n.usage.nodeType||n.tagName,portName:o.name},s=t.get(i.identity);if(!s){t.set(i.identity,a);continue}let l=Pe(s.type),u=Pe(a.type);if(l&&u&&l!==u){t.set(i.identity,{...s,conflict:!0});continue}!l&&u&&t.set(i.identity,{...s,type:a.type})}}return[...t.values()]}function Uu(e,t,n){return v(e.positionAt(t),e.positionAt(n))}function qu(e,t,n){let r=t.valueContentRange;if(!r)return;let o=r.start.offset,i=r.end.offset,a=e.text.slice(o,i),s=a.startsWith("{"),l=a.endsWith("}");if(s&&n>o){let u=o+1,d=a[1]==="@"?u+1:u,c=l?i-1:i;return{replacementRange:Uu(e,d,Math.max(d,c)),wrapsReference:!1,hasScopeMarker:a[1]==="@"}}return{insertText:t.value,replacementRange:r,wrapsReference:!0,hasScopeMarker:!1}}function rr(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,a=qu(t,n,r),s=a?.wrapsReference??!1,l=a?.hasScopeMarker??!1;if(l&&o.scope!=="global")return;let u=o.key;s?u=nr(o):o.scope==="global"&&(u=`@${o.key}`);let d=o.key;s?d=nr(o):o.scope==="global"&&(d=l?o.key:`@${o.key}`);let c=o.scope==="global"?` @${o.key}`:"",p=`${o.key} ${u}${c}`.trim();return O(u,"Reference",i,a?{range:a.replacementRange,newText:d}:void 0,{filterText:p,insertText:d})}var Qi=new WeakMap;function Ge(e,t){let n=e.parsed?H({document:e.document,parsed:e.parsed,position:t}):void 0;if(!n||n.kind!=="attribute-value")return;let r=sr(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,a=ur(r.attribute,i),s=Qt({source:r.source,cursorOffset:a});if(s.kind!=="identifier"||a<s.range.start||a>s.range.end)return;let l=oa(e,r),u=l.analysis?.resolvedIdentifiers.find(c=>c.access.range.start===s.range.start&&c.access.range.end===s.range.end&&c.resolution.kind!=="unknown");if(!u||u.resolution.kind==="unknown")return;let d=u.resolution.kind==="symbol"?{kind:"symbol",symbol:u.resolution.symbol}:u.resolution.kind==="global-blackboard"?{...u.resolution,origin:"script"}:u.resolution;return{attributeContext:r,range:or(e,r,s.range),reference:d,flowState:l,occurrence:{uri:e.document.uri,attributeContext:r,identifier:u.access,reference:d,documentRange:or(e,r,u.access.range)}}}function ea(e,t){let n=(t.reference.kind==="global-blackboard"?sa(e):on(e,t.attributeContext.behaviorTree).flatMap(r=>ia(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:Xu(t.reference.symbol,r.reference));return t.reference.kind==="global-blackboard"?ju([...n,...aa(e,t.reference.key)]):n}function ta(e,t){return la(aa(e,t).map(n=>({uri:n.uri,range:n.documentRange})))}function na(e,t){return la(sa(e).filter(n=>n.reference.kind==="global-blackboard"&&n.reference.key===t).map(n=>({uri:n.uri,range:n.documentRange})))}function ir(e,t){return on(e,t)}function ra(e,t,n){let r=sr(e,t,n);if(r)return oa(e,r).environmentBefore}function ar(e){let t=rn(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 rn(e){return e.kind==="custom"?e.name:e.kind}function oa(e,t){let r=on(e,t.behaviorTree).find(o=>o.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function on(e,t){let n=Qi.get(e);n||(n=new WeakMap,Qi.set(e,n));let r=n.get(t);if(r)return r;let o=t.nodes.flatMap(s=>s.element.attributes.flatMap(l=>{let u=sr(e,s.element,l);return u?[u]:[]})),i=o.map(s=>({id:s.id,source:s.source,attributeName:s.attribute.name,originId:s.id})),a=ht({baseEnvironment:Fu(e,t.nodes),entries:i}).flatMap((s,l)=>{let u=o[l];return u?[{...s,context:u}]:[]});return n.set(t,a),a}function sr(e,t,n){let r=e.documentView?.nodes.find(s=>s.element===t);if(!r)return;let o=r.usage.model.status==="resolved"?r.usage.model.model.id:r.usage.nodeType;if(!Ce({elementName:t.name,attributeName:n.name,resolvedNodeType:o}))return;let a=t.attributes.indexOf(n);return{id:`${r.path.join(".")}:${n.name}:${a}`,node:r,element:t,attribute:n,source:n.value,behaviorTree:r.behaviorTree}}function Fu(e,t){let n=Y(e.semantic),r=[],o=[],i=t[0]?.behaviorTree.id;if(i){let s=ee(e.semantic,i);if(s?.kind==="SubTree")for(let l of s.ports){let u=l.effectiveType??l.type,c=G(e.semantic,u)?.canonical??u;r.push({name:l.name,type:fe(n,u),source:{kind:"subtree-port",nodeType:i,portName:l.name,direction:l.direction},readable:!0,writable:l.direction==="output"||l.direction==="inout",compatibilityKey:c})}}for(let s of t)for(let l of s.portBindings){if(l.declaredPort.status!=="resolved")continue;let u=da(l);if(!u||u.scope==="global")continue;let d=l.declaredPort.port.type,p=G(e.semantic,d)?.canonical??d,m=l.declaredPort.port.direction,x=s.usage.model.status==="resolved"?s.usage.model.model.id:s.usage.nodeType;r.push({name:u.key,type:fe(n,d),source:{kind:"port-remap",nodeType:x,portName:l.declaredPort.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:p})}let a=lr(e).flatMap(({trees:s})=>s.flatMap(l=>l.nodes));return o.push(...$u(e,n,a)),vt({symbols:r,globalBlackboardSymbols:o,augmentations:ut(e.semantic),areTypesCompatible:(s,l)=>s&&l?be(e.semantic,s,l):!0})}function $u(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 a of o.portBindings){if(a.declaredPort.status!=="resolved")continue;let s=da(a);if(!s||s.scope!=="global")continue;let l=a.declaredPort.port.type,d=G(e.semantic,l)?.canonical??l,c=a.declaredPort.port.direction;r.push({name:s.key,type:fe(t,l),source:{kind:"global-blackboard-remap",nodeType:i,portName:a.declaredPort.port.name,direction:c,key:s.key},readable:c==="input"||c==="output"||c==="inout",writable:c==="output"||c==="inout",compatibilityKey:d})}}return r}function ia(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:or(e,t.context,n.access.range)}]}):[]}function Xu(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 ju(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 aa(e,t){return lr(e).flatMap(({uri:n,trees:r})=>r.flatMap(o=>o.nodes.flatMap(i=>i.portBindings.flatMap(a=>a.blackboardReferences.filter(s=>s.scope==="global"&&s.key===t).map(s=>({uri:n,attributeContext:{id:`${i.path.join(".")}:${a.attribute.name}:${i.element.attributes.indexOf(a.attribute)}`,node:i,element:i.element,attribute:a.attribute,source:a.attribute.value,behaviorTree:i.behaviorTree},identifier:{name:`@${s.key}`,kind:"read",range:{start:0,end:0},identifier:{kind:"Identifier",name:`@${s.key}`,range:{start:0,end:0}},statementIndex:-1},reference:{kind:"global-blackboard",key:s.key,origin:"port-remap"},documentRange:s.range}))))))}function sa(e){return lr(e).flatMap(({uri:t,trees:n})=>n.flatMap(r=>{let o=zu(e,t);return on(o,r).flatMap(i=>Ku(o,t,i))}))}function Ku(e,t,n){return ia(e,n).map(r=>({...r,uri:t}))}function lr(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=te(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 zu(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=Ve(t,n.originalText,0,"btcpp-xml"),o=te(n,{semantic:e.semantic,config:e.config,policy:e.nodeUsagePolicy});return{...e,document:r,parsed:n,documentView:o}}function la(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 or(e,t,n){return me(e.parsed??{originalText:e.document.text},t.attribute,n)}function ur(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 ua(e,t,n){let r=e.parsed??{originalText:e.document.text};return me(r,t,n)}function da(e){if(e.declaredPort.status!=="resolved")return;let t=F({portName:e.declaredPort.port.name,rawValue:e.value});return t.ok?t.reference:void 0}function Gu(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 Ce({elementName:t.name,attributeName:n.name,resolvedNodeType:o})}function ca(e,t,n,r){let o=Gu(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,a=ra(e,n,r),s=Math.max(0,t.position.offset-i.start.offset);return Jn({source:r.value,cursorOffset:ur(r,s),environment:a,attributeName:r.name,attributeInfo:o}).map(u=>Wu(e,r,u))}function Wu(e,t,n){return O(n.label,Yu(n.kind),n.detail,{range:ua(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function Yu(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 pa(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function ma(e,t){if(!e)return;let n=pa(e)?e.valueContentRange:e.valueRange;if(n)return j(n,pa(e)?t:`"${t}"`)}function fa(e,t,n,r){let o=[],i=[];for(let a of st(e)){let s=Q(e,a),l=O(a,"Value","BehaviorTree ID",r?ma(r,a):j(n,a));s.some(u=>u.uri===t)?o.push({...l,sortText:`0-${a}`}):i.push({...l,sortText:`1-${a}`})}return[...o,...i]}function Hu(e){return O("SubTree","Class","Built-in subtree tag",j(e,"SubTree"),{sortText:"0-SubTree"})}function Zu(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",j(e.replacementRange,`${t}>`))]:[]}function Ju(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(o=>O(o,"Class",void 0,j(t,o))),...["Action","Condition","Control","Decorator"].map(o=>O(o,"Class",void 0,j(t,o))),Hu(t)],r=new Set;for(let o of Lt(e))o.id!=="SubTree"&&(r.has(o.id)||(r.add(o.id),n.push(O(o.id,"Class",void 0,j(t,o.id)))));return ve(n)}function sn(e,t,n){return L(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function dr(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}`:""}`,j(t,r.name)))}function Qu(e,t,n){let r=[O("ID","Property",void 0,j(n,"ID"))];return r.push(...dr(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function ed(e,t,n,r){if(!e)return[];if(xe(e.name)){let i=[];e.attributes.some(s=>s.name==="ID")||i.push(O("ID","Property",void 0,j(r,"ID")));let a=sn(n,t,e);return i.push(...dr(a,r)),i}return e.name==="SubTree"?Qu(e,sn(n,t,e),r):e.name==="include"?[O("path","Property",void 0,j(r,"path"))]:dr(sn(n,t,e),r)}function td(e,t,n,r){return fa(t.semantic,e.document.uri,n,r)}function nd(e,t,n,r){let o=[],i=new Set;for(let a of Lt(e))a.kind===t&&(i.has(a.id)||(i.add(a.id),o.push(O(a.id,"Value",`${t} node ID`,r?ma(r,a.id):j(n,a.id)))));return o}function rd(e,t,n){if(t.kind!=="attribute-value")return[];let{attribute:r,element:o}=t;if(!r||!o)return[];let i=xe(o.name);if(i&&r.name==="ID")return nd(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return td(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return fa(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",j(r.valueContentRange||r.valueRange,E)));let a=ca(n,e,o,r);if(a)return a;let s=sn(n,e,o);if(i&&s.model.status!=="resolved")return[];let l=ue(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 u=l.port,d=r.valueContentRange||r.valueRange,c=[];u.enum?.length&&c.push(...u.enum.map(h=>O(h,"Enum",u.type,j(d,h),{sortText:`${an.enumLiteral}-${h}`}))),(u.type||"").toLowerCase()==="bool"&&c.push(...["true","false"].map(h=>O(h,"Value","bool",j(d,h),{sortText:`${an.boolLiteral}-${h}`})));let p=Ji(n),m=Pe(u.type),x=p.filter(h=>!h.conflict&&Zi(u.type,h.type)),S=p.filter(h=>!h.conflict&&!Pe(h.type)&&m),D=x.flatMap(h=>{let E=rr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:h,detail:h.scope==="global"?`${h.type||"unknown"} global blackboard key from ${h.nodeType}.${h.portName}`:`${h.type||"unknown"} blackboard key from ${h.nodeType}.${h.portName}`});return E?[{...E,sortText:`${an.matchingKey}-${h.scope==="global"?h.identity:h.key}`}]:[]}),A=S.flatMap(h=>{let E=rr({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:h,detail:h.scope==="global"?`unknown-type global blackboard key from ${h.nodeType}.${h.portName}`:`unknown-type blackboard key from ${h.nodeType}.${h.portName}`});return E?[{...E,sortText:`${an.unknownKey}-${h.scope==="global"?h.identity:h.key}`}]:[]});return c.push(...D,...A),c.length>0?ve(c):(t.valuePrefix||"").includes("{")?ve(c):c}function cr(e,t){let n=H({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:pn.map(r=>O(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:ve(rd(t,n,e))}:n.kind==="attribute-name"?{items:ve(ed(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:ve(Ju(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:ve(Zu(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 od(e,t,n){return lt(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 pr(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 mr(e,t,n,r,o,i,a){let s=pr(e,i,a),l=(t??[]).flatMap(u=>{if(u.uri===a)return[];let d=te(u,{semantic:n,config:r,policy:o});return pr(d,i,u.uri)});return ln([...s,...l])}function fr(e,t,n){return pr(e,t,n)}function un(e,t,n,r,o,i,a){if(!e)return[];let s=H({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 s?s.element:void 0,u="attribute"in s?s.attribute:void 0,d=l?L(r,{element:l,documentRoot:e.root,uri:e.uri,config:o,policy:i}):void 0;if(l?.name==="SubTree"&&u?.name==="ID"){if(d?.tagForm==="model-definition")return Q(r,u.value).map(m=>m.idRange?{uri:m.uri,range:m.idRange}:void 0).filter(m=>!!m);let c=od(r,u.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},...c]):c}if(p?.status==="ambiguous")return ln([...p.behaviorTrees.map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:void 0),...c].filter(m=>!!m));if(p?.status==="resolved"&&p.kind==="node-model"){if(c.length>0)return c;if(p.model.idRange)return[{uri:p.model.uri||e.uri,range:p.model.idRange}]}return c}if(l?.name==="root"&&u?.name==="main_tree_to_execute")return Q(r,u.value).map(c=>c.idRange?{uri:c.uri,range:c.idRange}:void 0).filter(c=>!!c);if(l?.name==="include"&&u?.name==="path"&&a){let c=a.find(p=>p.uri===u.value||p.path===u.value||(p.path?p.path.endsWith(`/${u.value}`):!1));if(c?.root?.range)return[{uri:c.uri,range:c.root.range}]}if(u&&l){let c=t?Fe(t,n):void 0,p=c?.blackboardReferences.find(m=>n.offset>=m.range.start.offset&&n.offset<=m.range.end.offset);if(p)return p.scope==="global"?mr(t,a,r,o,i,p.identity,e.uri):fr(t,p.identity,e.uri);if(c?.declaredPort.status==="resolved"){let m=c.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(s.kind==="tag-name"&&l&&d?.model.status==="resolved"){let c=d.model.model;if(c.idRange)return[{uri:c.uri||e.uri,range:c.idRange}];if(c.range)return[{uri:c.uri||e.uri,range:c.range}]}if(u?.name==="ID"&&d?.tagForm==="generic-node"&&d.model.status==="resolved"){let c=d.model.model;if(c.idRange)return[{uri:c.uri||e.uri,range:c.idRange}];if(c.range)return[{uri:c.uri||e.uri,range:c.range}]}return[]}function gr(e,t){let n=Ge(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let o=r.source,a=ir(e,n.attributeContext.behaviorTree).find(s=>s.id===o.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:me(e.parsed??{originalText:e.document.text},a.attribute,o.range)}]}}if(r.source.kind==="port-remap"||r.source.kind==="global-blackboard-remap"){let o=r.source,i=$({scope:o.kind==="global-blackboard-remap"?"global":"local",key:r.name}),a=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(u=>u.identity===i)),s=a?.declaredPort.port.nameRange;if(s)return{locations:[{uri:a.declaredPort.port.uri||e.document.uri,range:s}]}}if(r.source.kind==="subtree-port"){let o=r.source,a=(o.nodeType?ee(e.semantic,o.nodeType):void 0)?.ports.find(s=>s.name===o.portName&&s.direction===o.direction);if(a?.nameRange)return{locations:[{uri:a.uri||e.document.uri,range:a.nameRange}]}}}if(n?.reference.kind==="global-blackboard"){let r=$({scope:"global",key:n.reference.key}),o=ta(e,n.reference.key);if(o.length>0)return{locations:o};let i=n.reference.symbol;if(i?.source.kind==="global-blackboard"){let a=i.source,l=ir(e,n.attributeContext.behaviorTree).find(u=>u.id===a.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:me(e.parsed??{originalText:e.document.text},l.attribute,a.range)}]}}}return{locations:un(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function yr(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function ga(e,t){let n=gt(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:nn(e.document),newText:n.text}],diagnostics:[]}}function br(e,t){return ga(t,e.config.formatter)}function ya(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
15
15
  Description: ${e.description}`:""}`].join(`
16
16
  `)}function ba(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?`
17
17
 
18
- Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function nd(e,t){return`**SubTree** \`${e}\`
18
+ Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function id(e,t){return`**SubTree** \`${e}\`
19
19
 
20
20
  Resolves ambiguously across ${t.length} candidates:
21
21
  ${t.map(n=>`- \`${n}\``).join(`
22
- `)}`}function rd(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function Sr(e,t){let n=Ge(e,t.position);if(n){if(n.reference.kind==="enum")return{range:n.range,contents:`**Enum** \`${n.reference.name}\`
22
+ `)}`}function ad(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function Sr(e,t){let n=Ge(e,t.position);if(n){if(n.reference.kind==="enum")return{range:n.range,contents:`**Enum** \`${n.reference.name}\`
23
23
 
24
24
  Value: \`${n.reference.value}\``};if(n.reference.kind==="global-blackboard"){let u=n.reference.symbol;return{range:n.range,contents:u?[`**Global Blackboard** \`@${n.reference.key}\``,"",`Type: \`${rn(u.type)}\``,`Source: ${ar(u)}`].join(`
25
25
  `):`**Global Blackboard** \`@${n.reference.key}\``}}let l=n.reference.symbol;return{range:n.range,contents:[`**Script Symbol** \`${l.name}\``,"",`Type: \`${rn(l.type)}\``,`Source: ${ar(l)}`].join(`
26
26
  `)}}let r=H({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,a=o?L(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=a?.subtree?.target;if(l?.status==="resolved"&&l.kind==="behavior-tree"){let u=l.behaviorTree;return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
27
27
 
28
- Resolves to \`BehaviorTree ID="${i.value}"\` in \`${u.uri}\`.`}}if(l?.status==="ambiguous"){let u=e.parsed?.uri||"workspace",d=rd([...l.behaviorTrees,...l.definitions],u);return{range:i.valueContentRange||i.valueRange,contents:nd(i.value,d)}}if(l?.status==="resolved"&&l.kind==="node-model")return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
28
+ Resolves to \`BehaviorTree ID="${i.value}"\` in \`${u.uri}\`.`}}if(l?.status==="ambiguous"){let u=e.parsed?.uri||"workspace",d=ad([...l.behaviorTrees,...l.definitions],u);return{range:i.valueContentRange||i.valueRange,contents:id(i.value,d)}}if(l?.status==="resolved"&&l.kind==="node-model")return{range:i.valueContentRange||i.valueRange,contents:`**SubTree** \`${i.value}\`
29
29
 
30
- Resolves to SubTree model in \`${l.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let l=e.documentView?Fe(e.documentView,t.position):void 0;if(l?.declaredPort.status==="resolved")return{range:i.nameRange,contents:ya(l.declaredPort.port)};let u=ue(e.semantic,{element:o,documentRoot:e.parsed?.root,attributeName:i.name,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy});if(u?.status==="resolved")return{range:i.nameRange,contents:ya(u.port)}}let s=e.documentView?Vt(e.documentView,t.position):void 0;if(s&&s.usage.model.status==="resolved"){let l=s.usage.model.model;return{range:s.element.nameRange||s.element.openTagRange,contents:ba(l)}}return o&&a?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:ba(a.model.model)}:{}}function Rr(e,t){return wn(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function vr(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 od(e,t){let n=new Set;for(let r of t){let o=Nn(e.semantic).find(a=>Tr(r,{uri:a.uri,range:a.idRange}));o&&n.add(o.id);let i=Mn(e.semantic).find(a=>a.kind==="SubTree"&&(Tr(r,{uri:a.uri,range:a.idRange})||Tr(r,{uri:a.uri,range:a.range})));i&&n.add(i.id)}return[...n]}function Tr(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function hr(e,t){let n=Ge(e,t.position);if(n)return{locations:vr(ea(e,n).map(d=>({uri:d.uri,range:d.documentRange})))};let r=e.parsed?H({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,s=(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(s){let d=$({scope:s.scope,key:s.key});return{locations:vr([...s.scope==="global"?mr(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,d,e.document.uri):fr(e.documentView,d,e.document.uri),...s.scope==="global"?na(e,s.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:Rr(e,i.value)};if(o&&i?.name==="ID"&&L(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:Rr(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 u=od(e,l);return u.length>0?{locations:vr(u.flatMap(d=>Rr(e,d)))}:{locations:[]}}function id(e,t){return e.attributes.find(n=>n.name===t)}function kr(e){let t=e.name==="BehaviorTree"?id(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=>kr(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 xr(e,t){return e.parsed?.root?{symbols:[kr(e.parsed.root)]}:{symbols:[]}}function ad(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function dn(e={}){return{getDiagnostics(t){return ad(yr(se(t,e),t))},getCompletions(t){return cr(se(t,e),t)},getHover(t){return Sr(se(t,e),t)},getDefinition(t){return gr(se(t,e),t)},getReferences(t){return hr(se(t,e),t)},getDocumentSymbols(t){return xr(se(t,e),t)},getCodeActions(t){return tr(se(t,e),t)},getFormattingEdits(t){return br(se(t,e),t)}}}var Sa={line:0,character:0,offset:0},kt={start:Sa,end:Sa};function sd(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 ld(e,t){return{kind:"element",name:e,attributes:sd(t),children:[],range:kt,openTagRange:kt,selfClosing:!0}}function ud(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function Ir(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=>Ir(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Ir(r)}`).join(",")}}`:JSON.stringify(String(e))}function dd(e){return Ir(e)}function cd(e,t,n,r,o){let i=se({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 Ra(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 va(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function Ta(e,t){if(!t.startsWith("file://"))return;let n=va(e),r=va(rt(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function Cr(e={}){let t=e,n=new Map,r=new Map,o=dn(),i=[],a=e.config?xn(e.config).config:void 0;function s(){return t.getRuntimeState?.()}function l(){return s()?.workspace}function u(){return s()?.version??0}function d(f,y){let R=l(),x=u(),M=dd(y),_=r.get(f.uri);if(_&&_.documentVersion===f.version&&_.workspaceVersion===x&&_.document===f&&_.workspace===R&&_.configFingerprint===M)return _;let V=cd(f,R,x,y,M);return r.set(f.uri,V),V}function c(f){if(f.parsed)return f.view||(f.view=Ot(f.parsed,f.semantic,{config:f.config,policy:f.nodeUsagePolicy})),f.view}function p(f){return f.models||(f.models=Pn(f.semantic)),f.models}function m(f){let y=l();return y?y.documents.some(R=>R.isBtXml&&R.uri===f):!1}function h(f){let y=N.getResolvedConfig();if(!y)return!1;let R=l()?.rootDir??e.configBasePath,x=R?Ta(R,f):void 0;return x!==void 0?Nt(y,x):In(y,f)}function S(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Ra(y.parsed)||h(f.uri)||m(f.uri)}function D(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Ra(y.parsed)||m(f.uri)}function E(f){let y=n.get(f);if(!y)return;let R=N.getEffectiveConfigForDocument(y.uri),x=d(y,R);if(S(y,x))return{document:y,effectiveConfig:R,snapshot:x,emitDiagnostics:D(y,x)}}function C(f,y){let R=n.get(f);if(!R)return{diagnostics:[]};let x=d(R,y),M=c(x);return M?{view:M,diagnostics:x.diagnostics.diagnostics,partial:x.diagnostics.partial}:{diagnostics:x.diagnostics.diagnostics,partial:x.diagnostics.partial}}let N={openDocument(f,y,R=0,x="xml"){n.set(f,Ve(f,y,R,x)),r.delete(f)},updateDocument(f,y,R=0,x="xml"){n.set(f,Ve(f,y,R,x)),r.delete(f)},closeDocument(f){n.delete(f),r.delete(f)},getResolvedConfig(){return s()?.resolvedConfig??a},getEffectiveConfigForDocument(f){let y=this.getResolvedConfig();if(!y)return;let R=l()?.rootDir??e.configBasePath,x=R?Ta(R,f):void 0;return x!==void 0?wt(y,x):Cn(y,f)},getDocument(f){return n.get(f)},getDiagnostics(f){let y=E(f);if(!y||!y.emitDiagnostics)return{diagnostics:[]};let R={diagnostics:y.snapshot.diagnostics.diagnostics};return y.snapshot.diagnostics.partial&&(R.partial=!0),R},getWorkspaceDiagnostics(){return{diagnostics:[...s()?.diagnostics??i]}},getSemanticDocumentView(f){let y=E(f);return y?C(f,y.effectiveConfig):{diagnostics:[]}},getNodeCatalog(f){let y=E(f);return y?{models:p(y.snapshot)}:{models:[]}},getSemanticNode(f,y){let R=E(f);return R?{node:C(f,R.effectiveConfig).view?.nodes.find(M=>M.nodeId===y)}:{}},getNodeUsageAt(f,y){let R=E(f);if(!R)return{};let x=c(R.snapshot);if(!R.snapshot.parsed||!x)return{};let M=qt(x,y);return M?{node:M,usage:M.usage}:{}},getNodeModelById(f,y){let R=y??n.keys().next().value;return R?{model:this.getNodeCatalog(R).models.find(M=>M.id===f)}:{}},getChildCapability(f,y,R){if(y==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let x=xe(y);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 M=E(f);if(!M)return{capable:!1,reason:"unknown-model"};let _=L(M.snapshot.semantic,{element:ld(y,R),documentRoot:M.snapshot.parsed?.root,uri:f,config:M.snapshot.config,policy:M.snapshot.nodeUsagePolicy});return _.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:_.nodeType}:{...ud(_.model.model.kind),modelId:_.model.model.id}},getPortInfoAt(f,y){let R=E(f);if(!R)return{};let x=c(R.snapshot);if(!R.snapshot.parsed||!x)return{};let M=Ut(x,y),_=this.getNodeUsageAt(f,y),V=_.node,Ae=M&&V?ue(R.snapshot.semantic,{element:V.usage.element,documentRoot:R.snapshot.parsed.root,attributeName:M.portName,uri:f,config:R.snapshot.config,policy:R.snapshot.nodeUsagePolicy}):void 0;return{node:V,binding:M,port:M?.resolution.status==="resolved"?M.resolution.port:void 0,usage:Ae,nodeUsage:_.usage}},getFormattingEdits(f){let y=E(f);return y?o.getFormattingEdits({document:y.document,config:y.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(f,y,R){let x=E(f);return x?o.getCompletions({document:x.document,position:y,workspace:l(),triggerCharacter:R,config:x.effectiveConfig}):{items:[]}},getHover(f,y){let R=E(f);return R?o.getHover({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{}},getDefinition(f,y){let R=E(f);return R?o.getDefinition({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getReferences(f,y){let R=E(f);return R?o.getReferences({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getDocumentSymbols(f){let y=E(f);return y?o.getDocumentSymbols({document:y.document,workspace:l(),config:y.effectiveConfig}):{symbols:[]}},getCodeActions(f,y,R){let x=E(f);return x?o.getCodeActions({document:x.document,range:y,diagnostics:R,workspace:l(),config:x.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return N}function Fb(e={}){return Cr(e)}export{Fb as createBtEditorService,dn as createLanguageService};
30
+ Resolves to SubTree model in \`${l.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let l=e.documentView?Fe(e.documentView,t.position):void 0;if(l?.declaredPort.status==="resolved")return{range:i.nameRange,contents:ya(l.declaredPort.port)};let u=ue(e.semantic,{element:o,documentRoot:e.parsed?.root,attributeName:i.name,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy});if(u?.status==="resolved")return{range:i.nameRange,contents:ya(u.port)}}let s=e.documentView?Vt(e.documentView,t.position):void 0;if(s&&s.usage.model.status==="resolved"){let l=s.usage.model.model;return{range:s.element.nameRange||s.element.openTagRange,contents:ba(l)}}return o&&a?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:ba(a.model.model)}:{}}function Rr(e,t){return wn(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function Tr(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 sd(e,t){let n=new Set;for(let r of t){let o=Nn(e.semantic).find(a=>vr(r,{uri:a.uri,range:a.idRange}));o&&n.add(o.id);let i=Mn(e.semantic).find(a=>a.kind==="SubTree"&&(vr(r,{uri:a.uri,range:a.idRange})||vr(r,{uri:a.uri,range:a.range})));i&&n.add(i.id)}return[...n]}function vr(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function hr(e,t){let n=Ge(e,t.position);if(n)return{locations:Tr(ea(e,n).map(d=>({uri:d.uri,range:d.documentRange})))};let r=e.parsed?H({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,s=(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(s){let d=$({scope:s.scope,key:s.key});return{locations:Tr([...s.scope==="global"?mr(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,d,e.document.uri):fr(e.documentView,d,e.document.uri),...s.scope==="global"?na(e,s.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:Rr(e,i.value)};if(o&&i?.name==="ID"&&L(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:Rr(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 u=sd(e,l);return u.length>0?{locations:Tr(u.flatMap(d=>Rr(e,d)))}:{locations:[]}}function ld(e,t){return e.attributes.find(n=>n.name===t)}function kr(e){let t=e.name==="BehaviorTree"?ld(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=>kr(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 xr(e,t){return e.parsed?.root?{symbols:[kr(e.parsed.root)]}:{symbols:[]}}function ud(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function dn(e={}){return{getDiagnostics(t){return ud(yr(le(t,e),t))},getCompletions(t){return cr(le(t,e),t)},getHover(t){return Sr(le(t,e),t)},getDefinition(t){return gr(le(t,e),t)},getReferences(t){return hr(le(t,e),t)},getDocumentSymbols(t){return xr(le(t,e),t)},getCodeActions(t){return tr(le(t,e),t)},getFormattingEdits(t){return br(le(t,e),t)}}}var Sa={line:0,character:0,offset:0},kt={start:Sa,end:Sa};function dd(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 cd(e,t){return{kind:"element",name:e,attributes:dd(t),children:[],range:kt,openTagRange:kt,selfClosing:!0}}function pd(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function Ir(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=>Ir(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Ir(r)}`).join(",")}}`:JSON.stringify(String(e))}function md(e){return Ir(e)}function fd(e,t,n,r,o){let i=le({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 Ra(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 Ta(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function va(e,t){if(!t.startsWith("file://"))return;let n=Ta(e),r=Ta(rt(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function Cr(e={}){let t=e,n=new Map,r=new Map,o=dn(),i=[],a=e.config?xn(e.config).config:void 0;function s(){return t.getRuntimeState?.()}function l(){return s()?.workspace}function u(){return s()?.version??0}function d(f,y){let R=l(),I=u(),w=md(y),_=r.get(f.uri);if(_&&_.documentVersion===f.version&&_.workspaceVersion===I&&_.document===f&&_.workspace===R&&_.configFingerprint===w)return _;let V=fd(f,R,I,y,w);return r.set(f.uri,V),V}function c(f){if(f.parsed)return f.view||(f.view=Ot(f.parsed,f.semantic,{config:f.config,policy:f.nodeUsagePolicy})),f.view}function p(f){return f.models||(f.models=Pn(f.semantic)),f.models}function m(f){let y=l();return y?y.documents.some(R=>R.isBtXml&&R.uri===f):!1}function x(f){let y=E.getResolvedConfig();if(!y)return!1;let R=l()?.rootDir??e.configBasePath,I=R?va(R,f):void 0;return I!==void 0?Nt(y,I):In(y,f)}function S(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Ra(y.parsed)||x(f.uri)||m(f.uri)}function D(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Ra(y.parsed)||m(f.uri)}function A(f){let y=n.get(f);if(!y)return;let R=E.getEffectiveConfigForDocument(y.uri),I=d(y,R);if(S(y,I))return{document:y,effectiveConfig:R,snapshot:I,emitDiagnostics:D(y,I)}}function h(f,y){let R=n.get(f);if(!R)return{diagnostics:[]};let I=d(R,y),w=c(I);return w?{view:w,diagnostics:I.diagnostics.diagnostics,partial:I.diagnostics.partial}:{diagnostics:I.diagnostics.diagnostics,partial:I.diagnostics.partial}}let E={openDocument(f,y,R=0,I="xml"){n.set(f,Ve(f,y,R,I)),r.delete(f)},updateDocument(f,y,R=0,I="xml"){n.set(f,Ve(f,y,R,I)),r.delete(f)},closeDocument(f){n.delete(f),r.delete(f)},getResolvedConfig(){return s()?.resolvedConfig??a},getEffectiveConfigForDocument(f){let y=this.getResolvedConfig();if(!y)return;let R=l()?.rootDir??e.configBasePath,I=R?va(R,f):void 0;return I!==void 0?wt(y,I):Cn(y,f)},getDocument(f){return n.get(f)},getDiagnostics(f){let y=A(f);if(!y||!y.emitDiagnostics)return{diagnostics:[]};let R={diagnostics:y.snapshot.diagnostics.diagnostics};return y.snapshot.diagnostics.partial&&(R.partial=!0),R},getWorkspaceDiagnostics(){return{diagnostics:[...s()?.diagnostics??i]}},getSemanticDocumentView(f){let y=A(f);return y?h(f,y.effectiveConfig):{diagnostics:[]}},getNodeCatalog(f){let y=A(f);return y?{models:p(y.snapshot)}:{models:[]}},getSemanticNode(f,y){let R=A(f);return R?{node:h(f,R.effectiveConfig).view?.nodes.find(w=>w.nodeId===y)}:{}},getNodeUsageAt(f,y){let R=A(f);if(!R)return{};let I=c(R.snapshot);if(!R.snapshot.parsed||!I)return{};let w=Ut(I,y);return w?{node:w,usage:w.usage}:{}},getNodeModelById(f,y){let R=y??n.keys().next().value;return R?{model:this.getNodeCatalog(R).models.find(w=>w.id===f)}:{}},getChildCapability(f,y,R){if(y==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let I=xe(y);if(I==="Control")return{capable:!0,reason:"generic-control"};if(I==="Decorator")return{capable:!0,reason:"generic-decorator"};if(I==="Action"||I==="Condition")return{capable:!1,reason:"generic-leaf"};let w=A(f);if(!w)return{capable:!1,reason:"unknown-model"};let _=L(w.snapshot.semantic,{element:cd(y,R),documentRoot:w.snapshot.parsed?.root,uri:f,config:w.snapshot.config,policy:w.snapshot.nodeUsagePolicy});return _.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:_.nodeType}:{...pd(_.model.model.kind),modelId:_.model.model.id}},getPortInfoAt(f,y){let R=A(f);if(!R)return{};let I=c(R.snapshot);if(!R.snapshot.parsed||!I)return{};let w=qt(I,y),_=this.getNodeUsageAt(f,y),V=_.node,Ae=w&&V?ue(R.snapshot.semantic,{element:V.usage.element,documentRoot:R.snapshot.parsed.root,attributeName:w.portName,uri:f,config:R.snapshot.config,policy:R.snapshot.nodeUsagePolicy}):void 0;return{node:V,binding:w,port:w?.resolution.status==="resolved"?w.resolution.port:void 0,usage:Ae,nodeUsage:_.usage}},getFormattingEdits(f){let y=A(f);return y?o.getFormattingEdits({document:y.document,config:y.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(f,y,R){let I=A(f);return I?o.getCompletions({document:I.document,position:y,workspace:l(),triggerCharacter:R,config:I.effectiveConfig}):{items:[]}},getHover(f,y){let R=A(f);return R?o.getHover({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{}},getDefinition(f,y){let R=A(f);return R?o.getDefinition({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getReferences(f,y){let R=A(f);return R?o.getReferences({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getDocumentSymbols(f){let y=A(f);return y?o.getDocumentSymbols({document:y.document,workspace:l(),config:y.effectiveConfig}):{symbols:[]}},getCodeActions(f,y,R){let I=A(f);return I?o.getCodeActions({document:I.document,range:y,diagnostics:R,workspace:l(),config:I.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return E}function zb(e={}){return Cr(e)}export{zb as createBtEditorService,dn as createLanguageService};