@abco20/btxml-checker 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +29 -27
- package/dist/config.d.ts +3 -3
- package/dist/config.js +1 -1
- package/dist/editor-node.d.ts +7 -7
- package/dist/editor-node.js +23 -21
- package/dist/editor.d.ts +7 -7
- package/dist/editor.js +22 -20
- package/dist/{effective-t_u6qJ-7.d.ts → effective-Dmz864HF.d.ts} +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +10 -9
- package/dist/model.d.ts +2 -2
- package/dist/model.js +3 -2
- package/dist/{public-types-DaawwXHQ.d.ts → public-types-D3_VR6Sy.d.ts} +5 -5
- package/dist/{public-types-B2noBQY9.d.ts → public-types-zg51kxSL.d.ts} +26 -4
- package/dist/rules.d.ts +26 -7
- package/dist/rules.js +4 -3
- package/dist/semantic.d.ts +6 -6
- package/dist/semantic.js +3 -2
- package/dist/server.cjs +1593 -464
- package/dist/server.cjs.map +1 -1
- package/dist/syntax.js +6 -6
- package/dist/{types-BaOc_AYN.d.ts → types-BIuA9iLZ.d.ts} +2 -2
- package/dist/{types-SY4-jKCn.d.ts → types-DPS-KRMY.d.ts} +2 -2
- package/dist/{types-CkOvIGPf.d.ts → types-DkQEPPAM.d.ts} +5 -3
- package/dist/{types-BgqDzlJ8.d.ts → types-H6H-_Z3F.d.ts} +12 -0
- package/package.json +1 -1
- package/schemas/btxml.config.schema.json +10 -0
package/dist/editor.js
CHANGED
|
@@ -1,28 +1,30 @@
|
|
|
1
|
-
import{z as ft}from"zod";var S={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},en=Object.values(S).sort();var Zo=ft.object({subTreePorts:ft.enum(["loose","strict"]).optional()}).strict(),Jo=ft.object({allowStringEntryCompatibility:ft.boolean().optional()}).strict(),dr={"script/valid-syntax":{code:S.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:S.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:S.AssignmentToUnknownVariable,codes:[S.AssignmentToUnknownVariable,S.InvalidCompoundAssignment,S.ScriptVariableTypeMismatch],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:S.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:S.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:S.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:S.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:S.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:S.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:S.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:S.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:S.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:S.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:S.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:S.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:S.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:S.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:S.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:S.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:S.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:S.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:S.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:S.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:S.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:S.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:S.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:S.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:S.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:S.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:S.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:S.UnknownPort,defaultSeverity:"warn",optionsSchema:Zo,options:[{name:"subTreePorts",type:'"loose" | "strict"',default:"loose",description:"Controls whether SubTree remap attributes are checked strictly."}],description:"Reports ports that are not declared by the resolved node model."},"model/valid-port-value":{code:S.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:S.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:Jo,options:[{name:"allowStringEntryCompatibility",type:"boolean",default:"true",description:"Treat std::string blackboard entries as runtime-compatible with other port types, matching BT.CPP's existing-entry special case."}],description:"Blackboard entries must not mix incompatible resolved port types."},"model/valid-port-default-value":{code:S.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:S.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:S.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:S.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:S.InvalidChildCount,defaultSeverity:"warn",description:"Child count must match the expected count for the node kind (Action/Condition: 0, Decorator: 1, Control: >=1, special builtins: fixed range)."},"model/no-conflicting-definition":{code:S.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"suppression/no-unused":{code:S.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:S.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var gt=["off","info","warn","error"];var lr={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"}}},Qo={files:{include:["**/*.xml"],ignore:["build/**","install/**","log/**","node_modules/**",".git/**"],useGitignore:!0,followSymlinks:!1,maxSize:5*1024*1024},resolver:{entrypoints:[],includes:{elements:[{name:"include",attribute:"path",base:"file"}],variables:{},allowOutsideRoot:!1,maxDepth:32,maxFiles:1e3},behaviorTreeIds:"workspace-unique"},models:{builtins:["btcpp-v4"],files:[],augmentations:[],definitions:[],inline:{}},linter:{enabled:!0,rules:{},baseline:void 0,suppressions:{inline:"allow"}},formatter:{indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"},overrides:[]};function we(){return structuredClone(Qo)}function Fe(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 z(e,t,n,r,i="",o,s){return{code:e,severity:t,message:n,uri:i,...r?{range:r}:{},...o?{details:o}:{},...s?{data:s}:{}}}function Me(e,t,n){return{line:e,character:t,offset:n}}function R(e,t){return{start:e,end:t}}function F(e,t){return e?e.start.offset<=t&&t<=e.end.offset:!1}function es(e){let t=[0];for(let n=0;n<e.length;n+=1)e[n]===`
|
|
2
|
-
`&&t.push(n+1);return t}function
|
|
3
|
-
`||t==="\r")return"port names must not contain whitespace";let r=bs.get(t);if(r)return r}}function yr(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])=>yr(n,r))}}var Ts=[{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"]}],Xe=new Map,Sr=new Map;for(let e of Ts){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Sr.set(e.name,t),Xe.set(e.name,e.name);for(let n of e.aliases)Xe.set(n,e.name)}function vs(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 an(e){return Xe.get(e)??e}function Rs(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 $e(e){return Xe.get(e)}function Ae(e=[]){let t=new Map,n=new Map(Xe);for(let r of Sr.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[i,o]of Object.entries(r.types??{})){let s=an(o.canonical??i),u=t.get(s)??vs(i,s,o);u.name=i,u.kind=o.kind,u.canonical=s,u.source="augmentation",u.validate=o.validate??u.validate,u.aliases.add(i),u.aliases.add(s);for(let d of o.aliases??[])u.aliases.add(d);for(let d of o.compatibleWith??[])u.compatibleWith.add(d);t.set(s,u),n.set(i,s),n.set(s,s);for(let d of o.aliases??[])n.set(d,s)}for(let r of t.values())r.compatibleWith=new Set([...r.compatibleWith].map(i=>n.get(i)??an(i))),r.compatibleWith.delete(r.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([r,i])=>[r,Rs(i)])),namesToCanonical:n}}function Q(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??an(t),r=e.entriesByCanonical.get(n);return r||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function St(e,t){return Q(e,t)?.canonical}function je(e,t,n){let r=Q(e,t),i=Q(e,n);return!r||!i?!1:r.kind==="any"||i.kind==="any"||r.canonical===i.canonical?!0:r.compatibleWith.includes(i.canonical)||i.compatibleWith.includes(r.canonical)}function br(e,t){if(e.length<3)return!1;let n=0,r=e.length-1;for(;n<=r&&e[n]===" ";)n+=1;for(;n<=r&&e[r]===" ";)r-=1;let o=r-n+1>=3&&e[n]==="{"&&e[r]==="}";return o&&t&&(t.current=e.slice(n+1,r)),o}function Tr(e){let t={};return br(e,t)?t.current:void 0}function K(e,t){return t==="{=}"||t==="="?e:Tr(t)}var vr=[{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:[]}],Rr={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 hr=[{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:[]}],xr={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:[]}],Cr={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 Ir=["4.6.2","4.8.2","4.9.0"],un="4.9.0",Ke={"4.6.2":{models:vr,genericSubTreeModel:Rr},"4.8.2":{models:hr,genericSubTreeModel:xr},"4.9.0":{models:kr,genericSubTreeModel:Cr}};var Dr=Ir.map(e=>`btcpp-v${e}`),ze=["btcpp-v4",...Dr],Er=`btcpp-v${un}`;function Nr(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 hs(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(Nr)}))}function Br(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(Nr)}}function xs(){let e={};for(let[t,n]of Object.entries(Ke))e[`btcpp-v${t}`]=hs(n.models);return e}function ks(){let e={};for(let[t,n]of Object.entries(Ke))e[`btcpp-v${t}`]=Br(n.genericSubTreeModel);return e}var Cs=xs(),Is=ks();function Ds(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Ke,t)}function wr(e){return e==="btcpp-v4"?Er:e}function Es(e){return e==="btcpp-v4"?un:e.replace(/^btcpp-v/,"")}function Mr(e){if(e&&e!=="btcpp-v4"&&!Ds(e))throw new Error(`unsupported builtin model set: ${e}`)}function dn(e="btcpp-v4"){Mr(e);let t=wr(e);return Cs[t].map(r=>Ar(r))}function ln(e="btcpp-v4"){Mr(e);let t=Is[wr(e)]??Br(Ke[Es(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function Ar(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 We(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 i=t.direction.localeCompare(n.direction);if(i!==0)return i;let o=(t.type??"").localeCompare(n.type??"");if(o!==0)return o;let s=(t.defaultValue??"").localeCompare(n.defaultValue??"");return s!==0?s:(t.description??"").localeCompare(n.description??"")}).map(t=>({name:t.name,direction:t.direction,type:t.type,required:t.required,defaultValue:t.defaultValue,enum:t.enum?[...t.enum].sort():void 0,description:t.description}))}}function bt(e,t){let n=We(e),r=We(t);return JSON.stringify(n)===JSON.stringify(r)}function cn(e,t){if(bt(e,t))return"none";let n=We(e),r=We(t);if(n.kind!==r.kind)return"kind";if(n.ports.length!==r.ports.length)return"ports";let i=new Map(r.ports.map(a=>[a.name,a])),o=!1,s=!1;for(let a of n.ports){let u=i.get(a.name);if(!u){s=!0;continue}(a.direction!==u.direction||a.type!==u.type||a.required!==u.required)&&(s=!0);let d=a.enum?JSON.stringify(a.enum):"",l=u.enum?JSON.stringify(u.enum):"";d!==l&&(s=!0),a.description!==u.description&&(s=!0),a.defaultValue!==u.defaultValue&&(o=!0)}return s?"ports":o?"port-default":"mixed"}import{z as q}from"zod";var Pr=q.object({direction:q.enum(["input","output","inout"]).optional(),type:q.string().optional(),required:q.boolean().optional(),default:q.string().optional(),description:q.string().optional(),enum:q.array(q.string()).optional()}).strict(),Tt=q.object({kind:q.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:q.record(q.string(),Pr).optional(),description:q.string().optional()}).strict(),Ns=q.object({nodes:q.record(q.string(),Tt)}).strict();import{z as v}from"zod";var _r=v.enum(["off","info","warn","error"]),Lr=v.union([_r,v.tuple([_r,v.record(v.string(),v.unknown())])]),Bs=v.object({include:v.array(v.string()).optional(),ignore:v.array(v.string()).optional(),useGitignore:v.boolean().optional(),followSymlinks:v.boolean().optional(),maxSize:v.number().int().positive().optional()}).strict(),ws=v.string(),Ms=v.object({name:v.string(),attribute:v.string(),base:v.enum(["file","project-root"]).optional()}).strict(),As=v.object({elements:v.array(Ms).optional(),variables:v.record(v.string(),v.string()).optional(),allowOutsideRoot:v.boolean().optional(),maxDepth:v.number().int().min(1).optional(),maxFiles:v.number().int().min(1).optional()}).strict(),Ps=v.object({entrypoints:v.array(ws).optional(),includes:As.optional(),behaviorTreeIds:v.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),_s=v.object({builtins:v.array(v.enum(ze)).optional(),files:v.array(v.string()).optional(),augmentations:v.array(v.string()).optional(),definitions:v.array(v.string()).optional(),inline:v.record(v.string(),Tt).optional()}).strict(),Or=v.object({inline:v.enum(["allow","deny"]).optional()}).strict(),Ls=v.object({enabled:v.boolean().optional(),rules:v.record(v.string(),Lr).optional(),baseline:v.string().optional(),suppressions:Or.optional()}).strict(),Os=v.object({rules:v.record(v.string(),Lr).optional(),suppressions:Or.optional()}).strict(),Vr=v.object({indentWidth:v.number().int().min(1).max(8).optional(),xmlDeclaration:v.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:v.boolean().optional(),lineEnding:v.enum(["lf","crlf","auto"]).optional()}).strict(),Vs=v.object({files:v.array(v.string()),linter:Os.optional(),formatter:Vr.optional()}).strict(),qr=v.object({$schema:v.string().optional(),strict:v.boolean().optional(),files:Bs.optional(),resolver:Ps.optional(),models:_s.optional(),linter:Ls.optional(),formatter:Vr.optional(),overrides:v.array(Vs).optional()}).strict();function Xr(e){return e.flatMap(qs)}function qs(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(i=>{let o=Ur([...e.path,String(i)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:o,message:`unknown config field \`${o}\``}});let n=Ur(e.path);return $r(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 Ur(e){return e.map(String).join(".")||void 0}function $r(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(Fr);let r=e.unionErrors;return Array.isArray(r)?r.flatMap(i=>i.issues??[]).some(Fr):!1}function Fr(e){return typeof e=="object"&&e!==null&&$r(e)}function jr(e){let t=qr.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:Xr(t.error.issues)}}function Us(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 Fs(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 Xs(e){return e.map(t=>z(t.code,t.severity==="error"?C.Error:C.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function $s(e){let t=[],n=we(),{$schema:r,strict:i,overrides:o,...s}=e;i&&(n=Fe(n,lr)),n=Fe(n,s),n.overrides=(o??[]).map(u=>({files:u.files,linter:Fs(u.linter),formatter:Us(u.formatter)}));let a=!t.some(u=>u.severity===C.Error);return{config:n,diagnostics:t,ok:a}}function mn(e){let t=jr(e);return t.ok?$s(t.value):{ok:!1,config:we(),diagnostics:Xs(t.diagnostics)}}function js(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 vt(e,t){let n=e.replace(/\\/g,"/"),r=t.startsWith("!"),i=r?t.slice(1):t,s=js(i).test(n);return r?!s:s}function Kr(e,t){return e.overrides.filter(n=>n.files.some(r=>vt(t,r)))}function Ge(e){return e.replaceAll("\\","/")}function Ks(e){try{return decodeURIComponent(e)}catch{return e}}function Ye(e){if(!e.startsWith("file://"))return e;let t;try{t=new URL(e)}catch{return e}let n=Ks(t.pathname);return/^\/[A-Za-z]:/.test(n)?Ge(n.slice(1)):t.host?Ge(`//${t.host}${n}`):Ge(n)}function Rt(e,t){let n=Ge(t);return e.files.ignore.some(r=>vt(n,r))?!1:e.files.include.some(r=>vt(n,r))}function pn(e,t){return Rt(e,Ye(t))}function ht(e,t){let n=Ge(t),r=Kr(e,n),i=e;for(let o of r)i=Fe(i,{linter:o.linter,formatter:o.formatter});return{files:i.files,resolver:i.resolver,models:i.models,linter:i.linter,formatter:i.formatter}}function fn(e,t){return ht(e,Ye(t))}function ce(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 xt(e){if(typeof e=="string")return gt.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&>.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 zr(e,t){if(t)return St(e,t)}function Wr(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Gr(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return z(e.code,C.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function zs(e,t,n,r,i){let o=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:o,typeSource:n.typeSource??Wr(n),validate:r.validate??n.validate,required:r.required??n.required,enum:r.enum?[...r.enum]:n.enum,description:r.description??n.description},u=r.typeRefinement;if(!u)return{...a,type:a.effectiveType};let d=zr(e,u.from),l=zr(e,o);return d&&d!==l?(i.push(Gr({code:"BT119_INVALID_TYPE_REFINEMENT",message:`invalid type refinement for port \`${n.name}\` on node \`${t.id}\``,help:`make \`typeRefinement.from\` match the base port type \`${o??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:o,actualFrom:u.from,to:u.to},notes:o||u.from?[`base type: ${o??"(unspecified)"}`,`requested from: ${u.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:u.to,effectiveType:u.to,typeSource:"model-augmentation",typeRefinement:u}}function Ws(e,t,n,r){let i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of Object.entries(n.ports??{})){let a=i.get(o);if(!a){r.push(Gr({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${o}\` not found on node \`${t.id}\``,help:`change the augmentation to an existing port on \`${t.id}\` or remove the override`,model:t,data:{kind:"augment-port-not-found",nodeId:t.id,portName:o}}));continue}i.set(o,zs(e,t,a,s,r))}return{...t,ports:t.ports.map(o=>i.get(o.name)??o)}}function Gs(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Wr(e)}}function Yr(e,t,n){let r=[],i=new Map([...e.entries()].map(([o,s])=>[o,{...s,ports:s.ports.map(Gs)}]));for(let o of n)for(let[s,a]of Object.entries(o.augment??{})){let u=i.get(s);if(!u){r.push(z("BT117_AUGMENT_TARGET_NOT_FOUND",C.Error,`augmentation target node \`${s}\` not found`,void 0,o.uri??"",{primaryLabel:`augmentation target \`${s}\` does not match any node model`,help:"change the augmentation target to an existing node model or remove it",notes:o.path?[`augmentation file: ${o.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:o.path}));continue}i.set(s,Ws(t,u,a,r))}return{modelsById:i,diagnostics:r}}function Jr(e){return He("builtin",0,!1,e)}function Qr(e){return He("xml-tree-nodes-model",10,!0,e)}function ei(e){return He("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function ti(e){return He("node-definition-file",20,!0,e)}function ni(e){return He("config-inline",30,!0,e)}function He(e,t,n,r){return{kind:e,precedence:t,editable:n,models:r.map(i=>ri(i,e,n&&i.editable!==!1))}}function Ys(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function ri(e,t,n){let r=Ys(t);return{...e,source:r,sourceMeta:e.sourceMeta??{sourceKind:r,file:e.uri,range:e.range},editable:n,ports:e.ports.map(i=>({...i,source:r}))}}function Pe(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 Hr(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 Hs(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(o=>[o.name,o])),i=new Map(t.ports.map(o=>[o.name,o]));for(let[o,s]of r)i.has(o)||n.push({kind:"port-removed",portName:o,sourceIndex:0,port:Hr(s)});for(let[o,s]of i)r.has(o)||n.push({kind:"port-added",portName:o,sourceIndex:1,port:Hr(s)});for(let[o,s]of r){let a=i.get(o);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:o,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:o,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:o,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:o,left:s.defaultValue,right:a.defaultValue});let u=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";u!==d&&n.push({kind:"port-enum",portName:o,left:s.enum?[...s.enum].sort():void 0,right:a.enum?[...a.enum].sort():void 0}),s.description!==a.description&&n.push({kind:"port-description",portName:o,left:s.description,right:a.description})}return n}function Zr(e,t){let n=new Map;for(let r of e){let i=n.get(r.id);if(!i){n.set(r.id,r);continue}if(bt(i,r))continue;let o=cn(i,r),s=Hs(i,r),a;if(o==="port-default"){let u=new Map(i.ports.map(m=>[m.name,m])),d=r.ports.find(m=>{let f=u.get(m.name);return f&&f.defaultValue!==m.defaultValue}),l=d?.name??"unknown",c=[Pe(i,0),Pe(r,1)];a={kind:"port-default-conflict",nodeId:r.id,portName:l,sources:[{source:Pe(i,0),value:u.get(l)?.defaultValue},{source:Pe(r,1),value:d?.defaultValue}]},t.push({id:r.id,definitions:[i,r],sources:c,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${l}\` on node \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${r.id}\` definition or remove the duplicate model`},data:a,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}else{let u=[Pe(i,0),Pe(r,1)];a={kind:"node-model-conflict",nodeId:r.id,sources:u,differences:s},t.push({id:r.id,definitions:[i,r],sources:u,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${r.id}\``,uri:r.uri,range:r.idRange||r.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${r.id}\` model definitions agree, or keep only one definition at the same precedence level`},data:a,relatedInformation:i.uri&&i.range?[{uri:i.uri,range:i.range,message:"previous definition"}]:void 0})}}return n}function Zs(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 ii(e){let t=[],n=new Map,r=new Map,i=[...e].sort((a,u)=>a.precedence-u.precedence),o=new Map,s=new Map;for(let a of i){let u=o.get(a.precedence)??[],d=a.models.map(l=>ri(l,a.kind,a.editable&&l.editable!==!1));u.push(...d),o.set(a.precedence,u);for(let l of d)s.set(l.id,a.precedence)}for(let[a,u]of[...o.entries()].sort((d,l)=>d[0]-l[0])){let d=u.filter(f=>s.get(f.id)===a),l=u.filter(f=>s.get(f.id)!==a),c=Zr(l,[]);for(let[f,x]of Zr(d,t))c.set(f,x);let m=new Set(u.map(f=>f.id));for(let f of m)s.get(f)===a&&n.set(f,u.filter(x=>x.id===f));for(let[f,x]of c)r.set(f,Zs(r.get(f),x))}return{nodeModelsById:n,mergedNodeModelsById:r,conflicts:t}}function Js(e){return ze.includes(e)}function Qs(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:Ae(),augmentations:[]}}function ea(e,t,n){let r=e.get(t)||[];r.push(n),e.set(t,r)}function ta(e,t,n){for(let r of new Set(n))if(Js(r)){for(let i of dn(r))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...ln(r))}}function na(e,t,n,r,i){for(let o of i){let s=nn(o,{uri:o.uri,path:o.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(o.uri,a);for(let u of a.behaviorTrees)ea(e.behaviorTreesById,u.id,u);o.kind==="model-document"?r.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function ra(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 ia(e){let t=new Set,n=[];for(let r of e.genericSubTreePorts){let i=ra(r);t.has(i)||(t.add(i),n.push(r))}e.genericSubTreePorts=n}function oa(e,t,n,r,i){e.modelLayers.push(Jr(t),Qr(n),ei(r)),i.models?.length&&e.modelLayers.push(ti([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function gn(e,t){return sa(e,t)}function sa(e,t){let n=Qs(),r=[],i=[],o=[],s=[];ta(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=Ae(t.augmentations??[]),na(n,r,o,s,e),ia(n),oa(n,i,o,s,t);let a=t.config.models.inline;if(a){let l=[];for(let[c,m]of Object.entries(a))l.push(sn(c,m));n.modelLayers.push(ni(l))}let u=ii(n.modelLayers),d=Yr(u.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=u.nodeModelsById,n.mergedNodeModelsById=d.modelsById,n.modelConflicts=u.conflicts,r.push(...d.diagnostics),{ok:r.every(l=>l.severity!==C.Error),index:n,diagnostics:r}}var oi={unknownSubTreePorts:"allow"};function si(e){return{...oi,...e}}var aa=["Action","Condition","Control","Decorator"],ua=new Set(aa);var da=new Set(["input_port","output_port","inout_port"]);function Ze(e){return ua.has(e)}function Te(e){return Ze(e)?e:void 0}function kt(e,t){return e.attributes.find(n=>n.name===t)?.value}function yn(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&yn(n,t))return!0;return!1}function ai(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return yn(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&yn(n,t))return!0;return!1}function Ct(e){return da.has(e.name)}function ui(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":Ze(e.name)?"generic-node":Ct(e)?"unknown-xml":"concrete-node"}function It(e){if(e.name==="SubTree")return kt(e,"ID")||"SubTree";if(Ze(e.name))return kt(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||Ct(e)))return e.name}function W(e){return e.typeRegistry}function Y(e,t){return Q(W(e),t)}function me(e,t,n){return je(W(e),t,n)}function Je(e,t){return e.documents.get(t)}function ee(e,t){return e.behaviorTreesById.get(t)??[]}function Sn(e,t){return e.behaviorTreesById.has(t)}function bn(e){return[...e.behaviorTreesById.values()].flat()}function Tn(e,t){return di(e).flatMap(n=>n.subtreeReferences.filter(r=>r.id===t))}function Qe(e){return[...e.behaviorTreesById.keys()]}function di(e){return[...e.documents.values()]}function H(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function vn(e,t){return e.modelLayers.flatMap(n=>n.models.filter(r=>r.id===t))}function Dt(e){return[...e.mergedNodeModelsById.values()]}function Rn(e){return e.modelLayers.flatMap(t=>t.models)}function hn(e){return[...e.mergedNodeModelsById.values()]}function xn(e){return[...e.genericSubTreePorts]}function et(e){return[...e.augmentations]}function tt(e){return e.modelConflicts}function nt(e,t){let{id:n,fileLocalUri:r,config:i}=t,o=ee(e,n);if(o.length>0){if((i?.resolver?.behaviorTreeIds==="file-local-first"||i?.resolver?.behaviorTreeIds==="allow-ambiguous")&&r){let d=o.filter(l=>l.uri===r);d.length>0&&(o=d)}let a=H(e,n),u=a?.kind==="SubTree"?[a]:[];return o.length===1?{status:"resolved",kind:"behavior-tree",treeId:o[0].id,behaviorTree:o[0]}:{status:"ambiguous",candidates:[...o.map(d=>d.id),...u.map(d=>d.id)],behaviorTrees:o,definitions:u}}let s=H(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function kn(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=H(e,t);if(n){let i=tt(e).find(o=>o.id===t&&o.code==="BT012_CONFLICTING_NODE_MODEL");return i?{status:"ambiguous",nodeType:t,candidates:i.definitions}:{status:"resolved",model:n}}let r=vn(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 Cn(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function In(e){let t=xn(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return Cn([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Dn(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}:rn(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=si(t.policy),r=t.element,i=ui(r),o=ai(t.documentRoot,r);if((t.isModelDefinition||o&&(i==="generic-node"||i==="subtree"))&&(i="model-definition"),o&&Ct(r)&&(i="unknown-xml"),i==="root"||i==="behavior-tree"||i==="tree-nodes-model"||i==="include"||i==="model-definition"||i==="unknown-xml")return{element:r,tagName:r.name,tagForm:i,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=It(r);if(i!=="subtree"){let f=kn(e,s),x=In({index:e,tagForm:i,model:f}),T=r.attributes.map(D=>Dn({attribute:D,ports:x,allowsArbitraryAttributes:!1,model:f}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:f,ports:x,allowsArbitraryAttributes:!1,portUsages:T}}let a=kt(r,"ID"),u=a?nt(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},d={status:"unresolved",nodeType:a},l=!1;if(u.status==="resolved"&&u.kind==="node-model")d={status:"resolved",model:u.model};else if(u.status==="resolved"&&u.kind==="behavior-tree"){let f=kn(e,u.treeId);f.status==="resolved"&&f.model.kind==="SubTree"?d=f:l=n.unknownSubTreePorts==="allow"}else u.status==="ambiguous"&&u.definitions.length>0?d=u.definitions.length===1?{status:"resolved",model:u.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:u.definitions}:l=n.unknownSubTreePorts==="allow";let c=In({index:e,tagForm:i,model:d,subtreeModelPorts:u.status==="ambiguous"?Cn(u.definitions.flatMap(f=>f.ports)):void 0}),m=r.attributes.map(f=>Dn({attribute:f,ports:c,allowsArbitraryAttributes:l,model:d,unknownModelPortStatus:!l&&d.status!=="resolved"?"undeclared":void 0}));return{element:r,tagName:r.name,tagForm:i,nodeType:s,model:d,subtree:{id:a,target:u},ports:c,allowsArbitraryAttributes:l,portUsages:m}}function se(e,t){return L(e,t).portUsages.find(r=>r.name===t.attributeName)}function ma(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function pa(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function li(e,t){let n=e.line,r=e.character,i=e.offset;for(let o of t){if(i+=o.length,o===`
|
|
4
|
-
`){n+=1,r=0;continue}r+=o.length}return{line:n,character:r,offset:i}}function fa(e,t,n){let r=li(e,t),i=li(r,n);return{start:r,end:i}}function mi(e,t){let n=t.valueContentRange||t.valueRange,r=e.originalText.slice(n.start.offset,n.end.offset),i=[];for(let o of r.matchAll(/\{([^}]+)\}/g)){let s=o[0],a=o[1],u=o.index??0;i.push({raw:s,key:a,range:fa(n.start,r.slice(0,u),s),syntax:"braced"})}return i.length===0&&(r.includes("{")||r.includes("}"))&&i.push({raw:r,key:r,range:n,syntax:"invalid"}),i}function ga(e,t){return ma(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function pi(e){let t=[];for(let n of e)t.push(n),t.push(...pi(n.children));return t}function ya(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function Sa(e){let t=new Map(e.map((n,r)=>[n,r]));return n=>`bt:${t.get(n.behaviorTree)??0}/node:${n.path.join(".")}`}function ba(e){return{name:e.name,value:e.value,range:e.range,nameRange:e.nameRange,valueRange:e.valueContentRange||e.valueRange}}function fi(e){return pe(e,"name")?.value}function Ta(e){return fi(e)||pe(e,"ID")?.value||e.name}function va(e){let t=[],n=e;for(;n;){let r=n.path.at(-1)??0;t.unshift(`${r}:${Ta(n.element)}`),n=n.parent}return[e.behaviorTree.id||"<anonymous>",...t].join("/")}function gi(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 yi(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 Ra(e){return e.status==="resolved"?e.port.direction:"unknown"}function ha(e,t){return e===""?"empty":e==="{=}"?"substitution":t.some(n=>n.syntax==="braced")?"blackboard-reference":t.some(n=>n.syntax==="invalid")?"unknown":"literal"}function ci(e,t){return{nodeId:e,portName:t.name,rawValue:t.value,direction:Ra(t.usage),valueKind:ha(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 xa(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 pe(e,t){return e.attributes.find(n=>n.name===t)}function ka(e){return e.root?pe(e.root,"main_tree_to_execute")?.value:void 0}function Ca(e){let t=new Set;if(!e)return t;let n=r=>{t.add(r);for(let i of r.children)i.kind==="element"&&n(i)};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 ve(e,t){let n=t.semantic,r=Ca(e.root),i=pa(e).map(u=>({id:pe(u,"ID")?.value,element:u,rootNode:void 0,nodes:[]})),o=[],s=[],a=(u,d,l,c)=>{let m=L(n,{element:u,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:r.has(u)}),f=gi(m),x={element:u,path:c,tagName:u.name,kind:ga(u,m),model:f,usage:m,portBindings:[],children:[],parent:l,behaviorTree:d};if(x.portBindings=m.portUsages.filter(T=>T.status!=="reserved-attribute").map(T=>({name:T.name,value:T.value,attribute:T.attribute,declaredPort:yi(T),usage:T,blackboardReferences:mi(e,T.attribute)})),x.children=u.children.filter(T=>T.kind==="element").map((T,D)=>a(T,d,x,[...c,D])),u.name==="SubTree"){let T=pe(u,"ID")?.value;o.push({node:x,id:T,target:m.subtree?.target??{status:"unresolved",id:T},portRemaps:x.portBindings})}return x};for(let u of i){let d=u.element.children.filter(l=>l.kind==="element").map((l,c)=>a(l,u,void 0,[c]));u.rootNode=d[0],u.nodes=pi(d),s.push(...u.nodes)}return{document:e,behaviorTrees:i,subtreeCalls:o,nodes:s}}function Et(e,t,n){let r=ve(e,{semantic:t,config:n?.config,policy:n?.policy}),i=Sa(r.behaviorTrees),o=r.nodes.map(d=>{let l=i(d),c=d.usage,m=c.nodeType??d.tagName,f=fi(d.element),x=pe(d.element,"ID")?.value,T=va(d);return{nodeId:l,path:d.path,instancePath:T,tagName:d.tagName,nodeType:m,name:f,idAttr:x,kind:d.kind,range:d.element.range,fullRange:d.element.fullRange,nameRange:d.element.nameRange,parentNodeId:d.parent?i(d.parent):void 0,childNodeIds:d.children.map(i),behaviorTreeId:d.behaviorTree.id,attributes:d.element.attributes.map(ba),identityCandidates:xa({name:f,idAttr:x,nodeType:m,tagName:d.tagName,instancePath:T,behaviorTreeId:d.behaviorTree.id,nodeId:l}),model:gi(c),usage:c,portBindings:c.portUsages.filter(D=>D.status!=="reserved-attribute").map(D=>ci(l,{name:D.name,value:D.value,attribute:D.attribute,declaredPort:yi(D),usage:D,blackboardReferences:mi(e,D.attribute)}))}}),s=r.behaviorTrees.map(d=>({id:d.id,range:d.element.range,idRange:pe(d.element,"ID")?.valueContentRange,rootNodeId:d.rootNode?i(d.rootNode):void 0,nodeIds:d.nodes.map(i)})),a=r.subtreeCalls.map(d=>({nodeId:i(d.node),callId:d.id,range:d.node.element.range,target:d.target,portBindings:d.portRemaps.map(l=>ci(i(d.node),l))})),u=e.root?pe(e.root,"main_tree_to_execute"):void 0;return{uri:e.uri,kind:ya(e),mainTreeToExecute:ka(e),mainTreeToExecuteRange:u?.valueContentRange||u?.valueRange,behaviorTrees:s,nodes:o,subtreeCalls:a}}function Ia(e,t){let n=e.element.fullRange||e.element.range;return F(n,t)}function Da(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 Nt(e,t){let n;for(let r of e.nodes)Ia(r,t.offset)&&(!n||Da(r,n))&&(n=r);return n}function _e(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(F(r.attribute.range,t.offset))return r}function Ea(e,t){return F(e.fullRange||e.range,t)}function Na(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 Bt(e,t){let n;for(let r of e.nodes)Ea(r,t.offset)&&(!n||Na(r,n))&&(n=r);return n}function wt(e,t){for(let n of e.nodes)for(let r of n.portBindings)if(F(r.range,t.offset))return r}function Si(e){let{document:t,diagnostics:n,options:r,partial:i}=e,o=n.some(a=>a.severity===C.Error),s="generic-xml";if(o)s="invalid-xml";else if(t.root){let a=t.root,u=a.children.some(m=>m.kind==="element"&&m.name==="BehaviorTree"),d=a.children.some(m=>m.kind==="element"&&m.name==="TreeNodesModel"),l=a.attributes.some(m=>m.name==="BTCPP_format"&&m.value==="4"),c=a.name==="TreeNodesModel"||a.name==="root"&&!u&&d;r.kind==="model-xml"||c?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(l||u)||r.kind==="bt-xml")&&(s="bt-document")}return t.kind=s,t.isBtXml=s==="bt-document"||s==="model-document",!o&&!i?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:i}}function Va(e){if(e.name==="input_port"||e.name==="output_port")return!1;let t=e.children||[],n=t.some(i=>i.kind==="text"&&i.text.trim()!==""),r=t.some(i=>i.kind==="element");return n&&r}function En(e,t){if(e.kind==="element"){Va(e)&&t(e);for(let n of e.children||[])En(n,t)}}function V(e,t){let n=0,r=0;for(let i=0;i<Math.min(t,e.length);i++)e[i]===`
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
`?(s+=1,a=0):a+=1}function x(){for(;!c()&&Xa(m());)f()}let T=(g,B,M,A,h,j)=>{n.push(z(g,B,M,R(A,h),i.uri,j))};function D(g,B,M,A,h,j){n.push(z(g,B,M,A&&h?R(A,h):void 0,i.uri,j))}function N(){if(!Ua(m()))return"";let g=o;for(f();!c()&&Fa(m());)f();return e.slice(g,o)}function E(){let g=m();if(g!=='"'&&g!=="'")return{value:"",ok:!1};let B=l();f();let M=l(),A=o;for(;!c()&&m()!==g&&m()!=="<";)f();let h=l();if(c()||m()!==g)return{value:e.slice(A,o),ok:!1,valueRange:R(B,h),valueContentRange:R(M,h)};let j=e.slice(A,o);f(),Nn(j,M.offset,e,T);let de=bi(j);return{value:de.value,valueOffsets:de.offsets,ok:!0,valueRange:R(B,l()),valueContentRange:R(M,h)}}function P(){let g=[],B=new Set;for(;;){x();let M=m();if(!M||M===">"||M==="/"&&m(1)===">")break;let A=l(),h=N(),j=l();if(!h)break;x();let de=l();if(m()!=="="){if(T("XML001_INVALID_SYNTAX",C.Error,"invalid attribute syntax",A,j,{primaryLabel:`expected \`=\` after attribute \`${h}\``,help:`write the attribute as \`${h}="..."\``}),d=!0,r)continue;break}f();let Ho=l();x();let Qt=l(),be=E(),Be=l();if(!be.ok&&(T("XML005_INVALID_ATTRIBUTE_VALUE",C.Error,"invalid attribute value",Qt,Be,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${h}="value"\``}),d=!0,!r)||(B.has(h)?T("XML004_DUPLICATE_ATTRIBUTE",C.Error,`duplicate attribute \`${h}\``,A,Be,{primaryLabel:`attribute \`${h}\` is already defined on this element`,help:`remove one of the duplicate \`${h}\` attributes`}):B.add(h),g.push({name:h,value:be.value,...be.valueOffsets?{valueOffsets:be.valueOffsets}:{},range:R(A,Be),fullRange:R(A,Be),nameRange:R(A,j),equalsRange:R(de,Ho),valueRange:be.valueRange||R(Qt,Be),valueContentRange:be.valueContentRange||R(Qt,Be)}),!be.ok&&r))break}return g}function p(g){u.length>0?u[u.length-1].children.push(g):(i.nodes.push(g),!i.root&&g.kind==="element"&&(i.root=g))}function y(){let g=l(),B=o;for(;!c()&&m()!=="<";)f();let M=e.slice(B,o);if(M.length===0)return;for(let h of M)if($a(h)){T("XML007_INVALID_CHARACTER",C.Error,"invalid XML character",g,l(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}Nn(M,B,e,T);let A={kind:"text",text:rt(M),range:R(g,l()),fullRange:R(g,l())};p(A)}function b(){let g=l();f(4);let B=l(),M=o;for(;!c()&&!(m()==="-"&&m(1)==="-"&&m(2)===">");)f();let A=e.slice(M,o);if(c()){if(T("XML001_INVALID_SYNTAX",C.Error,"unterminated XML comment",g,l(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),d=!0,!r)return;let de={kind:"comment",text:A,range:R(g,l()),fullRange:R(g,l()),contentRange:R(B,l())};p(de);return}(A.includes("--")||A.endsWith("-"))&&T("XML001_INVALID_SYNTAX",C.Error,"invalid XML comment",B,l(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let h=l();f(3);let j={kind:"comment",text:A,range:R(g,l()),fullRange:R(g,l()),contentRange:R(B,h)};p(j)}function k(){let g=l();f(5),x();let B=P();x(),m()==="?"&&m(1)===">"?f(2):T("XML001_INVALID_SYNTAX",C.Error,"invalid XML declaration",g,l(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let M={range:R(g,l()),attributes:B};for(let A of B)A.name==="version"&&(M.version=A.value),A.name==="encoding"&&(M.encoding=A.value),A.name==="standalone"&&(M.standalone=A.value);i.xmlDeclaration=M}function w(){let g=l();f(2),x();let B=l(),M=N(),A=l();if(x(),m()!==">")for(T("XML001_INVALID_SYNTAX",C.Error,"invalid closing tag syntax",g,l(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),d=!0;!c()&&m()!==">";)f();m()===">"&&f();let h=u.pop();if(!h||h.name!==M){let j=h?h.name:M||"",de=M||"";T("XML006_MISSING_CLOSING_TAG",C.Error,`mismatched closing tag \`</${de}>\``,g,l(),{primaryLabel:`opened as \`<${j}>\` but closed as \`</${de}>\``,help:`change the closing tag to \`</${j}>\` or fix the nesting`});return}h.closeTagRange=R(g,l()),h.endTagRange=R(g,l()),h.nameRange||(h.nameRange=R(B,A)),h.range=R(h.range.start,l()),h.fullRange=R(h.range.start,l())}for(;!c();)if(m()==="<")if(m(1)==="?")if(e.slice(o,o+5).toLowerCase()==="<?xml"&&e.charAt(o+5)===" ")k();else{let g=l();for(;!c()&&!(m()==="?"&&m(1)===">");)f();c()||f(2),T("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",C.Error,"processing instruction is not supported",g,l(),{primaryLabel:"only the XML declaration is supported",help:"remove this processing instruction"})}else if(m(1)==="!"&&m(2)==="-"&&m(3)==="-")b();else if(m(1)==="!"&&m(2)==="["&&e.slice(o+3,o+9)==="CDATA["){let g=l();for(f(8);!c()&&!(m()==="]"&&m(1)==="]"&&m(2)===">");)f();c()||f(3),T("XML010_UNSUPPORTED_CDATA",C.Error,"CDATA is not supported",g,l(),{primaryLabel:"CDATA sections are not supported by btxml",help:"replace the CDATA section with normal escaped XML text",notes:["escape `<` as `<`, `>` as `>`, and `&` as `&`"]})}else if(m(1)==="!"&&e.slice(o+2,o+9)==="DOCTYPE"){let g=l();for(f(8);!c()&&m()!==">";)f();c()||f(1),T("XML011_UNSUPPORTED_DOCTYPE",C.Error,"DOCTYPE is not supported",g,l(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(m(1)==="/")w();else{let g=l();f();let B=l(),M=N(),A=l();if(!M){if(T("XML001_INVALID_SYNTAX",C.Error,"invalid XML tag",g,l(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),d=!0,r){f();continue}break}let h={kind:"element",name:M,attributes:[],children:[],range:R(g,g),fullRange:R(g,g),openTagRange:R(g,g),startTagRange:R(g,g),nameRange:R(B,A),selfClosing:!1};if(h.attributes=P(),x(),m()==="/"&&m(1)===">"){f(2),h.selfClosing=!0,h.openTagRange=R(g,l()),h.startTagRange=h.openTagRange,h.range=R(g,l()),h.fullRange=R(g,l()),p(h);continue}if(m()!==">"){if(T("XML001_INVALID_SYNTAX",C.Error,"invalid XML tag",g,l(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),d=!0,r){h.openTagRange=R(g,l()),h.startTagRange=h.openTagRange,h.range=R(g,l()),h.fullRange=R(g,l()),p(h);continue}break}f(),h.openTagRange=R(g,l()),h.startTagRange=h.openTagRange,h.range=R(g,l()),h.fullRange=R(g,l()),p(h),u.push(h)}else y();if(u.length>0){let g=u[u.length-1];if(T("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`}),d=!0,r)for(;u.length>0;){let B=u.pop();if(!B)break;B.range=R(B.range.start,l()),B.fullRange=R(B.range.start,l())}}let _=i.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 $=i.root;if($)for(let g of i.nodes)g!==$&&g.kind==="text"&&g.text.trim().length>0&&T("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(!i.xmlDeclaration)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(i.xmlDeclaration.encoding&&i.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let g=i.xmlDeclaration.encoding;T("XML009_INVALID_ENCODING",C.Warning,"XML encoding should be UTF-8",i.xmlDeclaration.range.start,i.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${g}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return $&&En($,g=>{T("XML015_UNSUPPORTED_MIXED_CONTENT",C.Warning,"mixed XML content is not supported",Ti(g.range.start),Ti(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"]})}),Si({document:i,diagnostics:n,partial:d,options:t})}var ot={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function vi(e){if(!e)return ot;let t=typeof e.indentWidth=="number"?e.indentWidth:ot.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:ot.xmlDeclaration,r=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:ot.blankLineBetweenBehaviorTrees,i=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:ot.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:r,lineEnding:i}}function Mt(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function At(e){return Mt(e).replace(/"/g,""")}function ja(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Ka(e,t,n){return`${" ".repeat(e*n)}${t}`}function Le(e,t,n,r){let i=" ".repeat(t*r),o=e.attributes||[];if(o.length===0)return[`${i}<${e.name}${n}`];if(o.length===1)return[`${i}<${e.name} ${o[0].name}="${At(o[0].value)}"${n}`];let s=[`${i}<${e.name} ${o[0].name}="${At(o[0].value)}"`],a=" ".repeat(i.length+1+e.name.length+1);for(let u=1;u<o.length;u+=1){let d=o[u],l=u===o.length-1?n:"";s.push(`${a}${d.name}="${At(d.value)}"${l}`)}return s}function Pt(e,t,n,r){let i=" ".repeat(t*n);if(e.kind==="comment")return[`${i}<!--${e.text}-->`];if(e.kind==="text"){let l=e.text.trim();return l?[Ka(t,Mt(l),n)]:[]}let o=ja(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(l=>l.kind==="text").map(l=>l.text).join("").trim(),u=o.some(l=>l.kind==="element"||l.kind==="comment");if(a&&u&&!s&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!u){if((e.attributes||[]).length<=1){let l=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${At(e.attributes[0].value)}"`;return[`${i}<${e.name}${l}>${Mt(a)}</${e.name}>`]}return Le(e,t,`>${Mt(a)}</${e.name}>`,n)}if(o.length===0){if(e.selfClosing)return Le(e,t,"/>".slice(0),n);let l=Le(e,t,">",n);return l.push(`${i}</${e.name}>`),l}let d=Le(e,t,">",n);for(let l of e.children||[])l.kind==="text"&&l.text.trim()===""||d.push(...Pt(l,t+1,n,r));return d.push(`${i}</${e.name}>`),d}function za(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Ri(e,t,n,r){let i=[],o=za(e);for(let s=0;s<o.length;s+=1){let a=o[s],u=o[s-1],d=o[s+1],l=n&&a.kind==="element"&&a.name==="BehaviorTree"&&u&&u.kind==="element"&&u.name==="BehaviorTree",c=a.kind==="element"&&a.name==="TreeNodesModel"&&u!==void 0&&u.kind!=="comment",m=a.kind==="comment"&&d&&d.kind==="element"&&d.name==="TreeNodesModel"&&u!==void 0;(l||c||m)&&i.length>0&&i[i.length-1]!==""&&i.push(""),a.kind==="element"?(i.push(...Pt(a,1,t,r)),a.name==="TreeNodesModel"&&i.push("")):i.push(...Pt(a,1,t,r))}return i}function st(e,t={}){let n=it(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(T=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(T.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let i=n.document.root,o=vi(t),s=o.indentWidth,a=[],u=n.document.xmlDeclaration!==void 0;if((o.xmlDeclaration==="always"||o.xmlDeclaration==="preserve"&&u)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...Le(i,0,">",s)),a.push(...Ri(i.children||[],s,o.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${i.name}>`),n.diagnostics.some(T=>T.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let d=`
|
|
9
|
-
`;(o.lineEnding==="crlf"||o.lineEnding==="auto"&&e.includes(`\r
|
|
10
|
-
|
|
11
|
-
`);let l=a.join(d),c=d.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),m=new RegExp(`(?:${c})+$`,"u"),x=`${l.replace(m,"")}${d}`;return{ok:!0,text:x,changed:x!==e,skipped:!1,diagnostics:n.diagnostics.filter(T=>T.severity!==C.Error)}}function Oe(e,t){if(!(!F(e.range,t)&&!F(e.fullRange,t))){for(let n of e.children){if(n.kind!=="element")continue;let r=Oe(n,t);if(r)return r}return e}}var xi=/^[A-Za-z_:][A-Za-z0-9_.:-]*/,Wa=/([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*("([^"]*)"|'([^']*)')/gs;function Ga(e,t){let n=[],r=0;for(;r<t;){let i=e.indexOf("<",r);if(i<0||i>=t)break;if(e.startsWith("<!--",i)){let d=e.indexOf("-->",i+4);if(d<0||d+3>t)break;r=d+3;continue}if(e.startsWith("<![CDATA[",i)){let d=e.indexOf("]]>",i+9);if(d<0||d+3>t)break;r=d+3;continue}if(e.startsWith("<?",i)){let d=e.indexOf("?>",i+2);if(d<0||d+2>t)break;r=d+2;continue}if(e.startsWith("<!",i)){let d=e.indexOf(">",i+2);if(d<0||d+1>t)break;r=d+1;continue}if(e[i+1]==="/"){let l=e.slice(i+2).match(xi)?.[0];if(l){for(let m=n.length-1;m>=0;m-=1)if(n[m]===l){n.length=m;break}}let c=e.indexOf(">",i+2);if(c<0||c>=t)break;r=c+1;continue}let s=e.slice(i+1).match(/^\s*([A-Za-z_:][A-Za-z0-9_.:-]*)/)?.[1];if(!s){r=i+1;continue}let a=e.indexOf(">",i+1);if(a<0||a>=t)break;e.slice(i+1,a).trimEnd().endsWith("/")||n.push(s),r=a+1}return n.at(-1)}function _t(e,t){let n=e.positionAt(t);return R(n,n)}function Z(e,t,n){return R(e.positionAt(t),e.positionAt(n))}function Lt(e){return{name:e.name,value:e.value,range:Z(e.document,e.nameStart,e.valueEnd),fullRange:Z(e.document,e.nameStart,e.valueEnd),nameRange:Z(e.document,e.nameStart,e.nameEnd),equalsRange:e.equalsStart!==void 0&&e.equalsEnd!==void 0?Z(e.document,e.equalsStart,e.equalsEnd):void 0,valueRange:Z(e.document,e.valueStart,e.valueEnd),valueContentRange:e.valueContentStart!==void 0&&e.valueContentEnd!==void 0?Z(e.document,e.valueContentStart,e.valueContentEnd):void 0}}function Ya(e,t,n){let r=[];for(let i of t.matchAll(Wa)){let o=i.index??0,s=i[1],a=i[2],u=i[3],d=i[4],l=i[0].indexOf(s),c=i[0].indexOf("=",l+s.length),m=i[0].indexOf(a,c+1),f=n+o+m,x=f+a.length;r.push(Lt({document:e,name:s,value:u??d??"",nameStart:n+o+l,nameEnd:n+o+l+s.length,equalsStart:n+o+c,equalsEnd:n+o+c+1,valueStart:f,valueEnd:x,valueContentStart:f+1,valueContentEnd:x-1}))}return r}function Ha(e,t){let n=Math.max(0,t-4e3),r=e.text.slice(n,t),i=r.lastIndexOf("<"),o=r.lastIndexOf(">");if(i<0||i<o||!r.startsWith("</",i))return;let s=n+i,a=r.slice(i+2);if(!/\s/.test(a))return{kind:"closing-tag-name",tagNamePrefix:a,replacementRange:Z(e,s+2,t)}}function hi(e,t){let n=Math.max(0,t-4e3),r=e.text.slice(n,t),i=r.lastIndexOf("<"),o=r.lastIndexOf(">");if(i<0||i<o)return;let s=n+i,a=s+1,u=r.slice(i+1);if(/^\s*[!?/]/.test(u))return;let d=u.match(/^\s*/)?.[0].length??0,l=u.slice(d).match(xi);if(!l)return{kind:"tag-name"};let c=l[0],m=d,f=m+c.length,x=Z(e,a+m,a+f),T={kind:"element",name:c,attributes:Ya(e,u,a),children:[],range:Z(e,s,t),fullRange:Z(e,s,t),openTagRange:Z(e,s,t),startTagRange:Z(e,s,t),nameRange:x,selfClosing:!1};if(u.length<=f&&!/\s/.test(u.slice(f)))return{kind:"tag-name",element:T,replacementRange:x};let D=u.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)\s*=\s*(?:(['"])([^"']*)|([^\s>"']*))?$/s);if(D){let P=D[0].indexOf(D[1]),p=(D.index??0)+P,y=p+D[1].length,b=u.indexOf("=",y),k=D[2],w=D[4]??"";if(k){let $=u.indexOf(k,b+1),g=a+$+1,B=Lt({document:e,name:D[1],value:D[3]??"",nameStart:a+p,nameEnd:a+y,equalsStart:a+b,equalsEnd:a+b+1,valueStart:a+$,valueEnd:t,valueContentStart:g,valueContentEnd:t});return{kind:"attribute-value",element:T,attribute:B,valuePrefix:e.text.slice(g,t)}}let _=w.length>0?t-a-w.length:t-a;return{kind:"attribute-value",element:T,attribute:Lt({document:e,name:D[1],value:w,nameStart:a+p,nameEnd:a+y,equalsStart:a+b,equalsEnd:a+b+1,valueStart:a+_,valueEnd:t,valueContentStart:a+_,valueContentEnd:t}),valuePrefix:e.text.slice(a+_,t)}}let N=u.match(/(?:^|\s)([A-Za-z_:][A-Za-z0-9_.:-]*)?$/s);if(N){let E=N[1]??"",P=t-a-E.length;return{kind:"attribute-name",element:T,attribute:Lt({document:e,name:E,value:"",nameStart:a+P,nameEnd:t,valueStart:t,valueEnd:t})}}return{kind:"attribute-name",element:T,attribute:{name:"",value:"",range:_t(e,t),fullRange:_t(e,t),nameRange:_t(e,t),valueRange:_t(e,t)}}}function G(e){let{document:t,parsed:n,position:r}=e,i=r.offset,o=t.text.length>0?{kind:"text"}:{kind:"unknown"},s=Ha(t,i);if(s)return{kind:"closing-tag-name",tagNamePrefix:s.tagNamePrefix,replacementRange:s.replacementRange,tagText:Ga(t.text,i)};if(n?.root){let d=Oe(n.root,i);if(d){for(let l of d.attributes){if(F(l.nameRange,i))return{kind:"attribute-name",element:d,attribute:l};if(F(l.valueRange,i)||F(l.valueContentRange,i))return{kind:"attribute-value",element:d,attribute:l,valuePrefix:l.valueContentRange&&i>=l.valueContentRange.start.offset?t.text.slice(l.valueContentRange.start.offset,i):""}}if(F(d.nameRange||d.openTagRange,i))return{kind:"tag-name",element:d,replacementRange:d.nameRange};if(F(d.openTagRange,i)){let l=hi(t,i);if(l)return l.kind==="tag-name"?{...l,element:l.element??d}:l}o={kind:"element",element:d}}}let a=hi(t,i);if(a)return a;let u=t.text.slice(Math.max(0,i-200),i);return/<!--\s*btxml-disable-next-line\s+[A-Z0-9_]*$/.test(u)?{kind:"comment"}:o}function Ot(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 fe(e,t,n){let r=t.valueContentRange??t.valueRange,i=Ot(t,n.start),o=Ot(t,n.end),s=V(e.originalText,r.start.offset+i),a=V(e.originalText,r.start.offset+o);return R(s,a)}function ki(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Ci(e,t){return e.includeIssuesByUri.get(t)??[]}function Ii(e,t){return e.suppressionIssuesByUri.get(t)??[]}function Di(e){let{document:t,semantic:n,config:r,view:i}=e,o=new Map(i.nodes.map(d=>[d.element,d])),s=new Map(i.subtreeCalls.map(d=>[d.node.element,d])),a=ce(r),u=Za(t.root);return{document:t,view:i,semantic:n,config:r,options:e.options,facts:e.facts,report(d){let l=z(d.code??e.code,e.severity,d.message,d.range,t.uri,d.details,d.data);e.diagnostics.push({...l,rule:e.rule,...d.relatedInformation?{relatedInformation:d.relatedInformation}:{}})},getIncludeIssues(d){let l=Ci(e.facts,t.uri);return d?l.filter(c=>c.kind===d):l},getSuppressionIssues(d){let l=Ii(e.facts,t.uri);return d?l.filter(c=>c.kind===d):l},getNodeUsage(d){return L(n,{element:d,documentRoot:t.root,uri:t.uri,config:r,policy:a,isModelDefinition:u.has(d)})},getPortUsage(d,l){return se(n,{element:d,documentRoot:t.root,attributeName:l,uri:t.uri,config:r,policy:a,isModelDefinition:u.has(d)})},resolveSubTree(d,l){return nt(n,{id:d,fileLocalUri:l,config:r})},getNodeModel(d){return H(n,d)},getBehaviorTrees(d){return ee(n,d)},getTreeNodeView(d){return o.get(d)},getSubTreeCallView(d){return s.get(d)}}}function Za(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return Bn(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||Bn(n,t);return t}function Bn(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&Bn(n,t)}function I(e){let t=dr[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Ja={"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 ge(e){return I({name:Ja[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Qa(n)})}}}})}function Qa(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 Ei=[ge("missing-path"),ge("not-found"),ge("cycle"),ge("outside-root"),ge("unresolved-variable"),ge("depth-exceeded"),ge("too-many-files"),ge("external-used")];import eu from"ajv";var tu=eu,nu=new tu,ru=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],iu={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}},wn=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"]),Ni=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 Bi(e){return e.children.filter(t=>t.kind==="element")}function te(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function wi(e){return e.children.some(t=>t.kind==="element")}function qt(e,t){let n=Mi(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function Mi(e){let t=K(e.port.name,e.value);if(e.allowRemap&&t!==void 0)return;if(!e.allowRemap&&t!==void 0||e.port.enum&&!e.port.enum.includes(e.value))return Vt(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return du(e.registry,n,e.value)?void 0:Vt(e.diagnosticCode,e.value,e.portLabel);let r=e.typeDefinition?.canonical??e.port.type;if(r&&!Pi(r,e.value))return ou(r)?Vt(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 Ve(e){return e.effectiveType??e.type}function Ai(e,t){return Q(e,Ve(t))}function Mn(e,t){return K(e,t)}function Vt(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function ou(e){let t=$e(e)??e;return _i(e)!==void 0||lu.has(t.toLowerCase())}function Pi(e,t){let n=_i(e);if(n)return su(n,t);let r=($e(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 ru.includes(t);default:return wn.has(r)||Ni.has(r)?Li(r,t):!1}}function _i(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function su(e,t){let n=uu(t);return n?n.every(r=>au(e,r)):!1}function au(e,t){if(t.kind==="string")return Pi(e,t.value);let n=($e(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 wn.has(n)||Ni.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&Li(n,String(t.value)):!1}}function Li(e,t){let n=iu[e];if(!n)return!1;if(wn.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 uu(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 du(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((i,o)=>{let s=t.items[o];return s?Mi({port:{name:`tuple[${o}]`,type:s},value:i,registry:e,typeDefinition:Q(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${o}]`})===void 0:!1})}case"json-schema":try{let r=JSON.parse(n);return nu.compile(t.schema)(r)===!0}catch{return!1}}}var lu=new Set(["std::string","string","bool","int8_t","std::int8_t","int16_t","std::int16_t","int","int32","int32_t","std::int32_t","int64_t","int64","std::int64_t","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint","uint32","uint32_t","std::uint32_t","uint64_t","uint64","std::uint64_t","size_t","std::size_t","unsigned","unsigned int","float","double","bt::nodestatus","nodestatus","bt::any","bt::anytypeallowed","bt::anytype","any"]);var Oi=[I({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})}}}}),I({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))}}}}),I({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=on(n.name);r&&e.report({code:S.InvalidPortName,message:`invalid port name \`${n.name}\`: ${r}`,range:n.nameRange||n.range||t.idRange||t.range,details:{primaryLabel:`invalid port name \`${n.name}\``,help:"rename the port to a non-reserved XML attribute name without forbidden characters"}})}}}}}),I({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of tt(e.semantic))t.uri&&t.uri!==e.document.uri||cu(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),I({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!mu(t))return;let n=t.attributes.find(u=>u.name==="default")??t.attributes.find(u=>u.name==="default_value");if(!n)return;let r=t.attributes.find(u=>u.name==="name")?.value;if(!r)return;let o=pu(e.document.root,t)?.attributes.find(u=>u.name==="ID")?.value;if(!o)return;let a=e.getNodeModel(o)?.ports.find(u=>u.name===r);if(a){if(a.direction==="output"){K(a.name,n.value)===void 0&&e.report({code:S.InvalidPortDefaultValue,message:`output port default for \`${a.name}\` must be a blackboard remap`,range:n.range,details:{primaryLabel:`output port default for \`${a.name}\` must be a blackboard remap`,help:`use \`${a.name}="{${a.name}}"\` or \`${a.name}="{=}"\``}});return}qt(e,{port:a,value:n.value,range:n.range,registry:W(e.semantic),typeDefinition:Y(e.semantic,a.type),allowRemap:!0,diagnosticCode:S.InvalidPortDefaultValue,customLiteralDiagnosticCode:S.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),I({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=W(e.semantic),n=new Map,r=e.options.allowStringEntryCompatibility??!0;for(let i of e.view.nodes)for(let o of i.portBindings){if(o.declaredPort.status!=="resolved")continue;let s=Mn(o.name,o.value);if(!s)continue;let a=Ai(t,o.declaredPort.port);if(!a||a.kind==="any")continue;let u=n.get(s)??[];u.push({key:s,nodeId:yu(i.element),port:o.declaredPort.port,typeDefinition:a,range:o.attribute.range}),n.set(s,u)}for(let[i,o]of n){let s=fu(e.semantic,o,r);if(s.length<2)continue;let a=o.find(u=>u.typeDefinition.canonical===s[0]);e.report({code:S.BlackboardTypeMismatch,message:`blackboard entry \`${i}\` is used with incompatible port types: ${s.map(u=>`\`${u}\``).join(", ")}`,range:a?.range,details:{primaryLabel:`blackboard entry \`${i}\` mixes incompatible port types`,notes:o.filter(u=>s.includes(u.typeDefinition.canonical)).map(u=>`${u.nodeId}.${u.port.name} declares ${gu(u.port,u.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),I({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Su(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let i=e.getPortUsage(t,r.name);i?.status==="resolved"&&i.port.direction==="output"&&Mn(i.port.name,r.value)===void 0&&e.report({code:S.OutputPortRequiresRemap,message:`output port \`${i.port.name}\` must be remapped to a blackboard entry`,range:r.range,details:{primaryLabel:`output port \`${i.port.name}\` requires a blackboard remap`,help:`use \`${i.port.name}="{${i.port.name}}"\` or \`${i.port.name}="{some_key}"\``}})}}}}})];function cu(e,t){return e.diagnostics.some(n=>n.code===S.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function mu(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function pu(e,t){if(!e)return;return n(e,!1,void 0);function n(r,i,o){let s=i||r.name==="TreeNodesModel",a=s&&(r.name==="Action"||r.name==="Condition"||r.name==="Control"||r.name==="Decorator"||r.name==="SubTree")?r:o;if(r===t)return a;for(let u of r.children){if(u.kind!=="element")continue;let d=n(u,s,a);if(d)return d}}}function fu(e,t,n){let r=new Set;for(let i=0;i<t.length;i+=1){let o=t[i];if(o)for(let s=i+1;s<t.length;s+=1){let a=t[s];a&&(n&&(o.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||me(e,o.typeDefinition.canonical,a.typeDefinition.canonical)||(r.add(o.typeDefinition.canonical),r.add(a.typeDefinition.canonical)))}}return[...r].sort()}function gu(e,t){return Ve(e)??t.canonical}function yu(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Su(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var bu=new Set(["_failureIf","_successIf","_skipIf","_while"]),Tu=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Re(e){if(bu.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(Tu.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}var Vi=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),qi=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function qe(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(Ui(r)){n++;continue}if(An(r)){let a=n;for(n++;n<e.length&&hu(e[n]);)n++;let u=e.slice(a,n);t.push({type:u==="true"||u==="false"?"Boolean":"Identifier",text:u,start:a,end:n});continue}if(he(r)){let a=Ru(e,n);t.push(a),n=a.end;continue}if(r==="'"){let a=vu(e,n);t.push(a),n=a.end;continue}let i=e.slice(n,n+2),o=Vi.get(i);if(o){t.push({type:o,text:i,start:n,end:n+2}),n+=2;continue}let s=qi.get(r);if(s){t.push({type:s,text:r,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:r,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function vu(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 Ru(e,t){let n=t;if(e[n]==="0"&&(e[n+1]==="x"||e[n+1]==="X")){n+=2;let i=n;for(;n<e.length&&xu(e[n]);)n++;return i===n||Cu(e,n)?(n=at(e,n),ut(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&he(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(!he(e[n+1]))return n=at(e,n+1),ut(e,t,n);for(r="Real",n+=1;n<e.length&&he(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let i=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let o=n;for(;n<e.length&&he(e[n]);)n++;if(o===n)return n=at(e,Math.max(n,i+1)),ut(e,t,n);r="Real"}return ku(e,n)?(n=at(e,n),ut(e,t,n)):{type:r,text:e.slice(t,n),start:t,end:n}}function at(e,t){let n=t;for(;n<e.length;){let r=e[n];if(Ui(r)||qi.has(r)||Vi.has(e.slice(n,n+2))||r==="."&&e[n+1]===".")break;n++}return n}function ut(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function Ui(e){return e===" "||e===" "||e===`
|
|
12
|
-
`||e==="\r"}function An(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function hu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function he(e){return e!==void 0&&/[0-9]/.test(e)}function xu(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function ku(e,t){let n=e[t];return An(n)||he(n)}function Cu(e,t){let n=e[t];return n==="."||An(n)||he(n)}var Iu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Du=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),Fi=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),J={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function ke(e){let t=qe(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}:Xi(t,e)}function Xi(e,t=""){let n=new Pn(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 o=n.parseExpression(0);if(!o)return{ok:!1,errors:n.errors,tokens:e};for(r.push(o);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let i=Mu(r);return{ok:!0,program:{kind:"Program",statements:r,range:i},tokens:e}}var Pn=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 i=Iu.get(r.type);if(i){if(t>=J.assignment)break;this.consume();let u=this.parseExpression(0);if(!u)return;n={kind:"AssignmentExpression",operator:i,left:n,right:u,range:dt(n.range,u.range)};break}if(r.type==="Question"){if(t>=J.ternary)break;this.consume();let u=this.parseExpression(0);if(!u)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let d=this.parseExpression(J.ternary);if(!d)return;n={kind:"ConditionalExpression",condition:n,thenExpression:u,elseExpression:d,range:dt(n.range,d.range)};break}let o=Fi.get(r.type);if(o){if(t>=J.comparison)break;this.consume();let u=[n],d=[o],l=this.parseExpression(J.comparison);if(!l)return;for(u.push(l);;){let c=Fi.get(this.peek().type);if(!c)break;this.consume();let m=this.parseExpression(J.comparison);if(!m)return;d.push(c),u.push(m)}n={kind:"ComparisonChain",operands:u,operators:d,range:dt(u[0].range,u[u.length-1].range)};continue}let s=Du.get(r.type),a=s?Bu(r.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let u=this.parseExpression(a);if(!u)return;n={kind:"BinaryExpression",operator:s,left:n,right:u,range:dt(n.range,u.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${r.text||r.type}\``,r);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:xe(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),Eu(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:Nu(t.type),argument:n,range:dt(xe(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),r=this.parseExpression(0);if(!r)return;let i=this.peek();if(i.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",i);return}return this.consume(),wu(r,{start:n.start,end:i.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:xe(r)})}};function Eu(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:xe(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:xe(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:xe(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:xe(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function Nu(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function Bu(e){switch(e){case"PipePipe":return J.pipePipe;case"AmpAmp":return J.ampAmp;case"Pipe":case"Caret":return J.pipeCaret;case"Ampersand":return J.ampersand;case"Plus":case"Minus":case"DotDot":return J.additive;case"Star":case"Slash":return J.multiplicative;default:return}}function xe(e){return{start:e.start,end:e.end}}function dt(e,t){return{start:e.start,end:t.end}}function wu(e,t){return{...e,range:t}}function Mu(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var Au=new Set(["int8_t","std::int8_t","int16_t","std::int16_t","int32","int32_t","std::int32_t","int64","int64_t","std::int64_t","int","long","short","uint8_t","std::uint8_t","uint16_t","std::uint16_t","uint32","uint32_t","std::uint32_t","uint64","uint64_t","std::uint64_t","uint","unsigned","unsigned int","size_t","std::size_t","float","double"]);function lt(e={}){let t=Ae(e.augmentations??[]),n=e.areTypesCompatible??((o,s)=>je(t,o,s)),r=new Map,i={symbols:new Map,enums:Pu(e.enums,e.augmentations??[])};for(let o of e.symbols??[])_u(i,r,o,n);return i}function ae(e){return{symbols:new Map([...e?.symbols.entries()??[]].map(([t,n])=>[t,{...n}])),enums:new Map(e?.enums??[])}}function ct(e){let t=ae(e.baseEnvironment),n=[];for(let r of e.entries){let i=ae(t),o=r.parseResult??ke(r.source),s=ae(i),a;o.ok&&(a=De({program:o.program,environment:i,attributeName:r.attributeName,originId:r.originId??String(r.id)}),s=ae(a.environment)),n.push({id:r.id,parseResult:o,environmentBefore:i,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.enums.clear();for(let[u,d]of s.symbols)t.symbols.set(u,{...d});for(let[u,d]of s.enums)t.enums.set(u,d)}return n}function $i(e){let t=new Map;for(let n of e)for(let[r,i]of Object.entries(n.script?.enums??{}))t.set(r,i);return t}function Ce(e,t){let n=Q(e,t);return ji(t,n)}function ji(e,t){if(!e||!t)return{kind:"unknown"};if(t.kind==="any")return{kind:"any"};let n=t.canonical.toLowerCase();return n==="bool"?{kind:"bool"}:n==="std::string"||n==="string"?{kind:"string"}:Au.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function Ki(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:e.kind===t.kind}function Ut(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:!1:e.kind==="bool"&&t.kind==="number"?!0:e.kind===t.kind}function Ie(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function _n(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 Pu(e,t){if(e instanceof Map)return new Map(e);let n=$i(t??[]);for(let[r,i]of Object.entries(e??{}))n.set(r,i);return n}function _u(e,t,n,r){let i=e.symbols.get(n.name);if(!i){e.symbols.set(n.name,{name:n.name,type:n.type,source:n.source,writable:n.writable,readable:n.readable}),t.set(n.name,n.compatibilityKey);return}let o=t.get(n.name),s=i.conflict===!0||o!==void 0&&n.compatibilityKey!==void 0&&!r(o,n.compatibilityKey)||!Ki(i.type,n.type);e.symbols.set(n.name,{...i,readable:i.readable||n.readable,writable:i.writable||n.writable,conflict:s}),o===void 0&&t.set(n.name,n.compatibilityKey)}var Ee={kind:"number"},Xt={kind:"string"},Ft={kind:"bool"},le={kind:"unknown"},X={kind:"error"};function De(e){let t=ae(e.environment),n=[],r=[],i=[],o=[],s=[],a=[];return e.program.statements.forEach((u,d)=>{a.push(ue({expression:u,statementIndex:d,environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:i,introducedSymbols:o,diagnostics:s,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:r,unknownIdentifiers:i,introducedSymbols:o,diagnostics:s,statementTypes:a,finalType:a.at(-1)}}function ue(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?Ee:t.valueKind==="string"?Xt:t.valueKind==="boolean"?Ft:le;case"Identifier":return Ou(e,t.name,t.range);case"UnaryExpression":{let n=ue({...e,expression:t.argument});return t.operator==="!"?Ie(n)?Ft:(ne(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"),X):n.kind==="number"?Ee:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?X:le:(ne(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"),X)}case"BinaryExpression":{let n=ue({...e,expression:t.left}),r=ue({...e,expression:t.right});switch(t.operator){case"&&":case"||":return zi(n)||zi(r)?(ne(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"),X):Ft;case"+":return n.kind==="string"&&r.kind==="string"?Xt:n.kind==="number"&&r.kind==="number"?Ee:Ln(n,r)?le:(On(e,t.range,t.operator),X);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&r.kind==="number"?Ee:Ln(n,r)?le:(On(e,t.range,t.operator),X);case"..":return n.kind==="string"&&(r.kind==="string"||r.kind==="number")||r.kind==="string"&&(n.kind==="string"||n.kind==="number")?Xt:Ln(n,r)?le:(On(e,t.range,t.operator),X)}return le}case"ComparisonChain":{let n=t.operands.map(r=>ue({...e,expression:r}));for(let r=0;r<t.operators.length;r+=1){let i=t.operators[r],o=n[r],s=n[r+1];if(!qu(i,o,s))return ne(e,"invalid-operand-type",{start:t.operands[r]?.range.start??t.range.start,end:t.operands[r+1]?.range.end??t.range.end},`operator \`${i}\` cannot compare these operand types`,`comparison operands for \`${i}\` are not compatible`,"compare values of the same primitive type, or use == / != for matching custom types"),X}return Ft}case"ConditionalExpression":{let n=ue({...e,expression:t.condition});Ie(n)||ne(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=ue({...e,expression:t.thenExpression}),i=ue({...e,expression:t.elseExpression}),o=_n(r,i);return o||(ne(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"),X)}case"AssignmentExpression":return Lu(e)}}function Lu(e){let{environment:t,attributeName:n,identifiers:r,introducedSymbols:i}=e,o=e.expression,s=ue({...e,expression:o.right});if(o.left.kind!=="Identifier")return ue({...e,expression:o.left}),ne(e,"invalid-operand-type",o.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),X;let a=o.left,u=o.operator===":="?"declare":o.operator==="="?"write":"readwrite",d={name:a.name,kind:u,range:a.range,identifier:a,statementIndex:e.statementIndex};r.push(d);let l=t.symbols.get(a.name);if(o.operator===":="&&!l){let m={name:a.name,type:s,source:{kind:"script-assignment",attributeName:n,range:a.range,originId:e.originId},readable:!0,writable:!0};return t.symbols.set(a.name,m),e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:m}}),i.push(m),s}if(!l)return e.resolvedIdentifiers.push({access:d,resolution:{kind:"unknown"}}),ne(e,"assignment-to-unknown-variable",a.range,`assignment target \`${a.name}\` is not defined`,`\`${a.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),X;if(e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:l}}),o.operator==="=")return Ut(l.type,s)?(Vn(l,s),s):(Wi(e,a,l.type,s),X);if(o.operator===":=")return Ut(l.type,s)?(Vn(l,s),s):(Wi(e,a,l.type,s),X);let c=Vu(l.type,s,o.operator);return c?(Vn(l,c),c):(ne(e,"invalid-compound-assignment",o.range,`operator \`${o.operator}\` is not valid for these operand types`,`compound assignment \`${o.operator}\` is not allowed here`,o.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),X)}function Ou(e,t,n){let r={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(r);let i=e.environment.enums.get(t);if(i!==void 0)return e.resolvedIdentifiers.push({access:r,resolution:{kind:"enum",name:t,value:i}}),Ee;let o=e.environment.symbols.get(t);return o?(e.resolvedIdentifiers.push({access:r,resolution:{kind:"symbol",symbol:o}}),o.type):(e.resolvedIdentifiers.push({access:r,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(r),le)}function Vu(e,t,n){return e.kind==="error"||t.kind==="error"?X:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?le:n==="+="?e.kind==="number"&&t.kind==="number"?Ee:e.kind==="string"&&t.kind==="string"?Xt:void 0:e.kind==="number"&&t.kind==="number"?Ee:void 0}function Ln(e,t){return $t(e)||$t(t)}function $t(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function zi(e){return!Ie(e)}function qu(e,t,n){return $t(t)||$t(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 On(e,t,n){ne(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 Wi(e,t,n,r){ne(e,"variable-type-mismatch",t.range,`cannot assign ${qn(r)} to variable \`${t.name}\` of type ${qn(n)}`,`\`${t.name}\` expects ${qn(n)} here`,"assign a compatible value or change the variable's source type")}function Vn(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 ne(e,t,n,r,i,o){e.diagnostics.push({code:t,range:n,message:r,details:{primaryLabel:i,help:o}})}function qn(e){return e.kind==="custom"?e.name:e.kind}var Gi=new Set(["Identifier","Integer","Real","String","Boolean","RightParen"]),Uu=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"]),Fu=["==","!=","<",">","<=",">=","&&","||","+","-","*","/","..","?",":"],Xu=[":=","=","+=","-=","*=","/="],Yi=new Set(["!","<",">","=",":","+","-","*","/","&","|","^","?","."]);function Un(e){let t=e.source,n=Zi(t,e.cursorOffset),r=Kt({source:t,cursorOffset:n}),i=[];return r.kind==="identifier"&&(i.push(...$u(e,r)),Hu(e.attributeInfo,t,n)&&i.push(...zu(r.range))),(r.kind==="operator"||r.kind==="after-assignment-lhs")&&i.push(...ju(r.range,r.prefix)),r.kind==="after-assignment-lhs"&&i.push(...Ku(r.range,r.prefix)),Qu(i)}function Kt(e){let t=e.source,n=Zi(t,e.cursorOffset),r=qe(t).filter(u=>u.type!=="EndOfInput"),i=r.find(u=>u.start<=n&&n<=u.end);if(i?.type==="Identifier")return{kind:"identifier",prefix:i.text.slice(0,Math.max(0,n-i.start)),range:{start:i.start,end:i.end}};if(i&&(i.type==="Integer"||i.type==="Real"||i.type==="String"||i.type==="Boolean"))return{kind:"literal",range:{start:i.start,end:i.end}};let o=Zu(t,n),s=jt(r,o.start);if(o.start<o.end&&s&&Gi.has(s.type))return{kind:s.type==="Identifier"&&Hi(r,s)?"after-assignment-lhs":"operator",prefix:t.slice(o.start,n),range:o};let a=jt(r,n);return a&&Gi.has(a.type)&&a.end<=n?{kind:a.type==="Identifier"&&Hi(r,a)?"after-assignment-lhs":"operator",prefix:"",range:{start:n,end:n}}:!a||Uu.has(a.type)?{kind:"identifier",prefix:"",range:{start:n,end:n}}:{kind:"unknown",range:{start:n,end:n}}}function $u(e,t){let n=Wu(e),r=t.prefix.toLowerCase(),i=[];for(let[o,s]of n.enums)mt(o,r)&&i.push({label:o,kind:"enum",detail:`enum value ${s}`,replaceRange:t.range,sortText:`0-${o}`});for(let o of n.symbols.values())o.conflict||o.readable&&mt(o.name,r)&&i.push({label:o.name,kind:"identifier",detail:Gu(o),replaceRange:t.range,sortText:o.source.kind==="script-assignment"?`1-${o.name}`:`2-${o.name}`});for(let o of["true","false"])mt(o,r)&&i.push({label:o,kind:"value",detail:"bool",replaceRange:t.range,sortText:`3-${o}`});return i}function ju(e,t){return Fu.filter(n=>mt(n,t)).map(n=>({label:n,kind:"operator",detail:"script operator",replaceRange:e,sortText:`4-${n}`}))}function Ku(e,t){return Xu.filter(n=>mt(n,t)).map(n=>({label:n,kind:"operator",detail:"assignment operator",replaceRange:e,sortText:`5-${n}`}))}function zu(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 Wu(e){let t=ae(e.environment),n=qe(e.source),r=ke(e.source);if(r.ok){let i=De({program:r.program,environment:t,attributeName:e.attributeName}),o=ae(e.environment);for(let s of i.introducedSymbols)s.source.kind==="script-assignment"&&(s.source.range.end>e.cursorOffset||o.symbols.set(s.name,s));return o}for(let i of n){if(i.type!=="Identifier")continue;if(i.end>e.cursorOffset)break;let o=Ju(n,i.end);o?.type==="ColonEqual"&&(o.end>e.cursorOffset||t.symbols.has(i.text)||t.symbols.set(i.text,{name:i.text,type:{kind:"unknown"},source:{kind:"script-assignment",attributeName:e.attributeName??"code",range:{start:i.start,end:i.end}},readable:!0,writable:!0}))}return t}function Gu(e){let t=Yu(e.type);switch(e.source.kind){case"port-remap":return`${t} from ${e.source.nodeType??"node"}.${e.source.portName}`;case"subtree-port":return`${t} from ${e.source.nodeType??"SubTree"}.${e.source.portName}`;case"script-assignment":return`${t} from earlier ${e.source.attributeName} declaration`;case"augmentation":return`${t} from augmentation`;case"enum":return`${t} enum`}}function Yu(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 Hu(e,t,n){if(e?.expectedResult!=="ignored")return!1;let r=qe(t).filter(o=>o.type!=="EndOfInput"),i=jt(r,n);return!i||i.type==="Semicolon"}function Zu(e,t){let n=t;for(;n>0&&Yi.has(e[n-1]??"");)n-=1;let r=t;for(;r<e.length&&Yi.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 Hi(e,t){if(t.type!=="Identifier")return!1;let n=jt(e,t.start);return!n||n.type==="Semicolon"}function Ju(e,t){return e.find(n=>n.start>=t&&n.type!=="EndOfInput")}function mt(e,t){return t.length===0||e.toLowerCase().startsWith(t.toLowerCase())}function Zi(e,t){return Math.max(0,Math.min(e.length,t))}function Qu(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 Ji=new WeakMap;function zt(e,t){let n=e.getNodeUsage(t),r=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(i=>{let o=Re({elementName:t.name,attributeName:i.name,resolvedNodeType:r});return o?[{attribute:i,info:o,parseResult:ke(i.value)}]:[]})}function re(e,t,n){return fe(e.document,t,n)}function Qi(e){return{start:0,end:e.value.length}}function ye(e,t){let n=e.getTreeNodeView(t),r=n?.behaviorTree;return!n||!r?zt(e,t).map(i=>{let o=eo(e,[]);return{...i,environment:o,analysis:i.parseResult.ok?De({program:i.parseResult.program,environment:o,attributeName:i.attribute.name}):void 0}}):ed(e,r).filter(i=>i.node.element===t).map(i=>({...i.candidate,environment:i.environmentBefore,analysis:i.analysis}))}function ed(e,t){let n=Ji.get(e.view);n||(n=new WeakMap,Ji.set(e.view,n));let r=n.get(t);if(r)return r;let i=t.nodes.flatMap(s=>zt(e,s.element).map((a,u)=>({id:`${s.path.join(".")}:${a.attribute.name}:${u}`,node:s,candidate:a}))),o=ct({baseEnvironment:eo(e,t.nodes),entries:i.map(s=>({id:s.id,source:s.candidate.attribute.value,attributeName:s.candidate.attribute.name,originId:s.id,parseResult:s.candidate.parseResult}))}).flatMap((s,a)=>{let u=i[a];return u?[{...s,node:u.node,candidate:u.candidate}]:[]});return n.set(t,o),o}function eo(e,t){let n=W(e.semantic),r=[],i=t[0]?.behaviorTree.id;if(i){let o=e.getNodeModel(i);if(o?.kind==="SubTree")for(let s of o.ports){let a=Ve(s),d=Y(e.semantic,a)?.canonical??a;r.push({name:s.name,type:Ce(n,a),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 o of t){let s=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let a of o.portBindings){if(a.usage.status!=="resolved")continue;let u=K(a.usage.port.name,a.usage.value);if(!u)continue;let d=Ve(a.usage.port),c=Y(e.semantic,d)?.canonical??d,m=a.usage.port.direction;r.push({name:u,type:Ce(n,d),source:{kind:"port-remap",nodeType:s,portName:a.usage.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:c})}}return lt({symbols:r,augmentations:et(e.semantic),areTypesCompatible:(o,s)=>o&&s?me(e.semantic,o,s):!0})}var to=I({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of ye(e,t))if(n.analysis)for(let r of n.analysis.unknownIdentifiers)e.report({code:S.UnknownScriptVariable,message:`unknown script variable \`${r.name}\``,range:re(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 no=I({name:"script/valid-assignment",create(e){return{Element(t){for(let n of ye(e,t))if(n.analysis)for(let r of n.analysis.diagnostics){let i=r.code==="assignment-to-unknown-variable"?S.AssignmentToUnknownVariable:r.code==="invalid-compound-assignment"?S.InvalidCompoundAssignment:r.code==="variable-type-mismatch"?S.ScriptVariableTypeMismatch:void 0;i&&e.report({code:i,message:r.message,range:re(e,n.attribute,r.range),details:r.details})}}}}});var ro=I({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of ye(e,t))if(n.analysis)for(let r of n.analysis.diagnostics)r.code==="invalid-operand-type"&&e.report({code:S.InvalidScriptOperandType,message:r.message,range:re(e,n.attribute,r.range),details:r.details})}}}});var io=I({name:"script/valid-result-type",create(e){return{Element(t){for(let n of ye(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let r=n.parseResult.program.statements.at(-1),i=n.analysis.finalType;!r||!i||Ie(i)||e.report({code:S.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:re(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 oo=I({name:"script/valid-syntax",create(e){return{Element(t){for(let n of zt(e,t))if(!n.parseResult.ok)for(let r of n.parseResult.errors){let i=r.kind==="empty-script"?S.EmptyScript:r.kind==="invalid-token"?S.InvalidScriptToken:S.InvalidScriptSyntax;e.report({code:i,message:r.message,range:r.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??re(e,n.attribute,Qi(n.attribute)):re(e,n.attribute,r.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var so=[oo,to,no,ro,io];var td={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function ao(e){return I({name:td[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:nd(n)})}}}})}function nd(e){return e.code?{code:e.code}:void 0}var uo=[ao("unused"),ao("missing-reason")];function Wt(e,t){return e.attributes.find(n=>n.name===t)}var lo=[I({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||Wt(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),I({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Je(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))}}}}),I({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of Qe(e.semantic)){let n=ee(e.semantic,t);if(n.length<=1||new Set(n.map(o=>o.uri)).size<=1)continue;let i=n.filter(o=>o.uri===e.document.uri);i.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:i[0]?.idRange})}}}}}),I({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=Wt(t,"main_tree_to_execute");!n?.value||Sn(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),I({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=e.getSubTreeCallView(t),r=n?.node.element.attributes.find(o=>o.name==="ID")??Wt(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})}}}}),I({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree")return;let n=Wt(t,"ID");if(!n||e.getSubTreeCallView(t)?.target.status==="resolved")return;let i=e.resolveSubTree(n.value,e.document.uri);i.status!=="ambiguous"||i.behaviorTrees.length<=1||e.report({message:`ambiguous subtree \`${n.value}\``,range:n.valueContentRange||n.valueRange})}}}}),I({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var rd=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function id(e,t){return e===t?String(e):`${e}\u2013${t}`}var co=I({name:"model/valid-child-count",create(e){return{Element(t){if(te(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&od(e,t,n.model.model.id,n.model.model.kind)}}}});function od(e,t,n,r){let i=Bi(t).length,o=rd.get(n);if(o){if(i<o.min||i>o.max){let s=id(o.min,o.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${i}.`,range:t.range})}return}if(r==="Action"||r==="Condition"){i>0&&e.report({message:`${r} node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range});return}if(r==="Decorator"){i!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${i}.`,range:t.range});return}if(r==="Control"){i<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}r==="SubTree"&&i>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range})}var mo=I({name:"model/valid-port-value",create(e){return{Element(t){if(te(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let r of t.attributes){let i=e.getPortUsage(t,r.name);i?.status==="resolved"&&qt(e,{port:i.port,value:r.value,range:r.range,registry:W(e.semantic),typeDefinition:Y(e.semantic,i.port.type),allowRemap:!0,diagnosticCode:S.InvalidPortValueType,customLiteralDiagnosticCode:S.CustomLiteralRequiresValidator,portLabel:r.name})}}}}});var po=I({name:"model/require-port",create(e){return{Element(t){if(te(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(o=>o.name===r.name&&o.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 fo=[I({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(te(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})}}}}),I({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(te(t)||t.selfClosing||wi(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 go=I({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(i=>i.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:r?.valueContentRange??r?.valueRange??t.range})}}}});var yo=I({name:"model/no-unknown-port",create(e){return{Element(t){if(te(t))return;let n=e.getNodeUsage(t);for(let r of n.portUsages){if(r.status!=="undeclared")continue;let i=n.ports.map(s=>s.name).sort(),o=i.length>=1&&i.length<=8?[`note: defined ports: ${i.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${r.name}\``,range:r.attribute.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` does not define this port`:"SubTree does not define this port in strict mode",help:n.model.status==="resolved"?`remove \`${r.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${r.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:o}:void 0})}}}}});var So=[go,yo,po,mo,...fo,co];function sd(e,t){return e.attributes.find(n=>n.name===t)}function ad(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var bo=[I({name:"xml/valid-root",create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||t.name==="root"||e.report({message:"Root element must be <root>",range:t.range})}}}}),{name:"xml/require-btcpp-format",code:S.MissingBTCPPFormat,defaultSeverity:"error",meta:{description:'Root element must declare BTCPP_format="4".'},create(e){return{Document(){let t=e.document.root;e.document.kind!=="bt-document"||!t||sd(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},I({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)||ad(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Fn=[...bo,...so,...lo,...Oi,...So,...Ei,...uo],dg=new Map(Fn.map(e=>[e.name,e]));function To(e){if(e!=="off")return e==="info"?C.Info:e==="warn"?C.Warning:C.Error}function vo(e,t){return xt(e.linter.rules[t])?.options??{}}function Ro(e){let t=xt(e.config.linter.rules[e.rule]);return To(t?t.severity:e.defaultSeverity)}function ho(e){let t=[],n=e.facts??ki(),r=e.rules?new Set(e.rules):void 0,i=[];for(let s of Fn){if(r&&!r.has(s.name))continue;let a=Ro({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let u=vo(e.config,s.name),d=s.optionsSchema?.safeParse(u),l=d?.success?d.data:u,c=Di({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:l,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});i.push(s.create(c))}for(let s of i)s.Document?.();e.document.root&&xo(e.document.root,i);let o=Je(e.semantic,e.document.uri);for(let s of o?.treeNodesModel??[])for(let a of i)a.TreeNodeModel?.(s);for(let s of i)s.ProgramExit?.();return t.map((s,a)=>({diag:s,index:a})).sort((s,a)=>ud(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function xo(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&xo(n,t)}function ud(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 Xn(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let r=[...e.diagnostics],i=n.documentView??ve(e,{semantic:t,config:n.config,policy:ce(n.config)});return r.push(...ho({document:e,view:i,semantic:t,config:n.config})),r}function ko(e){return e?.documents??[]}function dd(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 ld(e){let t=we();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 ie(e,t){let n=it(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,i=n.document?[n.document,...ko(r).filter(l=>!dd(e.document,l))]:ko(r),o=ld(e.config||t.config),s=ce(o),a=r?.nodeDefinitionModels??[],u=gn(i,{config:o,models:a,augmentations:t.augmentations}).index,d=n.document?ve(n.document,{semantic:u,config:o,policy:s}):void 0;return{document:e.document,parsed:n.document,documentView:d,diagnostics:n.document?Xn(n.document,u,{config:o,documentView:d}):n.diagnostics,partial:n.partial===!0,semantic:u,config:o,nodeUsagePolicy:s,workspace:r}}function Co(e,t,n){let r=e.positionAt(e.offsetAt({line:t,character:0}));return{range:R(r,r),newText:n}}function Io(e,t){let r=(t.fullRange?.start||t.range.start).offset;for(;r>0&&/[ \t]/.test(e.text[r-1]||"");)r-=1;return{range:R(e.positionAt(r),e.positionAt(t.range.end.offset)),newText:""}}function Do(e,t,n){let r=Math.max(t.openTagRange.end.offset-(t.selfClosing?2:1),t.openTagRange.start.offset),i=e.positionAt(r);return{range:R(i,i),newText:` ${n}=""`}}function Gt(e){return R(e.positionAt(0),e.positionAt(e.text.length))}function $n(e,t){let n=t.diagnostics||e.diagnostics,r=[],i=st(t.document.text,e.config.formatter);i.ok&&!i.skipped&&i.text!==t.document.text&&r.push({title:"Format document",kind:"source.format",edits:[{range:Gt(t.document),newText:i.text}]});for(let o of n){if(!o.range)continue;let s=G({document:t.document,parsed:e.parsed,position:o.range.start});if(o.code==="BT101_MISSING_REQUIRED_PORT"){let a=Math.min(o.range.start.offset+1,o.range.end.offset),u=e.parsed?.root&&Oe(e.parsed.root,a)||("element"in s?s.element:void 0);if(!u)continue;let d=L(e.semantic,{element:u,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}),l=d.ports.find(c=>c.required&&!d.portUsages.some(m=>m.status==="resolved"&&m.name===c.name));l&&r.push({title:`Add missing port ${l.name}`,kind:"quickfix",diagnostics:[o],edits:[Do(t.document,u,l.name)]})}if(o.code==="BT102_UNKNOWN_PORT"&&"attribute"in s&&"element"in s&&s.attribute){let u=(s.element?L(e.semantic,{element:s.element,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}):void 0)?.portUsages.find(l=>l.status==="undeclared"&&l.attribute===s.attribute),d=u?Io(t.document,s.attribute):void 0;d&&u&&r.push({title:`Remove unknown port ${s.attribute.name}`,kind:"quickfix",diagnostics:[o],edits:[d]})}if(o.code==="BT002_MISSING_BTCPP_FORMAT"&&e.parsed?.root){let a=t.document.positionAt(e.parsed.root.nameRange?.end.offset||e.parsed.root.openTagRange.end.offset-1);r.push({title:'Add BTCPP_format="4" to <root>',kind:"quickfix",diagnostics:[o],edits:[{range:R(a,a),newText:' BTCPP_format="4"'}]})}r.push({title:`Suppress ${o.code} for next line`,kind:"quickfix",diagnostics:[o],edits:[Co(t.document,o.range.start.line,`<!-- btxml-disable-next-line ${o.code} reason: TODO -->
|
|
13
|
-
`)]})}return{actions:r}}function O(e,t,n,r,i){return{label:e,kind:t,detail:n,textEdit:r,insertText:e,sortText:e,...i}}function U(e,t){return e?{range:e,newText:t}:void 0}function Se(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 cd=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function md(e){let t=e?.trim();if(t&&!(t.includes("{")||t.includes("}")))return cd.test(t)?t:void 0}function pd(e){let t=e?.trim();if(!t)return;let n=t.startsWith("{")&&t.endsWith("}")?t.slice(1,-1).trim():t;return md(n)}function Eo(e){return`{${e}}`}function Ne(e){return e?.trim().replace(/^const\s+/,"").replace(/[&*]\s*$/,"").replace(/\s+/g," ").toLowerCase()}function No(e,t){return!e||!t?!1:Ne(e)===Ne(t)}function Bo(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 i=r.declaredPort.port;for(let o of r.blackboardReferences){let s=pd(o.key);if(!s)continue;let a={key:s,type:i.type,direction:i.direction,nodeType:n.usage.nodeType||n.tagName,portName:i.name},u=t.get(s);if(!u){t.set(s,a);continue}let d=Ne(u.type),l=Ne(a.type);if(d&&l&&d!==l){t.set(s,{...u,conflict:!0});continue}!d&&l&&t.set(s,{...u,type:a.type})}}return[...t.values()]}function fd(e,t,n){return R(e.positionAt(t),e.positionAt(n))}function gd(e,t,n){let r=t.valueContentRange;if(!r)return;let i=r.start.offset,o=r.end.offset,s=e.text.slice(i,o),a=s.startsWith("{"),u=s.endsWith("}");if(a&&n>i){let d=i+1,l=u?o-1:o;return{replacementRange:fd(e,d,Math.max(d,l)),wrapsReference:!1}}return{insertText:t.value,replacementRange:r,wrapsReference:!0}}function jn(e){let{document:t,attribute:n,cursorOffset:r,symbol:i,detail:o}=e,s=gd(t,n,r),a=Eo(i.key),u=s?.wrapsReference?a:i.key;return O(a,"Reference",o,s?{range:s.replacementRange,newText:u}:void 0,{filterText:`${i.key} ${a}`,insertText:u})}var wo=new WeakMap;function Ue(e,t){let n=e.parsed?G({document:e.document,parsed:e.parsed,position:t}):void 0;if(!n||n.kind!=="attribute-value")return;let r=Gn(e,n.element,n.attribute);if(!r)return;let i=r.attribute.valueContentRange??r.attribute.valueRange,o=t.offset-i.start.offset,s=Yn(r.attribute,o),a=Kt({source:r.source,cursorOffset:s});if(a.kind!=="identifier"||s<a.range.start||s>a.range.end)return;let u=Lo(e,r),d=u.analysis?.resolvedIdentifiers.find(c=>c.access.range.start===a.range.start&&c.access.range.end===a.range.end&&c.resolution.kind!=="unknown");if(!d||d.resolution.kind==="unknown")return;let l=d.resolution.kind==="symbol"?{kind:"symbol",symbol:d.resolution.symbol}:d.resolution;return{attributeContext:r,range:Kn(e,r,a.range),reference:l,flowState:u,occurrence:{attributeContext:r,identifier:d.access,reference:l,documentRange:Kn(e,r,d.access.range)}}}function Mo(e,t){return Wn(e,t.attributeContext.behaviorTree).flatMap(r=>Sd(e,r).filter(i=>t.reference.kind==="enum"?i.reference.kind==="enum"&&i.reference.name===t.reference.name:bd(t.reference.symbol,i.reference)))}function Ao(e,t){return Wn(e,t)}function Po(e,t,n){let r=Gn(e,t,n);if(r)return Lo(e,r).environmentBefore}function _o(e){let t=zn(e.type);switch(e.source.kind){case"port-remap":return`${t} from ${e.source.nodeType??"node"}.${e.source.portName}`;case"subtree-port":return`${t} from ${e.source.nodeType??"SubTree"}.${e.source.portName}`;case"script-assignment":return`${t} from earlier ${e.source.attributeName} declaration`;case"augmentation":return`${t} from augmentation`;case"enum":return`${t} enum`}}function zn(e){return e.kind==="custom"?e.name:e.kind}function Lo(e,t){let r=Wn(e,t.behaviorTree).find(i=>i.id===t.id);if(!r)throw new Error(`missing script flow state for ${t.id}`);return r}function Wn(e,t){let n=wo.get(e);n||(n=new WeakMap,wo.set(e,n));let r=n.get(t);if(r)return r;let i=t.nodes.flatMap(a=>a.element.attributes.flatMap(u=>{let d=Gn(e,a.element,u);return d?[d]:[]})),o=i.map(a=>({id:a.id,source:a.source,attributeName:a.attribute.name,originId:a.id})),s=ct({baseEnvironment:yd(e,t.nodes),entries:o}).flatMap((a,u)=>{let d=i[u];return d?[{...a,context:d}]:[]});return n.set(t,s),s}function Gn(e,t,n){let r=e.documentView?.nodes.find(a=>a.element===t);if(!r)return;let i=r.usage.model.status==="resolved"?r.usage.model.model.id:r.usage.nodeType;if(!Re({elementName:t.name,attributeName:n.name,resolvedNodeType:i}))return;let s=t.attributes.indexOf(n);return{id:`${r.path.join(".")}:${n.name}:${s}`,node:r,element:t,attribute:n,source:n.value,behaviorTree:r.behaviorTree}}function yd(e,t){let n=W(e.semantic),r=[],i=t[0]?.behaviorTree.id;if(i){let o=H(e.semantic,i);if(o?.kind==="SubTree")for(let s of o.ports){let a=s.effectiveType??s.type,d=Y(e.semantic,a)?.canonical??a;r.push({name:s.name,type:Ce(n,a),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 o of t){let s=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 u=Td(a);if(!u)continue;let d=a.declaredPort.port.type,c=Y(e.semantic,d)?.canonical??d,m=a.declaredPort.port.direction;r.push({name:u,type:Ce(n,d),source:{kind:"port-remap",nodeType:s,portName:a.declaredPort.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:c})}}return lt({symbols:r,augmentations:et(e.semantic),areTypesCompatible:(o,s)=>o&&s?me(e.semantic,o,s):!0})}function Sd(e,t){return t.analysis?t.analysis.resolvedIdentifiers.flatMap(n=>{if(n.resolution.kind==="unknown")return[];let r=n.resolution.kind==="symbol"?{kind:"symbol",symbol:n.resolution.symbol}:n.resolution;return[{attributeContext:t.context,identifier:n.access,reference:r,documentRange:Kn(e,t.context,n.access.range)}]}):[]}function bd(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 Kn(e,t,n){return fe(e.parsed??{originalText:e.document.text},t.attribute,n)}function Yn(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 i=n[r];if(i!==void 0&&i>=t){let o=n[r-1]??0;return t<=o?r-1:r}}return Math.max(0,n.length-1)}function Oo(e,t,n){let r=e.parsed??{originalText:e.document.text};return fe(r,t,n)}function Td(e){if(e.declaredPort.status==="resolved")return K(e.declaredPort.port.name,e.value)}function vd(e,t,n){let r=e.documentView?.nodes.find(o=>o.element===t)?.usage,i=r?.model.status==="resolved"?r.model.model.id:r?.nodeType;return Re({elementName:t.name,attributeName:n.name,resolvedNodeType:i})}function Vo(e,t,n,r){let i=vd(e,n,r);if(!i)return;let o=r.valueContentRange??r.valueRange,s=Po(e,n,r),a=Math.max(0,t.position.offset-o.start.offset);return Un({source:r.value,cursorOffset:Yn(r,a),environment:s,attributeName:r.name,attributeInfo:i}).map(d=>Rd(e,r,d))}function Rd(e,t,n){return O(n.label,hd(n.kind),n.detail,{range:Oo(e,t,n.replaceRange),newText:n.insertText??n.label},{insertText:n.insertText??n.label,insertTextFormat:n.insertTextFormat,filterText:n.filterText,sortText:n.sortText})}function hd(e){switch(e){case"identifier":return"Variable";case"enum":return"Enum";case"value":return"Value";case"operator":return"Keyword";case"snippet":return"Snippet"}}var Yt={enumLiteral:"0",boolLiteral:"1",matchingKey:"2",unknownKey:"3"};function qo(e){return!!(e?.valueContentRange&&e.valueRange&&(e.valueContentRange.start.offset!==e.valueRange.start.offset||e.valueContentRange.end.offset!==e.valueRange.end.offset))}function Uo(e,t){if(!e)return;let n=qo(e)?e.valueContentRange:e.valueRange;if(n)return U(n,qo(e)?t:`"${t}"`)}function Fo(e,t,n,r){let i=[],o=[];for(let s of Qe(e)){let a=ee(e,s),u=O(s,"Value","BehaviorTree ID",r?Uo(r,s):U(n,s));a.some(d=>d.uri===t)?i.push({...u,sortText:`0-${s}`}):o.push({...u,sortText:`1-${s}`})}return[...i,...o]}function xd(e){return O("SubTree","Class","Built-in subtree tag",U(e,"SubTree"),{sortText:"0-SubTree"})}function kd(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",U(e.replacementRange,`${t}>`))]:[]}function Cd(e,t){let n=[...["BehaviorTree","TreeNodesModel","include"].map(i=>O(i,"Class",void 0,U(t,i))),...["Action","Condition","Control","Decorator"].map(i=>O(i,"Class",void 0,U(t,i))),xd(t)],r=new Set;for(let i of Dt(e))i.id!=="SubTree"&&(r.has(i.id)||(r.add(i.id),n.push(O(i.id,"Class",void 0,U(t,i.id)))));return Se(n)}function Ht(e,t,n){return L(e.semantic,{element:n,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy})}function Hn(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}`:""}`,U(t,r.name)))}function Id(e,t,n){let r=[O("ID","Property",void 0,U(n,"ID"))];return r.push(...Hn(t,n)),r.filter(i=>!e.attributes.some(o=>o.name===i.label))}function Dd(e,t,n,r){if(!e)return[];if(Te(e.name)){let o=[];e.attributes.some(a=>a.name==="ID")||o.push(O("ID","Property",void 0,U(r,"ID")));let s=Ht(n,t,e);return o.push(...Hn(s,r)),o}return e.name==="SubTree"?Id(e,Ht(n,t,e),r):e.name==="include"?[O("path","Property",void 0,U(r,"path"))]:Hn(Ht(n,t,e),r)}function Ed(e,t,n,r){return Fo(t.semantic,e.document.uri,n,r)}function Nd(e,t,n,r){let i=[],o=new Set;for(let s of Dt(e))s.kind===t&&(o.has(s.id)||(o.add(s.id),i.push(O(s.id,"Value",`${t} node ID`,r?Uo(r,s.id):U(n,s.id)))));return i}function Bd(e,t,n){if(t.kind!=="attribute-value")return[];let{attribute:r,element:i}=t;if(!r||!i)return[];let o=Te(i.name);if(o&&r.name==="ID")return Nd(n.semantic,o,r.valueContentRange||r.valueRange,r);if(i.name==="SubTree"&&r.name==="ID")return Ed(e,n,r.valueContentRange||r.valueRange,r);if(i.name==="root"&&r.name==="main_tree_to_execute")return Fo(n.semantic,e.document.uri,r.valueContentRange||r.valueRange,r);if(i.name==="include"&&r.name==="path")return(n.workspace?n.workspace.documents.map(P=>P.path||P.uri).filter(P=>P.endsWith(".xml")):[]).map(P=>O(P,"File","XML file",U(r.valueContentRange||r.valueRange,P)));let s=Vo(n,e,i,r);if(s)return s;let a=Ht(n,e,i);if(o&&a.model.status!=="resolved")return[];let u=se(n.semantic,{element:i,documentRoot:n.parsed?.root,attributeName:r.name,uri:e.document.uri,config:n.config,policy:n.nodeUsagePolicy});if(u?.status!=="resolved")return[];let d=u.port,l=r.valueContentRange||r.valueRange,c=[];d.enum?.length&&c.push(...d.enum.map(E=>O(E,"Enum",d.type,U(l,E),{sortText:`${Yt.enumLiteral}-${E}`}))),(d.type||"").toLowerCase()==="bool"&&c.push(...["true","false"].map(E=>O(E,"Value","bool",U(l,E),{sortText:`${Yt.boolLiteral}-${E}`})));let m=Bo(n),f=Ne(d.type),x=m.filter(E=>!E.conflict&&No(d.type,E.type)),T=m.filter(E=>!E.conflict&&!Ne(E.type)&&f),D=x.map(E=>({...jn({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:E,detail:`${E.type||"unknown"} blackboard key from ${E.nodeType}.${E.portName}`}),sortText:`${Yt.matchingKey}-${E.key}`})),N=T.map(E=>({...jn({document:e.document,attribute:r,cursorOffset:e.position.offset,symbol:E,detail:`unknown-type blackboard key from ${E.nodeType}.${E.portName}`}),sortText:`${Yt.unknownKey}-${E.key}`}));return c.push(...D),c.push(...N),c.length>0?Se(c):(t.valuePrefix||"").includes("{")?Se(c):c}function Zn(e,t){let n=G({document:t.document,parsed:e.parsed,position:t.position});return n.kind==="comment"?{items:en.map(r=>O(r,"Reference","Diagnostic rule code"))}:n.kind==="attribute-value"?{items:Se(Bd(t,n,e))}:n.kind==="attribute-name"?{items:Se(Dd(n.element,t,e,n.attribute?.nameRange))}:n.kind==="tag-name"?{items:Se(Cd(e.semantic,n.element?.nameRange))}:n.kind==="closing-tag-name"?{items:Se(kd(n))}:{items:[]}}function Zt(e,t,n,r,i,o,s){if(!e)return[];let a=G({document:{uri:e.uri,languageId:"xml",version:0,text:e.originalText,positionAt:()=>n,offsetAt:()=>n.offset,getText:()=>e.originalText},parsed:e,position:n}),u="element"in a?a.element:void 0,d="attribute"in a?a.attribute:void 0,l=u?L(r,{element:u,documentRoot:e.root,uri:e.uri,config:i,policy:o}):void 0;if(u?.name==="SubTree"&&d?.name==="ID"){let c=l?.subtree?.target;if(c?.status==="resolved"&&c.kind==="behavior-tree"){let m=c.behaviorTree;if(m.idRange)return[{uri:m.uri,range:m.idRange}]}return c?.status==="ambiguous"?[...c.behaviorTrees,...c.definitions].map(m=>m.idRange?{uri:m.uri||e.uri,range:m.idRange}:m.range?{uri:m.uri||e.uri,range:m.range}:void 0).filter(m=>!!m):c?.status==="resolved"&&c.kind==="node-model"&&c.model.idRange?[{uri:c.model.uri||e.uri,range:c.model.idRange}]:[]}if(u?.name==="root"&&d?.name==="main_tree_to_execute")return ee(r,d.value).map(c=>c.idRange?{uri:c.uri,range:c.idRange}:void 0).filter(c=>!!c);if(u?.name==="include"&&d?.name==="path"&&s){let c=s.find(m=>m.uri===d.value||m.path===d.value||(m.path?m.path.endsWith(`/${d.value}`):!1));if(c?.root?.range)return[{uri:c.uri,range:c.root.range}]}if(d&&u){let c=t?_e(t,n):void 0;if(c?.declaredPort.status==="resolved"){let m=c.declaredPort.port;if(m.nameRange)return[{uri:m.uri||e.uri,range:m.nameRange}]}}if(a.kind==="tag-name"&&u&&l?.model.status==="resolved"){let c=l.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(d?.name==="ID"&&l?.tagForm==="generic-node"&&l.model.status==="resolved"){let c=l.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 Jn(e,t){let n=Ue(e,t.position);if(n?.reference.kind==="symbol"){let r=n.reference.symbol;if(r.source.kind==="script-assignment"){let i=r.source,s=Ao(e,n.attributeContext.behaviorTree).find(a=>a.id===i.originId)?.context??n.attributeContext;return{locations:[{uri:e.document.uri,range:fe(e.parsed??{originalText:e.document.text},s.attribute,i.range)}]}}if(r.source.kind==="port-remap"){let i=r.source,o=e.documentView?.nodes.filter(a=>a.behaviorTree===n.attributeContext.behaviorTree).flatMap(a=>a.portBindings).filter(a=>a.declaredPort.status==="resolved").find(a=>a.declaredPort.port.name===i.portName&&a.declaredPort.port.direction===i.direction&&K(a.declaredPort.port.name,a.value)===r.name),s=o?.declaredPort.port.nameRange;if(s)return{locations:[{uri:o.declaredPort.port.uri||e.document.uri,range:s}]}}if(r.source.kind==="subtree-port"){let i=r.source,s=(i.nodeType?H(e.semantic,i.nodeType):void 0)?.ports.find(a=>a.name===i.portName&&a.direction===i.direction);if(s?.nameRange)return{locations:[{uri:s.uri||e.document.uri,range:s.nameRange}]}}}return{locations:Zt(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents)}}function Qn(e,t){return{diagnostics:e.diagnostics,document:e.parsed,partial:e.partial}}function Xo(e,t){let n=st(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:Gt(e.document),newText:n.text}],diagnostics:[]}}function er(e,t){return Xo(t,e.config.formatter)}function $o(e){return[`**Port** \`${e.name}\``,"",`Direction: ${e.direction} `,`Type: \`${e.type||"unknown"}\` `,`Required: ${e.required?"yes":"no"}${e.description?`
|
|
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 ` ` or escape the ampersand as `&`"}),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 ` ` or escape the ampersand as `&`"}),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 ` ` or escape the ampersand as `&`"}),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 ` ` or escape the ampersand as `&`"}),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 `&`, `<`, `>`, `"`, `'`, 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 `&`",help:"replace `&` with `&` 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 `&`",help:"replace `&` with `&` unless this is a valid XML entity"})}}function pt(e){return e.replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/&/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(""")||n.startsWith("'")||n.startsWith("<")||n.startsWith(">")||n.startsWith("&")){let a=n.startsWith(""")?""":n.startsWith("'")?"'":n.startsWith("<")?"<":n.startsWith(">")?">":"&";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 `<`, `>` as `>`, and `&` as `&`"]})}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,"&").replace(/</g,"<").replace(/>/g,">")}function $t(e){return Ft(e).replace(/"/g,""")}function Tl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function vl(e,t,n){return`${" ".repeat(e*n)}${t}`}function $e(e,t,n,r){let o=" ".repeat(t*r),i=e.attributes||[];if(i.length===0)return[`${o}<${e.name}${n}`];if(i.length===1)return[`${o}<${e.name} ${i[0].name}="${$t(i[0].value)}"${n}`];let a=[`${o}<${e.name} ${i[0].name}="${$t(i[0].value)}"`],s=" ".repeat(o.length+1+e.name.length+1);for(let l=1;l<i.length;l+=1){let u=i[l],d=l===i.length-1?n:"";a.push(`${s}${u.name}="${$t(u.value)}"${d}`)}return a}function Xt(e,t,n,r){let o=" ".repeat(t*n);if(e.kind==="comment")return[`${o}<!--${e.text}-->`];if(e.kind==="text"){let d=e.text.trim();return d?[vl(t,Ft(d),n)]:[]}let i=Tl(e.children||[]),a=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),s=(e.children||[]).filter(d=>d.kind==="text").map(d=>d.text).join("").trim(),l=i.some(d=>d.kind==="element"||d.kind==="comment");if(s&&l&&!a&&r.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),s&&!l){if((e.attributes||[]).length<=1){let d=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${$t(e.attributes[0].value)}"`;return[`${o}<${e.name}${d}>${Ft(s)}</${e.name}>`]}return $e(e,t,`>${Ft(s)}</${e.name}>`,n)}if(i.length===0){if(e.selfClosing)return $e(e,t,"/>".slice(0),n);let d=$e(e,t,">",n);return d.push(`${o}</${e.name}>`),d}let u=$e(e,t,">",n);for(let d of e.children||[])d.kind==="text"&&d.text.trim()===""||u.push(...Xt(d,t+1,n,r));return u.push(`${o}</${e.name}>`),u}function hl(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Fo(e,t,n,r){let o=[],i=hl(e);for(let a=0;a<i.length;a+=1){let s=i[a],l=i[a-1],u=i[a+1],d=n&&s.kind==="element"&&s.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",c=s.kind==="element"&&s.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",p=s.kind==="comment"&&u&&u.kind==="element"&&u.name==="TreeNodesModel"&&l!==void 0;(d||c||p)&&o.length>0&&o[o.length-1]!==""&&o.push(""),s.kind==="element"?(o.push(...Xt(s,1,t,r)),s.name==="TreeNodesModel"&&o.push("")):o.push(...Xt(s,1,t,r))}return o}function gt(e,t={}){let n=mt(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(S=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(S.code)))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.document.kind==="generic-xml"&&!t.force)return{ok:!0,skipped:!0,diagnostics:[]};let o=n.document.root,i=qo(t),a=i.indentWidth,s=[],l=n.document.xmlDeclaration!==void 0;if((i.xmlDeclaration==="always"||i.xmlDeclaration==="preserve"&&l)&&s.push('<?xml version="1.0" encoding="UTF-8"?>'),s.push(...$e(o,0,">",a)),s.push(...Fo(o.children||[],a,i.blankLineBetweenBehaviorTrees,n.diagnostics)),s.push(`</${o.name}>`),n.diagnostics.some(S=>S.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let u=`
|
|
10
|
+
`;(i.lineEnding==="crlf"||i.lineEnding==="auto"&&e.includes(`\r
|
|
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?`
|
|
14
15
|
Description: ${e.description}`:""}`].join(`
|
|
15
|
-
`)}function
|
|
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
17
|
|
|
17
|
-
Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function
|
|
18
|
+
Ports: ${e.ports.map(n=>`\`${n.name}\``).join(", ")}`:""}`}function id(e,t){return`**SubTree** \`${e}\`
|
|
18
19
|
|
|
19
20
|
Resolves ambiguously across ${t.length} candidates:
|
|
20
21
|
${t.map(n=>`- \`${n}\``).join(`
|
|
21
|
-
`)}`}function
|
|
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
23
|
|
|
23
|
-
Value: \`${n.reference.value}\``};let u=n.reference.symbol;return{range:n.range,contents:[`**
|
|
24
|
-
`)}}let
|
|
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(`
|
|
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}\`
|
|
25
27
|
|
|
26
|
-
Resolves to \`BehaviorTree ID="${
|
|
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}\`
|
|
27
29
|
|
|
28
|
-
Resolves to SubTree model in \`${u.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(o&&i){let u=e.documentView?_e(e.documentView,t.position):void 0;if(u?.declaredPort.status==="resolved")return{range:o.nameRange,contents:$o(u.declaredPort.port)};let d=se(e.semantic,{element:i,documentRoot:e.parsed?.root,attributeName:o.name,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy});if(d?.status==="resolved")return{range:o.nameRange,contents:$o(d.port)}}let a=e.documentView?Nt(e.documentView,t.position):void 0;if(a&&a.usage.model.status==="resolved"){let u=a.usage.model.model;return{range:a.element.nameRange||a.element.openTagRange,contents:jo(u)}}return i&&s?.model.status==="resolved"?{range:i.nameRange||i.openTagRange,contents:jo(s.model.model)}:{}}function nr(e,t){return Tn(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function Ko(e){let t=new Set,n=[];for(let r of e){let i=`${r.uri}:${r.range.start.offset}:${r.range.end.offset}`;t.has(i)||(t.add(i),n.push(r))}return n}function Ad(e,t){let n=new Set;for(let r of t){let i=bn(e.semantic).find(s=>rr(r,{uri:s.uri,range:s.idRange}));i&&n.add(i.id);let o=Rn(e.semantic).find(s=>s.kind==="SubTree"&&(rr(r,{uri:s.uri,range:s.idRange})||rr(r,{uri:s.uri,range:s.range})));o&&n.add(o.id)}return[...n]}function rr(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function ir(e,t){let n=Ue(e,t.position);if(n)return{locations:Ko(Mo(e,n).map(u=>({uri:e.document.uri,range:u.documentRange})))};let r=e.parsed?G({document:t.document,parsed:e.parsed,position:t.position}):void 0,i=r&&"element"in r?r.element:void 0,o=r&&"attribute"in r?r.attribute:void 0;if(i?.name==="BehaviorTree"&&o?.name==="ID")return{locations:nr(e,o.value)};if(i&&o?.name==="ID"&&L(e.semantic,{element:i,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}).tagForm==="model-definition"&&i.name==="SubTree")return{locations:nr(e,o.value)};let s=Zt(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents);if(s.length===0)return{locations:[]};let a=Ad(e,s);return a.length>0?{locations:Ko(a.flatMap(u=>nr(e,u)))}:{locations:[]}}function Pd(e,t){return e.attributes.find(n=>n.name===t)}function or(e){let t=e.name==="BehaviorTree"?Pd(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(i=>i.kind==="element").map(i=>or(i));return{name:t,detail:e.name,kind:n,range:e.range,selectionRange:e.nameRange||e.openTagRange,children:r.length>0?r:void 0}}function sr(e,t){return e.parsed?.root?{symbols:[or(e.parsed.root)]}:{symbols:[]}}function _d(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function Jt(e={}){return{getDiagnostics(t){return _d(Qn(ie(t,e),t))},getCompletions(t){return Zn(ie(t,e),t)},getHover(t){return tr(ie(t,e),t)},getDefinition(t){return Jn(ie(t,e),t)},getReferences(t){return ir(ie(t,e),t)},getDocumentSymbols(t){return sr(ie(t,e),t)},getCodeActions(t){return $n(ie(t,e),t)},getFormattingEdits(t){return er(ie(t,e),t)}}}var zo={line:0,character:0,offset:0},pt={start:zo,end:zo};function Ld(e){return e?Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>({name:t,value:n??"",range:pt,nameRange:pt,valueRange:pt})):[]}function Od(e,t){return{kind:"element",name:e,attributes:Ld(t),children:[],range:pt,openTagRange:pt,selfClosing:!0}}function Vd(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function ar(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=>ar(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${ar(r)}`).join(",")}}`:JSON.stringify(String(e))}function qd(e){return ar(e)}function Ud(e,t,n,r,i){let o=ie({document:e,workspace:t,config:r,mode:"tolerant"},{});return{document:e,documentVersion:e.version,workspace:t,workspaceVersion:n,configFingerprint:i,diagnostics:{diagnostics:o.diagnostics,partial:o.partial},parsed:o.parsed,semantic:o.semantic,config:o.config,nodeUsagePolicy:o.nodeUsagePolicy}}function Wo(e){let t=e?.root;if(!t)return!1;if(t.name==="BehaviorTree"||t.name==="TreeNodesModel")return!0;let n=t.children.some(o=>o.kind==="element"&&o.name==="BehaviorTree"),r=t.children.some(o=>o.kind==="element"&&o.name==="TreeNodesModel"),i=t.attributes.some(o=>o.name==="BTCPP_format"&&o.value==="4");return t.name==="root"&&(i||n||r)}function Go(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function Yo(e,t){if(!t.startsWith("file://"))return;let n=Go(e),r=Go(Ye(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function ur(e={}){let t=e,n=new Map,r=new Map,i=Jt(),o=[],s=e.config?mn(e.config).config:void 0;function a(){return t.getRuntimeState?.()}function u(){return a()?.workspace}function d(){return a()?.version??0}function l(p,y){let b=u(),k=d(),w=qd(y),_=r.get(p.uri);if(_&&_.documentVersion===p.version&&_.workspaceVersion===k&&_.document===p&&_.workspace===b&&_.configFingerprint===w)return _;let $=Ud(p,b,k,y,w);return r.set(p.uri,$),$}function c(p){if(p.parsed)return p.view||(p.view=Et(p.parsed,p.semantic,{config:p.config,policy:p.nodeUsagePolicy})),p.view}function m(p){return p.models||(p.models=hn(p.semantic)),p.models}function f(p){let y=u();return y?y.documents.some(b=>b.isBtXml&&b.uri===p):!1}function x(p){let y=P.getResolvedConfig();if(!y)return!1;let b=u()?.rootDir??e.configBasePath,k=b?Yo(b,p):void 0;return k!==void 0?Rt(y,k):pn(y,p)}function T(p,y){return p.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Wo(y.parsed)||x(p.uri)||f(p.uri)}function D(p,y){return p.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Wo(y.parsed)||f(p.uri)}function N(p){let y=n.get(p);if(!y)return;let b=P.getEffectiveConfigForDocument(y.uri),k=l(y,b);if(T(y,k))return{document:y,effectiveConfig:b,snapshot:k,emitDiagnostics:D(y,k)}}function E(p,y){let b=n.get(p);if(!b)return{diagnostics:[]};let k=l(b,y),w=c(k);return w?{view:w,diagnostics:k.diagnostics.diagnostics,partial:k.diagnostics.partial}:{diagnostics:k.diagnostics.diagnostics,partial:k.diagnostics.partial}}let P={openDocument(p,y,b=0,k="xml"){n.set(p,yt(p,y,b,k)),r.delete(p)},updateDocument(p,y,b=0,k="xml"){n.set(p,yt(p,y,b,k)),r.delete(p)},closeDocument(p){n.delete(p),r.delete(p)},getResolvedConfig(){return a()?.resolvedConfig??s},getEffectiveConfigForDocument(p){let y=this.getResolvedConfig();if(!y)return;let b=u()?.rootDir??e.configBasePath,k=b?Yo(b,p):void 0;return k!==void 0?ht(y,k):fn(y,p)},getDocument(p){return n.get(p)},getDiagnostics(p){let y=N(p);if(!y||!y.emitDiagnostics)return{diagnostics:[]};let b={diagnostics:y.snapshot.diagnostics.diagnostics};return y.snapshot.diagnostics.partial&&(b.partial=!0),b},getWorkspaceDiagnostics(){return{diagnostics:[...a()?.diagnostics??o]}},getSemanticDocumentView(p){let y=N(p);return y?E(p,y.effectiveConfig):{diagnostics:[]}},getNodeCatalog(p){let y=N(p);return y?{models:m(y.snapshot)}:{models:[]}},getSemanticNode(p,y){let b=N(p);return b?{node:E(p,b.effectiveConfig).view?.nodes.find(w=>w.nodeId===y)}:{}},getNodeUsageAt(p,y){let b=N(p);if(!b)return{};let k=c(b.snapshot);if(!b.snapshot.parsed||!k)return{};let w=Bt(k,y);return w?{node:w,usage:w.usage}:{}},getNodeModelById(p,y){let b=y??n.keys().next().value;return b?{model:this.getNodeCatalog(b).models.find(w=>w.id===p)}:{}},getChildCapability(p,y,b){if(y==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let k=Te(y);if(k==="Control")return{capable:!0,reason:"generic-control"};if(k==="Decorator")return{capable:!0,reason:"generic-decorator"};if(k==="Action"||k==="Condition")return{capable:!1,reason:"generic-leaf"};let w=N(p);if(!w)return{capable:!1,reason:"unknown-model"};let _=L(w.snapshot.semantic,{element:Od(y,b),documentRoot:w.snapshot.parsed?.root,uri:p,config:w.snapshot.config,policy:w.snapshot.nodeUsagePolicy});return _.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:_.nodeType}:{...Vd(_.model.model.kind),modelId:_.model.model.id}},getPortInfoAt(p,y){let b=N(p);if(!b)return{};let k=c(b.snapshot);if(!b.snapshot.parsed||!k)return{};let w=wt(k,y),_=this.getNodeUsageAt(p,y),$=_.node,g=w&&$?se(b.snapshot.semantic,{element:$.usage.element,documentRoot:b.snapshot.parsed.root,attributeName:w.portName,uri:p,config:b.snapshot.config,policy:b.snapshot.nodeUsagePolicy}):void 0;return{node:$,binding:w,port:w?.resolution.status==="resolved"?w.resolution.port:void 0,usage:g,nodeUsage:_.usage}},getFormattingEdits(p){let y=N(p);return y?i.getFormattingEdits({document:y.document,config:y.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(p,y,b){let k=N(p);return k?i.getCompletions({document:k.document,position:y,workspace:u(),triggerCharacter:b,config:k.effectiveConfig}):{items:[]}},getHover(p,y){let b=N(p);return b?i.getHover({document:b.document,position:y,workspace:u(),config:b.effectiveConfig}):{}},getDefinition(p,y){let b=N(p);return b?i.getDefinition({document:b.document,position:y,workspace:u(),config:b.effectiveConfig}):{locations:[]}},getReferences(p,y){let b=N(p);return b?i.getReferences({document:b.document,position:y,workspace:u(),config:b.effectiveConfig}):{locations:[]}},getDocumentSymbols(p){let y=N(p);return y?i.getDocumentSymbols({document:y.document,workspace:u(),config:y.effectiveConfig}):{symbols:[]}},getCodeActions(p,y,b){let k=N(p);return k?i.getCodeActions({document:k.document,range:y,diagnostics:b,workspace:u(),config:k.effectiveConfig}):{actions:[]}},getLanguageService(){return i},dispose(){n.clear(),r.clear(),o.length=0}};return P}function iS(e={}){return ur(e)}export{iS as createBtEditorService,Jt as createLanguageService};
|
|
30
|
+
Resolves to SubTree model in \`${l.model.uri||e.parsed?.uri||"workspace"}\`.`}}if(i&&o){let l=e.documentView?Fe(e.documentView,t.position):void 0;if(l?.declaredPort.status==="resolved")return{range:i.nameRange,contents:ya(l.declaredPort.port)};let u=ue(e.semantic,{element:o,documentRoot:e.parsed?.root,attributeName:i.name,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy});if(u?.status==="resolved")return{range:i.nameRange,contents:ya(u.port)}}let s=e.documentView?Vt(e.documentView,t.position):void 0;if(s&&s.usage.model.status==="resolved"){let l=s.usage.model.model;return{range:s.element.nameRange||s.element.openTagRange,contents:ba(l)}}return o&&a?.model.status==="resolved"?{range:o.nameRange||o.openTagRange,contents:ba(a.model.model)}:{}}function Rr(e,t){return wn(e.semantic,t).filter(n=>n.parentBehaviorTreeId&&n.idRange).map(n=>({uri:n.uri,range:n.idRange})).filter(n=>!!n.range)}function Tr(e){let t=new Set,n=[];for(let r of e){let o=`${r.uri}:${r.range.start.offset}:${r.range.end.offset}`;t.has(o)||(t.add(o),n.push(r))}return n}function sd(e,t){let n=new Set;for(let r of t){let o=Nn(e.semantic).find(a=>vr(r,{uri:a.uri,range:a.idRange}));o&&n.add(o.id);let i=Mn(e.semantic).find(a=>a.kind==="SubTree"&&(vr(r,{uri:a.uri,range:a.idRange})||vr(r,{uri:a.uri,range:a.range})));i&&n.add(i.id)}return[...n]}function vr(e,t){return t.uri===e.uri&&t.range?.start.offset===e.range.start.offset&&t.range?.end.offset===e.range.end.offset}function hr(e,t){let n=Ge(e,t.position);if(n)return{locations:Tr(ea(e,n).map(d=>({uri:d.uri,range:d.documentRange})))};let r=e.parsed?H({document:t.document,parsed:e.parsed,position:t.position}):void 0,o=r&&"element"in r?r.element:void 0,i=r&&"attribute"in r?r.attribute:void 0,s=(e.documentView&&e.parsed?e.documentView.nodes.flatMap(d=>d.portBindings).find(d=>d.attribute===i&&t.position.offset>=(d.attribute.valueContentRange??d.attribute.valueRange).start.offset&&t.position.offset<=(d.attribute.valueContentRange??d.attribute.valueRange).end.offset):void 0)?.blackboardReferences.find(d=>t.position.offset>=d.range.start.offset&&t.position.offset<=d.range.end.offset);if(s){let d=$({scope:s.scope,key:s.key});return{locations:Tr([...s.scope==="global"?mr(e.documentView,e.workspace?.documents,e.semantic,e.config,e.nodeUsagePolicy,d,e.document.uri):fr(e.documentView,d,e.document.uri),...s.scope==="global"?na(e,s.key):[]])}}if(o?.name==="BehaviorTree"&&i?.name==="ID")return{locations:Rr(e,i.value)};if(o&&i?.name==="ID"&&L(e.semantic,{element:o,documentRoot:e.parsed?.root,uri:t.document.uri,config:e.config,policy:e.nodeUsagePolicy}).tagForm==="model-definition"&&o.name==="SubTree")return{locations:Rr(e,i.value)};let l=un(e.parsed,e.documentView,t.position,e.semantic,e.config,e.nodeUsagePolicy,e.workspace?.documents);if(l.length===0)return{locations:[]};let u=sd(e,l);return u.length>0?{locations:Tr(u.flatMap(d=>Rr(e,d)))}:{locations:[]}}function ld(e,t){return e.attributes.find(n=>n.name===t)}function kr(e){let t=e.name==="BehaviorTree"?ld(e,"ID")?.value||"BehaviorTree":e.name,n=e.name==="BehaviorTree"?"Class":e.name==="TreeNodesModel"?"Namespace":e.name==="include"?"File":e.name==="SubTree"?"Reference":["input_port","output_port"].includes(e.name)?"Property":"Function",r=e.children.filter(o=>o.kind==="element").map(o=>kr(o));return{name:t,detail:e.name,kind:n,range:e.range,selectionRange:e.nameRange||e.openTagRange,children:r.length>0?r:void 0}}function xr(e,t){return e.parsed?.root?{symbols:[kr(e.parsed.root)]}:{symbols:[]}}function ud(e){return{diagnostics:e.diagnostics,partial:e.partial||void 0}}function dn(e={}){return{getDiagnostics(t){return ud(yr(le(t,e),t))},getCompletions(t){return cr(le(t,e),t)},getHover(t){return Sr(le(t,e),t)},getDefinition(t){return gr(le(t,e),t)},getReferences(t){return hr(le(t,e),t)},getDocumentSymbols(t){return xr(le(t,e),t)},getCodeActions(t){return tr(le(t,e),t)},getFormattingEdits(t){return br(le(t,e),t)}}}var Sa={line:0,character:0,offset:0},kt={start:Sa,end:Sa};function dd(e){return e?Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>({name:t,value:n??"",range:kt,nameRange:kt,valueRange:kt})):[]}function cd(e,t){return{kind:"element",name:e,attributes:dd(t),children:[],range:kt,openTagRange:kt,selfClosing:!0}}function pd(e){return{capable:e==="Control"||e==="Decorator",reason:"model-kind",kind:e}}function Ir(e){return e===null?"null":e===void 0?"undefined":typeof e=="string"?JSON.stringify(e):typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`[${e.map(t=>Ir(t)).join(",")}]`:typeof e=="object"?`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Ir(r)}`).join(",")}}`:JSON.stringify(String(e))}function md(e){return Ir(e)}function fd(e,t,n,r,o){let i=le({document:e,workspace:t,config:r,mode:"tolerant"},{});return{document:e,documentVersion:e.version,workspace:t,workspaceVersion:n,configFingerprint:o,diagnostics:{diagnostics:i.diagnostics,partial:i.partial},parsed:i.parsed,semantic:i.semantic,config:i.config,nodeUsagePolicy:i.nodeUsagePolicy}}function Ra(e){let t=e?.root;if(!t)return!1;if(t.name==="BehaviorTree"||t.name==="TreeNodesModel")return!0;let n=t.children.some(i=>i.kind==="element"&&i.name==="BehaviorTree"),r=t.children.some(i=>i.kind==="element"&&i.name==="TreeNodesModel"),o=t.attributes.some(i=>i.name==="BTCPP_format"&&i.value==="4");return t.name==="root"&&(o||n||r)}function Ta(e){return e.replaceAll("\\","/").replace(/\/$/,"")}function va(e,t){if(!t.startsWith("file://"))return;let n=Ta(e),r=Ta(rt(t));if(r===n)return"";if(r.startsWith(`${n}/`))return r.slice(n.length+1)}function Cr(e={}){let t=e,n=new Map,r=new Map,o=dn(),i=[],a=e.config?xn(e.config).config:void 0;function s(){return t.getRuntimeState?.()}function l(){return s()?.workspace}function u(){return s()?.version??0}function d(f,y){let R=l(),I=u(),w=md(y),_=r.get(f.uri);if(_&&_.documentVersion===f.version&&_.workspaceVersion===I&&_.document===f&&_.workspace===R&&_.configFingerprint===w)return _;let V=fd(f,R,I,y,w);return r.set(f.uri,V),V}function c(f){if(f.parsed)return f.view||(f.view=Ot(f.parsed,f.semantic,{config:f.config,policy:f.nodeUsagePolicy})),f.view}function p(f){return f.models||(f.models=Pn(f.semantic)),f.models}function m(f){let y=l();return y?y.documents.some(R=>R.isBtXml&&R.uri===f):!1}function x(f){let y=E.getResolvedConfig();if(!y)return!1;let R=l()?.rootDir??e.configBasePath,I=R?va(R,f):void 0;return I!==void 0?Nt(y,I):In(y,f)}function S(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Ra(y.parsed)||x(f.uri)||m(f.uri)}function D(f,y){return f.languageId==="btcpp-xml"||y.parsed?.isBtXml===!0||Ra(y.parsed)||m(f.uri)}function A(f){let y=n.get(f);if(!y)return;let R=E.getEffectiveConfigForDocument(y.uri),I=d(y,R);if(S(y,I))return{document:y,effectiveConfig:R,snapshot:I,emitDiagnostics:D(y,I)}}function h(f,y){let R=n.get(f);if(!R)return{diagnostics:[]};let I=d(R,y),w=c(I);return w?{view:w,diagnostics:I.diagnostics.diagnostics,partial:I.diagnostics.partial}:{diagnostics:I.diagnostics.diagnostics,partial:I.diagnostics.partial}}let E={openDocument(f,y,R=0,I="xml"){n.set(f,Ve(f,y,R,I)),r.delete(f)},updateDocument(f,y,R=0,I="xml"){n.set(f,Ve(f,y,R,I)),r.delete(f)},closeDocument(f){n.delete(f),r.delete(f)},getResolvedConfig(){return s()?.resolvedConfig??a},getEffectiveConfigForDocument(f){let y=this.getResolvedConfig();if(!y)return;let R=l()?.rootDir??e.configBasePath,I=R?va(R,f):void 0;return I!==void 0?wt(y,I):Cn(y,f)},getDocument(f){return n.get(f)},getDiagnostics(f){let y=A(f);if(!y||!y.emitDiagnostics)return{diagnostics:[]};let R={diagnostics:y.snapshot.diagnostics.diagnostics};return y.snapshot.diagnostics.partial&&(R.partial=!0),R},getWorkspaceDiagnostics(){return{diagnostics:[...s()?.diagnostics??i]}},getSemanticDocumentView(f){let y=A(f);return y?h(f,y.effectiveConfig):{diagnostics:[]}},getNodeCatalog(f){let y=A(f);return y?{models:p(y.snapshot)}:{models:[]}},getSemanticNode(f,y){let R=A(f);return R?{node:h(f,R.effectiveConfig).view?.nodes.find(w=>w.nodeId===y)}:{}},getNodeUsageAt(f,y){let R=A(f);if(!R)return{};let I=c(R.snapshot);if(!R.snapshot.parsed||!I)return{};let w=Ut(I,y);return w?{node:w,usage:w.usage}:{}},getNodeModelById(f,y){let R=y??n.keys().next().value;return R?{model:this.getNodeCatalog(R).models.find(w=>w.id===f)}:{}},getChildCapability(f,y,R){if(y==="BehaviorTree")return{capable:!0,reason:"behavior-tree"};let I=xe(y);if(I==="Control")return{capable:!0,reason:"generic-control"};if(I==="Decorator")return{capable:!0,reason:"generic-decorator"};if(I==="Action"||I==="Condition")return{capable:!1,reason:"generic-leaf"};let w=A(f);if(!w)return{capable:!1,reason:"unknown-model"};let _=L(w.snapshot.semantic,{element:cd(y,R),documentRoot:w.snapshot.parsed?.root,uri:f,config:w.snapshot.config,policy:w.snapshot.nodeUsagePolicy});return _.model.status!=="resolved"?{capable:!1,reason:"unknown-model",modelId:_.nodeType}:{...pd(_.model.model.kind),modelId:_.model.model.id}},getPortInfoAt(f,y){let R=A(f);if(!R)return{};let I=c(R.snapshot);if(!R.snapshot.parsed||!I)return{};let w=qt(I,y),_=this.getNodeUsageAt(f,y),V=_.node,Ae=w&&V?ue(R.snapshot.semantic,{element:V.usage.element,documentRoot:R.snapshot.parsed.root,attributeName:w.portName,uri:f,config:R.snapshot.config,policy:R.snapshot.nodeUsagePolicy}):void 0;return{node:V,binding:w,port:w?.resolution.status==="resolved"?w.resolution.port:void 0,usage:Ae,nodeUsage:_.usage}},getFormattingEdits(f){let y=A(f);return y?o.getFormattingEdits({document:y.document,config:y.effectiveConfig}):{edits:[],diagnostics:[]}},getCompletions(f,y,R){let I=A(f);return I?o.getCompletions({document:I.document,position:y,workspace:l(),triggerCharacter:R,config:I.effectiveConfig}):{items:[]}},getHover(f,y){let R=A(f);return R?o.getHover({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{}},getDefinition(f,y){let R=A(f);return R?o.getDefinition({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getReferences(f,y){let R=A(f);return R?o.getReferences({document:R.document,position:y,workspace:l(),config:R.effectiveConfig}):{locations:[]}},getDocumentSymbols(f){let y=A(f);return y?o.getDocumentSymbols({document:y.document,workspace:l(),config:y.effectiveConfig}):{symbols:[]}},getCodeActions(f,y,R){let I=A(f);return I?o.getCodeActions({document:I.document,range:y,diagnostics:R,workspace:l(),config:I.effectiveConfig}):{actions:[]}},getLanguageService(){return o},dispose(){n.clear(),r.clear(),i.length=0}};return E}function zb(e={}){return Cr(e)}export{zb as createBtEditorService,dn as createLanguageService};
|