@abco20/btxml-checker 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +42 -29
- package/dist/editor-node.js +21 -21
- package/dist/editor.js +19 -19
- package/dist/index.d.ts +30 -0
- package/dist/index.js +7 -7
- package/dist/rules.d.ts +9 -3
- package/dist/rules.js +4 -4
- package/dist/server.cjs +323 -95
- package/dist/server.cjs.map +1 -1
- package/package.json +1 -1
- package/schemas/btxml.config.schema.json +2 -0
package/dist/cli.js
CHANGED
|
@@ -1,35 +1,48 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{hideBin as Bm}from"yargs/helpers";import _m from"yargs/yargs";import{z as sn}from"zod";var u={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"},Ql=Object.values(u).sort();var ed=sn.object({subTreePorts:sn.enum(["loose","strict"]).optional()}).strict(),td=sn.object({allowStringEntryCompatibility:sn.boolean().optional()}).strict(),W={"script/valid-syntax":{code:u.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:u.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:u.AssignmentToUnknownVariable,codes:[u.AssignmentToUnknownVariable,u.InvalidCompoundAssignment,u.ScriptVariableTypeMismatch,u.InvalidGlobalBlackboardIdentifier],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:u.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:u.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:u.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:u.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:u.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:u.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:u.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:u.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:u.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:u.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:u.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:u.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:u.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:u.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:u.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:u.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:u.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:u.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:u.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:u.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:u.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:u.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:u.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:u.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:u.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:u.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:u.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:u.UnknownPort,defaultSeverity:"warn",optionsSchema:ed,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:u.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:u.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:td,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:u.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:u.OutputPortRequiresRemap,defaultSeverity:"warn",description:"Resolved output ports must write to a blackboard remap."},"model/no-childless-control-shape-mismatch":{code:u.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:u.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:u.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:u.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"model/no-conflicting-kind-for-id":{code:u.ConflictingModelKind,defaultSeverity:"error",description:"A model ID must not be defined with different kinds."},"model/no-unused-definition":{code:u.UnusedModelDefinition,defaultSeverity:"error",description:"Inline model definitions should be used in the same BT XML file."},"model/no-duplicate-definition":{code:u.DuplicateModelDefinition,defaultSeverity:"error",description:"A user-defined model (ID, kind) should be defined only once."},"suppression/no-unused":{code:u.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:u.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var an=["off","info","warn","error"];var Li={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"}}},nd={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 Qn(){return structuredClone(nd)}function It(e,t){return{files:t.files?{...e.files,...t.files}:e.files,resolver:t.resolver?{...e.resolver,...t.resolver,includes:{...e.resolver.includes,...t.resolver.includes||{},variables:{...e.resolver.includes.variables,...t.resolver.includes?.variables||{}}}}:e.resolver,models:t.models?{...e.models,...t.models}:e.models,linter:t.linter?{...e.linter,...t.linter,rules:t.linter.rules?{...e.linter.rules,...t.linter.rules}:e.linter.rules,suppressions:t.linter.suppressions?{...e.linter.suppressions,...t.linter.suppressions}:e.linter.suppressions}:e.linter,formatter:t.formatter?{...e.formatter,...t.formatter}:e.formatter,overrides:t.overrides?[...e.overrides,...t.overrides]:e.overrides}}var h={Error:"error",Warning:"warning",Info:"info"};function T(e,t,n,o,i="",r,s){return{code:e,severity:t,message:n,uri:i,...o?{range:o}:{},...r?{details:r}:{},...s?{data:s}:{}}}function dt(e,t,n){return{line:e,character:t,offset:n}}function I(e,t){return{start:e,end:t}}function Ct(e,t){return[...t].sort((n,o)=>o.range.start.offset-n.range.start.offset).reduce((n,o)=>n.slice(0,o.range.start.offset)+o.newText+n.slice(o.range.end.offset),e)}var od=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function eo(e){return{ok:!0,reference:e}}function _e(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function Oi(e){return od.test(e)}function Ui(e){if(!e)return _e("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?Oi(t)?{ok:!0,scope:"global",key:t}:_e("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):_e("empty-key",e,"Global blackboard reference key must not be empty")}return Oi(e)?{ok:!0,scope:"local",key:e}:_e("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function Z(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return eo({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return _e("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return _e("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let o=n.slice(1,-1).trim(),i=Ui(o);return i.ok?eo({scope:i.scope,key:i.key,raw:n,syntax:"braced"}):i}function ln(e){let{rawName:t}=e;if(!t.startsWith("@"))return _e("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Ui(t);return n.ok?n.scope!=="global"?_e("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):eo({scope:n.scope,key:n.key,raw:t,syntax:"script"}):n}function dn(e){return e.scope==="global"?`{@${e.key}}`:`{${e.key}}`}function Ee(e){return`${e.scope}:${e.key}`}var id={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function rd(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function se(e,t){return e.attributes.find(n=>n.name===t)}function sd(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function ad(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function ld(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function $i(e,t){let n=e.line,o=e.character,i=e.offset;for(let r of t){if(i+=r.length,r===`
|
|
3
|
-
`){n+=1,o=0;continue}o+=r.length}return{line:n,character:o,offset:i}}function
|
|
4
|
-
`||t==="\r")return"port names must not contain whitespace";let o=Dd.get(t);if(o)return o}}function Wi(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 Et(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,o])=>Wi(n,o))}}var Td=[{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"]}],Nt=new Map,Ki=new Map;for(let e of Td){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};Ki.set(e.name,t),Nt.set(e.name,e.name);for(let n of e.aliases)Nt.set(n,e.name)}function Id(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 io(e){return Nt.get(e)??e}function Cd(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 Mt(e){return Nt.get(e)}function ct(e=[]){let t=new Map,n=new Map(Nt);for(let o of Ki.values())t.set(o.canonical,{name:o.name,kind:o.kind,canonical:o.canonical,aliases:new Set([o.name,o.canonical,...o.aliases]),compatibleWith:new Set(o.compatibleWith),validate:o.validate,source:o.source});for(let o of e)for(let[i,r]of Object.entries(o.types??{})){let s=io(r.canonical??i),l=t.get(s)??Id(i,s,r);l.name=i,l.kind=r.kind,l.canonical=s,l.source="augmentation",l.validate=r.validate??l.validate,l.aliases.add(i),l.aliases.add(s);for(let d of r.aliases??[])l.aliases.add(d);for(let d of r.compatibleWith??[])l.compatibleWith.add(d);t.set(s,l),n.set(i,s),n.set(s,s);for(let d of r.aliases??[])n.set(d,s)}for(let o of t.values())o.compatibleWith=new Set([...o.compatibleWith].map(i=>n.get(i)??io(i))),o.compatibleWith.delete(o.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([o,i])=>[o,Cd(i)])),namesToCanonical:n}}function fe(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??io(t),o=e.entriesByCanonical.get(n);return o||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function cn(e,t){return fe(e,t)?.canonical}function wt(e,t,n){let o=fe(e,t),i=fe(e,n);return!o||!i?!1:o.kind==="any"||i.kind==="any"||o.canonical===i.canonical?!0:o.compatibleWith.includes(i.canonical)||i.compatibleWith.includes(o.canonical)}var Hi=[{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:[]}],Ji={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 Yi=[{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:[]}],Zi={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 Qi=[{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:[]}],er={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 tr=["4.6.2","4.8.2","4.9.0"],ro="4.9.0",Pt={"4.6.2":{models:Hi,genericSubTreeModel:Ji},"4.8.2":{models:Yi,genericSubTreeModel:Zi},"4.9.0":{models:Qi,genericSubTreeModel:er}};var nr=tr.map(e=>`btcpp-v${e}`),Bt=["btcpp-v4",...nr],or=`btcpp-v${ro}`;function ir(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 Ed(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(ir)}))}function rr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(ir)}}function Nd(){let e={};for(let[t,n]of Object.entries(Pt))e[`btcpp-v${t}`]=Ed(n.models);return e}function Md(){let e={};for(let[t,n]of Object.entries(Pt))e[`btcpp-v${t}`]=rr(n.genericSubTreeModel);return e}var wd=Nd(),Pd=Md();function Bd(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(Pt,t)}function sr(e){return e==="btcpp-v4"?or:e}function _d(e){return e==="btcpp-v4"?ro:e.replace(/^btcpp-v/,"")}function ar(e){if(e&&e!=="btcpp-v4"&&!Bd(e))throw new Error(`unsupported builtin model set: ${e}`)}function so(e="btcpp-v4"){ar(e);let t=sr(e);return wd[t].map(o=>lr(o))}function ao(e="btcpp-v4"){ar(e);let t=Pd[sr(e)]??rr(Pt[_d(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function lr(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 _t(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let o=t.name.localeCompare(n.name);if(o!==0)return o;let i=t.direction.localeCompare(n.direction);if(i!==0)return i;let r=(t.type??"").localeCompare(n.type??"");if(r!==0)return r;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 ut(e,t){let n=_t(e),o=_t(t);return JSON.stringify(n)===JSON.stringify(o)}function lo(e,t){if(ut(e,t))return"none";let n=_t(e),o=_t(t);if(n.kind!==o.kind)return"kind";if(n.ports.length!==o.ports.length)return"ports";let i=new Map(o.ports.map(a=>[a.name,a])),r=!1,s=!1;for(let a of n.ports){let l=i.get(a.name);if(!l){s=!0;continue}(a.direction!==l.direction||a.type!==l.type||a.required!==l.required)&&(s=!0);let d=a.enum?JSON.stringify(a.enum):"",c=l.enum?JSON.stringify(l.enum):"";d!==c&&(s=!0),a.description!==l.description&&(s=!0),a.defaultValue!==l.defaultValue&&(r=!0)}return s?"ports":r?"port-default":"mixed"}import{findNodeAtLocation as Ud,parse as $d,parseTree as qd}from"jsonc-parser";import{z as N}from"zod";var dr=N.discriminatedUnion("kind",[N.object({kind:N.literal("pattern"),pattern:N.string()}).strict(),N.object({kind:N.literal("enum"),values:N.array(N.string())}).strict(),N.object({kind:N.literal("tuple"),separator:N.string(),items:N.array(N.string())}).strict(),N.object({kind:N.literal("json-schema"),schema:N.unknown()}).strict()]),Ad=N.object({kind:N.enum(["primitive","opaque","any"]),canonical:N.string().optional(),aliases:N.array(N.string()).optional(),compatibleWith:N.array(N.string()).optional(),validate:dr.optional()}).strict(),jd=N.object({from:N.string().optional(),to:N.string()}).strict(),Fd=N.object({typeRefinement:jd.optional(),validate:dr.optional(),required:N.boolean().optional(),enum:N.array(N.string()).optional(),description:N.string().optional()}).strict(),Ld=N.object({ports:N.record(N.string(),Fd).optional()}).strict(),Od=N.object({enums:N.record(N.string(),N.number().finite()).optional()}).strict(),cr=N.object({version:N.literal(1),types:N.record(N.string(),Ad).optional(),augment:N.record(N.string(),Ld).optional(),script:Od.optional()}).strict();function Vd(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
5
|
-
`&&t.push(n+1);return n=>{let o=0,i=t.length-1;for(;o<=i;){let s=Math.floor((o+i)/2);t[s]<=n?o=s+1:i=s-1}let r=Math.max(0,o-1);return{line:r,character:n-t[r],offset:n}}}function Xd(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function ur(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function Gd(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...ur(e.path),t]}return ur(e.path)}function zd(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;return{message:`Unrecognized key: "${t??""}"`,path:[...e.path,t].filter(n=>n!==void 0).join(".")}}return{message:e.message,path:e.path.length>0?e.path.join("."):void 0}}function co(e,t){let n=t?.uri??"",o=[],i=qd(e,o,{allowTrailingComma:!0,disallowComments:!1});try{let r=$d(e,o,{allowTrailingComma:!0,disallowComments:!1});if(o.length>0||!i)throw new Error(`JSON parse error at offset ${o[0]?.offset??0}`);let s=cr.safeParse(r);if(!s.success){let a=Vd(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let d=Gd(l),{message:c,path:p}=zd(l);return{kind:"schema",message:c,path:p,range:Xd(Ud(i,d),a),notes:p?[p]:void 0}})}}return{ok:!0,data:{...s.data,uri:n,path:t?.path},issues:[],uri:n,path:t?.path}}catch(r){return{ok:!1,uri:n,path:t?.path,issues:[{kind:"json",message:"the file could not be parsed as JSON",notes:[String(r.message||r)]}]}}}import{z as X}from"zod";var pr=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(),un=X.object({kind:X.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:X.record(X.string(),pr).optional(),description:X.string().optional()}).strict(),uo=X.object({nodes:X.record(X.string(),un)}).strict();import{z as k}from"zod";var mr=k.enum(["off","info","warn","error"]),fr=k.union([mr,k.tuple([mr,k.record(k.string(),k.unknown())])]),Wd=k.object({include:k.array(k.string()).optional(),ignore:k.array(k.string()).optional(),useGitignore:k.boolean().optional(),followSymlinks:k.boolean().optional(),maxSize:k.number().int().positive().optional()}).strict(),Kd=k.string(),Hd=k.object({name:k.string(),attribute:k.string(),base:k.enum(["file","project-root"]).optional()}).strict(),Jd=k.object({elements:k.array(Hd).optional(),variables:k.record(k.string(),k.string()).optional(),allowOutsideRoot:k.boolean().optional(),maxDepth:k.number().int().min(1).optional(),maxFiles:k.number().int().min(1).optional()}).strict(),Yd=k.object({entrypoints:k.array(Kd).optional(),includes:Jd.optional(),behaviorTreeIds:k.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),Zd=k.enum(["allow-unused","used-only","single-source"]),Qd=k.object({builtins:k.array(k.enum(Bt)).optional(),files:k.array(k.string()).optional(),augmentations:k.array(k.string()).optional(),definitions:k.array(k.string()).optional(),inline:k.record(k.string(),un).optional(),convention:Zd.optional()}).strict(),gr=k.object({inline:k.enum(["allow","deny"]).optional()}).strict(),ec=k.object({enabled:k.boolean().optional(),rules:k.record(k.string(),fr).optional(),baseline:k.string().optional(),suppressions:gr.optional()}).strict(),tc=k.object({rules:k.record(k.string(),fr).optional(),suppressions:gr.optional()}).strict(),yr=k.object({indentWidth:k.number().int().min(1).max(8).optional(),xmlDeclaration:k.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:k.boolean().optional(),lineEnding:k.enum(["lf","crlf","auto"]).optional()}).strict(),nc=k.object({files:k.array(k.string()),linter:tc.optional(),formatter:yr.optional()}).strict(),hr=k.object({$schema:k.string().optional(),strict:k.boolean().optional(),files:Wd.optional(),resolver:Yd.optional(),models:Qd.optional(),linter:ec.optional(),formatter:yr.optional(),overrides:k.array(nc).optional()}).strict();function Sr(e){return e.flatMap(oc)}function oc(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(i=>{let r=br([...e.path,String(i)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:r,message:`unknown config field \`${r}\``}});let n=br(e.path);return xr(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 br(e){return e.map(String).join(".")||void 0}function xr(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(vr);let o=e.unionErrors;return Array.isArray(o)?o.flatMap(i=>i.issues??[]).some(vr):!1}function vr(e){return typeof e=="object"&&e!==null&&xr(e)}function pt(e){let t=hr.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:Sr(t.error.issues)}}function ic(e){if(!e)return;let t={};return e.indentWidth!==void 0&&(t.indentWidth=e.indentWidth),e.xmlDeclaration!==void 0&&(t.xmlDeclaration=e.xmlDeclaration),e.blankLineBetweenBehaviorTrees!==void 0&&(t.blankLineBetweenBehaviorTrees=e.blankLineBetweenBehaviorTrees),e.lineEnding!==void 0&&(t.lineEnding=e.lineEnding),t}function rc(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 sc(e){return e.map(t=>T(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function ac(e){let t=[],n=Qn(),{$schema:o,strict:i,overrides:r,...s}=e;i&&(n=It(n,Li)),n=It(n,s),n.overrides=(r??[]).map(l=>({files:l.files,linter:rc(l.linter),formatter:ic(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function pn(e){let t=pt(e);return t.ok?ac(t.value):{ok:!1,config:Qn(),diagnostics:sc(t.diagnostics)}}var lc="https://unpkg.com/@abco20/btxml-checker/schemas/btxml.config.schema.json";function mn(){return{$schema:lc}}function dc(e){let t="",n=0;for(;n<e.length;)e.slice(n,n+3)==="/**"&&(n+3===e.length||e[n+3]==="/")?n+3===e.length?(t+="(?:/.*)?",n+=3):(t+="(?:/.*)?/",n+=4):n===0&&e.slice(n,n+3)==="**/"?(t+="(?:.*/)?",n+=3):e.slice(n,n+2)==="**"?(t+=".*",n+=2):e[n]==="*"?(t+="[^/]*",n+=1):e[n]==="?"?(t+="[^/]",n+=1):(t+=e[n].replace(/[.+^${}()|[\]\\]/g,"\\$&"),n+=1);return new RegExp(`^${t}$`)}function cc(e,t){let n=e.replace(/\\/g,"/"),o=t.startsWith("!"),i=o?t.slice(1):t,s=dc(i).test(n);return o?!s:s}function kr(e,t){return e.overrides.filter(n=>n.files.some(o=>cc(t,o)))}function uc(e){return e.replaceAll("\\","/")}function Q(e,t){let n=uc(t),o=kr(e,n),i=e;for(let r of o)i=It(i,{linter:r.linter,formatter:r.formatter});return{files:i.files,resolver:i.resolver,models:i.models,linter:i.linter,formatter:i.formatter}}function be(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 po(e){return e in W}function mo(e){for(let[t,n]of Object.entries(W)){let o=n;if(o.code===e||o.codes?.includes(e))return t}}function Ne(e){if(typeof e=="string")return an.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&an.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let o={severity:t};return n!==void 0&&(o.options=n),o}}return null}function Ke(e,t){let n=e[t];if(n!==void 0){let o=Ne(n);if(o)return o.severity}return W[t].defaultSeverity}function fo(e,t){let n=[],i=W[e].optionsSchema;if(!i)return n;let r=i.safeParse(t);if(r.success)return n;for(let s of r.error.issues)n.push(...mc(e,s));return n}function mc(e,t){if(t.code==="unrecognized_keys")return t.keys.map(o=>T("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(o)}\` for rule \`${e}\``,void 0,void 0,{help:Rr(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[T("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:Rr(e)})]}function Rr(e){let n=W[e].options?.map(o=>o.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function go(e){let t=[];Dr(e.linter,"linter.rules",t);for(let[n,o]of(e.overrides??[]).entries())Dr(o.linter,`overrides.${n}.linter.rules`,t);return t}function Dr(e,t,n){for(let[o,i]of Object.entries(e?.rules??{})){let r=`${t}.${o}`;if(!po(o)){n.push({code:"CFG010_UNKNOWN_RULE",severity:"error",path:r,message:`unknown lint rule \`${o}\``,help:"see docs/rules.md for a list of valid rule names"});continue}let s=Ne(i);if(s?.options)for(let a of fo(o,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:fc(r,s.options,a.message),message:a.message,help:a.details?.help})}}function fc(e,t,n){let o=Object.keys(t).find(i=>n.includes(`\`${i}\``));return o?`${e}.1.${o}`:`${e}.1`}var j=(e,t,n,o=!0)=>({code:e,title:t,description:n,suppressible:o}),gc={[u.InvalidScriptSyntax]:{code:u.InvalidScriptSyntax,title:"Invalid script syntax",description:"Script-bearing attributes must parse as valid BT.CPP scripts.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf="A +"/>',validExample:'<AlwaysSuccess _successIf="A == 1"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.EmptyScript]:{code:u.EmptyScript,title:"Empty script",description:"Script-bearing attributes must not be empty.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf=""/>',validExample:'<AlwaysSuccess _successIf="true"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.InvalidScriptToken]:{code:u.InvalidScriptToken,title:"Invalid script token",description:"Script-bearing attributes must not contain invalid BT.CPP tokens.",suppressible:!0,invalidExample:'<Script code="0x"/>',validExample:'<Script code="value := 0x10"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.UnknownScriptVariable]:{code:u.UnknownScriptVariable,title:"Unknown script variable",description:"Script-bearing attributes should not read blackboard or local variables that were never introduced.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf="missing == 1"/>',validExample:'<Script code="count := 1; done = count"/>',configExample:'{"linter":{"rules":{"script/no-unknown-variable":"warn"}}}'},[u.AssignmentToUnknownVariable]:{code:u.AssignmentToUnknownVariable,title:"Assignment to unknown script variable",description:"Assignments with `=` or compound operators must target an existing script or blackboard variable.",suppressible:!0,invalidExample:'<Script code="count = 1"/>',validExample:'<Script code="count := 1; count = 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidCompoundAssignment]:{code:u.InvalidCompoundAssignment,title:"Invalid compound assignment",description:"Compound assignment operators must be used with supported operand types (`number` or `string` for `+=`, numbers only otherwise).",suppressible:!0,invalidExample:'<Script code="name := "x"; name -= 1"/>',validExample:'<Script code="count := 1; count += 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidScriptOperandType]:{code:u.InvalidScriptOperandType,title:"Invalid script operand type",description:"Script operators and ternary conditions must be applied to operands with compatible inferred types.",suppressible:!0,invalidExample:`<AlwaysSuccess _successIf="'x' * 2"/>`,validExample:'<AlwaysSuccess _successIf="count * 2 > 0"/>',configExample:'{"linter":{"rules":{"script/valid-expression-type":"error"}}}'},[u.ScriptResultNotBoolCompatible]:{code:u.ScriptResultNotBoolCompatible,title:"Script result is not bool-compatible",description:"Condition-style script attributes must end in an inferred bool-compatible result type.",suppressible:!0,invalidExample:`<AlwaysSuccess _successIf="'hello'"/>`,validExample:'<AlwaysSuccess _successIf="true"/>',configExample:'{"linter":{"rules":{"script/valid-result-type":"error"}}}'},[u.ScriptVariableTypeMismatch]:{code:u.ScriptVariableTypeMismatch,title:"Script variable type mismatch",description:"Script assignments must not write an incompatible inferred type into an existing variable.",suppressible:!0,invalidExample:'<Script code="count := 1; count = "x""/>',validExample:'<Script code="count := 1; count = 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidGlobalBlackboardIdentifier]:{code:u.InvalidGlobalBlackboardIdentifier,title:"Invalid global blackboard identifier",description:"Script global blackboard identifiers must use `@name` with a valid blackboard key after the scope marker.",suppressible:!0,invalidExample:'<Script code="@ := 1"/>',validExample:'<Script code="@count := 1"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidRootElement]:j(u.InvalidRootElement,"Invalid root element","Root element must be <root>.",!1),[u.MissingBTCPPFormat]:j(u.MissingBTCPPFormat,"Missing BTCPP format",'Root element must declare BTCPP_format="4".',!1),[u.MissingBehaviorTreeID]:j(u.MissingBehaviorTreeID,"Missing BehaviorTree ID","BehaviorTree elements require an ID attribute.",!1),[u.DuplicateBehaviorTreeID]:j(u.DuplicateBehaviorTreeID,"Duplicate BehaviorTree ID","BehaviorTree IDs must be unique within a file.",!1),[u.UnknownSubTree]:{code:u.UnknownSubTree,title:"Unknown SubTree reference",description:"A SubTree must resolve to a BehaviorTree or a configured model.",suppressible:!0,invalidExample:'<SubTree ID="missing_tree"/>',validExample:'<BehaviorTree ID="missing_tree"><Sequence/></BehaviorTree>',fix:"Define the BehaviorTree, add an external TreeNodesModel file, or add a nodes config entry.",configExample:'{"linter":{"rules":{"tree/no-unknown-subtree":"warn"}}}'},[u.DuplicateNodeModelId]:j(u.DuplicateNodeModelId,"Duplicate node model ID in TreeNodesModel","TreeNodesModel elements must have unique IDs within the same model block.",!1),[u.MissingPortName]:j(u.MissingPortName,"Missing port name","Port elements require a name attribute.",!1),[u.DuplicatePortName]:j(u.DuplicatePortName,"Duplicate port name","Ports with the same name are not allowed.",!1),[u.InvalidPortName]:{code:u.InvalidPortName,title:"Invalid port name",description:"Port names must be valid XML attribute names for BT nodes.",suppressible:!1,invalidExample:'<input_port name="request.name" type="string"/>',validExample:'<input_port name="request_name" type="string"/>',fix:"Rename the port so it does not use reserved names, leading digits, whitespace, control characters, or XML/path punctuation.",configExample:'{"linter":{"rules":{"model/valid-port-name":"warn"}}}'},[u.UnknownTopLevelElement]:j(u.UnknownTopLevelElement,"Unknown top-level element","Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements.",!1),[u.UnknownMainTree]:j(u.UnknownMainTree,"Unknown main tree","main_tree_to_execute must reference a known BehaviorTree.",!1),[u.AmbiguousSubTree]:j(u.AmbiguousSubTree,"Ambiguous SubTree","SubTree references must resolve to a single definition.",!1),[u.ConflictingNodeModel]:{code:u.ConflictingNodeModel,title:"Conflicting node model",description:"Node model definitions must agree on kind and port shape.",suppressible:!1,fix:"Run `btxmlc repair` to inspect conflicts. Run `btxmlc repair --write` to resolve the conflict interactively."},[u.ConflictingModelKind]:{code:u.ConflictingModelKind,title:"Conflicting model kind for ID",description:"The same model ID must not be defined with different node kinds.",suppressible:!1,invalidExample:'<TreeNodesModel><Action ID="Foo"/><Condition ID="Foo"/></TreeNodesModel>',validExample:'<TreeNodesModel><Action ID="Foo"/></TreeNodesModel>'},[u.UnusedModelDefinition]:{code:u.UnusedModelDefinition,title:"Unused inline model definition",description:"When models.convention is used-only, inline Action/Condition/Decorator/Control definitions must be used in the same file.",suppressible:!1,invalidExample:'<root BTCPP_format="4"><BehaviorTree ID="Main"><Run/></BehaviorTree><TreeNodesModel><Action ID="Run"/><Action ID="Unused"/></TreeNodesModel></root>',validExample:'<root BTCPP_format="4"><BehaviorTree ID="Main"><Run/></BehaviorTree><TreeNodesModel><Action ID="Run"/></TreeNodesModel></root>',fix:"Run `btxmlc lint --fix` to remove unused inline model definitions when safe."},[u.DuplicateModelDefinition]:{code:u.DuplicateModelDefinition,title:"Duplicate model definition",description:"When models.convention is single-source, each user-defined (ID, kind) model definition should appear only once.",suppressible:!1,invalidExample:`<!-- a.xml --><TreeNodesModel><Action ID="Move"/></TreeNodesModel>
|
|
6
|
-
<!-- b.xml --><TreeNodesModel><Action ID="Move"/></TreeNodesModel>`,validExample:'<TreeNodesModel><Action ID="Move"/></TreeNodesModel>',fix:"Run `btxmlc lint --fix` to delete non-canonical duplicates when safe."},[u.DuplicateBehaviorTreeIdInWorkspace]:{code:u.DuplicateBehaviorTreeIdInWorkspace,title:"Duplicate BehaviorTree ID in workspace",description:"BehaviorTree IDs must be unique across the workspace.",suppressible:!1,invalidExample:`<!-- file1.xml --><BehaviorTree ID="shared"/>
|
|
2
|
+
import{hideBin as $f}from"yargs/helpers";import Vf from"yargs/yargs";import{z as ln}from"zod";var u={InvalidScriptSyntax:"BT401_INVALID_SCRIPT_SYNTAX",EmptyScript:"BT402_EMPTY_SCRIPT",InvalidScriptToken:"BT403_INVALID_SCRIPT_TOKEN",UnknownScriptVariable:"BT404_UNKNOWN_SCRIPT_VARIABLE",AssignmentToUnknownVariable:"BT405_ASSIGNMENT_TO_UNKNOWN_VARIABLE",InvalidCompoundAssignment:"BT406_INVALID_COMPOUND_ASSIGNMENT",InvalidScriptOperandType:"BT407_INVALID_SCRIPT_OPERAND_TYPE",ScriptResultNotBoolCompatible:"BT408_SCRIPT_RESULT_NOT_BOOL_COMPATIBLE",ScriptVariableTypeMismatch:"BT410_SCRIPT_VARIABLE_TYPE_MISMATCH",InvalidGlobalBlackboardIdentifier:"BT411_INVALID_GLOBAL_BLACKBOARD_IDENTIFIER",InvalidRootElement:"BT001_INVALID_ROOT_ELEMENT",MissingBTCPPFormat:"BT002_MISSING_BTCPP_FORMAT",MissingBehaviorTreeID:"BT003_MISSING_BEHAVIOR_TREE_ID",DuplicateBehaviorTreeID:"BT004_DUPLICATE_BEHAVIOR_TREE_ID",UnknownSubTree:"BT005_UNKNOWN_SUBTREE",DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID",MissingPortName:"BT007_MISSING_PORT_NAME",DuplicatePortName:"BT008_DUPLICATE_PORT_NAME",UnknownTopLevelElement:"BT009_UNKNOWN_TOP_LEVEL_ELEMENT",UnknownMainTree:"BT010_UNKNOWN_MAIN_TREE",AmbiguousSubTree:"BT011_AMBIGUOUS_SUBTREE",ConflictingNodeModel:"BT012_CONFLICTING_NODE_MODEL",DuplicateBehaviorTreeIdInWorkspace:"BT013_DUPLICATE_BEHAVIOR_TREE_ID_IN_WORKSPACE",MissingIncludePath:"BT301_MISSING_INCLUDE_PATH",IncludeNotFound:"BT302_INCLUDE_NOT_FOUND",IncludeCycle:"BT303_INCLUDE_CYCLE",UnresolvedIncludePathVariable:"BT304_UNRESOLVED_INCLUDE_PATH_VARIABLE",IncludeOutsideWorkspace:"BT306_INCLUDE_OUTSIDE_WORKSPACE",ExternalIncludeUsed:"BT307_EXTERNAL_INCLUDE_USED",IncludeDepthExceeded:"BT309_INCLUDE_DEPTH_EXCEEDED",TooManyResolvedFiles:"BT310_TOO_MANY_RESOLVED_FILES",EntrypointNotFound:"BT311_ENTRYPOINT_NOT_FOUND",RosPackageResolverMissing:"BT312_ROS_PACKAGE_RESOLVER_MISSING",RosPackageNotFound:"BT313_ROS_PACKAGE_NOT_FOUND",UnknownNode:"BT105_UNKNOWN_NODE",MissingRequiredPort:"BT101_MISSING_REQUIRED_PORT",UnknownPort:"BT102_UNKNOWN_PORT",InvalidPortValueType:"BT103_INVALID_PORT_VALUE_TYPE",ChildCapableNodeSelfClosing:"BT108_CHILD_CAPABLE_NODE_SELF_CLOSING",LeafNodeOpenClose:"BT109_LEAF_NODE_OPEN_CLOSE",InvalidChildCount:"BT110_INVALID_CHILD_COUNT",BlackboardTypeMismatch:"BT111_BLACKBOARD_TYPE_MISMATCH",CustomLiteralRequiresValidator:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",InvalidPortDefaultValue:"BT114_INVALID_PORT_DEFAULT_VALUE",OutputPortRequiresRemap:"BT115_OUTPUT_PORT_REQUIRES_REMAP",InvalidPortName:"BT116_INVALID_PORT_NAME",AugmentTargetNotFound:"BT117_AUGMENT_TARGET_NOT_FOUND",AugmentPortNotFound:"BT118_AUGMENT_PORT_NOT_FOUND",InvalidTypeRefinement:"BT119_INVALID_TYPE_REFINEMENT",ConflictingModelKind:"BT120_CONFLICTING_MODEL_KIND",UnusedModelDefinition:"BT121_UNUSED_MODEL_DEFINITION",DuplicateModelDefinition:"BT122_DUPLICATE_MODEL_DEFINITION",MissingLocalModelDefinition:"BT123_MISSING_LOCAL_MODEL_DEFINITION",ExternalModelFileNotFound:"BT321_EXTERNAL_MODEL_FILE_NOT_FOUND",AugmentationFileNotFound:"BT324_AUGMENTATION_FILE_NOT_FOUND",MissingTreeNodesModel:"BT322_MISSING_TREENODESMODEL",ExternalModelXmlParseError:"BT323_EXTERNAL_MODEL_XML_PARSE_ERROR",NodeDefinitionFileNotFound:"BT331_NODE_DEFINITION_FILE_NOT_FOUND",InvalidNodeDefinitionJson:"BT332_INVALID_NODE_DEFINITION_JSON",InvalidNodeDefinitionSchema:"BT333_INVALID_NODE_DEFINITION_SCHEMA",DuplicateNodeDefinitionId:"BT334_DUPLICATE_NODE_DEFINITION_ID",InvalidAugmentationJson:"BT335_INVALID_AUGMENTATION_JSON",InvalidAugmentationSchema:"BT336_INVALID_AUGMENTATION_SCHEMA",ConflictingPortDefault:"BT107_CONFLICTING_PORT_DEFAULT",UnusedSuppression:"BT351_UNUSED_SUPPRESSION",MissingSuppressionReason:"BT353_MISSING_SUPPRESSION_REASON"},Sd=Object.values(u).sort();var vd=ln.object({subTreePorts:ln.enum(["loose","strict"]).optional()}).strict(),kd=ln.object({allowStringEntryCompatibility:ln.boolean().optional()}).strict(),H={"script/valid-syntax":{code:u.InvalidScriptSyntax,defaultSeverity:"error",description:"Script-bearing attributes must parse as valid BT.CPP scripts."},"script/no-unknown-variable":{code:u.UnknownScriptVariable,defaultSeverity:"warn",description:"Script-bearing attributes should not reference unknown variables."},"script/valid-assignment":{code:u.AssignmentToUnknownVariable,codes:[u.AssignmentToUnknownVariable,u.InvalidCompoundAssignment,u.ScriptVariableTypeMismatch,u.InvalidGlobalBlackboardIdentifier],defaultSeverity:"error",description:"Script assignments must target known variables and use compatible types."},"script/valid-expression-type":{code:u.InvalidScriptOperandType,defaultSeverity:"error",description:"Script expressions must use operators with compatible operand types."},"script/valid-result-type":{code:u.ScriptResultNotBoolCompatible,defaultSeverity:"error",description:"Condition-style script attributes must have a bool-compatible inferred result."},"xml/valid-root":{code:u.InvalidRootElement,defaultSeverity:"error",description:"Root element must be <root>."},"xml/require-btcpp-format":{code:u.MissingBTCPPFormat,defaultSeverity:"warn",description:'Root element must declare BTCPP_format="4".'},"tree/require-id":{code:u.MissingBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree elements require an ID attribute."},"tree/no-duplicate-id-in-file":{code:u.DuplicateBehaviorTreeID,defaultSeverity:"error",description:"BehaviorTree IDs must be unique within a file."},"tree/no-duplicate-id":{code:u.DuplicateBehaviorTreeIdInWorkspace,defaultSeverity:"error",description:"BehaviorTree IDs must be unique across the workspace."},"tree/no-unknown-subtree":{code:u.UnknownSubTree,defaultSeverity:"error",description:"A SubTree must resolve to a BehaviorTree or a configured model."},"tree/no-unknown-main-tree":{code:u.UnknownMainTree,defaultSeverity:"error",description:"main_tree_to_execute must reference a known BehaviorTree."},"tree/no-ambiguous-subtree":{code:u.AmbiguousSubTree,defaultSeverity:"error",description:"SubTree references must resolve to a single definition."},"tree/no-duplicate-node-model-id":{code:u.DuplicateNodeModelId,defaultSeverity:"error",description:"TreeNodesModel elements must have unique IDs within the same model block."},"xml/no-unknown-top-level-element":{code:u.UnknownTopLevelElement,defaultSeverity:"warn",description:"Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements."},"include/require-path":{code:u.MissingIncludePath,defaultSeverity:"error",description:"include elements require a path attribute."},"include/no-missing-file":{code:u.IncludeNotFound,defaultSeverity:"error",description:"Referenced include file does not exist."},"include/no-cycle":{code:u.IncludeCycle,defaultSeverity:"error",description:"Include graph cycles are not allowed."},"include/no-outside-root":{code:u.IncludeOutsideWorkspace,defaultSeverity:"error",description:"Includes must stay within the workspace root."},"include/no-unresolved-variable":{code:u.UnresolvedIncludePathVariable,defaultSeverity:"error",description:"Include path variables must resolve before lookup."},"include/no-depth-exceeded":{code:u.IncludeDepthExceeded,defaultSeverity:"error",description:"Include resolution must stay within the configured maximum depth."},"include/no-too-many-files":{code:u.TooManyResolvedFiles,defaultSeverity:"error",description:"Include resolution must stay within the configured file limit."},"include/require-ros-package-resolver":{code:u.RosPackageResolverMissing,defaultSeverity:"error",description:"When include uses ros_pkg, a host resolvePackageUri capability must be provided."},"include/no-missing-ros-package":{code:u.RosPackageNotFound,defaultSeverity:"error",description:"ros_pkg include must resolve to an existing ROS package root URI."},"include/report-external-used":{code:u.ExternalIncludeUsed,defaultSeverity:"info",description:"Reports when an allowed include resolves outside the workspace root."},"model/no-unknown-node":{code:u.UnknownNode,defaultSeverity:"warn",description:"Node usages must resolve to a known model."},"model/require-port":{code:u.MissingRequiredPort,defaultSeverity:"error",description:"Required ports must be supplied."},"model/require-port-name":{code:u.MissingPortName,defaultSeverity:"error",description:"Port elements require a name attribute."},"model/no-duplicate-port-name":{code:u.DuplicatePortName,defaultSeverity:"error",description:"Ports with the same name are not allowed."},"model/valid-port-name":{code:u.InvalidPortName,defaultSeverity:"error",description:"Port names must be valid XML attribute names for BT nodes."},"model/no-unknown-port":{code:u.UnknownPort,defaultSeverity:"warn",optionsSchema:vd,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:u.InvalidPortValueType,defaultSeverity:"error",description:"Port values must match the declared type."},"model/no-blackboard-type-mismatch":{code:u.BlackboardTypeMismatch,defaultSeverity:"error",optionsSchema:kd,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:u.InvalidPortDefaultValue,defaultSeverity:"error",description:"TreeNodesModel port defaults must match the declared type."},"model/require-output-port-remap":{code:u.OutputPortRequiresRemap,defaultSeverity:"error",description:"Resolved output ports must be explicitly or default-remapped to a blackboard entry."},"model/no-childless-control-shape-mismatch":{code:u.ChildCapableNodeSelfClosing,defaultSeverity:"warn",description:"Control and decorator nodes should normally use open/close tags."},"model/no-leaf-block-shape":{code:u.LeafNodeOpenClose,defaultSeverity:"warn",description:"Leaf nodes should normally be self-closing unless they contain child nodes."},"model/valid-child-count":{code:u.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:u.ConflictingNodeModel,defaultSeverity:"error",description:"Node model definitions must agree on kind and port shape."},"model/no-conflicting-kind-for-id":{code:u.ConflictingModelKind,defaultSeverity:"error",description:"A model ID must not be defined with different kinds."},"model/no-unused-definition":{code:u.UnusedModelDefinition,defaultSeverity:"error",description:"Inline model definitions should be used in the same BT XML file."},"model/require-local-definition":{code:u.MissingLocalModelDefinition,defaultSeverity:"error",description:"When models.convention is used-only, normal node usages should have a local TreeNodesModel definition in the same file."},"model/no-duplicate-definition":{code:u.DuplicateModelDefinition,defaultSeverity:"error",description:"A user-defined model (ID, kind) should be defined only once."},"suppression/no-unused":{code:u.UnusedSuppression,defaultSeverity:"warn",description:"Suppressions should match at least one diagnostic."},"suppression/require-reason":{code:u.MissingSuppressionReason,defaultSeverity:"off",description:"Suppressions should include a reason when required."}};var dn=["off","info","warn","error"];var Gi={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"}}},Td={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 ro(){return structuredClone(Td)}function Mt(e,t){return{files:t.files?{...e.files,...t.files}:e.files,resolver:t.resolver?{...e.resolver,...t.resolver,includes:{...e.resolver.includes,...t.resolver.includes||{},variables:{...e.resolver.includes.variables,...t.resolver.includes?.variables||{}}}}:e.resolver,models:t.models?{...e.models,...t.models}:e.models,linter:t.linter?{...e.linter,...t.linter,rules:t.linter.rules?{...e.linter.rules,...t.linter.rules}:e.linter.rules,suppressions:t.linter.suppressions?{...e.linter.suppressions,...t.linter.suppressions}:e.linter.suppressions}:e.linter,formatter:t.formatter?{...e.formatter,...t.formatter}:e.formatter,overrides:t.overrides?[...e.overrides,...t.overrides]:e.overrides}}var h={Error:"error",Warning:"warning",Info:"info"};function R(e,t,n,o,i="",r,s){return{code:e,severity:t,message:n,uri:i,...o?{range:o}:{},...r?{details:r}:{},...s?{data:s}:{}}}function pt(e,t,n){return{line:e,character:t,offset:n}}function C(e,t){return{start:e,end:t}}function Nt(e,t){return[...t].sort((n,o)=>o.range.start.offset-n.range.start.offset).reduce((n,o)=>n.slice(0,o.range.start.offset)+o.newText+n.slice(o.range.end.offset),e)}var Dd=/^[A-Za-z_][A-Za-z0-9_./:-]*$/;function so(e){return{ok:!0,reference:e}}function Ae(e,t,n){return{ok:!1,error:{kind:e,raw:t,message:n}}}function zi(e){return Dd.test(e)}function Ki(e){if(!e)return Ae("empty-key",e,"Blackboard reference key must not be empty");if(e[0]==="@"){let t=e.slice(1);return t?zi(t)?{ok:!0,scope:"global",key:t}:Ae("invalid-global-key",e,`Invalid global blackboard reference key: ${e}`):Ae("empty-key",e,"Global blackboard reference key must not be empty")}return zi(e)?{ok:!0,scope:"local",key:e}:Ae("invalid-key",e,`Invalid blackboard reference key: ${e}`)}function ne(e){let{portName:t}=e,n=e.rawValue.trim();if(n==="="||n==="{=}")return so({scope:"local",key:t,raw:n,syntax:"shorthand"});if(!n.startsWith("{")&&!n.endsWith("}"))return Ae("not-a-reference",n,`Not a blackboard reference: ${n}`);if(!(n.startsWith("{")&&n.endsWith("}")))return Ae("unbalanced-braces",n,`Unbalanced blackboard reference braces: ${n}`);let o=n.slice(1,-1).trim(),i=Ki(o);return i.ok?so({scope:i.scope,key:i.key,raw:n,syntax:"braced"}):i}function cn(e){let{rawName:t}=e;if(!t.startsWith("@"))return Ae("not-a-reference",t,`Not a script blackboard identifier: ${t}`);let n=Ki(t);return n.ok?n.scope!=="global"?Ae("not-a-reference",t,`Script blackboard identifiers must use the global scope marker: ${t}`):so({scope:n.scope,key:n.key,raw:t,syntax:"script"}):n}function un(e){return e.scope==="global"?`{@${e.key}}`:`{${e.key}}`}function Ne(e){return`${e.scope}:${e.key}`}var Rd={DuplicateNodeModelId:"BT006_DUPLICATE_NODE_MODEL_ID"};function Cd(e){return e.kind==="bt-document"?"bt-xml":e.kind==="model-document"?"model-xml":"unknown"}function ae(e,t){return e.attributes.find(n=>n.name===t)}function Id(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Ed(e){if(e)return{uri:e.uri,range:e.range,value:e.value}}function Md(e,t="inline-tree-nodes-model"){return e.kind==="model-document"?"external-tree-nodes-model":t}function Wi(e,t){let n=e.line,o=e.character,i=e.offset;for(let r of t){if(i+=r.length,r===`
|
|
3
|
+
`){n+=1,o=0;continue}o+=r.length}return{line:n,character:o,offset:i}}function Nd(e,t,n){let o=Wi(e,t),i=Wi(o,n);return{start:o,end:i}}function Hi(e,t,n,o){for(let i of e.attributes||[]){let r=i.valueContentRange??i.valueRange,s=o.slice(r.start.offset,r.end.offset),a=d=>{let c=ne({portName:i.name,rawValue:d.parsedRaw});if(!c.ok)return;let p=c.reference.raw.length;t.push({raw:c.reference.raw,key:c.reference.key,scope:c.reference.scope,identity:Ne(c.reference),syntax:c.reference.syntax,attributeName:i.name,element:e,uri:n,range:Nd(r.start,s.slice(0,d.parsedOffset),c.reference.raw.slice(0,p))})},l=ne({portName:i.name,rawValue:s});if(l.ok){let d=Math.max(0,s.indexOf(l.reference.raw));a({parsedRaw:l.reference.raw,parsedOffset:d});continue}for(let d of s.matchAll(/\{[^}]*\}/g)){let c=d[0],p=d.index??0;a({parsedRaw:c,parsedOffset:p})}}for(let i of e.children||[])i.kind==="element"&&Hi(i,t,n,o)}function Pd(e,t,n,o){let i=[];for(let r of e.children||[]){if(r.kind!=="element"||!Id(r.name))continue;let s=ae(r,"ID");if(!s)continue;let a=[];for(let l of r.children||[]){if(l.kind!=="element"||l.name!=="input_port"&&l.name!=="output_port"&&l.name!=="inout_port")continue;let d=ae(l,"name"),c=ae(l,"type"),p=ae(l,"default")||ae(l,"default_value"),m=ae(l,"enum"),f=(l.children||[]).filter(S=>S.kind==="text").map(S=>S.text).join("").trim()||void 0,y=l.name==="input_port"?"input":l.name==="output_port"?"output":"inout",g=(y==="input"||y==="inout")&&p===void 0;a.push({source:n,direction:y,name:d?d.value:"",type:c?.value||void 0,defaultValue:p?.value||void 0,description:f,required:g,element:l,uri:t,range:l.range,nameRange:d?.range,enum:m?.value?m.value.split(";"):void 0})}i.push({id:s.value,kind:r.name,source:n,sourceMeta:{sourceKind:n,file:t,range:r.range},editable:o,ports:a,element:r,uri:t,range:r.range,elementRange:r.range,idRange:s.range})}return i}function wd(e,t){let n=[];for(let o of e.children||[]){if(o.kind!=="element"||o.name!=="BehaviorTree")continue;let i=ae(o,"ID");i&&n.push({id:i.value,kind:"BehaviorTree",uri:t,element:o,range:o.range,elementRange:o.range,idRange:i.range})}return n}function Bd(e,t){let n=[],o=(i,r,s=!1)=>{if(s)return;let a=i.name==="BehaviorTree"?ae(i,"ID")?.value??r:r,l=i.name==="TreeNodesModel";if(i.name==="SubTree"){let d=ae(i,"ID");d&&n.push({id:d.value,uri:t,element:i,range:i.range,elementRange:i.range,idRange:d.range,parentBehaviorTreeId:a,attributes:i.attributes})}for(let d of i.children||[])d.kind==="element"&&o(d,a,l)};if(e.name==="TreeNodesModel")return n;for(let i of e.children||[])i.kind==="element"&&o(i);return n}function _d(e){return{id:e.id,kind:e.kind,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange}}function Ji(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 Ad(e){return{id:e.id,kind:e.kind,editable:e.editable,ports:e.ports.map(Ji),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 Fd(e){return{id:e.id,uri:e.uri,range:e.range,elementRange:e.elementRange,idRange:e.idRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function jd(e){return{id:e.id,uri:e.uri,kind:e.kind,range:e.range,elementRange:e.elementRange,parentBehaviorTreeId:e.parentBehaviorTreeId}}function Ld(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 Ud(e){return{uri:e.uri,path:e.path,isBtXml:e.isBtXml,kind:e.kind,behaviorTrees:e.behaviorTrees.map(_d),subtreeReferences:e.subtreeReferences.map(Fd),nodeUsages:e.nodeUsages.map(jd),blackboardReferences:e.blackboardReferences.map(Ld),treeNodesModel:e.treeNodesModel.map(Ad),genericSubTreePorts:e.genericSubTreePorts.map(Ji),rootMainTreeToExecute:Ed(e.rootMainTreeToExecute)}}function Od(e,t){if(e.name==="TreeNodesModel")return[];let n=[],o=(i,r,s=!1)=>{if(s)return;let a=i.name==="TreeNodesModel",l=i.name==="BehaviorTree"?ae(i,"ID")?.value??r:r,d=l!==void 0;if(i.name==="SubTree"){let c=ae(i,"ID");c&&d&&n.push({id:c.value,kind:"SubTree",uri:t,range:i.range,elementRange:i.range,parentBehaviorTreeId:l})}else d&&i.name!=="root"&&i.name!=="BehaviorTree"&&i.name!=="TreeNodesModel"&&n.push({id:i.name,kind:"node",uri:t,range:i.range,elementRange:i.range,parentBehaviorTreeId:l});for(let c of i.children||[])c.kind==="element"&&o(c,l,a)};for(let i of e.children||[])i.kind==="element"&&o(i);return n}function $d(e){return e.node.kind==="SubTree"&&e.node.id==="SubTree"?(e.genericSubTreePorts.push(...e.node.ports),!0):(e.treeNodesModel.push(e.node),!1)}function Vd(e){return R(Rd.DuplicateNodeModelId,h.Error,`duplicate node model ID \`${e.id}\``,e.idRange||e.range,e.uri,{primaryLabel:"this node model ID is already defined in the same model source",help:"merge the duplicate definitions or rename one of them"})}function qd(e,t){let n=[],o=t?.uri||e.uri,i=e.root,r=e.isBtXml,s=Cd(e),a=Md(e),l=((t?.path??e.path)||o==="")&&e.kind==="model-document"?!0:e.kind!=="model-document",d=i&&e.kind!=="model-document"?wd(i,o):[],c=[],p=[],m=i?i.name==="TreeNodesModel"?[i]:i.children.filter(x=>x.kind==="element"&&x.name==="TreeNodesModel"):[];for(let x of m){let D=Pd(x,o,a,l),P=new Map;for(let w of D)$d({node:w,treeNodesModel:c,genericSubTreePorts:p})||(P.has(w.id)?n.push(Vd(w)):P.set(w.id,w))}let f=i?Bd(i,o):[],y=i?Od(i,o):[],g=i?(()=>{let x=[];return Hi(i,x,o,e.originalText),x})():[],S=i?ae(i,"main_tree_to_execute"):void 0;return{extracted:{publicModel:Ud({uri:o,path:t?.path??e.path,isBtXml:r,kind:s,behaviorTrees:d,subtreeReferences:f,nodeUsages:y,blackboardReferences:g,treeNodesModel:c,genericSubTreePorts:p,rootMainTreeToExecute:S?{uri:o,range:S.range,value:S.value}:void 0}),extractedBehaviorTrees:d,extractedTreeNodesModel:c,extractedSubTreeReferences:f,extractedBlackboardReferences:g},diagnostics:n}}function Yi(e,t){let{extracted:n,diagnostics:o}=qd(e,t);return{model:n.publicModel,diagnostics:o}}function ao(e,t){return Yi(e,t)}var Zi=new Set(["ID","name","_name","_autoremap","_failureIf","_successIf","_skipIf","_while","_onSuccess","_onFailure","_onHalted","_post"]),Xd=new Set([...Zi,"_autoremap","_description","__shared_blackboard"]),Gd=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 lo(e){return Zi.has(e)}function Qi(e){return Xd.has(e)}function co(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(Qi(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 o=Gd.get(t);if(o)return o}}function er(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 Pt(e,t){return{id:e,kind:t.kind,source:"config",sourceMeta:{sourceKind:"config"},editable:!0,ports:Object.entries(t.ports??{}).map(([n,o])=>er(n,o))}}var zd=[{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"]}],wt=new Map,tr=new Map;for(let e of zd){let t={name:e.name,kind:e.kind,canonical:e.name,aliases:e.aliases,compatibleWith:[],source:"builtin"};tr.set(e.name,t),wt.set(e.name,e.name);for(let n of e.aliases)wt.set(n,e.name)}function Kd(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 uo(e){return wt.get(e)??e}function Wd(e){return{name:e.name,kind:e.kind,canonical:e.canonical,aliases:[...e.aliases].filter(t=>t!==e.canonical),compatibleWith:[...e.compatibleWith],validate:e.validate,source:e.source}}function Bt(e){return wt.get(e)}function mt(e=[]){let t=new Map,n=new Map(wt);for(let o of tr.values())t.set(o.canonical,{name:o.name,kind:o.kind,canonical:o.canonical,aliases:new Set([o.name,o.canonical,...o.aliases]),compatibleWith:new Set(o.compatibleWith),validate:o.validate,source:o.source});for(let o of e)for(let[i,r]of Object.entries(o.types??{})){let s=uo(r.canonical??i),l=t.get(s)??Kd(i,s,r);l.name=i,l.kind=r.kind,l.canonical=s,l.source="augmentation",l.validate=r.validate??l.validate,l.aliases.add(i),l.aliases.add(s);for(let d of r.aliases??[])l.aliases.add(d);for(let d of r.compatibleWith??[])l.compatibleWith.add(d);t.set(s,l),n.set(i,s),n.set(s,s);for(let d of r.aliases??[])n.set(d,s)}for(let o of t.values())o.compatibleWith=new Set([...o.compatibleWith].map(i=>n.get(i)??uo(i))),o.compatibleWith.delete(o.canonical);return{entriesByCanonical:new Map([...t.entries()].map(([o,i])=>[o,Wd(i)])),namesToCanonical:n}}function ge(e,t){if(!t)return;let n=e.namesToCanonical.get(t)??uo(t),o=e.entriesByCanonical.get(n);return o||{name:t,kind:"opaque",canonical:n,aliases:[],compatibleWith:[],source:"custom"}}function pn(e,t){return ge(e,t)?.canonical}function _t(e,t,n){let o=ge(e,t),i=ge(e,n);return!o||!i?!1:o.kind==="any"||i.kind==="any"||o.canonical===i.canonical?!0:o.compatibleWith.includes(i.canonical)||i.compatibleWith.includes(o.canonical)}var nr=[{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:[]}],or={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=[{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:[]}],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 sr=[{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:[]}],ar={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 lr=["4.6.2","4.8.2","4.9.0"],po="4.9.0",At={"4.6.2":{models:nr,genericSubTreeModel:or},"4.8.2":{models:ir,genericSubTreeModel:rr},"4.9.0":{models:sr,genericSubTreeModel:ar}};var dr=lr.map(e=>`btcpp-v${e}`),Ft=["btcpp-v4",...dr],cr=`btcpp-v${po}`;function ur(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 Hd(e){return e.map(t=>({id:t.id,kind:t.kind,ports:t.ports.map(ur)}))}function pr(e){if(e)return{id:e.id,kind:e.kind,ports:e.ports.map(ur)}}function Jd(){let e={};for(let[t,n]of Object.entries(At))e[`btcpp-v${t}`]=Hd(n.models);return e}function Yd(){let e={};for(let[t,n]of Object.entries(At))e[`btcpp-v${t}`]=pr(n.genericSubTreeModel);return e}var Zd=Jd(),Qd=Yd();function ec(e){let t=e.replace(/^btcpp-v/,"");return Object.hasOwn(At,t)}function mr(e){return e==="btcpp-v4"?cr:e}function tc(e){return e==="btcpp-v4"?po:e.replace(/^btcpp-v/,"")}function fr(e){if(e&&e!=="btcpp-v4"&&!ec(e))throw new Error(`unsupported builtin model set: ${e}`)}function mo(e="btcpp-v4"){fr(e);let t=mr(e);return Zd[t].map(o=>gr(o))}function fo(e="btcpp-v4"){fr(e);let t=Qd[mr(e)]??pr(At[tc(e)].genericSubTreeModel);return t?(t.ports??[]).map(n=>({...n,enum:n.enum?[...n.enum]:void 0})):[]}function gr(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 jt(e){return{id:e.id,kind:e.kind,ports:[...e.ports].sort((t,n)=>{let o=t.name.localeCompare(n.name);if(o!==0)return o;let i=t.direction.localeCompare(n.direction);if(i!==0)return i;let r=(t.type??"").localeCompare(n.type??"");if(r!==0)return r;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 ft(e,t){let n=jt(e),o=jt(t);return JSON.stringify(n)===JSON.stringify(o)}function go(e,t){if(ft(e,t))return"none";let n=jt(e),o=jt(t);if(n.kind!==o.kind)return"kind";if(n.ports.length!==o.ports.length)return"ports";let i=new Map(o.ports.map(a=>[a.name,a])),r=!1,s=!1;for(let a of n.ports){let l=i.get(a.name);if(!l){s=!0;continue}(a.direction!==l.direction||a.type!==l.type||a.required!==l.required)&&(s=!0);let d=a.enum?JSON.stringify(a.enum):"",c=l.enum?JSON.stringify(l.enum):"";d!==c&&(s=!0),a.description!==l.description&&(s=!0),a.defaultValue!==l.defaultValue&&(r=!0)}return s?"ports":r?"port-default":"mixed"}import{findNodeAtLocation as ac,parse as lc,parseTree as dc}from"jsonc-parser";import{z as M}from"zod";var yr=M.discriminatedUnion("kind",[M.object({kind:M.literal("pattern"),pattern:M.string()}).strict(),M.object({kind:M.literal("enum"),values:M.array(M.string())}).strict(),M.object({kind:M.literal("tuple"),separator:M.string(),items:M.array(M.string())}).strict(),M.object({kind:M.literal("json-schema"),schema:M.unknown()}).strict()]),nc=M.object({kind:M.enum(["primitive","opaque","any"]),canonical:M.string().optional(),aliases:M.array(M.string()).optional(),compatibleWith:M.array(M.string()).optional(),validate:yr.optional()}).strict(),oc=M.object({from:M.string().optional(),to:M.string()}).strict(),ic=M.object({typeRefinement:oc.optional(),validate:yr.optional(),required:M.boolean().optional(),enum:M.array(M.string()).optional(),description:M.string().optional()}).strict(),rc=M.object({ports:M.record(M.string(),ic).optional()}).strict(),sc=M.object({enums:M.record(M.string(),M.number().finite()).optional()}).strict(),hr=M.object({version:M.literal(1),types:M.record(M.string(),nc).optional(),augment:M.record(M.string(),rc).optional(),script:sc.optional()}).strict();function cc(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
5
|
+
`&&t.push(n+1);return n=>{let o=0,i=t.length-1;for(;o<=i;){let s=Math.floor((o+i)/2);t[s]<=n?o=s+1:i=s-1}let r=Math.max(0,o-1);return{line:r,character:n-t[r],offset:n}}}function uc(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}function br(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function pc(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;if(typeof t=="string"||typeof t=="number")return[...br(e.path),t]}return br(e.path)}function mc(e){if(e.code==="unrecognized_keys"){let[t]=e.keys;return{message:`Unrecognized key: "${t??""}"`,path:[...e.path,t].filter(n=>n!==void 0).join(".")}}return{message:e.message,path:e.path.length>0?e.path.join("."):void 0}}function yo(e,t){let n=t?.uri??"",o=[],i=dc(e,o,{allowTrailingComma:!0,disallowComments:!1});try{let r=lc(e,o,{allowTrailingComma:!0,disallowComments:!1});if(o.length>0||!i)throw new Error(`JSON parse error at offset ${o[0]?.offset??0}`);let s=hr.safeParse(r);if(!s.success){let a=cc(e);return{ok:!1,uri:n,path:t?.path,issues:s.error.issues.map(l=>{let d=pc(l),{message:c,path:p}=mc(l);return{kind:"schema",message:c,path:p,range:uc(ac(i,d),a),notes:p?[p]:void 0}})}}return{ok:!0,data:{...s.data,uri:n,path:t?.path},issues:[],uri:n,path:t?.path}}catch(r){return{ok:!1,uri:n,path:t?.path,issues:[{kind:"json",message:"the file could not be parsed as JSON",notes:[String(r.message||r)]}]}}}import{z as G}from"zod";var xr=G.object({direction:G.enum(["input","output","inout"]).optional(),type:G.string().optional(),required:G.boolean().optional(),default:G.string().optional(),description:G.string().optional(),enum:G.array(G.string()).optional()}).strict(),mn=G.object({kind:G.enum(["Action","Condition","Control","Decorator","SubTree"]),ports:G.record(G.string(),xr).optional(),description:G.string().optional()}).strict(),ho=G.object({nodes:G.record(G.string(),mn)}).strict();import{z as k}from"zod";var Sr=k.enum(["off","info","warn","error"]),vr=k.union([Sr,k.tuple([Sr,k.record(k.string(),k.unknown())])]),fc=k.object({include:k.array(k.string()).optional(),ignore:k.array(k.string()).optional(),useGitignore:k.boolean().optional(),followSymlinks:k.boolean().optional(),maxSize:k.number().int().positive().optional()}).strict(),gc=k.string(),yc=k.object({name:k.string(),attribute:k.string(),base:k.enum(["file","project-root"]).optional()}).strict(),hc=k.object({elements:k.array(yc).optional(),variables:k.record(k.string(),k.string()).optional(),allowOutsideRoot:k.boolean().optional(),maxDepth:k.number().int().min(1).optional(),maxFiles:k.number().int().min(1).optional()}).strict(),bc=k.object({entrypoints:k.array(gc).optional(),includes:hc.optional(),behaviorTreeIds:k.enum(["workspace-unique","file-local-first","allow-ambiguous"]).optional()}).strict(),xc=k.enum(["allow-unused","used-only","single-source"]),Sc=k.object({builtins:k.array(k.enum(Ft)).optional(),files:k.array(k.string()).optional(),augmentations:k.array(k.string()).optional(),definitions:k.array(k.string()).optional(),inline:k.record(k.string(),mn).optional(),convention:xc.optional()}).strict(),kr=k.object({inline:k.enum(["allow","deny"]).optional()}).strict(),vc=k.object({enabled:k.boolean().optional(),rules:k.record(k.string(),vr).optional(),baseline:k.string().optional(),suppressions:kr.optional()}).strict(),kc=k.object({rules:k.record(k.string(),vr).optional(),suppressions:kr.optional()}).strict(),Tr=k.object({indentWidth:k.number().int().min(1).max(8).optional(),xmlDeclaration:k.enum(["always","never","preserve"]).optional(),blankLineBetweenBehaviorTrees:k.boolean().optional(),lineEnding:k.enum(["lf","crlf","auto"]).optional()}).strict(),Tc=k.object({files:k.array(k.string()),linter:kc.optional(),formatter:Tr.optional()}).strict(),Dr=k.object({$schema:k.string().optional(),strict:k.boolean().optional(),files:fc.optional(),resolver:bc.optional(),models:Sc.optional(),linter:vc.optional(),formatter:Tr.optional(),overrides:k.array(Tc).optional()}).strict();function Ir(e){return e.flatMap(Dc)}function Dc(e){if(String(e.code)==="unrecognized_keys")return(Array.isArray(e.keys)?e.keys??[]:[]).map(i=>{let r=Rr([...e.path,String(i)]);return{code:"CFG002_UNKNOWN_CONFIG_FIELD",severity:"error",path:r,message:`unknown config field \`${r}\``}});let n=Rr(e.path);return Er(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 Rr(e){return e.map(String).join(".")||void 0}function Er(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(Cr);let o=e.unionErrors;return Array.isArray(o)?o.flatMap(i=>i.issues??[]).some(Cr):!1}function Cr(e){return typeof e=="object"&&e!==null&&Er(e)}function gt(e){let t=Dr.safeParse(e);return t.success?{ok:!0,value:t.data,diagnostics:[]}:{ok:!1,diagnostics:Ir(t.error.issues)}}function Rc(e){if(!e)return;let t={};return e.indentWidth!==void 0&&(t.indentWidth=e.indentWidth),e.xmlDeclaration!==void 0&&(t.xmlDeclaration=e.xmlDeclaration),e.blankLineBetweenBehaviorTrees!==void 0&&(t.blankLineBetweenBehaviorTrees=e.blankLineBetweenBehaviorTrees),e.lineEnding!==void 0&&(t.lineEnding=e.lineEnding),t}function Cc(e){if(!e)return;let t={};return e.rules!==void 0&&(t.rules=e.rules),e.suppressions!==void 0&&(t.suppressions={},e.suppressions.inline!==void 0&&(t.suppressions.inline=e.suppressions.inline)),t}function Ic(e){return e.map(t=>R(t.code,t.severity==="error"?h.Error:h.Warning,t.message,void 0,"",t.help?{help:t.help}:void 0))}function Ec(e){let t=[],n=ro(),{$schema:o,strict:i,overrides:r,...s}=e;i&&(n=Mt(n,Gi)),n=Mt(n,s),n.overrides=(r??[]).map(l=>({files:l.files,linter:Cc(l.linter),formatter:Rc(l.formatter)}));let a=!t.some(l=>l.severity===h.Error);return{config:n,diagnostics:t,ok:a}}function fn(e){let t=gt(e);return t.ok?Ec(t.value):{ok:!1,config:ro(),diagnostics:Ic(t.diagnostics)}}var Mc="https://unpkg.com/@abco20/btxml-checker/schemas/btxml.config.schema.json";function gn(){return{$schema:Mc}}function Nc(e){let t="",n=0;for(;n<e.length;)e.slice(n,n+3)==="/**"&&(n+3===e.length||e[n+3]==="/")?n+3===e.length?(t+="(?:/.*)?",n+=3):(t+="(?:/.*)?/",n+=4):n===0&&e.slice(n,n+3)==="**/"?(t+="(?:.*/)?",n+=3):e.slice(n,n+2)==="**"?(t+=".*",n+=2):e[n]==="*"?(t+="[^/]*",n+=1):e[n]==="?"?(t+="[^/]",n+=1):(t+=e[n].replace(/[.+^${}()|[\]\\]/g,"\\$&"),n+=1);return new RegExp(`^${t}$`)}function Pc(e,t){let n=e.replace(/\\/g,"/"),o=t.startsWith("!"),i=o?t.slice(1):t,s=Nc(i).test(n);return o?!s:s}function Mr(e,t){return e.overrides.filter(n=>n.files.some(o=>Pc(t,o)))}function wc(e){return e.replaceAll("\\","/")}function J(e,t){let n=wc(t),o=Mr(e,n),i=e;for(let r of o)i=Mt(i,{linter:r.linter,formatter:r.formatter});return{files:i.files,resolver:i.resolver,models:i.models,linter:i.linter,formatter:i.formatter}}function xe(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 bo(e){return e in H}function xo(e){for(let[t,n]of Object.entries(H)){let o=n;if(o.code===e||o.codes?.includes(e))return t}}function Pe(e){if(typeof e=="string")return dn.includes(e)?{severity:e}:null;if(Array.isArray(e)&&e.length>=1&&e.length<=2){let[t,n]=e;if(typeof t=="string"&&dn.includes(t)&&(n===void 0||typeof n=="object"&&n!==null&&!Array.isArray(n))){let o={severity:t};return n!==void 0&&(o.options=n),o}}return null}function We(e,t){let n=e[t];if(n!==void 0){let o=Pe(n);if(o)return o.severity}return H[t].defaultSeverity}function So(e,t){let n=[],i=H[e].optionsSchema;if(!i)return n;let r=i.safeParse(t);if(r.success)return n;for(let s of r.error.issues)n.push(..._c(e,s));return n}function _c(e,t){if(t.code==="unrecognized_keys")return t.keys.map(o=>R("CFG011_INVALID_RULE_OPTION",h.Error,`unknown option \`${String(o)}\` for rule \`${e}\``,void 0,void 0,{help:Nr(e)}));let n=typeof t.path[0]=="string"?t.path[0]:void 0;return[R("CFG011_INVALID_RULE_OPTION",h.Error,n?`invalid option \`${n}\`: ${t.message}`:`invalid options for rule \`${e}\`: ${t.message}`,void 0,void 0,{help:Nr(e)})]}function Nr(e){let n=H[e].options?.map(o=>o.name)??[];return n.length>0?`valid options are: ${n.join(", ")}`:void 0}function vo(e){let t=[];Pr(e.linter,"linter.rules",t);for(let[n,o]of(e.overrides??[]).entries())Pr(o.linter,`overrides.${n}.linter.rules`,t);return t}function Pr(e,t,n){for(let[o,i]of Object.entries(e?.rules??{})){let r=`${t}.${o}`;if(!bo(o)){n.push({code:"CFG010_UNKNOWN_RULE",severity:"error",path:r,message:`unknown lint rule \`${o}\``,help:"see docs/rules.md for a list of valid rule names"});continue}let s=Pe(i);if(s?.options)for(let a of So(o,s.options))n.push({code:"CFG011_INVALID_RULE_OPTION",severity:"error",path:Ac(r,s.options,a.message),message:a.message,help:a.details?.help})}}function Ac(e,t,n){let o=Object.keys(t).find(i=>n.includes(`\`${i}\``));return o?`${e}.1.${o}`:`${e}.1`}var F=(e,t,n,o=!0)=>({code:e,title:t,description:n,suppressible:o}),Fc={[u.InvalidScriptSyntax]:{code:u.InvalidScriptSyntax,title:"Invalid script syntax",description:"Script-bearing attributes must parse as valid BT.CPP scripts.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf="A +"/>',validExample:'<AlwaysSuccess _successIf="A == 1"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.EmptyScript]:{code:u.EmptyScript,title:"Empty script",description:"Script-bearing attributes must not be empty.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf=""/>',validExample:'<AlwaysSuccess _successIf="true"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.InvalidScriptToken]:{code:u.InvalidScriptToken,title:"Invalid script token",description:"Script-bearing attributes must not contain invalid BT.CPP tokens.",suppressible:!0,invalidExample:'<Script code="0x"/>',validExample:'<Script code="value := 0x10"/>',configExample:'{"linter":{"rules":{"script/valid-syntax":"error"}}}'},[u.UnknownScriptVariable]:{code:u.UnknownScriptVariable,title:"Unknown script variable",description:"Script-bearing attributes should not read blackboard or local variables that were never introduced.",suppressible:!0,invalidExample:'<AlwaysSuccess _successIf="missing == 1"/>',validExample:'<Script code="count := 1; done = count"/>',configExample:'{"linter":{"rules":{"script/no-unknown-variable":"warn"}}}'},[u.AssignmentToUnknownVariable]:{code:u.AssignmentToUnknownVariable,title:"Assignment to unknown script variable",description:"Assignments with `=` or compound operators must target an existing script or blackboard variable.",suppressible:!0,invalidExample:'<Script code="count = 1"/>',validExample:'<Script code="count := 1; count = 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidCompoundAssignment]:{code:u.InvalidCompoundAssignment,title:"Invalid compound assignment",description:"Compound assignment operators must be used with supported operand types (`number` or `string` for `+=`, numbers only otherwise).",suppressible:!0,invalidExample:'<Script code="name := "x"; name -= 1"/>',validExample:'<Script code="count := 1; count += 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidScriptOperandType]:{code:u.InvalidScriptOperandType,title:"Invalid script operand type",description:"Script operators and ternary conditions must be applied to operands with compatible inferred types.",suppressible:!0,invalidExample:`<AlwaysSuccess _successIf="'x' * 2"/>`,validExample:'<AlwaysSuccess _successIf="count * 2 > 0"/>',configExample:'{"linter":{"rules":{"script/valid-expression-type":"error"}}}'},[u.ScriptResultNotBoolCompatible]:{code:u.ScriptResultNotBoolCompatible,title:"Script result is not bool-compatible",description:"Condition-style script attributes must end in an inferred bool-compatible result type.",suppressible:!0,invalidExample:`<AlwaysSuccess _successIf="'hello'"/>`,validExample:'<AlwaysSuccess _successIf="true"/>',configExample:'{"linter":{"rules":{"script/valid-result-type":"error"}}}'},[u.ScriptVariableTypeMismatch]:{code:u.ScriptVariableTypeMismatch,title:"Script variable type mismatch",description:"Script assignments must not write an incompatible inferred type into an existing variable.",suppressible:!0,invalidExample:'<Script code="count := 1; count = "x""/>',validExample:'<Script code="count := 1; count = 2"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidGlobalBlackboardIdentifier]:{code:u.InvalidGlobalBlackboardIdentifier,title:"Invalid global blackboard identifier",description:"Script global blackboard identifiers must use `@name` with a valid blackboard key after the scope marker.",suppressible:!0,invalidExample:'<Script code="@ := 1"/>',validExample:'<Script code="@count := 1"/>',configExample:'{"linter":{"rules":{"script/valid-assignment":"error"}}}'},[u.InvalidRootElement]:F(u.InvalidRootElement,"Invalid root element","Root element must be <root>.",!1),[u.MissingBTCPPFormat]:F(u.MissingBTCPPFormat,"Missing BTCPP format",'Root element must declare BTCPP_format="4".',!1),[u.MissingBehaviorTreeID]:F(u.MissingBehaviorTreeID,"Missing BehaviorTree ID","BehaviorTree elements require an ID attribute.",!1),[u.DuplicateBehaviorTreeID]:F(u.DuplicateBehaviorTreeID,"Duplicate BehaviorTree ID","BehaviorTree IDs must be unique within a file.",!1),[u.UnknownSubTree]:{code:u.UnknownSubTree,title:"Unknown SubTree reference",description:"A SubTree must resolve to a BehaviorTree or a configured model.",suppressible:!0,invalidExample:'<SubTree ID="missing_tree"/>',validExample:'<BehaviorTree ID="missing_tree"><Sequence/></BehaviorTree>',fix:"Define the BehaviorTree, add an external TreeNodesModel file, or add a nodes config entry.",configExample:'{"linter":{"rules":{"tree/no-unknown-subtree":"warn"}}}'},[u.DuplicateNodeModelId]:F(u.DuplicateNodeModelId,"Duplicate node model ID in TreeNodesModel","TreeNodesModel elements must have unique IDs within the same model block.",!1),[u.MissingPortName]:F(u.MissingPortName,"Missing port name","Port elements require a name attribute.",!1),[u.DuplicatePortName]:F(u.DuplicatePortName,"Duplicate port name","Ports with the same name are not allowed.",!1),[u.InvalidPortName]:{code:u.InvalidPortName,title:"Invalid port name",description:"Port names must be valid XML attribute names for BT nodes.",suppressible:!1,invalidExample:'<input_port name="request.name" type="string"/>',validExample:'<input_port name="request_name" type="string"/>',fix:"Rename the port so it does not use reserved names, leading digits, whitespace, control characters, or XML/path punctuation.",configExample:'{"linter":{"rules":{"model/valid-port-name":"warn"}}}'},[u.UnknownTopLevelElement]:F(u.UnknownTopLevelElement,"Unknown top-level element","Top-level elements must be BehaviorTree, TreeNodesModel, or configured include elements.",!1),[u.UnknownMainTree]:F(u.UnknownMainTree,"Unknown main tree","main_tree_to_execute must reference a known BehaviorTree.",!1),[u.AmbiguousSubTree]:F(u.AmbiguousSubTree,"Ambiguous SubTree","SubTree references must resolve to a single definition.",!1),[u.ConflictingNodeModel]:{code:u.ConflictingNodeModel,title:"Conflicting node model",description:"Node model definitions must agree on kind and port shape.",suppressible:!1,fix:"Run `btxmlc repair` to inspect conflicts. Run `btxmlc repair --write` to resolve the conflict interactively."},[u.ConflictingModelKind]:{code:u.ConflictingModelKind,title:"Conflicting model kind for ID",description:"The same model ID must not be defined with different node kinds.",suppressible:!1,invalidExample:'<TreeNodesModel><Action ID="Foo"/><Condition ID="Foo"/></TreeNodesModel>',validExample:'<TreeNodesModel><Action ID="Foo"/></TreeNodesModel>'},[u.UnusedModelDefinition]:{code:u.UnusedModelDefinition,title:"Unused inline model definition",description:"When models.convention is used-only, inline Action/Condition/Decorator/Control definitions must be used in the same file.",suppressible:!1,invalidExample:'<root BTCPP_format="4"><BehaviorTree ID="Main"><Run/></BehaviorTree><TreeNodesModel><Action ID="Run"/><Action ID="Unused"/></TreeNodesModel></root>',validExample:'<root BTCPP_format="4"><BehaviorTree ID="Main"><Run/></BehaviorTree><TreeNodesModel><Action ID="Run"/></TreeNodesModel></root>',fix:"Run `btxmlc lint --fix` to remove unused inline model definitions when safe."},[u.DuplicateModelDefinition]:{code:u.DuplicateModelDefinition,title:"Duplicate model definition",description:"When models.convention is single-source, each user-defined (ID, kind) model definition should appear only once.",suppressible:!1,invalidExample:`<!-- a.xml --><TreeNodesModel><Action ID="Move"/></TreeNodesModel>
|
|
6
|
+
<!-- b.xml --><TreeNodesModel><Action ID="Move"/></TreeNodesModel>`,validExample:'<TreeNodesModel><Action ID="Move"/></TreeNodesModel>',fix:"Run `btxmlc lint --fix` to delete non-canonical duplicates when safe."},[u.MissingLocalModelDefinition]:{code:u.MissingLocalModelDefinition,title:"Missing local model definition",description:"When models.convention is used-only, each normal node used in a file should have a local TreeNodesModel definition in that same file.",suppressible:!1,invalidExample:'<root BTCPP_format="4"><BehaviorTree ID="Main"><Sequence/><Move/></BehaviorTree><TreeNodesModel><Action ID="Move"/></TreeNodesModel></root>',validExample:'<root BTCPP_format="4"><BehaviorTree ID="Main"><Sequence/><Move/></BehaviorTree><TreeNodesModel><Control ID="Sequence"/><Action ID="Move"/></TreeNodesModel></root>',fix:"Run `btxmlc lint --fix` to add missing local model definitions when they can be resolved safely."},[u.DuplicateBehaviorTreeIdInWorkspace]:{code:u.DuplicateBehaviorTreeIdInWorkspace,title:"Duplicate BehaviorTree ID in workspace",description:"BehaviorTree IDs must be unique across the workspace.",suppressible:!1,invalidExample:`<!-- file1.xml --><BehaviorTree ID="shared"/>
|
|
7
7
|
<!-- file2.xml --><BehaviorTree ID="shared"/>`,validExample:`<!-- file1.xml --><BehaviorTree ID="shared"/>
|
|
8
|
-
<!-- file2.xml --><BehaviorTree ID="other"/>`,configExample:'{"linter":{"rules":{"tree/no-duplicate-id":"warn"}}}'},[u.MissingIncludePath]:{code:u.MissingIncludePath,title:"Missing include path",description:"include elements require a path attribute.",suppressible:!1,invalidExample:"<include/>",validExample:'<include path="common.xml"/>',configExample:'{"linter":{"rules":{"include/require-path":"warn"}}}'},[u.IncludeNotFound]:{code:u.IncludeNotFound,title:"Include not found",description:"Referenced include file does not exist.",suppressible:!1,invalidExample:'<include path="missing.xml"/>',validExample:'<include path="common.xml"/>',configExample:'{"linter":{"rules":{"include/no-missing-file":"warn"}}}'},[u.IncludeCycle]:
|
|
8
|
+
<!-- file2.xml --><BehaviorTree ID="other"/>`,configExample:'{"linter":{"rules":{"tree/no-duplicate-id":"warn"}}}'},[u.MissingIncludePath]:{code:u.MissingIncludePath,title:"Missing include path",description:"include elements require a path attribute.",suppressible:!1,invalidExample:"<include/>",validExample:'<include path="common.xml"/>',configExample:'{"linter":{"rules":{"include/require-path":"warn"}}}'},[u.IncludeNotFound]:{code:u.IncludeNotFound,title:"Include not found",description:"Referenced include file does not exist.",suppressible:!1,invalidExample:'<include path="missing.xml"/>',validExample:'<include path="common.xml"/>',configExample:'{"linter":{"rules":{"include/no-missing-file":"warn"}}}'},[u.IncludeCycle]:F(u.IncludeCycle,"Include cycle","Include graph cycles are not allowed.",!1),[u.UnresolvedIncludePathVariable]:F(u.UnresolvedIncludePathVariable,"Unresolved include path variable","Include path variables must resolve before lookup.",!1),[u.IncludeOutsideWorkspace]:F(u.IncludeOutsideWorkspace,"Include outside workspace","Includes must stay within the workspace root.",!1),[u.ExternalIncludeUsed]:F(u.ExternalIncludeUsed,"External include used","An include file outside the workspace root was used.",!1),[u.IncludeDepthExceeded]:F(u.IncludeDepthExceeded,"Include depth exceeded","The maximum depth of nested includes was reached.",!1),[u.TooManyResolvedFiles]:F(u.TooManyResolvedFiles,"Too many resolved files","The maximum number of allowed files included was reached.",!1),[u.EntrypointNotFound]:F(u.EntrypointNotFound,"Entrypoint not found","Configured entrypoint files must exist.",!1),[u.RosPackageResolverMissing]:{code:u.RosPackageResolverMissing,title:"ROS package resolver is missing",description:"include elements with ros_pkg require ProjectHost.resolvePackageUri to be provided.",suppressible:!1,invalidExample:'<include ros_pkg="my_pkg" path="trees/common.xml"/>',validExample:"Provide a host implementation of resolvePackageUri that resolves my_pkg to a package root URI."},[u.RosPackageNotFound]:{code:u.RosPackageNotFound,title:"ROS package not found",description:"ros_pkg include must resolve to a known package root URI.",suppressible:!1,invalidExample:'<include ros_pkg="missing_pkg" path="trees/common.xml"/>',validExample:'<include ros_pkg="my_pkg" path="trees/common.xml"/>'},[u.UnknownNode]:F(u.UnknownNode,"Unknown node","Node usages must resolve to a known model.",!0),[u.MissingRequiredPort]:{code:u.MissingRequiredPort,title:"Missing required port",description:"Required ports must be supplied.",suppressible:!0,invalidExample:'<Action ID="SetFlag"/>',validExample:'<Action ID="SetFlag" enabled="true"/>',configExample:'{"linter":{"rules":{"model/require-port":"warn"}}}'},[u.UnknownPort]:{code:u.UnknownPort,title:"Unknown port",description:"Unknown ports are reported against the resolved node model.",suppressible:!0,invalidExample:'<Action ID="SetFlag" unknown="1"/>',validExample:'<Action ID="SetFlag" enabled="true"/>',configExample:'{"linter":{"rules":{"model/no-unknown-port":"error"}}}'},[u.InvalidPortValueType]:{code:u.InvalidPortValueType,title:"Invalid port value type",description:"Port values must match the declared type.",suppressible:!0,invalidExample:'<Action ID="SetFlag" enabled="yes"/>',validExample:'<Action ID="SetFlag" enabled="true"/>',configExample:'{"linter":{"rules":{"model/valid-port-value":"warn"}}}'},[u.BlackboardTypeMismatch]:{code:u.BlackboardTypeMismatch,title:"Blackboard type mismatch",description:"Blackboard entries must not mix incompatible resolved port types.",suppressible:!0,invalidExample:'<Sequence><ReadPose pose="{target}"/><UseString text="{target}"/></Sequence>',validExample:'<Sequence><ReadPose pose="{target}"/><UsePose pose="{target}"/></Sequence>',configExample:'{"linter":{"rules":{"model/no-blackboard-type-mismatch":["warn",{"allowStringEntryCompatibility":true}]}}}'},[u.CustomLiteralRequiresValidator]:{code:u.CustomLiteralRequiresValidator,title:"Custom literal requires validator",description:"Literal values for custom port types require a validator.",suppressible:!0,invalidExample:'<Action ID="MoveTo" target="1.0;2.0;3.14"/>',validExample:'<Action ID="MoveTo" target="{target}"/>',configExample:'{"linter":{"rules":{"model/valid-port-value":"warn"}}}'},[u.InvalidPortDefaultValue]:{code:u.InvalidPortDefaultValue,title:"Invalid port default value",description:"TreeNodesModel port defaults must match the declared type.",suppressible:!0,invalidExample:'<input_port name="count" type="int" default="abc"/>',validExample:'<input_port name="count" type="int" default="1"/>',configExample:'{"linter":{"rules":{"model/valid-port-default-value":"warn"}}}'},[u.OutputPortRequiresRemap]:{code:u.OutputPortRequiresRemap,title:"Output port requires remap",description:"Resolved output ports must be explicitly or default-remapped to a blackboard entry.",suppressible:!0,invalidExample:'<Action ID="Producer" result="value"/>',validExample:'<Action ID="Producer" result="{value}"/>',configExample:'{"linter":{"rules":{"model/require-output-port-remap":"error"}}}'},[u.AugmentTargetNotFound]:{code:u.AugmentTargetNotFound,title:"Augmentation target not found",description:"Model augmentations must target an existing node model.",suppressible:!1,invalidExample:'{"augment":{"MissingNode":{"ports":{}}}}',validExample:'{"augment":{"MoveTo":{"ports":{}}}}'},[u.AugmentPortNotFound]:{code:u.AugmentPortNotFound,title:"Augmentation port not found",description:"Model augmentations must target an existing port on the node model.",suppressible:!1,invalidExample:'{"augment":{"MoveTo":{"ports":{"missing":{}}}}}',validExample:'{"augment":{"MoveTo":{"ports":{"target":{}}}}}'},[u.InvalidTypeRefinement]:{code:u.InvalidTypeRefinement,title:"Invalid type refinement",description:"Model augmentation type refinements must match the port base type when `from` is provided.",suppressible:!1,invalidExample:'{"typeRefinement":{"from":"std::string","to":"Pose2D"}}',validExample:'{"typeRefinement":{"from":"int","to":"Pose2D"}}'},[u.ChildCapableNodeSelfClosing]:{code:u.ChildCapableNodeSelfClosing,title:"Child-capable node is self-closing",description:"Control and decorator nodes should normally use open/close tags.",suppressible:!0,invalidExample:"<Sequence/>",validExample:`<Sequence>
|
|
9
9
|
<AlwaysSuccess/>
|
|
10
|
-
</Sequence>`,configExample:'{"linter":{"rules":{"model/no-childless-control-shape-mismatch":"off"}}}'},[u.LeafNodeOpenClose]:{code:u.LeafNodeOpenClose,title:"Leaf node uses block shape",description:"Leaf nodes should normally be self-closing unless they contain child nodes.",suppressible:!0,invalidExample:"<AlwaysSuccess></AlwaysSuccess>",validExample:"<AlwaysSuccess/>",configExample:'{"linter":{"rules":{"model/no-leaf-block-shape":"off"}}}'},[u.InvalidChildCount]:{code:u.InvalidChildCount,title:"Invalid child count",description:"Node child count must satisfy the constraints for its kind: Action/Condition have no children, Decorator has exactly one, Control has one or more, SubTree has none, and special builtins like IfThenElse/WhileDoElse require 2 or 3.",suppressible:!0,invalidExample:"<Sequence/>",validExample:"<Sequence><AlwaysSuccess/></Sequence>",configExample:'{"linter":{"rules":{"model/valid-child-count":"warn"}}}'},[u.ExternalModelFileNotFound]:{code:u.ExternalModelFileNotFound,title:"External model file not found",description:"Configured external TreeNodesModel files must exist.",suppressible:!1,invalidExample:'{"models":{"files":["missing.xml"]}}',validExample:'{"models":{"files":["models.xml"]}}'},[u.AugmentationFileNotFound]:{code:u.AugmentationFileNotFound,title:"Augmentation file not found",description:"Configured augmentation files must exist.",suppressible:!1,invalidExample:'{"models":{"augmentations":["missing.xml"]}}',validExample:'{"models":{"augmentations":["augmentations.xml"]}}'},[u.MissingTreeNodesModel]:j(u.MissingTreeNodesModel,"Missing TreeNodesModel","External model files must contain a TreeNodesModel.",!1),[u.ExternalModelXmlParseError]:j(u.ExternalModelXmlParseError,"External model XML parse error","External model files must parse as XML.",!1),[u.NodeDefinitionFileNotFound]:{code:u.NodeDefinitionFileNotFound,title:"Node definition file not found",description:"Configured node definition files must exist.",suppressible:!1,invalidExample:'{"models":{"definitions":["missing.json"]}}',validExample:'{"models":{"definitions":["nodes.json"]}}'},[u.InvalidNodeDefinitionJson]:j(u.InvalidNodeDefinitionJson,"Invalid node definition JSON","Node definition files must parse as JSON.",!1),[u.InvalidNodeDefinitionSchema]:j(u.InvalidNodeDefinitionSchema,"Invalid node definition schema","Node definition files must match the expected schema.",!1),[u.DuplicateNodeDefinitionId]:j(u.DuplicateNodeDefinitionId,"Duplicate node definition ID","Node definition IDs must be unique.",!1),[u.InvalidAugmentationJson]:j(u.InvalidAugmentationJson,"Invalid augmentation JSON","Model augmentation files must parse as JSON.",!1),[u.InvalidAugmentationSchema]:j(u.InvalidAugmentationSchema,"Invalid augmentation schema","Model augmentation files must match the expected schema.",!1),[u.ConflictingPortDefault]:{code:u.ConflictingPortDefault,title:"Conflicting port default",description:"Merged port defaults must agree.",suppressible:!1,fix:"Run `btxmlc repair` to inspect conflicts. Run `btxmlc repair --write` to resolve the conflict interactively."},[u.UnusedSuppression]:j(u.UnusedSuppression,"Unused suppression","Suppressions should match at least one diagnostic.",!1),[u.MissingSuppressionReason]:j(u.MissingSuppressionReason,"Missing suppression reason","Suppressions should include a reason when required.",!1),XML016_TEXT_OUTSIDE_ROOT:j("XML016_TEXT_OUTSIDE_ROOT","Text outside root element","Non-whitespace text is not allowed outside the root element.",!1)},yc=Object.fromEntries(Object.values(W).flatMap(e=>{let t=e;return[t.code,...(t.codes??[]).filter(n=>n!==t.code)].map(n=>[n,t.defaultSeverity])})),hc={[u.DuplicateNodeModelId]:"error",[u.UnknownTopLevelElement]:"warning",[u.UnresolvedIncludePathVariable]:"error",[u.ExternalIncludeUsed]:"info",[u.IncludeDepthExceeded]:"error",[u.TooManyResolvedFiles]:"error",[u.EntrypointNotFound]:"error",[u.ExternalModelFileNotFound]:"error",[u.AugmentationFileNotFound]:"error",[u.MissingTreeNodesModel]:"error",[u.ExternalModelXmlParseError]:"error",[u.NodeDefinitionFileNotFound]:"error",[u.InvalidNodeDefinitionJson]:"error",[u.InvalidNodeDefinitionSchema]:"error",[u.DuplicateNodeDefinitionId]:"error",[u.InvalidAugmentationJson]:"error",[u.InvalidAugmentationSchema]:"error",[u.CustomLiteralRequiresValidator]:"error",[u.InvalidPortDefaultValue]:"error",[u.InvalidPortName]:"error",[u.AugmentTargetNotFound]:"error",[u.AugmentPortNotFound]:"error",[u.InvalidTypeRefinement]:"error",[u.ConflictingPortDefault]:"warning",[u.EmptyScript]:"error",[u.InvalidScriptToken]:"error",[u.InvalidCompoundAssignment]:"error",[u.ScriptVariableTypeMismatch]:"error",XML016_TEXT_OUTSIDE_ROOT:"error"};function bc(e){let t=yc[e]??hc[e];if(!t)throw new Error(`Missing default severity metadata for ${e}`);return t}var fn={};for(let[e,t]of Object.entries(gc))fn[e]={...t,defaultSeverity:bc(e)};var Tr={};for(let[e,t]of Object.entries(W)){let n=fn[t.code];if(n){let o=t;Tr[e]=o.options?{...n,options:o.options}:n}}function gn(e){return fn[e]}function yo(){return[...Object.values(u)].sort()}function Ir(e,t){if(t)return cn(e,t)}function Cr(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Er(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return T(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function vc(e,t,n,o,i){let r=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:r,typeSource:n.typeSource??Cr(n),validate:o.validate??n.validate,required:o.required??n.required,enum:o.enum?[...o.enum]:n.enum,description:o.description??n.description},l=o.typeRefinement;if(!l)return{...a,type:a.effectiveType};let d=Ir(e,l.from),c=Ir(e,r);return d&&d!==c?(i.push(Er({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 \`${r??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:r,actualFrom:l.from,to:l.to},notes:r||l.from?[`base type: ${r??"(unspecified)"}`,`requested from: ${l.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function Sc(e,t,n,o){let i=new Map(t.ports.map(r=>[r.name,r]));for(let[r,s]of Object.entries(n.ports??{})){let a=i.get(r);if(!a){o.push(Er({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${r}\` 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:r}}));continue}i.set(r,vc(e,t,a,s,o))}return{...t,ports:t.ports.map(r=>i.get(r.name)??r)}}function xc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??Cr(e)}}function Nr(e,t,n){let o=[],i=new Map([...e.entries()].map(([r,s])=>[r,{...s,ports:s.ports.map(xc)}]));for(let r of n)for(let[s,a]of Object.entries(r.augment??{})){let l=i.get(s);if(!l){o.push(T("BT117_AUGMENT_TARGET_NOT_FOUND",h.Error,`augmentation target node \`${s}\` not found`,void 0,r.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:r.path?[`augmentation file: ${r.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:r.path}));continue}i.set(s,Sc(t,l,a,o))}return{modelsById:i,diagnostics:o}}function Pr(e){return At("builtin",0,!1,e)}function Br(e){return At("xml-tree-nodes-model",10,!0,e)}function _r(e){return At("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Ar(e){return At("node-definition-file",20,!0,e)}function jr(e){return At("config-inline",30,!0,e)}function At(e,t,n,o){return{kind:e,precedence:t,editable:n,models:o.map(i=>Fr(i,e,n&&i.editable!==!1))}}function kc(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Fr(e,t,n){let o=kc(t);return{...e,source:o,sourceMeta:e.sourceMeta??{sourceKind:o,file:e.uri,range:e.range},editable:n,ports:e.ports.map(i=>({...i,source:o}))}}function mt(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 Mr(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 Rc(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let o=new Map(e.ports.map(r=>[r.name,r])),i=new Map(t.ports.map(r=>[r.name,r]));for(let[r,s]of o)i.has(r)||n.push({kind:"port-removed",portName:r,sourceIndex:0,port:Mr(s)});for(let[r,s]of i)o.has(r)||n.push({kind:"port-added",portName:r,sourceIndex:1,port:Mr(s)});for(let[r,s]of o){let a=i.get(r);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:r,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:r,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:r,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:r,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:r,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:r,left:s.description,right:a.description})}return n}function wr(e,t){let n=new Map;for(let o of e){let i=n.get(o.id);if(!i){n.set(o.id,o);continue}if(ut(i,o))continue;let r=lo(i,o),s=Rc(i,o),a;if(r==="port-default"){let l=new Map(i.ports.map(m=>[m.name,m])),d=o.ports.find(m=>{let f=l.get(m.name);return f&&f.defaultValue!==m.defaultValue}),c=d?.name??"unknown",p=[mt(i,0),mt(o,1)];a={kind:"port-default-conflict",nodeId:o.id,portName:c,sources:[{source:mt(i,0),value:l.get(c)?.defaultValue},{source:mt(o,1),value:d?.defaultValue}]},t.push({id:o.id,definitions:[i,o],sources:p,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${c}\` on node \`${o.id}\``,uri:o.uri,range:o.idRange||o.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${o.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 l=[mt(i,0),mt(o,1)];a={kind:"node-model-conflict",nodeId:o.id,sources:l,differences:s},t.push({id:o.id,definitions:[i,o],sources:l,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${o.id}\``,uri:o.uri,range:o.idRange||o.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${o.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 Dc(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(o=>[o.name,o]));for(let o of t.ports)n.set(o.name,o);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function Lr(e){let t=[],n=new Map,o=new Map,i=[...e].sort((a,l)=>a.precedence-l.precedence),r=new Map,s=new Map;for(let a of i){let l=r.get(a.precedence)??[],d=a.models.map(c=>Fr(c,a.kind,a.editable&&c.editable!==!1));l.push(...d),r.set(a.precedence,l);for(let c of d)s.set(c.id,a.precedence)}for(let[a,l]of[...r.entries()].sort((d,c)=>d[0]-c[0])){let d=l.filter(f=>s.get(f.id)===a),c=l.filter(f=>s.get(f.id)!==a),p=wr(c,[]);for(let[f,y]of wr(d,t))p.set(f,y);let m=new Set(l.map(f=>f.id));for(let f of m)s.get(f)===a&&n.set(f,l.filter(y=>y.id===f));for(let[f,y]of p)o.set(f,Dc(o.get(f),y))}return{nodeModelsById:n,mergedNodeModelsById:o,conflicts:t}}function Tc(e){return Bt.includes(e)}function Ic(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:ct(),augmentations:[]}}function Cc(e,t,n){let o=e.get(t)||[];o.push(n),e.set(t,o)}function Ec(e,t,n){for(let o of new Set(n))if(Tc(o)){for(let i of so(o))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...ao(o))}}function Nc(e,t,n,o,i){for(let r of i){let s=to(r,{uri:r.uri,path:r.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(r.uri,a);for(let l of a.behaviorTrees)Cc(e.behaviorTreesById,l.id,l);r.kind==="model-document"?o.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Mc(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 wc(e){let t=new Set,n=[];for(let o of e.genericSubTreePorts){let i=Mc(o);t.has(i)||(t.add(i),n.push(o))}e.genericSubTreePorts=n}function Pc(e,t,n,o,i){e.modelLayers.push(Pr(t),Br(n),_r(o)),i.models?.length&&e.modelLayers.push(Ar([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function jt(e,t){return Bc(e,t)}function Bc(e,t){let n=Ic(),o=[],i=[],r=[],s=[];Ec(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=ct(t.augmentations??[]),Nc(n,o,r,s,e),wc(n),Pc(n,i,r,s,t);let a=t.config.models.inline;if(a){let c=[];for(let[p,m]of Object.entries(a))c.push(Et(p,m));n.modelLayers.push(jr(c))}let l=Lr(n.modelLayers),d=Nr(l.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=l.nodeModelsById,n.mergedNodeModelsById=d.modelsById,n.modelConflicts=l.conflicts,o.push(...d.diagnostics),{ok:o.every(c=>c.severity!==h.Error),index:n,diagnostics:o}}var Or={unknownSubTreePorts:"allow"};function Ur(e){return{...Or,...e}}var _c=["Action","Condition","Control","Decorator"],Ac=new Set(_c);var jc=new Set(["input_port","output_port","inout_port"]);function bo(e){return Ac.has(e)}function yn(e,t){return e.attributes.find(n=>n.name===t)?.value}function ho(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&ho(n,t))return!0;return!1}function $r(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return ho(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&ho(n,t))return!0;return!1}function hn(e){return jc.has(e.name)}function qr(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":bo(e.name)?"generic-node":hn(e)?"unknown-xml":"concrete-node"}function vo(e){if(e.name==="SubTree")return yn(e,"ID")||"SubTree";if(bo(e.name))return yn(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||hn(e)))return e.name}function ge(e){return e.typeRegistry}function ve(e,t){return fe(ge(e),t)}function ft(e,t,n){return wt(ge(e),t,n)}function Ft(e,t){return e.documents.get(t)}function Se(e,t){return e.behaviorTreesById.get(t)??[]}function So(e,t){return e.behaviorTreesById.has(t)}function Vr(e){return yt(e).flatMap(t=>t.nodeUsages)}function xo(e){let t=new Map;for(let n of Vr(e)){let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}function gt(e){return[...e.behaviorTreesById.keys()]}function yt(e){return[...e.documents.values()]}function Ae(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(o=>o.id===t))}function ko(e){return e.modelLayers.flatMap(t=>t.models)}function Ro(e){return[...e.mergedNodeModelsById.values()]}function Do(e){return[...e.nodeModelsById.keys()]}function To(e){return[...e.genericSubTreePorts]}function Io(e){return[...e.augmentations]}function Ot(e){return e.modelConflicts}function Ut(e,t){let{id:n,fileLocalUri:o,config:i}=t,r=Se(e,n);if(r.length>0){if((i?.resolver?.behaviorTreeIds==="file-local-first"||i?.resolver?.behaviorTreeIds==="allow-ambiguous")&&o){let d=r.filter(c=>c.uri===o);d.length>0&&(r=d)}let a=Ae(e,n),l=a?.kind==="SubTree"?[a]:[];return r.length===1?{status:"resolved",kind:"behavior-tree",treeId:r[0].id,behaviorTree:r[0]}:{status:"ambiguous",candidates:[...r.map(d=>d.id),...l.map(d=>d.id)],behaviorTrees:r,definitions:l}}let s=Ae(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function Co(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=Ae(e,t);if(n){let i=Ot(e).find(r=>r.id===t&&r.code==="BT012_CONFLICTING_NODE_MODEL");return i?{status:"ambiguous",nodeType:t,candidates:i.definitions}:{status:"resolved",model:n}}let o=Lt(e,t);return o.length===1?{status:"resolved",model:o[0]}:o.length>1?{status:"ambiguous",nodeType:t,candidates:o}:{status:"unresolved",nodeType:t}}function Eo(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function No(e){let t=To(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return Eo([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Mo(e){let{attribute:t}=e,n=e.ports.find(o=>o.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:no(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 je(e,t){let n=Ur(t.policy),o=t.element,i=qr(o),r=$r(t.documentRoot,o);if((t.isModelDefinition||r&&(i==="generic-node"||i==="subtree"))&&(i="model-definition"),r&&hn(o)&&(i="unknown-xml"),i==="root"||i==="behavior-tree"||i==="tree-nodes-model"||i==="include"||i==="model-definition"||i==="unknown-xml")return{element:o,tagName:o.name,tagForm:i,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=vo(o);if(i!=="subtree"){let f=Co(e,s),y=No({index:e,tagForm:i,model:f}),g=o.attributes.map(S=>Mo({attribute:S,ports:y,allowsArbitraryAttributes:!1,model:f}));return{element:o,tagName:o.name,tagForm:i,nodeType:s,model:f,ports:y,allowsArbitraryAttributes:!1,portUsages:g}}let a=yn(o,"ID"),l=a?Ut(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},d={status:"unresolved",nodeType:a},c=!1;if(l.status==="resolved"&&l.kind==="node-model")d={status:"resolved",model:l.model};else if(l.status==="resolved"&&l.kind==="behavior-tree"){let f=Co(e,l.treeId);f.status==="resolved"&&f.model.kind==="SubTree"?d=f:c=n.unknownSubTreePorts==="allow"}else l.status==="ambiguous"&&l.definitions.length>0?d=l.definitions.length===1?{status:"resolved",model:l.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:l.definitions}:c=n.unknownSubTreePorts==="allow";let p=No({index:e,tagForm:i,model:d,subtreeModelPorts:l.status==="ambiguous"?Eo(l.definitions.flatMap(f=>f.ports)):void 0}),m=o.attributes.map(f=>Mo({attribute:f,ports:p,allowsArbitraryAttributes:c,model:d,unknownModelPortStatus:!c&&d.status!=="resolved"?"undeclared":void 0}));return{element:o,tagName:o.name,tagForm:i,nodeType:s,model:d,subtree:{id:a,target:l},ports:p,allowsArbitraryAttributes:c,portUsages:m}}function bn(e,t){return je(e,t).portUsages.find(o=>o.name===t.attributeName)}function Oc(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function Uc(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Xr(e,t){let n=e.line,o=e.character,i=e.offset;for(let r of t){if(i+=r.length,r===`
|
|
11
|
-
`){n+=1,o=0;continue}o+=r.length}return{line:n,character:o,offset:i}}function
|
|
12
|
-
`?(n++,o=0):o++;return
|
|
13
|
-
`||e==="\r"}function
|
|
14
|
-
`&&e!=="\r"}function
|
|
15
|
-
`?(s+=1,a=0):a+=1}function y(){for(;!p()&&Zc(m());)f()}let g=(b,w,E,_,R,L)=>{n.push(T(b,w,E,I(_,R),i.uri,L))};function S(b,w,E,_,R,L){n.push(T(b,w,E,_&&R?I(_,R):void 0,i.uri,L))}function v(){if(!Jc(m()))return"";let b=r;for(f();!p()&&Yc(m());)f();return e.slice(b,r)}function x(){let b=m();if(b!=='"'&&b!=="'")return{value:"",ok:!1};let w=c();f();let E=c(),_=r;for(;!p()&&m()!==b&&m()!=="<";)f();let R=c();if(p()||m()!==b)return{value:e.slice(_,r),ok:!1,valueRange:I(w,R),valueContentRange:I(E,R)};let L=e.slice(_,r);f(),_o(L,E.offset,e,g);let Ce=Kr(L);return{value:Ce.value,valueOffsets:Ce.offsets,ok:!0,valueRange:I(w,c()),valueContentRange:I(E,R)}}function D(){let b=[],w=new Set;for(;;){y();let E=m();if(!E||E===">"||E==="/"&&m(1)===">")break;let _=c(),R=v(),L=c();if(!R)break;y();let Ce=c();if(m()!=="="){if(g("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",_,L,{primaryLabel:`expected \`=\` after attribute \`${R}\``,help:`write the attribute as \`${R}="..."\``}),d=!0,o)continue;break}f();let Zl=c();y();let Zn=c(),We=x(),lt=c();if(!We.ok&&(g("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",Zn,lt,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${R}="value"\``}),d=!0,!o)||(w.has(R)?g("XML004_DUPLICATE_ATTRIBUTE",h.Error,`duplicate attribute \`${R}\``,_,lt,{primaryLabel:`attribute \`${R}\` is already defined on this element`,help:`remove one of the duplicate \`${R}\` attributes`}):w.add(R),b.push({name:R,value:We.value,...We.valueOffsets?{valueOffsets:We.valueOffsets}:{},range:I(_,lt),fullRange:I(_,lt),nameRange:I(_,L),equalsRange:I(Ce,Zl),valueRange:We.valueRange||I(Zn,lt),valueContentRange:We.valueContentRange||I(Zn,lt)}),!We.ok&&o))break}return b}function M(b){l.length>0?l[l.length-1].children.push(b):(i.nodes.push(b),!i.root&&b.kind==="element"&&(i.root=b))}function P(){let b=c(),w=r;for(;!p()&&m()!=="<";)f();let E=e.slice(w,r);if(E.length===0)return;for(let R of E)if(Qc(R)){g("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",b,c(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}_o(E,w,e,g);let _={kind:"text",text:Vt(E),range:I(b,c()),fullRange:I(b,c())};M(_)}function B(){let b=c();f(4);let w=c(),E=r;for(;!p()&&!(m()==="-"&&m(1)==="-"&&m(2)===">");)f();let _=e.slice(E,r);if(p()){if(g("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",b,c(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),d=!0,!o)return;let Ce={kind:"comment",text:_,range:I(b,c()),fullRange:I(b,c()),contentRange:I(w,c())};M(Ce);return}(_.includes("--")||_.endsWith("-"))&&g("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",w,c(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let R=c();f(3);let L={kind:"comment",text:_,range:I(b,c()),fullRange:I(b,c()),contentRange:I(w,R)};M(L)}function A(){let b=c();f(5),y();let w=D();y(),m()==="?"&&m(1)===">"?f(2):g("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",b,c(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let E={range:I(b,c()),attributes:w};for(let _ of w)_.name==="version"&&(E.version=_.value),_.name==="encoding"&&(E.encoding=_.value),_.name==="standalone"&&(E.standalone=_.value);i.xmlDeclaration=E}function Be(){let b=c();f(2),y();let w=c(),E=v(),_=c();if(y(),m()!==">")for(g("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",b,c(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),d=!0;!p()&&m()!==">";)f();m()===">"&&f();let R=l.pop();if(!R||R.name!==E){let L=R?R.name:E||"",Ce=E||"";g("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${Ce}>\``,b,c(),{primaryLabel:`opened as \`<${L}>\` but closed as \`</${Ce}>\``,help:`change the closing tag to \`</${L}>\` or fix the nesting`});return}R.closeTagRange=I(b,c()),R.endTagRange=I(b,c()),R.nameRange||(R.nameRange=I(w,_)),R.range=I(R.range.start,c()),R.fullRange=I(R.range.start,c())}for(;!p();)if(m()==="<")if(m(1)==="?")if(e.slice(r,r+5).toLowerCase()==="<?xml"&&e.charAt(r+5)===" ")A();else{let b=c();for(;!p()&&!(m()==="?"&&m(1)===">");)f();p()||f(2),g("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",b,c(),{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(r+3,r+9)==="CDATA["){let b=c();for(f(8);!p()&&!(m()==="]"&&m(1)==="]"&&m(2)===">");)f();p()||f(3),g("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",b,c(),{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(r+2,r+9)==="DOCTYPE"){let b=c();for(f(8);!p()&&m()!==">";)f();p()||f(1),g("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",b,c(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(m(1)==="/")Be();else{let b=c();f();let w=c(),E=v(),_=c();if(!E){if(g("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",b,c(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),d=!0,o){f();continue}break}let R={kind:"element",name:E,attributes:[],children:[],range:I(b,b),fullRange:I(b,b),openTagRange:I(b,b),startTagRange:I(b,b),nameRange:I(w,_),selfClosing:!1};if(R.attributes=D(),y(),m()==="/"&&m(1)===">"){f(2),R.selfClosing=!0,R.openTagRange=I(b,c()),R.startTagRange=R.openTagRange,R.range=I(b,c()),R.fullRange=I(b,c()),M(R);continue}if(m()!==">"){if(g("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",b,c(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),d=!0,o){R.openTagRange=I(b,c()),R.startTagRange=R.openTagRange,R.range=I(b,c()),R.fullRange=I(b,c()),M(R);continue}break}f(),R.openTagRange=I(b,c()),R.startTagRange=R.openTagRange,R.range=I(b,c()),R.fullRange=I(b,c()),M(R),l.push(R)}else P();if(l.length>0){let b=l[l.length-1];if(g("XML006_MISSING_CLOSING_TAG",h.Error,`missing closing tag for \`<${b.name}>\``,b.openTagRange.start,b.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${b.name}>\` before the end of the file`}),d=!0,o)for(;l.length>0;){let w=l.pop();if(!w)break;w.range=I(w.range.start,c()),w.fullRange=I(w.range.start,c())}}let re=i.nodes.filter(b=>b.kind==="element");re.length===0?S("XML002_MISSING_ROOT",h.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):re.length>1&&S("XML003_MULTIPLE_ROOTS",h.Error,"multiple root elements",void 0,void 0,{primaryLabel:"this document has more than one top-level element",help:'wrap the document content in one `<root BTCPP_format="4">...</root>` element'});let O=i.root,me=O?.name==="BehaviorTree"||O?.name==="TreeNodesModel"||O?.name==="root"&&(O.attributes.some(b=>b.name==="BTCPP_format"&&b.value==="4")||O.children.some(b=>b.kind==="element"&&(b.name==="BehaviorTree"||b.name==="TreeNodesModel")));if(O)for(let b of i.nodes)b!==O&&b.kind==="text"&&b.text.trim().length>0&&g("XML016_TEXT_OUTSIDE_ROOT",h.Error,"text outside root element",b.range.start,b.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!i.xmlDeclaration&&!me)S("XML008_MISSING_DECLARATION",h.Warning,"missing XML declaration",void 0,void 0,{help:'add `<?xml version="1.0" encoding="UTF-8"?>` at the top of the file',notes:["this is a warning because BehaviorTree.CPP can still parse many files without a declaration"]});else if(i.xmlDeclaration?.encoding&&i.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let b=i.xmlDeclaration.encoding;g("XML009_INVALID_ENCODING",h.Warning,"XML encoding should be UTF-8",i.xmlDeclaration.range.start,i.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${b}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return O&&Bo(O,b=>{g("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",Hr(b.range.start),Hr(b.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"]})}),Wr({document:i,diagnostics:n,partial:d,options:t})}var Xt={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function Jr(e){if(!e)return Xt;let t=typeof e.indentWidth=="number"?e.indentWidth:Xt.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:Xt.xmlDeclaration,o=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:Xt.blankLineBetweenBehaviorTrees,i=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:Xt.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:o,lineEnding:i}}function vn(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Sn(e){return vn(e).replace(/"/g,""")}function eu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function tu(e,t,n){return`${" ".repeat(e*n)}${t}`}function ht(e,t,n,o){let i=" ".repeat(t*o),r=e.attributes||[];if(r.length===0)return[`${i}<${e.name}${n}`];if(r.length===1)return[`${i}<${e.name} ${r[0].name}="${Sn(r[0].value)}"${n}`];let s=[`${i}<${e.name} ${r[0].name}="${Sn(r[0].value)}"`],a=" ".repeat(i.length+1+e.name.length+1);for(let l=1;l<r.length;l+=1){let d=r[l],c=l===r.length-1?n:"";s.push(`${a}${d.name}="${Sn(d.value)}"${c}`)}return s}function xn(e,t,n,o){let i=" ".repeat(t*n);if(e.kind==="comment")return[`${i}<!--${e.text}-->`];if(e.kind==="text"){let c=e.text.trim();return c?[tu(t,vn(c),n)]:[]}let r=eu(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(c=>c.kind==="text").map(c=>c.text).join("").trim(),l=r.some(c=>c.kind==="element"||c.kind==="comment");if(a&&l&&!s&&o.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!l){if((e.attributes||[]).length<=1){let c=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${Sn(e.attributes[0].value)}"`;return[`${i}<${e.name}${c}>${vn(a)}</${e.name}>`]}return ht(e,t,`>${vn(a)}</${e.name}>`,n)}if(r.length===0){if(e.selfClosing)return ht(e,t,"/>".slice(0),n);let c=ht(e,t,">",n);return c.push(`${i}</${e.name}>`),c}let d=ht(e,t,">",n);for(let c of e.children||[])c.kind==="text"&&c.text.trim()===""||d.push(...xn(c,t+1,n,o));return d.push(`${i}</${e.name}>`),d}function nu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function Yr(e,t,n,o){let i=[],r=nu(e);for(let s=0;s<r.length;s+=1){let a=r[s],l=r[s-1],d=r[s+1],c=n&&a.kind==="element"&&a.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",p=a.kind==="element"&&a.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",m=a.kind==="comment"&&d&&d.kind==="element"&&d.name==="TreeNodesModel"&&l!==void 0;(c||p||m)&&i.length>0&&i[i.length-1]!==""&&i.push(""),a.kind==="element"?(i.push(...xn(a,1,t,o)),a.name==="TreeNodesModel"&&i.push("")):i.push(...xn(a,1,t,o))}return i}function bt(e,t={}){let n=Le(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(g=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(g.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,r=Jr(t),s=r.indentWidth,a=[],l=n.document.xmlDeclaration!==void 0;if((r.xmlDeclaration==="always"||r.xmlDeclaration==="preserve"&&l)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...ht(i,0,">",s)),a.push(...Yr(i.children||[],s,r.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${i.name}>`),n.diagnostics.some(g=>g.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let d=`
|
|
10
|
+
</Sequence>`,configExample:'{"linter":{"rules":{"model/no-childless-control-shape-mismatch":"off"}}}'},[u.LeafNodeOpenClose]:{code:u.LeafNodeOpenClose,title:"Leaf node uses block shape",description:"Leaf nodes should normally be self-closing unless they contain child nodes.",suppressible:!0,invalidExample:"<AlwaysSuccess></AlwaysSuccess>",validExample:"<AlwaysSuccess/>",configExample:'{"linter":{"rules":{"model/no-leaf-block-shape":"off"}}}'},[u.InvalidChildCount]:{code:u.InvalidChildCount,title:"Invalid child count",description:"Node child count must satisfy the constraints for its kind: Action/Condition have no children, Decorator has exactly one, Control has one or more, SubTree has none, and special builtins like IfThenElse/WhileDoElse require 2 or 3.",suppressible:!0,invalidExample:"<Sequence/>",validExample:"<Sequence><AlwaysSuccess/></Sequence>",configExample:'{"linter":{"rules":{"model/valid-child-count":"warn"}}}'},[u.ExternalModelFileNotFound]:{code:u.ExternalModelFileNotFound,title:"External model file not found",description:"Configured external TreeNodesModel files must exist.",suppressible:!1,invalidExample:'{"models":{"files":["missing.xml"]}}',validExample:'{"models":{"files":["models.xml"]}}'},[u.AugmentationFileNotFound]:{code:u.AugmentationFileNotFound,title:"Augmentation file not found",description:"Configured augmentation files must exist.",suppressible:!1,invalidExample:'{"models":{"augmentations":["missing.xml"]}}',validExample:'{"models":{"augmentations":["augmentations.xml"]}}'},[u.MissingTreeNodesModel]:F(u.MissingTreeNodesModel,"Missing TreeNodesModel","External model files must contain a TreeNodesModel.",!1),[u.ExternalModelXmlParseError]:F(u.ExternalModelXmlParseError,"External model XML parse error","External model files must parse as XML.",!1),[u.NodeDefinitionFileNotFound]:{code:u.NodeDefinitionFileNotFound,title:"Node definition file not found",description:"Configured node definition files must exist.",suppressible:!1,invalidExample:'{"models":{"definitions":["missing.json"]}}',validExample:'{"models":{"definitions":["nodes.json"]}}'},[u.InvalidNodeDefinitionJson]:F(u.InvalidNodeDefinitionJson,"Invalid node definition JSON","Node definition files must parse as JSON.",!1),[u.InvalidNodeDefinitionSchema]:F(u.InvalidNodeDefinitionSchema,"Invalid node definition schema","Node definition files must match the expected schema.",!1),[u.DuplicateNodeDefinitionId]:F(u.DuplicateNodeDefinitionId,"Duplicate node definition ID","Node definition IDs must be unique.",!1),[u.InvalidAugmentationJson]:F(u.InvalidAugmentationJson,"Invalid augmentation JSON","Model augmentation files must parse as JSON.",!1),[u.InvalidAugmentationSchema]:F(u.InvalidAugmentationSchema,"Invalid augmentation schema","Model augmentation files must match the expected schema.",!1),[u.ConflictingPortDefault]:{code:u.ConflictingPortDefault,title:"Conflicting port default",description:"Merged port defaults must agree.",suppressible:!1,fix:"Run `btxmlc repair` to inspect conflicts. Run `btxmlc repair --write` to resolve the conflict interactively."},[u.UnusedSuppression]:F(u.UnusedSuppression,"Unused suppression","Suppressions should match at least one diagnostic.",!1),[u.MissingSuppressionReason]:F(u.MissingSuppressionReason,"Missing suppression reason","Suppressions should include a reason when required.",!1),XML016_TEXT_OUTSIDE_ROOT:F("XML016_TEXT_OUTSIDE_ROOT","Text outside root element","Non-whitespace text is not allowed outside the root element.",!1)},jc=Object.fromEntries(Object.values(H).flatMap(e=>{let t=e;return[t.code,...(t.codes??[]).filter(n=>n!==t.code)].map(n=>[n,t.defaultSeverity])})),Lc={[u.DuplicateNodeModelId]:"error",[u.UnknownTopLevelElement]:"warning",[u.UnresolvedIncludePathVariable]:"error",[u.ExternalIncludeUsed]:"info",[u.IncludeDepthExceeded]:"error",[u.TooManyResolvedFiles]:"error",[u.EntrypointNotFound]:"error",[u.ExternalModelFileNotFound]:"error",[u.AugmentationFileNotFound]:"error",[u.MissingTreeNodesModel]:"error",[u.ExternalModelXmlParseError]:"error",[u.NodeDefinitionFileNotFound]:"error",[u.InvalidNodeDefinitionJson]:"error",[u.InvalidNodeDefinitionSchema]:"error",[u.DuplicateNodeDefinitionId]:"error",[u.InvalidAugmentationJson]:"error",[u.InvalidAugmentationSchema]:"error",[u.CustomLiteralRequiresValidator]:"error",[u.InvalidPortDefaultValue]:"error",[u.InvalidPortName]:"error",[u.AugmentTargetNotFound]:"error",[u.AugmentPortNotFound]:"error",[u.InvalidTypeRefinement]:"error",[u.ConflictingPortDefault]:"warning",[u.EmptyScript]:"error",[u.InvalidScriptToken]:"error",[u.InvalidCompoundAssignment]:"error",[u.ScriptVariableTypeMismatch]:"error",XML016_TEXT_OUTSIDE_ROOT:"error"};function Uc(e){let t=jc[e]??Lc[e];if(!t)throw new Error(`Missing default severity metadata for ${e}`);return t}var yn={};for(let[e,t]of Object.entries(Fc))yn[e]={...t,defaultSeverity:Uc(e)};var wr={};for(let[e,t]of Object.entries(H)){let n=yn[t.code];if(n){let o=t;wr[e]=o.options?{...n,options:o.options}:n}}function hn(e){return yn[e]}function ko(){return[...Object.values(u)].sort()}function Br(e,t){if(t)return pn(e,t)}function _r(e){return e.source==="inline-tree-nodes-model"||e.source==="external-tree-nodes-model",e.source}function Ar(e){let t=e.port?.uri??e.model?.uri??"",n=e.port?.nameRange??e.port?.range??e.model?.idRange??e.model?.range;return R(e.code,h.Error,e.message,n,t,{primaryLabel:e.message,help:e.help,notes:e.notes},e.data)}function Oc(e,t,n,o,i){let r=n.effectiveType??n.type,s=n.originalType??n.type,a={...n,originalType:s,effectiveType:r,typeSource:n.typeSource??_r(n),validate:o.validate??n.validate,required:o.required??n.required,enum:o.enum?[...o.enum]:n.enum,description:o.description??n.description},l=o.typeRefinement;if(!l)return{...a,type:a.effectiveType};let d=Br(e,l.from),c=Br(e,r);return d&&d!==c?(i.push(Ar({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 \`${r??"unknown"}\`, or remove it for an unconditional refinement`,model:t,port:n,data:{kind:"invalid-type-refinement",nodeId:t.id,portName:n.name,expectedFrom:r,actualFrom:l.from,to:l.to},notes:r||l.from?[`base type: ${r??"(unspecified)"}`,`requested from: ${l.from??"(unspecified)"}`]:void 0})),{...a,type:a.effectiveType}):{...a,type:l.to,effectiveType:l.to,typeSource:"model-augmentation",typeRefinement:l}}function $c(e,t,n,o){let i=new Map(t.ports.map(r=>[r.name,r]));for(let[r,s]of Object.entries(n.ports??{})){let a=i.get(r);if(!a){o.push(Ar({code:"BT118_AUGMENT_PORT_NOT_FOUND",message:`augmentation port \`${r}\` 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:r}}));continue}i.set(r,Oc(e,t,a,s,o))}return{...t,ports:t.ports.map(r=>i.get(r.name)??r)}}function Vc(e){let t=e.effectiveType??e.type,n=e.originalType??e.type;return{...e,type:t,effectiveType:t,originalType:n,typeSource:e.typeSource??_r(e)}}function Fr(e,t,n){let o=[],i=new Map([...e.entries()].map(([r,s])=>[r,{...s,ports:s.ports.map(Vc)}]));for(let r of n)for(let[s,a]of Object.entries(r.augment??{})){let l=i.get(s);if(!l){o.push(R("BT117_AUGMENT_TARGET_NOT_FOUND",h.Error,`augmentation target node \`${s}\` not found`,void 0,r.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:r.path?[`augmentation file: ${r.path}`]:void 0},{kind:"augment-target-not-found",nodeId:s,filePath:r.path}));continue}i.set(s,$c(t,l,a,o))}return{modelsById:i,diagnostics:o}}function Ur(e){return Lt("builtin",0,!1,e)}function Or(e){return Lt("xml-tree-nodes-model",10,!0,e)}function $r(e){return Lt("external-tree-nodes-model",15,e.some(t=>t.editable!==!1),e)}function Vr(e){return Lt("node-definition-file",20,!0,e)}function qr(e){return Lt("config-inline",30,!0,e)}function Lt(e,t,n,o){return{kind:e,precedence:t,editable:n,models:o.map(i=>Xr(i,e,n&&i.editable!==!1))}}function qc(e){return e==="config-inline"?"config":e==="xml-tree-nodes-model"?"inline-tree-nodes-model":e}function Xr(e,t,n){let o=qc(t);return{...e,source:o,sourceMeta:e.sourceMeta??{sourceKind:o,file:e.uri,range:e.range},editable:n,ports:e.ports.map(i=>({...i,source:o}))}}function yt(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 jr(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 Xc(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let o=new Map(e.ports.map(r=>[r.name,r])),i=new Map(t.ports.map(r=>[r.name,r]));for(let[r,s]of o)i.has(r)||n.push({kind:"port-removed",portName:r,sourceIndex:0,port:jr(s)});for(let[r,s]of i)o.has(r)||n.push({kind:"port-added",portName:r,sourceIndex:1,port:jr(s)});for(let[r,s]of o){let a=i.get(r);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:r,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:r,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:r,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:r,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:r,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:r,left:s.description,right:a.description})}return n}function Lr(e,t){let n=new Map;for(let o of e){let i=n.get(o.id);if(!i){n.set(o.id,o);continue}if(ft(i,o))continue;let r=go(i,o),s=Xc(i,o),a;if(r==="port-default"){let l=new Map(i.ports.map(m=>[m.name,m])),d=o.ports.find(m=>{let f=l.get(m.name);return f&&f.defaultValue!==m.defaultValue}),c=d?.name??"unknown",p=[yt(i,0),yt(o,1)];a={kind:"port-default-conflict",nodeId:o.id,portName:c,sources:[{source:yt(i,0),value:l.get(c)?.defaultValue},{source:yt(o,1),value:d?.defaultValue}]},t.push({id:o.id,definitions:[i,o],sources:p,code:"BT107_CONFLICTING_PORT_DEFAULT",message:`conflicting default for port \`${c}\` on node \`${o.id}\``,uri:o.uri,range:o.idRange||o.range,details:{primaryLabel:"the same port has different default values across model definitions",help:`use the same default value in every \`${o.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 l=[yt(i,0),yt(o,1)];a={kind:"node-model-conflict",nodeId:o.id,sources:l,differences:s},t.push({id:o.id,definitions:[i,o],sources:l,code:"BT012_CONFLICTING_NODE_MODEL",message:`conflicting node model \`${o.id}\``,uri:o.uri,range:o.idRange||o.range,details:{primaryLabel:"another model with this ID defines a different kind or port shape",help:`make all \`${o.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 Gc(e,t){if(!e)return{...t,ports:[...t.ports]};let n=new Map(e.ports.map(o=>[o.name,o]));for(let o of t.ports)n.set(o.name,o);return{...e,...t,sourceMeta:t.sourceMeta||e.sourceMeta,ports:[...n.values()]}}function Gr(e){let t=[],n=new Map,o=new Map,i=[...e].sort((a,l)=>a.precedence-l.precedence),r=new Map,s=new Map;for(let a of i){let l=r.get(a.precedence)??[],d=a.models.map(c=>Xr(c,a.kind,a.editable&&c.editable!==!1));l.push(...d),r.set(a.precedence,l);for(let c of d)s.set(c.id,a.precedence)}for(let[a,l]of[...r.entries()].sort((d,c)=>d[0]-c[0])){let d=l.filter(f=>s.get(f.id)===a),c=l.filter(f=>s.get(f.id)!==a),p=Lr(c,[]);for(let[f,y]of Lr(d,t))p.set(f,y);let m=new Set(l.map(f=>f.id));for(let f of m)s.get(f)===a&&n.set(f,l.filter(y=>y.id===f));for(let[f,y]of p)o.set(f,Gc(o.get(f),y))}return{nodeModelsById:n,mergedNodeModelsById:o,conflicts:t}}function zc(e){return Ft.includes(e)}function Kc(){return{documents:new Map,behaviorTreesById:new Map,nodeModelsById:new Map,mergedNodeModelsById:new Map,modelLayers:[],builtins:new Map,genericSubTreePorts:[],modelConflicts:[],typeRegistry:mt(),augmentations:[]}}function Wc(e,t,n){let o=e.get(t)||[];o.push(n),e.set(t,o)}function Hc(e,t,n){for(let o of new Set(n))if(zc(o)){for(let i of mo(o))e.builtins.set(i.id,i),t.push(i);e.genericSubTreePorts.push(...fo(o))}}function Jc(e,t,n,o,i){for(let r of i){let s=ao(r,{uri:r.uri,path:r.path}),a=s.model;t.push(...s.diagnostics),e.documents.set(r.uri,a);for(let l of a.behaviorTrees)Wc(e.behaviorTreesById,l.id,l);r.kind==="model-document"?o.push(...a.treeNodesModel):n.push(...a.treeNodesModel),e.genericSubTreePorts.push(...a.genericSubTreePorts)}}function Yc(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 Zc(e){let t=new Set,n=[];for(let o of e.genericSubTreePorts){let i=Yc(o);t.has(i)||(t.add(i),n.push(o))}e.genericSubTreePorts=n}function Qc(e,t,n,o,i){e.modelLayers.push(Ur(t),Or(n),$r(o)),i.models?.length&&e.modelLayers.push(Vr([...i.models])),e.modelLayers.push(...i.additionalModelLayers??[])}function Ut(e,t){return eu(e,t)}function eu(e,t){let n=Kc(),o=[],i=[],r=[],s=[];Hc(n,i,t.config.models.builtins),n.augmentations=t.augmentations??[],n.typeRegistry=mt(t.augmentations??[]),Jc(n,o,r,s,e),Zc(n),Qc(n,i,r,s,t);let a=t.config.models.inline;if(a){let c=[];for(let[p,m]of Object.entries(a))c.push(Pt(p,m));n.modelLayers.push(qr(c))}let l=Gr(n.modelLayers),d=Fr(l.mergedNodeModelsById,n.typeRegistry,t.augmentations??[]);return n.nodeModelsById=l.nodeModelsById,n.mergedNodeModelsById=d.modelsById,n.modelConflicts=l.conflicts,o.push(...d.diagnostics),{ok:o.every(c=>c.severity!==h.Error),index:n,diagnostics:o}}var zr={unknownSubTreePorts:"allow"};function Kr(e){return{...zr,...e}}var tu=["Action","Condition","Control","Decorator"],nu=new Set(tu);var ou=new Set(["input_port","output_port","inout_port"]);function Do(e){return nu.has(e)}function bn(e,t){return e.attributes.find(n=>n.name===t)?.value}function To(e,t){if(e===t)return!0;for(let n of e.children)if(n.kind==="element"&&To(n,t))return!0;return!1}function Wr(e,t){if(!e)return!1;if(e.name==="TreeNodesModel")return To(e,t);for(let n of e.children)if(!(n.kind!=="element"||n.name!=="TreeNodesModel")&&To(n,t))return!0;return!1}function xn(e){return ou.has(e.name)}function Hr(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":Do(e.name)?"generic-node":xn(e)?"unknown-xml":"concrete-node"}function Ro(e){if(e.name==="SubTree")return bn(e,"ID")||"SubTree";if(Do(e.name))return bn(e,"ID");if(!(e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"||e.name==="include"||xn(e)))return e.name}function ye(e){return e.typeRegistry}function Se(e,t){return ge(ye(e),t)}function ht(e,t,n){return _t(ye(e),t,n)}function Ot(e,t){return e.documents.get(t)}function ve(e,t){return e.behaviorTreesById.get(t)??[]}function Co(e,t){return e.behaviorTreesById.has(t)}function Jr(e){return xt(e).flatMap(t=>t.nodeUsages)}function Io(e){let t=new Map;for(let n of Jr(e)){let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}function bt(e){return[...e.behaviorTreesById.keys()]}function xt(e){return[...e.documents.values()]}function ke(e,t){let n=e;return n.mergedNodeModelsById.get(t)??n.builtins.get(t)}function He(e,t){return e.modelLayers.flatMap(n=>n.models.filter(o=>o.id===t))}function Eo(e){return e.modelLayers.flatMap(t=>t.models)}function Mo(e){return[...e.mergedNodeModelsById.values()]}function No(e){return[...e.nodeModelsById.keys()]}function Po(e){return[...e.genericSubTreePorts]}function wo(e){return[...e.augmentations]}function Je(e){return e.modelConflicts}function $t(e,t){let{id:n,fileLocalUri:o,config:i}=t,r=ve(e,n);if(r.length>0){if((i?.resolver?.behaviorTreeIds==="file-local-first"||i?.resolver?.behaviorTreeIds==="allow-ambiguous")&&o){let d=r.filter(c=>c.uri===o);d.length>0&&(r=d)}let a=ke(e,n),l=a?.kind==="SubTree"?[a]:[];return r.length===1?{status:"resolved",kind:"behavior-tree",treeId:r[0].id,behaviorTree:r[0]}:{status:"ambiguous",candidates:[...r.map(d=>d.id),...l.map(d=>d.id)],behaviorTrees:r,definitions:l}}let s=ke(e,n);return s?.kind==="SubTree"?{status:"resolved",kind:"node-model",modelId:s.id,model:s}:{status:"unresolved",id:n}}function Bo(e,t){if(!t)return{status:"unresolved",nodeType:t};let n=ke(e,t);if(n){let i=Je(e).find(r=>r.id===t&&r.code==="BT012_CONFLICTING_NODE_MODEL");return i?{status:"ambiguous",nodeType:t,candidates:i.definitions}:{status:"resolved",model:n}}let o=He(e,t);return o.length===1?{status:"resolved",model:o[0]}:o.length>1?{status:"ambiguous",nodeType:t,candidates:o}:{status:"unresolved",nodeType:t}}function _o(e){let t=new Map;for(let n of e)t.has(n.name)||t.set(n.name,n);return[...t.values()]}function Ao(e){let t=Po(e.index);if(e.tagForm==="subtree"){let n=e.model.status==="resolved"?e.model.model.ports:e.subtreeModelPorts??[];return _o([...n,...t])}return e.model.status==="resolved"?[...e.model.model.ports]:[]}function Fo(e){let{attribute:t}=e,n=e.ports.find(o=>o.name===t.name);return n?{status:"resolved",attribute:t,name:t.name,value:t.value,port:n}:lo(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 Fe(e,t){let n=Kr(t.policy),o=t.element,i=Hr(o),r=Wr(t.documentRoot,o);if((t.isModelDefinition||r&&(i==="generic-node"||i==="subtree"))&&(i="model-definition"),r&&xn(o)&&(i="unknown-xml"),i==="root"||i==="behavior-tree"||i==="tree-nodes-model"||i==="include"||i==="model-definition"||i==="unknown-xml")return{element:o,tagName:o.name,tagForm:i,model:{status:"not-a-node"},ports:[],allowsArbitraryAttributes:!1,portUsages:[]};let s=Ro(o);if(i!=="subtree"){let f=Bo(e,s),y=Ao({index:e,tagForm:i,model:f}),g=o.attributes.map(S=>Fo({attribute:S,ports:y,allowsArbitraryAttributes:!1,model:f}));return{element:o,tagName:o.name,tagForm:i,nodeType:s,model:f,ports:y,allowsArbitraryAttributes:!1,portUsages:g}}let a=bn(o,"ID"),l=a?$t(e,{id:a,fileLocalUri:t.uri,config:t.config}):{status:"unresolved",id:void 0},d={status:"unresolved",nodeType:a},c=!1;if(l.status==="resolved"&&l.kind==="node-model")d={status:"resolved",model:l.model};else if(l.status==="resolved"&&l.kind==="behavior-tree"){let f=Bo(e,l.treeId);f.status==="resolved"&&f.model.kind==="SubTree"?d=f:c=n.unknownSubTreePorts==="allow"}else l.status==="ambiguous"&&l.definitions.length>0?d=l.definitions.length===1?{status:"resolved",model:l.definitions[0]}:{status:"ambiguous",nodeType:a??"SubTree",candidates:l.definitions}:c=n.unknownSubTreePorts==="allow";let p=Ao({index:e,tagForm:i,model:d,subtreeModelPorts:l.status==="ambiguous"?_o(l.definitions.flatMap(f=>f.ports)):void 0}),m=o.attributes.map(f=>Fo({attribute:f,ports:p,allowsArbitraryAttributes:c,model:d,unknownModelPortStatus:!c&&d.status!=="resolved"?"undeclared":void 0}));return{element:o,tagName:o.name,tagForm:i,nodeType:s,model:d,subtree:{id:a,target:l},ports:p,allowsArbitraryAttributes:c,portUsages:m}}function Sn(e,t){return Fe(e,t).portUsages.find(o=>o.name===t.attributeName)}function su(e){return e==="Action"||e==="Condition"||e==="Control"||e==="Decorator"||e==="SubTree"}function au(e){let t=e.root;return t?t.name==="BehaviorTree"?[t]:t.children.filter(n=>n.kind==="element"&&n.name==="BehaviorTree"):[]}function Yr(e,t){let n=e.line,o=e.character,i=e.offset;for(let r of t){if(i+=r.length,r===`
|
|
11
|
+
`){n+=1,o=0;continue}o+=r.length}return{line:n,character:o,offset:i}}function jo(e,t,n){let o=Yr(e,t),i=Yr(o,n);return{start:o,end:i}}function lu(e,t,n){let o=n.valueContentRange||n.valueRange,i=e.originalText.slice(o.start.offset,o.end.offset),r=[];for(let s of i.matchAll(/\{[^}]*\}/g)){let a=s[0],l=s.index??0,d=ne({portName:t,rawValue:a});if(d.ok){r.push({raw:a,key:d.reference.key,scope:d.reference.scope,identity:Ne(d.reference),range:jo(o.start,i.slice(0,l),a),syntax:d.reference.syntax==="shorthand"?"shorthand":"braced"});continue}r.push({raw:a,key:a,scope:"local",identity:`invalid:${a}`,range:jo(o.start,i.slice(0,l),a),syntax:"invalid"})}if(r.length===0){let s=ne({portName:t,rawValue:i});if(s.ok){let a=Math.max(0,i.indexOf(s.reference.raw));return r.push({raw:s.reference.raw,key:s.reference.key,scope:s.reference.scope,identity:Ne(s.reference),range:jo(o.start,i.slice(0,a),s.reference.raw),syntax:s.reference.syntax==="shorthand"?"shorthand":"braced"}),r}}return r.length===0&&(i.includes("{")||i.includes("}"))&&r.push({raw:i,key:i,scope:"local",identity:`invalid:${i}`,range:o,syntax:"invalid"}),r}function du(e,t){return su(e.name)?e.name:t.model.status==="resolved"?t.model.model.kind:"unknown"}function Qr(e){let t=[];for(let n of e)t.push(n),t.push(...Qr(n.children));return t}function cu(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 uu(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 Zr(e,t){return e.attributes.find(n=>n.name===t)}function pu(e){let t=new Set;if(!e)return t;let n=o=>{t.add(o);for(let i of o.children)i.kind==="element"&&n(i)};if(e.name==="TreeNodesModel")return n(e),t;for(let o of e.children)o.kind!=="element"||o.name!=="TreeNodesModel"||n(o);return t}function je(e,t){let n=t.semantic,o=pu(e.root),i=au(e).map(l=>({id:Zr(l,"ID")?.value,element:l,rootNode:void 0,nodes:[]})),r=[],s=[],a=(l,d,c,p)=>{let m=Fe(n,{element:l,uri:e.uri,documentRoot:e.root,config:t?.config,policy:t?.policy,isModelDefinition:o.has(l)}),f=cu(m),y={element:l,path:p,tagName:l.name,kind:du(l,m),model:f,usage:m,portBindings:[],children:[],parent:c,behaviorTree:d};if(y.portBindings=m.portUsages.filter(g=>g.status!=="reserved-attribute").map(g=>({name:g.name,value:g.value,attribute:g.attribute,declaredPort:uu(g),usage:g,blackboardReferences:lu(e,g.name,g.attribute)})),y.children=l.children.filter(g=>g.kind==="element").map((g,S)=>a(g,d,y,[...p,S])),l.name==="SubTree"){let g=Zr(l,"ID")?.value;r.push({node:y,id:g,target:m.subtree?.target??{status:"unresolved",id:g},portRemaps:y.portBindings})}return y};for(let l of i){let d=l.element.children.filter(c=>c.kind==="element").map((c,p)=>a(c,l,void 0,[p]));l.rootNode=d[0],l.nodes=Qr(d),s.push(...l.nodes)}return{document:e,behaviorTrees:i,subtreeCalls:r,nodes:s}}function fu(e){return`${e.kind}\0${e.id}`}function Vt(e){return Eo(e).map(t=>{let n=t.source??t.sourceMeta?.sourceKind;return{key:{id:t.id,kind:t.kind},model:t,id:t.id,kind:t.kind,uri:t.uri,range:t.range,sourceKind:n,isBuiltin:n==="builtin",isCanonicalModelFile:n==="external-tree-nodes-model",editable:t.editable!==!1}})}function qt(e){let t=new Map;for(let n of e){let o=t.get(n.id)??[];o.push(n),t.set(n.id,o)}return t}function Lo(e){let t=new Map;for(let n of e){let o=fu(n.key),i=t.get(o)??[];i.push(n),t.set(o,i)}return t}function es(e){let{document:t,diagnostics:n,options:o,partial:i}=e,r=n.some(a=>a.severity===h.Error),s="generic-xml";if(r)s="invalid-xml";else if(t.root){let a=t.root,l=a.children.some(m=>m.kind==="element"&&m.name==="BehaviorTree"),d=a.children.some(m=>m.kind==="element"&&m.name==="TreeNodesModel"),c=a.attributes.some(m=>m.name==="BTCPP_format"&&m.value==="4"),p=a.name==="TreeNodesModel"||a.name==="root"&&!l&&d;o.kind==="model-xml"||p?s="model-document":(a.name==="BehaviorTree"||a.name==="root"&&(c||l)||o.kind==="bt-xml")&&(s="bt-document")}return t.kind=s,t.isBtXml=s==="bt-document"||s==="model-document",!r&&!i?{ok:!0,document:t,diagnostics:n,partial:!1}:{ok:!1,document:t,diagnostics:n,partial:i}}function gu(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()!==""),o=t.some(i=>i.kind==="element");return n&&o}function Uo(e,t){if(e.kind==="element"){gu(e)&&t(e);for(let n of e.children||[])Uo(n,t)}}function $(e,t){let n=0,o=0;for(let i=0;i<Math.min(t,e.length);i++)e[i]===`
|
|
12
|
+
`?(n++,o=0):o++;return pt(n,o,t)}function Oo(e,t,n,o){for(let i=0;i<e.length;i++){if(e[i]!=="&")continue;let r=e.slice(i+1),s=i;if(r.startsWith("amp;")){i+=4;continue}if(r.startsWith("lt;")){i+=3;continue}if(r.startsWith("gt;")){i+=3;continue}if(r.startsWith("quot;")){i+=5;continue}if(r.startsWith("apos;")){i+=5;continue}if(r.startsWith("#")){let p=1;if(r[p]==="x"||r[p]==="X"){p++;let S="";for(;p<r.length&&/[0-9a-fA-F]/.test(r[p]);)S+=r[p],p++;if(p<r.length&&r[p]===";"){p++;let P=e.slice(s,s+1+p),w=$(n,t+s),B=$(n,t+s+P.length);if(S){let A=Number.parseInt(S,16);if(A>0&&A<=1114111&&(A<55296||A>57343)){i+=p-1;continue}o("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${P}\``,w,B,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),i+=p-1;continue}o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${P}\``,w,B,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),i+=p-1;continue}let v=e.slice(s,s+1+p),x=$(n,t+s),D=$(n,t+s+v.length);o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${v}\``,x,D,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),i+=p-1;continue}let m="";for(;p<r.length&&/[0-9]/.test(r[p]);)m+=r[p],p++;if(p<r.length&&r[p]===";"){p++;let S=e.slice(s,s+1+p),v=$(n,t+s),x=$(n,t+s+S.length);if(m){let D=Number.parseInt(m,10);if(D>0&&D<=1114111&&(D<55296||D>57343)){i+=p-1;continue}o("XML014_INVALID_NUMERIC_ENTITY",h.Error,`invalid numeric XML entity \`${S}\``,v,x,{primaryLabel:"this numeric entity is outside the valid Unicode range",help:"replace it with a valid Unicode code point or normal text"}),i+=p-1;continue}o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${S}\``,v,x,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),i+=p-1;continue}let f=e.slice(s,s+1+p),y=$(n,t+s),g=$(n,t+s+f.length);o("XML001_INVALID_SYNTAX",h.Error,`malformed numeric XML entity \`${f}\``,y,g,{primaryLabel:"this entity is incomplete",help:"use a valid numeric entity such as ` ` or escape the ampersand as `&`"}),i+=p-1;continue}let a=r.match(/^[a-zA-Z][a-zA-Z0-9]*;/);if(a){let p=`&${a[0]}`,m=$(n,t+s),f=$(n,t+s+p.length);o("XML013_UNKNOWN_ENTITY",h.Error,`unknown XML entity \`${p}\``,m,f,{primaryLabel:"this entity is not one of XML's predefined entities",help:"use one of `&`, `<`, `>`, `"`, `'`, or a valid numeric entity"}),i+=p.length-1;continue}let l=r.match(/^[a-zA-Z][a-zA-Z0-9]*/);if(l){let p=`&${l[0]}`,m=$(n,t+s),f=$(n,t+s+p.length);o("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",m,f,{primaryLabel:"escape `&` as `&`",help:"replace `&` with `&` unless this is a valid XML entity"}),i+=p.length-1;continue}let d=$(n,t+s),c=$(n,t+s+1);o("XML001_INVALID_SYNTAX",h.Error,"bare ampersand in XML content",d,c,{primaryLabel:"escape `&` as `&`",help:"replace `&` with `&` unless this is a valid XML entity"})}}function Xt(e){return e.replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&").replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let o=Number.parseInt(n,16);return o<=0||o>1114111||o>=55296&&o<=57343?t:String.fromCodePoint(o)}).replace(/&#([0-9]+);/g,(t,n)=>{let o=Number.parseInt(n,10);return o<=0||o>1114111||o>=55296&&o<=57343?t:String.fromCodePoint(o)})}function ts(e){let t="",n=[0];for(let o=0;o<e.length;){let i=yu(e,o);if(!i){t+=e[o]??"",o+=1,n.push(o);continue}t+=i.value,o=i.end,n.push(o)}return{value:t,offsets:n}}function yu(e,t){let n=e.slice(t);if(n.startsWith(""")||n.startsWith("'")||n.startsWith("<")||n.startsWith(">")||n.startsWith("&")){let s=n.startsWith(""")?""":n.startsWith("'")?"'":n.startsWith("<")?"<":n.startsWith(">")?">":"&";return{value:Xt(s),end:t+s.length}}let i=/^&#x([0-9a-fA-F]+);/.exec(n);if(i){let s=i[0];return{value:Xt(s),end:t+s.length}}let r=/^&#([0-9]+);/.exec(n);if(r){let s=r[0];return{value:Xt(s),end:t+s.length}}}function ns(e){return pt(e.line,e.character,e.offset)}function hu(e){return!!e&&/[A-Za-z_:]/.test(e||"")}function bu(e){return!!e&&/[A-Za-z0-9_.:\-]/.test(e||"")}function xu(e){return e===" "||e===" "||e===`
|
|
13
|
+
`||e==="\r"}function Su(e){let t=e.codePointAt(0);return t!==void 0&&t<32&&e!==" "&&e!==`
|
|
14
|
+
`&&e!=="\r"}function Te(e,t={}){let n=[],o=t.mode==="tolerant",i={uri:t.uri||"",path:t.path,kind:"generic-xml",isBtXml:!1,xmlDeclaration:void 0,root:void 0,nodes:[],diagnostics:n,originalText:e},r=0,s=0,a=0,l=[],d=!1;function c(){return pt(s,a,r)}function p(){return r>=e.length}function m(b=0){return e[r+b]}function f(b=1){for(let N=0;N<b;N+=1)e[r++]===`
|
|
15
|
+
`?(s+=1,a=0):a+=1}function y(){for(;!p()&&xu(m());)f()}let g=(b,N,E,_,T,L)=>{n.push(R(b,N,E,C(_,T),i.uri,L))};function S(b,N,E,_,T,L){n.push(R(b,N,E,_&&T?C(_,T):void 0,i.uri,L))}function v(){if(!hu(m()))return"";let b=r;for(f();!p()&&bu(m());)f();return e.slice(b,r)}function x(){let b=m();if(b!=='"'&&b!=="'")return{value:"",ok:!1};let N=c();f();let E=c(),_=r;for(;!p()&&m()!==b&&m()!=="<";)f();let T=c();if(p()||m()!==b)return{value:e.slice(_,r),ok:!1,valueRange:C(N,T),valueContentRange:C(E,T)};let L=e.slice(_,r);f(),Oo(L,E.offset,e,g);let Me=ts(L);return{value:Me.value,valueOffsets:Me.offsets,ok:!0,valueRange:C(N,c()),valueContentRange:C(E,T)}}function D(){let b=[],N=new Set;for(;;){y();let E=m();if(!E||E===">"||E==="/"&&m(1)===">")break;let _=c(),T=v(),L=c();if(!T)break;y();let Me=c();if(m()!=="="){if(g("XML001_INVALID_SYNTAX",h.Error,"invalid attribute syntax",_,L,{primaryLabel:`expected \`=\` after attribute \`${T}\``,help:`write the attribute as \`${T}="..."\``}),d=!0,o)continue;break}f();let xd=c();y();let io=c(),Ke=x(),ut=c();if(!Ke.ok&&(g("XML005_INVALID_ATTRIBUTE_VALUE",h.Error,"invalid attribute value",io,ut,{primaryLabel:"expected a quoted attribute value",help:`write the value with quotes, for example \`${T}="value"\``}),d=!0,!o)||(N.has(T)?g("XML004_DUPLICATE_ATTRIBUTE",h.Error,`duplicate attribute \`${T}\``,_,ut,{primaryLabel:`attribute \`${T}\` is already defined on this element`,help:`remove one of the duplicate \`${T}\` attributes`}):N.add(T),b.push({name:T,value:Ke.value,...Ke.valueOffsets?{valueOffsets:Ke.valueOffsets}:{},range:C(_,ut),fullRange:C(_,ut),nameRange:C(_,L),equalsRange:C(Me,xd),valueRange:Ke.valueRange||C(io,ut),valueContentRange:Ke.valueContentRange||C(io,ut)}),!Ke.ok&&o))break}return b}function P(b){l.length>0?l[l.length-1].children.push(b):(i.nodes.push(b),!i.root&&b.kind==="element"&&(i.root=b))}function w(){let b=c(),N=r;for(;!p()&&m()!=="<";)f();let E=e.slice(N,r);if(E.length===0)return;for(let T of E)if(Su(T)){g("XML007_INVALID_CHARACTER",h.Error,"invalid XML character",b,c(),{primaryLabel:"this control character is not allowed in XML",help:"remove the character or replace it with valid text"});break}Oo(E,N,e,g);let _={kind:"text",text:Xt(E),range:C(b,c()),fullRange:C(b,c())};P(_)}function B(){let b=c();f(4);let N=c(),E=r;for(;!p()&&!(m()==="-"&&m(1)==="-"&&m(2)===">");)f();let _=e.slice(E,r);if(p()){if(g("XML001_INVALID_SYNTAX",h.Error,"unterminated XML comment",b,c(),{primaryLabel:"comment started here but no closing `-->` was found",help:"close the comment with `-->`"}),d=!0,!o)return;let Me={kind:"comment",text:_,range:C(b,c()),fullRange:C(b,c()),contentRange:C(N,c())};P(Me);return}(_.includes("--")||_.endsWith("-"))&&g("XML001_INVALID_SYNTAX",h.Error,"invalid XML comment",N,c(),{primaryLabel:"XML comments cannot contain `--`",help:"remove `--` from the comment body or split it into separate comments"});let T=c();f(3);let L={kind:"comment",text:_,range:C(b,c()),fullRange:C(b,c()),contentRange:C(N,T)};P(L)}function A(){let b=c();f(5),y();let N=D();y(),m()==="?"&&m(1)===">"?f(2):g("XML001_INVALID_SYNTAX",h.Error,"invalid XML declaration",b,c(),{primaryLabel:"expected `?>` to close the XML declaration",help:'close the declaration as `<?xml version="1.0" encoding="UTF-8"?>`'});let E={range:C(b,c()),attributes:N};for(let _ of N)_.name==="version"&&(E.version=_.value),_.name==="encoding"&&(E.encoding=_.value),_.name==="standalone"&&(E.standalone=_.value);i.xmlDeclaration=E}function _e(){let b=c();f(2),y();let N=c(),E=v(),_=c();if(y(),m()!==">")for(g("XML001_INVALID_SYNTAX",h.Error,"invalid closing tag syntax",b,c(),{primaryLabel:"expected `>` to close the tag",help:"close the tag with `>`"}),d=!0;!p()&&m()!==">";)f();m()===">"&&f();let T=l.pop();if(!T||T.name!==E){let L=T?T.name:E||"",Me=E||"";g("XML006_MISSING_CLOSING_TAG",h.Error,`mismatched closing tag \`</${Me}>\``,b,c(),{primaryLabel:`opened as \`<${L}>\` but closed as \`</${Me}>\``,help:`change the closing tag to \`</${L}>\` or fix the nesting`});return}T.closeTagRange=C(b,c()),T.endTagRange=C(b,c()),T.nameRange||(T.nameRange=C(N,_)),T.range=C(T.range.start,c()),T.fullRange=C(T.range.start,c())}for(;!p();)if(m()==="<")if(m(1)==="?")if(e.slice(r,r+5).toLowerCase()==="<?xml"&&e.charAt(r+5)===" ")A();else{let b=c();for(;!p()&&!(m()==="?"&&m(1)===">");)f();p()||f(2),g("XML012_UNSUPPORTED_PROCESSING_INSTRUCTION",h.Error,"processing instruction is not supported",b,c(),{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(r+3,r+9)==="CDATA["){let b=c();for(f(8);!p()&&!(m()==="]"&&m(1)==="]"&&m(2)===">");)f();p()||f(3),g("XML010_UNSUPPORTED_CDATA",h.Error,"CDATA is not supported",b,c(),{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(r+2,r+9)==="DOCTYPE"){let b=c();for(f(8);!p()&&m()!==">";)f();p()||f(1),g("XML011_UNSUPPORTED_DOCTYPE",h.Error,"DOCTYPE is not supported",b,c(),{primaryLabel:"DOCTYPE declarations are not supported by btxml",help:"remove the DOCTYPE declaration"})}else if(m(1)==="/")_e();else{let b=c();f();let N=c(),E=v(),_=c();if(!E){if(g("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",b,c(),{primaryLabel:"expected an XML element name after `<`",help:"start the tag with a valid XML name such as `<root>` or `<BehaviorTree>`"}),d=!0,o){f();continue}break}let T={kind:"element",name:E,attributes:[],children:[],range:C(b,b),fullRange:C(b,b),openTagRange:C(b,b),startTagRange:C(b,b),nameRange:C(N,_),selfClosing:!1};if(T.attributes=D(),y(),m()==="/"&&m(1)===">"){f(2),T.selfClosing=!0,T.openTagRange=C(b,c()),T.startTagRange=T.openTagRange,T.range=C(b,c()),T.fullRange=C(b,c()),P(T);continue}if(m()!==">"){if(g("XML001_INVALID_SYNTAX",h.Error,"invalid XML tag",b,c(),{primaryLabel:"expected `>` or `/>` to close the start tag",help:"close the start tag with `>` or make it self-closing with `/>`"}),d=!0,o){T.openTagRange=C(b,c()),T.startTagRange=T.openTagRange,T.range=C(b,c()),T.fullRange=C(b,c()),P(T);continue}break}f(),T.openTagRange=C(b,c()),T.startTagRange=T.openTagRange,T.range=C(b,c()),T.fullRange=C(b,c()),P(T),l.push(T)}else w();if(l.length>0){let b=l[l.length-1];if(g("XML006_MISSING_CLOSING_TAG",h.Error,`missing closing tag for \`<${b.name}>\``,b.openTagRange.start,b.openTagRange.end,{primaryLabel:"this tag is not closed",help:`add \`</${b.name}>\` before the end of the file`}),d=!0,o)for(;l.length>0;){let N=l.pop();if(!N)break;N.range=C(N.range.start,c()),N.fullRange=C(N.range.start,c())}}let se=i.nodes.filter(b=>b.kind==="element");se.length===0?S("XML002_MISSING_ROOT",h.Error,"missing root element",void 0,void 0,{help:'add a single root element, usually `<root BTCPP_format="4">...</root>`'}):se.length>1&&S("XML003_MULTIPLE_ROOTS",h.Error,"multiple root elements",void 0,void 0,{primaryLabel:"this document has more than one top-level element",help:'wrap the document content in one `<root BTCPP_format="4">...</root>` element'});let U=i.root,fe=U?.name==="BehaviorTree"||U?.name==="TreeNodesModel"||U?.name==="root"&&(U.attributes.some(b=>b.name==="BTCPP_format"&&b.value==="4")||U.children.some(b=>b.kind==="element"&&(b.name==="BehaviorTree"||b.name==="TreeNodesModel")));if(U)for(let b of i.nodes)b!==U&&b.kind==="text"&&b.text.trim().length>0&&g("XML016_TEXT_OUTSIDE_ROOT",h.Error,"text outside root element",b.range.start,b.range.end,{primaryLabel:"non-whitespace text appears outside the root element",help:"move this text inside `<root>` or remove it"});if(!i.xmlDeclaration&&!fe)S("XML008_MISSING_DECLARATION",h.Warning,"missing XML declaration",void 0,void 0,{help:'add `<?xml version="1.0" encoding="UTF-8"?>` at the top of the file',notes:["this is a warning because BehaviorTree.CPP can still parse many files without a declaration"]});else if(i.xmlDeclaration?.encoding&&i.xmlDeclaration.encoding.toUpperCase()!=="UTF-8"){let b=i.xmlDeclaration.encoding;g("XML009_INVALID_ENCODING",h.Warning,"XML encoding should be UTF-8",i.xmlDeclaration.range.start,i.xmlDeclaration.range.end,{primaryLabel:`declared encoding is \`${b}\``,help:'change the XML declaration to `encoding="UTF-8"`'})}return U&&Uo(U,b=>{g("XML015_UNSUPPORTED_MIXED_CONTENT",h.Warning,"mixed XML content is not supported",ns(b.range.start),ns(b.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"]})}),es({document:i,diagnostics:n,partial:d,options:t})}var Gt={indentWidth:2,xmlDeclaration:"always",blankLineBetweenBehaviorTrees:!0,lineEnding:"lf"};function os(e){if(!e)return Gt;let t=typeof e.indentWidth=="number"?e.indentWidth:Gt.indentWidth,n=e.xmlDeclaration==="always"||e.xmlDeclaration==="never"||e.xmlDeclaration==="preserve"?e.xmlDeclaration:Gt.xmlDeclaration,o=typeof e.blankLineBetweenBehaviorTrees=="boolean"?e.blankLineBetweenBehaviorTrees:Gt.blankLineBetweenBehaviorTrees,i=e.lineEnding==="lf"||e.lineEnding==="crlf"||e.lineEnding==="auto"?e.lineEnding:Gt.lineEnding;return{indentWidth:t,xmlDeclaration:n,blankLineBetweenBehaviorTrees:o,lineEnding:i}}function vn(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function kn(e){return vn(e).replace(/"/g,""")}function vu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function ku(e,t,n){return`${" ".repeat(e*n)}${t}`}function St(e,t,n,o){let i=" ".repeat(t*o),r=e.attributes||[];if(r.length===0)return[`${i}<${e.name}${n}`];if(r.length===1)return[`${i}<${e.name} ${r[0].name}="${kn(r[0].value)}"${n}`];let s=[`${i}<${e.name} ${r[0].name}="${kn(r[0].value)}"`],a=" ".repeat(i.length+1+e.name.length+1);for(let l=1;l<r.length;l+=1){let d=r[l],c=l===r.length-1?n:"";s.push(`${a}${d.name}="${kn(d.value)}"${c}`)}return s}function Tn(e,t,n,o){let i=" ".repeat(t*n);if(e.kind==="comment")return[`${i}<!--${e.text}-->`];if(e.kind==="text"){let c=e.text.trim();return c?[ku(t,vn(c),n)]:[]}let r=vu(e.children||[]),s=e.kind==="element"&&(e.name==="input_port"||e.name==="output_port"),a=(e.children||[]).filter(c=>c.kind==="text").map(c=>c.text).join("").trim(),l=r.some(c=>c.kind==="element"||c.kind==="comment");if(a&&l&&!s&&o.push({code:"XML015_UNSUPPORTED_MIXED_CONTENT",severity:"error",message:"Mixed XML content is not supported by btxml-checker formatter",uri:""}),a&&!l){if((e.attributes||[]).length<=1){let c=(e.attributes||[]).length===0?"":` ${e.attributes[0].name}="${kn(e.attributes[0].value)}"`;return[`${i}<${e.name}${c}>${vn(a)}</${e.name}>`]}return St(e,t,`>${vn(a)}</${e.name}>`,n)}if(r.length===0){if(e.selfClosing)return St(e,t,"/>".slice(0),n);let c=St(e,t,">",n);return c.push(`${i}</${e.name}>`),c}let d=St(e,t,">",n);for(let c of e.children||[])c.kind==="text"&&c.text.trim()===""||d.push(...Tn(c,t+1,n,o));return d.push(`${i}</${e.name}>`),d}function Tu(e){return e.filter(t=>!(t.kind==="text"&&t.text.trim()===""))}function is(e,t,n,o){let i=[],r=Tu(e);for(let s=0;s<r.length;s+=1){let a=r[s],l=r[s-1],d=r[s+1],c=n&&a.kind==="element"&&a.name==="BehaviorTree"&&l&&l.kind==="element"&&l.name==="BehaviorTree",p=a.kind==="element"&&a.name==="TreeNodesModel"&&l!==void 0&&l.kind!=="comment",m=a.kind==="comment"&&d&&d.kind==="element"&&d.name==="TreeNodesModel"&&l!==void 0;(c||p||m)&&i.length>0&&i[i.length-1]!==""&&i.push(""),a.kind==="element"?(i.push(...Tn(a,1,t,o)),a.name==="TreeNodesModel"&&i.push("")):i.push(...Tn(a,1,t,o))}return i}function Le(e,t={}){let n=Te(e);if(!n.ok||!n.document||!n.document.root)return{ok:!1,skipped:!1,diagnostics:n.diagnostics};if(n.diagnostics.find(g=>["XML010_UNSUPPORTED_CDATA","XML011_UNSUPPORTED_DOCTYPE","XML012_UNSUPPORTED_PROCESSING_INSTRUCTION","XML013_UNKNOWN_ENTITY","XML014_INVALID_NUMERIC_ENTITY","XML001_INVALID_SYNTAX"].includes(g.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,r=os(t),s=r.indentWidth,a=[],l=n.document.xmlDeclaration!==void 0;if((r.xmlDeclaration==="always"||r.xmlDeclaration==="preserve"&&l)&&a.push('<?xml version="1.0" encoding="UTF-8"?>'),a.push(...St(i,0,">",s)),a.push(...is(i.children||[],s,r.blankLineBetweenBehaviorTrees,n.diagnostics)),a.push(`</${i.name}>`),n.diagnostics.some(g=>g.code==="XML015_UNSUPPORTED_MIXED_CONTENT"))return{ok:!1,skipped:!1,diagnostics:n.diagnostics};let d=`
|
|
16
16
|
`;(r.lineEnding==="crlf"||r.lineEnding==="auto"&&e.includes(`\r
|
|
17
17
|
`))&&(d=`\r
|
|
18
|
-
`);let c=a.join(d),p=d.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),m=new RegExp(`(?:${p})+$`,"u"),y=`${c.replace(m,"")}${d}`;return{ok:!0,text:y,changed:y!==e,skipped:!1,diagnostics:n.diagnostics.filter(g=>g.severity!==h.Error)}}function Ao(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 jo(e,t,n){let o=t.valueContentRange??t.valueRange,i=Ao(t,n.start),r=Ao(t,n.end),s=$(e.originalText,o.start.offset+i),a=$(e.originalText,o.start.offset+r);return I(s,a)}function Zr(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function Qr(e,t){return e.includeIssuesByUri.get(t)??[]}function es(e,t){return e.suppressionIssuesByUri.get(t)??[]}function ts(e){let{document:t,semantic:n,config:o,view:i}=e,r=new Map(i.nodes.map(d=>[d.element,d])),s=new Map(i.subtreeCalls.map(d=>[d.node.element,d])),a=be(o),l=ou(t.root);return{document:t,view:i,semantic:n,config:o,options:e.options,facts:e.facts,report(d){let c=T(d.code??e.code,e.severity,d.message,d.range,t.uri,d.details,d.data);e.diagnostics.push({...c,rule:e.rule,...d.relatedInformation?{relatedInformation:d.relatedInformation}:{}})},getIncludeIssues(d){let c=Qr(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getSuppressionIssues(d){let c=es(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getNodeUsage(d){return je(n,{element:d,documentRoot:t.root,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},getPortUsage(d,c){return bn(n,{element:d,documentRoot:t.root,attributeName:c,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},resolveSubTree(d,c){return Ut(n,{id:d,fileLocalUri:c,config:o})},getNodeModel(d){return Ae(n,d)},getBehaviorTrees(d){return Se(n,d)},getTreeNodeView(d){return r.get(d)},getSubTreeCallView(d){return s.get(d)}}}function ou(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return Fo(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||Fo(n,t);return t}function Fo(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&Fo(n,t)}function C(e){let t=W[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var iu={"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 Oe(e){return C({name:iu[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:ru(n)})}}}})}function ru(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 ns=[Oe("missing-path"),Oe("not-found"),Oe("cycle"),Oe("outside-root"),Oe("unresolved-variable"),Oe("depth-exceeded"),Oe("too-many-files"),Oe("external-used")];import su from"ajv";var au=su,lu=new au,du=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],cu={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}},Lo=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"]),os=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 is(e){return e.children.filter(t=>t.kind==="element")}function ye(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function rs(e){return e.children.some(t=>t.kind==="element")}function Rn(e,t){let n=ss(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function ss(e){let t=Gt(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 kn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return gu(e.registry,n,e.value)?void 0:kn(e.diagnosticCode,e.value,e.portLabel);let o=e.typeDefinition?.canonical??e.port.type;if(o&&!ls(o,e.value))return uu(o)?kn(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${o}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${o}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function He(e){return e.effectiveType??e.type}function as(e,t){return fe(e,He(t))}function Gt(e,t){let n=Z({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function kn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function uu(e){let t=Mt(e)??e;return ds(e)!==void 0||yu.has(t.toLowerCase())}function ls(e,t){let n=ds(e);if(n)return pu(n,t);let o=(Mt(e)??e).toLowerCase();switch(o){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 du.includes(t);default:return Lo.has(o)||os.has(o)?cs(o,t):!1}}function ds(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function pu(e,t){let n=fu(t);return n?n.every(o=>mu(e,o)):!1}function mu(e,t){if(t.kind==="string")return ls(e,t.value);let n=(Mt(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 Lo.has(n)||os.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&cs(n,String(t.value)):!1}}function cs(e,t){let n=cu[e];if(!n)return!1;if(Lo.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let o=BigInt(t);return o>=n.min&&o<=n.max}catch{return!1}}function fu(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 gu(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 o=n.split(t.separator);return o.length!==t.items.length?!1:o.every((i,r)=>{let s=t.items[r];return s?ss({port:{name:`tuple[${r}]`,type:s},value:i,registry:e,typeDefinition:fe(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${r}]`})===void 0:!1})}case"json-schema":try{let o=JSON.parse(n);return lu.compile(t.schema)(o)===!0}catch{return!1}}}var yu=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 us=[C({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})}}}}),C({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 o of t.ports)o.name&&(n.has(o.name)&&e.report({message:`Duplicate port name "${o.name}" in ${t.id}`,range:o.nameRange||o.range||t.idRange||t.range}),n.add(o.name))}}}}),C({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 o=oo(n.name);o&&e.report({code:u.InvalidPortName,message:`invalid port name \`${n.name}\`: ${o}`,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"}})}}}}}),C({name:"model/no-conflicting-definition",create(e){return{ProgramExit(){for(let t of Ot(e.semantic))t.uri&&t.uri!==e.document.uri||hu(e.document,t.id)||e.report({code:t.code,message:t.message,range:t.range,details:t.details,data:t.data,relatedInformation:t.relatedInformation})}}}}),C({name:"model/valid-port-default-value",meta:{description:"TreeNodesModel port defaults must match the declared type."},create(e){return{Element(t){if(!bu(t))return;let n=t.attributes.find(l=>l.name==="default")??t.attributes.find(l=>l.name==="default_value");if(!n)return;let o=t.attributes.find(l=>l.name==="name")?.value;if(!o)return;let r=vu(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!r)return;let a=e.getNodeModel(r)?.ports.find(l=>l.name===o);if(a){if(a.direction==="output"){Gt(a.name,n.value)===void 0&&e.report({code:u.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}Rn(e,{port:a,value:n.value,range:n.range,registry:ge(e.semantic),typeDefinition:ve(e.semantic,a.type),allowRemap:!0,diagnosticCode:u.InvalidPortDefaultValue,customLiteralDiagnosticCode:u.CustomLiteralRequiresValidator,portLabel:a.name})}}}}}),C({name:"model/no-blackboard-type-mismatch",meta:{description:"Blackboard entries must not mix incompatible resolved port types."},create(e){return{ProgramExit(){let t=ge(e.semantic),n=new Map,o=e.options.allowStringEntryCompatibility??!0;for(let i of e.view.nodes)for(let r of i.portBindings){if(r.declaredPort.status!=="resolved")continue;let s=Gt(r.name,r.value);if(!s)continue;let a=as(t,r.declaredPort.port);if(!a||a.kind==="any")continue;let l=Ee(s),d=n.get(l)??[];d.push({key:s.key,scope:s.scope,displayName:dn(s),identity:l,nodeId:ku(i.element),port:r.declaredPort.port,typeDefinition:a,range:r.attribute.range}),n.set(l,d)}for(let i of n.values()){let r=Su(e.semantic,i,o);if(r.length<2)continue;let s=i.find(a=>a.typeDefinition.canonical===r[0]);e.report({code:u.BlackboardTypeMismatch,message:`blackboard entry \`${s?.displayName??i[0]?.displayName??i[0]?.key??""}\` is used with incompatible port types: ${r.map(a=>`\`${a}\``).join(", ")}`,range:s?.range,details:{primaryLabel:`blackboard entry \`${s?.displayName??i[0]?.displayName??i[0]?.key??""}\` mixes incompatible port types`,notes:i.filter(a=>r.includes(a.typeDefinition.canonical)).map(a=>`${a.nodeId}.${a.port.name} declares ${xu(a.port,a.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),C({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must write to a blackboard remap."},create(e){return{Element(t){if(Ru(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let i=e.getPortUsage(t,o.name);i?.status==="resolved"&&i.port.direction==="output"&&Gt(i.port.name,o.value)===void 0&&e.report({code:u.OutputPortRequiresRemap,message:`output port \`${i.port.name}\` must be remapped to a blackboard entry`,range:o.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 hu(e,t){return e.diagnostics.some(n=>n.code===u.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function bu(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function vu(e,t){if(!e)return;return n(e,!1,void 0);function n(o,i,r){let s=i||o.name==="TreeNodesModel",a=s&&(o.name==="Action"||o.name==="Condition"||o.name==="Control"||o.name==="Decorator"||o.name==="SubTree")?o:r;if(o===t)return a;for(let l of o.children){if(l.kind!=="element")continue;let d=n(l,s,a);if(d)return d}}}function Su(e,t,n){let o=new Set;for(let i=0;i<t.length;i+=1){let r=t[i];if(r)for(let s=i+1;s<t.length;s+=1){let a=t[s];a&&(n&&(r.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||ft(e,r.typeDefinition.canonical,a.typeDefinition.canonical)||(o.add(r.typeDefinition.canonical),o.add(a.typeDefinition.canonical)))}}return[...o].sort()}function xu(e,t){return He(e)??t.canonical}function ku(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Ru(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Du=new Set(["_failureIf","_successIf","_skipIf","_while"]),Tu=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Oo(e){if(Du.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"}}function Uo(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=ln({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 ps=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),ms=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function fs(e){let t=[],n=0;for(;n<e.length;){let o=e[n];if(gs(o)){n++;continue}if($o(o)){let a=n;for(n++;n<e.length&&Eu(e[n]);)n++;let l=e.slice(a,n);t.push({type:l==="true"||l==="false"?"Boolean":"Identifier",text:l,start:a,end:n});continue}if(Je(o)){let a=Cu(e,n);t.push(a),n=a.end;continue}if(o==="'"){let a=Iu(e,n);t.push(a),n=a.end;continue}let i=e.slice(n,n+2),r=ps.get(i);if(r){t.push({type:r,text:i,start:n,end:n+2}),n+=2;continue}let s=ms.get(o);if(s){t.push({type:s,text:o,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:o,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function Iu(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 Cu(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&&Nu(e[n]);)n++;return i===n||wu(e,n)?(n=zt(e,n),Wt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Je(e[n]);)n++;let o="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:o,text:e.slice(t,n),start:t,end:n};if(!Je(e[n+1]))return n=zt(e,n+1),Wt(e,t,n);for(o="Real",n+=1;n<e.length&&Je(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let i=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let r=n;for(;n<e.length&&Je(e[n]);)n++;if(r===n)return n=zt(e,Math.max(n,i+1)),Wt(e,t,n);o="Real"}return Mu(e,n)?(n=zt(e,n),Wt(e,t,n)):{type:o,text:e.slice(t,n),start:t,end:n}}function zt(e,t){let n=t;for(;n<e.length;){let o=e[n];if(gs(o)||ms.has(o)||ps.has(e.slice(n,n+2))||o==="."&&e[n+1]===".")break;n++}return n}function Wt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function gs(e){return e===" "||e===" "||e===`
|
|
19
|
-
`||e==="\r"}function $o(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Eu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Je(e){return e!==void 0&&/[0-9]/.test(e)}function Nu(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Mu(e,t){let n=e[t];return $o(n)||Je(n)}function wu(e,t){let n=e[t];return n==="."||$o(n)||Je(n)}var Pu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),Bu=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),ys=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),ae={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ht(e){let t=fs(e),n=t.filter(o=>o.type==="Error");return n.length>0?{ok:!1,errors:n.map(o=>({kind:"invalid-token",message:`invalid token \`${o.text}\``,range:{start:o.start,end:o.end}})),tokens:t}:hs(t,e)}function hs(e,t=""){let n=new qo(e,t),o=[];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 r=n.parseExpression(0);if(!r)return{ok:!1,errors:n.errors,tokens:e};for(o.push(r);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let i=Lu(o);return{ok:!0,program:{kind:"Program",statements:o,range:i},tokens:e}}var qo=class{constructor(t,n,o=0){this.tokens=t;this.source=n;this.index=o}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let o=this.peek();if(o.type==="EndOfInput"||o.type==="Semicolon"||o.type==="RightParen"||o.type==="Colon")break;let i=Pu.get(o.type);if(i){if(t>=ae.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:i,left:n,right:l,range:Kt(n.range,l.range)};break}if(o.type==="Question"){if(t>=ae.ternary)break;this.consume();let l=this.parseExpression(0);if(!l)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let d=this.parseExpression(ae.ternary);if(!d)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:d,range:Kt(n.range,d.range)};break}let r=ys.get(o.type);if(r){if(t>=ae.comparison)break;this.consume();let l=[n],d=[r],c=this.parseExpression(ae.comparison);if(!c)return;for(l.push(c);;){let p=ys.get(this.peek().type);if(!p)break;this.consume();let m=this.parseExpression(ae.comparison);if(!m)return;d.push(p),l.push(m)}n={kind:"ComparisonChain",operands:l,operators:d,range:Kt(l[0].range,l[l.length-1].range)};continue}let s=Bu.get(o.type),a=s?ju(o.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let l=this.parseExpression(a);if(!l)return;n={kind:"BinaryExpression",operator:s,left:n,right:l,range:Kt(n.range,l.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${o.text||o.type}\``,o);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:Ye(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),_u(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:Au(t.type),argument:n,range:Kt(Ye(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),o=this.parseExpression(0);if(!o)return;let i=this.peek();if(i.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",i);return}return this.consume(),Fu(o,{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,o){this.errors.push({kind:t,message:n,range:Ye(o)})}};function _u(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:Ye(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Ye(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Ye(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Ye(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function Au(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function ju(e){switch(e){case"PipePipe":return ae.pipePipe;case"AmpAmp":return ae.ampAmp;case"Pipe":case"Caret":return ae.pipeCaret;case"Ampersand":return ae.ampersand;case"Plus":case"Minus":case"DotDot":return ae.additive;case"Star":case"Slash":return ae.multiplicative;default:return}}function Ye(e){return{start:e.start,end:e.end}}function Kt(e,t){return{start:e.start,end:t.end}}function Fu(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 Ou=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 Vo(e={}){let t=ct(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>wt(t,s,a)),o=new Map,i=new Map,r={symbols:new Map,globalBlackboard:new Map,enums:Uu(e.enums,e.augmentations??[])};for(let s of e.symbols??[])bs(r.symbols,o,s,n);for(let s of e.globalBlackboardSymbols??[])bs(r.globalBlackboard,i,s,n);return r}function Ze(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 Xo(e){let t=Ze(e.baseEnvironment),n=[];for(let o of e.entries){let i=Ze(t),r=o.parseResult??Ht(o.source),s=Ze(i),a;r.ok&&(a=Yt({program:r.program,environment:i,attributeName:o.attributeName,originId:o.originId??String(o.id)}),s=Ze(a.environment)),n.push({id:o.id,parseResult:r,environmentBefore:i,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.globalBlackboard.clear(),t.enums.clear();for(let[l,d]of s.symbols)t.symbols.set(l,{...d});for(let[l,d]of s.globalBlackboard)t.globalBlackboard.set(l,{...d});for(let[l,d]of s.enums)t.enums.set(l,d)}return n}function vs(e){let t=new Map;for(let n of e)for(let[o,i]of Object.entries(n.script?.enums??{}))t.set(o,i);return t}function Jt(e,t){let n=fe(e,t);return Ss(t,n)}function Ss(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"}:Ou.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function xs(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 vt(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"||t.kind==="custom"?e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:!1:e.kind==="bool"&&t.kind==="number"?!0:e.kind===t.kind}function Qe(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Go(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 Uu(e,t){if(e instanceof Map)return new Map(e);let n=vs(t??[]);for(let[o,i]of Object.entries(e??{}))n.set(o,i);return n}function bs(e,t,n,o){let i=e.get(n.name);if(!i){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 r=t.get(n.name),s=i.conflict===!0||r!==void 0&&n.compatibilityKey!==void 0&&!o(r,n.compatibilityKey)||!xs(i.type,n.type);e.set(n.name,{...i,readable:i.readable||n.readable,writable:i.writable||n.writable,conflict:s}),r===void 0&&t.set(n.name,n.compatibilityKey)}var et={kind:"number"},Tn={kind:"string"},Dn={kind:"bool"},le={kind:"unknown"},U={kind:"error"};function Yt(e){let t=Ze(e.environment),n=[],o=[],i=[],r=[],s=[],a=[],l=[],d=[];return e.program.statements.forEach((c,p)=>{d.push(xe({expression:c,statementIndex:p,environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:i,globalBlackboardAccesses:r,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:i,globalBlackboardAccesses:r,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,statementTypes:d,finalType:d.at(-1)}}function xe(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?et:t.valueKind==="string"?Tn:t.valueKind==="boolean"?Dn:le;case"Identifier":return qu(e,t.name,t.range);case"UnaryExpression":{let n=xe({...e,expression:t.argument});return t.operator==="!"?Qe(n)?Dn:(ee(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"?et:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?U:le:(ee(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=xe({...e,expression:t.left}),o=xe({...e,expression:t.right});switch(t.operator){case"&&":case"||":return Rs(n)||Rs(o)?(ee(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):Dn;case"+":return n.kind==="string"&&o.kind==="string"?Tn:n.kind==="number"&&o.kind==="number"?et:zo(n,o)?le:(Wo(e,t.range,t.operator),U);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&o.kind==="number"?et:zo(n,o)?le:(Wo(e,t.range,t.operator),U);case"..":return n.kind==="string"&&(o.kind==="string"||o.kind==="number")||o.kind==="string"&&(n.kind==="string"||n.kind==="number")?Tn:zo(n,o)?le:(Wo(e,t.range,t.operator),U)}return le}case"ComparisonChain":{let n=t.operands.map(o=>xe({...e,expression:o}));for(let o=0;o<t.operators.length;o+=1){let i=t.operators[o],r=n[o],s=n[o+1];if(!Vu(i,r,s))return ee(e,"invalid-operand-type",{start:t.operands[o]?.range.start??t.range.start,end:t.operands[o+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"),U}return Dn}case"ConditionalExpression":{let n=xe({...e,expression:t.condition});Qe(n)||ee(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 o=xe({...e,expression:t.thenExpression}),i=xe({...e,expression:t.elseExpression}),r=Go(o,i);return r||(ee(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 $u(e)}}function $u(e){let{environment:t,attributeName:n,identifiers:o,introducedSymbols:i}=e,r=e.expression,s=xe({...e,expression:r.right});if(r.left.kind!=="Identifier")return xe({...e,expression:r.left}),ee(e,"invalid-operand-type",r.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 a=r.left,l=r.operator===":="?"declare":r.operator==="="?"write":"readwrite",d={name:a.name,kind:l,range:a.range,identifier:a,statementIndex:e.statementIndex};o.push(d);let c=Uo(a.name);if(c.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(d),Ds(e,a.range,c.raw,c.message),U;if(c.kind==="global-blackboard"){let f=t.globalBlackboard.get(c.key),y=r.operator===":="?s:r.operator==="="?f&&vt(f.type,s)?s:f?void 0:s:ks(f?.type??le,s,r.operator);if(r.operator!==":="&&r.operator!=="="&&!y)return ee(e,"invalid-compound-assignment",r.range,`operator \`${r.operator}\` is not valid for these operand types`,`compound assignment \`${r.operator}\` is not allowed here`,r.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),U;if((r.operator===":="||r.operator==="=")&&f&&!vt(f.type,s))return Ko(e,a,f.type,s),U;let g=f?{...f}:{name:c.key,type:s,source:{kind:"global-blackboard",key:c.key,range:a.range,originId:e.originId},readable:!0,writable:!0};return g.type=y??s,t.globalBlackboard.set(c.key,g),e.resolvedIdentifiers.push({access:d,resolution:{kind:"global-blackboard",key:c.key,symbol:g}}),e.globalBlackboardAccesses.push({key:c.key,rawName:a.name,kind:l,range:a.range,inferredType:g.type}),g.type}let p=t.symbols.get(a.name);if(r.operator===":="&&!p){let f={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,f),e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:f}}),i.push(f),s}if(!p)return e.resolvedIdentifiers.push({access:d,resolution:{kind:"unknown"}}),ee(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"),U;if(e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:p}}),r.operator==="=")return vt(p.type,s)?(Ho(p,s),s):(Ko(e,a,p.type,s),U);if(r.operator===":=")return vt(p.type,s)?(Ho(p,s),s):(Ko(e,a,p.type,s),U);let m=ks(p.type,s,r.operator);return m?(Ho(p,m),m):(ee(e,"invalid-compound-assignment",r.range,`operator \`${r.operator}\` is not valid for these operand types`,`compound assignment \`${r.operator}\` is not allowed here`,r.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),U)}function qu(e,t,n){let o={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(o);let i=Uo(t);if(i.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(o),Ds(e,n,i.raw,i.message),U;if(i.kind==="global-blackboard"){let a=e.environment.globalBlackboard.get(i.key);return e.globalBlackboardAccesses.push({key:i.key,rawName:t,kind:"read",range:n,inferredType:a?.type??le}),e.resolvedIdentifiers.push({access:o,resolution:{kind:"global-blackboard",key:i.key,...a?{symbol:a}:{}}}),a?.type??le}let r=e.environment.enums.get(t);if(r!==void 0)return e.resolvedIdentifiers.push({access:o,resolution:{kind:"enum",name:t,value:r}}),et;let s=e.environment.symbols.get(t);return s?(e.resolvedIdentifiers.push({access:o,resolution:{kind:"symbol",symbol:s}}),s.type):(e.resolvedIdentifiers.push({access:o,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(o),le)}function ks(e,t,n){return e.kind==="error"||t.kind==="error"?U:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?le:n==="+="?e.kind==="number"&&t.kind==="number"?et:e.kind==="string"&&t.kind==="string"?Tn:void 0:e.kind==="number"&&t.kind==="number"?et:void 0}function zo(e,t){return In(e)||In(t)}function In(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Rs(e){return!Qe(e)}function Vu(e,t,n){return In(t)||In(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 Wo(e,t,n){ee(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 Ko(e,t,n,o){ee(e,"variable-type-mismatch",t.range,`cannot assign ${Jo(o)} to variable \`${t.name}\` of type ${Jo(n)}`,`\`${t.name}\` expects ${Jo(n)} here`,"assign a compatible value or change the variable's source type")}function Ds(e,t,n,o){ee(e,"invalid-global-blackboard-identifier",t,o,`\`${n}\` is not a valid global blackboard identifier`,"use `@name` with a valid blackboard key that starts with a letter or underscore")}function Ho(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 ee(e,t,n,o,i,r){e.diagnostics.push({code:t,range:n,message:o,details:{primaryLabel:i,help:r}})}function Jo(e){return e.kind==="custom"?e.name:e.kind}var Ts=new WeakMap;function Cn(e,t){let n=e.getNodeUsage(t),o=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(i=>{let r=Oo({elementName:t.name,attributeName:i.name,resolvedNodeType:o});return r?[{attribute:i,info:r,parseResult:Ht(i.value)}]:[]})}function he(e,t,n){return jo(e.document,t,n)}function Is(e){return{start:0,end:e.value.length}}function Ue(e,t){let n=e.getTreeNodeView(t),o=n?.behaviorTree;return!n||!o?Cn(e,t).map(i=>{let r=Cs(e,[]);return{...i,environment:r,analysis:i.parseResult.ok?Yt({program:i.parseResult.program,environment:r,attributeName:i.attribute.name}):void 0}}):Xu(e,o).filter(i=>i.node.element===t).map(i=>({...i.candidate,environment:i.environmentBefore,analysis:i.analysis}))}function Xu(e,t){let n=Ts.get(e.view);n||(n=new WeakMap,Ts.set(e.view,n));let o=n.get(t);if(o)return o;let i=t.nodes.flatMap(s=>Cn(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),r=Xo({baseEnvironment:Cs(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 l=i[a];return l?[{...s,node:l.node,candidate:l.candidate}]:[]});return n.set(t,r),r}function Cs(e,t){let n=ge(e.semantic),o=[],i=[],r=t[0]?.behaviorTree.id;if(r){let s=e.getNodeModel(r);if(s?.kind==="SubTree")for(let a of s.ports){let l=He(a),c=ve(e.semantic,l)?.canonical??l;o.push({name:a.name,type:Jt(n,l),source:{kind:"subtree-port",nodeType:r,portName:a.name,direction:a.direction},readable:!0,writable:a.direction==="output"||a.direction==="inout",compatibilityKey:c})}}for(let s of t)for(let a of s.portBindings){if(a.usage.status!=="resolved")continue;let l=Z({portName:a.usage.port.name,rawValue:a.usage.value});if(!l.ok||l.reference.scope==="global")continue;let d=He(a.usage.port),p=ve(e.semantic,d)?.canonical??d,m=a.usage.port.direction,f=s.usage.model.status==="resolved"?s.usage.model.model.id:s.usage.nodeType;o.push({name:l.reference.key,type:Jt(n,d),source:{kind:"port-remap",nodeType:f,portName:a.usage.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:p})}return i.push(...Gu(e,n)),Vo({symbols:o,globalBlackboardSymbols:i,augmentations:Io(e.semantic),areTypesCompatible:(s,a)=>s&&a?ft(e.semantic,s,a):!0})}function Gu(e,t){let n=[];for(let o of e.view.nodes){let i=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let r of o.portBindings){if(r.usage.status!=="resolved")continue;let s=Z({portName:r.usage.port.name,rawValue:r.usage.value});if(!s.ok||s.reference.scope!=="global")continue;let a=He(r.usage.port),d=ve(e.semantic,a)?.canonical??a,c=r.usage.port.direction;n.push({name:s.reference.key,type:Jt(t,a),source:{kind:"global-blackboard-remap",nodeType:i,portName:r.usage.port.name,direction:c,key:s.reference.key},readable:c==="input"||c==="output"||c==="inout",writable:c==="output"||c==="inout",compatibilityKey:d})}}return n}var Es=C({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Ue(e,t))if(n.analysis)for(let o of n.analysis.unknownIdentifiers)e.report({code:u.UnknownScriptVariable,message:`unknown script variable \`${o.name}\``,range:he(e,n.attribute,o.range),details:{primaryLabel:`\`${o.name}\` is not defined in the script environment`,help:"introduce it earlier with `:=`, add a matching blackboard remap, or define a script enum in btxml.model-augment.json"}})}}}});var Ns=C({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Ue(e,t))if(n.analysis)for(let o of n.analysis.diagnostics){let i=o.code==="assignment-to-unknown-variable"?u.AssignmentToUnknownVariable:o.code==="invalid-compound-assignment"?u.InvalidCompoundAssignment:o.code==="variable-type-mismatch"?u.ScriptVariableTypeMismatch:o.code==="invalid-global-blackboard-identifier"?u.InvalidGlobalBlackboardIdentifier:void 0;i&&e.report({code:i,message:o.message,range:he(e,n.attribute,o.range),details:o.details})}}}}});var Ms=C({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Ue(e,t))if(n.analysis)for(let o of n.analysis.diagnostics)o.code==="invalid-operand-type"&&e.report({code:u.InvalidScriptOperandType,message:o.message,range:he(e,n.attribute,o.range),details:o.details})}}}});var ws=C({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Ue(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let o=n.parseResult.program.statements.at(-1),i=n.analysis.finalType;!o||!i||Qe(i)||e.report({code:u.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:he(e,n.attribute,o.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 Ps=C({name:"script/valid-syntax",create(e){return{Element(t){for(let n of Cn(e,t))if(!n.parseResult.ok)for(let o of n.parseResult.errors){let i=o.kind==="empty-script"?u.EmptyScript:o.kind==="invalid-token"?u.InvalidScriptToken:u.InvalidScriptSyntax;e.report({code:i,message:o.message,range:o.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??he(e,n.attribute,Is(n.attribute)):he(e,n.attribute,o.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Bs=[Ps,Es,Ns,Ms,ws];var zu={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function _s(e){return C({name:zu[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:Wu(n)})}}}})}function Wu(e){return e.code?{code:e.code}:void 0}var As=[_s("unused"),_s("missing-reason")];function En(e,t){return e.attributes.find(n=>n.name===t)}function js(e,t){if(!e)return!1;let n=(o,i)=>{let r=i||o.name==="TreeNodesModel";if(o===t)return r;for(let s of o.children)if(s.kind==="element"&&n(s,r))return!0;return!1};return n(e,!1)}var Fs=[C({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||En(t,"ID")||e.report({message:"BehaviorTree must have ID attribute",range:t.range})}}}}),C({name:"tree/no-duplicate-id-in-file",create(e){let t=new Set;return{ProgramExit(){let n=Ft(e.semantic,e.document.uri);for(let o of n?.behaviorTrees??[])o.idRange&&(t.has(o.id)&&e.report({message:`Duplicate BehaviorTree ID: ${o.id}`,range:o.idRange}),t.add(o.id))}}}}),C({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of gt(e.semantic)){let n=Se(e.semantic,t);if(n.length<=1||new Set(n.map(r=>r.uri)).size<=1)continue;let i=n.filter(r=>r.uri===e.document.uri);i.length>0&&e.report({message:`Duplicate BehaviorTree ID: ${t}`,range:i[0]?.idRange})}}}}}),C({name:"tree/no-unknown-main-tree",create(e){return{Document(){let t=e.document.root;if(e.document.kind!=="bt-document"||!t)return;let n=En(t,"main_tree_to_execute");!n?.value||So(e.semantic,n.value)||e.report({message:`main_tree_to_execute references unknown BehaviorTree: ${n.value}`,range:n.range})}}}}),C({name:"tree/no-unknown-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||js(e.document.root,t))return;let n=e.getSubTreeCallView(t),o=n?.node.element.attributes.find(r=>r.name==="ID")??En(t,"ID");!o||n?.target.status==="resolved"||e.resolveSubTree(o.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${o.value}\``,range:o.valueContentRange||o.valueRange})}}}}),C({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||js(e.document.root,t))return;let n=En(t,"ID");if(!n||e.getSubTreeCallView(t)?.target.status==="resolved")return;let 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})}}}}),C({name:"tree/no-duplicate-node-model-id",meta:{description:"TreeNodesModel elements must have unique IDs within the same model block."},create(){return{}}})];var Ku=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function Hu(e,t){return e===t?String(e):`${e}\u2013${t}`}var Ls=C({name:"model/valid-child-count",create(e){return{Element(t){if(ye(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&Ju(e,t,n.model.model.id,n.model.model.kind)}}}});function Ju(e,t,n,o){let i=is(t).length,r=Ku.get(n);if(r){if(i<r.min||i>r.max){let s=Hu(r.min,r.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${i}.`,range:t.range})}return}if(o==="Action"||o==="Condition"){i>0&&e.report({message:`${o} node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range});return}if(o==="Decorator"){i!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${i}.`,range:t.range});return}if(o==="Control"){i<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}o==="SubTree"&&i>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range})}var Os=C({name:"model/valid-port-value",create(e){return{Element(t){if(ye(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let i=e.getPortUsage(t,o.name);i?.status==="resolved"&&Rn(e,{port:i.port,value:o.value,range:o.range,registry:ge(e.semantic),typeDefinition:ve(e.semantic,i.port.type),allowRemap:!0,diagnosticCode:u.InvalidPortValueType,customLiteralDiagnosticCode:u.CustomLiteralRequiresValidator,portLabel:o.name})}}}}});var Us=C({name:"model/require-port",create(e){return{Element(t){if(ye(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of n.ports)!o.required||n.portUsages.some(r=>r.name===o.name&&r.status==="resolved")||e.report({message:`missing required port \`${o.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${o.name}\``:`SubTree requires port \`${o.name}\``,help:`add \`${o.name}="..."\` or provide a blackboard reference such as \`${o.name}="{value}"\``}:void 0})}}}});var $s=[C({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(ye(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let o=n.model.model.kind;o!=="Control"&&o!=="Decorator"||e.report({message:`${o} node \`${n.model.model.id}\` normally expects child nodes.`,range:t.range})}}}}),C({name:"model/no-leaf-block-shape",create(e){return{Element(t){if(ye(t)||t.selfClosing||rs(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let o=n.model.model.kind;o!=="Action"&&o!=="Condition"&&o!=="SubTree"||e.report({message:`${o} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var qs=C({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 o=t.attributes.find(i=>i.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:o?.valueContentRange??o?.valueRange??t.range})}}}});var Vs=C({name:"model/no-unknown-port",create(e){return{Element(t){if(ye(t))return;let n=e.getNodeUsage(t);for(let o of n.portUsages){if(o.status!=="undeclared")continue;let i=n.ports.map(s=>s.name).sort(),r=i.length>=1&&i.length<=8?[`note: defined ports: ${i.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${o.name}\``,range:o.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 \`${o.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${o.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:r}:void 0})}}}}});var Xs=[qs,Vs,Us,Os,...$s,Ls];function Yu(e,t){return e.attributes.find(n=>n.name===t)}function Zu(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Gs=[C({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:u.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||Yu(t,"BTCPP_format")?.value==="4"||e.report({message:'Root element must have BTCPP_format="4"',range:t.range})}}}},C({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)||Zu(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var Yo=[...Gs,...Bs,...Fs,...us,...Xs,...ns,...As],vv=new Map(Yo.map(e=>[e.name,e]));function zs(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Ws(e,t){return Ne(e.linter.rules[t])?.options??{}}function Ks(e){let t=Ne(e.config.linter.rules[e.rule]);return zs(t?t.severity:e.defaultSeverity)}function Hs(e){let t=[],n=e.facts??Zr(),o=e.rules?new Set(e.rules):void 0,i=[];for(let s of Yo){if(o&&!o.has(s.name))continue;let a=Ks({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=Ws(e.config,s.name),d=s.optionsSchema?.safeParse(l),c=d?.success?d.data:l,p=ts({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:c,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});i.push(s.create(p))}for(let s of i)s.Document?.();e.document.root&&Js(e.document.root,i);let r=Ft(e.semantic,e.document.uri);for(let s of r?.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)=>Qu(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function Js(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&Js(n,t)}function Qu(e,t){let n=e.range,o=t.range;return!n&&!o?0:n?o?n.start.line-o.start.line||n.start.character-o.start.character||n.end.line-o.end.line||n.end.character-o.end.character:-1:1}function Zo(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let o=[...e.diagnostics],i=n.documentView??Fe(e,{semantic:t,config:n.config,policy:be(n.config)});return o.push(...Hs({document:e,view:i,semantic:t,config:n.config})),o}import di from"path";function ep(e){return e.endsWith("/")?e:`${e}/`}function tp(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):Qo(e.split("/"))}function Qo(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function tt(e,t={}){let n=e.replace(/\\/g,"/"),o=s=>tp(s,t.preserveDotSegments),i=/^(?<scheme>[A-Za-z][A-Za-z\d+.-]*):\/\/(?<authority>[^/]*)(?<path>\/.*)?$/.exec(n);if(i?.groups)return{scheme:i.groups.scheme,authority:i.groups.authority,absolute:!0,segments:o(i.groups.path||"/")};let r=/^(?<drive>[A-Za-z]:)(?<rest>\/.*)?$/.exec(n);return r?.groups?{authority:r.groups.drive,absolute:!0,segments:o(r.groups.rest||"/")}:{absolute:n.startsWith("/"),segments:o(n)}}function Nn(e){let n=Qo(e.segments).join("/");if(e.scheme){let o=`${e.scheme}://${e.authority??""}`;return n?`${o}/${n}`:`${o}/`}return e.authority&&e.absolute?n?`${e.authority}/${n}`:`${e.authority}/`:e.absolute?n?`/${n}`:"/":n}function np(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Zt(e){return Nn(tt(e))}function op(e,...t){let n=tt(e),o=[...n.segments];for(let i of t){let r=tt(i,{preserveDotSegments:!0});if(r.scheme||r.absolute&&r.authority)return Zt(i);r.absolute&&(o.length=0),o.push(...r.segments)}return Nn({...n,segments:Qo(o)})}function ip(e){let t=tt(e);return t.segments.length===0?Nn(t):Nn({...t,segments:t.segments.slice(0,-1)})}function rp(e){return tt(e).segments.at(-1)??""}function sp(e,t){let n=tt(e),o=tt(t);if(!np(n,o))return Zt(t);let i=0;for(;i<n.segments.length&&i<o.segments.length&&n.segments[i]===o.segments[i];)i+=1;let r=new Array(n.segments.length-i).fill(".."),s=o.segments.slice(i);return[...r,...s].join("/")}function ap(e,t){let n=ep(Zt(e)),o=Zt(t);return o===n.slice(0,-1)||o.startsWith(n)}var K={normalize:Zt,join:op,dirname:ip,basename:rp,relative:sp,isWithin:ap};function ke(e,...t){return K.join(e,...t)}function Ys(e){return K.dirname(e)}function Zs(e){return K.basename(e)}function $e(e,t){return K.relative(e,t)}function Qs(e,t){return K.isWithin(e,t)}async function na(e,t,n){let o=e;for(;;){for(let r of t){let s=K.join(o,r);if(await n.exists(s))return s}let i=K.dirname(o);if(i===o)return;o=i}}async function lp(e,t){return na(e,["btxml.config.json"],t)}async function ea(e,t){return JSON.parse(await t.readFile(e))}function ta(e,t){return e.map(n=>T(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function oa(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await lp(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[T("CFG006_CONFIG_PATH_NOT_FOUND",h.Error,`config file not found \`${t}\``,void 0,t,{help:"check the `--config` path or run without `--config` to use config discovery"})]};try{n=await ea(t,e.host)}catch(r){let s=String(r.message||r);return{ok:!1,configUri:t,diagnostics:[T("CFG001_INVALID_CONFIG_JSON",h.Error,"invalid configuration JSON",void 0,t,{primaryLabel:"the config file could not be parsed as JSON",help:"fix the JSON syntax in the config file",notes:[s]})]}}}else{let r=await na(e.startUri,["package.json"],e.host);if(r)try{let s=await ea(r,e.host);s.btxml&&(n=s.btxml,t=r)}catch{n={}}}let o=pt(n);if(!o.ok)return{ok:!1,configUri:t,diagnostics:ta(o.diagnostics,t)};let i=go(o.value);return i.length>0?{ok:!1,configUri:t,diagnostics:ta(i,t)}:{ok:!0,config:o.value,configUri:t,diagnostics:[]}}import dp from"ignore";function ei(e){return e.replace(/\\/g,"/")}function V(e,t){return ei($e(e,t))}function cp(e){let t=e.replace(/\\/g,"/"),n="^";for(let o=0;o<t.length;o+=1){let i=t[o],r=t[o+1],s=t[o+2];if(i==="*"&&r==="*"&&s==="/"){n+="(?:.*/)?",o+=2;continue}if(i==="*"&&r==="*"){n+=".*",o+=1;continue}if(i==="*"){n+="[^/]*";continue}if(i==="?"){n+="[^/]";continue}".+-^${}()|[]\\".includes(i)?n+=`\\${i}`:n+=i}return n+="$",new RegExp(n)}function qe(e,t){let n=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||Zs(n)===o:cp(o).test(n)}function up(e){return e.includes("*")||e.includes("?")}async function ia(e,t,n,o,i,r,s,a){let l=V(n,t);if(l&&o.some(c=>qe(l,c)||qe(`${l}/`,c)||qe(`${l}/dummy`,c))||a&&l&&a.ignores(l))return;let d;try{d=await e.readDir(t)}catch{return}for(let c of d){let p=ke(t,c.name),m=c.type==="directory",f=c.type==="file";if(c.type==="other"&&r&&e.realpath)try{let y=await e.realpath(p);if(s.has(y))continue;s.add(y);let g=await e.stat(y);m=g?.type==="directory",f=g?.type==="file"}catch{continue}m?await ia(e,p,n,o,i,r,s,a):f&&i.push(p)}}async function Qt(e,t,n,o,i,r,s){let a=new Set,l=new Set,d=[],c=i??t;for(let m of e){let f=ke(c,m);if((await s.stat(f))?.type==="file"){let y=V(t,f),g=!y.startsWith("..");!n.some(S=>qe(y,S))&&(!g||!r?.ignores(y))&&a.add(f);continue}if(!up(m)){l.add(m);continue}d.push(m)}let p=[];if(d.length>0&&await s.exists(t)){let m=new Set([s.realpath?await s.realpath(t):t]);await ia(s,t,t,n,p,o,m,r)}for(let m of p){let f=V(c,m);d.some(y=>qe(f,y))&&(n.some(y=>qe(V(t,m),y))||r?.ignores(V(t,m))||a.add(m))}for(let m of d)p.some(y=>{let g=V(c,y);return qe(g,m)&&!n.some(S=>qe(V(t,y),S))&&!r?.ignores(V(t,y))})||l.add(m);return{files:[...a].sort((m,f)=>V(t,m).localeCompare(V(t,f))),unmatchedPatterns:[...l].sort()}}async function pp(e,t){let n=ke(e,".gitignore");return await t.exists(n)?(await t.readFile(n)).split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")):[]}function mp(e){return dp().add(e)}async function ra(e,t,n,o,i){let r=[...t.ignore],s=t.useGitignore?await pp(e,i):[],a=mp(s),l=n?.length?n:t.include,d=await Qt(l,e,r,t.followSymlinks,n?.length?o:void 0,a,i),c=t.maxSize,p=[],m=[];for(let f of d.files){let y=V(e,f),g=await i.stat(f);if(g){if((g.size??0)>c){m.push({path:y,reason:"too-large"});continue}p.push({path:y,uri:f,kind:"unknown"})}}return{selectedFiles:p,skippedFiles:m,unmatchedPatterns:d.unmatchedPatterns}}function sa(e){return e.entrypoints.map(t=>({file:ei(t)}))}function ti(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function aa(e,t,n,o){let i=[];for(let r of t)await o.exists(ke(e,r.file))||i.push(T(u.EntrypointNotFound,h.Error,`entrypoint file not found \`${r.file}\``,void 0,n,{help:"check `resolver.entrypoints` and make sure the file exists under the project root"}));return i}async function la(e,t,n,o){let i=await Qt(t.files,e,[],n.followSymlinks,void 0,void 0,o),r=await Qt(t.definitions,e,[],n.followSymlinks,void 0,void 0,o),s=await Qt(t.augmentations,e,[],n.followSymlinks,void 0,void 0,o),a=i.files.map(c=>({path:V(e,c),uri:c,kind:"model-xml"})),l=r.files.map(c=>({path:V(e,c),uri:c,kind:"node-definition"})),d=s.files.map(c=>({path:V(e,c),uri:c,kind:"model-augmentation"}));return{modelFiles:a,augmentationFiles:d,definitionFiles:l,unmatchedPatterns:{models:i.unmatchedPatterns,augmentations:s.unmatchedPatterns,definitions:r.unmatchedPatterns}}}function ni(e){return e.rootUri}function oi(e){return e.configUri}function ii(e){return e.config}function nt(e){return e.resolvedConfig}function ri(e){return e.selectedFiles.map(t=>({...t}))}function si(e){return e.modelFiles.map(t=>({...t}))}function ai(e){return e.definitionFiles.map(t=>({...t}))}function li(e){return e.skippedFiles.map(t=>({...t}))}async function fp(e){if(e.configUri)return K.dirname(e.configUri);let t=e.startUri;for(;;){if(await e.host.exists(K.join(t,".git"))||await e.host.exists(K.join(t,".colcon")))return t;let n=K.dirname(t);if(n===t)return e.startUri;t=n}}async function da(e){let t=await oa({startUri:e.rootUri,configUri:e.configUri,noConfig:e.noConfig,host:e.host});if(!t.ok||!t.config)return{ok:!1,diagnostics:t.diagnostics};let n=pn(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let o=n.config,i=await fp({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:r,skippedFiles:s}=await ra(i,o.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?V(i,t.configUri):"",d=sa(o.resolver);for(let g of d){let S=K.join(i,g.file);await e.host.exists(S)&&!r.some(v=>v.uri===S)&&r.push({path:g.file,uri:S,kind:"bt-xml"})}let{modelFiles:c,augmentationFiles:p,definitionFiles:m,unmatchedPatterns:f}=await la(i,o.models,o.files,e.host);for(let g of f.models)a.push(T(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${g}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let g of f.definitions)a.push(T(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${g}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let g of f.augmentations)a.push(T(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${g}\``,void 0,l,{help:"check `models.augmentations` and make sure the file exists"}));let y=o.models.builtins;return a.push(...await aa(i,d,l,e.host)),{ok:!0,diagnostics:a,project:{rootUri:i,configUri:t.configUri,host:e.host,config:t.config,resolvedConfig:o,selectedFiles:r,entrypoints:d,modelFiles:c,augmentationFiles:p,definitionFiles:m,skippedFiles:s,modelsBuiltins:y}}}import{constants as hp}from"fs";import en from"fs/promises";import bp from"path";import ca from"path";import{fileURLToPath as gp,pathToFileURL as ua}from"url";function yp(e){return e.startsWith("file://")?e:ua(ca.resolve(e)).href}function te(e){return gp(yp(e))}function ot(e){return ua(ca.resolve(e)).href}function vp(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function Me(e=process.cwd(),t={}){let n=bp.resolve(e),o=ot(n);return{rootUri(){return o},async readFile(i){return en.readFile(te(i),"utf8")},async exists(i){try{return await en.access(te(i),hp.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(i){try{let r=await en.stat(te(i));return{type:vp(r),size:r.size}}catch{return}},async readDir(i){return(await en.readdir(te(i),{withFileTypes:!0})).map(s=>({name:s.name,type:s.isFile()?"file":s.isDirectory()?"directory":"other"}))},async realpath(i){return ot(await en.realpath(te(i)))},async resolvePackageUri(i){return t.resolvePackageUri?.(i)}}}async function ci(e={}){let t=di.resolve(e.cwd??process.cwd()),n=e.projectRoot?di.resolve(t,e.projectRoot):t,o=Me(n,e.hostOptions);return da({rootUri:ot(n),host:o,configUri:e.configPath?ot(di.resolve(t,e.configPath)):void 0,noConfig:e.noConfig,cliFiles:e.cliFiles,command:e.command})}var pa={InvalidJson:u.InvalidAugmentationJson,InvalidSchema:u.InvalidAugmentationSchema};function Sp(e){return T(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function xp(e,t){return t.issues.map(n=>Sp({filePath:e,code:n.kind==="json"?pa.InvalidJson:pa.InvalidSchema,message:n.kind==="json"?`invalid augmentation JSON \`${e}\``:`invalid augmentation schema \`${e}\``,range:n.range,primaryLabel:n.message,help:n.kind==="json"?`fix the JSON syntax in \`${e}\``:n.path?`fix the schema issue at \`${n.path}\``:"fix the schema issue in the file",notes:n.notes}))}async function Mn(e){let t=e.project,n=e.host??t.host,o=[],i=[];for(let r of t.augmentationFiles){if(!await n.exists(r.uri)){o.push(T(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${r.path}\``,void 0,r.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(r.uri),a=co(s,{uri:r.uri,path:r.path});if(!a.ok){o.push(...xp(r.path,a));continue}i.push(a.data)}return{ok:o.every(r=>r.severity!==h.Error),augmentations:i,diagnostics:o}}function kp(e){let t=e.root;if(!t)return;if(t.name==="TreeNodesModel")return{...e,kind:"model-document",isBtXml:!0};let n=t.children.find(i=>i.kind==="element"&&i.name==="TreeNodesModel");if(!n)return;let o=e.nodes.flatMap(i=>i===t?t.children.filter(r=>r===n||r.kind==="comment"):i.kind==="comment"?[i]:[]);return{...e,kind:"model-document",root:n,nodes:o,isBtXml:!0}}async function Rp(e,t){return Le(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function ui(e,t){if(!await t.exists(e.uri))return{diagnostics:[T(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${e.path}\``,void 0,e.path,{help:"check `models.files` and make sure the file exists"})]};let n=await Rp(e,t);if(!n.document||n.diagnostics.some(i=>i.severity===h.Error)){let i=n.diagnostics[0];return{diagnostics:[T(u.ExternalModelXmlParseError,h.Error,`failed to parse external TreeNodesModel file \`${e.path}\``,n.diagnostics[0]?.range,e.path,{primaryLabel:"the external model file is not valid XML",help:`fix the XML syntax in \`${e.path}\` before using it as an external model file`,notes:i?[`first XML error: ${i.code} ${i.message}`]:void 0})]}}let o=kp(n.document);return o?{document:o,diagnostics:[]}:{diagnostics:[T(u.MissingTreeNodesModel,h.Error,"missing `<TreeNodesModel>` in external model file",n.document.root?.range,e.path,{primaryLabel:"this file does not contain a `<TreeNodesModel>` element",help:"add a `<TreeNodesModel>` element or remove the file from `models.files`"})]}}async function H(e,t){let n=e,o=t??n.host,i=[];for(let d of n.selectedFiles){if(!await o.exists(d.uri))continue;let c=await o.readFile(d.uri),p=Le(c,{uri:d.uri,path:d.path});p.document&&i.push(p.document)}let r=await Promise.all(n.modelFiles.map(d=>ui(d,o))),s=await Mn({project:e,host:o}),a=r.flatMap(d=>d.diagnostics),l=r.flatMap(d=>d.document?[d.document]:[]);return{documents:i,externalModelDocuments:l,augmentations:[...s.augmentations],diagnostics:[...a,...s.diagnostics]}}function ma(e,t){return e.attributes.find(n=>n.name===t)}function fa(e,t){return $e(e,t).replace(/\\/g,"/")}function Dp(e,t,n,o,i){return e.replace(/\$\{([^}]+)\}/g,(r,s)=>s.startsWith("env:")?process.env[s.slice(4)]??r:t[s]!==void 0?t[s]:(n.push({kind:"unresolved-variable",uri:i,variable:s,range:o,message:`unresolved include path variable \`${s}\``}),r))}function Tp(e,t){let n=t.resolvedConfig.resolver.includes.elements.map(r=>({name:r.name,pathAttribute:r.attribute,base:r.base==="project-root"?"project-root":"current-file"})),o=e.root;if(!o)return[];let i=[];for(let r of o.children||[]){if(r.kind!=="element")continue;let s=n.find(a=>a.name===r.name);s&&i.push({element:r,pathAttr:ma(r,s.pathAttribute),rosPackageAttr:ma(r,"ros_pkg"),base:s.base??"current-file"})}return i}async function ga(e){let t=e.project,n=e.host??t.host,o=e.resolvedConfig.resolver.includes.allowOutsideRoot,i=e.resolvedConfig.resolver.includes.maxDepth,r=e.resolvedConfig.resolver.includes.maxFiles,s=[],a=new Map(e.documents.map(g=>[fa(t.rootUri,g.path||g.uri),g])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},d=new Map,c=new Set,p=t.entrypoints.length?t.entrypoints.map(g=>g.file):t.selectedFiles.map(g=>g.path);l.entrypointFiles=[...new Set(p)];let m=new Set,f=new Set,y=async(g,S,v)=>{if(S.length>=i){s.push({kind:"depth-exceeded",uri:v?.uri??g,path:g,range:v?.range,message:`include \`${g}\` exceeds the configured maximum include depth`});return}if(l.reachableFiles.size>=r){s.push({kind:"too-many-files",uri:v?.uri??g,path:g,range:v?.range,message:`resolving \`${g}\` would exceed the configured file limit`});return}let x=g.replaceAll("\\","/");if(m.has(x)){let A=[...S.slice(S.indexOf(x)),x];l.cycles.push({files:A}),s.push({kind:"cycle",uri:v?.uri??x,path:x,cycle:A,range:v?.range,message:"include cycle detected"});return}if(f.has(x))return;m.add(x),l.reachableFiles.add(x);let D=ke(t.rootUri,x);c.add(D);let M=await n.exists(D),P=a.get(x);!P&&M&&(P=Le(await n.readFile(D),{uri:D,path:x}).document,P&&a.set(x,P)),l.nodes.set(x,{path:x,document:P,exists:M}),P&&d.set(P.uri,P);let B=P?.uri??D;if(!M){s.push({kind:"not-found",uri:v?.uri??B,path:x,range:v?.range,message:`include file not found \`${x}\``}),m.delete(x);return}if(!P){m.delete(x);return}for(let A of Tp(P,e)){if(!A.pathAttr){s.push({kind:"missing-path",uri:B,range:A.element.range,message:"missing include path"});continue}let Be=Dp(A.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,A.pathAttr.range,B),re;if(A.rosPackageAttr){let w=A.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:B,packageName:w,range:A.rosPackageAttr.range,message:`include uses ros_pkg=\`${w}\` but ProjectHost.resolvePackageUri is not available`});continue}let E=await n.resolvePackageUri(w);if(!E){s.push({kind:"ros-package-not-found",uri:B,packageName:w,path:Be,range:A.rosPackageAttr.range,message:`ROS package \`${w}\` could not be resolved for include path \`${Be}\``});continue}re=ke(E,Be)}else{let w=A.base==="project-root"?t.rootUri:Ys(D);re=ke(w,Be)}let O=fa(t.rootUri,re),me=re;try{await n.exists(re)&&(me=n.realpath?await n.realpath(re):re)}catch{}if(!Qs(t.rootUri,me)){if(!o){s.push({kind:"outside-root",uri:B,path:O,range:A.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:B,path:O,range:A.pathAttr.range,message:`external include used \`${Be}\``})}l.edges.push({from:x,to:O,includeElementRange:A.element.range,includePathRange:A.pathAttr.range}),await y(O,[...S,x],{uri:B,range:A.pathAttr.range})}m.delete(x),f.add(x)};for(let g of l.entrypointFiles)await y(g,[]);return{graph:l,reachableUris:c,reachableDocuments:d,issues:s}}var ya="model/no-conflicting-kind-for-id",ha="model/no-unused-definition",ba="model/no-duplicate-definition";function pi(e){return{...T(e.code,e.severity,e.message,e.range,e.uri,void 0,e.data),rule:e.rule,...e.relatedInformation?{relatedInformation:e.relatedInformation}:{}}}function mi(e,t){let n=Ke(e.linter.rules,t);if(n!=="off")return n==="info"?h.Info:n==="warn"?h.Warning:h.Error}function we(e){return e.model.idRange??e.range}function Ip(e){return{uri:e.uri,sourceKind:e.sourceKind,modelKind:e.kind,range:e.range}}function Cp(e){let t=mi(e.config,ya);if(!t)return[];let n=[],o=qt(e.facts.filter(i=>!i.isBuiltin));for(let[i,r]of o){if(new Set(r.map(l=>l.kind)).size<=1)continue;let a=r[0];if(a)for(let l of r.slice(1)){if(l.kind===a.kind)continue;let d=we(a),c=a.uri&&d?[{uri:a.uri,range:d,message:"first conflicting definition"}]:void 0;n.push(pi({code:"BT120_CONFLICTING_MODEL_KIND",message:`model ID \`${i}\` has conflicting kinds (\`${a.kind}\` vs \`${l.kind}\`)`,uri:l.uri,range:we(l),rule:ya,severity:t,data:{kind:"conflicting-model-kind",nodeId:i,definitions:r.map(Ip)},relatedInformation:c}))}}return n}function Ep(e){if(e.config.models.convention!=="used-only")return[];let t=mi(e.config,ha);if(!t)return[];let n=[],o=xo(e.index);for(let i of e.facts){if(i.isBuiltin||i.sourceKind!=="inline-tree-nodes-model"||i.kind==="SubTree")continue;let r=o.get(i.uri??"")??[];new Set(r.filter(a=>a.kind==="node").map(a=>a.id)).has(i.id)||n.push(pi({code:"BT121_UNUSED_MODEL_DEFINITION",message:`unused inline model definition \`${i.id}\` in this file`,uri:i.uri,range:we(i),rule:ha,severity:t,data:{kind:"unused-model-definition",nodeId:i.id,modelKind:i.kind,sourceKind:"inline-tree-nodes-model",fix:i.uri&&we(i)&&i.editable?{kind:"delete-definition",uri:i.uri,range:we(i)}:void 0}}))}return n}function Np(e){let t=e.filter(i=>i.isCanonicalModelFile);if(t.length!==1)return;let n=t[0];if(!n?.uri)return;let o=e.filter(i=>i!==n);if(!o.some(i=>!i.uri||!we(i)||!i.editable))return{kind:"delete-non-canonical-definitions",keep:{uri:n.uri,range:we(n)},delete:o.map(i=>({uri:i.uri,range:we(i)}))}}function Mp(e){if(e.config.models.convention!=="single-source")return[];let t=mi(e.config,ba);if(!t)return[];let n=[],o=Po(e.facts.filter(i=>!i.isBuiltin));for(let i of o.values()){if(i.length<=1)continue;let r=i[0];r&&n.push(pi({code:"BT122_DUPLICATE_MODEL_DEFINITION",message:`duplicate model definition for \`${r.id}\` (${r.kind})`,uri:r.uri,range:we(r),rule:ba,severity:t,data:{kind:"duplicate-model-definition",nodeId:r.id,modelKind:r.kind,definitions:i.map(s=>({uri:s.uri,sourceKind:s.sourceKind,range:s.range,canonical:s.isCanonicalModelFile,editable:s.editable})),fix:Np(i)}}))}return n}function va(e){if(e.config.linter.enabled===!1)return[];let t=$t(e.index);return[...Cp({config:e.config,facts:t}),...Ep({config:e.config,index:e.index,facts:t}),...Mp({config:e.config,facts:t})]}import{findNodeAtLocation as Sa,parse as wp,parseTree as Pp}from"jsonc-parser";function Bp(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
20
|
-
`&&t.push(n+1);return n=>{let o=0,i=t.length-1;for(;o<=i;){let s=Math.floor((o+i)/2);t[s]<=n?o=s+1:i=s-1}let r=Math.max(0,o-1);return{line:r,character:n-t[r],offset:n}}}function xa(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function ka(e){let t=e.project,n=e.host??t.host,o=[],i=[],r=new Set;for(let s of t.definitionFiles){if(!await n.exists(s.uri)){o.push(T(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,l=await n.readFile(s.uri),d=[],c=Pp(l,d,{allowTrailingComma:!0,disallowComments:!1});try{if(a=wp(l,d,{allowTrailingComma:!0,disallowComments:!1}),d.length>0||!c)throw new Error(`JSON parse error at offset ${d[0]?.offset??0}`)}catch(m){let f=String(m.message||m);o.push(T(u.InvalidNodeDefinitionJson,h.Error,`invalid node definition JSON \`${s.path}\``,void 0,"",{primaryLabel:"the file could not be parsed as JSON",help:`fix the JSON syntax in \`${s.path}\``,notes:[f]}));continue}let p=uo.safeParse(a);if(!p.success){for(let m of p.error.issues){let f=m.code==="unrecognized_keys"?m.keys.map(y=>({label:`Unrecognized key: "${y}"`,path:[...m.path,y].join(".")})):[{label:m.message,path:m.path.join(".")}];for(let{label:y,path:g}of f)o.push(T(u.InvalidNodeDefinitionSchema,h.Error,`invalid node definition schema \`${s.path}\``,void 0,"",{primaryLabel:y,help:g?`fix the schema issue at \`${g}\``:"fix the schema issue in the file",notes:g?[g]:[]}))}continue}for(let[m,f]of Object.entries(p.data.nodes)){r.has(m)&&o.push(T(u.DuplicateNodeDefinitionId,h.Error,`duplicate node definition ID \`${m}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),r.add(m);let y=Bp(l),g=xa(Sa(c,["nodes",m]),y),S=Et(m,f),v=S.ports.map(x=>{let D=xa(Sa(c,["nodes",m,"ports",x.name]),y);return{...x,source:"node-definition-file",uri:s.path,range:D,nameRange:D}});i.push({...S,ports:v,source:"node-definition-file",sourceMeta:{sourceKind:"node-definition-file",file:s.path,range:g},editable:!0,uri:s.path,range:g,elementRange:g})}}return{ok:o.every(s=>s.severity!==h.Error),nodeModels:i,diagnostics:o}}function Ra(e,t){return $e(e,t).replace(/\\/g,"/")}function _p(e){return[...e.reachableDocuments.values()]}function fi(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function Da(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function Ap(e){let t=new Map;for(let n of e){let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}async function gi(e){let t=[],n=e.project,o=e.resolvedConfig,i=e.resolutionMode??ti(o),r=i==="entrypoints"||e.resolveGraph?await ga({project:e.project,documents:e.documents,resolvedConfig:o,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await ka({project:e.project,host:e.host});t.push(...l.diagnostics);let d=l.nodeModels,c=r&&(i==="entrypoints"||e.resolveGraph)?fi([...e.documents.filter(g=>e.activeDocumentUris.has(g.uri)&&r.reachableUris.has(g.uri)),...r.reachableDocuments.values(),...s]):fi([...e.documents.filter(g=>e.activeDocumentUris.has(g.uri)),...s]),p=jt(c,{config:o,models:d,augmentations:a}),m={includeIssuesByUri:Ap(r?.issues??[]),suppressionIssuesByUri:new Map};t.push(...p.diagnostics,...va({config:o,index:p.index}));let f=new Map(gt(p.index).map(g=>[g,Se(p.index,g)])),y={mode:i,files:new Map(c.map(g=>[Ra(n.rootUri,g.path||g.uri),g])),documentViews:new Map(c.map(g=>[g.uri,(()=>{let S=Q(o,Ra(n.rootUri,g.path||g.uri));return Fe(g,{semantic:p.index,config:S,policy:be(S)})})()])),includeGraph:r?.graph,reachableDocuments:r?.reachableDocuments??new Map,behaviorTreesById:new Map(gt(p.index).map(g=>[g,Se(p.index,g)])),reachableBehaviorTreesById:f,nodeModelsById:new Map(Ro(p.index).map(g=>[g.id,g])),nodeModelSources:new Map(Do(p.index).map(g=>[g,Lt(p.index,g).flatMap(S=>S.sourceMeta?[S.sourceMeta]:[])])),nodeDefinitionModels:[...d],entrypoints:n.entrypoints,workspace:p.index,facts:m};return{ok:t.every(g=>g.severity!==h.Error),index:y,diagnostics:t}}async function Ta(e){let t=e.project,n=e.resolvedConfig??t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=[...e.projectDiagnostics??[]],i=e.host??t.host,r=e.externalModelDocuments!==void 0?[...e.externalModelDocuments]:(await Promise.all(t.modelFiles.map(async y=>{let g=await ui(y,i);return o.push(...g.diagnostics),g.document?[g.document]:[]}))).flat(),s=e.augmentations!==void 0?[...e.augmentations]:void 0;if(!s){let y=await Mn({project:e.project,host:i});o.push(...y.diagnostics),s=[...y.augmentations]}let a=e.resolutionMode??ti(n),l=a==="entrypoints"?new Set(e.documents.filter(y=>y.kind==="bt-document").map(y=>y.uri)):new Set(e.documents.map(y=>y.uri)),d=await gi({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:r,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:i}),c=fi([...e.documents,..._p(d.index),...r]),p=n.linter.enabled!==!1,m=e.showSuppressed,f=[...d.index.nodeDefinitionModels];return{input:e,project:e.project,documents:e.documents,externalModelDocuments:r,augmentations:s,projectDiagnostics:o,indexResult:d,nodeDefinitionModels:f,fileDocuments:c,lintEnabled:p,showSuppressed:m,resolvedConfig:n,suppressionIssuesByUri:void 0}}var jp={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files","ros-package-resolver-missing":"include/require-ros-package-resolver","ros-package-not-found":"include/no-missing-ros-package"};function Ia(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Fp(e,t){let n=Ne(e.linter.rules[t]);return Ia(n?n.severity:W[t].defaultSeverity)}function Lp(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"ros-package-resolver-missing":return{packageName:e.packageName};case"ros-package-not-found":return{packageName:e.packageName,path:e.path};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}function Ca(e){let t=[];for(let n of e.issues){let o=jp[n.kind],i=Fp(e.config,o);if(!i)continue;let r=T(W[o].code,i,n.message,n.range,n.uri,void 0,Lp(n));t.push({...r,rule:o})}return t}function Ea(e,t){return $e(e,t).replace(/\\/g,"/")}function Op(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function Up(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let o=Ea(e,n);if(Op(o))return o}return Ea(e,t.uri)}function Na(e){let{project:t,indexResult:n,externalModelDocuments:o,fileDocuments:i,lintEnabled:r,resolvedConfig:s}=e,a=t,l=n.index.mode;return i.map(d=>{let c=Up(a.rootUri,d);if(l==="entrypoints"&&n.index.includeGraph&&d.kind==="bt-document"&&!n.index.reachableDocuments.has(d.uri))return{path:c,uri:d.uri,kind:d.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:d.originalText};let p=l==="single-file"?jt([d,...o],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,m=l==="single-file"?(()=>{let y=Q(s,c);return Fe(d,{semantic:p,config:y,policy:be(y)})})():n.index.documentViews.get(d.uri),f=[];if(r){let y=Q(s,c);f=Zo(d,p,{config:y,documentView:m});let g=n.index.facts.includeIssuesByUri.get(d.uri)??[];f.push(...Ca({issues:g,config:y}))}return e.input.mode==="check"&&d.kind==="generic-xml"?{path:c,uri:d.uri,kind:d.kind,documentView:m,diagnostics:[],rawDiagnostics:f,skipped:!0,skipReason:"generic-xml",originalText:d.originalText}:{path:c,uri:d.uri,kind:d.kind,documentView:m,diagnostics:f,rawDiagnostics:void 0,skipped:!1,originalText:d.originalText}})}function Ma(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...Ma(n.children));return t}function $p(e,t,n){let o=[],i=[];for(let r of e){let s=Ma(r.nodes);for(let a of s){let l=a.text.trim();if(!l.includes("btxml-disable"))continue;let d=l.match(/\b(BT\d+|BT\d+_[A-Z0-9_]+|CFG\d+_[A-Z0-9_]+|XML\d+_[A-Z0-9_]+)\b/)?.[1],c=l.match(/reason:\s*(.+)$/)?.[1];t&&!c&&i.push({kind:"missing-reason",uri:r.uri,code:d,range:a.range,message:"missing suppression reason"}),l.startsWith("btxml-disable-file")?o.push({uri:r.uri,code:d,file:!0,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable-next-line")?n&&o.push({uri:r.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable")&&n&&o.push({uri:r.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c})}}return{suppressions:o,issues:i}}function wa(e,t){let n=$p(t.documents??[],!!t.requireReason,t.allowInline!==!1),o=[],i=[];for(let r of e){let s=n.suppressions.find(a=>a.uri===r.uri&&(!a.code||a.code===r.code||r.code.startsWith(a.code))&&(a.file||a.line===r.range?.start.line||a.line===(r.range?.start.line??0)+1));if(s){s.used=!0,i.push(r);continue}o.push(r)}for(let r of n.suppressions)r.used||n.issues.push({kind:"unused",uri:r.uri,code:r.code,range:r.range,message:r.code?`unused suppression for \`${r.code}\``:"unused suppression"});if(t.showSuppressed){let r=i.map(s=>({...s,severity:h.Info,suppressed:!0}));return{diagnostics:[...o,...r],suppressedDiagnostics:i,issues:n.issues}}return{diagnostics:o,suppressedDiagnostics:i,issues:n.issues}}function yi(e,t,n,o=e.resolvedConfig){let i=Ke(o.linter.rules,"suppression/require-reason")!=="off";return wa(t,{documents:n??e.fileDocuments,requireReason:i,allowInline:o.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function wn(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Pa(e,t){if(!e.input.baseline)return{diagnostics:t,baselineDiagnostics:[],staleEntries:[]};let n=new Set,o=[],i=[];for(let r of t){let s=e.input.baseline.diagnostics.findIndex(a=>a.path===r.uri&&a.code===r.code&&a.messageHash===wn(r.message)&&a.range?.start?.line===r.range?.start?.line&&a.range?.start?.character===r.range?.start?.character);if(s>=0){n.add(s),i.push(r);continue}o.push(r)}return{diagnostics:o,baselineDiagnostics:i,staleEntries:e.input.baseline.diagnostics.filter((r,s)=>!n.has(s))}}var Ba={error:0,warning:1,info:2};function _a(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function Pn(e){return e.flat().sort((t,n)=>{let o=t.uri.localeCompare(n.uri);if(o!==0)return o;let i=t.range?.start.offset??-1,r=n.range?.start.offset??-1;if(i!==r)return i-r;let s=Ba[t.severity]-Ba[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function Aa(e,t,n){let o=t.filter(r=>!r.skipped),i=Pn([n,o.flatMap(r=>r.diagnostics)]);return{files:o.length,errors:i.filter(r=>r.severity===h.Error).length,warnings:i.filter(r=>r.severity===h.Warning).length,infos:i.filter(r=>r.severity===h.Info).length,suppressed:0,baselineFiltered:0,staleEntries:[]}}function qp(e,t){return e.map(({path:n,uri:o,kind:i,diagnostics:r,rawDiagnostics:s,skipped:a,skipReason:l})=>({path:n,uri:o,kind:i,diagnostics:r,rawDiagnostics:t?s:void 0,skipped:a,skipReason:l}))}function ja(e,t){let n=Pn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(o=>o.diagnostics)??[]]);return{ok:!_a(n,e.input.maxWarnings),files:e.files?qp(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var Vp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},Xp={unused:u.UnusedSuppression,"missing-reason":u.MissingSuppressionReason};function Gp(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function zp(e,t){return Gp(Ke(e.linter.rules,t))}function hi(e){let t=[];for(let n of e.issues){let o=Vp[n.kind],i=zp(e.config,o);if(!i)continue;let r=T(Xp[n.kind],i,n.message,n.range,n.uri,void 0,n.code?{code:n.code}:void 0);t.push({...r,rule:o})}return t}async function Wp(e){let t=await Ta(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=Na(t);let o=yi(t,n);n=[...o.diagnostics,...hi({issues:o.issues,config:t.resolvedConfig})];let i=o.suppressedDiagnostics.length;for(let l=0;l<t.files.length;l++){let d=t.files[l],c=t.fileDocuments[l];if(d.skipped)continue;let p=Q(t.resolvedConfig,d.path),m=yi(t,d.diagnostics,[c],p);d.diagnostics=[...m.diagnostics,...hi({issues:m.issues,config:p})],d.rawDiagnostics=[...d.diagnostics],i+=m.suppressedDiagnostics.length}let r=0,s=[];for(let l of t.files){if(l.skipped||l.diagnostics.length===0)continue;let d=Pa(t,l.diagnostics);l.diagnostics=d.diagnostics,r+=d.baselineDiagnostics.length,d.staleEntries.length>0&&(s=s.concat(d.staleEntries))}t.files=Da(t.files),t.finalProjectDiagnostics=n;let a=Aa(t,t.files,n);return a.suppressed=i,a.baselineFiltered=r,a.staleEntries=s,{...ja(t,a),files:t.files??[]}}async function St(e){let t=e.project,n=e.host??t.host,o=e.documents,i=e.externalModelDocuments,r=e.augmentations,s=[...e.projectDiagnostics??[]];if(!o||!i||!r){let a=await H(e.project,n);o??=a.documents,i??=a.externalModelDocuments,r??=a.augmentations,s=[...s,...a.diagnostics]}return Wp({...e,host:n,documents:o,externalModelDocuments:i,augmentations:r,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}import{z as G}from"zod";var Bn=G.object({version:G.literal(1),diagnostics:G.array(G.object({path:G.string(),code:G.string(),messageHash:G.string(),range:G.object({start:G.object({line:G.number(),character:G.number(),offset:G.number()}).strict(),end:G.object({line:G.number(),character:G.number(),offset:G.number()}).strict()}).strict().optional()}).strict())}).strict();function bi(e){return{path:e.uri,code:e.code,messageHash:wn(e.message),range:e.range}}function vi(e){return e.linter.baseline}function Fa(e){return[...e.files.values()]}function La(e){return[...e.reachableDocuments.values()]}function Oa(e){return e.workspace}function Ua(e){return[...e.nodeDefinitionModels]}function $a(e){if(!e.includeGraph)return;let t=new Map;for(let s of e.files.values())s.path&&t.set(s.path,s.uri);let n=[];for(let[s,a]of e.includeGraph.nodes.entries()){let l=a.document?.uri??t.get(s)??s;n.push({path:s,uri:l,exists:a.exists})}let o=e.includeGraph.edges.map(s=>({from:s.from,to:s.to,includeElementRange:s.includeElementRange,includePathRange:s.includePathRange})),i=[];for(let s of e.facts.includeIssuesByUri.values())for(let a of s)i.push({kind:a.kind,uri:a.uri,path:"path"in a?a.path:void 0,message:a.message,range:a.range});let r=[...n];return r.sort((s,a)=>s.path.localeCompare(a.path)),{nodes:r,edges:o,issues:i}}async function it(e){let t=e.project,n=t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=e.host??t.host,i=e.documents,r=e.externalModelDocuments,s=e.augmentations,a=[];if(!i||!r||!s){let d=await H(e.project,o);a.push(...d.diagnostics),i??=d.documents,r??=d.externalModelDocuments,s??=d.augmentations}let l=await gi({project:e.project,documents:i,activeDocumentUris:new Set(i.map(d=>d.uri)),externalModelDocuments:r,augmentations:s,resolveGraph:e.resolveGraph,resolvedConfig:n,host:o});return a.push(...l.diagnostics),{ok:l.ok,diagnostics:a,semanticIndex:Oa(l.index),documents:Fa(l.index),reachableDocuments:La(l.index),nodeDefinitionModels:Ua(l.index),includeGraph:$a(l.index)}}function Si(e){return e.map(t=>({...t,absolutePath:te(t.uri)}))}function de(e){return te(ni(e))}function xi(e){let t=oi(e);return t?te(t):void 0}function J(e){return Si(ri(e))}function Re(e){return Si(si(e))}function rt(e){return Si(ai(e))}import Ri from"fs";import Va from"path";import{createColors as Hp}from"picocolors";function _n(e){return e.noColor?{enabled:!1}:e.env?.NO_COLOR!==void 0?{enabled:!1}:e.stream&&!e.stream.isTTY?{enabled:!1}:{enabled:!0}}function ne(e,t,n){let o=Hp(e.enabled);switch(t){case"error":return o.red(n);case"warning":return o.yellow(n);case"info":return o.cyan(n);case"help":return o.green(n);case"note":return o.dim(n);case"dim":return o.dim(n)}}function ki(e){let t=_n({noColor:e.noColor,stream:e.stream,env:process.env}),n=[];if(n.push(`${ne(t,"error","error:")} ${e.message}`),e.help&&(n.push(""),n.push(`${ne(t,"help","help:")} ${e.help}`)),e.expected&&e.expected.length>0){n.push(""),n.push("expected one of:");for(let o of e.expected)n.push(` ${o}`)}return n.join(`
|
|
21
|
-
`)}var
|
|
22
|
-
note: ${String(e.message||e)}`),3)}function
|
|
23
|
-
`,"utf8"),t.quiet||console.log(`Baseline updated: ${o}`)}import
|
|
18
|
+
`);let c=a.join(d),p=d.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),m=new RegExp(`(?:${p})+$`,"u"),y=`${c.replace(m,"")}${d}`;return{ok:!0,text:y,changed:y!==e,skipped:!1,diagnostics:n.diagnostics.filter(g=>g.severity!==h.Error)}}function $o(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 Vo(e,t,n){let o=t.valueContentRange??t.valueRange,i=$o(t,n.start),r=$o(t,n.end),s=$(e.originalText,o.start.offset+i),a=$(e.originalText,o.start.offset+r);return C(s,a)}function rs(){return{includeIssuesByUri:new Map,suppressionIssuesByUri:new Map}}function ss(e,t){return e.includeIssuesByUri.get(t)??[]}function as(e,t){return e.suppressionIssuesByUri.get(t)??[]}function ls(e){let{document:t,semantic:n,config:o,view:i}=e,r=new Map(i.nodes.map(d=>[d.element,d])),s=new Map(i.subtreeCalls.map(d=>[d.node.element,d])),a=xe(o),l=Du(t.root);return{document:t,view:i,semantic:n,config:o,options:e.options,facts:e.facts,report(d){let c=R(d.code??e.code,e.severity,d.message,d.range,t.uri,d.details,d.data);e.diagnostics.push({...c,rule:e.rule,...d.relatedInformation?{relatedInformation:d.relatedInformation}:{}})},getIncludeIssues(d){let c=ss(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getSuppressionIssues(d){let c=as(e.facts,t.uri);return d?c.filter(p=>p.kind===d):c},getNodeUsage(d){return Fe(n,{element:d,documentRoot:t.root,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},getPortUsage(d,c){return Sn(n,{element:d,documentRoot:t.root,attributeName:c,uri:t.uri,config:o,policy:a,isModelDefinition:l.has(d)})},resolveSubTree(d,c){return $t(n,{id:d,fileLocalUri:c,config:o})},getNodeModel(d){return ke(n,d)},getBehaviorTrees(d){return ve(n,d)},getTreeNodeView(d){return r.get(d)},getSubTreeCallView(d){return s.get(d)}}}function Du(e){let t=new Set;if(!e)return t;if(e.name==="TreeNodesModel")return qo(e,t),t;for(let n of e.children)n.kind!=="element"||n.name!=="TreeNodesModel"||qo(n,t);return t}function qo(e,t){t.add(e);for(let n of e.children)n.kind==="element"&&qo(n,t)}function I(e){let t=H[e.name];return{...e,code:t.code,defaultSeverity:t.defaultSeverity,optionsSchema:t.optionsSchema,meta:e.meta??{description:t.description}}}var Ru={"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 Ue(e){return I({name:Ru[e],create(t){return{ProgramExit(){for(let n of t.getIncludeIssues(e))t.report({message:n.message,range:n.range,data:Cu(n)})}}}})}function Cu(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 ds=[Ue("missing-path"),Ue("not-found"),Ue("cycle"),Ue("outside-root"),Ue("unresolved-variable"),Ue("depth-exceeded"),Ue("too-many-files"),Ue("external-used")];import Iu from"ajv";var Eu=Iu,Mu=new Eu,Nu=["IDLE","RUNNING","SUCCESS","FAILURE","SKIPPED"],Pu={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}},Xo=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"]),cs=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 us(e){return e.children.filter(t=>t.kind==="element")}function he(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}function ps(e){return e.children.some(t=>t.kind==="element")}function Rn(e,t){let n=ms(t);n&&e.report({code:n.code,message:n.message,range:t.range,details:n.details})}function ms(e){let t=vt(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 Dn(e.diagnosticCode,e.value,e.portLabel);let n=e.port.validate??e.typeDefinition?.validate;if(n)return Fu(e.registry,n,e.value)?void 0:Dn(e.diagnosticCode,e.value,e.portLabel);let o=e.typeDefinition?.canonical??e.port.type;if(o&&!gs(o,e.value))return wu(o)?Dn(e.diagnosticCode,e.value,e.portLabel):{code:e.customLiteralDiagnosticCode,message:`literal value for custom type \`${o}\` requires a validator`,details:{primaryLabel:`literal value requires a validator for custom type \`${o}\``,help:`use a blackboard remap such as \`${e.portLabel}="{${e.port.name}}"\`, or define a validator in btxml.model-augment.json`}}}function Ye(e){return e.effectiveType??e.type}function fs(e,t){return ge(e,Ye(t))}function vt(e,t){let n=ne({portName:e,rawValue:t.trim()});return n.ok?n.reference:void 0}function Dn(e,t,n){return{code:e,message:`invalid value \`${t}\` for port \`${n}\``}}function wu(e){let t=Bt(e)??e;return ys(e)!==void 0||ju.has(t.toLowerCase())}function gs(e,t){let n=ys(e);if(n)return Bu(n,t);let o=(Bt(e)??e).toLowerCase();switch(o){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 Nu.includes(t);default:return Xo.has(o)||cs.has(o)?hs(o,t):!1}}function ys(e){return/^std::vector<\s*(.+?)\s*>$/.exec(e)?.[1]}function Bu(e,t){let n=Au(t);return n?n.every(o=>_u(e,o)):!1}function _u(e,t){if(t.kind==="string")return gs(e,t.value);let n=(Bt(e)??e).toLowerCase();switch(n){case"std::string":return typeof t.value=="string";case"bool":return typeof t.value=="boolean";case"float":case"double":return typeof t.value=="number"&&Number.isFinite(t.value);default:return Xo.has(n)||cs.has(n)?typeof t.value=="number"&&Number.isInteger(t.value)&&hs(n,String(t.value)):!1}}function hs(e,t){let n=Pu[e];if(!n)return!1;if(Xo.has(e)){if(!/^-?\d+$/.test(t))return!1}else if(!/^\d+$/.test(t))return!1;try{let o=BigInt(t);return o>=n.min&&o<=n.max}catch{return!1}}function Au(e){if(e.startsWith("json:"))try{let t=JSON.parse(e.slice(5));return Array.isArray(t)?t.map(n=>({kind:"json",value:n})):void 0}catch{return}return e.split(";").map(t=>({kind:"string",value:t}))}function Fu(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 o=n.split(t.separator);return o.length!==t.items.length?!1:o.every((i,r)=>{let s=t.items[r];return s?ms({port:{name:`tuple[${r}]`,type:s},value:i,registry:e,typeDefinition:ge(e,s),allowRemap:!1,diagnosticCode:"BT103_INVALID_PORT_VALUE_TYPE",customLiteralDiagnosticCode:"BT112_CUSTOM_LITERAL_REQUIRES_VALIDATOR",portLabel:`tuple[${r}]`})===void 0:!1})}case"json-schema":try{let o=JSON.parse(n);return Mu.compile(t.schema)(o)===!0}catch{return!1}}}var ju=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 bs=[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 o of t.ports)o.name&&(n.has(o.name)&&e.report({message:`Duplicate port name "${o.name}" in ${t.id}`,range:o.nameRange||o.range||t.idRange||t.range}),n.add(o.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 o=co(n.name);o&&e.report({code:u.InvalidPortName,message:`invalid port name \`${n.name}\`: ${o}`,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 Je(e.semantic))t.uri&&t.uri!==e.document.uri||Lu(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(!Uu(t))return;let n=t.attributes.find(l=>l.name==="default")??t.attributes.find(l=>l.name==="default_value");if(!n)return;let o=t.attributes.find(l=>l.name==="name")?.value;if(!o)return;let r=Ou(e.document.root,t)?.attributes.find(l=>l.name==="ID")?.value;if(!r)return;let a=e.getNodeModel(r)?.ports.find(l=>l.name===o);if(a){if(a.direction==="output"){vt(a.name,n.value)===void 0&&e.report({code:u.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}Rn(e,{port:a,value:n.value,range:n.range,registry:ye(e.semantic),typeDefinition:Se(e.semantic,a.type),allowRemap:!0,diagnosticCode:u.InvalidPortDefaultValue,customLiteralDiagnosticCode:u.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=ye(e.semantic),n=new Map,o=e.options.allowStringEntryCompatibility??!0;for(let i of e.view.nodes)for(let r of i.portBindings){if(r.declaredPort.status!=="resolved")continue;let s=vt(r.name,r.value);if(!s)continue;let a=fs(t,r.declaredPort.port);if(!a||a.kind==="any")continue;let l=Ne(s),d=n.get(l)??[];d.push({key:s.key,scope:s.scope,displayName:un(s),identity:l,nodeId:qu(i.element),port:r.declaredPort.port,typeDefinition:a,range:r.attribute.range}),n.set(l,d)}for(let i of n.values()){let r=$u(e.semantic,i,o);if(r.length<2)continue;let s=i.find(a=>a.typeDefinition.canonical===r[0]);e.report({code:u.BlackboardTypeMismatch,message:`blackboard entry \`${s?.displayName??i[0]?.displayName??i[0]?.key??""}\` is used with incompatible port types: ${r.map(a=>`\`${a}\``).join(", ")}`,range:s?.range,details:{primaryLabel:`blackboard entry \`${s?.displayName??i[0]?.displayName??i[0]?.key??""}\` mixes incompatible port types`,notes:i.filter(a=>r.includes(a.typeDefinition.canonical)).map(a=>`${a.nodeId}.${a.port.name} declares ${Vu(a.port,a.typeDefinition)}`),help:"use different blackboard keys, align the port types, or declare compatibility in btxml.model-augment.json"}})}}}}}),I({name:"model/require-output-port-remap",meta:{description:"Resolved output ports must be explicitly or default-remapped to a blackboard entry."},create(e){return{Element(t){if(Xu(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of n.ports){if(o.direction!=="output")continue;let i=n.portUsages.find(r=>r.name===o.name&&r.status==="resolved");if(i){if(vt(o.name,i.value)!==void 0)continue;e.report({code:u.OutputPortRequiresRemap,message:`output port \`${o.name}\` must be remapped to a blackboard entry`,range:i.attribute.range,details:{primaryLabel:`output port \`${o.name}\` requires a blackboard remap`,help:`use \`${o.name}="{${o.name}}"\` or \`${o.name}="{some_key}"\``}});continue}o.defaultValue!==void 0&&vt(o.name,o.defaultValue)!==void 0||e.report({code:u.OutputPortRequiresRemap,message:`output port \`${o.name}\` must be remapped to a blackboard entry`,range:t.range,details:{primaryLabel:`output port \`${o.name}\` requires a blackboard remap`,help:`use \`${o.name}="{${o.name}}"\` or \`${o.name}="{some_key}"\``}})}}}}})];function Lu(e,t){return e.diagnostics.some(n=>n.code===u.DuplicateNodeModelId&&n.message.includes(`\`${t}\``))}function Uu(e){return e.name==="input_port"||e.name==="output_port"||e.name==="inout_port"}function Ou(e,t){if(!e)return;return n(e,!1,void 0);function n(o,i,r){let s=i||o.name==="TreeNodesModel",a=s&&(o.name==="Action"||o.name==="Condition"||o.name==="Control"||o.name==="Decorator"||o.name==="SubTree")?o:r;if(o===t)return a;for(let l of o.children){if(l.kind!=="element")continue;let d=n(l,s,a);if(d)return d}}}function $u(e,t,n){let o=new Set;for(let i=0;i<t.length;i+=1){let r=t[i];if(r)for(let s=i+1;s<t.length;s+=1){let a=t[s];a&&(n&&(r.typeDefinition.canonical==="std::string"||a.typeDefinition.canonical==="std::string")||ht(e,r.typeDefinition.canonical,a.typeDefinition.canonical)||(o.add(r.typeDefinition.canonical),o.add(a.typeDefinition.canonical)))}}return[...o].sort()}function Vu(e,t){return Ye(e)??t.canonical}function qu(e){return e.attributes.find(t=>t.name==="name")?.value??e.attributes.find(t=>t.name==="ID")?.value??e.name}function Xu(e){return e.name==="root"||e.name==="BehaviorTree"||e.name==="TreeNodesModel"}var Gu=new Set(["_failureIf","_successIf","_skipIf","_while"]),zu=new Set(["_onSuccess","_onFailure","_onHalted","_post"]);function Go(e){if(Gu.has(e.attributeName))return{kind:"precondition",expectedResult:"bool-compatible"};if(zu.has(e.attributeName))return{kind:"postcondition",expectedResult:"ignored"};let t=e.resolvedNodeType??e.elementName;if(e.attributeName==="code"&&t==="Script")return{kind:"script-node-code",expectedResult:"ignored"};if(e.attributeName==="code"&&t==="ScriptCondition")return{kind:"script-condition-code",expectedResult:"bool-compatible"};if(e.attributeName==="if"&&t==="Precondition")return{kind:"precondition-node-if",expectedResult:"bool-compatible"}}function zo(e){if(!e.startsWith("@"))return{kind:"local",name:e};let t=cn({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 xs=new Map([["..","DotDot"],["&&","AmpAmp"],["||","PipePipe"],["==","EqualEqual"],["!=","BangEqual"],["<=","LessEqual"],[">=","GreaterEqual"],[":=","ColonEqual"],["+=","PlusEqual"],["-=","MinusEqual"],["*=","StarEqual"],["/=","SlashEqual"]]),Ss=new Map([["+","Plus"],["-","Minus"],["*","Star"],["/","Slash"],["&","Ampersand"],["|","Pipe"],["^","Caret"],["~","Tilde"],["!","Bang"],["<","Less"],[">","Greater"],["=","Equal"],["?","Question"],[":","Colon"],["(","LeftParen"],[")","RightParen"],[";","Semicolon"]]);function vs(e){let t=[],n=0;for(;n<e.length;){let o=e[n];if(ks(o)){n++;continue}if(Ko(o)){let a=n;for(n++;n<e.length&&Hu(e[n]);)n++;let l=e.slice(a,n);t.push({type:l==="true"||l==="false"?"Boolean":"Identifier",text:l,start:a,end:n});continue}if(Ze(o)){let a=Wu(e,n);t.push(a),n=a.end;continue}if(o==="'"){let a=Ku(e,n);t.push(a),n=a.end;continue}let i=e.slice(n,n+2),r=xs.get(i);if(r){t.push({type:r,text:i,start:n,end:n+2}),n+=2;continue}let s=Ss.get(o);if(s){t.push({type:s,text:o,start:n,end:n+1}),n+=1;continue}t.push({type:"Error",text:o,start:n,end:n+1}),n+=1}return t.push({type:"EndOfInput",text:"",start:e.length,end:e.length}),t}function Ku(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 Wu(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&&Ju(e[n]);)n++;return i===n||Zu(e,n)?(n=zt(e,n),Kt(e,t,n)):{type:"Integer",text:e.slice(t,n),start:t,end:n}}for(;n<e.length&&Ze(e[n]);)n++;let o="Integer";if(e[n]==="."){if(e[n+1]===".")return{type:o,text:e.slice(t,n),start:t,end:n};if(!Ze(e[n+1]))return n=zt(e,n+1),Kt(e,t,n);for(o="Real",n+=1;n<e.length&&Ze(e[n]);)n++}if(e[n]==="e"||e[n]==="E"){let i=n;n+=1,(e[n]==="+"||e[n]==="-")&&(n+=1);let r=n;for(;n<e.length&&Ze(e[n]);)n++;if(r===n)return n=zt(e,Math.max(n,i+1)),Kt(e,t,n);o="Real"}return Yu(e,n)?(n=zt(e,n),Kt(e,t,n)):{type:o,text:e.slice(t,n),start:t,end:n}}function zt(e,t){let n=t;for(;n<e.length;){let o=e[n];if(ks(o)||Ss.has(o)||xs.has(e.slice(n,n+2))||o==="."&&e[n+1]===".")break;n++}return n}function Kt(e,t,n){return{type:"Error",text:e.slice(t,n),start:t,end:n}}function ks(e){return e===" "||e===" "||e===`
|
|
19
|
+
`||e==="\r"}function Ko(e){return e!==void 0&&/[A-Za-z_@]/.test(e)}function Hu(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}function Ze(e){return e!==void 0&&/[0-9]/.test(e)}function Ju(e){return e!==void 0&&/[0-9A-Fa-f]/.test(e)}function Yu(e,t){let n=e[t];return Ko(n)||Ze(n)}function Zu(e,t){let n=e[t];return n==="."||Ko(n)||Ze(n)}var Qu=new Map([["ColonEqual",":="],["Equal","="],["PlusEqual","+="],["MinusEqual","-="],["StarEqual","*="],["SlashEqual","/="]]),ep=new Map([["PipePipe","||"],["AmpAmp","&&"],["Pipe","|"],["Caret","^"],["Ampersand","&"],["Plus","+"],["Minus","-"],["DotDot",".."],["Star","*"],["Slash","/"]]),Ts=new Map([["EqualEqual","=="],["BangEqual","!="],["Less","<"],["Greater",">"],["LessEqual","<="],["GreaterEqual",">="]]),le={assignment:2,ternary:4,pipePipe:6,ampAmp:8,comparison:10,pipeCaret:12,ampersand:14,additive:16,multiplicative:18};function Ht(e){let t=vs(e),n=t.filter(o=>o.type==="Error");return n.length>0?{ok:!1,errors:n.map(o=>({kind:"invalid-token",message:`invalid token \`${o.text}\``,range:{start:o.start,end:o.end}})),tokens:t}:Ds(t,e)}function Ds(e,t=""){let n=new Wo(e,t),o=[];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 r=n.parseExpression(0);if(!r)return{ok:!1,errors:n.errors,tokens:e};for(o.push(r);n.match("Semicolon"););}if(n.errors.length>0)return{ok:!1,errors:n.errors,tokens:e};let i=rp(o);return{ok:!0,program:{kind:"Program",statements:o,range:i},tokens:e}}var Wo=class{constructor(t,n,o=0){this.tokens=t;this.source=n;this.index=o}tokens;source;index;errors=[];parseExpression(t){let n=this.parsePrefix();if(n){for(;;){let o=this.peek();if(o.type==="EndOfInput"||o.type==="Semicolon"||o.type==="RightParen"||o.type==="Colon")break;let i=Qu.get(o.type);if(i){if(t>=le.assignment)break;this.consume();let l=this.parseExpression(0);if(!l)return;n={kind:"AssignmentExpression",operator:i,left:n,right:l,range:Wt(n.range,l.range)};break}if(o.type==="Question"){if(t>=le.ternary)break;this.consume();let l=this.parseExpression(0);if(!l)return;if(!this.match("Colon")){this.reportError("expected-ternary-colon","expected ':' in ternary expression",this.peek());return}let d=this.parseExpression(le.ternary);if(!d)return;n={kind:"ConditionalExpression",condition:n,thenExpression:l,elseExpression:d,range:Wt(n.range,d.range)};break}let r=Ts.get(o.type);if(r){if(t>=le.comparison)break;this.consume();let l=[n],d=[r],c=this.parseExpression(le.comparison);if(!c)return;for(l.push(c);;){let p=Ts.get(this.peek().type);if(!p)break;this.consume();let m=this.parseExpression(le.comparison);if(!m)return;d.push(p),l.push(m)}n={kind:"ComparisonChain",operands:l,operators:d,range:Wt(l[0].range,l[l.length-1].range)};continue}let s=ep.get(o.type),a=s?op(o.type):void 0;if(s&&a!==void 0){if(t>=a)break;this.consume();let l=this.parseExpression(a);if(!l)return;n={kind:"BinaryExpression",operator:s,left:n,right:l,range:Wt(n.range,l.range)};continue}this.reportError("unexpected-token-after-expression",`unexpected token after expression: \`${o.text||o.type}\``,o);return}return n}}parsePrefix(){let t=this.peek();switch(t.type){case"Identifier":return this.consume(),{kind:"Identifier",name:t.text,range:Qe(t)};case"Integer":case"Real":case"Boolean":case"String":return this.consume(),tp(t,this.source);case"Minus":case"Tilde":case"Bang":{this.consume();let n=this.parseExpression(20);return n?{kind:"UnaryExpression",operator:np(t.type),argument:n,range:Wt(Qe(t),n.range)}:void 0}case"LeftParen":{let n=this.consume(),o=this.parseExpression(0);if(!o)return;let i=this.peek();if(i.type!=="RightParen"){this.reportError("expected-right-paren","expected ')'",i);return}return this.consume(),ip(o,{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,o){this.errors.push({kind:t,message:n,range:Qe(o)})}};function tp(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:Qe(e)};case"Real":return{kind:"Literal",valueKind:"real",raw:t.slice(e.start,e.end),value:Number(e.text),range:Qe(e)};case"Boolean":return{kind:"Literal",valueKind:"boolean",raw:t.slice(e.start,e.end),value:e.text==="true",range:Qe(e)};case"String":return{kind:"Literal",valueKind:"string",raw:t.slice(e.start,e.end),value:e.text,range:Qe(e)};default:throw new Error(`unsupported literal token ${e.type}`)}}function np(e){switch(e){case"Minus":return"-";case"Tilde":return"~";case"Bang":return"!";default:throw new Error(`unsupported unary token ${e}`)}}function op(e){switch(e){case"PipePipe":return le.pipePipe;case"AmpAmp":return le.ampAmp;case"Pipe":case"Caret":return le.pipeCaret;case"Ampersand":return le.ampersand;case"Plus":case"Minus":case"DotDot":return le.additive;case"Star":case"Slash":return le.multiplicative;default:return}}function Qe(e){return{start:e.start,end:e.end}}function Wt(e,t){return{start:e.start,end:t.end}}function ip(e,t){return{...e,range:t}}function rp(e){return{start:e[0]?.range.start??0,end:e[e.length-1]?.range.end??0}}var sp=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 Ho(e={}){let t=mt(e.augmentations??[]),n=e.areTypesCompatible??((s,a)=>_t(t,s,a)),o=new Map,i=new Map,r={symbols:new Map,globalBlackboard:new Map,enums:ap(e.enums,e.augmentations??[])};for(let s of e.symbols??[])Rs(r.symbols,o,s,n);for(let s of e.globalBlackboardSymbols??[])Rs(r.globalBlackboard,i,s,n);return r}function et(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 Jo(e){let t=et(e.baseEnvironment),n=[];for(let o of e.entries){let i=et(t),r=o.parseResult??Ht(o.source),s=et(i),a;r.ok&&(a=Yt({program:r.program,environment:i,attributeName:o.attributeName,originId:o.originId??String(o.id)}),s=et(a.environment)),n.push({id:o.id,parseResult:r,environmentBefore:i,environmentAfter:s,...a?{analysis:a}:{}}),t.symbols.clear(),t.globalBlackboard.clear(),t.enums.clear();for(let[l,d]of s.symbols)t.symbols.set(l,{...d});for(let[l,d]of s.globalBlackboard)t.globalBlackboard.set(l,{...d});for(let[l,d]of s.enums)t.enums.set(l,d)}return n}function Cs(e){let t=new Map;for(let n of e)for(let[o,i]of Object.entries(n.script?.enums??{}))t.set(o,i);return t}function Jt(e,t){let n=ge(e,t);return Is(t,n)}function Is(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"}:sp.has(n)?{kind:"number"}:{kind:"custom",name:t.name??e,canonical:t.canonical}}function Es(e,t){return e.kind==="any"||t.kind==="any"||e.kind==="unknown"||t.kind==="unknown"||e.kind==="error"||t.kind==="error"?!0:e.kind==="custom"&&t.kind==="custom"?e.canonical===t.canonical:e.kind===t.kind}function kt(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 tt(e){return e.kind==="bool"||e.kind==="number"||e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Yo(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 ap(e,t){if(e instanceof Map)return new Map(e);let n=Cs(t??[]);for(let[o,i]of Object.entries(e??{}))n.set(o,i);return n}function Rs(e,t,n,o){let i=e.get(n.name);if(!i){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 r=t.get(n.name),s=i.conflict===!0||r!==void 0&&n.compatibilityKey!==void 0&&!o(r,n.compatibilityKey)||!Es(i.type,n.type);e.set(n.name,{...i,readable:i.readable||n.readable,writable:i.writable||n.writable,conflict:s}),r===void 0&&t.set(n.name,n.compatibilityKey)}var nt={kind:"number"},In={kind:"string"},Cn={kind:"bool"},de={kind:"unknown"},O={kind:"error"};function Yt(e){let t=et(e.environment),n=[],o=[],i=[],r=[],s=[],a=[],l=[],d=[];return e.program.statements.forEach((c,p)=>{d.push(De({expression:c,statementIndex:p,environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:i,globalBlackboardAccesses:r,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,attributeName:e.attributeName??"code",originId:e.originId}))}),{environment:t,identifiers:n,resolvedIdentifiers:o,unknownIdentifiers:i,globalBlackboardAccesses:r,invalidGlobalBlackboardIdentifiers:s,introducedSymbols:a,diagnostics:l,statementTypes:d,finalType:d.at(-1)}}function De(e){let{expression:t}=e;switch(t.kind){case"Literal":return t.valueKind==="integer"||t.valueKind==="real"?nt:t.valueKind==="string"?In:t.valueKind==="boolean"?Cn:de;case"Identifier":return dp(e,t.name,t.range);case"UnaryExpression":{let n=De({...e,expression:t.argument});return t.operator==="!"?tt(n)?Cn:(oe(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a bool-compatible operand`,`operand for \`${t.operator}\` is not bool-compatible`,"use a boolean, number, or unknown-compatible expression here"),O):n.kind==="number"?nt:n.kind==="unknown"||n.kind==="any"||n.kind==="error"?n.kind==="any"?n:n.kind==="error"?O:de:(oe(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires a numeric operand`,`operand for \`${t.operator}\` is not numeric`,"use a number expression here"),O)}case"BinaryExpression":{let n=De({...e,expression:t.left}),o=De({...e,expression:t.right});switch(t.operator){case"&&":case"||":return Ns(n)||Ns(o)?(oe(e,"invalid-operand-type",t.range,`operator \`${t.operator}\` requires bool-compatible operands`,`operands for \`${t.operator}\` are not bool-compatible`,"use boolean or numeric expressions here"),O):Cn;case"+":return n.kind==="string"&&o.kind==="string"?In:n.kind==="number"&&o.kind==="number"?nt:Zo(n,o)?de:(Qo(e,t.range,t.operator),O);case"-":case"*":case"/":case"&":case"|":case"^":return n.kind==="number"&&o.kind==="number"?nt:Zo(n,o)?de:(Qo(e,t.range,t.operator),O);case"..":return n.kind==="string"&&(o.kind==="string"||o.kind==="number")||o.kind==="string"&&(n.kind==="string"||n.kind==="number")?In:Zo(n,o)?de:(Qo(e,t.range,t.operator),O)}return de}case"ComparisonChain":{let n=t.operands.map(o=>De({...e,expression:o}));for(let o=0;o<t.operators.length;o+=1){let i=t.operators[o],r=n[o],s=n[o+1];if(!cp(i,r,s))return oe(e,"invalid-operand-type",{start:t.operands[o]?.range.start??t.range.start,end:t.operands[o+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"),O}return Cn}case"ConditionalExpression":{let n=De({...e,expression:t.condition});tt(n)||oe(e,"invalid-operand-type",t.condition.range,"ternary condition must be bool-compatible","ternary condition is not bool-compatible","use a boolean or numeric condition expression here");let o=De({...e,expression:t.thenExpression}),i=De({...e,expression:t.elseExpression}),r=Yo(o,i);return r||(oe(e,"invalid-operand-type",t.range,"ternary branches must produce compatible types","then and else branches have incompatible types","return the same type from both ternary branches"),O)}case"AssignmentExpression":return lp(e)}}function lp(e){let{environment:t,attributeName:n,identifiers:o,introducedSymbols:i}=e,r=e.expression,s=De({...e,expression:r.right});if(r.left.kind!=="Identifier")return De({...e,expression:r.left}),oe(e,"invalid-operand-type",r.left.range,"assignment target must be an identifier","this assignment target is not writable","assign to a variable name instead of an expression"),O;let a=r.left,l=r.operator===":="?"declare":r.operator==="="?"write":"readwrite",d={name:a.name,kind:l,range:a.range,identifier:a,statementIndex:e.statementIndex};o.push(d);let c=zo(a.name);if(c.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(d),Ps(e,a.range,c.raw,c.message),O;if(c.kind==="global-blackboard"){let f=t.globalBlackboard.get(c.key),y=r.operator===":="?s:r.operator==="="?f&&kt(f.type,s)?s:f?void 0:s:Ms(f?.type??de,s,r.operator);if(r.operator!==":="&&r.operator!=="="&&!y)return oe(e,"invalid-compound-assignment",r.range,`operator \`${r.operator}\` is not valid for these operand types`,`compound assignment \`${r.operator}\` is not allowed here`,r.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),O;if((r.operator===":="||r.operator==="=")&&f&&!kt(f.type,s))return ei(e,a,f.type,s),O;let g=f?{...f}:{name:c.key,type:s,source:{kind:"global-blackboard",key:c.key,range:a.range,originId:e.originId},readable:!0,writable:!0};return g.type=y??s,t.globalBlackboard.set(c.key,g),e.resolvedIdentifiers.push({access:d,resolution:{kind:"global-blackboard",key:c.key,symbol:g}}),e.globalBlackboardAccesses.push({key:c.key,rawName:a.name,kind:l,range:a.range,inferredType:g.type}),g.type}let p=t.symbols.get(a.name);if(r.operator===":="&&!p){let f={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,f),e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:f}}),i.push(f),s}if(!p)return e.resolvedIdentifiers.push({access:d,resolution:{kind:"unknown"}}),oe(e,"assignment-to-unknown-variable",a.range,`assignment target \`${a.name}\` is not defined`,`\`${a.name}\` must already exist before this assignment`,"introduce the variable earlier with `:=` or add a matching blackboard remap"),O;if(e.resolvedIdentifiers.push({access:d,resolution:{kind:"symbol",symbol:p}}),r.operator==="=")return kt(p.type,s)?(ti(p,s),s):(ei(e,a,p.type,s),O);if(r.operator===":=")return kt(p.type,s)?(ti(p,s),s):(ei(e,a,p.type,s),O);let m=Ms(p.type,s,r.operator);return m?(ti(p,m),m):(oe(e,"invalid-compound-assignment",r.range,`operator \`${r.operator}\` is not valid for these operand types`,`compound assignment \`${r.operator}\` is not allowed here`,r.operator==="+="?"use number += number or string += string":"use numeric operands for this compound assignment"),O)}function dp(e,t,n){let o={name:t,kind:"read",range:n,identifier:e.expression,statementIndex:e.statementIndex};e.identifiers.push(o);let i=zo(t);if(i.kind==="invalid-global-blackboard")return e.invalidGlobalBlackboardIdentifiers.push(o),Ps(e,n,i.raw,i.message),O;if(i.kind==="global-blackboard"){let a=e.environment.globalBlackboard.get(i.key);return e.globalBlackboardAccesses.push({key:i.key,rawName:t,kind:"read",range:n,inferredType:a?.type??de}),e.resolvedIdentifiers.push({access:o,resolution:{kind:"global-blackboard",key:i.key,...a?{symbol:a}:{}}}),a?.type??de}let r=e.environment.enums.get(t);if(r!==void 0)return e.resolvedIdentifiers.push({access:o,resolution:{kind:"enum",name:t,value:r}}),nt;let s=e.environment.symbols.get(t);return s?(e.resolvedIdentifiers.push({access:o,resolution:{kind:"symbol",symbol:s}}),s.type):(e.resolvedIdentifiers.push({access:o,resolution:{kind:"unknown"}}),e.unknownIdentifiers.push(o),de)}function Ms(e,t,n){return e.kind==="error"||t.kind==="error"?O:e.kind==="unknown"||t.kind==="unknown"||e.kind==="any"||t.kind==="any"?de:n==="+="?e.kind==="number"&&t.kind==="number"?nt:e.kind==="string"&&t.kind==="string"?In:void 0:e.kind==="number"&&t.kind==="number"?nt:void 0}function Zo(e,t){return En(e)||En(t)}function En(e){return e.kind==="unknown"||e.kind==="any"||e.kind==="error"}function Ns(e){return!tt(e)}function cp(e,t,n){return En(t)||En(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 Qo(e,t,n){oe(e,"invalid-operand-type",t,`operator \`${n}\` cannot be applied to these operand types`,`operands for \`${n}\` are not compatible`,"use operands with the types required by this operator")}function ei(e,t,n,o){oe(e,"variable-type-mismatch",t.range,`cannot assign ${ni(o)} to variable \`${t.name}\` of type ${ni(n)}`,`\`${t.name}\` expects ${ni(n)} here`,"assign a compatible value or change the variable's source type")}function Ps(e,t,n,o){oe(e,"invalid-global-blackboard-identifier",t,o,`\`${n}\` is not a valid global blackboard identifier`,"use `@name` with a valid blackboard key that starts with a letter or underscore")}function ti(e,t){e.source.kind==="script-assignment"&&(e.type.kind!=="unknown"&&e.type.kind!=="error"||t.kind==="unknown"||t.kind==="any"||t.kind==="error"||(e.type=t))}function oe(e,t,n,o,i,r){e.diagnostics.push({code:t,range:n,message:o,details:{primaryLabel:i,help:r}})}function ni(e){return e.kind==="custom"?e.name:e.kind}var ws=new WeakMap;function Mn(e,t){let n=e.getNodeUsage(t),o=n.model.status==="resolved"?n.model.model.id:n.nodeType;return t.attributes.flatMap(i=>{let r=Go({elementName:t.name,attributeName:i.name,resolvedNodeType:o});return r?[{attribute:i,info:r,parseResult:Ht(i.value)}]:[]})}function be(e,t,n){return Vo(e.document,t,n)}function Bs(e){return{start:0,end:e.value.length}}function Oe(e,t){let n=e.getTreeNodeView(t),o=n?.behaviorTree;return!n||!o?Mn(e,t).map(i=>{let r=_s(e,[]);return{...i,environment:r,analysis:i.parseResult.ok?Yt({program:i.parseResult.program,environment:r,attributeName:i.attribute.name}):void 0}}):up(e,o).filter(i=>i.node.element===t).map(i=>({...i.candidate,environment:i.environmentBefore,analysis:i.analysis}))}function up(e,t){let n=ws.get(e.view);n||(n=new WeakMap,ws.set(e.view,n));let o=n.get(t);if(o)return o;let i=t.nodes.flatMap(s=>Mn(e,s.element).map((a,l)=>({id:`${s.path.join(".")}:${a.attribute.name}:${l}`,node:s,candidate:a}))),r=Jo({baseEnvironment:_s(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 l=i[a];return l?[{...s,node:l.node,candidate:l.candidate}]:[]});return n.set(t,r),r}function _s(e,t){let n=ye(e.semantic),o=[],i=[],r=t[0]?.behaviorTree.id;if(r){let s=e.getNodeModel(r);if(s?.kind==="SubTree")for(let a of s.ports){let l=Ye(a),c=Se(e.semantic,l)?.canonical??l;o.push({name:a.name,type:Jt(n,l),source:{kind:"subtree-port",nodeType:r,portName:a.name,direction:a.direction},readable:!0,writable:a.direction==="output"||a.direction==="inout",compatibilityKey:c})}}for(let s of t)for(let a of s.portBindings){if(a.usage.status!=="resolved")continue;let l=ne({portName:a.usage.port.name,rawValue:a.usage.value});if(!l.ok||l.reference.scope==="global")continue;let d=Ye(a.usage.port),p=Se(e.semantic,d)?.canonical??d,m=a.usage.port.direction,f=s.usage.model.status==="resolved"?s.usage.model.model.id:s.usage.nodeType;o.push({name:l.reference.key,type:Jt(n,d),source:{kind:"port-remap",nodeType:f,portName:a.usage.port.name,direction:m},readable:m==="input"||m==="output"||m==="inout",writable:m==="output"||m==="inout",compatibilityKey:p})}return i.push(...pp(e,n)),Ho({symbols:o,globalBlackboardSymbols:i,augmentations:wo(e.semantic),areTypesCompatible:(s,a)=>s&&a?ht(e.semantic,s,a):!0})}function pp(e,t){let n=[];for(let o of e.view.nodes){let i=o.usage.model.status==="resolved"?o.usage.model.model.id:o.usage.nodeType;for(let r of o.portBindings){if(r.usage.status!=="resolved")continue;let s=ne({portName:r.usage.port.name,rawValue:r.usage.value});if(!s.ok||s.reference.scope!=="global")continue;let a=Ye(r.usage.port),d=Se(e.semantic,a)?.canonical??a,c=r.usage.port.direction;n.push({name:s.reference.key,type:Jt(t,a),source:{kind:"global-blackboard-remap",nodeType:i,portName:r.usage.port.name,direction:c,key:s.reference.key},readable:c==="input"||c==="output"||c==="inout",writable:c==="output"||c==="inout",compatibilityKey:d})}}return n}var As=I({name:"script/no-unknown-variable",create(e){return{Element(t){for(let n of Oe(e,t))if(n.analysis)for(let o of n.analysis.unknownIdentifiers)e.report({code:u.UnknownScriptVariable,message:`unknown script variable \`${o.name}\``,range:be(e,n.attribute,o.range),details:{primaryLabel:`\`${o.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 Fs=I({name:"script/valid-assignment",create(e){return{Element(t){for(let n of Oe(e,t))if(n.analysis)for(let o of n.analysis.diagnostics){let i=o.code==="assignment-to-unknown-variable"?u.AssignmentToUnknownVariable:o.code==="invalid-compound-assignment"?u.InvalidCompoundAssignment:o.code==="variable-type-mismatch"?u.ScriptVariableTypeMismatch:o.code==="invalid-global-blackboard-identifier"?u.InvalidGlobalBlackboardIdentifier:void 0;i&&e.report({code:i,message:o.message,range:be(e,n.attribute,o.range),details:o.details})}}}}});var js=I({name:"script/valid-expression-type",create(e){return{Element(t){for(let n of Oe(e,t))if(n.analysis)for(let o of n.analysis.diagnostics)o.code==="invalid-operand-type"&&e.report({code:u.InvalidScriptOperandType,message:o.message,range:be(e,n.attribute,o.range),details:o.details})}}}});var Ls=I({name:"script/valid-result-type",create(e){return{Element(t){for(let n of Oe(e,t)){if(n.info.expectedResult!=="bool-compatible"||!n.parseResult.ok||!n.analysis)continue;let o=n.parseResult.program.statements.at(-1),i=n.analysis.finalType;!o||!i||tt(i)||e.report({code:u.ScriptResultNotBoolCompatible,message:`script result for \`${n.attribute.name}\` is not bool-compatible`,range:be(e,n.attribute,o.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 Us=I({name:"script/valid-syntax",create(e){return{Element(t){for(let n of Mn(e,t))if(!n.parseResult.ok)for(let o of n.parseResult.errors){let i=o.kind==="empty-script"?u.EmptyScript:o.kind==="invalid-token"?u.InvalidScriptToken:u.InvalidScriptSyntax;e.report({code:i,message:o.message,range:o.kind==="empty-script"?n.attribute.valueContentRange??n.attribute.valueRange??be(e,n.attribute,Bs(n.attribute)):be(e,n.attribute,o.range),details:{primaryLabel:`invalid script in \`${n.attribute.name}\``}})}}}}});var Os=[Us,As,Fs,js,Ls];var mp={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"};function $s(e){return I({name:mp[e],create(t){return{ProgramExit(){for(let n of t.getSuppressionIssues(e))t.report({message:n.message,range:n.range,data:fp(n)})}}}})}function fp(e){return e.code?{code:e.code}:void 0}var Vs=[$s("unused"),$s("missing-reason")];function Nn(e,t){return e.attributes.find(n=>n.name===t)}function qs(e,t){if(!e)return!1;let n=(o,i)=>{let r=i||o.name==="TreeNodesModel";if(o===t)return r;for(let s of o.children)if(s.kind==="element"&&n(s,r))return!0;return!1};return n(e,!1)}var Xs=[I({name:"tree/require-id",create(e){return{Element(t){t.name!=="BehaviorTree"||Nn(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=Ot(e.semantic,e.document.uri);for(let o of n?.behaviorTrees??[])o.idRange&&(t.has(o.id)&&e.report({message:`Duplicate BehaviorTree ID: ${o.id}`,range:o.idRange}),t.add(o.id))}}}}),I({name:"tree/no-duplicate-id",create(e){return{ProgramExit(){if(e.config.resolver.behaviorTreeIds!=="allow-ambiguous")for(let t of bt(e.semantic)){let n=ve(e.semantic,t);if(n.length<=1||new Set(n.map(r=>r.uri)).size<=1)continue;let i=n.filter(r=>r.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=Nn(t,"main_tree_to_execute");!n?.value||Co(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"||qs(e.document.root,t))return;let n=e.getSubTreeCallView(t),o=n?.node.element.attributes.find(r=>r.name==="ID")??Nn(t,"ID");!o||n?.target.status==="resolved"||e.resolveSubTree(o.value,e.document.uri).status!=="unresolved"||e.report({message:`unknown subtree \`${o.value}\``,range:o.valueContentRange||o.valueRange})}}}}),I({name:"tree/no-ambiguous-subtree",create(e){return{Element(t){if(t.name!=="SubTree"||qs(e.document.root,t))return;let n=Nn(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 gp=new Map([["IfThenElse",{min:2,max:3}],["WhileDoElse",{min:2,max:3}]]);function yp(e,t){return e===t?String(e):`${e}\u2013${t}`}var Gs=I({name:"model/valid-child-count",create(e){return{Element(t){if(he(t))return;let n=e.getNodeUsage(t);n.model.status==="resolved"&&hp(e,t,n.model.model.id,n.model.model.kind)}}}});function hp(e,t,n,o){let i=us(t).length,r=gp.get(n);if(r){if(i<r.min||i>r.max){let s=yp(r.min,r.max);e.report({message:`\`${n}\` requires ${s} child node(s), but has ${i}.`,range:t.range})}return}if(o==="Action"||o==="Condition"){i>0&&e.report({message:`${o} node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range});return}if(o==="Decorator"){i!==1&&e.report({message:`Decorator node \`${n}\` must have exactly 1 child node, but has ${i}.`,range:t.range});return}if(o==="Control"){i<1&&e.report({message:`Control node \`${n}\` must have at least 1 child node.`,range:t.range});return}o==="SubTree"&&i>0&&e.report({message:`SubTree node \`${n}\` must not have child nodes, but has ${i}.`,range:t.range})}var zs=I({name:"model/valid-port-value",create(e){return{Element(t){if(he(t))return;let n=e.getNodeUsage(t);if(!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of t.attributes){let i=e.getPortUsage(t,o.name);i?.status==="resolved"&&Rn(e,{port:i.port,value:o.value,range:o.range,registry:ye(e.semantic),typeDefinition:Se(e.semantic,i.port.type),allowRemap:!0,diagnosticCode:u.InvalidPortValueType,customLiteralDiagnosticCode:u.CustomLiteralRequiresValidator,portLabel:o.name})}}}}});var Ks=I({name:"model/require-port",create(e){return{Element(t){if(he(t))return;let n=e.getNodeUsage(t);if(!(n.tagForm==="subtree"&&n.allowsArbitraryAttributes)&&!(n.model.status!=="resolved"&&n.tagForm!=="subtree"))for(let o of n.ports)!o.required||n.portUsages.some(r=>r.name===o.name&&r.status==="resolved")||e.report({message:`missing required port \`${o.name}\``,range:t.range,details:n.tagForm==="subtree"?{primaryLabel:n.model.status==="resolved"?`node \`${n.model.model.id}\` requires port \`${o.name}\``:`SubTree requires port \`${o.name}\``,help:`add \`${o.name}="..."\` or provide a blackboard reference such as \`${o.name}="{value}"\``}:void 0})}}}});var Ws=[I({name:"model/no-childless-control-shape-mismatch",create(e){return{Element(t){if(he(t)||!t.selfClosing)return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let o=n.model.model.kind;o!=="Control"&&o!=="Decorator"||e.report({message:`${o} 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(he(t)||t.selfClosing||ps(t))return;let n=e.getTreeNodeView(t);if(n?.model.status!=="resolved")return;let o=n.model.model.kind;o!=="Action"&&o!=="Condition"&&o!=="SubTree"||e.report({message:`${o} node \`${n.model.model.id}\` should be self-closing or have no children.`,range:t.range})}}}})];var Hs=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 o=t.attributes.find(i=>i.name==="ID");e.report({message:`unknown node \`${n.nodeType??n.tagName}\``,range:o?.valueContentRange??o?.valueRange??t.range})}}}});var Js=I({name:"model/no-unknown-port",create(e){return{Element(t){if(he(t))return;let n=e.getNodeUsage(t);for(let o of n.portUsages){if(o.status!=="undeclared")continue;let i=n.ports.map(s=>s.name).sort(),r=i.length>=1&&i.length<=8?[`note: defined ports: ${i.map(s=>`\`${s}\``).join(", ")}`]:void 0;e.report({message:`unknown port \`${o.name}\``,range:o.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 \`${o.name}\` or add it to the \`${n.model.model.id}\` SubTree model`:`remove \`${o.name}\`, add it to a SubTree model, or set the \`model/no-unknown-port\` rule option \`subTreePorts\` to \`loose\``,notes:r}:void 0})}}}}});var Ys=[Hs,Js,Ks,zs,...Ws,Gs];function bp(e,t){return e.attributes.find(n=>n.name===t)}function xp(e){let t=e.resolver.includes.elements;return new Set(["BehaviorTree","TreeNodesModel",...t.map(n=>n.name)])}var Zs=[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:u.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||bp(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)||xp(e.config).has(t.name)||e.report({message:`Unknown top-level element: ${t.name}`,range:t.range})}}}})];var oi=[...Zs,...Os,...Xs,...bs,...Ys,...ds,...Vs],CS=new Map(oi.map(e=>[e.name,e]));function Qs(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function ea(e,t){return Pe(e.linter.rules[t])?.options??{}}function ta(e){let t=Pe(e.config.linter.rules[e.rule]);return Qs(t?t.severity:e.defaultSeverity)}function na(e){let t=[],n=e.facts??rs(),o=e.rules?new Set(e.rules):void 0,i=[];for(let s of oi){if(o&&!o.has(s.name))continue;let a=ta({config:e.config,rule:s.name,defaultSeverity:s.defaultSeverity});if(!a)continue;let l=ea(e.config,s.name),d=s.optionsSchema?.safeParse(l),c=d?.success?d.data:l,p=ls({document:e.document,view:e.view,semantic:e.semantic,config:e.config,options:c,diagnostics:t,rule:s.name,code:s.code,severity:a,facts:n});i.push(s.create(p))}for(let s of i)s.Document?.();e.document.root&&oa(e.document.root,i);let r=Ot(e.semantic,e.document.uri);for(let s of r?.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)=>Sp(s.diag,a.diag)||s.index-a.index).map(s=>s.diag)}function oa(e,t){for(let n of t)n.Element?.(e);for(let n of e.children)n.kind==="element"&&oa(n,t)}function Sp(e,t){let n=e.range,o=t.range;return!n&&!o?0:n?o?n.start.line-o.start.line||n.start.character-o.start.character||n.end.line-o.end.line||n.end.character-o.end.character:-1:1}function ii(e,t,n){if(e.kind==="invalid-xml"||e.kind==="generic-xml")return[...e.diagnostics];let o=[...e.diagnostics],i=n.documentView??je(e,{semantic:t,config:n.config,policy:xe(n.config)});return o.push(...na({document:e,view:i,semantic:t,config:n.config})),o}import gi from"path";function vp(e){return e.endsWith("/")?e:`${e}/`}function kp(e,t=!1){return t?e.split("/").filter(n=>n.length>0&&n!=="."):ri(e.split("/"))}function ri(e){let t=[];for(let n of e)if(!(!n||n===".")){if(n===".."){t.pop();continue}t.push(n)}return t}function ot(e,t={}){let n=e.replace(/\\/g,"/"),o=s=>kp(s,t.preserveDotSegments),i=/^(?<scheme>[A-Za-z][A-Za-z\d+.-]*):\/\/(?<authority>[^/]*)(?<path>\/.*)?$/.exec(n);if(i?.groups)return{scheme:i.groups.scheme,authority:i.groups.authority,absolute:!0,segments:o(i.groups.path||"/")};let r=/^(?<drive>[A-Za-z]:)(?<rest>\/.*)?$/.exec(n);return r?.groups?{authority:r.groups.drive,absolute:!0,segments:o(r.groups.rest||"/")}:{absolute:n.startsWith("/"),segments:o(n)}}function Pn(e){let n=ri(e.segments).join("/");if(e.scheme){let o=`${e.scheme}://${e.authority??""}`;return n?`${o}/${n}`:`${o}/`}return e.authority&&e.absolute?n?`${e.authority}/${n}`:`${e.authority}/`:e.absolute?n?`/${n}`:"/":n}function Tp(e,t){return e.scheme===t.scheme&&e.authority===t.authority&&e.absolute===t.absolute}function Zt(e){return Pn(ot(e))}function Dp(e,...t){let n=ot(e),o=[...n.segments];for(let i of t){let r=ot(i,{preserveDotSegments:!0});if(r.scheme||r.absolute&&r.authority)return Zt(i);r.absolute&&(o.length=0),o.push(...r.segments)}return Pn({...n,segments:ri(o)})}function Rp(e){let t=ot(e);return t.segments.length===0?Pn(t):Pn({...t,segments:t.segments.slice(0,-1)})}function Cp(e){return ot(e).segments.at(-1)??""}function Ip(e,t){let n=ot(e),o=ot(t);if(!Tp(n,o))return Zt(t);let i=0;for(;i<n.segments.length&&i<o.segments.length&&n.segments[i]===o.segments[i];)i+=1;let r=new Array(n.segments.length-i).fill(".."),s=o.segments.slice(i);return[...r,...s].join("/")}function Ep(e,t){let n=vp(Zt(e)),o=Zt(t);return o===n.slice(0,-1)||o.startsWith(n)}var Q={normalize:Zt,join:Dp,dirname:Rp,basename:Cp,relative:Ip,isWithin:Ep};function Re(e,...t){return Q.join(e,...t)}function ia(e){return Q.dirname(e)}function ra(e){return Q.basename(e)}function $e(e,t){return Q.relative(e,t)}function sa(e,t){return Q.isWithin(e,t)}async function da(e,t,n){let o=e;for(;;){for(let r of t){let s=Q.join(o,r);if(await n.exists(s))return s}let i=Q.dirname(o);if(i===o)return;o=i}}async function Mp(e,t){return da(e,["btxml.config.json"],t)}async function aa(e,t){return JSON.parse(await t.readFile(e))}function la(e,t){return e.map(n=>R(n.code,n.severity==="error"?h.Error:h.Warning,n.message,void 0,t??"",n.help?{help:n.help}:void 0))}async function ca(e){if(e.noConfig)return{ok:!0,config:{},diagnostics:[]};let t=e.configUri,n={};if(t||(t=await Mp(e.startUri,e.host)),t){if(!await e.host.exists(t))return{ok:!1,diagnostics:[R("CFG006_CONFIG_PATH_NOT_FOUND",h.Error,`config file not found \`${t}\``,void 0,t,{help:"check the `--config` path or run without `--config` to use config discovery"})]};try{n=await aa(t,e.host)}catch(r){let s=String(r.message||r);return{ok:!1,configUri:t,diagnostics:[R("CFG001_INVALID_CONFIG_JSON",h.Error,"invalid configuration JSON",void 0,t,{primaryLabel:"the config file could not be parsed as JSON",help:"fix the JSON syntax in the config file",notes:[s]})]}}}else{let r=await da(e.startUri,["package.json"],e.host);if(r)try{let s=await aa(r,e.host);s.btxml&&(n=s.btxml,t=r)}catch{n={}}}let o=gt(n);if(!o.ok)return{ok:!1,configUri:t,diagnostics:la(o.diagnostics,t)};let i=vo(o.value);return i.length>0?{ok:!1,configUri:t,diagnostics:la(i,t)}:{ok:!0,config:o.value,configUri:t,diagnostics:[]}}import Np from"ignore";function si(e){return e.replace(/\\/g,"/")}function q(e,t){return si($e(e,t))}function Pp(e){let t=e.replace(/\\/g,"/"),n="^";for(let o=0;o<t.length;o+=1){let i=t[o],r=t[o+1],s=t[o+2];if(i==="*"&&r==="*"&&s==="/"){n+="(?:.*/)?",o+=2;continue}if(i==="*"&&r==="*"){n+=".*",o+=1;continue}if(i==="*"){n+="[^/]*";continue}if(i==="?"){n+="[^/]";continue}".+-^${}()|[]\\".includes(i)?n+=`\\${i}`:n+=i}return n+="$",new RegExp(n)}function Ve(e,t){let n=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||ra(n)===o:Pp(o).test(n)}function wp(e){return e.includes("*")||e.includes("?")}async function ua(e,t,n,o,i,r,s,a){let l=q(n,t);if(l&&o.some(c=>Ve(l,c)||Ve(`${l}/`,c)||Ve(`${l}/dummy`,c))||a&&l&&a.ignores(l))return;let d;try{d=await e.readDir(t)}catch{return}for(let c of d){let p=Re(t,c.name),m=c.type==="directory",f=c.type==="file";if(c.type==="other"&&r&&e.realpath)try{let y=await e.realpath(p);if(s.has(y))continue;s.add(y);let g=await e.stat(y);m=g?.type==="directory",f=g?.type==="file"}catch{continue}m?await ua(e,p,n,o,i,r,s,a):f&&i.push(p)}}async function Qt(e,t,n,o,i,r,s){let a=new Set,l=new Set,d=[],c=i??t;for(let m of e){let f=Re(c,m);if((await s.stat(f))?.type==="file"){let y=q(t,f),g=!y.startsWith("..");!n.some(S=>Ve(y,S))&&(!g||!r?.ignores(y))&&a.add(f);continue}if(!wp(m)){l.add(m);continue}d.push(m)}let p=[];if(d.length>0&&await s.exists(t)){let m=new Set([s.realpath?await s.realpath(t):t]);await ua(s,t,t,n,p,o,m,r)}for(let m of p){let f=q(c,m);d.some(y=>Ve(f,y))&&(n.some(y=>Ve(q(t,m),y))||r?.ignores(q(t,m))||a.add(m))}for(let m of d)p.some(y=>{let g=q(c,y);return Ve(g,m)&&!n.some(S=>Ve(q(t,y),S))&&!r?.ignores(q(t,y))})||l.add(m);return{files:[...a].sort((m,f)=>q(t,m).localeCompare(q(t,f))),unmatchedPatterns:[...l].sort()}}async function Bp(e,t){let n=Re(e,".gitignore");return await t.exists(n)?(await t.readFile(n)).split(/\r?\n/).map(i=>i.trim()).filter(i=>i&&!i.startsWith("#")):[]}function _p(e){return Np().add(e)}async function pa(e,t,n,o,i){let r=[...t.ignore],s=t.useGitignore?await Bp(e,i):[],a=_p(s),l=n?.length?n:t.include,d=await Qt(l,e,r,t.followSymlinks,n?.length?o:void 0,a,i),c=t.maxSize,p=[],m=[];for(let f of d.files){let y=q(e,f),g=await i.stat(f);if(g){if((g.size??0)>c){m.push({path:y,reason:"too-large"});continue}p.push({path:y,uri:f,kind:"unknown"})}}return{selectedFiles:p,skippedFiles:m,unmatchedPatterns:d.unmatchedPatterns}}function ma(e){return e.entrypoints.map(t=>({file:si(t)}))}function ai(e){return e.resolver.entrypoints.length>0?"entrypoints":"workspace"}async function fa(e,t,n,o){let i=[];for(let r of t)await o.exists(Re(e,r.file))||i.push(R(u.EntrypointNotFound,h.Error,`entrypoint file not found \`${r.file}\``,void 0,n,{help:"check `resolver.entrypoints` and make sure the file exists under the project root"}));return i}async function ga(e,t,n,o){let i=await Qt(t.files,e,[],n.followSymlinks,void 0,void 0,o),r=await Qt(t.definitions,e,[],n.followSymlinks,void 0,void 0,o),s=await Qt(t.augmentations,e,[],n.followSymlinks,void 0,void 0,o),a=i.files.map(c=>({path:q(e,c),uri:c,kind:"model-xml"})),l=r.files.map(c=>({path:q(e,c),uri:c,kind:"node-definition"})),d=s.files.map(c=>({path:q(e,c),uri:c,kind:"model-augmentation"}));return{modelFiles:a,augmentationFiles:d,definitionFiles:l,unmatchedPatterns:{models:i.unmatchedPatterns,augmentations:s.unmatchedPatterns,definitions:r.unmatchedPatterns}}}function li(e){return e.rootUri}function di(e){return e.configUri}function ci(e){return e.config}function it(e){return e.resolvedConfig}function ui(e){return e.selectedFiles.map(t=>({...t}))}function pi(e){return e.modelFiles.map(t=>({...t}))}function mi(e){return e.definitionFiles.map(t=>({...t}))}function fi(e){return e.skippedFiles.map(t=>({...t}))}async function Ap(e){if(e.configUri)return Q.dirname(e.configUri);let t=e.startUri;for(;;){if(await e.host.exists(Q.join(t,".git"))||await e.host.exists(Q.join(t,".colcon")))return t;let n=Q.dirname(t);if(n===t)return e.startUri;t=n}}async function ya(e){let t=await ca({startUri:e.rootUri,configUri:e.configUri,noConfig:e.noConfig,host:e.host});if(!t.ok||!t.config)return{ok:!1,diagnostics:t.diagnostics};let n=fn(t.config);if(!n.ok)return{ok:!1,diagnostics:[...t.diagnostics,...n.diagnostics]};let o=n.config,i=await Ap({startUri:e.rootUri,configUri:t.configUri,host:e.host}),{selectedFiles:r,skippedFiles:s}=await pa(i,o.files,e.cliFiles,e.rootUri,e.host),a=[...t.diagnostics,...n.diagnostics],l=t.configUri?q(i,t.configUri):"",d=ma(o.resolver);for(let g of d){let S=Q.join(i,g.file);await e.host.exists(S)&&!r.some(v=>v.uri===S)&&r.push({path:g.file,uri:S,kind:"bt-xml"})}let{modelFiles:c,augmentationFiles:p,definitionFiles:m,unmatchedPatterns:f}=await ga(i,o.models,o.files,e.host);for(let g of f.models)a.push(R(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${g}\``,void 0,l,{help:"check `models.files` and make sure the file exists"}));for(let g of f.definitions)a.push(R(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${g}\``,void 0,l,{help:"check `models.definitions` and make sure the file exists"}));for(let g of f.augmentations)a.push(R(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${g}\``,void 0,l,{help:"check `models.augmentations` and make sure the file exists"}));let y=o.models.builtins;return a.push(...await fa(i,d,l,e.host)),{ok:!0,diagnostics:a,project:{rootUri:i,configUri:t.configUri,host:e.host,config:t.config,resolvedConfig:o,selectedFiles:r,entrypoints:d,modelFiles:c,augmentationFiles:p,definitionFiles:m,skippedFiles:s,modelsBuiltins:y}}}import{constants as Lp}from"fs";import en from"fs/promises";import Up from"path";import ha from"path";import{fileURLToPath as Fp,pathToFileURL as ba}from"url";function jp(e){return e.startsWith("file://")?e:ba(ha.resolve(e)).href}function ie(e){return Fp(jp(e))}function rt(e){return ba(ha.resolve(e)).href}function Op(e){return e.isFile()?"file":e.isDirectory()?"directory":"other"}function we(e=process.cwd(),t={}){let n=Up.resolve(e),o=rt(n);return{rootUri(){return o},async readFile(i){return en.readFile(ie(i),"utf8")},async exists(i){try{return await en.access(ie(i),Lp.F_OK),!0}catch(r){if(r.code!=="ENOENT")throw r;return!1}},async stat(i){try{let r=await en.stat(ie(i));return{type:Op(r),size:r.size}}catch{return}},async readDir(i){return(await en.readdir(ie(i),{withFileTypes:!0})).map(s=>({name:s.name,type:s.isFile()?"file":s.isDirectory()?"directory":"other"}))},async realpath(i){return rt(await en.realpath(ie(i)))},async resolvePackageUri(i){return t.resolvePackageUri?.(i)}}}async function yi(e={}){let t=gi.resolve(e.cwd??process.cwd()),n=e.projectRoot?gi.resolve(t,e.projectRoot):t,o=we(n,e.hostOptions);return ya({rootUri:rt(n),host:o,configUri:e.configPath?rt(gi.resolve(t,e.configPath)):void 0,noConfig:e.noConfig,cliFiles:e.cliFiles,command:e.command})}var xa={InvalidJson:u.InvalidAugmentationJson,InvalidSchema:u.InvalidAugmentationSchema};function $p(e){return R(e.code,h.Error,e.message,e.range,e.filePath,{primaryLabel:e.primaryLabel,help:e.help,notes:e.notes?[...e.notes]:void 0})}function Vp(e,t){return t.issues.map(n=>$p({filePath:e,code:n.kind==="json"?xa.InvalidJson:xa.InvalidSchema,message:n.kind==="json"?`invalid augmentation JSON \`${e}\``:`invalid augmentation schema \`${e}\``,range:n.range,primaryLabel:n.message,help:n.kind==="json"?`fix the JSON syntax in \`${e}\``:n.path?`fix the schema issue at \`${n.path}\``:"fix the schema issue in the file",notes:n.notes}))}async function wn(e){let t=e.project,n=e.host??t.host,o=[],i=[];for(let r of t.augmentationFiles){if(!await n.exists(r.uri)){o.push(R(u.AugmentationFileNotFound,h.Error,`model augmentation file not found \`${r.path}\``,void 0,r.path,{help:"check `models.augmentations` and make sure the file exists"}));continue}let s=await n.readFile(r.uri),a=yo(s,{uri:r.uri,path:r.path});if(!a.ok){o.push(...Vp(r.path,a));continue}i.push(a.data)}return{ok:o.every(r=>r.severity!==h.Error),augmentations:i,diagnostics:o}}function qp(e){let t=e.root;if(!t)return;if(t.name==="TreeNodesModel")return{...e,kind:"model-document",isBtXml:!0};let n=t.children.find(i=>i.kind==="element"&&i.name==="TreeNodesModel");if(!n)return;let o=e.nodes.flatMap(i=>i===t?t.children.filter(r=>r===n||r.kind==="comment"):i.kind==="comment"?[i]:[]);return{...e,kind:"model-document",root:n,nodes:o,isBtXml:!0}}async function Xp(e,t){return Te(await t.readFile(e.uri),{uri:e.uri,path:e.path})}async function hi(e,t){if(!await t.exists(e.uri))return{diagnostics:[R(u.ExternalModelFileNotFound,h.Error,`external TreeNodesModel file not found \`${e.path}\``,void 0,e.path,{help:"check `models.files` and make sure the file exists"})]};let n=await Xp(e,t);if(!n.document||n.diagnostics.some(i=>i.severity===h.Error)){let i=n.diagnostics[0];return{diagnostics:[R(u.ExternalModelXmlParseError,h.Error,`failed to parse external TreeNodesModel file \`${e.path}\``,n.diagnostics[0]?.range,e.path,{primaryLabel:"the external model file is not valid XML",help:`fix the XML syntax in \`${e.path}\` before using it as an external model file`,notes:i?[`first XML error: ${i.code} ${i.message}`]:void 0})]}}let o=qp(n.document);return o?{document:o,diagnostics:[]}:{diagnostics:[R(u.MissingTreeNodesModel,h.Error,"missing `<TreeNodesModel>` in external model file",n.document.root?.range,e.path,{primaryLabel:"this file does not contain a `<TreeNodesModel>` element",help:"add a `<TreeNodesModel>` element or remove the file from `models.files`"})]}}async function Y(e,t){let n=e,o=t??n.host,i=[];for(let d of n.selectedFiles){if(!await o.exists(d.uri))continue;let c=await o.readFile(d.uri),p=Te(c,{uri:d.uri,path:d.path});p.document&&i.push(p.document)}let r=await Promise.all(n.modelFiles.map(d=>hi(d,o))),s=await wn({project:e,host:o}),a=r.flatMap(d=>d.diagnostics),l=r.flatMap(d=>d.document?[d.document]:[]);return{documents:i,externalModelDocuments:l,augmentations:[...s.augmentations],diagnostics:[...a,...s.diagnostics]}}function Sa(e,t){return e.attributes.find(n=>n.name===t)}function va(e,t){return $e(e,t).replace(/\\/g,"/")}function Gp(e,t,n,o,i){return e.replace(/\$\{([^}]+)\}/g,(r,s)=>s.startsWith("env:")?process.env[s.slice(4)]??r:t[s]!==void 0?t[s]:(n.push({kind:"unresolved-variable",uri:i,variable:s,range:o,message:`unresolved include path variable \`${s}\``}),r))}function zp(e,t){let n=t.resolvedConfig.resolver.includes.elements.map(r=>({name:r.name,pathAttribute:r.attribute,base:r.base==="project-root"?"project-root":"current-file"})),o=e.root;if(!o)return[];let i=[];for(let r of o.children||[]){if(r.kind!=="element")continue;let s=n.find(a=>a.name===r.name);s&&i.push({element:r,pathAttr:Sa(r,s.pathAttribute),rosPackageAttr:Sa(r,"ros_pkg"),base:s.base??"current-file"})}return i}async function ka(e){let t=e.project,n=e.host??t.host,o=e.resolvedConfig.resolver.includes.allowOutsideRoot,i=e.resolvedConfig.resolver.includes.maxDepth,r=e.resolvedConfig.resolver.includes.maxFiles,s=[],a=new Map(e.documents.map(g=>[va(t.rootUri,g.path||g.uri),g])),l={nodes:new Map,edges:[],entrypointFiles:[],reachableFiles:new Set,cycles:[]},d=new Map,c=new Set,p=t.entrypoints.length?t.entrypoints.map(g=>g.file):t.selectedFiles.map(g=>g.path);l.entrypointFiles=[...new Set(p)];let m=new Set,f=new Set,y=async(g,S,v)=>{if(S.length>=i){s.push({kind:"depth-exceeded",uri:v?.uri??g,path:g,range:v?.range,message:`include \`${g}\` exceeds the configured maximum include depth`});return}if(l.reachableFiles.size>=r){s.push({kind:"too-many-files",uri:v?.uri??g,path:g,range:v?.range,message:`resolving \`${g}\` would exceed the configured file limit`});return}let x=g.replaceAll("\\","/");if(m.has(x)){let A=[...S.slice(S.indexOf(x)),x];l.cycles.push({files:A}),s.push({kind:"cycle",uri:v?.uri??x,path:x,cycle:A,range:v?.range,message:"include cycle detected"});return}if(f.has(x))return;m.add(x),l.reachableFiles.add(x);let D=Re(t.rootUri,x);c.add(D);let P=await n.exists(D),w=a.get(x);!w&&P&&(w=Te(await n.readFile(D),{uri:D,path:x}).document,w&&a.set(x,w)),l.nodes.set(x,{path:x,document:w,exists:P}),w&&d.set(w.uri,w);let B=w?.uri??D;if(!P){s.push({kind:"not-found",uri:v?.uri??B,path:x,range:v?.range,message:`include file not found \`${x}\``}),m.delete(x);return}if(!w){m.delete(x);return}for(let A of zp(w,e)){if(!A.pathAttr){s.push({kind:"missing-path",uri:B,range:A.element.range,message:"missing include path"});continue}let _e=Gp(A.pathAttr.value,e.resolvedConfig.resolver.includes.variables,s,A.pathAttr.range,B),se;if(A.rosPackageAttr){let N=A.rosPackageAttr.value.trim();if(!n.resolvePackageUri){s.push({kind:"ros-package-resolver-missing",uri:B,packageName:N,range:A.rosPackageAttr.range,message:`include uses ros_pkg=\`${N}\` but ProjectHost.resolvePackageUri is not available`});continue}let E=await n.resolvePackageUri(N);if(!E){s.push({kind:"ros-package-not-found",uri:B,packageName:N,path:_e,range:A.rosPackageAttr.range,message:`ROS package \`${N}\` could not be resolved for include path \`${_e}\``});continue}se=Re(E,_e)}else{let N=A.base==="project-root"?t.rootUri:ia(D);se=Re(N,_e)}let U=va(t.rootUri,se),fe=se;try{await n.exists(se)&&(fe=n.realpath?await n.realpath(se):se)}catch{}if(!sa(t.rootUri,fe)){if(!o){s.push({kind:"outside-root",uri:B,path:U,range:A.pathAttr.range,message:"include target is outside the workspace"});continue}s.push({kind:"external-used",uri:B,path:U,range:A.pathAttr.range,message:`external include used \`${_e}\``})}l.edges.push({from:x,to:U,includeElementRange:A.element.range,includePathRange:A.pathAttr.range}),await y(U,[...S,x],{uri:B,range:A.pathAttr.range})}m.delete(x),f.add(x)};for(let g of l.entrypointFiles)await y(g,[]);return{graph:l,reachableUris:c,reachableDocuments:d,issues:s}}var Ta="model/no-conflicting-kind-for-id",Ra="model/no-unused-definition",Da="model/no-duplicate-definition",Ca="model/require-local-definition",Kp=new Set(["Action","Condition","Decorator","Control"]);function An(e){return{...R(e.code,e.severity,e.message,e.range,e.uri,void 0,e.data),rule:e.rule,...e.relatedInformation?{relatedInformation:e.relatedInformation}:{}}}function Bn(e,t){let n=We(e.linter.rules,t);if(n!=="off")return n==="info"?h.Info:n==="warn"?h.Warning:h.Error}function tn(e){return e.model.idRange??e.range}function _n(e){return e.range}function Wp(e){return{uri:e.uri,sourceKind:e.sourceKind,modelKind:e.kind,range:e.range}}function bi(e){return Kp.has(e)}function Hp(e,t){let n=ke(e,t);if(!(!n||!bi(n.kind)||Je(e).some(i=>i.id===t&&(i.code==="BT012_CONFLICTING_NODE_MODEL"||i.code==="BT107_CONFLICTING_PORT_DEFAULT"))))return{id:n.id,kind:n.kind,ports:n.ports.map(i=>({direction:i.direction,name:i.name,type:i.type,defaultValue:i.defaultValue,description:i.description,enum:i.enum}))}}function Jp(e){let t=Bn(e.config,Ta);if(!t)return[];let n=[],o=qt(e.facts.filter(i=>!i.isBuiltin));for(let[i,r]of o){if(new Set(r.map(l=>l.kind)).size<=1)continue;let a=r[0];if(a)for(let l of r.slice(1)){if(l.kind===a.kind)continue;let d=tn(a),c=a.uri&&d?[{uri:a.uri,range:d,message:"first conflicting definition"}]:void 0;n.push(An({code:"BT120_CONFLICTING_MODEL_KIND",message:`model ID \`${i}\` has conflicting kinds (\`${a.kind}\` vs \`${l.kind}\`)`,uri:l.uri,range:tn(l),rule:Ta,severity:t,data:{kind:"conflicting-model-kind",nodeId:i,definitions:r.map(Wp)},relatedInformation:c}))}}return n}function Yp(e){if(e.config.models.convention!=="used-only")return[];let t=Bn(e.config,Ra),n=Bn(e.config,Ca);if(!t&&!n)return[];let o=[],i=Io(e.index),r=Zp(e.facts),s=Qp(e.facts),a=new Set([...i.keys(),...s.keys(),...r.keys()]);for(let l of a){let d=i.get(l)??[],c=em(d),p=s.get(l)??[],m=new Set(p.map(y=>y.id)),f=new Set((r.get(l)??[]).map(y=>y.id));t&&o.push(...tm(p,c,t)),n&&o.push(...nm({index:e.index,uri:l,usedNodeIds:c,localNormalIds:m,localAnyIds:f,sameFileNodeUsages:d,severity:n}))}return o}function Zp(e){let t=new Map;for(let n of e){if(n.sourceKind!=="inline-tree-nodes-model"||!n.uri)continue;let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}function Qp(e){let t=new Map;for(let n of e){if(n.sourceKind!=="inline-tree-nodes-model"||!n.uri||!bi(n.kind))continue;let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}function em(e){return new Set(e.filter(t=>t.kind==="node").map(t=>t.id))}function tm(e,t,n){let o=[];for(let i of e)t.has(i.id)||o.push(An({code:"BT121_UNUSED_MODEL_DEFINITION",message:`unused inline model definition \`${i.id}\` in this file`,uri:i.uri,range:tn(i),rule:Ra,severity:n,data:{kind:"unused-model-definition",nodeId:i.id,modelKind:i.kind,sourceKind:"inline-tree-nodes-model",fix:i.uri&&_n(i)&&i.editable?{kind:"delete-definition",uri:i.uri,range:_n(i)}:void 0}}));return o}function nm(e){let t=[];for(let n of e.usedNodeIds){if(e.localNormalIds.has(n)||!He(e.index,n).some(a=>bi(a.kind)))continue;let i=e.localAnyIds.has(n),r=e.sameFileNodeUsages.find(a=>a.kind==="node"&&a.id===n),s=i?void 0:Hp(e.index,n);t.push(An({code:"BT123_MISSING_LOCAL_MODEL_DEFINITION",message:`missing local model definition \`${n}\` in this file`,uri:e.uri,range:r?.elementRange??r?.range,rule:Ca,severity:e.severity,data:{kind:"missing-local-model-definition",nodeId:n,sourceKind:"inline-tree-nodes-model",fix:s&&e.uri?{kind:"add-local-definition",uri:e.uri,nodeId:n,model:s}:void 0}}))}return t}function om(e){let t=e.filter(i=>i.isCanonicalModelFile);if(t.length!==1)return;let n=t[0];if(!n?.uri)return;let o=e.filter(i=>i!==n);if(!o.some(i=>!i.uri||!_n(i)||!i.editable))return{kind:"delete-non-canonical-definitions",keep:{uri:n.uri,range:tn(n)},delete:o.map(i=>({uri:i.uri,range:_n(i)}))}}function im(e){if(e.config.models.convention!=="single-source")return[];let t=Bn(e.config,Da);if(!t)return[];let n=[],o=Lo(e.facts.filter(i=>!i.isBuiltin));for(let i of o.values()){if(i.length<=1)continue;let r=i[0];r&&n.push(An({code:"BT122_DUPLICATE_MODEL_DEFINITION",message:`duplicate model definition for \`${r.id}\` (${r.kind})`,uri:r.uri,range:tn(r),rule:Da,severity:t,data:{kind:"duplicate-model-definition",nodeId:r.id,modelKind:r.kind,definitions:i.map(s=>({uri:s.uri,sourceKind:s.sourceKind,range:s.range,canonical:s.isCanonicalModelFile,editable:s.editable})),fix:om(i)}}))}return n}function Ia(e){if(e.config.linter.enabled===!1)return[];let t=Vt(e.index);return[...Jp({config:e.config,facts:t}),...Yp({config:e.config,index:e.index,facts:t}),...im({config:e.config,facts:t})]}import{findNodeAtLocation as Ea,parse as rm,parseTree as sm}from"jsonc-parser";function am(e){let t=[0];for(let n=0;n<e.length;n++)e[n]===`
|
|
20
|
+
`&&t.push(n+1);return n=>{let o=0,i=t.length-1;for(;o<=i;){let s=Math.floor((o+i)/2);t[s]<=n?o=s+1:i=s-1}let r=Math.max(0,o-1);return{line:r,character:n-t[r],offset:n}}}function Ma(e,t){if(e)return{start:t(e.offset),end:t(e.offset+e.length)}}async function Na(e){let t=e.project,n=e.host??t.host,o=[],i=[],r=new Set;for(let s of t.definitionFiles){if(!await n.exists(s.uri)){o.push(R(u.NodeDefinitionFileNotFound,h.Error,`node definition file not found \`${s.path}\``,void 0,"",{help:"check `models.definitions` and make sure the file exists"}));continue}let a,l=await n.readFile(s.uri),d=[],c=sm(l,d,{allowTrailingComma:!0,disallowComments:!1});try{if(a=rm(l,d,{allowTrailingComma:!0,disallowComments:!1}),d.length>0||!c)throw new Error(`JSON parse error at offset ${d[0]?.offset??0}`)}catch(m){let f=String(m.message||m);o.push(R(u.InvalidNodeDefinitionJson,h.Error,`invalid node definition JSON \`${s.path}\``,void 0,"",{primaryLabel:"the file could not be parsed as JSON",help:`fix the JSON syntax in \`${s.path}\``,notes:[f]}));continue}let p=ho.safeParse(a);if(!p.success){for(let m of p.error.issues){let f=m.code==="unrecognized_keys"?m.keys.map(y=>({label:`Unrecognized key: "${y}"`,path:[...m.path,y].join(".")})):[{label:m.message,path:m.path.join(".")}];for(let{label:y,path:g}of f)o.push(R(u.InvalidNodeDefinitionSchema,h.Error,`invalid node definition schema \`${s.path}\``,void 0,"",{primaryLabel:y,help:g?`fix the schema issue at \`${g}\``:"fix the schema issue in the file",notes:g?[g]:[]}))}continue}for(let[m,f]of Object.entries(p.data.nodes)){r.has(m)&&o.push(R(u.DuplicateNodeDefinitionId,h.Error,`duplicate node definition ID \`${m}\``,void 0,"",{primaryLabel:"this ID was already loaded from another node definition file",help:"remove one definition or rename one of the duplicate IDs"})),r.add(m);let y=am(l),g=Ma(Ea(c,["nodes",m]),y),S=Pt(m,f),v=S.ports.map(x=>{let D=Ma(Ea(c,["nodes",m,"ports",x.name]),y);return{...x,source:"node-definition-file",uri:s.path,range:D,nameRange:D}});i.push({...S,ports:v,source:"node-definition-file",sourceMeta:{sourceKind:"node-definition-file",file:s.path,range:g},editable:!0,uri:s.path,range:g,elementRange:g})}}return{ok:o.every(s=>s.severity!==h.Error),nodeModels:i,diagnostics:o}}function Pa(e,t){return $e(e,t).replace(/\\/g,"/")}function lm(e){return[...e.reachableDocuments.values()]}function xi(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function wa(e){let t=new Map;for(let n of e)t.set(n.path,n);return[...t.values()]}function dm(e){let t=new Map;for(let n of e){let o=t.get(n.uri)??[];o.push(n),t.set(n.uri,o)}return t}async function Si(e){let t=[],n=e.project,o=e.resolvedConfig,i=e.resolutionMode??ai(o),r=i==="entrypoints"||e.resolveGraph?await ka({project:e.project,documents:e.documents,resolvedConfig:o,host:e.host}):void 0,s=e.externalModelDocuments,a=e.augmentations,l=await Na({project:e.project,host:e.host});t.push(...l.diagnostics);let d=l.nodeModels,c=r&&(i==="entrypoints"||e.resolveGraph)?xi([...e.documents.filter(g=>e.activeDocumentUris.has(g.uri)&&r.reachableUris.has(g.uri)),...r.reachableDocuments.values(),...s]):xi([...e.documents.filter(g=>e.activeDocumentUris.has(g.uri)),...s]),p=Ut(c,{config:o,models:d,augmentations:a}),m={includeIssuesByUri:dm(r?.issues??[]),suppressionIssuesByUri:new Map};t.push(...p.diagnostics,...Ia({config:o,index:p.index}));let f=new Map(bt(p.index).map(g=>[g,ve(p.index,g)])),y={mode:i,files:new Map(c.map(g=>[Pa(n.rootUri,g.path||g.uri),g])),documentViews:new Map(c.map(g=>[g.uri,(()=>{let S=J(o,Pa(n.rootUri,g.path||g.uri));return je(g,{semantic:p.index,config:S,policy:xe(S)})})()])),includeGraph:r?.graph,reachableDocuments:r?.reachableDocuments??new Map,behaviorTreesById:new Map(bt(p.index).map(g=>[g,ve(p.index,g)])),reachableBehaviorTreesById:f,nodeModelsById:new Map(Mo(p.index).map(g=>[g.id,g])),nodeModelSources:new Map(No(p.index).map(g=>[g,He(p.index,g).flatMap(S=>S.sourceMeta?[S.sourceMeta]:[])])),nodeDefinitionModels:[...d],entrypoints:n.entrypoints,workspace:p.index,facts:m};return{ok:t.every(g=>g.severity!==h.Error),index:y,diagnostics:t}}async function Ba(e){let t=e.project,n=e.resolvedConfig??t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=[...e.projectDiagnostics??[]],i=e.host??t.host,r=e.externalModelDocuments!==void 0?[...e.externalModelDocuments]:(await Promise.all(t.modelFiles.map(async y=>{let g=await hi(y,i);return o.push(...g.diagnostics),g.document?[g.document]:[]}))).flat(),s=e.augmentations!==void 0?[...e.augmentations]:void 0;if(!s){let y=await wn({project:e.project,host:i});o.push(...y.diagnostics),s=[...y.augmentations]}let a=e.resolutionMode??ai(n),l=a==="entrypoints"?new Set(e.documents.filter(y=>y.kind==="bt-document").map(y=>y.uri)):new Set(e.documents.map(y=>y.uri)),d=await Si({project:e.project,documents:e.documents,activeDocumentUris:l,externalModelDocuments:r,augmentations:s,resolutionMode:a,resolveGraph:e.mode==="check",resolvedConfig:n,host:i}),c=xi([...e.documents,...lm(d.index),...r]),p=n.linter.enabled!==!1,m=e.showSuppressed,f=[...d.index.nodeDefinitionModels];return{input:e,project:e.project,documents:e.documents,externalModelDocuments:r,augmentations:s,projectDiagnostics:o,indexResult:d,nodeDefinitionModels:f,fileDocuments:c,lintEnabled:p,showSuppressed:m,resolvedConfig:n,suppressionIssuesByUri:void 0}}var cm={"missing-path":"include/require-path","not-found":"include/no-missing-file",cycle:"include/no-cycle","unresolved-variable":"include/no-unresolved-variable","outside-root":"include/no-outside-root","external-used":"include/report-external-used","depth-exceeded":"include/no-depth-exceeded","too-many-files":"include/no-too-many-files","ros-package-resolver-missing":"include/require-ros-package-resolver","ros-package-not-found":"include/no-missing-ros-package"};function _a(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function um(e,t){let n=Pe(e.linter.rules[t]);return _a(n?n.severity:H[t].defaultSeverity)}function pm(e){switch(e.kind){case"missing-path":return;case"unresolved-variable":return{variable:e.variable};case"ros-package-resolver-missing":return{packageName:e.packageName};case"ros-package-not-found":return{packageName:e.packageName,path:e.path};case"cycle":return{path:e.path,cycle:e.cycle};default:return{path:e.path}}}function Aa(e){let t=[];for(let n of e.issues){let o=cm[n.kind],i=um(e.config,o);if(!i)continue;let r=R(H[o].code,i,n.message,n.range,n.uri,void 0,pm(n));t.push({...r,rule:o})}return t}function Fa(e,t){return $e(e,t).replace(/\\/g,"/")}function mm(e){return e.length>0&&!e.startsWith("/")&&!e.startsWith("../")&&!/^[A-Za-z][A-Za-z\d+.-]*:\/\//.test(e)&&!/^[A-Za-z]:\//.test(e)}function fm(e,t){for(let n of[t.path,t.uri]){if(!n)continue;let o=Fa(e,n);if(mm(o))return o}return Fa(e,t.uri)}function ja(e){let{project:t,indexResult:n,externalModelDocuments:o,fileDocuments:i,lintEnabled:r,resolvedConfig:s}=e,a=t,l=n.index.mode;return i.map(d=>{let c=fm(a.rootUri,d);if(l==="entrypoints"&&n.index.includeGraph&&d.kind==="bt-document"&&!n.index.reachableDocuments.has(d.uri))return{path:c,uri:d.uri,kind:d.kind,diagnostics:[],skipped:!0,skipReason:"unreachable",originalText:d.originalText};let p=l==="single-file"?Ut([d,...o],{config:s,models:e.nodeDefinitionModels,augmentations:e.augmentations}).index:n.index.workspace,m=l==="single-file"?(()=>{let y=J(s,c);return je(d,{semantic:p,config:y,policy:xe(y)})})():n.index.documentViews.get(d.uri),f=[];if(r){let y=J(s,c);f=ii(d,p,{config:y,documentView:m});let g=n.index.facts.includeIssuesByUri.get(d.uri)??[];f.push(...Aa({issues:g,config:y}))}return e.input.mode==="check"&&d.kind==="generic-xml"?{path:c,uri:d.uri,kind:d.kind,documentView:m,diagnostics:[],rawDiagnostics:f,skipped:!0,skipReason:"generic-xml",originalText:d.originalText}:{path:c,uri:d.uri,kind:d.kind,documentView:m,diagnostics:f,rawDiagnostics:void 0,skipped:!1,originalText:d.originalText}})}function La(e){let t=[];for(let n of e)n.kind==="comment"&&t.push(n),n.kind==="element"&&t.push(...La(n.children));return t}function gm(e,t,n){let o=[],i=[];for(let r of e){let s=La(r.nodes);for(let a of s){let l=a.text.trim();if(!l.includes("btxml-disable"))continue;let d=l.match(/\b(BT\d+|BT\d+_[A-Z0-9_]+|CFG\d+_[A-Z0-9_]+|XML\d+_[A-Z0-9_]+)\b/)?.[1],c=l.match(/reason:\s*(.+)$/)?.[1];t&&!c&&i.push({kind:"missing-reason",uri:r.uri,code:d,range:a.range,message:"missing suppression reason"}),l.startsWith("btxml-disable-file")?o.push({uri:r.uri,code:d,file:!0,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable-next-line")?n&&o.push({uri:r.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c}):l.startsWith("btxml-disable")&&n&&o.push({uri:r.uri,code:d,line:a.range.end.line+1,range:a.range,used:!1,reason:c})}}return{suppressions:o,issues:i}}function Ua(e,t){let n=gm(t.documents??[],!!t.requireReason,t.allowInline!==!1),o=[],i=[];for(let r of e){let s=n.suppressions.find(a=>a.uri===r.uri&&(!a.code||a.code===r.code||r.code.startsWith(a.code))&&(a.file||a.line===r.range?.start.line||a.line===(r.range?.start.line??0)+1));if(s){s.used=!0,i.push(r);continue}o.push(r)}for(let r of n.suppressions)r.used||n.issues.push({kind:"unused",uri:r.uri,code:r.code,range:r.range,message:r.code?`unused suppression for \`${r.code}\``:"unused suppression"});if(t.showSuppressed){let r=i.map(s=>({...s,severity:h.Info,suppressed:!0}));return{diagnostics:[...o,...r],suppressedDiagnostics:i,issues:n.issues}}return{diagnostics:o,suppressedDiagnostics:i,issues:n.issues}}function vi(e,t,n,o=e.resolvedConfig){let i=We(o.linter.rules,"suppression/require-reason")!=="off";return Ua(t,{documents:n??e.fileDocuments,requireReason:i,allowInline:o.linter.suppressions.inline!=="deny",showSuppressed:e.showSuppressed})}function Fn(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Oa(e,t){if(!e.input.baseline)return{diagnostics:t,baselineDiagnostics:[],staleEntries:[]};let n=new Set,o=[],i=[];for(let r of t){let s=e.input.baseline.diagnostics.findIndex(a=>a.path===r.uri&&a.code===r.code&&a.messageHash===Fn(r.message)&&a.range?.start?.line===r.range?.start?.line&&a.range?.start?.character===r.range?.start?.character);if(s>=0){n.add(s),i.push(r);continue}o.push(r)}return{diagnostics:o,baselineDiagnostics:i,staleEntries:e.input.baseline.diagnostics.filter((r,s)=>!n.has(s))}}var $a={error:0,warning:1,info:2};function Va(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function jn(e){return e.flat().sort((t,n)=>{let o=t.uri.localeCompare(n.uri);if(o!==0)return o;let i=t.range?.start.offset??-1,r=n.range?.start.offset??-1;if(i!==r)return i-r;let s=$a[t.severity]-$a[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function qa(e,t,n){let o=t.filter(r=>!r.skipped),i=jn([n,o.flatMap(r=>r.diagnostics)]);return{files:o.length,errors:i.filter(r=>r.severity===h.Error).length,warnings:i.filter(r=>r.severity===h.Warning).length,infos:i.filter(r=>r.severity===h.Info).length,suppressed:0,baselineFiltered:0,staleEntries:[]}}function ym(e,t){return e.map(({path:n,uri:o,kind:i,diagnostics:r,rawDiagnostics:s,skipped:a,skipReason:l})=>({path:n,uri:o,kind:i,diagnostics:r,rawDiagnostics:t?s:void 0,skipped:a,skipReason:l}))}function Xa(e,t){let n=jn([e.finalProjectDiagnostics??e.projectDiagnostics,e.files?.flatMap(o=>o.diagnostics)??[]]);return{ok:!Va(n,e.input.maxWarnings),files:e.files?ym(e.files,e.input.includeRawDiagnostics):[],projectDiagnostics:e.finalProjectDiagnostics??e.projectDiagnostics,summary:t}}var hm={unused:"suppression/no-unused","missing-reason":"suppression/require-reason"},bm={unused:u.UnusedSuppression,"missing-reason":u.MissingSuppressionReason};function xm(e){if(e!=="off")return e==="info"?h.Info:e==="warn"?h.Warning:h.Error}function Sm(e,t){return xm(We(e.linter.rules,t))}function ki(e){let t=[];for(let n of e.issues){let o=hm[n.kind],i=Sm(e.config,o);if(!i)continue;let r=R(bm[n.kind],i,n.message,n.range,n.uri,void 0,n.code?{code:n.code}:void 0);t.push({...r,rule:o})}return t}async function vm(e){let t=await Ba(e),n=[...t.projectDiagnostics,...t.indexResult.diagnostics];t.files=ja(t);let o=vi(t,n);n=[...o.diagnostics,...ki({issues:o.issues,config:t.resolvedConfig})];let i=o.suppressedDiagnostics.length;for(let l=0;l<t.files.length;l++){let d=t.files[l],c=t.fileDocuments[l];if(d.skipped)continue;let p=J(t.resolvedConfig,d.path),m=vi(t,d.diagnostics,[c],p);d.diagnostics=[...m.diagnostics,...ki({issues:m.issues,config:p})],d.rawDiagnostics=[...d.diagnostics],i+=m.suppressedDiagnostics.length}let r=0,s=[];for(let l of t.files){if(l.skipped||l.diagnostics.length===0)continue;let d=Oa(t,l.diagnostics);l.diagnostics=d.diagnostics,r+=d.baselineDiagnostics.length,d.staleEntries.length>0&&(s=s.concat(d.staleEntries))}t.files=wa(t.files),t.finalProjectDiagnostics=n;let a=qa(t,t.files,n);return a.suppressed=i,a.baselineFiltered=r,a.staleEntries=s,{...Xa(t,a),files:t.files??[]}}async function st(e){let t=e.project,n=e.host??t.host,o=e.documents,i=e.externalModelDocuments,r=e.augmentations,s=[...e.projectDiagnostics??[]];if(!o||!i||!r){let a=await Y(e.project,n);o??=a.documents,i??=a.externalModelDocuments,r??=a.augmentations,s=[...s,...a.diagnostics]}return vm({...e,host:n,documents:o,externalModelDocuments:i,augmentations:r,projectDiagnostics:s,resolvedConfig:t.resolvedConfig})}import{z}from"zod";var Ln=z.object({version:z.literal(1),diagnostics:z.array(z.object({path:z.string(),code:z.string(),messageHash:z.string(),range:z.object({start:z.object({line:z.number(),character:z.number(),offset:z.number()}).strict(),end:z.object({line:z.number(),character:z.number(),offset:z.number()}).strict()}).strict().optional()}).strict())}).strict();function Ti(e){return{path:e.uri,code:e.code,messageHash:Fn(e.message),range:e.range}}function Di(e){return e.linter.baseline}function Ga(e){return[...e.files.values()]}function za(e){return[...e.reachableDocuments.values()]}function Ka(e){return e.workspace}function Wa(e){return[...e.nodeDefinitionModels]}function Ha(e){if(!e.includeGraph)return;let t=new Map;for(let s of e.files.values())s.path&&t.set(s.path,s.uri);let n=[];for(let[s,a]of e.includeGraph.nodes.entries()){let l=a.document?.uri??t.get(s)??s;n.push({path:s,uri:l,exists:a.exists})}let o=e.includeGraph.edges.map(s=>({from:s.from,to:s.to,includeElementRange:s.includeElementRange,includePathRange:s.includePathRange})),i=[];for(let s of e.facts.includeIssuesByUri.values())for(let a of s)i.push({kind:a.kind,uri:a.uri,path:"path"in a?a.path:void 0,message:a.message,range:a.range});let r=[...n];return r.sort((s,a)=>s.path.localeCompare(a.path)),{nodes:r,edges:o,issues:i}}async function at(e){let t=e.project,n=t.resolvedConfig;if(!n)throw new Error("Invariant: resolvedConfig is required");let o=e.host??t.host,i=e.documents,r=e.externalModelDocuments,s=e.augmentations,a=[];if(!i||!r||!s){let d=await Y(e.project,o);a.push(...d.diagnostics),i??=d.documents,r??=d.externalModelDocuments,s??=d.augmentations}let l=await Si({project:e.project,documents:i,activeDocumentUris:new Set(i.map(d=>d.uri)),externalModelDocuments:r,augmentations:s,resolveGraph:e.resolveGraph,resolvedConfig:n,host:o});return a.push(...l.diagnostics),{ok:l.ok,diagnostics:a,semanticIndex:Ka(l.index),documents:Ga(l.index),reachableDocuments:za(l.index),nodeDefinitionModels:Wa(l.index),includeGraph:Ha(l.index)}}function Ri(e){return e.map(t=>({...t,absolutePath:ie(t.uri)}))}function ce(e){return ie(li(e))}function Ci(e){let t=di(e);return t?ie(t):void 0}function K(e){return Ri(ui(e))}function Z(e){return Ri(pi(e))}function lt(e){return Ri(mi(e))}import Ei from"fs";import Ya from"path";import{createColors as Tm}from"picocolors";function Un(e){return e.noColor?{enabled:!1}:e.env?.NO_COLOR!==void 0?{enabled:!1}:e.stream&&!e.stream.isTTY?{enabled:!1}:{enabled:!0}}function re(e,t,n){let o=Tm(e.enabled);switch(t){case"error":return o.red(n);case"warning":return o.yellow(n);case"info":return o.cyan(n);case"help":return o.green(n);case"note":return o.dim(n);case"dim":return o.dim(n)}}function Ii(e){let t=Un({noColor:e.noColor,stream:e.stream,env:process.env}),n=[];if(n.push(`${re(t,"error","error:")} ${e.message}`),e.help&&(n.push(""),n.push(`${re(t,"help","help:")} ${e.help}`)),e.expected&&e.expected.length>0){n.push(""),n.push("expected one of:");for(let o of e.expected)n.push(` ${o}`)}return n.join(`
|
|
21
|
+
`)}var j=class extends Error{constructor(n,o,i,r){super(n);this.exitCode=o;this.help=i;this.expected=r;this.name="CliError"}exitCode;help;expected};function Ja(e){return e instanceof j?(console.error(Ii({message:e.message,help:e.help,expected:e.expected})),e.exitCode):(console.error(Ii({message:"command failed"})),console.error(`
|
|
22
|
+
note: ${String(e.message||e)}`),3)}function Mi(e,t){let n=t.baseline||Di(it(e)||ci(e));if(!n||t.noBaseline)return;let o=Ya.resolve(ce(e),n);if(!Ei.existsSync(o))return;let i;try{i=JSON.parse(Ei.readFileSync(o,"utf8"))}catch{throw new j(`failed to read baseline file: ${o}`,2)}let r=Ln.safeParse(i);if(!r.success)throw new j(`invalid baseline file: ${o}`,2,r.error.issues[0]?.message);return r.data}function Ni(e,t,n){let o=t.updateBaseline;if(!o||t.noBaseline)return;let i=Ya.resolve(ce(e),o),r={version:1,diagnostics:n.map(s=>Ti(s))};Ei.writeFileSync(i,`${JSON.stringify(r,null,2)}
|
|
23
|
+
`,"utf8"),t.quiet||console.log(`Baseline updated: ${o}`)}import Cm from"fs";import{z as Ce}from"zod";var Tt=Ce.object({config:Ce.string().optional(),projectRoot:Ce.string().optional(),noConfig:Ce.boolean().optional(),quiet:Ce.boolean().optional(),verbose:Ce.boolean().optional(),noColor:Ce.boolean().optional()}).passthrough(),Ie=Ce.object({files:Ce.array(Ce.string()).default([])});function W(e,t){let n=e.safeParse(t);if(n.success)return n.data;let o=n.error.issues[0],i=o?.path[0];if((i==="output"||i==="reporter")&&t&&typeof t=="object"){let r=t[i];if(r==="")throw new j(`--${i} requires a value`,2);if(typeof r=="string")throw new j(`invalid value \`${r}\` for \`--${i}\``,2)}throw new j(o?.message||"invalid options",2)}import{z as qe}from"zod";import{z as Za}from"zod";var Dm=Za.enum(["human"]),nn=Za.enum(["human","json"]),Qa=Dm.default("human"),ue=nn.default("human");var Ee=Tt.transform(e=>{let{config:t,...n}=e;return{...n,configPath:t}});var el=Ee.pipe(qe.object({configPath:qe.string().optional(),projectRoot:qe.string().optional(),noConfig:qe.boolean().optional(),quiet:qe.boolean().optional(),verbose:qe.boolean().optional(),noColor:qe.boolean().optional(),output:ue,json:qe.boolean().optional()}).merge(Ie).transform(e=>({...e,output:e.json?"json":e.output})));var tl={error:0,warning:1,info:2};function On(e,t){return e.some(n=>n.severity===h.Error||t===0&&n.severity===h.Warning)}function Dt(e){return e.flat().sort((t,n)=>{let o=t.uri.localeCompare(n.uri);if(o!==0)return o;let i=t.range?.start.offset??-1,r=n.range?.start.offset??-1;if(i!==r)return i-r;let s=tl[t.severity]-tl[n.severity];if(s!==0)return s;let a=t.code.localeCompare(n.code);return a!==0?a:t.message.localeCompare(n.message)})}function nl(e){let{sourceText:t,range:n,label:o,severity:i,colorMode:r}=e,s=[],a=n.start.line+1,l=t.split(/\r?\n/)[n.start.line]??"",d=String(a),c=d.length,p=" | ";s.push(" ".repeat(c)+p.trimEnd()),s.push(`${d}${p}${l}`);let m=n.start.character,f=n.end.character,y=m,g=f;g<=y&&(g=y+1);let S=l.slice(0,y),v=g-y,x=(S.match(/\t/g)||[]).length,D=S.length+x,P="^".repeat(Math.max(1,v)),B=re(r,i==="error"?"error":i==="warning"?"warning":"info",P),A=o?` ${re(r,"dim",o)}`:"";return s.push(" ".repeat(c)+p+" ".repeat(D)+B+A),s.push(" ".repeat(c)+p.trimEnd()),s}function Xe(e){let t=Un({noColor:e.noColor,stream:e.stream,env:process.env}),n=Dt([e.diagnostics]),o=[];for(let i of n)o.push(Rm(i,e.defaultPath,e.sourceTextByUri,t));return o.join(`
|
|
24
24
|
|
|
25
|
-
`)}function
|
|
26
|
-
`)}var
|
|
27
|
-
`,"utf8"),console.log(`Created ${t}`),{ok:!0}}var
|
|
28
|
-
`)}
|
|
29
|
-
`)}}finally{t.close()}}function kl(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 Rl(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let o=new Map(e.ports.map(r=>[r.name,r])),i=new Map(t.ports.map(r=>[r.name,r]));for(let[r,s]of o)i.has(r)||n.push({kind:"port-removed",portName:r,sourceIndex:0,port:kl(s)});for(let[r,s]of i)o.has(r)||n.push({kind:"port-added",portName:r,sourceIndex:1,port:kl(s)});for(let[r,s]of o){let a=i.get(r);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:r,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:r,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:r,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:r,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:r,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:r,left:s.description,right:a.description})}return n}function Y(e){return e==null?"undefined":typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.sort().join(";")||"empty":String(e)}function Ei(e){let t=[];for(let n of e)switch(n.kind){case"node-kind":t.push(`node-kind:${Y(n.left)}:${Y(n.right)}`);break;case"port-added":t.push(`added:${n.portName}`);break;case"port-removed":t.push(`removed:${n.portName}`);break;case"port-direction":t.push(`direction:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-type":t.push(`type:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-required":t.push(`required:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-default":t.push(`default:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-enum":t.push(`enum:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break;case"port-description":t.push(`description:${n.portName}:${Y(n.left)}:${Y(n.right)}`);break}return t.sort().join("|")}function lm(e){return"portName"in e}function Ni(e){let t=e.filter(o=>o.kind.startsWith("port-"));if(t.length===0)return e.length===1&&e[0].kind==="node-kind"?"node kind differs":`${e.length} structural differences`;let n=new Set(t.filter(lm).map(o=>o.portName));if(n.size===1){let o=Array.from(n)[0];return`${t.map(r=>r.kind.replace("port-","")).join(", ")} on \`${o}\``}return`${n.size} differing ports`}function Tl(e){return JSON.stringify({direction:e.direction,name:e.name,type:e.type??null,required:e.required,defaultValue:e.defaultValue??null,enumValues:e.enum??null,description:e.description??null})}function dm(e){return JSON.stringify({kind:e.kind,ports:e.ports.map(t=>({name:t.name,direction:t.direction,type:t.type??null,required:t.required,defaultValue:t.defaultValue??null,enum:t.enum?[...t.enum].sort():null,description:t.description??null})).sort((t,n)=>t.name.localeCompare(n.name))})}function cm(e){let t=[e.name];e.type&&t.push(`: ${e.type}`),!e.required&&e.defaultValue!==void 0&&t.push(` = "${e.defaultValue}"`);let n=t.join("");return e.direction==="output"?`${n} [output]`:e.direction==="inout"?`${n} [inout]`:n}function Dl(e){return`${e.kind} ${e.id}(${e.ports.map(cm).join(", ")})`}function Il(e){let t=new Map;for(let i of e){let r=dm(i),s=t.get(r)??[];s.push(i),t.set(r,s)}let n=Array.from(t.entries());n.sort((i,r)=>{let s=i[1][0],a=r[1][0],l=s.uri??"",d=a.uri??"";if(l!==d)return l.localeCompare(d);let c=s.range?.start.offset??0,p=a.range?.start.offset??0;return c-p});let o="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");return n.map(([i,r],s)=>{let a=o[s]??`S${s}`,l=r[0],d=r.map(c=>({definitionId:`${c.id}:${c.uri??""}:${c.range?.start.offset??0}`,uri:c.uri,sourceKind:c.source||"inline-tree-nodes-model",kind:c.kind,range:c.range,signatureKey:i,signatureId:a,signatureText:Dl(c),model:c}));return{id:a,signatureKey:i,signatureText:Dl(l),kind:l.kind,definitions:d,editableDefinitions:d.filter(c=>c.model.editable!==!1),nonEditableDefinitions:d.filter(c=>c.model.editable===!1)}})}function um(e){return/^\{[^}]+\}$/.test(e.trim())}function pm(e){return e.name==="SubTree"?e.attributes.find(n=>n.name==="ID")?.value??e.name:e.name}function Cl(e,t,n,o){let i=0;if(pm(e)===t){i++;for(let r of n){let s=o.get(r);s||(s={providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0},o.set(r,s));let a=e.attributes.find(l=>l.name===r);a?(s.providedCount++,um(a.value)?s.blackboardReferenceCount++:s.literalValues[a.value]=(s.literalValues[a.value]||0)+1):s.omittedCount++}}for(let r of e.children)r.kind==="element"&&(i+=Cl(r,t,n,o));return i}function Xn(e){let t=new Map,n=0;for(let i of e.documents)if(i.root)for(let r of i.root.children)r.kind==="element"&&r.name==="TreeNodesModel"||r.kind==="element"&&(n+=Cl(r,e.nodeId,e.candidatePorts,t));let o={};for(let i of e.candidatePorts)o[i]=t.get(i)||{providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0};return{nodeId:e.nodeId,totalUsages:n,byPort:o}}function st(e){let t={signatureId:e.signature.id,newMissingRequiredPorts:[],removedPortsUsedByUsages:[],directionChanges:[]},n=new Set(Object.keys(e.usageEvidence.byPort));for(let o of n){let i=e.usageEvidence.byPort[o],r=e.signature.definitions[0]?.model.ports.find(s=>s.name===o);r?.required&&i.omittedCount>0&&t.newMissingRequiredPorts.push({portName:o,omittedCount:i.omittedCount}),!r&&i.providedCount>0&&t.removedPortsUsedByUsages.push({portName:o,providedCount:i.providedCount})}return t}function mm(e){let t=0;for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++)ut(e[n],e[o])||t++;return t}function fm(e,t){return e.definitions.some(n=>n.model.editable===!1||n.range==null?!1:t.some(o=>o.uri===n.uri))}function El(e){let t=e.targetSignature.definitions[0];if(!t)return[];let n=e.documents.find(r=>r.uri===t.uri);if(!n||!t.range)return[];let o=n.originalText.slice(t.range.start.offset,t.range.end.offset),i=[];for(let r of e.allDefinitions)r.signatureId===e.targetSignature.id||r.model.editable===!1||r.range==null||!e.documents.find(a=>a.uri===r.uri)||i.push({uri:r.uri??"",edits:[{range:r.range,newText:o}]});return i}function Nl(e){let t=[];for(let n of e.allDefinitions)n.definitionId!==e.keepDefinition.definitionId&&n.model.editable!==!1&&n.range!=null&&t.push({uri:n.uri??"",edits:[{range:n.range,newText:""}]});return t}function gm(e){if(e.model.editable===!1)return[];let t=[],n=e.keepDefinition.range?.start.offset,o=e.model.ports.filter(i=>i.name===e.portName);for(let i of o){let r=i.range??i.nameRange;r&&(n!=null&&r.start.offset===n||t.push({uri:e.model.uri??"",edits:[{range:r,newText:""}]}))}return t}function rn(e){let t=new Set,n=0;for(let o of e)t.add(o.uri),n+=o.edits.length;return{files:t.size,definitions:n,edits:n,affectedUris:Array.from(t).sort()}}function at(e){return e.definitions===0?"edits: none":e.definitions===1&&e.files===1?"edits: 1 definition in 1 file":`edits: ${e.definitions} definition${e.definitions===1?"":"s"} in ${e.files} file${e.files===1?"":"s"}`}function wi(e){let t=[],{group:n,documents:o}=e,i=n.signatures.some(r=>r.nonEditableDefinitions.length>0);if(n.kind==="model-signature-conflict")for(let r of n.signatures){if(!fm(r,o)||n.definitions.filter(l=>l.signatureId!==r.id&&l.model.editable!==!1&&l.range!=null).length===0)continue;let a=El({targetSignature:r,allDefinitions:n.definitions,documents:o});a.length!==0&&t.push({id:`match-signature-${r.id}`,title:i?`Make editable definitions match signature ${r.id}`:`Make all definitions match signature ${r.id}`,description:`Replace editable definitions that do not match signature ${r.id}.`,kind:"match-signature",applicable:!0,targetSignatureId:r.id,workspaceEdits:a,editSummary:rn(a),usageImpact:st({signature:r,usageEvidence:n.usageEvidence})})}else if(n.kind==="duplicate-model-id"){let r=new Set;for(let s of n.definitions){if(r.has(s.signatureKey))continue;r.add(s.signatureKey);let a=Nl({keepDefinition:s,allDefinitions:n.definitions}),l=n.definitions.filter(d=>d.signatureKey===s.signatureKey).length;a.length!==0&&t.push({id:`keep-definition-${s.signatureId}`,title:l>1?"Keep the first definition and delete duplicate copies":`Keep variant ${s.signatureId} and delete duplicate \`${n.nodeId}\` definitions in this file`,description:l>1?`Keep one definition and remove ${l-1} duplicate copies.`:`Keep ${s.definitionId} and remove other duplicate definitions.`,kind:"keep-model-definition",applicable:!0,workspaceEdits:a,editSummary:rn(a)})}}else if(n.kind==="duplicate-port-name"){let r=new Set;for(let s of n.definitions){if(r.has(s.signatureKey))continue;r.add(s.signatureKey);let a=gm({model:s.model,portName:n.portName??n.nodeId,keepDefinition:s});if(a.length===0)continue;let l=n.definitions.filter(d=>d.signatureKey===s.signatureKey).length;t.push({id:`keep-port-${s.signatureId}`,title:l>1?`Keep the first \`${n.portName??n.nodeId}\` port and delete duplicate copies`:`Keep port variant ${s.signatureId} and delete other \`${n.portName??n.nodeId}\` ports`,description:l>1?`Keep one \`${n.portName??n.nodeId}\` port and remove duplicate copies.`:`Keep \`${n.portName??n.nodeId}\` port variant ${s.signatureId} and remove others.`,kind:"keep-port-definition",applicable:!0,workspaceEdits:a,editSummary:rn(a)})}}if(e.options?.canonicalSource==="model-files"){if(new Set(n.definitions.map(a=>a.kind)).size>1)return[...t,{id:"manual",title:"Manual update required",description:"No editable definitions are available for automatic repair.",kind:"manual",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}},{id:"skip",title:"Skip this model group",description:"Do not change any definitions for this node model.",kind:"skip",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}];let s=n.definitions.filter(a=>a.sourceKind==="external-tree-nodes-model");if(s.length===1){let a=s[0],l=n.signatures.find(d=>d.id===a.signatureId);if(l){if(e.options.canonicalMode==="sync"){let d=El({targetSignature:l,allDefinitions:n.definitions,documents:o});d.length>0&&t.push({id:"match-canonical-model-file",title:"Make definitions match canonical model file",description:"Replace editable non-canonical definitions with the canonical model-file definition.",kind:"match-canonical-model-file",applicable:!0,targetSignatureId:l.id,workspaceEdits:d,editSummary:rn(d),usageImpact:st({signature:l,usageEvidence:n.usageEvidence})})}if(e.options.canonicalMode==="dedupe"){let d=Nl({keepDefinition:a,allDefinitions:n.definitions});d.length>0&&t.push({id:"keep-canonical-model-file-definition",title:"Keep canonical model file definition and delete duplicates",description:"Delete editable non-canonical duplicate definitions and keep the canonical model-file definition.",kind:"keep-canonical-model-file-definition",applicable:!0,targetSignatureId:l.id,workspaceEdits:d,editSummary:rn(d),usageImpact:st({signature:l,usageEvidence:n.usageEvidence})})}}}}return t.length===0&&t.push({id:"manual",title:"Manual update required",description:"No editable definitions are available for automatic repair.",kind:"manual",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}),t.push({id:"skip",title:"Skip this model group",description:"Do not change any definitions for this node model.",kind:"skip",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}),t}function ym(e,t){let n=[];e.direction!==t.direction&&n.push({kind:"port-direction",portName:e.name,left:e.direction,right:t.direction}),e.type!==t.type&&n.push({kind:"port-type",portName:e.name,left:e.type,right:t.type}),e.required!==t.required&&n.push({kind:"port-required",portName:e.name,left:e.required,right:t.required}),e.defaultValue!==t.defaultValue&&n.push({kind:"port-default",portName:e.name,left:e.defaultValue,right:t.defaultValue});let o=e.enum?JSON.stringify([...e.enum].sort()):"",i=t.enum?JSON.stringify([...t.enum].sort()):"";return o!==i&&n.push({kind:"port-enum",portName:e.name,left:e.enum?[...e.enum].sort():void 0,right:t.enum?[...t.enum].sort():void 0}),n}function Mi(e){let t=[];for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++){let i=e[n].definitions[0]?.model,r=e[o].definitions[0]?.model;if(!i||!r)continue;let s=Rl(i,r);s.length>0&&t.push({leftSignatureId:e[n].id,rightSignatureId:e[o].id,differences:s})}return t}function Ml(e){let t=e.flatMap(r=>r.differences),n=t.some(r=>r.kind!=="port-default"),o=t.some(r=>r.kind==="port-default"),i=[];return n&&i.push("BT012_CONFLICTING_NODE_MODEL"),o&&i.push("BT107_CONFLICTING_PORT_DEFAULT"),{codes:i,severity:n?"error":"warning"}}function wl(e){let{nodeId:t,models:n,documents:o,code:i}=e;if(n.length<2)return;let r=Il(n);if(r.length<2&&i!=="BT006_DUPLICATE_NODE_MODEL_ID"&&!e.forceIncludeEquivalent)return;let s=r.flatMap(v=>v.definitions),a=mm(n),l,d;if(i==="BT006_DUPLICATE_NODE_MODEL_ID")if(r.length===1)l=["BT006_DUPLICATE_NODE_MODEL_ID"],d="error";else{let v=Mi(r),x=Ml(v);l=["BT006_DUPLICATE_NODE_MODEL_ID",...x.codes],d=x.severity}else{if(r.length<2&&e.forceIncludeEquivalent){l=[i],d="error";let D=[...new Set(s.flatMap(B=>B.model.ports.map(A=>A.name)))],M=Xn({nodeId:t,documents:o,candidatePorts:D}),P={id:`model-group:${t}:equivalent`,kind:e.kind??"model-signature-conflict",nodeId:t,displayName:t,codes:l,severity:d,definitions:s,signatures:r,differences:[],usageEvidence:M,differencePattern:{key:"equivalent",label:"equivalent signatures"},pairwiseConflictCount:a};return{...P,actions:wi({group:P,documents:o,options:e.options}),usageImpacts:r.map(B=>st({signature:B,usageEvidence:P.usageEvidence}))}}let v=Mi(r),x=Ml(v);if(l=x.codes,d=x.severity,l.length===0)return}let c=[...new Set(s.flatMap(v=>v.model.ports.map(x=>x.name)))],p=Xn({nodeId:t,documents:o,candidatePorts:c}),m=Mi(r),f=m.flatMap(v=>v.differences),y=Ei(f),g=Ni(f),S={id:`model-group:${t}:${y}`,kind:e.kind??(i==="BT006_DUPLICATE_NODE_MODEL_ID"?"duplicate-model-id":"model-signature-conflict"),nodeId:t,displayName:t,codes:l,severity:d,definitions:s,signatures:r,differences:m,usageEvidence:p,differencePattern:{key:y,label:g},pairwiseConflictCount:a};return{...S,actions:wi({group:S,documents:o,options:e.options}),usageImpacts:r.map(v=>st({signature:v,usageEvidence:p}))}}function hm(e,t){let n=[];for(let o of yt(e)){let i=new Map;for(let r of o.treeNodesModel){let s=i.get(r.id)??[];s.push(r),i.set(r.id,s)}for(let[r,s]of i){if(s.length<2)continue;let a=wl({nodeId:r,models:s,documents:t,code:"BT006_DUPLICATE_NODE_MODEL_ID",kind:"duplicate-model-id"});a&&n.push(a)}}return n}function bm(e){let{model:t,portName:n,ports:o,documents:i}=e,r=new Map;for(let m of o){let f=Tl(m),y=r.get(f)??[];y.push(m),r.set(f,y)}let s=Array.from(r.entries()).sort((m,f)=>(m[1][0]?.range?.start.offset??0)-(f[1][0]?.range?.start.offset??0)),a="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),l=[];for(let m=0;m<s.length;m++){let[f,y]=s[m],g=a[m]??`S${m}`,S=y[0],v=`${t.kind} ${t.id}(${S.direction} ${S.name}${S.type?`: ${S.type}`:""}${S.defaultValue?` = "${S.defaultValue}"`:""})`,x=y.map((D,M)=>{let P=D.range??D.nameRange;return{definitionId:`${t.id}:${t.uri??""}:${t.range?.start.offset??0}:port:${n}:${P?.start.offset??M}`,uri:t.uri,sourceKind:t.source||"inline-tree-nodes-model",kind:t.kind,range:P,signatureKey:f,signatureId:g,signatureText:v,model:t}});l.push({id:g,signatureKey:f,signatureText:v,kind:t.kind,definitions:x,editableDefinitions:x.filter(D=>D.model.editable!==!1),nonEditableDefinitions:x.filter(D=>D.model.editable===!1)})}let d=[];for(let m=0;m<l.length;m++)for(let f=m+1;f<l.length;f++){let y=l[m].definitions[0]?.model.ports.find(v=>{let x=v.range??v.nameRange,D=l[m].definitions[0]?.range;return x&&D&&x.start.offset===D.start.offset}),g=l[f].definitions[0]?.model.ports.find(v=>{let x=v.range??v.nameRange,D=l[f].definitions[0]?.range;return x&&D&&x.start.offset===D.start.offset});if(!y||!g)continue;let S=ym(y,g);S.length>0&&d.push({leftSignatureId:l[m].id,rightSignatureId:l[f].id,differences:S})}let c=d.flatMap(m=>m.differences),p={id:`duplicate-port:${t.id}:${n}:${t.uri??""}:${o[0]?.range?.start.offset??0}`,kind:"duplicate-port-name",nodeId:t.id,portName:n,displayName:`${t.id}.${n}`,codes:["BT008_DUPLICATE_PORT_NAME"],severity:"error",definitions:l.flatMap(m=>m.definitions),signatures:l,differences:d,usageEvidence:Xn({nodeId:t.id,documents:i,candidatePorts:[n]}),differencePattern:{key:Ei(c),label:Ni(c)},pairwiseConflictCount:Math.max(1,o.length-1)};return{...p,actions:wi({group:p,documents:i}),usageImpacts:l.map(m=>st({signature:m,usageEvidence:p.usageEvidence}))}}function vm(e,t){let n=[];for(let o of yt(e))for(let i of o.treeNodesModel){let r=new Map;for(let s of i.ports){let a=r.get(s.name)??[];a.push(s),r.set(s.name,a)}for(let[s,a]of r){if(a.length<2)continue;let l=bm({model:i,portName:s,ports:a,documents:t});l&&n.push(l)}}return n}function Sm(e){let t=new Set;for(let n of yt(e)){let o=new Map;for(let i of n.treeNodesModel){let r=o.get(i.id)??[];r.push(i),o.set(i.id,r)}for(let[i,r]of o)r.length>=2&&t.add(i)}return t}function xm(e){let t=qt($t(e)),n=new Map;for(let[o,i]of t)n.set(o,i.map(r=>r.model));return n}function Gn(e){let t=[],n=Sm(e.workspace);for(let[o,i]of xm(e.workspace)){if(i.length<2||n.has(o))continue;let r=wl({nodeId:o,models:i,documents:e.documents,code:e.options?.includeConventionGroups===!0?"BT122_DUPLICATE_MODEL_DEFINITION":"BT012_CONFLICTING_NODE_MODEL",forceIncludeEquivalent:e.options?.includeConventionGroups===!0,options:e.options});r&&t.push(r)}return t.push(...hm(e.workspace,e.documents)),t.push(...vm(e.workspace,e.documents)),t}function zn(e){return e.applicable===!0}function Pl(e){return e.actions.filter(zn)}function Bl(e){return e.actions.filter(t=>t.kind==="manual")}function _l(e){return{signatureConflictGroups:e.filter(t=>t.kind==="model-signature-conflict").length,duplicateModelGroups:e.filter(t=>t.kind==="duplicate-model-id").length,duplicatePortGroups:e.filter(t=>t.kind==="duplicate-port-name").length,pairwiseSignatureConflicts:e.filter(t=>t.kind==="model-signature-conflict").reduce((t,n)=>t+n.pairwiseConflictCount,0)}}function km(e){switch(e.kind){case"duplicate-port-name":return`1 model definition, ${e.definitions.length} duplicate ports, ${e.signatures.length} variants`;case"duplicate-model-id":return`1 file, ${e.definitions.length} duplicate model definitions, ${e.signatures.length} variants`;case"model-signature-conflict":return`${e.definitions.length} definitions, ${e.signatures.length} signatures`}}function Al(e){let t=e.usageEvidence.totalUsages,n=[];if(n.push(`${e.displayName} usages: ${t}`),t===0)return n.push(" no usage evidence available"),n;for(let[o,i]of Object.entries(e.usageEvidence.byPort)){let r=[];r.push(`provided ${i.providedCount}/${t}`),i.blackboardReferenceCount>0&&r.push(`blackboard refs ${i.blackboardReferenceCount}`),n.push(` ${o}: ${r.join(", ")}`)}return n}function jl(e){let t=[];if(e.newMissingRequiredPorts.length>0)for(let n of e.newMissingRequiredPorts)t.push(`would produce ${n.omittedCount} missing required-port report${n.omittedCount===1?"":"s"} for \`${n.portName}\``);if(e.removedPortsUsedByUsages.length>0)for(let n of e.removedPortsUsedByUsages)t.push(`\`${n.portName}\` is used in ${n.providedCount} usage${n.providedCount===1?"":"s"} but is not defined by this signature`);if(e.directionChanges.length>0)for(let n of e.directionChanges)t.push(`changes \`${n.portName}\` direction from ${n.from} to ${n.to}`);return t.length===0?"no existing usage omits required ports in this signature":t.join("; ")}function Fl(e){let t=[];for(let n of e.differences){t.push(` ${n.leftSignatureId} vs ${n.rightSignatureId}:`);for(let o of n.differences)switch(o.kind){case"node-kind":t.push(` node kind: ${n.leftSignatureId}: ${o.left}, ${n.rightSignatureId}: ${o.right}`);break;case"port-added":t.push(` ${o.portName}: ${n.rightSignatureId}: exists, ${n.leftSignatureId}: not defined`);break;case"port-removed":t.push(` ${o.portName}: ${n.leftSignatureId}: exists, ${n.rightSignatureId}: not defined`);break;case"port-direction":t.push(` ${o.portName}: ${n.leftSignatureId}: ${o.left}, ${n.rightSignatureId}: ${o.right}`);break;case"port-type":t.push(` ${o.portName}: ${n.leftSignatureId}: type ${o.left??"not specified"}, ${n.rightSignatureId}: type ${o.right??"not specified"}`);break;case"port-required":t.push(` ${o.portName}: ${n.leftSignatureId}: ${o.left?"required":"optional"}, ${n.rightSignatureId}: ${o.right?"required":"optional"}`);break;case"port-default":t.push(` ${o.portName}: ${n.leftSignatureId}: default ${o.left??"not set"}, ${n.rightSignatureId}: default ${o.right??"not set"}`);break;case"port-enum":t.push(` ${o.portName}: ${n.leftSignatureId}: enum ${o.left?.join(";")??"not set"}, ${n.rightSignatureId}: enum ${o.right?.join(";")??"not set"}`);break;case"port-description":{let i=r=>r?r.length>120?`${r.slice(0,120)}...`:r:"not set";t.push(` - port \`${o.portName}\` description differs`,` ${n.leftSignatureId}: "${i(o.left)}"`,` ${n.rightSignatureId}: "${i(o.right)}"`);break}}}return t}function Pi(e,t){let n=[],o=t?.index!==void 0?`[${t.index}${t.total?`/${t.total}`:""}] `:"";n.push(`${o}${e.displayName}`),n.push(""),e.kind==="duplicate-port-name"?n.push(`1 model definition contains ${e.definitions.length} ports named \`${e.portName??e.nodeId}\`.`):e.kind==="duplicate-model-id"?n.push(`1 file contains ${e.definitions.length} definitions with ID \`${e.nodeId}\`.`):n.push(`${e.definitions.length} definitions have ${e.signatures.length} signatures.`),n.push(`codes: ${e.codes.join(", ")}`),n.push("");for(let s of e.signatures){let a=e.kind==="duplicate-port-name"?"port variant":e.kind==="model-signature-conflict"?"signature":"variant";n.push(`${a} ${s.id}`),n.push(` ${s.signatureText}`),n.push(" locations:");for(let l of s.definitions){let d=l.range?`${l.uri??""}:${l.range.start.line+1}:${l.range.start.character+1}`:l.uri??"unknown";n.push(` ${d}`)}n.push("")}if(e.differences.length>0&&(n.push("differences:"),n.push(...Fl(e)),n.push("")),n.push("usage:"),n.push(...Al(e).map(s=>` ${s}`)),n.push(""),e.usageImpacts.length>0){n.push("usage check:");for(let s of e.usageImpacts)n.push(` choose ${s.signatureId}: ${jl(s)}`);n.push("")}let i=Pl(e);if(i.length>0){n.push("actions:");for(let s=0;s<i.length;s++){let a=i[s];n.push(` ${s+1}. ${a.title}`);let l=at(a.editSummary);if(l!=="edits: none"&&n.push(` ${l}`),a.warnings)for(let d of a.warnings)n.push(` warning: ${d}`)}n.push("")}let r=Bl(e);if(r.length>0){n.push("manual:");for(let s of r)if(n.push(` ${s.description}`),s.warnings)for(let a of s.warnings)n.push(` warning: ${a}`);n.push("")}return n.join(`
|
|
30
|
-
`)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
`)
|
|
25
|
+
`)}function Rm(e,t,n,o){let i=[],r=e.suppressed?"info":e.severity,s=e.suppressed?" [suppressed]":"",a=r==="error"?"error":r==="warning"?"warning":"info",l=xo(e.code),d=l?` ${l}:`:":";i.push(`${re(o,a,r)}[${e.code}]${d} ${e.message}${s}`);let c=e.uri||t;if(c&&(e.range?i.push(` --> ${re(o,"dim",`${c}:${e.range.start.line+1}:${e.range.start.character+1}`)}`):i.push(` --> ${re(o,"dim",c)}`)),e.range&&n){let p=n.get(e.uri)||n.get(t||"");p&&i.push(...nl({sourceText:p,range:e.range,label:e.details?.primaryLabel,severity:e.severity,colorMode:o}))}if(e.details?.help&&i.push(`${re(o,"help","help:")} ${e.details.help}`),e.details?.notes)for(let p of e.details.notes)i.push(`${re(o,"note","note:")} ${p}`);if(e.relatedInformation)for(let p of e.relatedInformation){let m=p.range?`${p.uri}:${p.range.start.line+1}:${p.range.start.character+1}`:p.uri;i.push(`${re(o,"note","note:")} ${m}: ${p.message}`)}return i.join(`
|
|
26
|
+
`)}var Be="0.1.5";function on(e){return Dt([e.projectDiagnostics,e.files.flatMap(t=>t.diagnostics)])}function rn(e){let t=on(e);return{files:e.files.length,errors:t.filter(n=>n.severity==="error").length,warnings:t.filter(n=>n.severity==="warning").length,infos:t.filter(n=>n.severity==="info").length,suppressed:0,baselineFiltered:0}}function $n(e,t,n="human",o){return n!=="human"?"":Xe({diagnostics:t,defaultPath:e,sourceTextByUri:o})}function Vn(e,t="human",n){return e.length===0||t!=="human"?"":Xe({diagnostics:e,sourceTextByUri:n})}function qn(e){let t=[...e.files].map(i=>{let{sourceText:r,rawDiagnostics:s,formatted:a,...l}=i;return{...l,diagnostics:Dt([l.diagnostics])}}).sort((i,r)=>i.path.localeCompare(r.path)),n=Dt([e.projectDiagnostics??[]]),o=rn({projectDiagnostics:n,files:t});return JSON.stringify({ok:e.ok,version:2,schemaVersion:"2",toolVersion:Be,project:{},projectDiagnostics:n,files:t,summary:{...o,suppressed:e.summary?.suppressed||0,baselineFiltered:e.summary?.baselineFiltered||0},...e.fixes?{fixes:e.fixes}:{}},null,2)}function Xn(e,t,n,o,i,r,s){if(e)return`ok: ${o==="lint"?"linted":"checked"} ${t} files`;let a=o==="lint"?"lint":"check";return s&&i===0&&r>0?`error: ${a} failed with 0 errors and ${r} warnings treated as errors in ${t} files`:`error: ${a} failed with ${i} errors and ${r} warnings in ${t} files`}function Gn(e){return!e||e===0?"":`note: ${e} stale baseline entries were found`}function ol(e){return Xe({diagnostics:[{code:"BTXML_FORMAT",severity:"error",message:"file is not formatted",uri:e,details:{help:`run \`btxmlc format ${e}\``}}]})}async function il(e,t){let n=Ci(e),o=!!(n&&Cm.existsSync(n)),r=(await at({project:e,resolveGraph:!0})).includeGraph?.issues??[],s=r.filter(d=>d.kind==="not-found"),a=t.output??"human";if(a!=="human"&&a!=="json")return console.error(`Invalid --output: ${a}`),{ok:!1};let l={version:1,packageVersion:Be,cliVersion:Be,lspVersion:Be,configPath:n,configFound:o,configValid:o,projectRoot:ce(e),selectedFiles:K(e).length,ignoredFiles:fi(e).length,externalModels:Z(e).length,nodeDefinitions:lt(e).length,includeGraphStatus:r.length===0?"ok":"has-diagnostics",missingIncludes:s.length,missingExternalModels:0,missingNodeDefinitions:0,workspaceHealth:r.length===0&&s.length===0?"healthy":"issues-found",hints:[Z(e).length===0?"No external TreeNodesModel files configured":void 0,lt(e).length===0?"No node definition files configured":void 0,"VS Code: install packaged VSIX or run extension tests for editor integration checks"].filter(Boolean)};if(a==="json")console.log(JSON.stringify(l,null,2));else{console.log(`Package version: ${l.packageVersion}`),console.log(`CLI version: ${l.cliVersion}`),console.log(`Project root: ${l.projectRoot}`),console.log(`Config path: ${l.configPath||"none"}`),console.log(`Config found: ${l.configFound}`),console.log(`Selected files: ${l.selectedFiles}`),console.log(`Ignored files: ${l.ignoredFiles}`),console.log(`External models: ${l.externalModels}`),console.log(`Node definitions: ${l.nodeDefinitions}`),console.log(`Include graph: ${l.includeGraphStatus}`),console.log(`Missing includes: ${l.missingIncludes}`),console.log(`Missing external models: ${l.missingExternalModels}`),console.log(`Missing node definitions: ${l.missingNodeDefinitions}`),console.log(`Workspace health: ${l.workspaceHealth}`);for(let d of l.hints)console.log(`Hint: ${d}`)}return{ok:!0}}var rl={command:"doctor [files..]",describe:"Diagnose workspace health",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}),handler:async e=>{let t=W(el,e);process.exitCode=await sl(t)}};import{z as al}from"zod";var ll=Tt.extend({rule:al.string().optional(),output:ue,json:al.boolean().optional()}).transform(e=>({...e,output:e.json?"json":e.output}));function Im(e){let t=hn(e);if(t)return t;let n=e.toUpperCase(),o=ko().filter(i=>i.startsWith(n));if(o.length===1)return hn(o[0]);if(o.length>1)return{ambiguity:o}}function dl(e){if(!e)return console.error("explain requires a rule code"),{ok:!1};let t=Im(e);if(t&&"ambiguity"in t){console.error(`Ambiguous rule prefix: ${e}`);for(let n of t.ambiguity)console.error(` ${n}`);return{ok:!1}}return t?(console.log(`Rule: ${t.code}`),console.log(`Default severity: ${t.defaultSeverity}`),console.log(t.description),t.invalidExample&&console.log(`Invalid: ${t.invalidExample}`),t.validExample&&console.log(`Valid: ${t.validExample}`),t.fix&&console.log(`Fix: ${t.fix}`),t.configExample&&console.log(`Config: ${t.configExample}`),{ok:!0}):(console.error(`Unknown rule: ${e}`),{ok:!1})}var cl={command:"explain [rule]",describe:"Show rule documentation",builder:e=>e.positional("rule",{type:"string"}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}),handler:async e=>{let t=W(ll,e);process.exitCode=await ul(t)}};import ml from"fs";import Em from"path";import{z as Pi}from"zod";var pl=Tt.extend({type:Pi.string().optional(),force:Pi.boolean().optional(),output:ue,json:Pi.boolean().optional()}).transform(e=>({...e,output:e.json?"json":e.output}));function fl(e){let t=Em.resolve(process.cwd(),"btxml.config.json");if(ml.existsSync(t)&&!e.force)return console.error("btxml.config.json already exists; use --force to overwrite"),{ok:!1,usage:!0};let n=gn();return ml.writeFileSync(t,`${JSON.stringify(n,null,2)}
|
|
27
|
+
`,"utf8"),console.log(`Created ${t}`),{ok:!0}}var gl={command:"init",describe:"Create a new btxml.config.json",builder:e=>e.option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("type",{type:"string"}).option("force",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}),handler:async e=>{let t=W(pl,e);process.exitCode=await yl(t)}};import xl from"fs";import Ge from"path";import{pathToFileURL as Mm}from"url";import{z as hl}from"zod";var bl=hl.object({stdio:hl.boolean().optional()}).transform(e=>({...e,stdio:e.stdio??!1}));function Nm(){let e=process.argv[1]?Ge.dirname(Ge.resolve(process.argv[1])):process.cwd(),t=[Ge.resolve(e,"server.cjs"),Ge.resolve(e,"..","server.cjs"),Ge.resolve(e,"..","btxml-checker","dist","server.cjs"),Ge.resolve(e,"..","btxml-checker-monorepo","dist","server.cjs"),Ge.resolve(process.cwd(),"dist","server.cjs"),Ge.resolve(process.cwd(),"packages","btxml-lsp","dist","server.cjs")];return t.find(n=>xl.existsSync(n))||t[0]}async function Sl(e){let t=Nm();if(!xl.existsSync(t))throw new Error(`LSP server build not found: ${t}. Run \`pnpm build\`.`);return await import(Mm(t).href),{ok:!0}}var vl={command:"language-server",describe:!1,builder:e=>e.option("stdio",{type:"boolean"}),handler:async e=>{let t=W(bl,e);process.exitCode=await kl(t)}};import Rt from"fs";import wi from"path";function ee(e){return Rt.readFileSync(e,"utf8")}function Ct(e,t){let n=wi.dirname(e),o=wi.join(n,`.${wi.basename(e)}.${process.pid}.tmp`);try{let i=Rt.statSync(e);if(i.isSymbolicLink())throw new Error(`Refusing to format symbolic link: ${e}`);Rt.writeFileSync(o,t,"utf8"),Rt.chmodSync(o,i.mode),Rt.renameSync(o,e)}catch(i){try{Rt.unlinkSync(o)}catch{}throw i}}async function Tl(e){let t=new Map,n=new Map;for(let[o,i]of e.plan.editsByUri){let r=e.readText(o),s=[...i].sort((l,d)=>d.range.start.offset-l.range.start.offset),a=Nt(r,s);t.set(o,r),n.set(o,a),e.writeText(o,a)}return{originalTextByUri:t,fixedTextByUri:n}}function Pm(e){let t=e.range?.start.offset??-1,n=e.range?.end.offset??-1;return[e.code,e.uri,t,n,e.message].join(":")}function zn(e){return{id:e.id,uri:e.uri,diagnosticCode:e.diagnostic.code,diagnosticRule:e.diagnostic.rule,diagnosticSeverity:e.diagnostic.severity,diagnosticMessage:e.diagnostic.message,safety:e.safety,title:e.title,description:e.description,edits:[...e.edits],source:{kind:"diagnostic",diagnosticFingerprint:Pm(e.diagnostic)},metadata:e.metadata}}function It(e){return e.replaceAll("&","&").replaceAll('"',""").replaceAll("<","<").replaceAll(">",">").replaceAll("'","'")}function wm(e){return e==="output"?"output_port":e==="inout"?"inout_port":"input_port"}function Bm(e,t){let n=[`name="${It(e.name)}"`,...e.type?[`type="${It(e.type)}"`]:[],...e.defaultValue?[`default="${It(e.defaultValue)}"`]:[],...e.description?[`description="${It(e.description)}"`]:[],...e.enum?.length?[`enum="${It(e.enum.map(String).join(";"))}"`]:[]];return`${t}<${wm(e.direction)} ${n.join(" ")}/>`}function Dl(e,t=""){let n=It(e.id);if(e.ports.length===0)return`${t}<${e.kind} ID="${n}"/>`;let o=`${t} `;return[`${t}<${e.kind} ID="${n}">`,...e.ports.map(r=>Bm(r,o)),`${t}</${e.kind}>`].join(`
|
|
28
|
+
`)}function Rl(e,t){let n=e.lastIndexOf(`
|
|
29
|
+
`,Math.max(0,t-1))+1,o=n;for(;o<e.length;){let i=e[o];if(i!==" "&&i!==" ")break;o+=1}return e.slice(n,o)}function _m(e){let t=e.root;if(t){if(t.name==="TreeNodesModel")return t;if(t.name==="root")return t.children.find(n=>n.kind==="element"&&n.name==="TreeNodesModel")}}function Am(e){if(e.root?.name==="root"&&!e.root.attributes.some(t=>t.name==="BTCPP_format")){if(e.root.nameRange)return e.root.nameRange.end.offset;if(e.root.openTagRange)return e.root.openTagRange.start.offset+5}}function Fm(e){let t=new Map,n=new Map;for(let i of e.diagnostics){if(i.code!=="BT002_MISSING_BTCPP_FORMAT")continue;let r=e.documents.find(l=>l.uri===i.uri);if(!r)continue;let s=Am(r);if(s===void 0)continue;let a=t.get(r.uri)??[];a.push({range:{start:{line:0,character:0,offset:s},end:{line:0,character:0,offset:s}},newText:' BTCPP_format="4"'}),t.set(r.uri,a),n.set(r.uri,i)}let o=[];for(let[i,r]of t){let s=n.get(i);s&&o.push(zn({id:`BT002:${i}`,uri:i,diagnostic:s,safety:"safe",title:'Insert BTCPP_format="4"',edits:r}))}return o}function jm(e){if(e.code!=="BT121_UNUSED_MODEL_DEFINITION")return;let t=e.data;if(!t||typeof t!="object")return;let n=t.fix;if(!n||typeof n!="object")return;let o=n;if(o.kind==="delete-definition"&&!(!o.uri||!o.range))return zn({id:`BT121:${o.uri}:${o.range.start.offset}:${o.range.end.offset}`,uri:o.uri,diagnostic:e,safety:"unsafe",title:"Remove unused inline model definition",edits:[{range:o.range,newText:""}]})}function Lm(e){if(e.code!=="BT122_DUPLICATE_MODEL_DEFINITION")return[];let t=e.data;if(!t||typeof t!="object")return[];let n=t.fix;if(!n||typeof n!="object")return[];let o=n;if(o.kind!=="delete-non-canonical-definitions")return[];let i=new Map;for(let s of o.delete??[]){if(!s.uri||!s.range)continue;let a=i.get(s.uri)??[];a.push({range:s.range,newText:""}),i.set(s.uri,a)}let r=[];for(let[s,a]of i){let l=a.map(d=>`${d.range.start.offset}-${d.range.end.offset}`).join(",");r.push(zn({id:`BT122:${s}:${l}`,uri:s,diagnostic:e,safety:"safe",title:"Remove non-canonical duplicate model definitions",edits:a}))}return r}function Um(e){let t=new Map;for(let n of e){if(n.code!=="BT123_MISSING_LOCAL_MODEL_DEFINITION")continue;let o=n.data;if(!o||typeof o!="object")continue;let i=o.fix;if(!i||typeof i!="object")continue;let r=i;if(r.kind!=="add-local-definition"||!r.uri||!r.model||!r.nodeId)continue;let s=t.get(r.uri)??{models:[],diagnostic:n};s.models.some(a=>a.id===r.nodeId)||s.models.push(r.model),t.set(r.uri,s)}return t.size>0?t:void 0}function Om(e,t,n,o){let i=Rl(t.originalText,n.openTagRange.start.offset),r=`${i} `,s=o.map(a=>Dl(a,r)).join(`
|
|
30
|
+
`);if(n.closeTagRange)return{range:{start:{line:0,character:0,offset:n.closeTagRange.start.offset},end:{line:0,character:0,offset:n.closeTagRange.start.offset}},newText:`
|
|
31
|
+
${s}
|
|
32
|
+
${i}`};if(n.selfClosing){let a=n.openTagRange.end.offset;return a<2?void 0:{range:{start:{line:0,character:0,offset:a-2},end:{line:0,character:0,offset:a}},newText:`>
|
|
33
|
+
${s}
|
|
34
|
+
${i}</TreeNodesModel>`}}}function $m(e,t){if(e.root?.name!=="root"||!e.root.closeTagRange)return;let o=`${Rl(e.originalText,e.root.openTagRange.start.offset)} `,i=`${o} `,r=t.map(s=>Dl(s,i)).join(`
|
|
35
|
+
`);return{range:{start:{line:0,character:0,offset:e.root.closeTagRange.start.offset},end:{line:0,character:0,offset:e.root.closeTagRange.start.offset}},newText:`
|
|
36
|
+
|
|
37
|
+
${o}<TreeNodesModel>
|
|
38
|
+
${r}
|
|
39
|
+
${o}</TreeNodesModel>`}}function Vm(e){let t=Um(e.diagnostics);if(!t)return[];let n=[];for(let[o,{models:i,diagnostic:r}]of t){if(i.length===0)continue;let s=e.documents.find(d=>d.uri===o);if(!s?.root)continue;let a=_m(s),l;a&&(l=Om(o,s,a,i)),l||(l=$m(s,i)),l&&n.push(zn({id:`BT123:${o}:${i.map(d=>d.id).sort((d,c)=>d.localeCompare(c)).join(",")}`,uri:o,diagnostic:r,safety:"unsafe",title:"Add missing local model definition",edits:[l]}))}return n}function Cl(e){let t=e.diagnostics.flatMap(n=>{let o=jm(n);return[...o?[o]:[],...Lm(n)]});return[...Fm(e),...t,...Vm({diagnostics:e.diagnostics,documents:e.documents})]}function qm(e,t){let n=t.range.start.offset,o=t.range.end.offset;return Number.isInteger(n)&&Number.isInteger(o)&&n>=0&&o>=n&&o<=e.length}function Xm(e,t){return e.range.start.offset===e.range.end.offset&&t.range.start.offset===t.range.end.offset&&e.range.start.offset===t.range.start.offset?!0:e.range.start.offset<t.range.end.offset&&t.range.start.offset<e.range.end.offset}function Il(e){return e==="error"?0:e==="warning"?1:2}function El(e){return e==="safe"?0:1}function Ml(e){return e.edits.reduce((t,n)=>t+(n.range.end.offset-n.range.start.offset),0)}function Nl(e){return e.edits.length===0?Number.POSITIVE_INFINITY:Math.min(...e.edits.map(t=>t.range.start.offset))}function Gm(e,t){let n=El(e.safety)-El(t.safety);if(n!==0)return n;let o=Il(e.diagnosticSeverity)-Il(t.diagnosticSeverity);if(o!==0)return o;let i=Ml(e)-Ml(t);if(i!==0)return i;let r=e.uri.localeCompare(t.uri);if(r!==0)return r;let s=Nl(e)-Nl(t);if(s!==0)return s;let a=e.diagnosticCode.localeCompare(t.diagnosticCode);return a!==0?a:e.id.localeCompare(t.id)}function Pl(e){let t=[],n=[];for(let s of e.candidates){if(s.edits.length===0){t.push({candidate:s,reason:"empty-edit"});continue}if(s.safety==="unsafe"&&!e.unsafe){t.push({candidate:s,reason:"unsafe-not-enabled"});continue}let a=e.textByUri.get(s.uri);if(a===void 0){t.push({candidate:s,reason:"stale-document"});continue}if(!s.edits.every(l=>qm(a,l))){t.push({candidate:s,reason:"invalid-range"});continue}n.push(s)}let o=[...n].sort(Gm),i=[],r=new Map;for(let s of o){let a=r.get(s.uri)??[],l=new Set;for(let d of s.edits)for(let c of a)if(Xm(d,c)){let p=i.find(m=>m.edits.some(f=>m.uri===s.uri&&f.range.start.offset===c.range.start.offset&&f.range.end.offset===c.range.end.offset&&f.newText===c.newText));p&&l.add(p.id)}if(l.size>0){t.push({candidate:s,reason:"overlap",conflictsWith:[...l].sort((d,c)=>d.localeCompare(c))});continue}i.push(s),r.set(s.uri,[...a,...s.edits])}for(let[s,a]of r)r.set(s,[...a].sort((l,d)=>d.range.start.offset-l.range.start.offset));return{pass:e.pass,applied:i,skipped:t,editsByUri:r,touchedUris:new Set([...r.keys()])}}function Bi(e,t="s"){return e===1?"":t}function zm(e){if(!(e.unsafe||e.unsafeSkippedDiagnostics<=0))return`skipped ${e.unsafeSkippedDiagnostics} unsafe fix${Bi(e.unsafeSkippedDiagnostics,"es")}; rerun with --fix --unsafe to apply them`}function Km(e){if(!(e.unsafeAppliedDiagnostics<=0))return`applied ${e.unsafeAppliedDiagnostics} unsafe fix${Bi(e.unsafeAppliedDiagnostics,"es")}`}function Wm(e){return e.circularFixesDetected?"stopped autofix because a circular fix pattern was detected":void 0}function Hm(e){if(!e.dryRun||!e.fixedTextByPath)return;let t=Object.keys(e.fixedTextByPath).length;return`dry-run preview prepared for ${t} file${Bi(t)}`}function wl(e){return{enabled:e.enabled,unsafe:e.unsafe,dryRun:e.dryRun,maxPasses:e.maxPasses,passes:0,circularFixesDetected:!1,appliedDiagnostics:0,appliedEdits:0,changedFiles:0,unsafeAppliedDiagnostics:0,unsafeSkippedDiagnostics:0,skipped:[]}}function Bl(e){if(!e.enabled)return[];let n=[`${e.dryRun?"would fix":"fixed"} ${e.appliedDiagnostics} problem${e.appliedDiagnostics===1?"":"s"} with ${e.appliedEdits} edit${e.appliedEdits===1?"":"s"} in ${e.changedFiles} file${e.changedFiles===1?"":"s"}`,`autofix passes: ${e.passes}/${e.maxPasses}`],o=[zm(e),Km(e),Wm(e),Hm(e)].filter(i=>!!i);return[...n,...o]}function _l(e,t){let o=[...K(e),...Z(e)].find(i=>i.uri===t||i.absolutePath===t||i.path===t);return o?.absolutePath?o.absolutePath:t.startsWith("file://")?ie(t):t}function Al(e,t){let o=[...K(e),...Z(e)].find(i=>i.uri===t||i.absolutePath===t||i.path===t);return o?.path?o.path:o?.absolutePath?o.absolutePath:t}function Jm(e){return e.uris.map(t=>`${t}:${e.readTextByUri(t)}`).sort((t,n)=>t.localeCompare(n)).join(`
|
|
40
|
+
`)}function Ym(e){let t=new Set((e.suppressedDiagnostics??[]).map(i=>[i.code,i.uri,i.range?.start.offset??-1,i.range?.end.offset??-1,i.message].join(":"))),n=new Set((e.baselineDiagnostics??[]).map(i=>[i.code,i.uri,i.range?.start.offset??-1,i.range?.end.offset??-1,i.message].join(":")));return[...e.projectDiagnostics,...e.files.flatMap(i=>i.diagnostics)].filter(i=>{if(i.suppressed)return!1;let r=[i.code,i.uri,i.range?.start.offset??-1,i.range?.end.offset??-1,i.message].join(":");return!(t.has(r)||n.has(r))})}function Zm(e){let t=new Map;for(let n of e)t.set(n.uri,n);return[...t.values()]}function Qm(e){return`${e.code}\0${e.uri}\0${e.reason}\0${e.title}`}function _i(e){for(let t of e.entries){let n=Qm(t);e.dedupeKeys.has(n)||(e.dedupeKeys.add(n),e.summary.skipped.push(t))}e.summary.unsafeSkippedDiagnostics=e.summary.skipped.filter(t=>t.reason==="unsafe-not-enabled").length}function ef(e){return e.skipped.map(t=>({code:t.candidate.diagnosticCode,uri:t.candidate.uri,reason:t.reason,title:t.candidate.title}))}function sn(e){e.options.dryRun&&(e.summary.fixedTextByPath=Object.fromEntries([...e.changedUris].sort((t,n)=>t.localeCompare(n)).map(t=>[e.toDisplayPath(t),e.readCurrentText(t)])))}function tf(e){_i({summary:e.summary,dedupeKeys:e.dedupeKeys,entries:e.plan.applied.map(t=>({code:t.diagnosticCode,uri:t.uri,reason:"parse-failed",title:t.title}))});for(let[t,n]of e.originalTextByUri)e.writeCurrentText(t,n)}function nf(e){if(!e.options.formatAfterFix)return{ok:!0};for(let[t,n]of e.fixedTextByUri){let o=e.formatText({uri:t,text:n});if(o){if(!o.ok||o.skipped||!o.text)return{ok:!1};if(e.parseHasErrors({uri:t,text:o.text}))return{ok:!1};e.fixedTextByUri.set(t,o.text),e.writeCurrentText(t,o.text)}}return{ok:!0}}function of(e){_i({summary:e.summary,dedupeKeys:e.dedupeKeys,entries:e.plan.applied.map(t=>({code:t.diagnosticCode,uri:t.uri,reason:"formatter-failed",title:t.title}))});for(let[t,n]of e.originalTextByUri)e.writeCurrentText(t,n)}function rf(e){return[...e.fixedTextByUri.entries()].filter(([t,n])=>n!==e.originalTextByUri.get(t)).map(([t])=>t)}function sf(e){let t=[...e.plan.touchedUris].sort((o,i)=>o.localeCompare(i)),n=Jm({uris:t,readTextByUri:e.readCurrentText});return e.seenHashes.has(n)?!0:(e.seenHashes.add(n),!1)}async function af(e){let t=e.options.maxPasses??10,n=wl({enabled:!0,unsafe:e.options.unsafe,dryRun:e.options.dryRun,maxPasses:t}),o=new Set,i=new Set,r=new Set,s=await e.getState(),a=s.result;for(let l=1;l<=t;l++){n.passes=l;let d=Ym(a),c=Zm([...s.documents,...s.externalModelDocuments]),p=e.getCandidates({documents:c,diagnostics:d}),m=new Map(c.map(x=>[x.uri,x.originalText])),f=Pl({pass:l,candidates:p,textByUri:m,unsafe:e.options.unsafe});if(_i({summary:n,dedupeKeys:i,entries:ef(f)}),f.applied.length===0)return n.changedFiles=r.size,sn({options:e.options,summary:n,changedUris:r,readCurrentText:e.readCurrentText,toDisplayPath:e.toDisplayPath}),{result:a,summary:n};let y=await e.applyPlan({plan:f,readText:e.readCurrentText,writeText:e.writeCurrentText});if([...y.fixedTextByUri.entries()].some(([x,D])=>e.parseHasErrors({uri:x,text:D})))return tf({dedupeKeys:i,summary:n,plan:f,originalTextByUri:y.originalTextByUri,writeCurrentText:e.writeCurrentText}),s=await e.getState(),a=s.result,n.changedFiles=r.size,sn({options:e.options,summary:n,changedUris:r,readCurrentText:e.readCurrentText,toDisplayPath:e.toDisplayPath}),{result:a,summary:n};if(!nf({options:e.options,fixedTextByUri:y.fixedTextByUri,parseHasErrors:e.parseHasErrors,formatText:e.formatText,writeCurrentText:e.writeCurrentText}).ok)return of({dedupeKeys:i,summary:n,plan:f,originalTextByUri:y.originalTextByUri,writeCurrentText:e.writeCurrentText}),s=await e.getState(),a=s.result,n.changedFiles=r.size,sn({options:e.options,summary:n,changedUris:r,readCurrentText:e.readCurrentText,toDisplayPath:e.toDisplayPath}),{result:a,summary:n};let v=rf({fixedTextByUri:y.fixedTextByUri,originalTextByUri:y.originalTextByUri});for(let x of v)r.add(x);if(n.appliedDiagnostics+=f.applied.length,n.appliedEdits+=f.applied.reduce((x,D)=>x+D.edits.length,0),n.unsafeAppliedDiagnostics+=f.applied.filter(x=>x.safety==="unsafe").length,n.changedFiles=r.size,sf({plan:f,seenHashes:o,readCurrentText:e.readCurrentText}))return n.circularFixesDetected=!0,s=await e.getState(),a=s.result,sn({options:e.options,summary:n,changedUris:r,readCurrentText:e.readCurrentText,toDisplayPath:e.toDisplayPath}),{result:a,summary:n};s=await e.getState(),a=s.result}return n.changedFiles=r.size,sn({options:e.options,summary:n,changedUris:r,readCurrentText:e.readCurrentText,toDisplayPath:e.toDisplayPath}),{result:a,summary:n}}async function Fl(e){let t=new Map,n=[...e.options.projectDiagnostics??[]],o={...e.host,async readFile(a){return t.has(a)?t.get(a)??"":e.host.readFile(a)}};async function i(){let a=await Y(e.project,o),l=await st({project:e.project,documents:a.documents,externalModelDocuments:a.externalModelDocuments,mode:"lint",showSuppressed:e.options.showSuppressed,baseline:e.options.baseline,maxWarnings:e.options.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...n,...a.diagnostics],host:o});return{documents:a.documents,externalModelDocuments:a.externalModelDocuments,result:l}}function r(a){return t.has(a)?t.get(a)??"":ee(_l(e.project,a))}function s(a,l){if(e.options.dryRun){t.set(a,l);return}t.set(a,l),Ct(_l(e.project,a),l)}return af({options:e.options,getState:i,getCandidates:({documents:a,diagnostics:l})=>Cl({documents:a,diagnostics:l}),applyPlan:Tl,parseHasErrors:({uri:a,text:l})=>Te(l,{uri:a}).diagnostics.some(c=>c.severity===h.Error),formatText:({uri:a,text:l})=>{if(!e.options.resolvedConfig)return;let d=Al(e.project,a),c=J(e.options.resolvedConfig,d);return Le(l,{indentWidth:c.formatter.indentWidth,xmlDeclaration:c.formatter.xmlDeclaration,blankLineBetweenBehaviorTrees:c.formatter.blankLineBetweenBehaviorTrees,lineEnding:c.formatter.lineEnding,force:!1})},readCurrentText:r,writeCurrentText:s,toDisplayPath:a=>Al(e.project,a)})}import{z as X}from"zod";import{z as Kn}from"zod";var Wn=Kn.object({baseline:Kn.string().optional(),updateBaseline:Kn.string().optional(),noBaseline:Kn.boolean().optional()});var jl=Ee.pipe(X.object({configPath:X.string().optional(),projectRoot:X.string().optional(),noConfig:X.boolean().optional(),quiet:X.boolean().optional(),verbose:X.boolean().optional(),noColor:X.boolean().optional(),output:ue,reporter:nn.optional(),json:X.boolean().optional(),warningsAsErrors:X.boolean().optional(),maxWarnings:X.number().optional(),showSkipped:X.boolean().optional(),showSuppressed:X.boolean().optional(),fix:X.boolean().optional(),fixDryRun:X.boolean().optional(),unsafe:X.boolean().optional(),fixMaxPasses:X.number().int().min(1).max(20).optional(),fixNoFormat:X.boolean().optional()}).merge(Wn).merge(Ie).superRefine((e,t)=>{e.unsafe&&!e.fix&&!e.fixDryRun&&t.addIssue({code:"custom",path:["unsafe"],message:"`--unsafe` can only be used with `--fix` or `--fix-dry-run`"})}).transform(e=>({...e,output:e.json?"json":e.output,reporter:e.json?"json":e.reporter??e.output,maxWarnings:e.warningsAsErrors?0:e.maxWarnings})));async function lf(e,t){let n=await Y(e,t);return{documents:n.documents,externalModelDocuments:n.externalModelDocuments,externalDiagnostics:n.diagnostics}}async function df(e){return st({project:e.project,documents:e.state.documents,externalModelDocuments:e.state.externalModelDocuments,mode:"lint",showSuppressed:e.options.showSuppressed,baseline:e.options.baseline,maxWarnings:e.options.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...e.options.projectDiagnostics||[],...e.state.externalDiagnostics],host:e.host})}function cf(e){return e.files.map(t=>({path:t.path,diagnostics:t.diagnostics,rawDiagnostics:t.rawDiagnostics,skipped:t.skipped,skipReason:t.skipReason}))}function uf(e){let t=new Map;for(let n of[...K(e.project),...Z(e.project)])t.has(n.path)||t.set(n.path,ee(n.absolutePath));if(e.fixSummary?.dryRun&&e.fixSummary.fixedTextByPath)for(let[n,o]of Object.entries(e.fixSummary.fixedTextByPath))t.set(n,o);return t}function pf(e){if(e.fixSummary)for(let s of Bl(e.fixSummary))console.log(s);let t=uf({project:e.project,fixSummary:e.fixSummary}),n=Vn(e.projectDiagnostics,e.options.reporter,t);n&&console.error(n);for(let s of e.reports){let a=$n(s.path,s.diagnostics,e.options.reporter,t);a&&console.error(a)}let o=e.resultSummary?.staleEntries?.length,i=Xn(e.ok,e.reports.length,o,"lint",e.summary.errors,e.summary.warnings,e.options.maxWarnings===0);if(e.ok){e.fixSummary?e.fixSummary.appliedDiagnostics===0&&console.log("ok: lint passed"):console.log(i);return}console.error(i);let r=Gn(o);r&&console.error(r)}async function mf(e){if(!(!e.options.fix&&!e.options.fixDryRun))return Fl({project:e.project,host:e.host,options:{unsafe:e.options.unsafe===!0,dryRun:e.options.fixDryRun===!0,maxPasses:e.options.fixMaxPasses??10,formatAfterFix:e.options.fixNoFormat!==!0,resolvedConfig:e.options.resolvedConfig,baseline:e.options.baseline,maxWarnings:e.options.maxWarnings,showSuppressed:e.options.showSuppressed,projectDiagnostics:e.options.projectDiagnostics??[]}})}async function Ll(e,t){let n=we(ce(e)),o=await lf(e,n),i=await df({project:e,host:n,state:o,options:t}),r,s=await mf({project:e,host:n,options:t});s&&(i=s.result,r=s.summary);let a=[...t.projectDiagnostics||[],...i.projectDiagnostics],l=cf(i),d=!On(on({projectDiagnostics:a,files:l}),t.maxWarnings),c=rn({projectDiagnostics:a,files:l});return t.reporter==="json"&&console.log(qn({ok:d,files:l,projectDiagnostics:a,summary:i.summary,fixes:r})),!t.quiet&&t.reporter==="human"&&pf({project:e,options:t,ok:d,reports:l,projectDiagnostics:a,summary:c,resultSummary:i.summary,fixSummary:r}),{ok:d,files:l,projectDiagnostics:a,summary:c}}var Ul={command:"lint [files..]",describe:"Lint BT/XML files",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("reporter",{type:"string"}).option("json",{type:"boolean"}).option("warnings-as-errors",{type:"boolean"}).option("max-warnings",{type:"number"}).option("show-skipped",{type:"boolean"}).option("show-suppressed",{type:"boolean"}).option("baseline",{type:"string"}).option("update-baseline",{type:"string"}).option("no-baseline",{type:"boolean"}).option("fix",{type:"boolean"}).option("fix-dry-run",{type:"boolean"}).option("unsafe",{type:"boolean"}).option("fix-max-passes",{type:"number"}).option("fix-no-format",{type:"boolean"}).option("stdout",{type:"boolean",hidden:!0}),handler:async e=>{if(e.stdout)throw new j("--stdout is not supported for `lint`",2,"use `--output json` for machine-readable output");let t=W(jl,e);process.exitCode=await Ol(t)}};import{z as pe}from"zod";var $l=Ee.pipe(pe.object({configPath:pe.string().optional(),projectRoot:pe.string().optional(),noConfig:pe.boolean().optional(),quiet:pe.boolean().optional(),verbose:pe.boolean().optional(),noColor:pe.boolean().optional(),output:ue,json:pe.boolean().optional(),write:pe.boolean().optional(),show:pe.string().optional(),source:pe.enum(["model-files"]).optional(),mode:pe.enum(["auto","sync","dedupe"]).optional()}).merge(Ie).transform(e=>({...e,output:e.json?"json":e.output})));import{stdin as ff,stdout as Vl}from"process";import{createInterface as gf}from"readline/promises";async function Hn(e){let t=gf({input:ff,output:Vl});try{let n=[`? ${e.message}`];for(let o=0;o<e.choices.length;o++)n.push(` ${o+1}. ${e.choices[o].label}`),e.choices[o].description&&n.push(` ${e.choices[o].description}`);for(n.push(`Select an action [1-${e.choices.length}]:`);;){let o=await t.question(`${n.join(`
|
|
41
|
+
`)} `),i=Number(o.trim());if(!Number.isNaN(i)&&i>=1&&i<=e.choices.length)return e.choices[i-1].value;Vl.write(`Please enter a number between 1 and ${e.choices.length}.
|
|
42
|
+
`)}}finally{t.close()}}function ql(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 Xl(e,t){let n=[];e.kind!==t.kind&&n.push({kind:"node-kind",left:e.kind,right:t.kind});let o=new Map(e.ports.map(r=>[r.name,r])),i=new Map(t.ports.map(r=>[r.name,r]));for(let[r,s]of o)i.has(r)||n.push({kind:"port-removed",portName:r,sourceIndex:0,port:ql(s)});for(let[r,s]of i)o.has(r)||n.push({kind:"port-added",portName:r,sourceIndex:1,port:ql(s)});for(let[r,s]of o){let a=i.get(r);if(!a)continue;s.direction!==a.direction&&n.push({kind:"port-direction",portName:r,left:s.direction,right:a.direction}),s.type!==a.type&&n.push({kind:"port-type",portName:r,left:s.type,right:a.type}),s.required!==a.required&&n.push({kind:"port-required",portName:r,left:s.required,right:a.required}),s.defaultValue!==a.defaultValue&&n.push({kind:"port-default",portName:r,left:s.defaultValue,right:a.defaultValue});let l=s.enum?JSON.stringify([...s.enum].sort()):"",d=a.enum?JSON.stringify([...a.enum].sort()):"";l!==d&&n.push({kind:"port-enum",portName:r,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:r,left:s.description,right:a.description})}return n}function te(e){return e==null?"undefined":typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.sort().join(";")||"empty":String(e)}function Ai(e){let t=[];for(let n of e)switch(n.kind){case"node-kind":t.push(`node-kind:${te(n.left)}:${te(n.right)}`);break;case"port-added":t.push(`added:${n.portName}`);break;case"port-removed":t.push(`removed:${n.portName}`);break;case"port-direction":t.push(`direction:${n.portName}:${te(n.left)}:${te(n.right)}`);break;case"port-type":t.push(`type:${n.portName}:${te(n.left)}:${te(n.right)}`);break;case"port-required":t.push(`required:${n.portName}:${te(n.left)}:${te(n.right)}`);break;case"port-default":t.push(`default:${n.portName}:${te(n.left)}:${te(n.right)}`);break;case"port-enum":t.push(`enum:${n.portName}:${te(n.left)}:${te(n.right)}`);break;case"port-description":t.push(`description:${n.portName}:${te(n.left)}:${te(n.right)}`);break}return t.sort().join("|")}function yf(e){return"portName"in e}function Fi(e){let t=e.filter(o=>o.kind.startsWith("port-"));if(t.length===0)return e.length===1&&e[0].kind==="node-kind"?"node kind differs":`${e.length} structural differences`;let n=new Set(t.filter(yf).map(o=>o.portName));if(n.size===1){let o=Array.from(n)[0];return`${t.map(r=>r.kind.replace("port-","")).join(", ")} on \`${o}\``}return`${n.size} differing ports`}function zl(e){return JSON.stringify({direction:e.direction,name:e.name,type:e.type??null,required:e.required,defaultValue:e.defaultValue??null,enumValues:e.enum??null,description:e.description??null})}function hf(e){return JSON.stringify({kind:e.kind,ports:e.ports.map(t=>({name:t.name,direction:t.direction,type:t.type??null,required:t.required,defaultValue:t.defaultValue??null,enum:t.enum?[...t.enum].sort():null,description:t.description??null})).sort((t,n)=>t.name.localeCompare(n.name))})}function bf(e){let t=[e.name];e.type&&t.push(`: ${e.type}`),!e.required&&e.defaultValue!==void 0&&t.push(` = "${e.defaultValue}"`);let n=t.join("");return e.direction==="output"?`${n} [output]`:e.direction==="inout"?`${n} [inout]`:n}function Gl(e){return`${e.kind} ${e.id}(${e.ports.map(bf).join(", ")})`}function Kl(e){let t=new Map;for(let i of e){let r=hf(i),s=t.get(r)??[];s.push(i),t.set(r,s)}let n=Array.from(t.entries());n.sort((i,r)=>{let s=i[1][0],a=r[1][0],l=s.uri??"",d=a.uri??"";if(l!==d)return l.localeCompare(d);let c=s.range?.start.offset??0,p=a.range?.start.offset??0;return c-p});let o="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");return n.map(([i,r],s)=>{let a=o[s]??`S${s}`,l=r[0],d=r.map(c=>({definitionId:`${c.id}:${c.uri??""}:${c.range?.start.offset??0}`,uri:c.uri,sourceKind:c.source||"inline-tree-nodes-model",kind:c.kind,range:c.range,signatureKey:i,signatureId:a,signatureText:Gl(c),model:c}));return{id:a,signatureKey:i,signatureText:Gl(l),kind:l.kind,definitions:d,editableDefinitions:d.filter(c=>c.model.editable!==!1),nonEditableDefinitions:d.filter(c=>c.model.editable===!1)}})}function xf(e){return/^\{[^}]+\}$/.test(e.trim())}function Sf(e){return e.name==="SubTree"?e.attributes.find(n=>n.name==="ID")?.value??e.name:e.name}function Wl(e,t,n,o){let i=0;if(Sf(e)===t){i++;for(let r of n){let s=o.get(r);s||(s={providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0},o.set(r,s));let a=e.attributes.find(l=>l.name===r);a?(s.providedCount++,xf(a.value)?s.blackboardReferenceCount++:s.literalValues[a.value]=(s.literalValues[a.value]||0)+1):s.omittedCount++}}for(let r of e.children)r.kind==="element"&&(i+=Wl(r,t,n,o));return i}function Jn(e){let t=new Map,n=0;for(let i of e.documents)if(i.root)for(let r of i.root.children)r.kind==="element"&&r.name==="TreeNodesModel"||r.kind==="element"&&(n+=Wl(r,e.nodeId,e.candidatePorts,t));let o={};for(let i of e.candidatePorts)o[i]=t.get(i)||{providedCount:0,omittedCount:0,literalValues:{},blackboardReferenceCount:0};return{nodeId:e.nodeId,totalUsages:n,byPort:o}}function dt(e){let t={signatureId:e.signature.id,newMissingRequiredPorts:[],removedPortsUsedByUsages:[],directionChanges:[]},n=new Set(Object.keys(e.usageEvidence.byPort));for(let o of n){let i=e.usageEvidence.byPort[o],r=e.signature.definitions[0]?.model.ports.find(s=>s.name===o);r?.required&&i.omittedCount>0&&t.newMissingRequiredPorts.push({portName:o,omittedCount:i.omittedCount}),!r&&i.providedCount>0&&t.removedPortsUsedByUsages.push({portName:o,providedCount:i.providedCount})}return t}function vf(e){let t=0;for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++)ft(e[n],e[o])||t++;return t}function kf(e,t){return e.definitions.some(n=>n.model.editable===!1||n.range==null?!1:t.some(o=>o.uri===n.uri))}function Hl(e){let t=e.targetSignature.definitions[0];if(!t)return[];let n=e.documents.find(r=>r.uri===t.uri);if(!n||!t.range)return[];let o=n.originalText.slice(t.range.start.offset,t.range.end.offset),i=[];for(let r of e.allDefinitions)r.signatureId===e.targetSignature.id||r.model.editable===!1||r.range==null||!e.documents.find(a=>a.uri===r.uri)||i.push({uri:r.uri??"",edits:[{range:r.range,newText:o}]});return i}function Jl(e){let t=[];for(let n of e.allDefinitions)n.definitionId!==e.keepDefinition.definitionId&&n.model.editable!==!1&&n.range!=null&&t.push({uri:n.uri??"",edits:[{range:n.range,newText:""}]});return t}function Tf(e){if(e.model.editable===!1)return[];let t=[],n=e.keepDefinition.range?.start.offset,o=e.model.ports.filter(i=>i.name===e.portName);for(let i of o){let r=i.range??i.nameRange;r&&(n!=null&&r.start.offset===n||t.push({uri:e.model.uri??"",edits:[{range:r,newText:""}]}))}return t}function an(e){let t=new Set,n=0;for(let o of e)t.add(o.uri),n+=o.edits.length;return{files:t.size,definitions:n,edits:n,affectedUris:Array.from(t).sort()}}function ct(e){return e.definitions===0?"edits: none":e.definitions===1&&e.files===1?"edits: 1 definition in 1 file":`edits: ${e.definitions} definition${e.definitions===1?"":"s"} in ${e.files} file${e.files===1?"":"s"}`}function Li(e){let t=[],{group:n,documents:o}=e,i=n.signatures.some(r=>r.nonEditableDefinitions.length>0);if(n.kind==="model-signature-conflict")for(let r of n.signatures){if(!kf(r,o)||n.definitions.filter(l=>l.signatureId!==r.id&&l.model.editable!==!1&&l.range!=null).length===0)continue;let a=Hl({targetSignature:r,allDefinitions:n.definitions,documents:o});a.length!==0&&t.push({id:`match-signature-${r.id}`,title:i?`Make editable definitions match signature ${r.id}`:`Make all definitions match signature ${r.id}`,description:`Replace editable definitions that do not match signature ${r.id}.`,kind:"match-signature",applicable:!0,targetSignatureId:r.id,workspaceEdits:a,editSummary:an(a),usageImpact:dt({signature:r,usageEvidence:n.usageEvidence})})}else if(n.kind==="duplicate-model-id"){let r=new Set;for(let s of n.definitions){if(r.has(s.signatureKey))continue;r.add(s.signatureKey);let a=Jl({keepDefinition:s,allDefinitions:n.definitions}),l=n.definitions.filter(d=>d.signatureKey===s.signatureKey).length;a.length!==0&&t.push({id:`keep-definition-${s.signatureId}`,title:l>1?"Keep the first definition and delete duplicate copies":`Keep variant ${s.signatureId} and delete duplicate \`${n.nodeId}\` definitions in this file`,description:l>1?`Keep one definition and remove ${l-1} duplicate copies.`:`Keep ${s.definitionId} and remove other duplicate definitions.`,kind:"keep-model-definition",applicable:!0,workspaceEdits:a,editSummary:an(a)})}}else if(n.kind==="duplicate-port-name"){let r=new Set;for(let s of n.definitions){if(r.has(s.signatureKey))continue;r.add(s.signatureKey);let a=Tf({model:s.model,portName:n.portName??n.nodeId,keepDefinition:s});if(a.length===0)continue;let l=n.definitions.filter(d=>d.signatureKey===s.signatureKey).length;t.push({id:`keep-port-${s.signatureId}`,title:l>1?`Keep the first \`${n.portName??n.nodeId}\` port and delete duplicate copies`:`Keep port variant ${s.signatureId} and delete other \`${n.portName??n.nodeId}\` ports`,description:l>1?`Keep one \`${n.portName??n.nodeId}\` port and remove duplicate copies.`:`Keep \`${n.portName??n.nodeId}\` port variant ${s.signatureId} and remove others.`,kind:"keep-port-definition",applicable:!0,workspaceEdits:a,editSummary:an(a)})}}if(e.options?.canonicalSource==="model-files"){if(new Set(n.definitions.map(a=>a.kind)).size>1)return[...t,{id:"manual",title:"Manual update required",description:"No editable definitions are available for automatic repair.",kind:"manual",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}},{id:"skip",title:"Skip this model group",description:"Do not change any definitions for this node model.",kind:"skip",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}];let s=n.definitions.filter(a=>a.sourceKind==="external-tree-nodes-model");if(s.length===1){let a=s[0],l=n.signatures.find(d=>d.id===a.signatureId);if(l){if(e.options.canonicalMode==="sync"){let d=Hl({targetSignature:l,allDefinitions:n.definitions,documents:o});d.length>0&&t.push({id:"match-canonical-model-file",title:"Make definitions match canonical model file",description:"Replace editable non-canonical definitions with the canonical model-file definition.",kind:"match-canonical-model-file",applicable:!0,targetSignatureId:l.id,workspaceEdits:d,editSummary:an(d),usageImpact:dt({signature:l,usageEvidence:n.usageEvidence})})}if(e.options.canonicalMode==="dedupe"){let d=Jl({keepDefinition:a,allDefinitions:n.definitions});d.length>0&&t.push({id:"keep-canonical-model-file-definition",title:"Keep canonical model file definition and delete duplicates",description:"Delete editable non-canonical duplicate definitions and keep the canonical model-file definition.",kind:"keep-canonical-model-file-definition",applicable:!0,targetSignatureId:l.id,workspaceEdits:d,editSummary:an(d),usageImpact:dt({signature:l,usageEvidence:n.usageEvidence})})}}}}return t.length===0&&t.push({id:"manual",title:"Manual update required",description:"No editable definitions are available for automatic repair.",kind:"manual",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}),t.push({id:"skip",title:"Skip this model group",description:"Do not change any definitions for this node model.",kind:"skip",applicable:!1,workspaceEdits:[],editSummary:{files:0,definitions:0,edits:0,affectedUris:[]}}),t}function Df(e,t){let n=[];e.direction!==t.direction&&n.push({kind:"port-direction",portName:e.name,left:e.direction,right:t.direction}),e.type!==t.type&&n.push({kind:"port-type",portName:e.name,left:e.type,right:t.type}),e.required!==t.required&&n.push({kind:"port-required",portName:e.name,left:e.required,right:t.required}),e.defaultValue!==t.defaultValue&&n.push({kind:"port-default",portName:e.name,left:e.defaultValue,right:t.defaultValue});let o=e.enum?JSON.stringify([...e.enum].sort()):"",i=t.enum?JSON.stringify([...t.enum].sort()):"";return o!==i&&n.push({kind:"port-enum",portName:e.name,left:e.enum?[...e.enum].sort():void 0,right:t.enum?[...t.enum].sort():void 0}),n}function ji(e){let t=[];for(let n=0;n<e.length;n++)for(let o=n+1;o<e.length;o++){let i=e[n].definitions[0]?.model,r=e[o].definitions[0]?.model;if(!i||!r)continue;let s=Xl(i,r);s.length>0&&t.push({leftSignatureId:e[n].id,rightSignatureId:e[o].id,differences:s})}return t}function Yl(e){let t=e.flatMap(r=>r.differences),n=t.some(r=>r.kind!=="port-default"),o=t.some(r=>r.kind==="port-default"),i=[];return n&&i.push("BT012_CONFLICTING_NODE_MODEL"),o&&i.push("BT107_CONFLICTING_PORT_DEFAULT"),{codes:i,severity:n?"error":"warning"}}function Zl(e){let{nodeId:t,models:n,documents:o,code:i}=e;if(n.length<2)return;let r=Kl(n);if(r.length<2&&i!=="BT006_DUPLICATE_NODE_MODEL_ID"&&!e.forceIncludeEquivalent)return;let s=r.flatMap(v=>v.definitions),a=vf(n),l,d;if(i==="BT006_DUPLICATE_NODE_MODEL_ID")if(r.length===1)l=["BT006_DUPLICATE_NODE_MODEL_ID"],d="error";else{let v=ji(r),x=Yl(v);l=["BT006_DUPLICATE_NODE_MODEL_ID",...x.codes],d=x.severity}else{if(r.length<2&&e.forceIncludeEquivalent){l=[i],d="error";let D=[...new Set(s.flatMap(B=>B.model.ports.map(A=>A.name)))],P=Jn({nodeId:t,documents:o,candidatePorts:D}),w={id:`model-group:${t}:equivalent`,kind:e.kind??"model-signature-conflict",nodeId:t,displayName:t,codes:l,severity:d,definitions:s,signatures:r,differences:[],usageEvidence:P,differencePattern:{key:"equivalent",label:"equivalent signatures"},pairwiseConflictCount:a};return{...w,actions:Li({group:w,documents:o,options:e.options}),usageImpacts:r.map(B=>dt({signature:B,usageEvidence:w.usageEvidence}))}}let v=ji(r),x=Yl(v);if(l=x.codes,d=x.severity,l.length===0)return}let c=[...new Set(s.flatMap(v=>v.model.ports.map(x=>x.name)))],p=Jn({nodeId:t,documents:o,candidatePorts:c}),m=ji(r),f=m.flatMap(v=>v.differences),y=Ai(f),g=Fi(f),S={id:`model-group:${t}:${y}`,kind:e.kind??(i==="BT006_DUPLICATE_NODE_MODEL_ID"?"duplicate-model-id":"model-signature-conflict"),nodeId:t,displayName:t,codes:l,severity:d,definitions:s,signatures:r,differences:m,usageEvidence:p,differencePattern:{key:y,label:g},pairwiseConflictCount:a};return{...S,actions:Li({group:S,documents:o,options:e.options}),usageImpacts:r.map(v=>dt({signature:v,usageEvidence:p}))}}function Rf(e,t){let n=[];for(let o of xt(e)){let i=new Map;for(let r of o.treeNodesModel){let s=i.get(r.id)??[];s.push(r),i.set(r.id,s)}for(let[r,s]of i){if(s.length<2)continue;let a=Zl({nodeId:r,models:s,documents:t,code:"BT006_DUPLICATE_NODE_MODEL_ID",kind:"duplicate-model-id"});a&&n.push(a)}}return n}function Cf(e){let{model:t,portName:n,ports:o,documents:i}=e,r=new Map;for(let m of o){let f=zl(m),y=r.get(f)??[];y.push(m),r.set(f,y)}let s=Array.from(r.entries()).sort((m,f)=>(m[1][0]?.range?.start.offset??0)-(f[1][0]?.range?.start.offset??0)),a="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),l=[];for(let m=0;m<s.length;m++){let[f,y]=s[m],g=a[m]??`S${m}`,S=y[0],v=`${t.kind} ${t.id}(${S.direction} ${S.name}${S.type?`: ${S.type}`:""}${S.defaultValue?` = "${S.defaultValue}"`:""})`,x=y.map((D,P)=>{let w=D.range??D.nameRange;return{definitionId:`${t.id}:${t.uri??""}:${t.range?.start.offset??0}:port:${n}:${w?.start.offset??P}`,uri:t.uri,sourceKind:t.source||"inline-tree-nodes-model",kind:t.kind,range:w,signatureKey:f,signatureId:g,signatureText:v,model:t}});l.push({id:g,signatureKey:f,signatureText:v,kind:t.kind,definitions:x,editableDefinitions:x.filter(D=>D.model.editable!==!1),nonEditableDefinitions:x.filter(D=>D.model.editable===!1)})}let d=[];for(let m=0;m<l.length;m++)for(let f=m+1;f<l.length;f++){let y=l[m].definitions[0]?.model.ports.find(v=>{let x=v.range??v.nameRange,D=l[m].definitions[0]?.range;return x&&D&&x.start.offset===D.start.offset}),g=l[f].definitions[0]?.model.ports.find(v=>{let x=v.range??v.nameRange,D=l[f].definitions[0]?.range;return x&&D&&x.start.offset===D.start.offset});if(!y||!g)continue;let S=Df(y,g);S.length>0&&d.push({leftSignatureId:l[m].id,rightSignatureId:l[f].id,differences:S})}let c=d.flatMap(m=>m.differences),p={id:`duplicate-port:${t.id}:${n}:${t.uri??""}:${o[0]?.range?.start.offset??0}`,kind:"duplicate-port-name",nodeId:t.id,portName:n,displayName:`${t.id}.${n}`,codes:["BT008_DUPLICATE_PORT_NAME"],severity:"error",definitions:l.flatMap(m=>m.definitions),signatures:l,differences:d,usageEvidence:Jn({nodeId:t.id,documents:i,candidatePorts:[n]}),differencePattern:{key:Ai(c),label:Fi(c)},pairwiseConflictCount:Math.max(1,o.length-1)};return{...p,actions:Li({group:p,documents:i}),usageImpacts:l.map(m=>dt({signature:m,usageEvidence:p.usageEvidence}))}}function If(e,t){let n=[];for(let o of xt(e))for(let i of o.treeNodesModel){let r=new Map;for(let s of i.ports){let a=r.get(s.name)??[];a.push(s),r.set(s.name,a)}for(let[s,a]of r){if(a.length<2)continue;let l=Cf({model:i,portName:s,ports:a,documents:t});l&&n.push(l)}}return n}function Ef(e){let t=new Set;for(let n of xt(e)){let o=new Map;for(let i of n.treeNodesModel){let r=o.get(i.id)??[];r.push(i),o.set(i.id,r)}for(let[i,r]of o)r.length>=2&&t.add(i)}return t}function Mf(e){let t=qt(Vt(e)),n=new Map;for(let[o,i]of t)n.set(o,i.map(r=>r.model));return n}function Yn(e){let t=[],n=Ef(e.workspace);for(let[o,i]of Mf(e.workspace)){if(i.length<2||n.has(o))continue;let r=Zl({nodeId:o,models:i,documents:e.documents,code:e.options?.includeConventionGroups===!0?"BT122_DUPLICATE_MODEL_DEFINITION":"BT012_CONFLICTING_NODE_MODEL",forceIncludeEquivalent:e.options?.includeConventionGroups===!0,options:e.options});r&&t.push(r)}return t.push(...Rf(e.workspace,e.documents)),t.push(...If(e.workspace,e.documents)),t}function Zn(e){return e.applicable===!0}function Ql(e){return e.actions.filter(Zn)}function ed(e){return e.actions.filter(t=>t.kind==="manual")}function td(e){return{signatureConflictGroups:e.filter(t=>t.kind==="model-signature-conflict").length,duplicateModelGroups:e.filter(t=>t.kind==="duplicate-model-id").length,duplicatePortGroups:e.filter(t=>t.kind==="duplicate-port-name").length,pairwiseSignatureConflicts:e.filter(t=>t.kind==="model-signature-conflict").reduce((t,n)=>t+n.pairwiseConflictCount,0)}}function Nf(e){switch(e.kind){case"duplicate-port-name":return`1 model definition, ${e.definitions.length} duplicate ports, ${e.signatures.length} variants`;case"duplicate-model-id":return`1 file, ${e.definitions.length} duplicate model definitions, ${e.signatures.length} variants`;case"model-signature-conflict":return`${e.definitions.length} definitions, ${e.signatures.length} signatures`}}function nd(e){let t=e.usageEvidence.totalUsages,n=[];if(n.push(`${e.displayName} usages: ${t}`),t===0)return n.push(" no usage evidence available"),n;for(let[o,i]of Object.entries(e.usageEvidence.byPort)){let r=[];r.push(`provided ${i.providedCount}/${t}`),i.blackboardReferenceCount>0&&r.push(`blackboard refs ${i.blackboardReferenceCount}`),n.push(` ${o}: ${r.join(", ")}`)}return n}function od(e){let t=[];if(e.newMissingRequiredPorts.length>0)for(let n of e.newMissingRequiredPorts)t.push(`would produce ${n.omittedCount} missing required-port report${n.omittedCount===1?"":"s"} for \`${n.portName}\``);if(e.removedPortsUsedByUsages.length>0)for(let n of e.removedPortsUsedByUsages)t.push(`\`${n.portName}\` is used in ${n.providedCount} usage${n.providedCount===1?"":"s"} but is not defined by this signature`);if(e.directionChanges.length>0)for(let n of e.directionChanges)t.push(`changes \`${n.portName}\` direction from ${n.from} to ${n.to}`);return t.length===0?"no existing usage omits required ports in this signature":t.join("; ")}function id(e){let t=[];for(let n of e.differences){t.push(` ${n.leftSignatureId} vs ${n.rightSignatureId}:`);for(let o of n.differences)switch(o.kind){case"node-kind":t.push(` node kind: ${n.leftSignatureId}: ${o.left}, ${n.rightSignatureId}: ${o.right}`);break;case"port-added":t.push(` ${o.portName}: ${n.rightSignatureId}: exists, ${n.leftSignatureId}: not defined`);break;case"port-removed":t.push(` ${o.portName}: ${n.leftSignatureId}: exists, ${n.rightSignatureId}: not defined`);break;case"port-direction":t.push(` ${o.portName}: ${n.leftSignatureId}: ${o.left}, ${n.rightSignatureId}: ${o.right}`);break;case"port-type":t.push(` ${o.portName}: ${n.leftSignatureId}: type ${o.left??"not specified"}, ${n.rightSignatureId}: type ${o.right??"not specified"}`);break;case"port-required":t.push(` ${o.portName}: ${n.leftSignatureId}: ${o.left?"required":"optional"}, ${n.rightSignatureId}: ${o.right?"required":"optional"}`);break;case"port-default":t.push(` ${o.portName}: ${n.leftSignatureId}: default ${o.left??"not set"}, ${n.rightSignatureId}: default ${o.right??"not set"}`);break;case"port-enum":t.push(` ${o.portName}: ${n.leftSignatureId}: enum ${o.left?.join(";")??"not set"}, ${n.rightSignatureId}: enum ${o.right?.join(";")??"not set"}`);break;case"port-description":{let i=r=>r?r.length>120?`${r.slice(0,120)}...`:r:"not set";t.push(` - port \`${o.portName}\` description differs`,` ${n.leftSignatureId}: "${i(o.left)}"`,` ${n.rightSignatureId}: "${i(o.right)}"`);break}}}return t}function Ui(e,t){let n=[],o=t?.index!==void 0?`[${t.index}${t.total?`/${t.total}`:""}] `:"";n.push(`${o}${e.displayName}`),n.push(""),e.kind==="duplicate-port-name"?n.push(`1 model definition contains ${e.definitions.length} ports named \`${e.portName??e.nodeId}\`.`):e.kind==="duplicate-model-id"?n.push(`1 file contains ${e.definitions.length} definitions with ID \`${e.nodeId}\`.`):n.push(`${e.definitions.length} definitions have ${e.signatures.length} signatures.`),n.push(`codes: ${e.codes.join(", ")}`),n.push("");for(let s of e.signatures){let a=e.kind==="duplicate-port-name"?"port variant":e.kind==="model-signature-conflict"?"signature":"variant";n.push(`${a} ${s.id}`),n.push(` ${s.signatureText}`),n.push(" locations:");for(let l of s.definitions){let d=l.range?`${l.uri??""}:${l.range.start.line+1}:${l.range.start.character+1}`:l.uri??"unknown";n.push(` ${d}`)}n.push("")}if(e.differences.length>0&&(n.push("differences:"),n.push(...id(e)),n.push("")),n.push("usage:"),n.push(...nd(e).map(s=>` ${s}`)),n.push(""),e.usageImpacts.length>0){n.push("usage check:");for(let s of e.usageImpacts)n.push(` choose ${s.signatureId}: ${od(s)}`);n.push("")}let i=Ql(e);if(i.length>0){n.push("actions:");for(let s=0;s<i.length;s++){let a=i[s];n.push(` ${s+1}. ${a.title}`);let l=ct(a.editSummary);if(l!=="edits: none"&&n.push(` ${l}`),a.warnings)for(let d of a.warnings)n.push(` warning: ${d}`)}n.push("")}let r=ed(e);if(r.length>0){n.push("manual:");for(let s of r)if(n.push(` ${s.description}`),s.warnings)for(let a of s.warnings)n.push(` warning: ${a}`);n.push("")}return n.join(`
|
|
43
|
+
`)}function Qn(e){if(e.groups.length===0)return"ok: no model conflicts found";let t=td(e.groups),n=[];n.push(`model repair: ${e.groups.length} group${e.groups.length===1?"":"s"} need${e.groups.length===1?"s":""} attention`),t.signatureConflictGroups>0&&n.push(` ${t.signatureConflictGroups} signature conflict group${t.signatureConflictGroups===1?"":"s"}`),t.duplicateModelGroups>0&&n.push(` ${t.duplicateModelGroups} duplicate model group${t.duplicateModelGroups===1?"":"s"}`),t.duplicatePortGroups>0&&n.push(` ${t.duplicatePortGroups} duplicate port group${t.duplicatePortGroups===1?"":"s"}`),t.pairwiseSignatureConflicts>0&&n.push(`${t.pairwiseSignatureConflicts} pairwise signature conflict${t.pairwiseSignatureConflicts===1?"":"s"} collapsed into ${t.signatureConflictGroups} group${t.signatureConflictGroups===1?"":"s"}`),n.push("");let o=10;if(e.groups.length<=o)for(let i=0;i<e.groups.length;i++){let r=e.groups[i];n.push(`[${i+1}] ${r.displayName}`),n.push(` ${Nf(r)}`),n.push(` codes: ${r.codes.join(", ")}`),n.push(""),n.push(" signatures:");for(let l of r.signatures)n.push(` ${l.id} ${l.definitions.length} definition${l.definitions.length===1?"":"s"}`),n.push(` ${l.signatureText}`);if(n.push(""),r.differences.length>0&&(n.push(" differences:"),n.push(...id(r).map(l=>` ${l}`)),n.push("")),n.push(" usage:"),n.push(...nd(r).map(l=>` ${l}`)),n.push(""),r.usageImpacts.length>0){n.push(" usage check:");for(let l of r.usageImpacts)n.push(` choose ${l.signatureId}: ${od(l)}`);n.push("")}let s=Ql(r);if(s.length>0){n.push(" actions:");for(let l=0;l<s.length;l++){let d=s[l];n.push(` ${l+1}. ${d.title}`);let c=ct(d.editSummary);if(c!=="edits: none"&&n.push(` ${c}`),d.warnings)for(let p of d.warnings)n.push(` warning: ${p}`)}n.push("")}let a=ed(r);if(a.length>0){n.push(" manual:");for(let l of a)if(n.push(` ${l.description}`),l.warnings)for(let d of l.warnings)n.push(` warning: ${d}`);n.push("")}}else{n.push(`showing first ${o} groups. Use \`btxmlc repair --show <nodeId|index>\` for full details.`),n.push("");for(let i=0;i<o;i++){let r=e.groups[i],s=r.differences.flatMap(a=>a.differences).length;n.push(`[${i+1}] ${r.displayName.padEnd(20)} ${r.definitions.length} definitions, ${r.signatures.length} signatures, ${s} differing port${s===1?"":"s"}`)}n.push(""),n.push("remaining groups:");for(let i=o;i<e.groups.length;i++)n.push(` [${i+1}] ${e.groups[i].nodeId}`);n.push("")}return n.push("run `btxmlc repair --write` to resolve model groups interactively"),n.push("run `btxmlc repair --show <model|model.port|index>` to inspect one model group"),n.join(`
|
|
44
|
+
`)}function Oi(e){let t=e.groups.filter(i=>i.severity==="error").length,n=e.groups.filter(i=>i.severity==="warning").length,o=td(e.groups);return JSON.stringify({ok:e.ok,version:2,schemaVersion:"2",toolVersion:Be,groups:e.groups.map(i=>({id:i.id,kind:i.kind,nodeId:i.nodeId,portName:i.portName,displayName:i.displayName,codes:i.codes,severity:i.severity,pairwiseConflictCount:i.pairwiseConflictCount,definitions:i.definitions.map(r=>({definitionId:r.definitionId,uri:r.uri,sourceKind:r.sourceKind,kind:r.kind,range:r.range,signatureId:r.signatureId,signatureText:r.signatureText})),signatures:i.signatures.map(r=>({id:r.id,signatureKey:r.signatureKey,signatureText:r.signatureText,definitions:r.definitions.map(s=>({definitionId:s.definitionId,uri:s.uri,range:s.range})),editableDefinitions:r.editableDefinitions.map(s=>({definitionId:s.definitionId,uri:s.uri,range:s.range})),nonEditableDefinitions:r.nonEditableDefinitions.map(s=>({definitionId:s.definitionId,uri:s.uri,range:s.range}))})),differences:i.differences,usageEvidence:i.usageEvidence,usageImpacts:i.usageImpacts,differencePattern:i.differencePattern,actions:i.actions.map(r=>({id:r.id,title:r.title,description:r.description,kind:r.kind,applicable:r.applicable,targetSignatureId:r.targetSignatureId,editSummary:r.editSummary,workspaceEdits:r.workspaceEdits,usageImpact:r.usageImpact,warnings:r.warnings}))})),summary:{groups:e.groups.length,signatureConflictGroups:o.signatureConflictGroups,duplicateModelGroups:o.duplicateModelGroups,duplicatePortGroups:o.duplicatePortGroups,pairwiseSignatureConflicts:o.pairwiseSignatureConflicts,errors:t,warnings:n}},null,2)}function $i(e){let t=new Map;for(let n of e){let o=t.get(n.uri)??[];o.push(...n.edits),t.set(n.uri,o)}return Array.from(t.entries()).map(([n,o])=>({uri:n,edits:o}))}function Pf(e,t){let n=Number(t);return!Number.isNaN(n)&&n>=1&&n<=e.length?e[n-1]:e.find(o=>o.displayName===t)??e.find(o=>o.nodeId===t&&o.kind!=="duplicate-port-name")}function eo(e){let t=new Map;for(let n of e)t.set(n.uri,n);return Array.from(t.values())}function Vi(e){return lt(e).flatMap(t=>{try{return[{uri:t.path,path:t.absolutePath,kind:"generic-xml",isBtXml:!1,nodes:[],diagnostics:[],originalText:ee(t.absolutePath)}]}catch{return[]}})}function sd(e,t){return[...K(e),...Z(e),...lt(e)].find(i=>i.absolutePath===t||i.path===t)?.absolutePath??t}function wf(e,t){for(let n of $i(t)){let o=sd(e,n.uri),i=ee(o),r=Nt(i,n.edits);Ct(o,r)}}function rd(e,t){for(let n of $i(t)){let o=sd(e,n.uri),i=ee(o);console.log(`
|
|
45
|
+
--- ${n.uri} ---`);for(let r of n.edits){let s=i.slice(Math.max(0,r.range.start.offset-40),r.range.start.offset),a=i.slice(r.range.end.offset,r.range.end.offset+40);console.log(`-${s}[...]${a}`),console.log(`+${s}${r.newText}${a}`)}}console.log("")}async function ad(e,t){let n=we(ce(e)),o=it(e);if(!o)throw new Error("Invariant: resolvedConfig is required");let i=t.source,r=t.mode==="dedupe"||t.mode==="sync"?t.mode:void 0,s=i==="model-files"?r??(o.models.convention==="single-source"?"dedupe":"sync"):void 0,a=o.models.convention==="single-source"||s==="dedupe",l=await Y(e,n),{documents:d}=l,{externalModelDocuments:c}=l,p=eo([...d,...c,...Vi(e)]),m=await at({project:e,documents:d,externalModelDocuments:c,host:n}),f=Yn({documents:p,workspace:m.semanticIndex,project:e,options:{includeConventionGroups:a,convention:o.models.convention,canonicalSource:i,canonicalMode:s}});if(t.show){let S=Pf(f,t.show);if(!S)throw new j(`error: no model group found for \`${t.show}\``,2,"run `btxmlc repair` to see available model groups");return t.output==="json"?console.log(Oi({ok:!1,groups:[S]})):console.log(Ui(S)),{ok:!1,groups:[S]}}let y=!1;if(t.write){if(process.stdin.isTTY!==!0)throw new j("error: `btxmlc repair --write` requires an interactive terminal",2,"run `btxmlc repair --json` to inspect model conflicts in non-interactive environments");let S=new Set;for(;;){let D=await Y(e,n);d=D.documents,c=D.externalModelDocuments;let P=eo([...d,...c,...Vi(e)]);m=await at({project:e,documents:d,externalModelDocuments:c,host:n}),f=Yn({documents:P,workspace:m.semanticIndex,project:e,options:{includeConventionGroups:a,convention:o.models.convention,canonicalSource:i,canonicalMode:s}});let w=f.filter(E=>!S.has(E.id));if(w.length===0)break;let B=w[0];t.output==="human"&&!t.quiet&&console.log(Ui(B,{index:f.indexOf(B)+1,total:f.length}));let A=B.actions.filter(Zn),se=[...A.map(E=>({label:E.title,value:E.id,description:ct(E.editSummary)})),...A.length>0?[{label:"Preview an action",value:"preview",description:""}]:[],{label:"Skip this model group",value:"skip",description:""},{label:"Quit",value:"quit",description:""}],U=await Hn({message:`Resolve \`${B.displayName}\``,choices:se});if(U==="quit"){y=!0;break}if(U==="skip"){S.add(B.id);continue}if(U==="preview"){let E=A.map(L=>({label:L.title,value:L.id,description:ct(L.editSummary)}));E.push({label:"Back",value:"back",description:""});let _=await Hn({message:"Preview which action?",choices:E});if(_==="back")continue;let T=B.actions.find(L=>L.id===_);T&&t.output==="human"&&!t.quiet&&(console.log(`
|
|
46
|
+
Edit preview for: ${T.title}`),rd(e,T.workspaceEdits));continue}let fe=B.actions.find(E=>E.id===U);if(!fe||!Zn(fe)){S.add(B.id);continue}let b=[{label:"Apply",value:"apply",description:ct(fe.editSummary)},{label:"Show edit preview",value:"preview",description:""},{label:"Back",value:"back",description:""}],N=await Hn({message:`Apply edits for \`${B.displayName}\`?`,choices:b});if(N!=="back"){if(N==="preview"){console.log(`
|
|
47
|
+
Edit preview for: ${fe.title}`),rd(e,fe.workspaceEdits);continue}wf(e,fe.workspaceEdits)}}let v=await Y(e,n);d=v.documents,c=v.externalModelDocuments;let x=eo([...d,...c]);m=await at({project:e,documents:d,externalModelDocuments:c}),f=Yn({documents:eo([...x,...Vi(e)]),workspace:m.semanticIndex,project:e,options:{includeConventionGroups:a,convention:o.models.convention,canonicalSource:i,canonicalMode:s}}),y&&f.length>0&&t.output==="human"&&!t.quiet&&console.log(Qn({ok:!1,groups:f}))}let g=f.length===0;return t.output==="json"?console.log(Oi({ok:g,groups:f})):t.quiet||(t.write?g?console.log("ok: all model conflicts resolved"):y||console.log(Qn({ok:g,groups:f})):console.log(Qn({ok:g,groups:f}))),{ok:g,groups:f}}var ld={command:"repair [files..]",describe:"Inspect and resolve conflicting node model signatures",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("json",{type:"boolean"}).option("write",{type:"boolean"}).option("show",{type:"string"}).option("source",{type:"string"}).option("mode",{type:"string"}),handler:async e=>{let t=W($l,e);process.exitCode=await dd(t)}};import to from"fs";import ze from"path";function cd(e,t){for(let n of to.readdirSync(e,{withFileTypes:!0})){let o=ze.join(e,n.name);t.push(o),n.isDirectory()&&!n.isSymbolicLink()&&cd(o,t)}}function Bf(e){let t=e.replace(/\\/g,"/"),n="^";for(let o=0;o<t.length;o+=1){let i=t[o],r=t[o+1],s=t[o+2];if(i==="*"&&r==="*"&&s==="/"){n+="(?:.*/)?",o+=2;continue}if(i==="*"&&r==="*"){n+=".*",o+=1;continue}if(i==="*"){n+="[^/]*";continue}if(i==="?"){n+="[^/]";continue}if(".+^${}()|[]\\".includes(i)){n+=`\\${i}`;continue}n+=i}return n+="$",new RegExp(n)}function qi(e,t){let n=e.split(ze.sep).join("/"),o=t.replace(/\\/g,"/");return!o.includes("*")&&!o.includes("?")?n===o||ze.basename(n)===o:Bf(o).test(n)}function _f(e){return e.includes("*")||e.includes("?")}function ud(e,t,n=[]){let o=[],i=[];for(let r of e){let s=r.replace(/\\/g,ze.sep);if(to.existsSync(s)&&to.statSync(s).isFile()){let a=ze.relative(t,s).split(ze.sep).join("/");n.some(l=>qi(a,l))||o.push(r);continue}_f(r)&&i.push(r)}if(i.length>0){let r=[];cd(t,r);for(let s of r.filter(a=>to.statSync(a).isFile())){let a=ze.relative(t,s).split(ze.sep).join("/"),l=i.some(c=>qi(a,c)),d=n.some(c=>qi(a,c));l&&!d&&o.push(s)}}return[...new Set(o)].sort()}async function Et(e,t){let n=await yi({cwd:process.cwd(),cliFiles:t.files??t._?.slice(1)??[],configPath:t.configPath,noConfig:t.noConfig,command:e,projectRoot:t.projectRoot});if(!n.project){let r=Xe({diagnostics:n.diagnostics});return r&&console.error(r),null}let o=n.project,i=it(o);return i?{...n,project:o,resolvedConfig:i}:null}import Af from"path";function no(e,t,n="file.xml"){if(e===t)return"";let o=e.split(/\r?\n/),i=t.split(/\r?\n/),r=[`--- ${n}`,`+++ ${n}`],s=Math.max(o.length,i.length);for(let a=0;a<s;a+=1)o[a]!==i[a]&&(o[a]!==void 0&&r.push(`- ${o[a]}`),i[a]!==void 0&&r.push(`+ ${i[a]}`));return r.join(`
|
|
48
|
+
`)}function Ff(e){return[...new Map(e.map(t=>[t.path,t])).values()]}function jf(e,t,n){if(n.noFormat||n.lintOnly)return{diagnostics:[],needsFormat:!1,formatted:void 0};if(!n.resolvedConfig)return{diagnostics:[],needsFormat:!1,formatted:void 0};let o=J(n.resolvedConfig,e),i=Le(t,{indentWidth:o.formatter.indentWidth,xmlDeclaration:o.formatter.xmlDeclaration,blankLineBetweenBehaviorTrees:o.formatter.blankLineBetweenBehaviorTrees,lineEnding:o.formatter.lineEnding}),r=[],s=!1;return i.ok&&!i.skipped&&(s=i.text!==t),s&&r.push(R("BTXML_FORMAT",h.Error,"file is not formatted",void 0,e,{help:`run \`btxmlc format ${e}\``})),{diagnostics:[...i.diagnostics,...r],needsFormat:s,formatted:i.ok&&!i.skipped?i.text:void 0,skipped:i.skipped}}async function Xi(e,t){let n=ce(e),o=we(n),{documents:i,externalModelDocuments:r,diagnostics:s}=await Y(e,o),a=new Map;for(let v of K(e))a.set(v.path,ee(v.absolutePath));let l=t.noLint||t.formatOnly?void 0:await st({project:e,documents:i,externalModelDocuments:r,mode:"check",showSuppressed:t.showSuppressed,baseline:t.baseline,maxWarnings:t.maxWarnings,includeRawDiagnostics:!0,projectDiagnostics:[...t.projectDiagnostics||[],...s],host:o}),d=l?.projectDiagnostics??t.projectDiagnostics??[],c=new Map((l?.files||[]).map(v=>[v.path,v])),p=[],m=Ff([...K(e),...Z(e)]).map(v=>{let x=ee(v.absolutePath);return a.set(v.path,x),{path:v.path,uri:v.path,diagnostics:[],originalText:x}}),f=l?.files||m;for(let v of f){let x=a.get(v.path)??ee(Af.resolve(n,v.path)),D=jf(v.path,x,t),P=c.get(v.path),w=[...P?.diagnostics||v.diagnostics||[],...D.diagnostics],B={path:v.path,diagnostics:w,rawDiagnostics:P?.rawDiagnostics,needsFormat:D.needsFormat,skipped:P?.skipped,skipReason:P?.skipReason,formatted:D.formatted};p.push(B)}let y=on({projectDiagnostics:d,files:p}),g=!On(y,t.maxWarnings),S=rn({projectDiagnostics:d,files:p});if(t.reporter==="json"&&console.log(qn({ok:g,files:p,projectDiagnostics:d,summary:l?.summary})),!t.quiet&&t.reporter==="human"){let v=Vn(d,t.reporter,a);v&&console.error(v);for(let P of p){let w=a.get(P.path)??"",B=$n(P.path,P.diagnostics,t.reporter,a);B&&console.error(B),P.needsFormat&&t.diff&&P.formatted&&console.log(no(w,P.formatted,P.path))}let x=l?.summary?.staleEntries?.length,D=Xn(g,p.length,x,"check",S.errors,S.warnings,t.maxWarnings===0);if(g)console.log(D);else{console.error(D);let P=Gn(x);P&&console.error(P)}}return{ok:g,files:p,projectDiagnostics:d,summary:S}}function Lf(e,t,n,o){o.quiet||(console.error(ol(e)),o.diff&&console.log(no(t,n,e)))}function Uf(e,t,n){let o=J(n.config,e),i=Le(t,{indentWidth:o.formatter.indentWidth,xmlDeclaration:o.formatter.xmlDeclaration,blankLineBetweenBehaviorTrees:o.formatter.blankLineBetweenBehaviorTrees,lineEnding:o.formatter.lineEnding,force:n.force});if(i.skipped)return!n.quiet&&n.output!=="json"&&console.log(`skipped ${e}`),{changed:!1,failed:!1};if(!i.ok||!i.text){if(!n.quiet){let r=new Map;r.set(e,t),console.error(Xe({diagnostics:i.diagnostics,defaultPath:e,sourceTextByUri:r}))}return{changed:!1,failed:!0}}if(n.check){let r=i.text!==t;return r&&Lf(e,t,i.text,n),{changed:r,failed:r}}return n.stdout?(process.stdout.write(i.text),{changed:i.text!==t,failed:!1}):(i.text!==t&&Ct(e,i.text),{changed:i.text!==t,failed:!1})}function oo(e,t){let n=[],o=!1;for(let i of e){let r=ee(i),s=Uf(i,r,t);n.push({path:i,changed:s.changed}),s.failed&&(o=!0)}return{ok:!o,results:n}}function Of(e){return ud(e.map(t=>t.replace(/\\/g,"/")),process.cwd(),[])}async function pd(e){let t=await Et("format",e);if(!t)return 2;let n=e.output??"human",o={...e,output:n,config:t.resolvedConfig};if(e.stdout){let r=Of(e.files??[]);if(r.length!==1)throw new j("`--stdout` requires exactly one file",2,"pass exactly one XML file when using `--stdout`");if(e.check)throw new j("`--stdout` cannot be used with `--check`",2,"remove either `--stdout` or `--check`");if(e.diff)throw new j("`--stdout` cannot be used with `--diff`",2,"remove either `--stdout` or `--diff`");return oo(r,o).ok?0:1}let i=(e.files??[]).length>0?K(t.project):[...K(t.project),...Z(t.project)];return oo([...new Map(i.map(r=>[r.absolutePath,r])).values()].map(r=>r.absolutePath),o).ok?0:1}async function Ol(e){if(e.unsafe&&!e.fix&&!e.fixDryRun)throw new j("--unsafe can only be used with --fix or --fix-dry-run",2);let t=await Et("lint",e);if(!t)return 2;let n=e.reporter??e.output??"human",o=Mi(t.project,e),i={...e,reporter:n,baseline:o,resolvedConfig:t.resolvedConfig,projectDiagnostics:t.diagnostics},r=await Ll(t.project,i);return Ni(t.project,e,[...r.projectDiagnostics,...r.files.flatMap(s=>s.rawDiagnostics??s.diagnostics)]),r.ok?0:1}async function md(e){let t=await Et("check",e);if(!t)return 2;let n=e.reporter??e.output??"human",o=Mi(t.project,e),i={...e,reporter:n,baseline:o,resolvedConfig:t.resolvedConfig,projectDiagnostics:t.diagnostics},r=await Xi(t.project,i);return Ni(t.project,e,[...r.projectDiagnostics,...r.files.flatMap(s=>s.rawDiagnostics??s.diagnostics)]),r.ok?0:1}async function dd(e){let t=await Et("repair",e);if(!t)return 2;let n=e.output??"human";return(await ad(t.project,{...e,output:n,show:e.show})).ok?0:1}async function sl(e){let t=await Et("check",e);if(!t)return 2;let n=e.output??"human";return(await il(t.project,{output:n})).ok?0:1}async function yl(e){return fl({type:e.type,force:e.force}).ok?0:2}async function ul(e){return dl(e.rule).ok?0:2}async function kl(e){return await Sl({stdio:e.stdio}),0}import{z as V}from"zod";var fd=Ee.pipe(V.object({configPath:V.string().optional(),projectRoot:V.string().optional(),noConfig:V.boolean().optional(),quiet:V.boolean().optional(),verbose:V.boolean().optional(),noColor:V.boolean().optional(),output:ue,reporter:nn.optional(),json:V.boolean().optional(),warningsAsErrors:V.boolean().optional(),noFormat:V.boolean().optional(),noLint:V.boolean().optional(),formatOnly:V.boolean().optional(),lintOnly:V.boolean().optional(),maxWarnings:V.number().optional(),showSkipped:V.boolean().optional(),showSuppressed:V.boolean().optional(),diff:V.boolean().optional(),fix:V.boolean().optional()}).merge(Wn).merge(Ie).superRefine((e,t)=>{e.noFormat&&e.formatOnly&&t.addIssue({code:"custom",message:"`--no-format` and `--format-only` cannot be used together"}),e.noLint&&e.lintOnly&&t.addIssue({code:"custom",message:"`--no-lint` and `--lint-only` cannot be used together"}),e.fix&&t.addIssue({code:"custom",message:"error: `--fix` is only supported for `lint`"})}).transform(e=>({...e,output:e.json?"json":e.output,reporter:e.json?"json":e.reporter??e.output,maxWarnings:e.warningsAsErrors?0:e.maxWarnings})));var gd={command:"check [files..]",describe:"Check format and lint",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("output",{type:"string"}).option("reporter",{type:"string"}).option("json",{type:"boolean"}).option("warnings-as-errors",{type:"boolean"}).option("max-warnings",{type:"number"}).option("show-skipped",{type:"boolean"}).option("show-suppressed",{type:"boolean"}).option("baseline",{type:"string"}).option("update-baseline",{type:"string"}).option("no-baseline",{type:"boolean"}).option("diff",{type:"boolean"}).option("no-format",{type:"boolean"}).option("no-lint",{type:"boolean"}).option("format-only",{type:"boolean"}).option("lint-only",{type:"boolean"}).option("fix",{type:"boolean"}).option("stdout",{type:"boolean",hidden:!0}),handler:async e=>{if(e.stdout)throw new j("--stdout is not supported for `check`",2,"use `--output json` for machine-readable output");let t=W(fd,e);process.exitCode=await md(t)}};import{z as me}from"zod";var yd=Ee.pipe(me.object({configPath:me.string().optional(),projectRoot:me.string().optional(),noConfig:me.boolean().optional(),quiet:me.boolean().optional(),verbose:me.boolean().optional(),noColor:me.boolean().optional(),check:me.boolean().optional(),diff:me.boolean().optional(),stdout:me.boolean().optional(),write:me.boolean().optional(),force:me.boolean().optional(),output:Qa}).merge(Ie).transform(e=>({...e})));var hd={command:"format [files..]",describe:"Format BT/XML files",builder:e=>e.positional("files",{type:"string",array:!0}).option("config",{type:"string"}).option("project-root",{type:"string"}).option("no-config",{type:"boolean"}).option("quiet",{type:"boolean"}).option("verbose",{type:"boolean"}).option("no-color",{type:"boolean"}).option("check",{type:"boolean"}).option("diff",{type:"boolean"}).option("stdout",{type:"boolean"}).option("write",{type:"boolean"}).option("force",{type:"boolean"}).option("output",{type:"string"}),handler:async e=>{let t=W(yd,e);process.exitCode=await pd(t)}};var qf=new Set(["format","lint","check","repair","init","explain","doctor","language-server"]);function Xf(e,t){let n=e||"invalid command",o=n.match(/^Not enough arguments following: (.+)$/);if(o)return new j(`--${o[1]} requires a value`,2,"provide a value after the option");let i=n.match(/^Unknown argument: (.+)$/);if(i){let s=i[1],a=t[0];return a&&!a.startsWith("-")&&!qf.has(a)?new j(`unknown command \`${a}\``,2,"run `btxmlc --help` to see available commands"):new j(`unknown option \`--${s}\``,2,"run `btxmlc --help` to see supported options")}let r=n.match(/^Unknown arguments: (.+)$/);if(r){let s=r[1].split(",")[0]?.trim()||"unknown";return new j(`unknown option \`--${s}\``,2,"run `btxmlc --help` to see supported options")}return new j(n,2)}async function bd(e){try{return await Vf($f(["node","btxmlc",...e])).scriptName("btxmlc").version(Be).parserConfiguration({"boolean-negation":!1}).strict().recommendCommands().demandCommand(1).command(hd).command(Ul).command(gd).command(ld).command(gl).command(cl).command(rl).command(vl).fail((t,n)=>{throw n??Xf(t,e)}).parseAsync(),typeof process.exitCode=="number"?process.exitCode:0}catch(t){return Ja(t)}}bd(process.argv.slice(2)).then(e=>{process.exitCode=e});
|