@abco20/btxml-checker 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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",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=`
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",MissingLocalModelDefinition:"BT123_MISSING_LOCAL_MODEL_DEFINITION",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},pn=Object.values(b).sort();var Ca=xt.object({subTreePorts:xt.enum(["loose","strict"]).optional()}).strict(),Da=xt.object({allowStringEntryCompatibility:xt.boolean().optional()}).strict(),Er={"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:Ca,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:Da,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:"error",description:"Resolved output ports must be explicitly or default-remapped to a blackboard entry."},"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/require-local-definition":{code:b.MissingLocalModelDefinition,defaultSeverity:"error",description:"When models.convention is used-only, normal node usages should have a local TreeNodesModel definition in the same file."},"model/no-duplicate-definition":{code: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 Nr={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"}}},Ba={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(Ba)}function Ye(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 G(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 Ea(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=Ea(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 Na=/^[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 wr(e){return Na.test(e)}function Mr(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?wr(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 wr(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=Mr(r);return o.ok?fn({scope:o.scope,key:o.key,raw:n,syntax:"braced"}):o}function He(e){let{rawName:t}=e;if(!t.startsWith("@"))return ge("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Mr(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 wa={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Ma(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 Pa(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Aa(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function _a(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Pr(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 La(e,t,n){let r=Pr(e,t),o=Pr(r,n);return{start:r,end:o}}function Ar(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:La(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"&&Ar(o,t,n,r)}function Oa(e,t,n,r){let o=[];for(let i of e.children||[]){if(i.kind!=="element"||!Pa(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 Va(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 Ua(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 qa(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function _r(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 Fa(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(_r),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 $a(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Xa(e){return{id:e.id,uri:e.uri,kind:e.kind,range:e.range,elementRange:e.elementRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function ja(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 Ka(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(qa),subtreeReferences:e.subtreeReferences.map($a),nodeUsages:e.nodeUsages.map(Xa),blackboardReferences:e.blackboardReferences.map(ja),treeNodesModel:e.treeNodesModel.map(Fa),genericSubTreePorts:e.genericSubTreePorts.map(_r),rootMainTreeToExecute:Aa(e.rootMainTreeToExecute)}}function za(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 Wa(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Ga(e){return G(wa.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 Ya(e,t){let n=[],r=t?.uri||e.uri,o=e.root,i=e.isBtXml,a=Ma(e),s=_a(e),l=((t?.path??e.path)||r==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",u=o&&e.kind!=="model-document"?Va(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=Oa(h,r,s,l),f=new Map;for(let y of E)Wa({node:y,treeNodesModel:d,genericSubTreePorts:c})||(f.has(y.id)?n.push(Ga(y)):f.set(y.id,y))}let m=o?Ua(o,r):[],x=o?za(o,r):[],S=o?(()=>{let h=[];return Ar(o,h,r,e.originalText),h})():[],D=o?J(o,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Ka({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 Lr(e,t){let{extracted:n,diagnostics:r}=Ya(e,t);return{model:n.publicModel,diagnostics:r}}function gn(e,t){return Lr(e,t)}var Or=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Ha=new Set([...Or,"_autoremap","_description","__shared_blackboard"]),Za=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 Or.has(e)}function Vr(e){return Ha.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(Vr(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=Za.get(t);if(r)return r}}function Ur(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])=>Ur(n,r))}}var Ja=[{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"]}],Ze=new Map,qr=new Map;for(let e of Ja){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};qr.set(e.name,t),Ze.set(e.name,e.name);for(let n of e.aliases)Ze.set(n,e.name)}function Qa(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 Ze.get(e)??e}function es(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 Je(e){return Ze.get(e)}function Ue(e=[]){let t=new Map,n=new Map(Ze);for(let r of qr.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)??Qa(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,es(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 Qe(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 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 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:[]}],$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:"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:[]}],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=[{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:[]}],zr={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 Wr=["4.6.2","4.8.2","4.9.0"],Tn="4.9.0",et={"4.6.2":{models:Fr,genericSubTreeModel:$r},"4.8.2":{models:Xr,genericSubTreeModel:jr},"4.9.0":{models:Kr,genericSubTreeModel:zr}};var Gr=Wr.map(e=>`btcpp-v${e}`),tt=["btcpp-v4",...Gr],Yr=`btcpp-v${Tn}`;function Hr(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 ts(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Hr)}))}function Zr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Hr)}}function ns(){let e={};for(let[t,n]of Object.entries(et))e[`btcpp-v${t}`]=ts(n.models);return e}function rs(){let e={};for(let[t,n]of Object.entries(et))e[`btcpp-v${t}`]=Zr(n.genericSubTreeModel);return e}var os=ns(),is=rs();function as(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(et,t)}function Jr(e){return e==="btcpp-v4"?Yr:e}function ss(e){return e==="btcpp-v4"?Tn:e.replace(/^btcpp-v/,"")}function Qr(e){if(e&&e!=="btcpp-v4"&&!as(e))throw new Error(`unsupported builtin model set: ${e}`)}function vn(e="btcpp-v4"){Qr(e);let t=Jr(e);return os[t].map(r=>eo(r))}function hn(e="btcpp-v4"){Qr(e);let t=is[Jr(e)]??Zr(et[ss(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function eo(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 nt(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=nt(e),r=nt(t);return JSON.stringify(n)===JSON.stringify(r)}function kn(e,t){if(Dt(e,t))return"none";let n=nt(e),r=nt(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 to=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(),to).optional(),description:X.string().optional()}).strict(),ls=X.object({nodes:X.record(X.string(),Bt)}).strict();import{z as T}from"zod";var no=T.enum(["off","info","warn","error"]),ro=T.union([no,T.tuple([no,T.record(T.string(),T.unknown())])]),us=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(),ds=T.string(),cs=T.object({name:T.string(),attribute:T.string(),base:T.enum(["file","project-root"]).optional()}).strict(),ps=T.object({elements:T.array(cs).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(),ms=T.object({entrypoints:T.array(ds).optional(),includes:ps.optional(),behaviorTreeIds:T.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),fs=T.enum(["allow-unused","used-only","single-source"]),gs=T.object({builtins:T.array(T.enum(tt)).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:fs.optional()}).strict(),oo=T.object({inline:T.enum(["allow","deny"]).optional()}).strict(),ys=T.object({enabled:T.boolean().optional(),rules:T.record(T.string(),ro).optional(),baseline:T.string().optional(),suppressions:oo.optional()}).strict(),bs=T.object({rules:T.record(T.string(),ro).optional(),suppressions:oo.optional()}).strict(),io=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(),Ss=T.object({files:T.array(T.string()),linter:bs.optional(),formatter:io.optional()}).strict(),ao=T.object({$schema:T.string().optional(),strict:T.boolean().optional(),files:us.optional(),resolver:ms.optional(),models:gs.optional(),linter:ys.optional(),formatter:io.optional(),overrides:T.array(Ss).optional()}).strict();function uo(e){return e.flatMap(Rs)}function Rs(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(o=>{let i=so([...e.path,String(o)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:i,message:`unknown config field \`${i}\``}});let n=so(e.path);return co(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 so(e){return e.map(String).join(".")||void 0}function co(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(lo);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(o=>o.issues??[]).some(lo):!1}function lo(e){return typeof e=="object"&&e!==null&&co(e)}function po(e){let t=ao.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:uo(t.error.issues)}}function Ts(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 vs(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 hs(e){return e.map(t=>G(t.code,t.severity==="error"?C.Error:C.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function ks(e){let t=[],n=Le(),{$schema:r,strict:o,overrides:i,...a}=e;o&&(n=Ye(n,Nr)),n=Ye(n,a),n.overrides=(i??[]).map(l=>({files:l.files,linter:vs(l.linter),formatter:Ts(l.formatter)}));let s=!t.some(l=>l.severity===C.Error);return{config:n,diagnostics:t,ok:s}}function xn(e){let t=po(e);return t.ok?ks(t.value):{ok:!1,config:Le(),diagnostics:hs(t.diagnostics)}}function xs(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=xs(o).test(n);return r?!a:a}function mo(e,t){return e.overrides.filter(n=>n.files.some(r=>Et(t,r)))}function rt(e){return e.replaceAll("\\","/")}function Is(e){try{return decodeURIComponent(e)}catch{return e}}function ot(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Is(t.pathname);return/^\/[A-Za-z]:/.test(n)?rt(n.slice(1)):t.host?rt(`//${t.host}${n}`):rt(n)}function Nt(e,t){let n=rt(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,ot(t))}function wt(e,t){let n=rt(t),r=mo(e,n),o=e;for(let i of r)o=Ye(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,ot(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 fo(e,t){if(t)return Ct(e,t)}function go(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function yo(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return G(e.code,C.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Cs(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??go(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=fo(e,l.from),d=fo(e,i);return u&&u!==d?(o.push(yo({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 Ds(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(yo({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,Cs(e,t,s,a,r))}return{...t,ports:t.ports.map(i=>o.get(i.name)??i)}}function Bs(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??go(e)}}function bo(e,t,n){let r=[],o=new Map([...e.entries()].map(([i,a])=>[i,{...a,ports:a.ports.map(Bs)}]));for(let i of n)for(let[a,s]of Object.entries(i.augment??{})){let l=o.get(a);if(!l){r.push(G("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,Ds(t,l,s,r))}return{modelsById:o,diagnostics:r}}function To(e){return it("builtin",0,!1,e)}function vo(e){return it("xml-tree-nodes-model",10,!0,e)}function ho(e){return it("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function ko(e){return it("node-definition-file",20,!0,e)}function xo(e){return it("config-inline",30,!0,e)}function it(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(o=>Io(o,e,n&&o.editable!==!1))}}function Es(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Io(e,t,n){let r=Es(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 So(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 Ns(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:So(a)});for(let[i,a]of o)r.has(i)||n.push({kind:"port-added",portName:i,sourceIndex:1,port:So(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 Ro(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=Ns(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 ws(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 Co(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=>Io(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=Ro(d,[]);for(let[m,x]of Ro(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,ws(r.get(m),x))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Ms(e){return tt.includes(e)}function Ps(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:Ue(),augmentations:[]}}function As(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function _s(e,t,n){for(let r of new Set(n))if(Ms(r)){for(let o of vn(r))e.builtins.set(o.id,o),t.push(o);e.genericSubTreePorts.push(...hn(r))}}function Ls(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)As(e.behaviorTreesById,l.id,l);i.kind==="model-document"?r.push(...s.treeNodesModel):n.push(...s.treeNodesModel),e.genericSubTreePorts.push(...s.genericSubTreePorts)}}function Os(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 Vs(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let o=Os(r);t.has(o)||(t.add(o),n.push(r))}e.genericSubTreePorts=n}function Us(e,t,n,r,o){e.modelLayers.push(To(t),vo(n),ho(r)),o.models?.length&&e.modelLayers.push(ko([...o.models])),e.modelLayers.push(...o.additionalModelLayers??[])}function Dn(e,t){return qs(e,t)}function qs(e,t){let n=Ps(),r=[],o=[],i=[],a=[];_s(n,o,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=Ue(t.augmentations??[]),Ls(n,r,i,a,e),Vs(n),Us(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(xo(d))}let l=Co(n.modelLayers),u=bo(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 Do={unknownSubTreePorts:"allow"};function Bo(e){return{...Do,...e}}var Fs=["Action","Condition","Control","Decorator"],$s=new Set(Fs);var Xs=new Set(["input_port","output_port","inout_port"]);function at(e){return $s.has(e)}function xe(e){return at(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 Eo(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 Xs.has(e.name)}function No(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":at(e.name)?"generic-node":At(e)?"unknown-xml":"concrete-node"}function _t(e){if(e.name==="SubTree")return Pt(e,"ID")||"SubTree";if(at(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 W(e,t){return ie(Y(e),t)}function be(e,t,n){return Qe(Y(e),t,n)}function st(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 wo(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function lt(e){return[...e.behaviorTreesById.keys()]}function wo(e){return[...e.documents.values()]}function ee(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function ut(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 dt(e){return[...e.augmentations]}function ct(e){return e.modelConflicts}function pt(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=ct(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=ut(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=Bo(t.policy),r=t.element,o=No(r),i=Eo(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?pt(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 zs(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Ws(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Mo(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=Mo(e,t),o=Mo(r,n);return{start:r,end:o}}function Ao(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 Gs(e,t){return zs(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function _o(e){let t=[];for(let n of e)t.push(n),t.push(..._o(n.children));return t}function Ys(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function Hs(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 Lo(e){return Se(e,"name")?.value}function Js(e){return Lo(e)||Se(e,"ID")?.value||e.name}function Qs(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${Js(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function Oo(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 Vo(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 el(e){return e.status==="resolved"?e.port.direction:"unknown"}function tl(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 Po(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:el(t.usage),valueKind:tl(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 nl(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 rl(e){return e.root?Se(e.root,"main_tree_to_execute")?.value:void 0}function ol(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=ol(e.root),o=Ws(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=Oo(p),x={element:l,path:c,tagName:l.name,kind:Gs(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:Vo(S),usage:S,blackboardReferences:Ao(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=_o(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=Hs(r.behaviorTrees),i=r.nodes.map(u=>{let d=o(u),c=u.usage,p=c.nodeType??u.tagName,m=Lo(u.element),x=Se(u.element,"ID")?.value,S=Qs(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(Zs),identityCandidates:nl({name:m,idAttr:x,nodeType:p,tagName:u.tagName,instancePath:S,behaviorTreeId:u.behaviorTree.id,nodeId:d}),model:Oo(c),usage:c,portBindings:c.portUsages.filter(D=>D.status!=="reserved-attribute").map(D=>Po(d,{name:D.name,value:D.value,attribute:D.attribute,declaredPort:Vo(D),usage:D,blackboardReferences:Ao(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=>Po(o(u.node),d))})),l=e.root?Se(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:Ys(e),mainTreeToExecute:rl(e),mainTreeToExecuteRange:l?.valueContentRange||l?.valueRange,behaviorTrees:a,nodes:i,subtreeCalls:s}}function il(e,t){let n=e.element.fullRange||e.element.range;return K(n,t)}function al(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)il(r,t.offset)&&(!n||al(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 sl(e,t){return K(e.fullRange||e.range,t)}function ll(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)sl(r,t.offset)&&(!n||ll(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 Uo(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 bl(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"){bl(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 mt(e){return e.replace(/&quot;/g,'"').replace(/&apos;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let r=Number.parseInt(n,16);return r<=0||r>1114111||r>=55296&&r<=57343?t:String.fromCodePoint(r)}).replace(/&#([0-9]+);/g,(t,n)=>{let r=Number.parseInt(n,10);return r<=0||r>1114111||r>=55296&&r<=57343?t:String.fromCodePoint(r)})}function qo(e){let t="",n=[0];for(let r=0;r<e.length;){let o=Sl(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 Sl(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:mt(a),end:t+a.length}}let o=/^&#x([0-9a-fA-F]+);/.exec(n);if(o){let a=o[0];return{value:mt(a),end:t+a.length}}let i=/^&#([0-9]+);/.exec(n);if(i){let a=i[0];return{value:mt(a),end:t+a.length}}}function Fo(e){return Oe(e.line,e.character,e.offset)}function Rl(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function Tl(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function vl(e){return e===" "||e===" "||e===`
7
+ `||e==="\r"}function hl(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
8
+ `&&e!=="\r"}function ft(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()&&vl(p());)m()}let S=(g,N,M,P,k,z)=>{n.push(G(g,N,M,v(P,k),o.uri,z))};function D(g,N,M,P,k,z){n.push(G(g,N,M,P&&k?v(P,k):void 0,o.uri,z))}function A(){if(!Rl(p()))return"";let g=i;for(m();!c()&&Tl(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=qo(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 Ia=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,Ia),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(hl(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:mt(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",Fo(g.range.start),Fo(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"]})}),Uo({document:o,diagnostics:n,partial:u,options:t})}var gt={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function $o(e){if(!e)return gt;let t=typeof e.indentWidth=="number"?e.indentWidth:gt.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:gt.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:gt.blankLineBetweenBehaviorTrees,o=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:gt.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 kl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function xl(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?[xl(t,Ft(d),n)]:[]}let i=kl(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 Il(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Xo(e,t,n,r){let o=[],i=Il(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 yt(e,t={}){let n=ft(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=$o(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(...Xo(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"),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?`
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 Ko=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,Cl=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function Dl(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(Ko)?.[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 Bl(e,t,n){let r=[];for(let o of t.matchAll(Cl)){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 El(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 jo(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(Ko);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:Bl(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=El(t,o);if(a)return{kind:"closing-tag-name",tagNamePrefix:a.tagNamePrefix,replacementRange:a.replacementRange,tagText:Dl(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=jo(t,o);if(d)return d.kind==="tag-name"?{...d,element:d.element??u}:d}i={kind:"element",element:u}}}let s=jo(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 zo(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Wo(e,t){return e.includeIssuesByUri.get(t)??[]}function Go(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Yo(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=Nl(t.root);return{document:t,view:o,semantic:n,config:r,options:e.options,facts:e.facts,report(u){let d=G(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=Wo(e.facts,t.uri);return u?d.filter(c=>c.kind===u):d},getSuppressionIssues(u){let d=Go(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 pt(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 Nl(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=Er[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var wl={"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:wl[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Ml(n)})}}}})}function Ml(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 Ho=[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 Pl from"ajv";var Al=Pl,_l=new Al,Ll=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],Ol={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"]),Zo=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 Jo(e){return e.children.filter(t=>t.kind==="element")}function ae(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function Qo(e){return e.children.some(t=>t.kind==="element")}function Gt(e,t){let n=ei(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function ei(e){let t=je(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 Wt(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return $l(e.registry,n,e.value)?void 0:Wt(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!ni(r,e.value))return Vl(r)?Wt(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 ti(e,t){return ie(e,Ie(t))}function je(e,t){let n=F({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function Wt(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function Vl(e){let t=Je(e)??e;return ri(e)!==void 0||Xl.has(t.toLowerCase())}function ni(e,t){let n=ri(e);if(n)return Ul(n,t);let r=(Je(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 Ll.includes(t);default:return Xn.has(r)||Zo.has(r)?oi(r,t):!1}}function ri(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Ul(e,t){let n=Fl(t);return n?n.every(r=>ql(e,r)):!1}function ql(e,t){if(t.kind==="string")return ni(e,t.value);let n=(Je(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)||Zo.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&oi(n,String(t.value)):!1}}function oi(e,t){let n=Ol[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 Fl(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 $l(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?ei({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 _l.compile(t.schema)(r)===!0}catch{return!1}}}var Xl=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 ii=[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 ct(e.semantic))t.uri&&t.uri!==e.document.uri||jl(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(!Kl(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=zl(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"){je(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}Gt(e,{port:s,value:n.value,range:n.range,registry:Y(e.semantic),typeDefinition:W(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=je(i.name,i.value);if(!a)continue;let s=ti(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:Yl(o.element),port:i.declaredPort.port,typeDefinition:s,range:i.attribute.range}),n.set(l,u)}for(let o of n.values()){let i=Wl(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 ${Gl(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 be explicitly or default-remapped to a blackboard entry."},create(e){return{Element(t){if(Hl(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of n.ports){if(r.direction!=="output")continue;let o=n.portUsages.find(i=>i.name===r.name&&i.status==="resolved");if(o){if(je(r.name,o.value)!==void 0)continue;e.report({code:b.OutputPortRequiresRemap,message:`output port \`${r.name}\` must be remapped to a blackboard entry`,range:o.attribute.range,details:{primaryLabel:`output port \`${r.name}\` requires a blackboard remap`,help:`use \`${r.name}="{${r.name}}"\` or \`${r.name}="{some_key}"\``}});continue}r.defaultValue!==void 0&&je(r.name,r.defaultValue)!==void 0||e.report({code:b.OutputPortRequiresRemap,message:`output port \`${r.name}\` must be remapped to a blackboard entry`,range:t.range,details:{primaryLabel:`output port \`${r.name}\` requires a blackboard remap`,help:`use \`${r.name}="{${r.name}}"\` or \`${r.name}="{some_key}"\``}})}}}}})];function jl(e,t){return e.diagnostics.some(n=>n.code===b.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function Kl(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function zl(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 Wl(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 Gl(e,t){return Ie(e)??t.canonical}function Yl(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Hl(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Zl=new Set(["_failureIf","_successIf","_skipIf","_while"]),Jl=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Ce(e){if(Zl.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Jl.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=He({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 ai=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),si=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function Ke(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(li(r)){n++;continue}if(jn(r)){let s=n;for(n++;n<e.length&&tu(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=eu(e,n);t.push(s),n=s.end;continue}if(r==="'"){let s=Ql(e,n);t.push(s),n=s.end;continue}let o=e.slice(n,n+2),i=ai.get(o);if(i){t.push({type:i,text:o,start:n,end:n+2}),n+=2;continue}let a=si.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 Ql(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 eu(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&&nu(e[n]);)n++;return o===n||ou(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 ru(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(li(r)||si.has(r)||ai.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 li(e){return e===" "||e===" "||e===`
13
+ `||e==="\r"}function jn(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function tu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function De(e){return e!==void 0&&/[0-9]/.test(e)}function nu(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function ru(e,t){let n=e[t];return jn(n)||De(n)}function ou(e,t){let n=e[t];return n==="."||jn(n)||De(n)}var iu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),au=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),ui=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=Ke(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}:di(t,e)}function di(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=cu(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=iu.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=ui.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=ui.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=au.get(r.type),s=a?uu(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(),su(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:lu(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(),du(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 su(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 lu(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function uu(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 du(e,t){return{...e,range:t}}function cu(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var pu=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)=>Qe(t,a,s)),r=new Map,o=new Map,i={symbols:new Map,globalBlackboard:new Map,enums:mu(e.enums,e.augmentations??[])};for(let a of e.symbols??[])ci(i.symbols,r,a,n);for(let a of e.globalBlackboardSymbols??[])ci(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 pi(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 mi(t,n)}function mi(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"}:pu.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function fi(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 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 mu(e,t){if(e instanceof Map)return new Map(e);let n=pi(t??[]);for(let[r,o]of Object.entries(e??{}))n.set(r,o);return n}function ci(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)||!fi(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 gu(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 yi(n)||yi(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:Wn(n,r)?oe:(Gn(e,t.range,t.operator),U);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Me:Wn(n,r)?oe:(Gn(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:Wn(n,r)?oe:(Gn(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(!yu(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 fu(e)}}function fu(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),bi(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&&ze(m.type,a)?a:m?void 0:a:gi(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&&!ze(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 ze(c.type,a)?(Hn(c,a),a):(Yn(e,s,c.type,a),U);if(i.operator===":=")return ze(c.type,a)?(Hn(c,a),a):(Yn(e,s,c.type,a),U);let p=gi(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 gu(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),bi(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 gi(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 Wn(e,t){return Zt(e)||Zt(t)}function Zt(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function yi(e){return!Ne(e)}function yu(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 Gn(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 bi(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 Si=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),bu=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"]),Su=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],Ru=[":=","=","+=","-=","*=","/="],Ri=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function Jn(e){let t=e.source,n=hi(t,e.cursorOffset),r=Qt({source:t,cursorOffset:n}),o=[];return r.kind==="identifier"&&(o.push(...Tu(e,r)),Cu(e.attributeInfo,t,n)&&o.push(...ku(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&o.push(...vu(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&o.push(...hu(r.range,r.prefix)),Eu(o)}function Qt(e){let t=e.source,n=hi(t,e.cursorOffset),r=Ke(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=Du(t,n),a=Jt(r,i.start);if(i.start<i.end&&a&&Si.has(a.type))return{kind:a.type==="Identifier"&&vi(r,a)?"after-assignment-lhs":"operator",prefix:t.slice(i.start,n),range:i};let s=Jt(r,n);return s&&Si.has(s.type)&&s.end<=n?{kind:s.type==="Identifier"&&vi(r,s)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!s||bu.has(s.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function Tu(e,t){let n=xu(e),r=t.prefix.toLowerCase(),o=[];for(let[i,a]of n.enums)We(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&&We(i.name,r)&&o.push({label:i.name,kind:"identifier",detail:Ti(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}`;We(a,r)&&o.push({label:a,kind:"identifier",detail:Ti(i),replaceRange:t.range,sortText:`2-${a}`})}for(let i of["true","false"])We(i,r)&&o.push({label:i,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${i}`});return o}function vu(e,t){return Su.filter(n=>We(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function hu(e,t){return Ru.filter(n=>We(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function ku(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 xu(e){let t=de(e.environment),n=Ke(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=Bu(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 Ti(e){let t=Iu(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 Iu(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 Cu(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=Ke(t).filter(i=>i.type!=="EndOfInput"),o=Jt(r,n);return!o||o.type==="Semicolon"}function Du(e,t){let n=t;for(;n>0&&Ri.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&Ri.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 vi(e,t){if(t.type!=="Identifier")return!1;let n=Jt(e,t.start);return!n||n.type==="Semicolon"}function Bu(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function We(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function hi(e,t){return Math.max(0,Math.min(e.length,t))}function Eu(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 ki=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 xi(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=Ii(e,[]);return{...o,environment:i,analysis:o.parseResult.ok?we({program:o.parseResult.program,environment:i,attributeName:o.attribute.name}):void 0}}):Nu(e,r).filter(o=>o.node.element===t).map(o=>({...o.candidate,environment:o.environmentBefore,analysis:o.analysis}))}function Nu(e,t){let n=ki.get(e.view);n||(n=new WeakMap,ki.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:Ii(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 Ii(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=W(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=W(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(...wu(e,n)),vt({symbols:r,globalBlackboardSymbols:o,augmentations:dt(e.semantic),areTypesCompatible:(a,s)=>a&&s?be(e.semantic,a,s):!0})}function wu(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=W(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 Ci=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 Di=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 Bi=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 Ei=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 Ni=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,xi(n.attribute)):se(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var wi=[Ni,Ci,Di,Bi,Ei];var Mu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function Mi(e){return B({name:Mu[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Pu(n)})}}}})}function Pu(e){return e.code?{code:e.code}:void 0}var Pi=[Mi("unused"),Mi("missing-reason")];function tn(e,t){return e.attributes.find(n=>n.name===t)}function Ai(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 _i=[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=st(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 lt(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"||Ai(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"||Ai(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 Au=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function _u(e,t){return e===t?String(e):`${e}\u2013${t}`}var Li=B({name:"model/valid-child-count",create(e){return{Element(t){if(ae(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Lu(e,t,n.model.model.id,n.model.model.kind)}}}});function Lu(e,t,n,r){let o=Jo(t).length,i=Au.get(n);if(i){if(o<i.min||o>i.max){let a=_u(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 Oi=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"&&Gt(e,{port:o.port,value:r.value,range:r.range,registry:Y(e.semantic),typeDefinition:W(e.semantic,o.port.type),allowRemap:!0,diagnosticCode:b.InvalidPortValueType,customLiteralDiagnosticCode:b.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var Vi=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 Ui=[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||Qo(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 qi=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 Fi=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 $i=[qi,Fi,Vi,Oi,...Ui,Li];function Ou(e,t){return e.attributes.find(n=>n.name===t)}function Vu(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Xi=[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||Ou(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)||Vu(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Qn=[...Xi,...wi,..._i,...ii,...$i,...Ho,...Pi],iy=new Map(Qn.map(e=>[e.name,e]));function ji(e){if(e!=="off")return e==="info"?C.Info:e==="warn"?C.Warning:C.Error}function Ki(e,t){return Mt(e.linter.rules[t])?.options??{}}function zi(e){let t=Mt(e.config.linter.rules[e.rule]);return ji(t?t.severity:e.defaultSeverity)}function Wi(e){let t=[],n=e.facts??zo(),r=e.rules?new Set(e.rules):void 0,o=[];for(let a of Qn){if(r&&!r.has(a.name))continue;let s=zi({config:e.config,rule:a.name,defaultSeverity:a.defaultSeverity});if(!s)continue;let l=Ki(e.config,a.name),u=a.optionsSchema?.safeParse(l),d=u?.success?u.data:l,c=Yo({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&&Gi(e.document.root,o);let i=st(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)=>Uu(a.diag,s.diag)||a.index-s.index).map(a=>a.diag)}function Gi(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Gi(n,t)}function Uu(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(...Wi({document:e,view:o,semantic:t,config:n.config})),r}function Yi(e){return e?.documents??[]}function qu(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 Fu(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=ft(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,...Yi(r).filter(d=>!qu(e.document,d))]:Yi(r),i=Fu(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 Hi(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:v(r,r),newText:n}}function Zi(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 Ji(e,t,n){return tr(e,t,n,"")}function tr(e,t,n,r){let o=Math.max(t.openTagRange.end.offset-(t.selfClosing?2:1),t.openTagRange.start.offset),i=e.positionAt(o);return{range:v(i,i),newText:` ${n}="${r}"`}}function nn(e){return v(e.positionAt(0),e.positionAt(e.text.length))}function nr(e,t){let n=t.diagnostics||e.diagnostics,r=[],o=yt(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(!$u(i))continue;let a=H({document:t.document,parsed:e.parsed,position:i.range.start}),s=ju(e,t,i,a);Ku(r,e,t,i.code,i,s),zu(r,e,t,i.code,i,a,s),Wu(r,e,t,i.code,i,a),Gu(r,e,t,i.code,i),Yu(r,t,i)}return{actions:r}}function $u(e){return!!e.range}function Xu(e){return e.status==="resolved"}function rr(e,t,n){return L(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function Qi(e){return"element"in e?e.element:void 0}function ju(e,t,n,r){let o=Qi(r),i=e.parsed?.root;if(!i||!n.range)return o;let a=Math.min(n.range.start.offset+1,n.range.end.offset);return Xe(i,a)??o}function Ku(e,t,n,r,o,i){if(r!=="BT101_MISSING_REQUIRED_PORT"||!i)return;let a=rr(t,n,i),s=a.ports.find(l=>l.required&&!a.portUsages.some(u=>u.status==="resolved"&&u.name===l.name));s&&e.push({title:`Add missing port ${s.name}`,kind:"quickfix",diagnostics:[o],edits:[Ji(n.document,i,s.name)]})}function zu(e,t,n,r,o,i,a){if(r!=="BT115_OUTPUT_PORT_REQUIRES_REMAP"||!a)return;let s=/`([^`]+)`/.exec(o.message)?.[1],l=rr(t,n,a),u="attribute"in i?i.attribute:void 0;if(u){let c=l.portUsages.find(p=>Xu(p)&&p.port.direction==="output"&&p.attribute===u&&(!s||p.port.name===s));if(c){e.push({title:`Remap output port ${c.port.name}`,kind:"quickfix",diagnostics:[o],edits:[{range:u.valueContentRange??u.valueRange,newText:`{${c.port.name}}`}]});return}}let d=l.ports.find(c=>c.direction==="output"&&(!s||c.name===s)&&!l.portUsages.some(p=>p.status==="resolved"&&p.name===c.name));d&&e.push({title:`Remap output port ${d.name}`,kind:"quickfix",diagnostics:[o],edits:[tr(n.document,a,d.name,`{${d.name}}`)]})}function Wu(e,t,n,r,o,i){if(r!=="BT102_UNKNOWN_PORT"||!("attribute"in i&&i.attribute))return;let a=Qi(i);if(!a||!rr(t,n,a).portUsages.find(d=>d.status==="undeclared"&&d.attribute===i.attribute))return;let u=Zi(n.document,i.attribute);u&&e.push({title:`Remove unknown port ${i.attribute.name}`,kind:"quickfix",diagnostics:[o],edits:[u]})}function Gu(e,t,n,r,o){if(r!=="BT002_MISSING_BTCPP_FORMAT"||!t.parsed?.root)return;let i=n.document.positionAt(t.parsed.root.nameRange?.end.offset||t.parsed.root.openTagRange.end.offset-1);e.push({title:'Add BTCPP_format="4" to <root>',kind:"quickfix",diagnostics:[o],edits:[{range:v(i,i),newText:' BTCPP_format="4"'}]})}function Yu(e,t,n){n.range&&e.push({title:`Suppress ${n.code} for next line`,kind:"quickfix",diagnostics:[n],edits:[Hi(t.document,n.range.start.line,`<!-- btxml-disable-next-line ${n.code} reason: TODO -->
14
+ `)]})}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 or(e){return ke(e)}function Pe(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function ea(e,t){return!e||!t?!1:Pe(e)===Pe(t)}function ta(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 Hu(e,t,n){return v(e.positionAt(t),e.positionAt(n))}function Zu(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:Hu(e,d,Math.max(d,c)),wrapsReference:!1,hasScopeMarker:a[1]==="@"}}return{insertText:t.value,replacementRange:r,wrapsReference:!0,hasScopeMarker:!1}}function ir(e){let{document:t,attribute:n,cursorOffset:r,symbol:o,detail:i}=e,a=Zu(t,n,r),s=a?.wrapsReference??!1,l=a?.hasScopeMarker??!1;if(l&&o.scope!=="global")return;let u=o.key;s?u=or(o):o.scope==="global"&&(u=`@${o.key}`);let d=o.key;s?d=or(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 na=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=ur(e,n.element,n.attribute);if(!r)return;let o=r.attribute.valueContentRange??r.attribute.valueRange,i=t.offset-o.start.offset,a=cr(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=sa(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:ar(e,r,s.range),reference:d,flowState:l,occurrence:{uri:e.document.uri,attributeContext:r,identifier:u.access,reference:d,documentRange:ar(e,r,u.access.range)}}}function ra(e,t){let n=(t.reference.kind==="global-blackboard"?da(e):on(e,t.attributeContext.behaviorTree).flatMap(r=>la(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:ed(t.reference.symbol,r.reference));return t.reference.kind==="global-blackboard"?td([...n,...ua(e,t.reference.key)]):n}function oa(e,t){return ca(ua(e,t).map(n=>({uri:n.uri,range:n.documentRange})))}function ia(e,t){return ca(da(e).filter(n=>n.reference.kind==="global-blackboard"&&n.reference.key===t).map(n=>({uri:n.uri,range:n.documentRange})))}function sr(e,t){return on(e,t)}function aa(e,t,n){let r=ur(e,t,n);if(r)return sa(e,r).environmentBefore}function lr(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 sa(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=na.get(e);n||(n=new WeakMap,na.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=ur(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:Ju(e,t.nodes),entries:i}).flatMap((s,l)=>{let u=o[l];return u?[{...s,context:u}]:[]});return n.set(t,a),a}function ur(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 Ju(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=W(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=ma(l);if(!u||u.scope==="global")continue;let d=l.declaredPort.port.type,p=W(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=dr(e).flatMap(({trees:s})=>s.flatMap(l=>l.nodes));return o.push(...Qu(e,n,a)),vt({symbols:r,globalBlackboardSymbols:o,augmentations:dt(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=ma(a);if(!s||s.scope!=="global")continue;let l=a.declaredPort.port.type,d=W(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 la(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:ar(e,t.context,n.access.range)}]}):[]}function ed(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 td(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 ua(e,t){return dr(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 da(e){return dr(e).flatMap(({uri:t,trees:n})=>n.flatMap(r=>{let o=rd(e,t);return on(o,r).flatMap(i=>nd(o,t,i))}))}function nd(e,t,n){return la(e,n).map(r=>({...r,uri:t}))}function dr(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 rd(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 ca(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 ar(e,t,n){return me(e.parsed??{originalText:e.document.text},t.attribute,n)}function cr(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 pa(e,t,n){let r=e.parsed??{originalText:e.document.text};return me(r,t,n)}function ma(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 od(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 fa(e,t,n,r){let o=od(e,n,r);if(!o)return;let i=r.valueContentRange??r.valueRange,a=aa(e,n,r),s=Math.max(0,t.position.offset-i.start.offset);return Jn({source:r.value,cursorOffset:cr(r,s),environment:a,attributeName:r.name,attributeInfo:o}).map(u=>id(e,r,u))}function id(e,t,n){return O(n.label,ad(n.kind),n.detail,{range:pa(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function ad(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 ga(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function ya(e,t){if(!e)return;let n=ga(e)?e.valueContentRange:e.valueRange;if(n)return j(n,ga(e)?t:`"${t}"`)}function ba(e,t,n,r){let o=[],i=[];for(let a of lt(e)){let s=Q(e,a),l=O(a,"Value","BehaviorTree ID",r?ya(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 sd(e){return O("SubTree","Class","Built-in subtree tag",j(e,"SubTree"),{sortText:"0-SubTree"})}function ld(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 ud(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))),sd(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 pr(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 dd(e,t,n){let r=[O("ID","Property",void 0,j(n,"ID"))];return r.push(...pr(t,n)),r.filter(o=>!e.attributes.some(i=>i.name===o.label))}function cd(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(...pr(a,r)),i}return e.name==="SubTree"?dd(e,sn(n,t,e),r):e.name==="include"?[O("path","Property",void 0,j(r,"path"))]:pr(sn(n,t,e),r)}function pd(e,t,n,r){return ba(t.semantic,e.document.uri,n,r)}function md(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?ya(r,a.id):j(n,a.id)))));return o}function fd(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 md(n.semantic,i,r.valueContentRange||r.valueRange,r);if(o.name==="SubTree"&&r.name==="ID")return pd(e,n,r.valueContentRange||r.valueRange,r);if(o.name==="root"&&r.name==="main_tree_to_execute")return ba(n.semantic,e.document.uri,r.valueContentRange||r.valueRange,r);if(o.name==="include"&&r.name==="path")return(n.workspace?n.workspace.documents.map(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=fa(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=ta(n),m=Pe(u.type),x=p.filter(h=>!h.conflict&&ea(u.type,h.type)),S=p.filter(h=>!h.conflict&&!Pe(h.type)&&m),D=x.flatMap(h=>{let E=ir({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=ir({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 mr(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(fd(t,n,e))}:n.kind==="attribute-name"?{items:ve(cd(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:ve(ud(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:ve(ld(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 gd(e,t,n){return ut(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 fr(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 gr(e,t,n,r,o,i,a){let s=fr(e,i,a),l=(t??[]).flatMap(u=>{if(u.uri===a)return[];let d=te(u,{semantic:n,config:r,policy:o});return fr(d,i,u.uri)});return ln([...s,...l])}function yr(e,t,n){return fr(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=gd(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"?gr(t,a,r,o,i,p.identity,e.uri):yr(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 br(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=sr(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=oa(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=sr(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 Sr(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function Sa(e,t){let n=yt(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 Rr(e,t){return Sa(t,e.config.formatter)}function Ra(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
15
15
  Description: ${e.description}`:""}`].join(`
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?`
16
+ `)}function Ta(e){let t=e.source==="builtin"?`${e.kind.toLowerCase()} node`:`${e.kind} node`;return`**${t[0].toUpperCase()}${t.slice(1)}** \`${e.id}\`${e.ports.length?`
17
17
 
18
- Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function id(e,t){return`**SubTree** \`${e}\`
18
+ Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function yd(e,t){return`**SubTree** \`${e}\`
19
19
 
20
20
  Resolves ambiguously across ${t.length} candidates:
21
21
  ${t.map(n=>`- \`${n}\``).join(`
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}\`
22
+ `)}`}function bd(e,t){return e.map(n=>{let r=n.uri||t,o=n.idRange?.start.offset??-1;return`${r}:${o}`})}function Tr(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
- 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
- `):`**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(`
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: ${lr(u)}`].join(`
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: ${lr(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=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}\`
28
+ Resolves to \`BehaviorTree ID="${i.value}"\` in \`${u.uri}\`.`}}if(l?.status==="ambiguous"){let u=e.parsed?.uri||"workspace",d=bd([...l.behaviorTrees,...l.definitions],u);return{range:i.valueContentRange||i.valueRange,contents:yd(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 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};
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:Ra(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:Ra(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:Ta(l)}}return o&&a?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:Ta(a.model.model)}:{}}function vr(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 hr(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=>kr(r,{uri:a.uri,range:a.idRange}));o&&n.add(o.id);let i=Mn(e.semantic).find(a=>a.kind==="SubTree"&&(kr(r,{uri:a.uri,range:a.idRange})||kr(r,{uri:a.uri,range:a.range})));i&&n.add(i.id)}return[...n]}function kr(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function xr(e,t){let n=Ge(e,t.position);if(n)return{locations:hr(ra(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:hr([...s.scope==="global"?gr(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,d,e.document.uri):yr(e.documentView,d,e.document.uri),...s.scope==="global"?ia(e,s.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:vr(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:vr(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:hr(u.flatMap(d=>vr(e,d)))}:{locations:[]}}function Rd(e,t){return e.attributes.find(n=>n.name===t)}function Ir(e){let t=e.name==="BehaviorTree"?Rd(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=>Ir(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 Cr(e,t){return e.parsed?.root?{symbols:[Ir(e.parsed.root)]}:{symbols:[]}}function Td(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function dn(e={}){return{getDiagnostics(t){return Td(Sr(le(t,e),t))},getCompletions(t){return mr(le(t,e),t)},getHover(t){return Tr(le(t,e),t)},getDefinition(t){return br(le(t,e),t)},getReferences(t){return xr(le(t,e),t)},getDocumentSymbols(t){return Cr(le(t,e),t)},getCodeActions(t){return nr(le(t,e),t)},getFormattingEdits(t){return Rr(le(t,e),t)}}}var va={line:0,character:0,offset:0},kt={start:va,end:va};function vd(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 hd(e,t){return{kind:"element",name:e,attributes:vd(t),children:[],range:kt,openTagRange:kt,selfClosing:!0}}function kd(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function Dr(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=>Dr(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Dr(r)}`).join(",")}}`:JSON.stringify(String(e))}function xd(e){return Dr(e)}function Id(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 ha(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 ka(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function xa(e,t){if(!t.startsWith("file://"))return;let n=ka(e),r=ka(ot(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function Br(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=xd(y),_=r.get(f.uri);if(_&&_.documentVersion===f.version&&_.workspaceVersion===I&&_.document===f&&_.workspace===R&&_.configFingerprint===w)return _;let V=Id(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?xa(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||ha(y.parsed)||x(f.uri)||m(f.uri)}function D(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||ha(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?xa(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:hd(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}:{...kd(_.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 rS(e={}){return Br(e)}export{rS as createBtEditorService,dn as createLanguageService};